RPN калькулятор в C ++ (консоль CodeBlocks) - PullRequest
0 голосов
/ 05 июня 2018

Я делаю калькулятор RPN в основном для изучения C ++, однако я не могу прогрессировать, поскольку у меня есть некоторые проблемы ...

1 - Как и в любом калькуляторе RPN, я не хочу нажимать ввод каждый раз, когда явведите номер.Это должно произойти только для первого, когда стек пуст.

Представьте, что я хочу сделать следующее: 2 + 3 + 4

В RPN это должно быть введено как 2 ENTER3 + 4 +

Поэтому, когда код «видит» оператора (+ в данном случае), мне не нужно нажимать «ENTER», код должен понимать, что для себя.

2- Функция преобразования, которую я использую (string2Double), работает нормально, если строка содержит число.Однако, если я вхожу, например, для.«abc», он вернет 0, и это число будет помещено в стек, как если бы я ввел число 0, что я не хочу делать.Чтобы преодолеть это, я попытался использовать флаг fail (), но у меня не получилось передать результат в основную функцию.

Пожалуйста, найдите код ниже.

Заранее спасибо,Педро

#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';
}
...