История вычислений у калькулятора в языке с++
Необходимо создать логирование в калькуляторе.
Как можно этого добиться?
Я пыталась создать переменную stack для храненения истории, но не уверена в надёжности этого метода.
#include <iostream>
using namespace std;
double stack[6] = { 0,0,0,0,0,0 };
double Calculate(double x, char oper, double y){
double res;
if(oper=='+') {
res = x + y;
return res;
stack[] = res;
}
else if (oper == '-') {
res = x - y;
return res;
stack[] = res;
}
else if (oper == '*') {
res = x * y;
return res;
stack[5] = res;
}
else if (oper == '/') {
res = x / y;
return res;
stack[5] = res;
}
else{
return 0;
stack[5] = 0;
}
}
int main()
{ double x = 0.0;
double y = 0.0;
char op;
double result = 0.0;
bool isOn = true;
int UserCh;
enum OPT { calc = 1,history = 2 };
while (isOn)
{
cout << "\nWelcome!" << endl;
cout << "OPTIONS:\n1-CALCULATE\n2-HISTORY"<<endl;
cin >> UserCh;
switch (UserCh)
{
case calc:
cout << "\nEnter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl;
cin >> x >> op >> y;
cout << Calculate(x, op, y) << endl;
cout << "Exit?\n0-> yes\n1-> no" << endl;
cin >> isOn;
break;
case history:
for (int x = 0;x <= 4;x++)
{
stack[x] = stack[x + 1];
cout << stack[x];
}
break;
default:
break;
}
}
system("cls");
cout << "Goodbye!";
}
Ответы (1 шт):
Вы написали некомпилируемый код. Ну да ладно.
Теперь об ошибках:
Когда вы пишете return функция завершается. Всё что после - выполняться не будет.
if(oper=='+') {
res = x + y;
return res; // вот здесь функция завершиться.
stack[] = res; // Это что? Видимо просто не дописали?
}
Отсутствие правильной операции во вводе нужно проверять до выполнения функции Calculate(). Потому что 0 может быть результатом операции, а не только кодом возврата.
if( op=='+' || op=='-' || op=='*' || op=='/' )
cout << Calculate (x, op, y) << endl;
else {
coun << "Введена неправильная операция " << op << "\n";
continue;
}
Судя по коду, под логированием вы хотите запоминать предыдущие результаты. Хотя вполне возможно, по условиям задачи нужно было запоминать сами операции?
Для этого вам нужно кроме самого массива stack[6], создать итератор, который будет указывать на вершину стека:
const int StackSize = 100;
double stack[StackSize];
int StackIter = 0;
И тогда при добавлении в стек значения, вы его добавляете по индексу в итераторе. Ну и значение итератора = количество элементов в стеке. Только не забывайте проверять при добавлении элементов, чтобы итератор не превысил размер массива.
double
Calculate (double x, char oper, double y)
{
double res = 0;
if (oper == '+')
res = x + y;
else if (oper == '-')
res = x - y;
else if (oper == '*')
res = x * y;
else if (oper == '/')
res = x / y;
stack[StackIter] = res;
if(StackIter < StackSize)
StackIter++;
return res;
}
А поскольку у вас стоит на вопросе метка c++ - используйте контейнеры стандартной библиотеки, они для этого и созданы. И не будете думать о переполнении и т.д.
vector<double> stack;
Calculate (double x, char oper, double y)
{
stack.push_back(res);
}