Ir ao conteúdo
  • Cadastre-se
The_Oicle

RESOLVIDO Erro de lógica será? em C

Recommended Posts

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ê??

 

Compartilhar este post


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

Compartilhar este post


Link para o post
Compartilhar em outros sites

O code block deu uma mensagem que se eu queria compilar desse jeito mesmo e eu aceitei.

 

deve ser isso mesmo que você falou.

 

thanks!

Compartilhar este post


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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode causa problemas graves!!?

Não use, não mesmo [emoji19]

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


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

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×