好吧所以我真的很喜欢编程和C ++而且我一直在尝试通过使用布尔语句为用户提供多个路径来扩展类内赋值。我想知道如何获得布尔语句中定义的值,以便在较低的//处理区域外使用。
问题:在“interestRate = interestRate / 12;”中问题,Xcode告诉我“变量'interestRate'在这里使用时可能未初始化”
cout << "To figure out the interest rate on your deposit, please type whether your money is in a 'CD', 'Savings', 'Checking' or 'IRA' account." << endl;
char CD;
char Savings;
char Checking;
char IRA;
if (cin.get (CD))
{
interestRate = 0.01;
}
if (cin.get(Savings))
{
interestRate = 0.01;
}
if (cin.get(Checking))
{
interestRate = 0.08;
}
if (cin.get(IRA))
{
interestRate = 0.08;
}
//Processing
interestRate = interestRate / 12;
time = years * 12;
amountSaved = deposit *((pow(1 + interestRate, time) - 1) / interestRate);
interestRate = (interestRate * 100) * 12;
答案 0 :(得分:3)
您收到此警告,因为interestRate
没有默认值。如果if条件的计算结果为true,则该变量确实未初始化。在声明变量时尝试给变量赋一个默认值,或者将if语句结构更改为处理我提到的情况的结构(none都为真)。这应该可以解决警告问题。
答案 1 :(得分:3)
要直接回答您的问题,您可能会interestRate
定义类似于:
double interestRate;
如果没有给出值,则double
等内置类型的默认值根本没有初始化。如果您的if条件均不为真,则永远不会设置interestRate
。然后在计算interestRate / 12
时使用其值。那种未定义的行为并没有什么好处。编译器非常有用。
为防止这种情况发生,所有可能的代码路径都需要为interestRate
提供一个值。例如,如果您希望忽略无效输入并使用默认值,则可以将其初始化并构建类似于现在的检查。
如果不这样做,您的代码就不会按照您的想法行事。您似乎想要实际输入一个字符串并根据几个选项检查其值。您现在正在做的是让用户为您的每项支票输入一个字符,然后在读取成功时设置利率(在正常情况下,对于单个字符应始终如此)。
您需要的可能是单个字符串和if-else链:
std::string accountType;
if (!(std::cin >> accountType)) {
//unsuccessful read
}
if (accountType == "CD" || accountType == "Savings") {
interestRate = 0.01;
} else if (accountType == "Checking" || accountType == "IRA") {
interestRate = 0.08;
} else {
//invalid input
}
Thomas Matthews也提出了一个很好的观点,即从用户的角度来看,进入&#34; ira&#34;将执行与输入&#34; IRA&#34;相同的操作,因此将输入字符串转换为一个案例将允许您与小写或大写字符串进行比较。
答案 2 :(得分:1)
您还可以使用查找表来查找利率:
struct Entry
{
std::string account_name;
double interest_rate;
};
Entry Interest_Rates[] =
{
{"CD", 0.01},
{"Savings", 0.01},
{"Checking", 0.08},
{"IRA", 0.08},
};
static const unsigned int number_of_account_types =
sizeof(Interest_Rates) / sizeof(Interest_Rates[0]);
//...
std::string account_name;
cin >> account_name;
double interest_rate = 0.0005;
for (unsigned int i = 0; i < number_of_account_types; ++i)
{
if (account_name == Interest_Rates[i].account_name)
{
interest_rate = Interest_Rates[i].interest_rate;
break;
}
}