знак "плюс" c ++

0

Привет, ребята, у меня возникают трудности с знаком "плюс", когда вы получаете вход. здесь я занимаюсь калькулятором обратной полярности. я должен принять ввод как "3 2 + $", что означает (простым способом) добавить 3 и 2 и показать их. Я попытался использовать stringstream, while (cin). теперь я пытаюсь получить вход один за другим;

int num;
char ch;
while (cin)
    {
        if (cin >> num)
        {
            cout<<num;
        }
        else
        {
            cin.clear();
            cin >> ch;
            cout << ch;
        }
    }
}

он не работает для + и - и работает для * и /. но мне тоже нужны эти операнды. Я попробовал istringstream путем getline. он не видел + или - либо.

  • 0
    Считаете ли вы, что + и - могут прежде быть частью числа: -10 по-прежнему целое число ...
  • 0
    Получить каждый аргумент в виде строки и проверить строку на предмет его аргумента.
Показать ещё 2 комментария
Теги:
loops
escaping
operands

1 ответ

2
Лучший ответ

В вашем примере кода эта строка беспокоит меня, while (cin) (должен убедиться, что у вас будет и бесконечный цикл), в примере кода ниже (я добавил, что при вводе пустой строки программа заканчивается).

cin получит входное слово на одно слово, когда вы пишете на консоли 3 2 + $ когда вы вызываете cin >> somevariable; получит 4 результата: 3, затем 2, затем + и последний $. Другая проблема при чтении латинской нотации заключается в том, что вы не можете предсказать, будет ли следующий токен номером или оператором, вы можете получить: 3 2 + $ но 3 2 2 + * $ тоже. По этой причине вам нужен контейнер для хранения операндов.

Вот небольшой рабочий пример:

#include <iostream>
#include <stack>
#include <boost/lexical_cast.hpp>

using namespace std;

int main(int argc, char *argv[]) {
    string read;
    std::stack<int> nums;
    while (cin >> read) {
        if (read.empty()) {
            break;
        }
        else if (read == "$") {
            std::cout << nums.top() << std::endl;
        }
        else if (read == "+" || read == "-" || read == "*" || read == "/") {
            if (nums.size() < 2) {
            } // error code here

            int n1 = nums.top();
            nums.pop();
            int n2 = nums.top();
            nums.pop();

            if (read == "+")
                nums.push(n2 + n1);
            if (read == "-")
                nums.push(n2 - n1);
            if (read == "*")
                nums.push(n2 * n1);
            if (read == "/")
                nums.push(n2 / n1);
        }
        else {
            try {
                nums.push(boost::lexical_cast<int>(
                    read)); // you should add convertion excepcion code
            }
            catch (...) {

            }
        }
    }

    return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню