我正在制作一个银行计划,要求提供多个输入,例如帐号,姓名和余额。它应该显示在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;
}
我为这个凌乱的代码道歉,因为我是初学者。
答案 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循环之前接受用户的帐号。