Бесконечный цикл while при расчете расхода топлива - C (СИ)
Формулировка задачи:
Не судите строго за код.Я только начинаю разбираться с основами.У меня одна проблема, в цикле while, у меня постоянно возникает бесконечность повторения.Хочу чтобы мне обьяснили мою ошибку.Выполняю по одному готовому примеру свои задачи, но в примере вроде всё проходит, а вот в задачах возникает бесконечный цикл.Поясните пожалуйста самыми простыми словами.
Задача состоит в том, чтобы с помощью контрольного значения (-1), т.е. пока его не введут, выполнялся цикл для разных заправок например.Требуется вывести км/литры по каждой конкретной заправке, и среднее кол-во км/литров по 2-3-4 заправкам
#include <stdio.h>
main ()
{
float total = 0, counter = 0;
int km, litr, a, itogkm, itoglitr;
printf("Введите расход бензина(-1 to end): \n");
scanf("%d", &litr);
printf("Введи кол-во проеденных км: \n");
scanf("%d", &km);
while (counter != -1) {
itoglitr += litr;
itogkm += km;
a = (float) km / litr;
counter++;
printf("Для этой заправки использовано км/литр: %f/n", a);
}
total = itogkm / itoglitr;
printf("Среднее число км/литров: %d/n", total);
return 0;
}Решение задачи: «Бесконечный цикл while при расчете расхода топлива»
textual
Листинг программы
#include <stdio.h>
main ()
{
float total = 0; // counter - количество бензоколонок не может быть 3.445 Верно? тогда переносим его в целочисленные значения
int km, litr, a, itogkm, itoglitr, counter = 0; // переменная a тут вообще не нужна, во первых в твоем примере ты туда хочешь получить число с плавающей запятой что равно такому int = float в твоем примере, что не верно как сам видишь. Предлагаю убрать a, а не используемый в теле основного цикла float переменную под именем total использовать для подсчета среднего значения для одной бензоколонки.
printf("Введите расход бензина(-1 to end): \n");
scanf("%d", &litr);
printf("Введи кол-во проеденных км: \n");
scanf("%d", &km);
while ( litr != -1) { // для твоей логики нудно осуществлять проверку введенного значения. А куда попадают введенные значения. Правильно в переменную litr и km. т.к. у тебя стоит предложение выйти в первом запросе на получение значения, значит будем проверять litr.
itoglitr += litr;
itogkm += km;
-> убираем a = (float) km / litr; <-
total = (float) km / litr; // такая операция корректна, ибо оба операнда равны по типу float = float по результату.
counter++;
printf("Для этой заправки использовано км/литр: %f/n", total); // тут выводим среднее значение total.
}
total = (float) itogkm / itoglitr; // itogkm и itogkm целочисленные операнды поэтому требуется приведение типа при делении для получения корректного результата ( добавили приведение типа результата в виде (float)
printf("Среднее число км/литров: %d/n", total);
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с printf и scanf
- Объявляем переменные: total (для подсчета расхода), km и litr (для ввода данных пользователем), a (не используется), itogkm и itoglitr (для хранения общего расхода и количества км), counter (для подсчета количества заправок)
- Выводим приглашение для ввода данных и считываем их с помощью scanf
- Запускаем цикл while, который будет выполняться до тех пор, пока пользователь не введет расход -1 литр
- Внутри цикла суммируем общий расход и количество км, увеличиваем счетчик заправок
- Выводим среднее значение расхода на заправке
- После окончания цикла вычисляем среднее значение расхода на все заправки и выводим его на экран
- Возвращаем 0, чтобы указать, что программа успешно завершилась