2
respostas

[Dúvida] Limitando entrada (letras e números negativos)

Olá, estou na primeira aula do curso de Formação Linguagem C!

Gostaria de acrescentar isso no projeto, como pode ser feito?

  1. retornar erro quando o usuário selecionar letras ou números diferentes de 1 a 3 para selecionar o nível de dificuldade;
  2. acrescentar uma pista após a 3º tentativa de chute para ajudar o usuário a chutar;
  3. retornar mensagem de erro quando o usuário selecionar letras no lugar de um chute numérico;
  4. acrescentar uma reexecução do programa ao final, no caso de usuário escrever "sim" para jogar novamente;

Grato!

// incluindo as bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "Portuguese_Brazil");


 // imprimindo cabecalho do jogo
    (...)
    
    //nome
    char nome[20];
    printf("\nQuem me desafia?\n");
    printf("(Digite seu nome)\n");
    scanf("%s", nome);
    printf("\n\nSe sente com sorte hoje, %s?", nome);
    printf("\nVamos descobrir...\n");
    printf("\n\n");

     // regras
  (...)
 
    // declarando variaveis
    int chute;
    int acertou;
    int nivel;
    int totaldetentativas;

    // definindo pontos inicial
    double pontos = 1000;

    // gerando um numero
    srand(time(0));
    int numerosecreto = rand() % 100 + 1; 


    // escolhendo o nivel de dificuldade
   (...)

    switch(nivel) {
        case 1: 
            totaldetentativas = 20;
            break;
        case 2:
            totaldetentativas = 15;
            break;
        default:
            totaldetentativas = 6;
            break;
    }   

**//1. tratando nível diferente de 1-3 ---------- bug**
** // 2. dar uma pista após 3º tentativa--------------bug**
   do {
        if (totaldetentativas == 3)
        {
            int quadrado = 0;
            quadrado = numerosecreto*numerosecreto;
               printf("\n");
               printf("\nVou te dar uma pista: ");
               printf("\no quadrado do número secreto é %d", quadrado);
               printf("\nJá sabe? Tente de novo; ");
               printf("\n");
        }
    } 
    // loop principal do jogo
    for(int i = 1; i <= totaldetentativas; i++) {
        printf("\n-> Tentativa %d de %d \n", i, totaldetentativas);
        printf("Chute um número:");
        scanf("%d", &chute);

       ** //3. tratando chute igual a letras-------------------------------------bug de *enter*
        if(scanf("%d", &chute)!= 1) {
           int ch;
            while ((ch = getchar()) != '\n' && ch != EOF) /* nada */;
            if (ch == EOF) /* input acabou e nao ha mais dados */;
            printf("Você não digitou um número, digite apenas números!\n");
             i--; 
             continue;
        }**

         // tratando chute de numero negativo
        if(chute < 0) {
            printf("Você não pode chutar números negativos\n");
            i--; 
            continue;
        }
        // Tratando chute maior que 100
        if(chute > 100) {
            printf("Você não pode chutar números maiores que 100\n");
           i--; 
            continue;
        }
        acertou = chute == numerosecreto;
        if(acertou) {
            break;
        } else if(chute > numerosecreto) {
            printf("\nSeu chute foi maior do que o número secreto!\n\n");
        } else {
            printf("\nSeu chute foi menor do que o número secreto!\n\n");
        }
        double pontosperdidos = abs(chute - numerosecreto) / 2.0;
        pontos = pontos - pontosperdidos;
    }
    printf("\n");
    if(acertou) {
       (...)
        printf("\nParabéns! %s, Você acertou!\n", nome);
        printf("\n O número era: %d\n", numerosecreto);
        printf("Você fez %.2f pontos. Até a próxima!\n\n", pontos);
    } else {
        printf("       \\|/ ____ \\|/    \n");   
        printf("        @~/ ,. \\~@      \n");   
        printf("       /_( \\__/ )_\\    \n");   
        printf("          \\__U_/        \n");
        printf("\nQue pena, %s, Você perdeu! Tente novamente!\n\n", nome);
        printf("\n O número era: %d\n", numerosecreto);
    }
}
2 respostas

Oi, Kadem! Tudo bem?

Trabalhando com cada uma das dúvidas:

  1. Inicialmente, para retornar um erro quando o usuário selecionar letras ou números diferentes de 1 a 3 para selecionar o nível de dificuldade, podemos utilizar um loop do-while para garantir que o usuário só digite valores válidos. Podemos adicionar um if dentro desse loop para verificar se o valor digitado está dentro do intervalo desejado. Caso contrário, podemos exibir uma mensagem de erro e pedir para o usuário digitar novamente. Aqui está um exemplo de como podemos fazer isso:
do {
    printf("Selecione o nível de dificuldade (1 a 3): ");
    scanf("%d", &nivel);

    if(nivel < 1 || nivel > 3) {
        printf("Opção inválida! Digite um número entre 1 e 3.\n");
    }
} while(nivel < 1 || nivel > 3);
  1. Para acrescentar uma pista após a 3ª tentativa de chute, podemos adicionar um if dentro do loop principal do jogo para verificar se o número de tentativas é igual a 3. Dentro desse if, podemos exibir a pista desejada. Aqui está um exemplo de como podemos fazer isso:
for(int i = 1; i <= totaldetentativas; i++) {
    // ...

    if(i == 3) {
        int quadrado = numerosecreto * numerosecreto;
        printf("\nVou te dar uma pista: o quadrado do número secreto é %d\n", quadrado);
    }

    // ...
}
  1. Já para tratar o caso em que o usuário digita letras em vez de um chute numérico, podemos utilizar a função scanf para verificar se o valor digitado é um número. Se o retorno da função scanf for diferente de 1, significa que o valor digitado não é um número. Nesse caso, podemos exibir uma mensagem de erro e pedir para o usuário digitar novamente. Aqui está um exemplo de como podemos fazer isso:
if(scanf("%d", &chute) != 1) {
    printf("Você não digitou um número, digite apenas números!\n");
    i--;
    continue;
}
  1. Por fim, para acrescentar uma reexecução do programa ao final, no caso do usuário escrever "sim" para jogar novamente, podemos utilizar um loop do-while no início do programa para controlar essa reexecução. Dentro desse loop, podemos adicionar um if para verificar se o usuário deseja jogar novamente. Se sim, devemos reiniciar as variáveis e continuar o jogo. Aqui está um exemplo de como podemos fazer isso:
char jogarNovamente[4];

do {
    // ...

    printf("Deseja jogar novamente? (sim ou não): ");
    scanf("%s", jogarNovamente);
} while(strcmp(jogarNovamente, "sim") == 0);

Espero ter ajudado! Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓

Muito bom, super explicativo, agradeço! Os códigos funcionaram bem! Obrigado!

Apenas sobre os códigos que reportam digitação de nível não compreendido nas opções de escolhas e a digitação de letras no lugar de número para advinhar o número secreto (ambos colados a seguir), tive o mesmo erro para ambos: o compilador retornou mensagem que estava no "printf" infinitas vezes... num loop eterno, saberia dizer como corrijo isso?

do {
    printf("Selecione o nível de dificuldade (1 a 3): ");
    scanf("%d", &nivel);

    if(nivel < 1 || nivel > 3) {
        printf("Opção inválida! Digite um número entre 1 e 3.\n");
    }
} while(nivel < 1 || nivel > 3);

e

if(scanf("%d", &chute) != 1) {
    printf("Você não digitou um número, digite apenas números!\n");
    i--;
    continue;
}

Para o alerta quando digita-se letras no lugar de números, eu corrigi assim (código a seguir), mas dai produzi um outro bug, que é um "enter" não ser interpretado da forma correta, mas sim como se fosse um caractere. Com isso, eu tenho que digitar o chute e aperta enter por duas vezes para o sistema entender que eu estou escrevendo uma resposta.

if(scanf(" %d", &chute)!= 1) {
                    int ch;
                    while ((ch = getchar()) != ' \n' && ch != EOF) ;
                    if (ch == EOF);
                    printf("Você não digitou um número, digite apenas números!\n");
                    i--; 
                    continue;

Poderia me ajudar mais uma vez?

Agradeço! ```

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software