C ++ Распознавание двойных цифр с использованием строк - PullRequest
0 голосов
/ 27 марта 2011

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

Вот основная суть поставленной мной задачи:

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

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

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

Затем выполните преобразование инфикса в постфикс для этой последовательности токенов. Тип "Token" не должен быть чем-то необычным, он может быть простым:

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
};
1 голос
/ 27 марта 2011

Во-первых, это помогает перевести такие 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 +.Пожалуйста, скажите мне, если что-то не так.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...