• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

BELGA

Ajuda no scanf...

8 mensagens neste tópico

Boas, venho pedir aqui um ajudinha ao pessoal.

O que se passa é que quando o programa pergunta quantos pontos é para inserir, se eu inserir uma letra, aparece a frase " Era para inserir 1, 2 ou 3 pontos!!! ", tal como eu pôs no default  do switch, mas se repetir esta cena de adicionar pontos o programa não me deixa inserir nada, pois mal eu carrego em 'A', que a tecla para aparecer este menu aparece logo a tal frase " Era para inserir 1, 2 ou 3 pontos!!! ", e nao posso inserir nada!  :hmm:

O que vos queria pedir era uma maneira de contornar isso, como podem ver no código seguinte eu fiz um if, mas mesmo com ele o programa faz o mesmo...! :wallbash:

switch(opcao){//ADICIONAR PONTOS A EQUIPA VISITADA
   case 'A':printf("\nInserir ponto ao %s:\n\nQuantos pontos deseja adicionar? [1,2,3]\n", visitada);
         scanf("%d",&pontos);
             if(pontos!=1 && pontos!=2 && pontos!=3){pontos=0;}
                 switch(pontos){
    case 1: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
           break;
     case 2: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
           break;
     case 3: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
          break;
default: printf("Era para inserir 1, 2 ou 3 pontos!!!");getche();
                                                          
     break;
                                                                   
                                                          }

cumps.... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Repara nesta linha if(pontos!=1 && pontos!=2 && pontos!=3){pontos=0;}...

No switch seguinte a essa linha, os valores nunca podem ser 1, 2 ou 3, porque o programa só segue nesse sentido se o valor de pontos for diferente de 1, 2 ou 3, logo o caso default é sempre executado, independentemente do valor de pontos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Repara nesta linha if(pontos!=1 && pontos!=2 && pontos!=3){pontos=0;}...

No switch seguinte a essa linha, os valores nunca podem ser 1, 2 ou 3, porque o programa só segue nesse sentido se o valor de pontos for diferente de 1, 2 ou 3, logo o caso default é sempre executado, independentemente do valor de pontos.

mas nao era bem essa duvida, é tipo, o programa pede para inserir os pontos e eu em vez de escrever 1 ou 2 ou 3 escrevo A , e aparece o default, mas se eu repetir isso de inserir os pontos o scanf desaparece e aparece automaticamente o default, repara no video que tá em anexo

como podes ver primeiro inseri '3', o programa somou-os, voltou ao menu principal, depois inseri '5' e o programa já disse que nao podia ser, e por fim inseri um 'a' e o programa também disse que nao podia ser (default),volta ao menu principal, mas depois se escolher essa opçao de novo já nao consigo inserir nada, é como se aquele 'a' me bloqueasse o scanf... :D

o que queria era uma cena que se eu inserisse uma letra evitasse que isso acontece-se...  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esquece o meu primeiro post, agora que voltei a ler o programa reparei que me enganei a dar a minha resposta. Talvez estejas a ter um problema de buffer, experimenta assim:

scanf(" %d",&pontos);

ou antes dessa linha:

while(getchar() != '\n');

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esquece o meu primeiro post, agora que voltei a ler o programa reparei que me enganei a dar a minha resposta. Talvez estejas a ter um problema de buffer, experimenta assim:

scanf(" %d",&pontos);

ou antes dessa linha:

while(getchar() != '\n');

Boas, experimentei isso, e realmente ja consigo, mesmo depois de por uma letra, inserir um numero de pontos, mas se voltar a por outra letra o programa nao faz aparecer o default, e vai somar o ultimo valor de pontos inseridos.

por exemplo:

- insiro um 'a', aparece o default

- insiro '3' e o programa soma 3 pontos

- depois insiro outra vez um 'a' e o programa soma novamente 3 pontos, ou seja vai somar o ultimo. :P

Uma cena para evitar isto poderá ser a inicialização da variavel 'pontos' a 0 cada vez que essa opcao de adicionar for escolhida, nao é? inda tenho de experimentar isso... :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

while(getchar() != '\n');

usei essa linha de código depois do scanf, e incializei a variavel a 0 antes do scanf e agora já está a funcar bem! :P

mas se nao te importas podias-me explicar o que essa linha faz?... :-[

inda nao percebo muito de C, o que me parece que essa linha faz é que enquanto o getchar que vai ser o scanf anterior nao acabar em \n vai faze-lo repetir, de maneira a que se tenha de inserir sempre alguma coisa e primir ENTER nesse scanf, certo? 

so te estou a perguntar isto pois este programa é um trabalho para a escola, que vou ter de apresentar ao stor, logo convinha que soubesse o que estou a fazer...  ::)

//ADICIONAR PONTOS A EQUIPA VISITADA
case 'A':pontos=0;printf("\nInserir ponto ao %s:\n\nQuantos pontos deseja adicionar? [1,2,3]\n", visitada);
scanf("%d",&pontos);
while(getchar() != '\n');
switch(pontos){
case 1: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
              break;
case 2: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
               break;
case 3: visitada_pontos=visitada_pontos+pontos;printf("\nFoi somado %d ponto(s) a equipa %s", pontos, visitada);getche();
              break;
default: printf("No basquetebol apenas existe 1, 2 ou 3 pontos!!!");getche();
               break;
                                                                   
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, o que aquela linha faz é limpar o que fica no buffer de input, neste caso da informação transmitida pelo teclado. Enquanto o getchar() não encontrar um caracter de mudança de linha (\n), continua a obter caracteres do buffer.

Já agora, deixo-te um pequeno conselho. Sendo isso um trabalho para a escola, não te esqueças de fazer uma identação correcta do código. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui está um post meu que ensina a limpar o buffer com o scanf de forma muito fiavel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora