Задача: строка содержит арифметическое выражение, состоящее из целых чисел и знаков операции: [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’ах, но не стал, так как считаю унарный плюс бессмысленным.
