Предполагается, что я делаю простую консольную программу, которая позволяет пользователю вводить свои мили и количество галлонов, использованных во время нескольких поездок. Он использует структуру цикла while и рассчитывает две экономии топлива, одну для поездки, и общую экономию топлива. Моя проблема в том, чтобы мои результаты соответствовали тому, что есть в книге, из которой я учусь. Его близко, но не на месте.
Это вывод из книги:
Enter miles driven (-1 to quit): 287
Enter gallons used: 13
MPG this trip: 22.076923
Total MPG: 22.076923
Enter miles driven (-1 to quit): 200
Enter gallons used: 10
MPG this trip: 20
Total MPG: 21.173913
Enter miles driven (-1 to quit): 120
Enter gallons used: 5
MPG this trip: 24
Total MPG: 21.678571
Это то, что я сделал до сих пор:
#include <iostream>
int main ( )
{
// Set our variables and initialize them
double miles = 0;
double gallons = 0;
double economyTrip = 0;
double economyTotal = 0;
while (miles >= 0)
{
std::cout << "Enter miles driven (-1 to quit): ";
std::cin >> miles ;
// Check input
if (miles == -1)
break;
else
std::cout << "Enter gallons used: ";
std::cin >> gallons;
// Calculate trip fuel economy
economyTrip = (miles/gallons) ;
// Calculate total fuel economy
if (economyTotal == 0)
economyTotal = economyTrip;
else
economyTotal += (economyTrip - economyTotal)/2;
// Display the results
std::cout << "MPG this trip: " << economyTrip << std::endl;
std::cout << "Total MPG:" << economyTotal << std::endl << "\n";
}
}
Я ошибаюсь в усреднении? Я знаю, что на калькуляторе, если вы берете среднее значение за три поездки, вы получите около 22,02563. , ,
Так что, мягко говоря, книга немного ближе, чем я. Мне интересно, как я могу сделать это по-другому, чтобы я мог получить более близкий ответ. Или это то, о чем я должен беспокоиться?
Вы не можете продолжать вычислять MPG и добавлять его к промежуточной сумме. Вам нужно хранить всего миль а также всего галлонов а затем рассчитать MPG в конце.
Ваша формула для вычисления общей экономики неверна. Вы должны взять сумму пройденных миль и разделить ее на сумму использованного топлива.
Есть два способа получить среднее значение:
Как правило, использование второго и более сложного метода приносит мало пользы, поэтому я предлагаю вам не отставать от первого.
Просто для удовольствия, давайте сделаем это вторым способом … но давайте сначала поймем, что мы делаем.
avg1 = a
avg2 = (a + b) / 2
avg3 = (a + b + c) / 3 = (a + b) / 3 + c / 3
= (a + b) * 2 / (2 * 3) + c / 3
= (a + b) / 2 * (2 / 3) + c / 3
= avg2 * (2 / 3) + c / 3
avg4 = (a + b + c + d) / 4 = avg3 * (3 / 4) + d / 4
и поэтому: avg[N] = avg[N-1] * (N - 1) / N + val[N] / N
который начинает чувствовать себя как барицентр 🙂 Замечания: avg[N-1] * (N-1)
на самом деле общая сумма до N-1
!
Таким образом, вместо общего количества миль и галлонов мы можем сохранить среднее число миль / галлонов и общее количество галлонов (в Python, просто чтобы показать принцип):
avgMiles = 0.0
totGallons = 0.0
while True:
miles = float(raw_input("Enter miles driven: "))
gallons = float(raw_input("Enter gallons used: "))
print "MPG this trip:", miles / gallons
newTotGallons = totGallons + gallons
avgMiles = avgMiles * totGallons / newTotGallons + miles / newTotGallons
totGallons = newTotGallons
print "Total MPG:", avgMiles
И вывод (или было бы, если бы оно было интерактивным):
Enter miles driven: 200
Enter gallons used: 10
MPG this trip: 20.0
Total MPG: 20.0
Enter miles driven: 100
Enter gallons used: 10
MPG this trip: 10.0
Total MPG: 15.0
Enter miles driven: 50
Enter gallons used: 5
MPG this trip: 10.0
Total MPG: 14.0
Enter miles driven:
Кстати, вместо -1
принято использовать CTRL+D
сигнализировать об окончании пользовательского ввода (по крайней мере, в Linux).
Просто наткнулся на это на некоторое время позже, чем было опубликовано. У меня такое же домашнее задание, за исключением C (не C ++), поэтому есть некоторые минимальные различия. Я решил это, и я поставлю решение здесь для всех, кто может встретить этот пост в будущем.
#include <stdio.h>
int main()
{
float gallons, miles, mpg, averagempg, gallonstotal, milestotal;
gallons = 0;
miles = 0;
mpg = 0;
averagempg = 0;
gallonstotal = 0;
milestotal = 0;
printf("\nEnter gallons used (-1 to end): ");
scanf("%f", &gallons);
while (gallons != -1) {
gallonstotal = gallonstotal + gallons;
printf("Enter the miles driven: ");
scanf("%f", &miles);
milestotal = milestotal + miles;
mpg = miles / gallons;
printf("The miles / gallon for this tank was %f \n", mpg);
printf("\nEnter gallons used (-1 to end): ");
scanf("%f", &gallons);
}
if (gallonstotal != 0){
averagempg = milestotal / gallonstotal;
printf("\nThe overall average miles/gallon was %f \n", averagempg);
}
else {
puts("Error: no gallons were entered \n");
}
}
#include <iostream>
using namespace std;
int main()
{
unsigned int tripCounter = 0;
double tripMPG = 0;
double totalTripMPG = 0;
cout << "Enter miles driven (-1 to quit): ";
double miles = 0;
cin >> miles;
while ( miles != -1 )
{
cout << "Enter gallons used: ";
double gallons = 0;
cin >> gallons;
tripMPG = miles / gallons;
cout << "MPG this trip: " << tripMPG << endl;
tripCounter = tripCounter + 1;
totalTripMPG = totalTripMPG + tripMPG;
double avgMPG = static_cast< double >( totalTripMPG ) / tripCounter;
cout << "Total MPG: " << avgMPG << endl;
cout << endl;
cout << "Enter miles driven (-1 to quit): ";
cin >> miles;
}
system("pause");
}