为什么我的输出无限循环?

时间:2016-09-06 05:18:24

标签: c++ loops io infinite-loop

我正在制作一个银行计划,要求提供多个输入,例如帐号,姓名和余额。它应该显示在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;
}

我为这个凌乱的代码道歉,因为我是初学者。

3 个答案:

答案 0 :(得分:1)

当您输入一些无法解析为浮点数的输入时,输入运算符>>将不会从缓冲区中删除输入。因此,下次当您尝试读取输入时,它将是完全相同的输入,您将无法再次读取它。

无法读取和解析输入将导致设置流fail位,可以使用布尔表达式中的流来测试,例如

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

当您无法读取输入时,您需要清除fail位,并丢弃剩下的行。

使用the streams clear function清除fail位,并使用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

的输入也必须如此

答案 1 :(得分: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
}

答案 2 :(得分:0)

尝试在while循环之前接受用户的帐号。