Определить, является ли строка правильным математическим выражением - 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для данной строки.