2015-02-03 1 views
0

Хорошо, поэтому я действительно новичок в программировании и C++, и я пытался расширить назначение класса с помощью булевых операторов, чтобы предоставить пользователю несколько путей для программы. Мне было интересно, как получить значение, определенное в булевом выражении, которое будет использоваться снаружи в нижней области обработки.Как получить переменную, определенную в моем булевом выражении, для работы в моей основной программе?

Проблема: В разделе «interestRate = interestRate/12;» Проблема, Xcode говорит мне: «Variable„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; 
+1

, если это не intialized в то opint, то ни один из ваших ', если()' заявления не срабатывает. вам просто нужно «interestRate = 0» где-то до этого. –

+1

Пожалуйста, отправьте проверяемый код. [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) –

+0

Кстати, тип 'char' содержит только одну букву. Вы указываете Пользователю ввести «CD», «Сбережения» или проверку; каждая из которых содержит более одной буквы. Вам понадобится 'std :: string' для хранения более одной буквы. Кроме того, найдите в Интернете «C++ transform tolower», чтобы преобразовать текст во все нижний регистр перед сравнением. –

ответ

3

Чтобы получить ответ на свой вопрос, Вы, вероятно, имеют interestRate определены подобно:

double interestRate; 

Если не задано, по умолчанию для встроенных типов, таких как double не инициализируется вообще. Если ни одно из ваших условий if не установлено, interestRate никогда не будет установлено. Затем вы используете его значение при вычислении interestRate/12. Это неопределенное поведение, и это не хорошо. Компилятор действительно полезен.

Чтобы предотвратить это, все возможные пути кода должны дать значение interestRate. Например, если вы хотите игнорировать недопустимые входы и использовать значение по умолчанию, вы можете просто инициализировать его и структурировать свои чеки, аналогичные тем, что у вас есть сейчас.

С учетом этого ваш код не делает то, что вы думаете. Кажется, вы хотите ввести строку и проверить ее значение на несколько параметров. Теперь вы делаете ввод пользователем одного символа для каждой проверки, а затем устанавливаете процентную ставку, если чтение преуспевает (что всегда должно быть для одного персонажа при нормальных обстоятельствах).

Что вам нужно, это, вероятно, одна строка и если-иначе цепь:

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 также делает хорошую точку в том, что она, как ожидается, с точки зрения пользователя, что ввод «ира» будет делать то же самое, что и ввод «IRA», поэтому преобразование входной строки в один случай позволит вам сравнить только строчную или прописную строку.

+0

По иронии судьбы, этот принятый ответ исправляет почти любую проблему из вопроса _except_, о котором действительно спрашивают. Нам нужна декларация для 'interestRate', и для ее устранения требуется инициализатор, чтобы избавиться от предупреждения. –

+0

@LightnessRacesinOrbit, я действительно не помогаю будущим посетителям, делая это, спасибо. – chris

+0

Я думаю, что в целом лучшая помощь будущим посетителям - ответить на вопрос: P Намного лучше сейчас: +1 –

3

Вы получите это предупреждение, так как нет значения по умолчанию для interestRate. Если нет, если условие оценивается как true, то переменная действительно неинициализирована. Попытайтесь присвоить переменной значение по умолчанию при ее объявлении или изменить структуру if if на тот, который обрабатывает упомянутый случай (ни одно не верно). Это должно устранить проблему с предупреждением.

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; 
    } 
} 
+0

Возможно также использовать 'std :: unordered_map', правильно? Вам просто нужно быть осторожным, чтобы убедиться, что запись существует в первую очередь. – chris

+0

@chris: Вам не нужно быть осторожным. 'op []' создаст для вас инициализированную по умолчанию запись, если она не существует по запросу. –

+0

@LightnessRacesinOrbit, Не обращай на меня внимания. Я думал о проверке того, действительно ли у вас есть ввод в качестве ключа, чтобы что-то сделать, если скорость не найдена, но вам все равно нужна эта проверка, если только она не равна нулю по умолчанию, когда пользователь вводит неподдерживаемый тип учетной записи. – chris

Смежные вопросы