1
resposta

ERRO/DÚVIDA NO CÓDIGO

Boa noite, eu fiz o exercicio proposto, e está quase funcionando 100%, porém está com um bug na hora calcular o número randômico, ele da a posição do arquivo do primeiro número randômico certo, porém o segundo ele da uma posição diferente da do número sorteado, EX: ele sorteia o número 5 e diz que ele está na posição 2 no arquivo, mas na verdade está na posição 3. E também tem um outro problema, por algum motivo as vezes ele sorteia 0, mesmo não estando na lista de números. Se alguém conseguir dar uma força eu agradeço. Segue o programa e os números do arquivo.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

void main(){
    setlocale(LC_ALL, "Portuguese");

    int num1;
    int num2;

    int chute1;
    int chute2;

    char lerNumeros;
    FILE* f;

    f = fopen("numeros.txt","r");

    if(f == 0){
        printf("Desculpe, arquivo indisponível :(\n");
        printf("Tente novamente mais tarde\n\n");
        exit(1);
    }    
    printf("O ARQUIVO FOI ABERTO!!!\n\n");

    int totalNumeros;
    fscanf(f, "%d", &totalNumeros);

    srand(time    (0));

    int random1 = rand() % totalNumeros;
    int random2 = rand() % totalNumeros;
    //Pegando o primeiro numero
    for(int i = 0; i <= random1; i++){
        fscanf(f, "%d", &num1);
    }
    //pegando o segundo numero
    for(int j = 0; j <= random2; j++){
        fscanf(f, "%d", &num2);
    }

    int soma = num1 + num2;

    printf("Aperte a tecla F para fazer a soma de dois números dentro do arquivo: ");
    scanf(" %c", &lerNumeros);

    while(lerNumeros != 'F'){
        printf("\n\nDigite apenas a tecla F!!!\n");
        scanf(" %c", &lerNumeros);
    }

    printf("\n\nA SOMA DEU %d\n\n", soma);
    printf("chute quais foram os dois números selecionados\n");
    printf("Chute o primeiro número: ");
    scanf("%d", &chute1);
    printf("Chute o segundo número: ");
    scanf("%d", &chute2);

    if( (chute1 == num1 || chute1 == num2) && (chute2 == num1 || chute2 == num2) ){
        printf("\n\n\nParabéns você acertou os dois números!!!");
    }
    else{
        printf("\n\n\nQue pena você errou um dos números\n");
        printf("Os números eram %d e %d\n", num1, num2);
    }
    /* "DEBUG"
    printf("\n\ntotalNumeros: %d\n\n", totalNumeros);
    printf("\n\n\n%d\n",random1);
    printf("\n%d\n",random2);
    */
    fclose(f);

}

NÚMEROS ARQUIVO 3 1 5 9

1 resposta

Oi Fábio, tudo bem? Parabéns pelo seu projeto!

Acho que temos 2 problemas diferentes aqui. Pras soluções abaixo eu entendi que o seu arquivo vai ter os números sempre na mesma linha, como o exemplo abaixo. Se não for isso, por favor avise!

 3 1 5 9

Vou falar primeiro sobre os números aleatórios. De acordo com a documentação, o rand vai te dar um número aleatório entre 0 e o valor máximo que você estipulou. Se pegarmos aqui o exemplo:

    int totalNumeros;
    fscanf(f, "%d", &totalNumeros); // No exemplo, o primeiro número é 3

    int random1 = rand() % totalNumeros; // vai sortear um número entre 0 e 3

Dessa forma, se você não quer o número zero, uma saída é fazer o sorteio entre 0 e (número_máximo - 1) e depois somar um. Por exemplo:

    int totalNumeros;
    fscanf(f, "%d", &totalNumeros); // No exemplo, o primeiro número é 3, como antes

    int random1 = rand() % ( totalNumeros -1 ); // vai sortear um número entre 0 e 2
    int posicao1 = random1 + 1; // a posicao1 vai ser um valor entre 1 e 3!

Agora, sobre a pergunta das posições...

Eu acho que a forma que você está fazendo as leituras não está correta. Consultando a documentação do fscanf o programa guarda a posição do arquivo que você está lendo, então se digamos que você realizou 2 leituras no primeiro número e obteve o número 5. Se realizar mais 1 leitura no segundo número, vai obter 9 e não 1 como talvez você esperasse.

Me parece que uma solução possível é usar o método rewind para voltar ao começo do arquivo. Por exemplo:

    //Pegando o primeiro numero
    for(int i = 0; i <= posicao1; i++){
        fscanf(f, "%d", &num1);
    }

    rewind(f); //volta ao inicio do arquivo

    //pegando o segundo numero
    for(int j = 0; j <= posicao2; j++){
        fscanf(f, "%d", &num2);
    }

Fiz as alterações que eu sugeri e rodei alguns testes e parece que funcionou!

O ARQUIVO FOI ABERTO!!!

Aperte a tecla F para fazer a soma de dois números dentro do arquivo: F


A SOMA DEU 6

chute quais foram os dois números selecionados
Chute o primeiro número: 5
Chute o segundo número: 1



Parabéns você acertou os dois números!!!

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

O ARQUIVO FOI ABERTO!!!

Aperte a tecla F para fazer a soma de dois números dentro do arquivo: F


A SOMA DEU 14

chute quais foram os dois números selecionados
Chute o primeiro número: 9
Chute o segundo número: 5



Parabéns você acertou os dois números!!!

Espero que eu tenha ajudado! Por favor aceite a resposta se estiver correta :)

A linguagem C pode parecer complicada (e realmente não é a mais amistosa), mas vale a pena conhecer! Então não desanime, continue os estudos e boa sorte!!

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