Определить, является ли строка правильным математическим выражением - Pascal
Формулировка задачи:
Нашёл олимпиадные задачи... Выели уже мне мозги! Но бросить не могу. Помогите.
Проверить, есть ли введенная строка, содержащяя целые числа и, возможно, знаки математических операций (+ - * /), правильным математическим выражением.
Входные данные:
В первой строке стандартного входного потока вводится натуральное число 0 <N <100 - количество тестов. В следующих N строках вводятся строки для проверки, содержащие до 255 символов - цифр и / или знаков математических действий - каждый.Исходные данные:
В N строк стандартного выходного потока вывести "Yes", если соответствующий введен строка является правильным математическим выражением, и "No" в противном случае.Примеры
Входные Исходные
4 12+7 yes -4*38+3 yes 9876- no 5/5/5/5/5 yes Для одной строки код я написал, но как сделать чтобы резельтат выдавало для всех?uses crt; var s: string; znaki: set of char; n, j, i: integer; begin clrscr; znaki:=['+','-','*','/','^','=']; readln(n); for j:=1 to n do readln(s); for j:=1 to n do if (s[1] in znaki) and (s[1] <> '-') or (s[length(s)] in znaki) then begin writeln('No'); end; for i:=1 to length(s)-1 do if (s[i] in znaki) and (s[i+1] in znaki) and (s[i]+s[i+1] <> '=-') then begin writeln('No'); end; writeln('Yes'); readkey; end.
Решение задачи: «Определить, является ли строка правильным математическим выражением»
textual
Листинг программы
const ZNAKI: Set Of Char = ['+', '-', '*', '/', '^', '=']; OTVET: Array[Boolean] Of String[3] = ('no', 'yes'); function Check(const s: String): Boolean; var Result: Boolean; i: Byte; begin Result := ((Not(s[1] in ZNAKI) Or (s[1] = '-')) And Not(s[Length(s)] in ZNAKI)); i := 1; while (Result And (i < Length(s))) do begin Result := Not((s[i] in ZNAKI) And (s[i + 1] in ZNAKI) And (Copy(s, i, 2) <> '=-')); Inc(i); end; Check := Result; end; var s: String; i, n: LongWord; begin repeat Write('Input n(>0): '); ReadLn(n); until (n > 0); for i := 1 to n do begin Write('Input string: '); ReadLn(s); WriteLn(s, ' ', OTVET[Check(s)]); end; end.
Объяснение кода листинга программы
- Объявляется константа
ZNAKI
- множество символов, содержащее операторы математических выражений. - Объявляется массив
OTVET
, содержащий строкиno
иyes
, соответствующие логическим значениямFalse
иTrue
. - Объявляется функция
Check
с параметромs
типа String, возвращающая логическое значение. - Объявляются переменные
Result
- логическая переменная иi
- байтовая переменная. - В теле функции
Check
вычисляется значение переменнойResult
- результат проверки первого и последнего символа строкиs
на наличие в множествеZNAKI
. - Инициализируется переменная
i
значением 1. - В цикле
while
вычисляется значение переменнойResult
путем проверки соответствия текущего символа и следующего символа из строкиs
элементам множестваZNAKI
и проверки наличия подстроки '=-'. - Значение переменной
Result
присваивается для функцииCheck
. - Объявляются переменные
s
- строковая переменная иi
иn
- переменные типа LongWord. - Выполняется цикл
repeat-until
для ввода значения переменнойn
и вводится значение, пока оно не будет больше 0. - В цикле
for
выполняется цикл ввода строкиs
и вывод результата работы функцииCheck
для данной строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д