Загрузка данных


program MultiplyLongints;

var
  num1, num2: longint;
  isCorrect: boolean;

{ Подпрограмма для посимвольного ввода и проверки }
function ReadLongint(var num: longint): boolean;
var
  c: char;
  isValid, isNegative: boolean;
  res: longint;
begin
  res := 0;
  isValid := true;     { Флаг корректности ввода }
  isNegative := false; { Флаг отрицательного числа }
  c := #0;             { Инициализация пустым символом }

  { Пропускаем возможные пробелы и переводы строк перед числом }
  while (c <> '-') and ((c < '0') or (c > '9')) do
    read(c);

  { Проверяем на минус }
  if c = '-' then
  begin
    isNegative := true;
    read(c);
  end;

  { Посимвольно читаем и проверяем}
  while (c >= '0') and (c <= '9') do
  begin
    { Проверка на переполнение (чтобы не выйти за пределы longint) }
    if (res > (2147483647 - (ord(c) - ord('0'))) div 10) then
      isValid := false
    else
      res := res * 10 + (ord(c) - ord('0'));
      
    read(c); { Читаем следующий символ }
    
    { Если встретили не цифру и не Enter - это ошибка }
    if (c <> #13) and (c <> #10) and ((c < '0') or (c > '9')) then
      isValid := false;
  end;

  { Если были ошибочные символы, сообщаем и возвращаем false }
  if not isValid then
  begin
    writeln('Ошибка ввода! Пожалуйста, введите число заново.');
    ReadLongint := false;
    exit; { Досрочный выход из функции }
  end;

  { Применяем знак, если число было отрицательным }
  if isNegative then
    res := -res;

  num := res; { Передаем результат в основную программу }
  ReadLongint := true; { Успех }
end;

{ Основная программа }
begin
  writeln('Введите первое целое число (longint):');
  { Ждем корректного ввода первого числа }
  repeat
    isCorrect := ReadLongint(num1);
  until isCorrect;

  writeln('Число принято. Введите второе целое число (longint):');
  { Ждем корректного ввода второго числа }
  repeat
    isCorrect := ReadLongint(num2);
  until isCorrect;

  { Выводим результат }
  writeln('Результат умножения: ', num1 * num2);
end.