Является ли строка правильной записью оператора присваивания в целочисленную переменную - Pascal

Узнай цену своей работы

Формулировка задачи:

Ввести строку, длина которой не превосходит 255 символов. Проверить, является ли она правильной записью оператора присваивания в целочисленную переменную с точки зрения синтаксиса Паскаля. В левой части оператора присваивания должно стоять имя переменной (последовательность заглавных и строчных латинских букв, цифр или символов подчёркивания, которая не начинается с цифры). При этом считаем, что в языке есть два служебных зарезервированных слова: BEGIN и END (заглавными буквами). Соответственно, имя переменной не может совпадать с этими словами. В правой части оператора может стоять либо имя переменной, либо целое число (присваивание выражений не рассматриваем). Число не должно превосходить по модулю 2000000000 (иначе считается, что оно не помещается в целый тип), но может быть, как положительным, так и отрицательным. Точка с запятой в состав оператора не входит. Между именем переменной и знаком присваивания, а также между знаком присваивания и правой частью могут быть незначащие пробелы.

Решение задачи: «Является ли строка правильной записью оператора присваивания в целочисленную переменную»

textual
Листинг программы
var 
  s, v, n: string;
  p, i, tmp, err: integer;
begin
  read(s);
  p := pos(':=', s);
  if p = 0 then begin writeln('Ошибка! Оператор присваивания не найден'); exit end
  else if p = 1 then begin writeln('Ошибка! Пропущено имя переменной'); exit end
  else if p = length(s) - 1 then begin writeln('Ошибка! Пропущено присваиваемое значение'); exit end;
  v := copy(s, 1, p - 1); { Переменная }
  n := copy(s, p + 2, length(s)); { Число }
  while (length(v) > 0) and (v[length(v)] = ' ') do delete(v, length(v), 1); { Убираем пробелы в конце после переменной }
  if v = '' then begin writeln('Ошибка! Пропущено имя переменной'); exit end;
  while (length(n) > 0) and (n[1] = ' ') do delete(n, 1, 1); { Убираем пробелы перед числом/переменной }
  if n = '' then begin writeln('Ошибка! Пропущено присваиваемое значение'); exit end;
  if (v = 'BEGIN') or (v = 'END') then begin writeln('Ошибка! Переменная не пожет имять имя служебных слов'); exit end;
  if v[1] in ['0'..'9'] then begin writeln('Ошибка! Имя переменной не может начинаться с цифры'); exit end;
  for i := 1 to length(v) do 
    if not(v[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '_']) then begin writeln('Ошибка! Недопустимый символ "', v[i], '"'); exit end;
  for i := 1 to length(n) do 
    if not(n[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '_']) and not((i = 1) and (n[i] = '-')) then begin writeln('Ошибка! Недопустимый символ "', n[i], '"'); exit end;
  val(n, tmp, err);
  if (n[1] in ['0'..'9', '-']) and (err <> 0) then
  begin
    for i := 2 to length(n) do
      if not(n[i] in ['0'..'9']) then begin writeln('Ошибка! Недопустимый символ "', n[i], '"'); exit end;
    writeln('Ошибка! Число превосходит допустимые значения'); exit
  end;
  writeln('Запись правильная');
end.

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

  1. var s, v, n: string;
  2. p, i, tmp, err: integer;
  3. begin
  4. read(s);
  5. p := pos(':=', s);
  6. if p = 0 then begin writeln('Ошибка! Оператор присваивания не найден'); exit end;
  7. else if p = 1 then begin writeln('Ошибка! Пропущено имя переменной'); exit end;
  8. else if p = length(s) — 1 then begin writeln('Ошибка! Пропущено присваиваемое значение'); exit end;
  9. v := copy(s, 1, p — 1); { Переменная }
  10. n := copy(s, p + 2, length(s)); { Число }
  11. while (length(v) > 0) and (v[length(v)] = ' ') do delete(v, length(v), 1); { Убираем пробелы в конце после переменной }
  12. if v = '' then begin writeln('Ошибка! Пропущено имя переменной'); exit end;
  13. while (length(n) > 0) and (n[1] = ' ') do delete(n, 1, 1); { Убираем пробелы перед числом/переменной }
  14. if n = '' then begin writeln('Ошибка! Пропущено присваиваемое значение'); exit end;
  15. if (v = 'BEGIN') or (v = 'END') then begin writeln('Ошибка! Переменная не может имять имя служебных слов'); exit end;
  16. if v[1] in ['0'..'9'] then begin writeln('Ошибка! Имя переменной не может начинаться с цифры'); exit end;
  17. for i := 1 to length(v) do
  18. if not(v[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '_']) then begin writeln('Ошибка! Недопустимый символ ', v[i], ''); exit end;
  19. for i := 1 to length(n) do
  20. if not(n[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '_']) and not((i = 1) and (n[i] = '-')) then begin writeln('Ошибка! Недопустимый символ ', n[i], ''); exit end;
  21. val(n, tmp, err);
  22. if (n[1] in ['0'..'9', '-']) and (err <> 0) then
  23. begin
  24. for i := 2 to length(n) do
  25. if not(n[i] in ['0'..'9']) then begin writeln('Ошибка! Недопустимый символ ', n[i], ''); exit end;
  26. writeln('Ошибка! Число превосходит допустимые значения'); exit end;
  27. writeln('Запись правильная');
  28. end.

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


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

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

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