Определить, является ли строка правильным математическим выражением - 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
для данной строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д