2012-02-09 50 views
0

我一直在嘗試編寫一些代碼,要求用戶爲會計程序記錄多個借記條目。如果用戶給出5作爲答案,那麼在繼續下一行代碼之前,程序應該向他詢問借方條目的名稱和金額5次。所以,我用循環來解決這個問題,似乎有些奇怪的事情正在發生。

這是在被編譯和執行時的代碼應該運行格式:

多少借記條目做您希望做?:2
1.借記名稱:例1
1.借方金額:123
2.借記條目名稱:示例2
2.借方金額:456



繼續到下一行代碼

下面是我用C++編寫的會計程序的這部分代碼:對於C++中的循環 - 變量未被正確遞增

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

int main() 
{ 
    cout << "How many debit entries do you wish to make?: "; 
    int entries; 
    cin >> entries; 
    string debitNames[50]; 
    float debitAmounts[50]; 
    int offset = 0; 
    int number = 1; 
    for (offset = 0; offset < entries; offset++) 
    { 
     cout << number << ". Debit Entry Name: "; 
     cin >> debitNames[offset]; 
     cout << number << ". Debit Amount: "; 
     cin >> debitAmounts[offset]; 
     for (number = 1; number <= entries; number++) 
     { 
     } 
    } 
    char response; 
    cin >> response; 
    return 0; 
} 



結果是非常奇怪的,這裏是發生了什麼當我編譯並運行它:

多少借記條目做你希望做?:5
1.借記條目名稱:示例1
1.借方金額:123
6.借記條目名稱:示例2
6.借方金額:123
6.借記條目名稱:示例3
6.借方金額:123
6.借記條目名稱:範例4
6.借方金額:123
6.借記條目名稱:例5
6.借方金額:123


繼續執行的代碼

程序下一行,上市爲1的號碼後,突然跳下6並保持在那裏,直到所有的5套題已要求。正如你現在所知道的,我使用'數字'變量來簡單地告訴用戶已經按照用戶自己的指定詢問'數字'條目。嘗試在編譯器中運行此代碼並查看是否出現相同的結果。順便說一下,我使用的是Visual C++ 20120 Express Edition,這可以解決這個問題嗎?

非常感謝。

回答

1

那麼,在循環之前,您將number變量設置爲1。

for (number = 1; number <= entries; number++) 
{ 
} 

爲什麼就不能做到這一點:

在循環中,你使用這個片段的number變量設置爲(entries + 1)

cout << (offset + 1) << ". Debit Entry Name: "; 
+0

感謝'atornblad',這比我寫出來的代碼好得多。謝謝你的合作。 – 2012-02-09 09:57:47

+0

但還有一件事,for循環爲什麼通過(entries + 1)增加'number'變量?語法上for循環是正確的。那麼爲什麼會發生? – 2012-02-09 10:04:01

+0

是的,但for循環爲每個循環設置'number'變量爲'1',然後爲每個循環增加'number'變量五次。而不是循環內的**循環**你應該只寫了'number ++;'而不是整個內循環。 – 2012-02-09 10:21:57

1

你內心的for循環會一直留在條目+ 1號:

for (number = 1; number <= entries; number++) 
    { 
    } 

您的意思是在這裏使用一個不同的變量,而不是重新使用現有的number

+0

但爲什麼編譯器會按(entries + 1)遞增數字? – 2012-02-09 09:57:20

+0

非常感謝您的回答Alan Stokes。 – 2012-02-09 10:09:10

0

你輸出的number變量,你在你的內心for循環遞增到entries +1 ...

+0

我不明白爲什麼編譯器會通過(entries + 1)增加'number'變量。你可以解釋嗎? – 2012-02-09 09:59:13

+0

你使用'for'循環,初始化'number'爲一個。然後,如果滿足條件,則使用'number <= entries'測試它,執行循環體。每次之後,您將數字加1,然後再次檢查條件。由於'number <= entries',條件將符合'number == entries',導致'number'的另一個增量。 – Abrixas2 2012-02-09 10:01:41

+0

感謝Abrixas2爲您解答。 – 2012-02-09 10:10:19

1

很明顯的bug是在這部分代碼:

for (number = 1; number <= entries; number++) 
     { 
     } 

你正在使用number來顯示借方條目號

並且它在上述循環中遞增到enteries + 1

+0

但問題是爲什麼for循環將數字變量遞增爲(entries + 1)? – 2012-02-09 09:56:22

+0

感謝hotadvice爲您解答。 – 2012-02-09 10:09:49

0

你爲什麼不呢?

另外一些更貼近現實生活的解決方案是不要分開舉行。創建結構體或類更合乎邏輯。

#include <iostream> 
#include <list> 
#include <time.h> 
#include<string> 
using namespace std; 

struct Debt{ 

    string name; 
    float owe; 
}; 


int main() 
{ 
cout << "How many debit entries do you wish to make?: "; 
int entries; 
cin >> entries; 
list<Debt> debts; 



for (int offset = 1; offset <= entries; offset++) 
{ 
    Debt debt; 

    cout << offset << ". Debit Entry Name: "; 
    cin >> debt.name; 

    cout << offset << ". Debit Amount: "; 
    cin >> debt.owe; 

    debts.push_back(debt); 

    for (int number = 1; number <= entries; number++) 
    { 
    } 
} 
int i=0; 
list<Debt>::iterator it; 
for (it=debts.begin() ; it != debts.end(); it++) 
    cout << "Debt seq " << ++i << " Name " << (*it).name << " debt is " << (*it).owe << endl; 


char response; 
cin >> response; 
return 0; 
} 
+0

是的,謝謝你,這是一個很好的建議'teodozjan'。 – 2012-02-09 09:58:36

+0

我還是個初學者,但是感謝這段代碼,當我明白它的時候它會變得非常有用。謝謝。 – 2012-02-09 15:36:38

0

您想要在循環結束時將數字加1。 要做到這一點,最簡單的方法是使用:

number++; 

for循環

for (number = 1; number <= entries; number++) 
    { 
    } 

完全unneccesary,編碼時,總是以最簡單的解決方案開始,你可以想像,讓你更復雜繼續。

+0

感謝James Allan的建議。 – 2012-02-09 15:35:07