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

Объяснение кода листинга программы

  1. Объявляется константа ZNAKI - множество символов, содержащее операторы математических выражений.
  2. Объявляется массив OTVET, содержащий строки no и yes, соответствующие логическим значениям False и True.
  3. Объявляется функция Check с параметром s типа String, возвращающая логическое значение.
  4. Объявляются переменные Result - логическая переменная и i - байтовая переменная.
  5. В теле функции Check вычисляется значение переменной Result - результат проверки первого и последнего символа строки s на наличие в множестве ZNAKI.
  6. Инициализируется переменная i значением 1.
  7. В цикле while вычисляется значение переменной Result путем проверки соответствия текущего символа и следующего символа из строки s элементам множества ZNAKI и проверки наличия подстроки '=-'.
  8. Значение переменной Result присваивается для функции Check.
  9. Объявляются переменные s - строковая переменная и i и n - переменные типа LongWord.
  10. Выполняется цикл repeat-until для ввода значения переменной n и вводится значение, пока оно не будет больше 0.
  11. В цикле for выполняется цикл ввода строки s и вывод результата работы функции Check для данной строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы