Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Telmo_silva

Não deixar inserir letras nem números superiores a 100!!!

Mensagens Recomendadas

Telmo_silva    0
Telmo_silva

Boas pessoal programador! ;)

Tenho um trabalho para realizar, que é para entregar agora no segundo semestre. E já questionei algumas dúvidas. E agora tenho mais duas. :fartnew2:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
void menu ();
int main () {
         int palpite [5];
         int b=0, a=0, alea, num, qtd=0;
         clock_t start, end; //tipo de dados para a biblioteca Time
         double elapsed; 
         start = clock();//inicio da contagem do tempo                
                printf("Adivinhe o n%cmero entre 0 e 100: ", 163);//pede o numero ao user pela primeira vez
                scanf("%d", &num); 
                //srand(time(NULL));//gera um numero aleatorio cada vez que é executado o programa
                alea=rand()%100+1;//gera o numero entre 0 e 100
                while(num !=alea){ //repete o ciclo enquanto o numero for diferente do gerado
                
                palpite [a++] = num; //regista o palpite no array 
                                 if(num <alea) //se o numero for nemor que o aleatorio faz o seguinte: 
                                             {
                                                  qtd++;//Encrementador que conta o numero de tentativas
                                                  system("color 04");// amarela, quando o numero menor que o gerado pelo programa
                                                  printf("N%cmero escolhido menor que o pretendido, AUMENTE um pouco\n\n",163);
                                                  printf("Digite outro n%cmero inteiro entre 0 ate 100: ",163);
                                                  scanf("%d", &num);
                                                  system("cls");//limpa a consola de tudo o que foi escrito
                                              }
                                 else //se não for nanor então é maior que o pretendido e faz: 
                                      {
                                              system("cls");//limpa a consola de tudo o que foi escrito
                                              qtd++;//Encrementador que conta o numero de tentativas
                                              system("color 06");// vermelha ser utilzado quando o utilizador inserir um numero maior
                                              printf("N%cmero escolhido maior que o pretendido, DIMINUA um pouco\n\n",163);
                                              printf("Digite outro n%cmero inteiro entre 0 ate 100: ",163);
                                              scanf("%d", &num);
                                              system("cls");//limpa a consola de tudo o que foi escrito
                                      }
                } //então sai do ciclo se o numero digitado for igual ao gerado
                system("color 02");//verde, é utilizada quando o utilizador acerta no numero
                end = clock();//fim da contagem do tempo do programa
                elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; //calcula a difereça do tempo inicial com o final 
                system ("cls");
                printf ("Parab%cns acertou no n%cmero!!\n\n", 130, 163);
                printf ("Resultado da Jogada:\n\n"); //felicita o utilizador por ter acertado no numero
                printf ("O n%cmero correcto: %d\n", 163, alea); //Diz então qual foi o numero gerado
                printf ("Tentativa(s) usada(s): %d\n", qtd); //mostra as tentativas utilizadas   
                printf ("Tempo: %.2f segundos \n\n",elapsed); //apresenta o tempo que demorou - diferença do end e do start                
                for (b = 0; b < a; b++){ //ciclo que mostra as tentativas do array
                printf("%d\n", palpite[b]);}
                printf ("__________________________________FIM DO JOGO___________________________________\n\n");  
                system ("pause");       
}

Neste jogo eu queria que o utilizador não pode-se inserir letras porque se não entra num ciclo e não sei de lá. ;)

E queria também que só pode-se inserir números entre 0 e 100. :bored:

Alguém me ajude!!!! :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

O "problema" com o scanf e que nao gasta o caracter que deu erro. Assim, tendo o scanf num ciclo e fornecendo-lhe dados invalidos o loop continua ate ao infinito.

Por exemplo para scanf("%d", &var) alguem mete "foo". O scanf ve o 'f' mas nao o gasta e devolve 0. No proximo ciclo o 'f' ainda la esta e repete-se a situacao.

Por isso verifica o valor de retorno do scanf: tem de ser o numero de variaveis alteradas

chk = scanf("%d", &var);
if (chk == 1) /* ok, var atribuida um valor */;
if (chk != 1) /* erro, eg EOF ou caracter invalido (como o 'f') */;

Depois de apanhares um erro no scanf deves verificar se foi por EOF (e nesse caso abortas o programa?) ou por presenca de caracter invalido. Na presenca de caracter invalido a melhor coisa a fazer, basicamente, e desfazeres-te desse caracter

if (chk == 0) getchar(); /* "come" o caracter que deu erro */

ou melhor ainda, desfazeres-te desse caracter e de todos os seguintes ate ao ENTER, incluindo o ENTER

int ch;
while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
if (ch == EOF) exit(EXIT_FAILURE);

---------------------------------------------------------

Para limitares a valores entre 0 e 100, compara e repete o ciclo

if ((valor < 0) || (valor > 100)) /* repete o ciclo */;

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

mas com o pedaço de código que eu tenho aqui não me pode ajudar num exemplo mesmo concreto

Concreto de Copy/Paste? LOL

A minha resposta inclui uma explicacao e um codigo de exemplo. Com um pouco de trabalho consegues por o teu codigo a portar-se correctamente. ... ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
kvyil    0
kvyil

Pessoal eu aproveitei o código que serviu de resposta ao Telmo e eu queria usa-lo como sub função e não está a funcionar como o pretendido. Se for sem usar função funciona perfeitamente, mas se implementar numa função já não é a mesma coisa, não sei o que poderá ser. O código do programa com a função é o seguinte (compila tudo direitinho - dev c++)

#include <stdio.h>
#include <stdlib.h>
void verifica (int *ccc,int *num); 
main () 
{ 
    int n, chk; 
    puts ("Introduza um numero inteiro");
    chk = scanf ("%d", &n);
    verifica (&n, &chk);
    system ("pause");
}    
void verifica (int *ccc, int *num) 
{ 
     int aux; 
     aux = *ccc; 
     if (aux == 1){
          printf ("Numero correcto\n");
          printf ("Numero inserido foi: %d\n", *num); }
       if (aux !=1){
       printf ("numero Inválido\n");}
       if (aux == 0) getchar (); 
} 


e o código que está a funcionar só como programa sem função é o seguinte

#include <stdio.h>
#include <stdlib.h>
int main () 
{ 
    int n, chk; 
       puts ("Introduza um numero inteiro");
       chk = scanf ("%d", &n);
       
       if (chk == 1){
          printf ("Numero correcto\n");
          printf ("Numero inserido foi: %d\n", n); }
       if (chk !=1){
       printf ("numero Inválido\n");}
       if (chk == 0) getchar ();    
    system ("pause");
}
    

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade