Цикл Do-while повторяется при изменении значения переменной - PullRequest
0 голосов
/ 09 ноября 2019

Поэтому я пытаюсь создать программу, которая скажет мне, какое число я думаю между 0 и 126. Я написал небольшую программу на C, которая спрашивает вас, какое число вы думаете, и если оно меньше, чем то, которое я говорю aвычислите новое число на основе верхнего и нижнего предела, который я установил. Но когда я ставлю ответ вроде - или +, я получаю странную ошибку, когда строка, которая должна отображаться 1 раз, записывается 2 раза, а если я ставлю в качестве ответа - я получаю написанные 3 строки, что странно. Чего мне здесь не хватает?

    int valoreSup=126;
    char risposta;
    int valoreInf=0;
    int N = (valoreInf+valoreSup)/2;

    do
    {
        printf("E il tuo valore: %d\n", N);
        scanf("%c", &risposta);
        if (risposta=='-') {
            valoreSup=N;
            int N = (valoreInf+valoreSup)/2;
        }
        if (risposta=='+') {
            valoreInf=N;
            int N = (valoreInf+valoreSup)/2;
        }
    } while(risposta!='=');

    printf("%d\n", N);

Нет сообщений об ошибках (я использую атом), но результаты странные. значение N не изменяется, и цикл повторяется странным образом.

1 Ответ

1 голос
/ 09 ноября 2019

Вы продолжаете повторно объявлять переменную N, что приводит к переменным с именем N, которые относятся к области действия ваших операторов if. Оставьте только первое объявление перед циклом do-while и удалите два других, как показано ниже:

int N = (valoreInf+valoreSup)/2;
do
{
    printf("E il tuo valore: %d\n", N);
    scanf(" %c", &risposta);
    if (risposta=='-') {
        valoreSup=N;
        N = (valoreInf+valoreSup)/2;
    }
    if (risposta=='+') {
        valoreInf=N;
        N = (valoreInf+valoreSup)/2;
    }
} while(risposta!='=');

, потому что вы хотите назначить новое значение внешнему N, а не вводитьдругая, другая и новая, переменная.

Более того, как вы, наверное, уже видели, Я оставил пробел перед %c в scanf(), потому что если вы выполните итерацию по этому циклу, выпрочтет символ новой строки, который вы нажимали, когда вводили значение для risposta.

...