Ir ao conteúdo
  • Cadastre-se

Erro na struct


Posts recomendados

Estou fazendo um exercício simples de struct com "objetos" dentro de um for a fim de ler nome e nota para ver a maior nota e dizer o aluno com maior nota e dar o nome e nota dele. por algum motivo, quando itero o índice da algum pau no loop e não há mais leitura de dados. Segue o código:

 

#include <iostream>
#include <string>


using namespace std;

struct Aluno{

    double nota;

    string nome;



};




int main()
{
    struct Aluno alunos[3];


    for(int i=0;i<3;i++){
        cout<< "Diga o nome: ";
        string prov;

        getline(cin,prov);

        alunos[i].nome=prov;

        cout<<"Diga a nota de "<<alunos[i].nome<<": "<<endl;
        cin>>alunos[i].nota;



    }
/*

    struct Aluno melhorAluno=alunos[0];
    for(int i=0;i<3;i++){
        if(melhorAluno.nota<alunos[i].nota)
            melhorAluno=alunos[i];

    }

    cout<<"O melhor aluno é "<<melhorAluno.nome<<endl<<"e sua nota é "<<melhorAluno.nota;

*/

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Espero ajudar com esse código, fiz algumas modificações e você ao olhar deve entende-las, fiz alguns testes aqui e todos deram certo

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

struct Aluno
{
	double nota;
	string nome;
};

int main()
{
	Aluno alunos[3];
	
	for(int i = 0; i < 3; i++)
	{
		fflush(stdin);
		cout << "Diga o nome: ";
		
		getline(cin, alunos[i].nome);
		
		cout << "Diga a nota de " << alunos[i].nome << ": ";
		cin >> alunos[i].nota;
		
	}
	
	Aluno temp = alunos[0];
	for(int i = 1; i < 3; i++)
		if(temp.nota < alunos[i].nota)
			temp = alunos[i];
	
	cout << "\n" << temp.nome << " tem a maior nota! Nota: " << temp.nota << endl;
	
	return 0;
}

NÃO USE a função FFLUSH, faça uma própria ou consiga outra para limpar o buffer, pois a mesma tem um comportamento irregular

Link para o comentário
Compartilhar em outros sites

@RafaelCLP , Funcionou. Mas você poderia me explicar o que significa isso? cin.peek() <=32 e cin.get()? Qual o problema do codeblocks? Sempre disseram que era melhor que o DevC++, por este estar descontinuado.

 

você se refere ao terminal do codeBlocs ou ao xterm do Fedora? De fato não consigo setar o code::Blocks para o gnome terminal ou o konsole do KDE. Mas será que faria diferença?

Link para o comentário
Compartilhar em outros sites

O Dev-C++ também é muito ruim, mas ainda acho melhor do que o Code::Blocks. O Dev-C++ foi recontinuado por um tal de Orwell :P (veja Dev-C++ Orwell), e em 2015 foi descontinuado de novo (mas felizmente está BEM melhor do que era antes do Orwell mexer nele).

 

Mas enfim, independente de IDE, esse terminal do Code::Blocks é bem limitado e não implementa o protocolo completamente. O ideal seria você testar o software em qualquer outro terminal (até porque é neles que seu código deve rodar, não na IDE que você usa pra desenvolver). Xterm serve. P.S.: não sei se faria diferença já que estou sem Linux para testar, mas acredito que sim.

 

Quanto ao cin.peek() é um método da classe istream (da qual o cin é um objeto/instância). Ele te permite ver qual o próximo caractere da entrada, sem que esse caractere seja consumido. Então eu comparo ele com 32, porque de acordo com a tabela ascii, código ascii <= 32 são apenas caracteres que não aparecerão no início de um nome; se for um desses caracteres, eu chamo o cin.get(), ele lê o próximo caractere da entrada e o descarta. Então, em resumo, o que eu faço é ver qual é o próximo caractere da entrada, e se for um cujo código ascii <= 32, eu o descarto. O ideal seria transformar esse if num while e ficar descartando enquanto não for uma letra, mas por preguiça simplicidade eu deixei só desse jeito que te mandei mesmo.

 

Edit: o ideal seria algo tipo:

for (char c = cin.peek(); (c < 'A' || c > 'Z') && (c < 'a' || c > 'z'); c = cin.peek()) {
  cin.get();
}

 

Link para o comentário
Compartilhar em outros sites

Poxa, cara. A Força O C++ é forte em você. Onde você estudou string de c++? Eu tenho usado um livro de C (André Backes) (Portanto ,não tem string), porque achei o de  Deitel (esse sim de c++) muito demorado e pesado, principalmente por misturar poo desde o início. Basicamente deixei Deitel, também, porque minha faculdade ensina c++ estruturado e depois, quando parte pra POO, usa Java.

Link para o comentário
Compartilhar em outros sites

Não tem muito o que estudar acho, é só experiência e google mesmo. Não é como se eu já soubesse resolver o seu problema assim que li, eu só sabia o porquê do problema e o que pesquisar para resolvê-lo. Então fui na documentação do istream e achei o peek, então fiz o código... só isso. Muita coisa não está na minha cabeça, está no google. Mas programo C/C++ faz cerca de 9 anos...

 

Se quiser material pra estudar, eu não saberia o que recomendar, mas depois de você saber o básico é só saber usar o google e ler documentação mesmo.

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

8 horas atrás, RafaelCLP disse:

O Dev-C++ também é muito ruim, mas ainda acho melhor do que o Code::Blocks.

você está enganado >_<

Enquanto a erros no buffer de entrada costumo usar o cin.sync(), que sincroniza o string com o buffer descartando erros de leitura.
Coloque o cin.sync() após cada leitura.

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

Estou enganado não kk. Eu uso ambos (Dev-C++ Orwell no Windows, Code::Blocks no Linux), e ambos são muito ruins. Se quer uma IDE decente use Visual Studio. O problema é que Visual Studio é bem pesado, então acabo optando por uma dessas duas porcarias mesmo. O Visual Studio Code também é excelente mas dá trabalho configurar no Windows porque tem que instalar MINGW e eu sou bem preguiçoso.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!