Интересное о цикле while

64
10

Я начал учиться C 3 недели назад, и, изучая в то время как циклы, я пытался создать программу добавления, в основном вы продолжаете добавлять числа, которые она добавляет к ним, и после второго номера она дает вам промежуточный итог для каждого добавления, и если вы нажмете 0, чтобы выйти из нее дает вам окончательную сумму, затем завершает работу. Теперь у меня есть один главный, еще один вопрос. Главный вопрос: мне пришлось использовать sum = 0 перед функциями while, если я использую его после "while", он дает мне номер, который я ввел в качестве результата. Теперь я действительно задаюсь вопросом, какова идея этого. Когда я пишу его, как показано ниже, он приравнивает "сумму к 0" для начала и меняет значение при вводе другого номера, или есть какая-то другая идея.

И еще вопрос: зачем мне использовать 2 getchar(); чтобы моя программа оставалась на экране, почему бы и нет?

#include <stdio.h>
int main(void)
{
float num;
float sum;
printf(" please enter a number +0 to start the program (0 to quit): \n");
scanf(" %f", &num);

sum =0; //THIS HERE**********************

while (num > 0)
{
printf("please enter integer:\n");
scanf("%f", &num);
sum = sum + num;
printf("current sum is = %f\n", sum);
}
printf("final sum is = %f\n", sum);
getchar();
getchar();
return 0;
}

спросил(а) 2021-01-25T15:49:40+03:00 4 месяца, 2 недели назад
1
Решение
108

Если положить sum=0 внутри в while цикла будет вызываться каждый раз, когда петля в то время как цикл.

Это означает, что когда вы достигаете sum=sum+num, вы фактически будете вычислять sum=0+num.

У вас есть два getchar() использования getchar() потому что первый всасывает дополнительный символ, который не был поглощен вашим scanf. Вероятно, этот символ является символом новой строки, поэтому вы не можете его увидеть. Второй getchar() затем держит ваш терминал открытым, потому что он ждет символа.


Чтобы выяснить, правильна ли моя гипотеза относительно первого getchar() вы можете попробовать следующее:

char temp = getchar();
printf("%d",(int)temp); //Print out the character number from the first getchar
getchar(); //This keeps the window open

ответил(а) 2021-01-25T15:49:40+03:00 4 месяца, 2 недели назад
63

Если я использую его после того, while он дает мне номер, который я ввел в качестве результата.

Это происходит потому, что, когда вы это делаете

while (num > 0) {
sum = 0;
...
sum = sum + num;
}

значение, которое было накоплено sum на предыдущих итерациях в while цикла стирается каждый раз при итерации цикла, что означает, что только последнее значение будет добавлены к sum (и держал в результате дополнений).

почему мне нужно использовать 2 getchar();

Поскольку, когда scanf использует последний номер, который вводил конечный пользователь, он считывает все до, но не включает символ '\n', который соответствует клавише Enter . Этот символ '\n' остается в буфере, ожидая, что ваша программа будет использована. Первый вызов getchar() потребляет это "затяжное" '\n', в то время как второе делает вашу программу на экране до тех пор, пока вы не нажмете клавишу ввода еще раз.

ответил(а) 2021-01-25T15:49:40+03:00 4 месяца, 2 недели назад
63

= в большинстве языков программирования отличается от математического =. Это не означает, что обе стороны будут постоянно равны друг другу; скорее, это означает, что правая часть должна быть вычислена и что результат должен быть присвоен переменной с левой стороны. Позже другая строка может изменить значение переменной на что-то другое.

Таким образом, sum = sum + num; означает, что текущие значения sum и num должны быть добавлены, и результат должен быть возвращен в sum. Для того, чтобы это работало так, как вы хотите, sum должна быть равна 0 при первом запуске этой строки; следовательно, вам нужна sum = 0; где-то. Однако, если эта строка находится внутри цикла, она многократно выполняется, так что результат предыдущего суммирования исчезает и заменяется на 0 перед каждым новым номером.

ответил(а) 2021-01-25T15:49:40+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема