Inacabado Posted February 13, 2018 at 09:05 PM Report #609348 Posted February 13, 2018 at 09:05 PM Muito boa noite a todos. Por brincadeira e para treinar o uso de funções que geram numeros aleatórios como a rand() e srand(). Decidi aceitar o desafio de um questionário e fazer o seguinte programa: #include <stdlib.h> /*for library rand()*/ #include <time.h> /*for time()*/ #define MAX 100 extern int rand0(void); int main(void) { int num,status,guess,count=0; printf("Vamos fazer um jogo.\n"); printf("O computador vai gerar um numero aleatório.Enter 0 e %d...\n",MAX); printf("Esse é o numero Mágico. Tente adivinhá-lo.\n\n"); srand((unsigned int) time(0)); /*randomize seed*/ num=rand()%MAX+1; do { printf("Introduza o seu numero candidato:\n"); status=scanf("%d",&guess); if(status) { ++count; if(num>guess) { printf("Está muito frio!\n"); printf("Tente um numero mais alto!\n"); } else if(num<guess) { printf("Está muito quente!\n"); printf("Tente um numero mais baixo!\n"); } } else { printf("Insira somente digitos por favor...\n"); fflush(stdin); continue; } }while(num!=guess); printf("Parabéns!!! Acertou no número Mágico!"); printf("De facto %d é o numero Mágico!\n",num); printf("Precisou de %d tentativas apenas...\n",count); return 0; } Gosto do programa, da estrutura do mesmo, encontrei esta solução, e o programa corre bem até... inserir um caracter não-digito. O programa entra em loop infinito e tenho que cancelar o mesmo. Ora bem, criei aquele else: else { printf("Insira somente digitos por favor...\n"); fflush(stdin); continue; } a pensar que resolveria essa situação se ela surgisse, mas é precisamente esse bloco que dá problema. E afinal o fflush(stdin) não está a fazer a sua "função"; ou está algo inompleto? Agradecia imenso uma ajuda do forúm. Um abraço a todos.
HappyHippyHippo Posted February 14, 2018 at 12:07 PM Report #609352 Posted February 14, 2018 at 12:07 PM existem maneiras mais "limpas" para resolver o prolema dos dados de entrada, algo com o fgets e sscanf IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Inacabado Posted February 14, 2018 at 11:56 PM Author Report #609361 Posted February 14, 2018 at 11:56 PM Já funciona! Encontrei a resposta num livro de C que estou a seguir. Eu sabia que tinha lido algo sobre descartar o new line que fica no buffer. Ora bem a seguir a: status=scanf("%d",&guess); getchar();/*acrescentado ao código*/ leva com o getchar para "comer" o caracter '\n' que fica no buffer quando damos enter. Sendo assim: else { printf("Insira somente digitos por favor...\n"); fflush(stdin); /* é desnecessário, pode sair que o programa corre na mesma*/ continue; } 11 horas atrás, HappyHippyHippo disse: existem maneiras mais "limpas" para resolver o prolema dos dados de entrada, algo com o fgets e sscanf Certamente, acredito que sim... Apenas, como essas funções estão num capitulo mais adiantado do livro que estou a seguir não as tenho ainda como ferramentas para resolver este problema, mas lá chegarei, com tempo. O programa já corre, portanto ficou desfeita a minha dúvida. abraço
HappyHippyHippo Posted February 15, 2018 at 11:49 AM Report #609364 Posted February 15, 2018 at 11:49 AM não uses o getchar adiciona somente um caracter espaço precedente ao escaped character do teu formato de leitura para ignorar todos os elementos non- alpha do buffer de leitura 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted February 17, 2018 at 11:19 AM Report #609385 Posted February 17, 2018 at 11:19 AM Em 14/02/2018 às 23:56, Inacabado disse: Já funciona! Encontrei a resposta num livro de C que estou a seguir. Eu sabia que tinha lido algo sobre descartar o new line que fica no buffer. Ora bem a seguir a: status=scanf("%d",&guess); getchar();/*acrescentado ao código*/ leva com o getchar para "comer" o caracter '\n' que fica no buffer quando damos enter. Sendo assim: else { printf("Insira somente digitos por favor...\n"); fflush(stdin); /* é desnecessário, pode sair que o programa corre na mesma*/ continue; } Certamente, acredito que sim... Apenas, como essas funções estão num capitulo mais adiantado do livro que estou a seguir não as tenho ainda como ferramentas para resolver este problema, mas lá chegarei, com tempo. O programa já corre, portanto ficou desfeita a minha dúvida. abraço A linha que adicionaste apenas remove um caracter do buffer (pode ser o \n ou outro qualquer se o utilizador introduzir um valor inválido). Para esse efeito em particular, também prefiro a solução do @HappyHippyHippo: status=scanf(" %d",&guess);. Contudo, diria que o código fica mais robusto com algo deste género: status=scanf(" %d",&guess); while ((c = getchar ()) != '\n' && c != EOF); A ideia é depois da tentativa de leitura do valor remover tudo o que estava na linha. Já agora, rand()%MAX+1 gera-te um valor entre 1 e MAX (e não entre 0 e MAX). Rui Carlos Gonçalves
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now