2016-09-06 56 views
1

我正在製作一個銀行程序,要求輸入諸如帳號,姓名和餘額等幾項信息。它應該顯示10個月內均勻支付的餘額。但由於某種原因,當我輸入一個名稱時,輸出之間的空格將無限循環。我認爲使用getline(cin,name)會解決問題,但它只會產生更多問題。輸入一些數字也會導致無限循環。爲什麼我的輸出無限循環?

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

void displayColumnTitle() { 
    cout << "MONTH BALANCE DUE" << endl; 
} 
float calculateBalanceDue(float balanceDue, float paymentAmt) { 
    balanceDue = balanceDue - paymentAmt; 
    return balanceDue; 
} 

void displayBalance(int month, float balanceDue) { 
     cout << left << setw(10) << month << right << setw(7) 
      << setiosflags(ios::fixed) << setprecision(2) << balanceDue << endl; 
} 

int main() { 
    float accountNumber = 0; 
    float balanceDue, paymentAmt; 
    int month = 1; 
    string name; 

    while (accountNumber != -1) 
    { 
     cout << "Enter Account Number(-1 to terminate the input):" << endl; 
     cin >> accountNumber; 
     if (accountNumber == -1) { 
      break; 
     } 
     cout << "Enter name: "; 
     getline(cin, name); 
     cout << "\nEnter balance due:" << endl; 
     cin >> balanceDue; 
     cout << "\nAccount Number: " << accountNumber << endl 
      << "Name: " << name << endl << endl; 
     displayColumnTitle(); 
     paymentAmt = balanceDue * .10; 
     while (balanceDue != 0) { 
      balanceDue = calculateBalanceDue(balanceDue, paymentAmt); 
      displayBalance(month, balanceDue); 
      month++; 
     } 
    } 
    return 0; 
} 

對於凌亂的代碼我很抱歉,因爲我是初學者。

+2

您確定'accountNumber'應該是浮點變量嗎?沒有什麼意義。 –

+1

另外,由於浮點值在計算機上的工作方式,幾乎所有對浮點值的操作都會導致四捨五入錯誤,這會增加您執行的更多操作。這意味着您可能會將* close *設置爲0來表示「balanceDue」,但不完全爲零。請閱讀[「浮點數學是否被破壞?」](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)。 –

+0

哎呀你是對的它應該是int – blionzion

回答

1

當你輸入一些不能被解析爲一個浮點數,那麼輸入操作>>將不會從緩存中刪除輸入。因此,下次嘗試讀取輸入時,它將完全相同,並且您將無法再讀取它。

未能讀取並解析輸入將導致流fail比特置位,這可以通過在一個布爾表達式使用流進行測試,如

while (!(cin >> accountNumber)) 
{ 
    // Error reading input 
} 

當你失敗讀取輸入你需要清除fail位,並且也放棄該行的其餘部分。

清除fail位用the streams clear function完成,丟棄行上剩餘的輸入用the streams ignore function完成。

全部放在一起上述循環可能看起來像

while (!(cin >> accountNumber)) 
{ 
    // Error reading input 
    cin.clear(); // Clear failure flag 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // skip bad input 

    cout << "Error in input, please try entering account number again: "; 
} 

同樣具有用於balanceDue輸入工作要做。

0

由於balanceDue的類型爲float,所以您陷入了無限循環。

#define delta 1e-10 
paymentAmt = balanceDue * .10; 
while (balanceDue > delta) { 
    balanceDue = calculateBalanceDue(balanceDue, paymentAmt); 
    displayBalance(month, balanceDue); 
    month++; 
} 

該值將非常接近零但不完全爲零。考慮將balanceDue的數據類型從float更改爲int

編輯:如果您不允許更改變量類型。然後定義一個小的delta。並檢查

while (balanceDue > delta) { 
    //do something 
} 
+0

感謝您的輸入!但遺憾的是,我無法更改類型,因爲我的作業指令聲明它必須是浮點型: – blionzion

+1

然後定義一些小的西格瑪值並評估它的「balanceDue」。 – Ari0nhh

+0

像[std :: numeric_limits :: epsilon](http:/ /en.cppreference.com/w/cpp/types/numeric_limits/epsilon) –

0

嘗試在while循環之前接受用戶的帳號..