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.