2015-06-19 90 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; 
相關問題