Помогите найти проблему

Написал калькулятор на C++. Когда добавил функцию истории вычислений (пока только предыдущее вычисление), столкнулся с проблемой.

Программа:

#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
int main()
{
setlocale(0, "");
int i;
double a;
int b;
int b1;
double c;
double d;
cout << "Калькулятор на C++. Добро пожаловать!" << endl << endl << "***" << endl << endl;
for (i = 1; i <= 9999999; i++)
{
cout << "Введите первое число (первое слагаемое, уменьшаемое, множитель, делимое): ";
cin >> a;
cout << "Введите значение оператора (1 - сложение, 2 - вычитание, 3 - умножение, 4 - деление): ";
cin >> b;
if (b == 1)
{
cout << "Введите второе число (второе слагаемое): ";
cin >> c;
double d = a + c;
cout << "Сумма чисел равна " << d;
} else if (b == 2)
{
cout << "Введите второе число (вычитаемое): ";
cin >> c;
double d = a - c;
cout << "Разница чисел равна " << d;
} else if (b == 3)
{
cout << "Введите второе число (второй множитель): ";
cin >> c;
double d = a * c;
cout << "Произведение чисел равно " << d;
} else if (b == 4)
{
cout << "Введите второе число (делитель): ";
cin >> c;
double d = a / c;
cout << "Частное чисел равно " << d;
} else 
{
cout << "Значение оператора не является допустимым. Ошибка!";
int b1 = 5;
}
cout << endl << endl << "***" << endl << endl;
cout << "Для нового вычисления нажмите любую клавишу...";
getch ();
system ("cls");
cout << "Калькулятор на C++. Добро пожаловать!" << endl << endl << "***" << endl << endl;
cout << "История вычислений" << endl << endl;
if (b1 != 5)
{
double a1 = a;
int b1 = b;
double c1 = c;
double d1 = d;
if (b1 == 1)
{
cout << a1 << "+" << c1 << "=" << d1;
} else if (b1 == 2)
{
cout << a1 << "-" << c1 << "=" << d;
} else if (b1 == 3)
{
cout << a1 << "*" << c1 << "=" << d1;
} else if (b1 == 4)
{
cout << a1 << "/" << c1 << "=" << d1;
}
}
cout << endl << endl << "***" << endl << endl;
}
return 0;
}

Dev-C++ ошибок в коде не нашел, но, при запуске программы и первом вычислении...

Калькулятор на C++. Добро пожаловать!


История вычислений

1+1=nan


Введите первое число (первое слагаемое, уменьшаемое, множитель, делимое):

История вычислений не работает. При каждом новом вычислении она обновляется, но «nan» в ответе так и остается. «NaN» — это, надо полагать, «Not-A-Number». Но почему он здесь? В чем ошибка?

#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
int main()
{
setlocale(0, "");
int i;
double a;
int b;
int b1;
double c;
double d;   // не инициализирована!
cout << "Калькулятор на C++. Добро пожаловать!" << endl << endl << "***" << endl << endl;
for (i = 1; i <= 9999999; i++)
{
cout << "Введите первое число (первое слагаемое, уменьшаемое, множитель, делимое): ";
cin >> a;
cout << "Введите значение оператора (1 - сложение, 2 - вычитание, 3 - умножение, 4 - деление): ";
cin >> b;
if (b == 1)
{
cout << "Введите второе число (второе слагаемое): ";
cin >> c;
double d = a + c;    // эта d - другая переменная, локальная для блока
cout << "Сумма чисел равна " << d;
} else if (b == 2)

// ...

if (b1 != 5)
{
double a1 = a;
int b1 = b;
double c1 = c;
double d1 = d;    // здесь используется первая d, которая не инициализирована
if (b1 == 1)
{
cout << a1 << "+" << c1 << "=" << d1;
} else if (b1 == 2)
{
cout << a1 << "-" << c1 << "=" << d;
} else if (b1 == 3)
{
cout << a1 << "*" << c1 << "=" << d1;
} else if (b1 == 4)
{
cout << a1 << "/" << c1 << "=" << d1;
}
}
cout << endl << endl << "***" << endl << endl;
}

//Компилятор не любит когда много else if мне кажется удобней switch и код красивее (Марков Денис)

include «stdafx.h»

include <iostream>

include <cmath>

using namespace std;

int main()
{
setlocale(0, «»);

cout << "\t\t\tКалькулятор\n\n\n";
cout >> «У данного кальк. 4 операции +|-|*|/»;

double a, b;
char Operator;

cout << "Введите число+операцию+число :\n;
cin >> a >> Operator >> b;

cout << «Результат :»;

switch(Operator)
{
case '+' cout << (a + b) << endl;break;
case '-' cout << (a — b) << endl;break;
case '*' cout << (a * b) << endl;break;
case '/' cout << (a / b) << endl;break;

default: cout << "Неверная операция??\n;
}
system(«pause»);
return 0;
}

Компилятор не любит когда много else if

Компилятору глубоко пофиг.
Аккуратный, читаемый, легкомодифицируемый код нужен человеку, который пишет, и человеку, который поддерживает.

Компилятору глубоко пофиг.

switch может быть лучше оптимизирован в ряде случаев. Не уверен, что компилятор может выполнить такие оптимизации для цепочки if-else.

Марков Денис

Это ютюберный распространитель заразы? )))

мне кажется удобней switch и код красивее

Особенно, если он на десяток тысяч строк. )))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.