Я делаю калькулятор RPN в основном для изучения C ++, но я не могу прогрессировать, потому что у меня есть некоторые проблемы …
1 — Как и в любом другом калькуляторе RPN, я не хочу нажимать ввод каждый раз, когда набираю число. Это должно произойти только для первого, когда стек пуст.
Представьте, что я хочу сделать следующее:
2 + 3 + 4
В RPN это должно быть введено как
2 ENTER
3 +
4 +
Поэтому, когда код «видит» оператор (+ в данном случае), мне не нужно нажимать «ВВОД», код должен понимать это для себя.
2 — Функция преобразования, которую я использую (string2Double), работает нормально, если строка содержит число. Однако, если я войду, например. «abc», он вернет 0, и это число будет помещено в стек, как если бы я ввел число 0, что я не хочу делать.
Чтобы преодолеть это, я попытался использовать флаг fail (), но у меня не получилось передать результат в основную функцию.
Пожалуйста, найдите код ниже.
Заранее спасибо,
Pedro
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <stack>
using namespace std;
// Function Prototypes
void popNum(stack<double>);
double str2Double(string);
int main()
{
string userIn=""; // User input
stack<double> mystack;
double retVal=0;
stringstream ss;
cout<<"\nWelcome to the amazing Calculator\n";
while (userIn!="stop") { // Exits when userIn is "stop"
cout<<"\naCalc $ ";
cin>>userIn;
ss<<userIn;
if ((cin.get()=='\n') && (userIn!="stop")){ // Executes only after an "enter" and if different from "stop"
// Need to convert string to double, before pushing into the stack
retVal=str2Double(userIn);
mystack.push(retVal);
cout<<"\t\t\tSTACK's Content";
cout<<"\n\t\t\tLast number pushed : "<<retVal<<endl;
popNum(mystack);
}
else{
// Do nothing;
cout<<"\nExiting !!!\n";
}
}return 0;
}
double str2Double(string userIn){
// Converts a string into a double
double outValue=0;
stringstream ss;
// read user input which is a string
ss << userIn;
// write the string read from the input to a double
ss >> outValue;
cout << "Return: " << outValue << '\n';
cout<<"ss flag: "<<ss.fail()<<endl;
// Return the value read (double type)
return outValue;
}
void popNum(stack<double> mystack){
while (!mystack.empty())
{
std::cout << "\n\t\t\t"<< mystack.top();
mystack.pop();
}
std::cout << '\n';
}
Задача ещё не решена.
Других решений пока нет …