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


program MultiplyLongints;

var
  num1, num2: longint;
  isCorrect: boolean;

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

  { Пропускаем пробелы, табуляции и переводы строк перед числом }
  while (c <= ' ') and not eof do
    read(c);

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

  { Проверяем, что после минуса (или в начале) идет цифра }
  if (c < '0') or (c > '9') then
  begin
    isValid := false;
  end
  else
  begin
    { Цикл посимвольного чтения цифр }
    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); { Читаем следующий символ }
    end;
    
    { Проверяем, что число закончилось пробелом, Enter или концом файла, а не буквой }
    if (c > ' ') and (c <> #13) and (c <> #10) then
      isValid := false;
  end;

  { Обработка ошибки }
  if not isValid then
  begin
    writeln('Ошибка ввода! Пожалуйста, введите число заново.');
    ReadLongint := false;
    
    { Очистка буфера ввода от ошибочных символов до конца текущей строки }
    while (c <> #10) and (c <> #13) and not eof do 
      read(c);
    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.