我无法弄清楚我的c ++程序出了什么问题
I can't figure out what's wrong with my c++ program
问题是:ABC硬件公司聘请你为其应收账款部门编写一个程序。主文件按客户编号升序排列,客户名称和余额为 20 个字符。交易记录文件包含带有客户编号的每笔交易的记录。您将一次从两个文件中读入一条记录,并使用事务文件更新主文件中的信息。在转到下一个主记录之前处理所有事务记录。如果交易记录在第 1 列中包含"O",则计算订单金额并将其添加到到期余额中。如果记录在第 1 列中包含"P",则从应付余额中减去付款。保留ABC公司的应收账款余额的运行总计(每个客户的余额总和)。在处理主记录及其所有交易后,程序应为每个客户准备一张发票,其中列出了客户名称、编号、以前的余额、所有交易记录和最终到期余额。
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
您将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;
如果交易编号(tran[i]
)i
,怎么也可以是客户编号(main[i]
)?您可以使用您知道i
以外的变量名称!
代码底部也有这个:
for(int i=0; i<50; i++) {
....
}
同样,你应该使用数组中元素的实际数量(iRecordCount
)而不是固定的数字(50从何而来,因为你的数组只有7个元素的大小?
除了@JonathanPotter在他的回答中提出的建议之外,我还想补充一点,在 for 循环中使用 ifstream.eof()
很容易出错。
有用的阅读材料:为什么"while ( !feof (file))"总是错误的?
出于完全相同的原因,在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;
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- C++std::atomic在程序员级别保证了什么
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 什么是"undetectable means",它们如何更改 C/C++ 程序的对象?
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我的堆栈和库存清单程序的结构有什么问题?
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 指针和程序性能之间有什么关系吗?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 是什么原因导致我的SDL2程序中出现杂散像素
- 程序什么时候会创建多个堆
- 为什么我的 espeak-ng 程序什么也没说?
- 为什么当打印BST的预购遍历时,我的程序什么都不做
- 我的c++程序什么也不做