Ir ao conteúdo
  • Cadastre-se

c++ / loop variaveis bugando quando compila


Henrique Venceslau

Posts recomendados

Boa tarde galera, estou com um problema aqui no meu codigo para um exercicio da faculdade, onde eu tenho que criar um codigo que leia dados de 10 alunos (ra, nome,idade, ano que entrou, etc) e depois mostrar a relação de alunos com mais de 20 anos e menos de 3 anos na faculdade. Criei o codigo com vetores, e usei um laco para que ele repetisse 10 vezes a entrada de dados, e depois de terminar tudo um outro laco que verifica a condição proposta pelo exercicio. so que quando compilei, quando vou inserindo dados da como se fosse um loop infinito, as vezes digitando uma algumas teclas ele pulava pra prox, outras ele ja nem pede pra inserir valores. Gostaria que me ajudassem nesse codigo, estou com dificuldades e nao consigo enxergar onde pode dar esse erro.

 

#include <iostream>
#include <stdlib.h> 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

int main(int argc, char** argv) 
{
    int i,x;
    long int ra[10];
    int idade[10], ano[10];
    char nome[10], curso[10];
    
    cout<<"Fatec\n\n";
    cout<<"Registro de aluno\n\n";
    for(i=0; i<10; i++)
    {
        cout<<"Digite o nome\n";
        cin>>nome;
        cout<<"Digite o RA\n";
        cin>>ra;
        cout<<"Digite a idade do aluno\n";
        cin>>idade;
        cout<<"Digite o nome do curso\n";
        cin>>curso;
        cout<<"Digite o ano de ingresso\n";
        cin>>ano;
        system("cls"); 

    }
    
    for(i=0; i<10; i++)
    {
        if((idade>20)&&(ano>=2014))
        {
            cout<<nome;
            cout<<ra;
            cout<<idade;
            cout<<curso;
        }
    }
    return 0;
}

Link para o comentário
Compartilhar em outros sites

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

so que quando compilei, quando vou inserindo dados da como se fosse um loop infinito...
        


Hahaha, desculpa, mas você conseguiu compilar isso? E sim diga-nos como haha.

Existe erros de sintaxe no seu código.
Toda vez que você for ler ou inserir o elemento de um array você precisa indicar o índice/posição em que se encontra.

 

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

cin>>nome;


O correto é:
cin >> nome[index];

 

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

cout<<nome;

cout << nome[index];

Nesse caso o seu código nem deveria compilar, mas ok...

 

Só se passa um array sem índice se for para algum método que o use por completo ou um bloco como o foreach por exemplo.



Segundo evite usar variáveis de controle fora do escopo em quais ela estão sendo utilizadas. 

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

 int i,x;

 for(i=0; i<10; i++)

 

Use:
for(int i = 0; i< 10; i++)
Não declare i fora do escopo. O porque? Por que numa aplicação complexa isso geraria confusão se essa mesma variavel i fosse utilizada em vários blocos. Segundo partindo do principio do minimalismo, seria um disperdício de memória RAM, pois se você criar uma variável dentro do bloco for ela vai irá ser removida assim que o bloco terminar. Fora do escopo não ela continuará ocupando espaço desnecessário na RAM.

Terceiro, agora o principal. Um erro de sintaxe e de semântica.
char[]  é diferente de string e de string[]
string é um char[] mas char[] não é string[]

string é um array de caracteres, você pode escrever grandes textos nele por exemplo

char armazena um ÚNICO carácter dos 256 disponíveis tabela ASCII .
 

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

char nome[10], curso[10];

Aqui você não está criando uma variável para armazenar 10 nomes muito menos 10 cursos e sim 10 CARACTERES.
Você não está armazenando nome[0] = "maria", nome[1] = "pedro", nome[2] = "beatriz". Você está armazenando nome[0] = 'm', nome[1] = 'a', nome[2] = 'r', nome[3] = 'i'. Um array de char pode ser convertido em uma única string ou uma única string em um array de char. Mas não há possibilidade de armazenar multiplas strings num array de char.
 

 

Em 19/02/2017 às 19:00, Henrique Venceslau disse:

cin>>nome;

Um erro de sintaxe. Não se usa cin diretamente para array de char, é necessário um método que converta a string para o array de char O correto seria:

cin.getline(nome, 10); // 
 

Há também o erro semântico (lógico).
A cada iteração você não está armazenando um nome (string) nova e sim substituindo a anterior...
Na primeira iteração cin.getline(nome, 10); o usuário digitar "Maria" no CLI. Na segunda iteração cin.getline(nome, 10); o usuário digitar "Pedro" o que vai acontecer simplesmente apagar o "Maria" para substituir por "Pedro". No final era para você ter o nome de 10 alunos diferentes mas você tem um único nome, que no caso é o último a ser digitado.
 

Substitua char[] por string[]. ou crie 10 arrays de char com 10 elementos (O que é extremamente desaconselhável)
char nome1[10];

char nome2[10];

char nome3[10];

...
Não há a menor necessidade de usar array de char nesse contexto. Ele só serve para situações muito específicas, como armazenar uma senha por exemplo, criptografia etc etc.

adicionado 7 minutos depois

Exemplo de código funcional:
 

#include <iostream>
#include <stdlib.h>
  
using namespace std;

int main()
{
    int ra[10];
    int idade[10], ano[10];
    //char nome[10] - Apague isso
    string nome[10], curso[10];
    cout << "Fatec\n\n";
    cout << "Registro de aluno\n\n";
  
    for(int i = 0; i < 10; i++)
    {
        cout << "Digite o nome\n";
        cin >> nome[i];
        // A titulo de curiosidade se fosse usar array de char em alguma situação seria
        // cin.getline(nome, 10);
        cout << "Digite o RA\n";
        cin >> ra[i];
        cout << "Digite a idade do aluno\n";
        cin >> idade[i];
        cout << "Digite o nome do curso\n";
        cin >> curso[i];
        cout << "Digite o ano de ingresso\n";
        cin >> ano[i];
        system("cls");
    }
  
    for(int i = 0; i < 10; i++)
    {
        if(idade[i] > 20 && ano[i] >= 2014)
        {
            cout << nome[i];
            cout << ra[i];
            cout << idade[i];
            cout << curso[i];
        }
    }
    return 0;
}

OBS: Não fiz nenhuma alteração na lógica final de selecionar somente alunos que você quer. Apenas corrigir a sintaxe e a semântica do código.

OBS 2: Tenha cuidado ao testar seus exercícios na faculdade com pressa, ainda mais esse chatinhos de ficar inserindo dados múltiplas vezes. Se você inserir texto numa varável numérica irá gerar um erro de execução e uma exceção (que poderia ser tratada, mas isso já é um tema um pouco mais complexo que você deve ver futuramente....)

 

Link para o comentário
Compartilhar em outros sites

@vangodp

Ah que bom que ele não utilizou o array sem índice então, espero rsrs.
Mas ainda sim , mesmo com o índice indicado o cin não funcionaria no array;

 

Uma pequena retificação. O código compilaria mesmo sem os índices, porém não funcionaria adequadamente devido a lógica de estar usando o mesmo array de char nas 10 iterações do loop, sempre substituindo a informação ao invés armazenar todas elas, como já citei anteriormente.


Ainda to sem entender o motivo de se usar char[] ao invés de string, rs
O engraçado é que atualmente alguns programadores C/C++ adoram complicar seus próprios códigos, tentando aplicar conceitos mais "complexos" como array de char, ponteiros e passagem por referência sem a necessidade real e sem saber como funciona exatamente. Uma parte da culpa são de APIs antigas (ou atuais baseadas nas antigas) que continuam a usar ponteiro sem e real necessidade. Alguns professores universitários também não colaboram

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, DRF_GameDev disse:

Ainda to sem entender o motivo de se usar char[] ao invés de string, rs

Certamente por motivos de estudo. O normal é usar string em c++, bem mais cômodo.


 

1 hora atrás, DRF_GameDev disse:

O engraçado é que atualmente alguns programadores C/C++ adoram complicar seus próprios códigos, tentando aplicar conceitos mais "complexos" como array de char, ponteiros e passagem por referência sem a necessidade real e sem saber como funciona exatamente.

Como falei acho que é simplesmente por saber como funciona internamente as coisas. Sabendo o que é um array de chars fica mais fácil trabalhar depois com strings.

 

1 hora atrás, DRF_GameDev disse:

Uma parte da culpa são de APIs antigas (ou atuais baseadas nas antigas) que continuam a usar ponteiro sem e real necessidade. Alguns professores universitários também não colaboram

Depende do ponto de vista. Por exemplo ao trabalhar com arquivos, algumas vezes pode ser interessante usar arrays de chars para enviar a informação ao arquivo, como quando usamos structs com arrays dentro. Claro que podemos fazer com string(classe) também, porém string é algo dinâmico e muda seu tamanho por isso as vezes é interessante usar arrays que tem um tamanho fixo. Mas como falei depende do ponto de vista e a forma de trabalhar, hoje em dia podemos trabalhar sem problemas com string sem necessitar arrays, porém muitos estudantes vão ter passo obrigatório pelos arrays de chars, porque ao fim e ao cabo são isso.... arrays. Deveria excluir arrays de chars do estudo? Se quando nos ensinam dizem que é possível criar arrays de praticamente qualquer tipo de dados, como vão excluir arrays de chars do repertório?>_< O correto seria ensinar o array de char mas deixando claro que em realmente se usa a classe string e que somente se explica o que são arrays de chars para melhorar ou complementar o entendimento da mecânica. No fundo a classe string obedece esse conceito.

Isso tudo me lembra do tal goto. Em certo ponto de vista nos ensinam o que é goto, para que serve, etc, mas depois nos dizem que não utilizemos. Por que será? Ja parou a pensar? Na realidade não tiram isso do cardápio a causa de algo chamado "retrocompatibilidade". Se tirar o goto muitos programas antigos não poderão ser compiladas em compiladores atuais, por isso nunca vão retirar goto de c++ nem irão retirar arrays de chars, porém como falei, a questão é educar para que o aluno não use certos tipos de comandos que estão simplesmente presente por dar suporte a códigos antigos, não devemos adquirir maus costumes que depois pode ser difícil perder.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!