2015-06-19 121 views
-5

问题是:ABC硬件公司聘请你为它的Account Receivable部门编写一个程序。主文件按客户编号升序排列,并带有20个字符的客户名称和余额。交易文件包含每个交易的客户编号记录。您将从两个文件中逐个读入记录,并使用事务文件更新主文件中的信息。在进入下一个主记录之前处理所有交易记录。如果交易记录在第1列中包含“O”,则计算orderamount并将其添加到到期余额。如果记录在第1栏中包含“P”,则从应付的余额中减去付款。保持ABC公司的AR余额(每个客户的余额总和)的总数。在处理主记录及其所有交易后,程序应为每位客户准备一张发票,其中列出了客户名称,编号,以前的余额,所有交易以及应付的最终余额。我无法弄清楚我的C++程序有什么问题

The output should look like: 

CUSTOMER NAME  CUSTOMER NUMBER 
        PREVIOUS BALANCE $XXX.XX 
(ALL TRANSACTIONS PER CUSTOMER:) 
TRANSACTION# ITEM ORDERED $ORDER AMOOUNT 
TRANSACTION# ITEM ORDERED $ORDER AMOUNT 
TRANSACTION# PAYMENT   $PAYMENT AMOUNT 
          BALANCE DUE $XXX.XX 

我试着改变了数组,if语句等现在当我运行程序时没有打印任何东西。请帮忙!

这里是我的代码至今:

# include <iostream> 
# include <fstream> 
# include <iomanip> 
# include <string> 
using namespace std; 

struct master { 
    double custnum; 
    string name; 
    double balance; 
    }; 

struct transactions { 
    char transtype; 
    int custnum; 
    int transnum; 
    string item; 
    int quantity; 
    double price; 
    double amountpaid; 
    }; 

int main() 
{ 
    ifstream masterfile ("MASTER.txt"); 
    ifstream transfile ("TRANSACTION.txt"); 
    int prevbalance[7]; 
    master main [7]; 

for (int i=0; !masterfile.eof(); i++) { 
    masterfile>>main[i].custnum>>main[i].name>>main[i].balance; 
    } 

    for (int i=0;!masterfile.eof();i++) { 
     cout << main[i].custnum<<" "; 
     cout << main[i].name<<" "; 
     cout << main[i].balance<<" "<< 
     endl<<endl; 
prevbalance[i] = main[i].balance; 
    } 

double companybalance = 0; 
double orderamt=0; 

transactions tran[35]; 
for (int i=0; !transfile.eof(); i++) {{ 
    transfile>> tran[i].transtype; 
    cout<<tran[i].transtype<<" "; 

    if (tran[i].transtype == 'O') { 
    transfile>>tran[i].custnum; 
    cout<<tran[i].custnum<<" "; 

    transfile>> tran[i].transnum; 
    cout<<tran[i].transnum<<" "; 

    transfile>>tran[i].item; 
    cout<<tran[i].item<<" "; 

    transfile>>tran[i].quantity; 
    cout<<tran[i].quantity<<" "; 

    transfile>>tran[i].price; 
    cout<<tran[i].price<<" "<<endl<<endl; 

orderamt= tran[i].price*tran[i].quantity; 
main[i].balance+= orderamt; 

companybalance += main[i].balance; 

    } 
    else if (tran[i].transtype == 'P'){ 
    transfile>>tran[i].custnum; 
    cout<<tran[i].custnum<<" "; 

    transfile>> tran[i].transnum; 
    cout<<tran[i].transnum<<" "; 

    transfile>>tran[i].amountpaid; 
    cout<<tran[i].amountpaid<<endl<<endl<<endl; 

main[i].balance-tran[i].amountpaid; 

companybalance += main[i].balance; 

    }} 
for(int i=0; i<50; i++) { 
cout<<"Name: "<< main[i].name <<" Customer #: "<< main[i].custnum<<endl<<endl; 
cout<<"Previous Balance "<<prevbalance[i]<<endl; 
for(int j=0; j<7; j++){ 
cout<<"Transaction #: "<<tran[j].transnum<<" "<<tran[j].item<<" $"<<orderamt<<endl; } 
cout<<"Balance Due: "<<main[i].balance<<endl; 
} 

}}

下面是输入两个文件,主文件:

1000 TIFFANY 7000.99 
2000 MARY 6500.98 
3000 JACOB 6560.99 
4000 GENE 4560.98 
5000 BELLA 5300.87 
6000 ANNA 2340.90 
7000 DEMI 4230.45 

和交易文件:

O 1000 1000 PENS 20 2 
O 1000 2000 CPUS 2 200 
O 1000 3000 MONITER 2 100 
P 1000 4000 4000 
P 1000 5000 300 

O 2000 6000 CPUS 3 500 
O 2000 7000 MOUSE 3 50 
O 2000 8000 WIRES 5 8 
P 2000 9000 600 
P 2000 1100 798 

O 3000 1200 MONITERS 6 60 
O 3000 1300 CPUS 7 300 
O 3000 1400 MOUSE 30 40 
O 3000 1500 SPEAKERS 20 20 
P 3000 1600 5000 

O 4000 1001 SPEAKERS 2 50 
O 4000 2002 CABLES 4 20 
P 4000 3003 400 
P 4000 4004 500 
P 4000 5005 68 

P 5000 6001 600 
P 5000 4002 55 
P 5000 2003 450 
O 5000 4004 SPEAKERS 4 60 
O 5000 1005 LAPTOP 3 300 

O 6000 6001 TVS 5 400 
O 6000 8002 SPEAKERS 5 70 
P 6000 6003 2000 
P 6000 8004 1000 
O 6000 8005 CABLES 10 15 

O 7000 5001 PENS 50 2 
O 7000 7002 PAPER 400 2 
P 7000 4003 150 
P 7000 3004 230 
P 7000 6005 450 
+3

*“我想不出有什么错我的计划。“* - 弄脏手并使用调试器的时间。 –

+0

当你编写软件时,从一些小而简单的事情开始,然后逐步增加一点复杂性,在每一步都进行测试,并且不要将代码添加到不起作用的地方*你可以从'HelloWorld'开始 - 打印一些东西 - 然后从那里开始,如果你进入了“根本没有打印任何东西”的状态,你就知道问题在于你做的最后一个小改变,你可以恢复到刚才保存的版本那只会损失几分钟的工作。 – Beta

回答

2

你是usin g masterfile.eof()作为回路条件两次

for (int i=0; !masterfile.eof(); i++) { 
    masterfile>>main[i].custnum>>main[i].name>>main[i].balance; 
} 

for (int i=0;!masterfile.eof();i++) { 
    cout << main[i].custnum<<" "; 
    cout << main[i].name<<" "; 
    cout << main[i].balance<<" "<< 
    endl<<endl; 
    prevbalance[i] = main[i].balance; 
} 

想想这怎么可能无法工作。到第一个循环结束时,您已经到达文件的末尾。第二个循环在它开始之前即将完成!

当然,您可以将文件指针重置为开头,但更好的方法是保留您拥有的记录数,并将该数用于第二个循环。

int iRecordCount = 0; 
for (iRecordCount = 0; !masterfile.eof(); iRecordCount++) { 
    masterfile>>main[iRecordCount].custnum>>main[iRecordCount].name>>main[iRecordCount].balance; 
} 

for (int i=0; i < iRecordCount;i++) { 
    cout << main[i].custnum<<" "; 
    cout << main[i].name<<" "; 
    cout << main[i].balance<<" "<< 
    endl<<endl; 
    prevbalance[i] = main[i].balance; 
} 

另外请注意,您使用的是固定的阵列(master main[7])来存储你的记录 - 如果你有超过7个记录它的输入文件,会发生什么?你会超出数组的界限。真的,您应该更改为使用std::vector,以便数组可以动态增长,但如果您不想这样做,则应在读取记录时进行额外检查,以确保不会使阵列溢出:

int iRecordCount = 0; 
for (iRecordCount = 0; iRecordCount < sizeof(main)/sizeof(main[0]) && !masterfile.eof(); 
    iRecordCount++) { 
    masterfile>>main[iRecordCount].custnum>>main[iRecordCount].name>>main[iRecordCount].balance; 
} 

您在阅读您的交易时也会发生奇怪的事情。你有喜欢的东西:

orderamt= tran[i].price*tran[i].quantity; 
main[i].balance+= orderamt; 

如果i是交易数量(tran[i])怎么也成为客户数量以及(main[i])?您可以使用您知道的i以外的变量名称!

你也有这样的,在你的代码的底部:

for(int i=0; i<50; i++) { 
.... 
} 

同样,你应该使用数组(iRecordCount),而不是一个固定数量的元素的实际数量(也没有50从哪儿来因为你的数组只有7个元素的大小?)。

1

除了通过@JonathanPotter in his answer提出的建议,我想补充的是,在使用ifstream.eof() for循环很容易出错。

有用的阅读材料:Why is “while (!feof (file))” always wrong?

由于完全相同的原因,在条件为for循环中使用!masterfile.eof()是错误的。

这是更好地使用:

std::vector<master> masterData; 
while (masterfile) 
{ 
    // Try to read the data into a temporary object. 
    master m; 
    masterfile >> m.custnum >> m.name >> m.balance; 

    // If the input was successful, add it to masterData 
    if (masterfile) 
    { 
     masterData.push_back(m); 
    } 
} 

您可以使用类似的逻辑来读取交易记录过。

而且,你有一句台词:

main[i].balance - tran[i].amountpaid; 

我相信这是一个错字,你想用的是:

main[i].balance -= tran[i].amountpaid; 
相关问题