C++ 开关结构(运行最后一种情况两次)

C++ Switch Structure (Running Last Case Twice)

本文关键字:一种 情况 两次 结构 开关 运行 最后 C++      更新时间:2023-10-16
#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==========================================nn";
    cout << "     PROGRAM TO COMPUTE THE CABLE BILLn";
    cout << "n==========================================nn";
    //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 << "nn";
            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 << "nn";
            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

这不是因为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
    }
}

当你在文件上写一个循环时,你应该使用这样的东西:

while( inFile >> somevar ) {
   ...
}

或者这个:

while( true ) {
   inFile >> somevar1;
   if( !inFile ) break;
   ...
}

这是常见的错误。

相关文章: