Определить, является ли строка правильным математическим выражением - 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 Для одной строки код я написал, но как сделать чтобы резельтат выдавало для всех?
Листинг программы
  1. uses crt;
  2. var s: string;
  3. znaki: set of char;
  4. n, j, i: integer;
  5. begin
  6. clrscr;
  7. znaki:=['+','-','*','/','^','='];
  8. readln(n);
  9. for j:=1 to n do
  10. readln(s);
  11. for j:=1 to n do
  12. if (s[1] in znaki) and (s[1] <> '-')
  13. or (s[length(s)] in znaki) then
  14. begin
  15. writeln('No');
  16. end;
  17. for i:=1 to length(s)-1 do
  18. if (s[i] in znaki) and (s[i+1] in znaki)
  19. and (s[i]+s[i+1] <> '=-') then
  20. begin
  21. writeln('No');
  22. end;
  23. writeln('Yes');
  24. readkey;
  25. end.

Решение задачи: «Определить, является ли строка правильным математическим выражением»

textual
Листинг программы
  1. const
  2.     ZNAKI: Set Of Char = ['+', '-', '*', '/', '^', '='];
  3.     OTVET: Array[Boolean] Of String[3] = ('no', 'yes');
  4. function Check(const s: String): Boolean;
  5. var
  6.     Result: Boolean;
  7.     i: Byte;
  8. begin
  9.     Result := ((Not(s[1] in ZNAKI) Or (s[1] = '-')) And Not(s[Length(s)] in ZNAKI));
  10.     i := 1;
  11.     while (Result And (i < Length(s))) do
  12.     begin
  13.         Result := Not((s[i] in ZNAKI) And (s[i + 1] in ZNAKI) And (Copy(s, i, 2) <> '=-'));
  14.         Inc(i);
  15.     end;
  16.     Check := Result;
  17. end;
  18. var
  19.     s: String;
  20.     i, n: LongWord;
  21. begin
  22.     repeat
  23.         Write('Input n(>0): ');
  24.         ReadLn(n);
  25.     until (n > 0);
  26.     for i := 1 to n do
  27.     begin
  28.         Write('Input string: '); ReadLn(s);
  29.         WriteLn(s, ' ', OTVET[Check(s)]);
  30.     end;
  31. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы