我编写了代码并且它的工作原理除了总数是错误的。它应该将distanceRate乘以速率并添加每个成本来计算总数,但它并没有这样做。任何帮助将不胜感激。
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
//Declare Variables
ifstream inFile;
double packageWeight;
double distance;
double totalCharge = 0;
double rate;
double distanceRate;
int customerNumber;
double shippingCharge;
int packageCount = 0;
inFile.open("shipping.txt");
if(inFile)
{
cout << "Customer Package Shipping" << endl;
cout << "Number Weight Distance" << endl;
while(!inFile.eof())
{
inFile >> customerNumber;
inFile >> packageWeight;
inFile >> distance;
if(0 < packageWeight <= 2)
rate = 1.10;
else if(2 < packageWeight <=6)
rate = 2.20;
else if(6 < packageWeight <= 10)
rate = 3.70;
else if(10 < packageWeight <=20)
rate = 4.80;
else
cout << "Invalid package weight" << endl;
if( 0 < distance <= 500)
distanceRate = 1;
else if( 500 < distance <= 1000)
distanceRate = 2;
else if(1000 < distance <= 1500)
distanceRate = 3;
else if(1500 < distance <= 2000)
distanceRate = 4;
else
cout << "Invalid distance" << endl;
packageCount += customerNumber;
shippingCharge = rate * distanceRate;
totalCharge += shippingCharge;
cout << fixed << setprecision(2) << showpoint;
cout << setw(2) << customerNumber
<< right << setw(14) << packageWeight
<< setw(13) << distance
<< endl;
} //End of while loop
cout << "\nPackage shipped : " << packageCount << endl;
cout << "Total Charge : $" << totalCharge << endl;
inFile.close();
}
else
{
cout << "Could not open file" << endl;
}
system("pause");
return 0;
}
答案 0 :(得分:3)
我在您提供给我的代码段中看到的一些问题如下:
正如billz在评论中所指出的,您的if语句无效。语句if( 0 < distance <= 500)
没有按照您的期望进行,它从左到右进行评估,因此您有0 < distance
(假设评估为true
),那么您有true <= 1000
这不会给你认为会产生的结果。实际上,这需要分为两个单独的比较,如distance > 0 && distance < 500
。
正如我在评论中指出的那样,您将客户编号添加到包裹计数中,这很可能总是会给包裹计数带来错误的值。如果您的客户编号为1,2,3,4,那么您声称包裹数量为10时实际上只有4(如果我误解了该字段的用途,请原谅我)。
distanceRate
没有默认值,但您仍然在操作中使用它(可能未初始化),这会产生意外结果(如您所见)。在你的其他地方,你应该给它一个虚拟值,以保证它总是被设置。你也可以重置它,所以如果它被设置为4,然后下一个距离未通过测试并输入else,你对变量的另一个计算为4而不是它的默认值。您应该初始化您计划使用的任何变量,除非您有明确的理由不在初始化时给它一个值,并且只要您在循环中使用变量,就应该在循环开始时重置它的值。
附加说明(编辑)
我不建议使用system("pause");
因为它在幕后做的比你想要的简单停顿要多得多,我见过的更好的方法是:
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
cout << "Press any key to continue!";
_getch();
cout << "Finished";
return 0;
}
编辑2
如果语句可以包含一行或要执行的代码块。
单行:
if (someValueIsTrue)
executeThisFunction();
代码块:
if (someValueIsTrue) {
executeThisFunction();
alsoThisFunction();
}
任何时候你需要在if / else / while / for / do中执行多个语句...而/ etc ...你需要一个代码块。我想(根据你的解释)你做了:
if (blah)
// ....
else
distanceRate = 0;
cout << "Invalid Distance";
编译器只看到嵌套在循环中的distanceRate = 0
,cout
语句实际上不是其他部分,而是前一代码块的一部分。您需要在此处使用代码块。
答案 1 :(得分:0)
!inFile.eof() // incorrect
inFile.good() // correct
阅读eof()它没有做你想象的那样。
if( 0 < distance <= 500) // all the if statements are incorrect
if(distance>0 && distance<=500) // correct
你编写if条件的方式,它没有按照你的想法做到。