Вопрос:
Извините, я понял, что я включил весь свой код в этот вопрос. Весь мой код равен большей части ответа на эту конкретную проблему для других студентов, которая была идиотской.
Вот основная суть проблемы, которую я поставил:
Мне нужно было распознавать цифры с одной цифрой в регулярном математическом выражении (например, 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 };