С++ Распознавание двузначных чисел с использованием строк

Вопрос:Извините, я понял, что я включил весь свой код в этот вопрос. Весь мой код равен большей части ответа на эту конкретную проблему для других студентов, которая была идиотской. Вот основная суть проблемы, которую я поставил: Мне нужно было распознавать цифры с одной цифрой в регулярном математическом выражении (например, 5 + 6), а также двузначные

Вопрос:

Извините, я понял, что я включил весь свой код в этот вопрос. Весь мой код равен большей части ответа на эту конкретную проблему для других студентов, которая была идиотской.

Вот основная суть проблемы, которую я поставил:

Мне нужно было распознавать цифры с одной цифрой в регулярном математическом выражении (например, 5 + 6), а также двузначные числа (например, 56 + 78). Математические выражения также могут отображаться как 56 + 78 (без пробелов) или 56 +78 и т.д.

Фактическая проблема заключалась в том, что я читал в выражении как 5 6 + 7 8 независимо от того, какой был вход.

Спасибо и извините, что я довольно сильно удалил этот вопрос, но моя цель – не давать ответы на домашние проблемы.

Джесси Смонтермон

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

Во-первых, это помогает перемещать такой if, как этот

userInput[i] != ‘+’ || userInput[i] != ‘-‘ || userInput[i] != ‘*’ || userInput[i] != ‘/’ || userInput[i] != ‘^’ || userInput[i] != ‘ ‘ && i < userInput.length()

в свою собственную функцию, просто для ясности.

bool isOperator(char c){ return c == ‘+’ || c == ‘-‘ || c == ‘*’ || c == ‘/’ || c == ‘^’; }

Кроме того, нет необходимости проверять, что это не оператор, просто проверьте, что ввод – это число:

bool isNum(char c){ return ‘0’ <= c && c <= ‘9’; }

Другое дело, что с длинной цепочкой выше у вас возникла проблема с тем, что вы также войдете в блок tempNumber += …, если входной символ anyhing кроме ‘+’. Вам нужно будет проверить с помощью && или лучше с помощью функции выше:

if (isNum(userInput[iterator])){ tempNumber += userInput[iterator]; }

Это также исключает любой недопустимый ввод, например b, X и т.д.

Тогда для вашей проблемы с двузначными числами:
Проблема в том, что вы всегда вводите пробел после вставки tempNumber. Вам нужно только это сделать, если последовательность цифр закончена. Чтобы исправить это, просто измените конец вашей длинной цепочки if-else if:

// … operator stuff } else { postfixExpression << tempNumber; // peek if the next character is also a digit, if not insert a space // also, if the current character is the last in the sequence, there can be no next digit if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){ postfixExpression << ‘ ‘; } }

Это должно выполнить задание правильного представления из 56 + 78 —> 56 78 +. Скажите, пожалуйста, если что-то не так.:)

Ответ №1

Проблема действительно состоит из двух частей: лексирование ввода (поворот последовательности символов в последовательность “токенов” ) и оценка выражения. Если вы выполняете эти две задачи отдельно, это должно быть намного проще.

Сначала прочитайте на входе и преобразуйте его в последовательность токенов, где каждый токен является оператором (+, — и т.д.) или операндом (42 и т.д.).

Затем выполните преобразование infix-to-postfix в этой последовательности токенов. Тип “токена” не обязательно должен быть чем-то интересным, он может быть таким же простым, как:

struct Token { enum Type { Operand, Operator }; enum OperatorType { Plus, Minus }; Type type_; OperatorType operatorType_; // only valid if type_ == Operator int operand_; // only valid if type_ == Operand };

Оцените статью
Добавить комментарий