История вычислений у калькулятора в языке с++

Необходимо создать логирование в калькуляторе.

Как можно этого добиться?

Я пыталась создать переменную 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 шт):

Автор решения: DmitryK

Вы написали некомпилируемый код. Ну да ладно.
Теперь об ошибках: Когда вы пишете 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);
}
→ Ссылка