使用函数输入1个int和1个字符串数组并循环

时间:2013-11-16 19:32:52

标签: c++ arrays function for-loop output

我有一个cs课程的项目将于下周末到期,我已经完成了它,但我遇到了一些问题,我一直在尝试一切,但无法让它发挥作用。我们的项目包括从输入文件中获取3个月的3个客户信息和每月公用事业费用,将所有这些存储在数组中,然后计算小计,税,​​折扣和总付款,然后将其存储到数组中,然后输出1个季度收据为每个客户。我们必须使用函数来做到这一点。我的主要问题是,它只输出第一个客户收据,我已经双重检查了我的for循环,对我来说它看起来应该有效。

非常感谢

继承输出文件

             Austin City Office, Texas
                           RECEIPT #59, September28, 2013, 09:00PM

客户ID:127654 姓名:杰克琼斯 地址:2059 Joe Lane,Austin TX,78646 电话号码:512-520-5862

电费:6美元 水费:24美元 燃气费:12美元

小计:42美元 折扣金额:0.84美元(由于您的小计小于100美元,折扣2%)

折扣后小计:41.16美元(加2%折扣)

销售税金额:2.4696美元(自折扣后的小计金额低于100美元以来的6%税)

支付的总金额:$ 43.6296(增加6%的销售税)

............................................... .................................................. .... 退款政策:如果在付款之日起30天内报告错误,则为100%。只有75%的退款 30天后。                              感谢您及时付款。


继承我的输入文件

Austin City Office, Texas
RECEIPT #59, September28, 2013, 09:00PM
Refund Policy: 100% if an error is reported within 30 days from the date of payment. Only 75% refund 
after 30 days.
Thank you for prompt payment.
127654
Jack Jones
2059 Joe Lane, Austin TX, 78646
512-520-5862
2
8
4
2
8
4
2
8
4
Austin City Office, Texas
RECEIPT #59, September28, 2013, 09:00PM
Refund Policy: 100% if an error is reported within 30 days from the date of payment. Only 75% refund 
after 30 days.
Thank you for prompt payment.
124325
Jack Williams
2788 Eagle Drive, Austin TX, 78646
512-623-7676
2
8
20
2
8
20
2
8
20
Austin City Office, Texas
RECEIPT #59, September28, 2013, 09:00PM
Refund Policy: 100% if an error is reported within 30 days from the date of payment. Only 75% refund 
after 30 days.
Thank you for prompt payment.
125672
John Jones
3422 Hawk Drive, Austin TX, 78646
512-522-4564
2
8
40
2
8
40
2
8
40

和我的代码

#include<iostream>
#include<iomanip>
#include<string>
#include<string>
#include<fstream>

using namespace std;

//define varibles
    int ncustomer1;
    double  discount, tax;
    string dc, dsc, tc, dtpc;
    //validation constant
    const int MIN_N = 1, MAX_N = 3, MAX_TITLE=200, MAX_CINFO=200;
    const float MIN_CHARGE=1.00, MAX_CHARGE= 1000.00;
    // Array constant
    const int MAX_NUMCUST=3, MAX_NUMMONTH=3, MAX_NUMCHARGE=3, MAX_NUMHEAD=6, MAX_NUMINFO=9, MAX_NUMTOTAL=8;
    //customer info array
    string NonNum[MAX_NUMCUST][MAX_NUMINFO];
    //charges array
    double Num[MAX_NUMCUST][MAX_NUMMONTH][MAX_NUMCHARGE] = {0};
     //calculated array
    double custTotals[MAX_NUMCUST][MAX_NUMTOTAL] = {0};

    //functions
    void input(string NonNum[MAX_NUMCUST][MAX_NUMINFO], double Num[MAX_NUMCUST][MAX_NUMMONTH][MAX_NUMCHARGE], int& count);
    double subtotal(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count);
    double discount1(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count);
    double tax1(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count);
    void receipts(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], string NonNum[MAX_NUMCUST][MAX_NUMINFO], int&count);

int main()

{
    //Ask number of customers from user
        cout<< "Enter a number for amount of customers you would like to make a receipt for number should be between 1 and 3."<<endl;
        cin >> ncustomer1;

    //validate users entry
        while(ncustomer1 > MAX_N || ncustomer1 < MIN_N )
        {
            cout << "Error: the number of customers must be between "<< MIN_N << " and "<< MAX_N  <<endl;
            cout<< "Re-Enter the number of customers"<<endl;
            cin>> ncustomer1;
        }

    //output to screen when users entry is correct
        cout<< "Ok, individual receipt(s) will be added to the output file for "<< ncustomer1<< " customer(s)."<<endl;

        //customer for loop
    for (int count = 0; count < ncustomer1; ++count)
        {
        input(NonNum, Num, count);
        subtotal(custTotals, count);
        discount1(custTotals, count);
        tax1(custTotals, count);
        receipts(custTotals, NonNum, count);
        }

return 0;

}

//functions
void input(string NonNum[MAX_NUMCUST][MAX_NUMINFO], double Num[MAX_NUMCUST][MAX_NUMMONTH][MAX_NUMCHARGE], int& count)
{
    //objects to help read input file
                ifstream inputFile;

            //open the input file
                inputFile.open("Project5_a02418790_Input.txt");

            //validation of input file
                if(!inputFile)
                {
                    cout<<"error opening input file.";

                }
            // For loop for non numeric data id, number...
                        for(int head = 0; head < 9; ++head)
                            {
                                //Get customer data as strings from input
                                getline(inputFile,NonNum[count][head]);

/*                              Validate inputed customer data
                                if(NonNum[count][head].length()>MAX_CINFO)
                                    {
                                        cout<<"customer "<<count<<"(customers are from 0-X, so customer 1=0) heading "<<head<<" String is too long"<<endl;
                                        continue;
                                    }
*/
                            }//end non numeric data for loop


                //number of months For loop
                for(int mnth = 0; mnth < 3; ++mnth)
                    {

                        //number of charges For loop
                        for(int charge = 0; charge < 3; ++charge)
                            {
                                //input charges
                                inputFile >> Num[count][mnth][charge];

                                //Running totals of the 3 charges
                                custTotals[count][charge] += Num[count][mnth][charge];
                            }//end of number of charges for loop

                    }//end of number of months foor loop

}


double subtotal(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count)
{
// calculate the subtotal
//subtotal          =    Elec total      +   Water Total      +   Gas Total
custTotals[count][3]=custTotals[count][0]+custTotals[count][1]+custTotals[count][2];

}

double discount1(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count)
{
//figure out the discount based on the subtotal
                //if(subtotal=,<,> a number)
                //  discount%= x, comment= x;
                if(custTotals[count][3]<100)
                    discount= .02, dc = "(2% discount since your subtotal is less than $100)", dsc="(With 2% discount added)";
                if(custTotals[count][3]>=100&&custTotals[count][3]<250)
                    discount= .03, dc = "(3% discount since your subtotal is greater or equal to $100)", dsc="(With 3% discount added)";
                if(custTotals[count][3]>=250&&custTotals[count][3]<500)
                    discount=.04, dc = "(4% discount since your subtotal is greater or equal to $250)", dsc="(With 4% discount added)";
                if(custTotals[count][3]>=500)
                    discount=.05, dc = "(5% discount since subtotal is greater or equal to $500)", dsc="(With 5% discount added)";

            //calculate the amount of discount
            //discount amount      =     subtotal      * discount %
            custTotals[count][4] = custTotals[count][3]*discount;

            //calculate the subtotal after the discount
            //subtotal after dis=    subtotal        - discount
            custTotals[count][5]=custTotals[count][3]-custTotals[count][4];
}

double tax1(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], int&count)
{


    //figure out how sales tax percent and what captions
    //if(subtotal after dis =,<,> a num)
    //  tax percent= x, comment= x;
    if(custTotals[count][5]< 100 )
        tax= .06, tc="(6% Tax since your subtotal after the discount is less than $100)", dtpc= "(With 6% Sales Tax added)";
    if( custTotals[count][5] >=100&& custTotals[count][5] <250)
        tax= .07, tc="(7% Tax since your subtotal after the discount is greater or equal to $100)", dtpc= "(With 7% Sales Tax added)";
    if( custTotals[count][5] >=250&& custTotals[count][5] <500)
        tax=.08, tc="(8% Tax since your subtotal after the discount is greater or equal to $250)", dtpc= "(With 8% Sales Tax added)";
    if( custTotals[count][5] >=500)
        tax=.09, tc="(9% Tax since your subtotal after the discount is greater or equal to $500)", dtpc= "(With 9% Sales Tax added)";

//calculate the sales tax amount
//amount of tax    = subtotal after dis  * tax percent
custTotals[count][6]= custTotals[count][5]*tax;

//calculate total amount paid
//total paid       =  subtotal after dis   + amount of tax
custTotals[count][7]= custTotals[count][5] + custTotals[count][6];

}

void receipts(double custTotals[MAX_NUMCUST][MAX_NUMTOTAL], string NonNum[MAX_NUMCUST][MAX_NUMINFO], int&count)
{
    //objects to help read output file
                ofstream outputFile;

            //open the  output file
                outputFile.open("Project5_a02418790_Output.txt");

            //validation of output file
                if(!outputFile)
                {
                    cout<<"error opening output file.";

                }

//OUTPUT ALL NEEDED INFO (STILL INSIDE CUSTOMER FOR LOOP)
                        //OUTPUT HEADER
                        outputFile<<setw(58)<<NonNum[count][0]<<endl<<setw(70)<<NonNum[count][1]<<endl;

                        //OUTPUT CUSTOMER INFO FOR LOOP
                        for(int z = 5; z < 9; ++z)
                            {

                                while(z == 5 )//Customer ID
                                    {
                                        outputFile<<endl<<"Customer ID: "<<NonNum[count][z]<< endl;
                                        break;
                                    }

                                while(z == 6 )//Name
                                    {
                                        outputFile<<"Name: "<<NonNum[count][z]<< endl;
                                        break;
                                    }

                                while(z == 7 )//Address
                                    {
                                        outputFile<<"Address: "<<NonNum[count][z]<< endl;
                                        break;
                                    }

                                while(z == 8 )//Phone Number
                                    {
                                        outputFile<<"Phone Number: "<<NonNum[count][z]<< endl;
                                        break;
                                    }

                            }//END OF OUTPUT CUSTOMER INFO FOR LOOP

                        //OUTPUT CHARGES AND TOTALS FOR LOOP
                        for(int y = 0; y < 8; ++y)
                            {

                                while(y == 0 )//Electricity Charges
                                    {
                                        outputFile<<endl<<"Electricity Charges: $"<<custTotals[count][y] << endl;
                                        break;
                                    }

                                while(y == 1 )//Water Charges
                                    {
                                        outputFile<<"Water Charges: $"<<custTotals[count][y] << endl;
                                        break;
                                    }

                                while(y == 2 )//Gas Charges
                                    {
                                        outputFile<<"Gas Charges: $"<<custTotals[count][y] << endl<<endl;
                                        break;
                                    }

                                while(y == 3 )//Subtotal
                                    {
                                        outputFile<<"Subtotal: $"<<custTotals[count][y] << endl;
                                        break;
                                    }

                                while(y == 4)//Discount Amount
                                    {
                                        outputFile<<"Discount Amount: $"<<custTotals[count][y]<<" "<<dc<< endl<<endl;
                                        break;
                                    }

                                while(y == 5 )//Subtotal After the Discount
                                    {
                                        outputFile<<"Subtotal After the Discount: $"<<custTotals[count][y]<<" "<<dsc<< endl<<endl;
                                        break;
                                    }

                                while(y == 6 )//Sales Tax Amount
                                    {
                                        outputFile<<"Sales Tax Amount: $"<<custTotals[count][y]<<" "<<tc<< endl<<endl;
                                        break;
                                    }

                                while(y == 7 )//Total Amount Paid
                                    {
                                        outputFile<<"Total Amount Paid: $"<<custTotals[count][y]<<" "<<dtpc<< endl<<endl;
                                        break;
                                    }

                            }//END OF OUTPUT CHARGES AND TOTALS FOR LOOP


                        //OUTPUT FOOTER BREAK
                        outputFile<<"....................................................................................................."<<endl;

                        //OUTPUT REFUND FOR LOOP
                        for(int w = 2; w < 4; ++w)
                            {
                                outputFile<< NonNum[count][w]<<endl;
                            }

                        //OUTPUT THANKYOU
                        outputFile<<setw(58)<<NonNum[count][4]<<endl;

                        //OUTPUT NEW LINE AND DIVIDER FOR NEW CUSTOMER
                        outputFile<<endl<<"_____________________________________________________________________________________________________"<<endl<<endl;



}

1 个答案:

答案 0 :(得分:0)

你确定它每次写第一个吗?在我看来,它会编写最后一个,因为你在每次调用收据时都会将文件写入,而不是附加到它。

获得一组输出IMHO的关键原因是这一行

outputFile.open("Project5_a02418790_Output.txt");

因为每次调用收据都会调用它,所以每次都会覆盖文件,只得到一组输出。

还有很多其他的东西都是非常糟糕的编码习惯。

问题1:使用数组,您应该使用Structures /或类: 例如:您将客户信息保存在字符串数组的数组中。

std::string NonNum[MAX_NUMCUST][MAX_NUMINFO]

然后NonNum [1] [5]是客户1的customerID的ID。您应该构建一个结构,它将使您的代码更容易理解。正确命名NonNum告诉我们它包含我们从代码中看到的字符串,它没有告诉我们存储什么类型的信息的重要信息(客户ID /地址等)。

另见:

for(int z = 5; z < 9; ++z) {
    while(z == 5 )//Customer ID  {
         outputFile<<endl<<"Customer ID: "<<NonNum[count][z]<< endl;
         break; 
    while(z==6) { ...

}

内心的意义何在?你为什么需要循环?不会写得容易得多:

OUTPUTFILE&LT;&LT; &#34;客户ID:&#34; &LT;&LT; CustomerInfo [i] .CustomerID&lt;&lt; ENDL;

问题2:函数之间的依赖关系

小计填写custTotals[i][3]并取决于custTotals[i][0]custTotals[i][1]&amp; custTotals[i][2]

discount1根据之前的那些填充custTotals [i] [4]。再次,您使用的是一个应该使用结构的数组。但如果功能的输入和输出清晰易懂,它也会让您的生活更轻松。

目前,函数顺序的任何变化都会使逻辑变得混乱,但是从代码中看不到它。

如果您有一个单独的subTotals数组,您将传递给subTotals,因此它会写入然后传递给Discount1,以便从所有内容中读取更清晰。

问题3:你传递了一个int&amp;计算所有这些功能,但您不打算更改它。我预计错误是你写的内部函数之一,并没有意识到它。如果将非常量引用传递给对象,则表示这是函数的输出而不是输入。