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.