#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
//Named constants residential customers
const double RES_BILL_PROC_FEES = 4.50;
const double RES_BASIC_SERV_COST = 20.50;
const double RES_COST_PREM_CHANNEL = 7.50;
//Named constants business customers
const double BUS_BILL_PROC_FEES = 15.00;
const double BUS_BASIC_SERV_COST = 75.00;
const double BUS_BASIC_CONN_COST = 5.00;
const double BUS_COST_PREM_CHANNEL = 50.00;
int main()
{
//Variable declarations
int accountNumber;
char customerType;
int numOfPremChannels;
int numOfBasicServConn;
double amountDue;
//declaring file streams
ifstream inFile;
ofstream outFile;
//open the file streams
inFile.open("input.txt");
outFile.open("output.txt");
//check wheather file exists or not
if (inFile.fail())
{
cout << "The input file cannot be found! ";
return 1;
}
//output console message
cout << "\n==========================================\n\n";
cout << " PROGRAM TO COMPUTE THE CABLE BILL\n";
cout << "\n==========================================\n\n";
//output outfile message
outFile << "\n==========================================\n";
outFile << " Customer Details";
outFile << "\n==========================================\n";
//loop until end of file
while (!inFile.eof())
{
cout << "The account number is: ";
inFile >> accountNumber;
cout << accountNumber<<"\n";
cout << "The customer type: "
<< "R or r (Residential), "
<< "B or b (Business): ";
inFile >> customerType;
cout << customerType << endl;
//switch to residential or business customer type
switch (customerType)
{
case 'r':
case 'R':
cout << "Enter the number"
<< " of premium channels: ";
cin >> numOfPremChannels;
cout << "\n\n";
amountDue = RES_BILL_PROC_FEES
+ RES_BASIC_SERV_COST
+ numOfPremChannels *
RES_COST_PREM_CHANNEL;
//write to output file
outFile << setw(25) << left << "\nCustomer Account Number: "
<< accountNumber << endl;
outFile << setw(25) << left << "Amount Due: "
<< fixed << setprecision(2) << "$" << amountDue << endl;
break;
case 'b':
case 'B':
cout << "Enter the number of basic "
<< "service connections: ";
cin >> numOfBasicServConn;
cout << "Enter the number"
<< " of premium channels: ";
cin >> numOfPremChannels;
cout << "\n\n";
if (numOfBasicServConn <= 10)
amountDue = BUS_BILL_PROC_FEES
+ BUS_BASIC_SERV_COST
+ numOfPremChannels *
BUS_COST_PREM_CHANNEL;
else
amountDue = BUS_BILL_PROC_FEES
+ BUS_BASIC_SERV_COST
+ (numOfBasicServConn - 10) *
BUS_BASIC_CONN_COST
+ numOfPremChannels *
BUS_COST_PREM_CHANNEL;
//write to output file
outFile << setw(25) << left << "\nCustomer Account Number: "
<< accountNumber << endl;
outFile << setw(25) << left << "Amount Due: "
<< fixed << setprecision(2) << "$" << amountDue << endl;
break;
default:
//write to output file
outFile << "\nThe account number " << accountNumber << " has an invalid customer type." << endl;
break;
} //end switch
} //end eof while loop
//close input file
inFile.close();
//close output file
outFile.close();
return 0;
}
任何人都可以向我解释为什么最后一个案例总是被运行/打印两次?这是我们必须为课程编写的基本程序,我似乎无法理解为什么它不起作用。 我的.eof()while循环中有问题吗?我尝试过使用do-while循环,但我得到了相同的结果。我还尝试通过不包括默认情况来更改输入文件,但它仍然运行最后一次设置两次。
**对于基本连接和通道的数量,只需输入任何有效的整数 这是我的输入文件:
157744232 b
253453534 r
335345435 R
445345345 B
545345345 t
答案 0 :(得分:4)
这不是因为switch
结构,而是因为eof
调用:只有在尝试读取下一个项目失败后,函数才会开始返回true
。
将循环更改为无限循环(for (;;)
或while(true)
,无关紧要)并在读取数据后执行eof
检查。如果您获得true
,请使用break
结束循环。否则,请继续执行switch
声明。
你的循环结构应该是这样的:
for (;;) {
cout << "The account number is: ";
if (!(inFile >> accountNumber))
break;
cout << accountNumber<<"\n";
cout << "The customer type: "
<< "R or r (Residential), "
<< "B or b (Business): ";
if (!(inFile >> customerType))
break;
cout << customerType << endl;
switch (customerType) {
... // The rest of your code
}
}
答案 1 :(得分:1)
当你在文件上写一个循环时,你应该使用这样的东西:
while( inFile >> somevar ) {
...
}
或者这个:
while( true ) {
inFile >> somevar1;
if( !inFile ) break;
...
}
这是常见的错误。