Ir ao conteúdo
  • Cadastre-se

Erro de lógica será? em C


The_Oicle
Ir à solução Resolvido por Cobblepot,

Posts recomendados

Múltipla escolha 1 - Elaborar uma questão de múltipla escolha, de uma disciplina que esteja cursando ou um tema de interesse, com um enunciado e cinco alternativas, sendo uma correta ou incorreta. Escrever um programa que mostra a questão na tela, pede a resposta correta e informa ao usuário se este acertou ou errou.
 
Múltipla escolha 2 - Enriqueça o programa acima da questão de múltipla escolha, incluindo uma outra questão de outro tema. No início do programa, ofereça ao usuário a escolha de qual questão quer responder.
 
#include<stdio.h>int main(){    printf("1 - A Logo da marca PUMA tem como simbolo um animal:\n");    printf("a) capivara\n");    printf("b) onca\n");    printf("c) Leopardo\n\n");    printf("2 - Quantos meses tem um ano: \n");    printf("a) 365 dias\n");    printf("b) 12 meses\n");    printf("c) 32 meses\n\n");    printf("Deseja responder qual questão?\n");    int esc;    scanf("%d",&esc);    if(esc == 1){        printf("Qual a resposta: ");        char resp;        scanf("%c",&resp);            switch(resp){                case 'a':                    printf("Incorreto");                    break;                case 'b':                    printf("Incorreto");                    break;                case 'c':                    printf("Correto");                    break;                default:                    printf("Erro: 032837");            }    }else        {            printf("Qual a resposta: ");            char resp2;            scanf("%c",&resp2);            switch(resp2){                case 'a':                    printf("Incorreto");                    break;                case 'b':                    printf("Correto");                    break;                case 'c':                    printf("Incorreto");                    break;                default:                    printf("Erro: 92075");            }        }}

Ele mostra o seguinte :

 

Qual a resposta: Erro: 92075.

 

 

Minha lógica não está correta ou o quê??

 

Link para o comentário
Compartilhar em outros sites

O que acontece é que; Resta dados no buffer, "que não servem", porém a função scanf interpreta como sendo válidos

(como de fato é: '\n' é o último dos dados que resta em buffer de entra por keyboard, e é um tipo char válido).

 

Soluciona isso colocando fflush (stdin); após as chamadas de todas scanf.

 

 

 

fflush ::

[http://www.cplusplus.com/reference/cstdio/fflush/]

Buffer (stdin) ::

[http://www.cplusplus.com/reference/cstdio/stdin/?kw=stdin]

Link para o comentário
Compartilhar em outros sites

Não. Não use fflush na entrada padrão.

 

http://en.cppreference.com/w/c/io/fflush
 

For input streams (and for update streams on which the last operation was input), the behavior is undefined.

 
Leia com fgets (que retém o \n no final, mas isso é fácil de remover usando (*strrchr(string, '\n')) = '\0' ) ou use a supressão do scanf (scanf("%[^\n]s%*c",string))
Link para o comentário
Compartilhar em outros sites

  • Solução

Costumo limpar o buffer de entrada desta forma

 

crio a funcao:
 
void flush_in(){ 
    int ch;
    while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){} 
}
 
coloco ela após scanf
 
veja seu código como ficou usando esta funcao.
 
#include<stdio.h>void flush_in(){     int ch;    while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){} }int main(){    printf("1 - A Logo da marca PUMA tem como simbolo um animal:\n");    printf("a) capivara\n");    printf("b) onca\n");    printf("c) Leopardo\n\n");    printf("2 - Quantos meses tem um ano: \n");    printf("a) 365 dias\n");    printf("b) 12 meses\n");    printf("c) 32 meses\n\n");    printf("Deseja responder qual questão?\n");    int esc;    scanf("%d",&esc);        flush_in();//Melhor maneira de limpar o buffer    if(esc == 1){        printf("Qual a resposta: ");        char resp;        scanf("%c",&resp);                flush_in();            switch(resp){                case 'a':                    printf("Incorreto");                    break;                case 'b':                    printf("Incorreto");                    break;                case 'c':                    printf("Correto");                    break;                default:                    printf("Erro: 032837");            }    }else        {            printf("Qual a resposta: ");            char resp2;            scanf("%c",&resp2);           		    flush_in();                        switch(resp2){                case 'a':                    printf("Incorreto");                    break;                case 'b':                    printf("Correto");                    break;                case 'c':                    printf("Incorreto");                    break;                default:                    printf("Erro: 92075");            }        }		return 0;}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Valeu a todos, como eu estou aprendendo C tive dificuldade em entender o que era o buffer e a limpeza dele. Mas já está tudo resolvido porquê olhei suas respostas e comparei com esse video http://www.youtube.com/watch?v=W-X2_v4Oyx8.

 

Vou usar a função do roberto ai em cima.

 

Gratos a todos!

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