kacToHbI4
@kacToHbI4
11 лет anykey - надоело, хочу в разработчики.

По разному считается или ошибка в логике?

Есть задача из книги Дейтелов:

Из-за высокой цены на бензин водители интересуются пробегом сво­их автомобилей. Некий водитель отследил несколько заправок свое­го автомобиля, записывая пройденное расстояние в милях и объем каждой заправки в галлонах. Разработайте программу на С для вво­да пройденного расстояния в милях и объема каждой заправки в
галлонах. Программа должна вычислять и отображать на экране ко­личество пройденных миль на галлон для каждой заправки автомо­биля. После обработки всей входной информациипрограмма должна вычислить и вывести общее количество пройденных миль на галлон по всем заправкам.


Введите расход бензина (-1, если ввод закончен) : 12.8
Введите пройденный путь: 287
Для этой заправки получено миль/галлон 22.421875
Введите расход бензина (-1, если ввод закончен): 10.3
Введите пройденный путь: 200
Для этой заправки получено миль/галлон 19.417475
Введите расход бензина (-1, если ввод закончен): 5
введите пройденный путь: 120
Для этой заправки получено миль/галлон 24.000000
Введите расход бензина (-1, если ввод закончен): -1
Среднее число миль/галлон 21.601423


Собственно моя программа:
/*The program should calculate and display the miles per gallon obtained for each tankful. After processing
all input information, the program should calculate and print the combined miles per gallon
obtained for all tankfuls*/

#include <stdio.h>

int main(void)
{
    int counter = 0;
    float total = 0, result = 0, petrol, way;
    while(petrol != -1)
    {
        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &petrol);
        if(petrol != -1)
        {
        printf("Enter the miles driven: ");
        scanf("%f", &way);
        }
            if(petrol != 0)
            {
                if(petrol != -1)
                {
                result = way / petrol;
                printf("The miles/gallon for this tank was: %f\n", result);
                }
            }
            else
                printf("No results were entered!\n");
        total += result;
        counter++;
    }
        if(counter != 0)
        {
            total /= counter;
            printf("The overall average miles/gallon was %f\n", total);
        }
            else
                printf("No results were entered!");
    return 0;
}


Вывод следующий:

Enter petrol consuption (-1, input is complete): 12.8
Enter the passed path: 287
For this refueling received: 22.421875
Enter petrol consuption (-1, input is complete): 10.3
Enter the passed path: 200
For this refueling received: 19.417475
Enter petrol consuption (-1, input is complete): 5
Enter the passed path: 120
For this refueling received: 24.000000
Enter petrol consuption (-1, input is complete): -1
Average number of mills/gallons: 22.459837


Ошибка в расчётах у меня в логике программы? Проблема в том что используется тип float? - (насколько я понял он всегда представляется весьма приблизительно), но тогда бы он показывал другие цифры после точки, а разница выходит в целом числе, а не в его дробной части.

Спасибо за потраченное время!
  • Вопрос задан
  • 185 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ошибка у вас в логике. Смотрите, пусть есть два участка - 20 миль / 1 галлон и 50 миль / 2 галлона. Если найти показатель миль/на галлон для каждого участка, то получим 20 и 25. Среднее арифметическое - 22.5. Но ведь реально мы проехали 70 миль на 3 галлонах, то есть 70/3 = 23.(3) ≠ 22.5
Ответ написан
Комментировать
kacToHbI4
@kacToHbI4 Автор вопроса
11 лет anykey - надоело, хочу в разработчики.
Прочитал первый ответ и понял, что не так:

/*The program should calculate and display the miles per gallon obtained for each tankful. After processing
all input information, the program should calculate and print the combined miles per gallon
obtained for all tankfuls*/

#include <stdio.h>

int main(void)
{
    int counter = 0;
    float total_petrol = 0, total = 0, result = 0, total_way = 0, petrol = 0, way = 0;
    while(petrol != -1)
    {
        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &petrol);
        if(petrol != -1)
        {
        printf("Enter the miles driven: ");
        scanf("%f", &way);
        total_way += way;
        total_petrol += petrol;
        }
            if(petrol != 0)
            {
                if(petrol != -1)
                {
                result = way / petrol;
                printf("The miles/gallon for this tank was: %f\n", result);
                }
            }
            else
                printf("No results were entered!\n");
        counter++;
    }
        if(counter != 0)
        {
            total = total_way / total_petrol;
            printf("The overall average miles/gallon was %f\n", total);
        }
            else
                printf("No results were entered!");
    return 0;
}


Получил:
Enter the gallons used (-1 to end): 12.8
Enter the miles driven: 287
The miles/gallon for this tank was: 22.421875
Enter the gallons used (-1 to end): 10.3
Enter the miles driven: 200
The miles/gallon for this tank was: 19.417475
Enter the gallons used (-1 to end): 5
Enter the miles driven: 120
The miles/gallon for this tank was: 24.000000
Enter the gallons used (-1 to end): -1
The overall average miles/gallon was 21.601423
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@ns5d
нечего сказать
#include <stdio.h>

int main(void)
{
	float total_way = 0, total_petrol = 0, petrol, way;

	while (1) {
		printf("Enter the gallons used (-1 to end): ");
		scanf("%f", &petrol);

		if (petrol == -1) {
			printf("The overall average miles/gallon was %f\n", total_petrol == 0 ? 0 : total_way / total_petrol);
			break;
		}

		printf("Enter the miles driven: ");
		scanf("%f", &way);

		printf("The miles/gallon for this tank was: %f\n", petrol == 0 ? 0 : way / petrol);

		total_way += way;
		total_petrol += petrol;
	}

	return 0;
}
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Причина в другом. Если человек введёт −1 пройденного пути, надо сразу break, а не проходить огрызок цикла. Пока я проверял, ns 5d выписал действующий код.

Ну и, конечно, ошибка в логике: среднее потребление (в mpg) = сумма миль / сумму галлонов.

UPD. Раз уж не хотите break, то…
while(petrol != -1)
    {
        printf("Enter the gallons used (-1 to end): ");
        scanf("%f", &petrol);
        if(petrol != -1)  {
           // Тут делай ВСЕ вычисления по MPG
        }
   }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы