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