Задача: строка содержит арифметическое выражение, состоящее из целых чисел и знаков операции: [latex]+,-,*,/[/latex] (без скобок). Проверить корректность выражения (в смысле последовательности чисел и знаков операции)
Тесты:
Выражение | Ответ | Комментарий |
-1+2-3/4*5 | Верно | Работает |
-1 | Верно | Работает |
-1/-4 | Верно | Работает |
5—4 | Верно | Работает |
1 | Верно | Работает |
54-*3//6 | Ошибка | Работает. Неправильная последовательность |
5/0+42 | Ошибка | Работает. Деление на ноль |
5/ | Ошибка | Работает. После символа должно следовать число |
Объяснение переменных:
string a — строка для ввода. bool rightness — булева переменная для фиксирования ошибочного выражения.Код: Проверить на ideone.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> #include <string> #include <cmath> using namespace std; int main() { string a; bool rightness = true; cin >> a; // проверка первого символа if (a[0] == '+'||a[0] == '*'||a[0] == '/'){ rightness = false; } else if (a[a.length()-1]=='+'||a[a.length()-1]=='-'||a[a.length()-1]=='*'||a[a.length()-1]=='/'){ rightness = false; } // если всё верно (в начале и в конце стоят не знаки), то выполняется цикл, else { // который прогоняет строку на предмет двух символов подряд. for (int i = 0; (i < a.length()); i++) { if ((a[i] == '+'||a[i] == '-'||a[i] == '*'||a[i] == '/')&&(a[i+1] == '+'||a[i+1] == '*'||a[i+1] == '/')){ rightness = false; } if((a[i] == '/')&&(a[i+1] == '0')){ // случай /0 rightness = false; } } } //если нигде ошибки не было, то выведится первоначальное "Верно". cout << (rightness ? "Верно":"Ошибка"); return 0; } |
Алгоритм выполнения описан в комментариях в коде.
Особенности:
- Удобно предположить, что изначально выражение верно. И в случае отсутствия ошибок, переменной rightness присваивать ничего не нужно будет.
Итог работы:
Код проверяет правильность выражения (последовательность чисел и знаков) с учётом унарного минуса (но не плюса)*, так-же за ошибку считается деление на ноль. Примеры применения есть в тестах.
* — легко реализовать посредством удаления a[0] == '+' из соответствующих if’ах, но не стал, так как считаю унарный плюс бессмысленным.