Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
lucasoad399

Erro na struct

Recommended Posts

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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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

Editado por Lucas Lima Nunes

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Cara, copiei seu código todo pra testar e não rodou. Deu o mesmo problema que o meu. Eu sei que se usar cin>>string roda, mas aí não consigo pegar nome e sobrenome.

    Problema.png

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Postado (editado)

    O código dele deveria funcionar, o problema provavelmente é esse terminal horrível do Code::Blocks. Mas você pode tentar trocar o fflush por:

    if (cin.peek() <= 32) cin.get();

    Nota: coloque isso após o cout, imediatamente antes do getline.

    Editado por RafaelCLP
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @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?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Postado (editado)

    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();
    }

     

    Editado por RafaelCLP

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • E o QT creator que comentam tanto? Instalei aqui, mas nem consegui usar. É verdade que agora tá pago?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    1 minuto atrás, lucasoad399 disse:

    E o QT creator que comentam tanto? Instalei aqui, mas nem consegui usar. É verdade que agora tá pago?

    Nunca usei (e sinceramente nem sabia que existia), então prefiro não comentar. Mas para projetozinho de faculdade/curso qualquer IDE serve...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    3 horas atrás, RafaelCLP disse:

    então acabo optando por uma dessas duas porcarias mesmo

    Então tá né. >_<

    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×