{Получение очередной цифры C1D первого сомножителя}
if (i <= C1.N) then C1D:= C1.D[i] else C1D:= 0;
{Изменение очередной цифры результата и p}
RD:= р + R.D[ir] + C1D * С2.D[j];
R.D[ir]:= RD mod 10;
p:= RD div 10;
end;
Выход: R.D, R.N, ERROR, p.
Описания новых переменных:
var
ir, C1D, RD: word; {Рабочие переменные}
Program MultNumbers;
{Расчет произведения двух чисел}
uses
Crt;
const
Digits = 100; {Число цифр в числах}
type
TNumber = record
D: array[1..Digits] of Byte;
{BD[1] находится младший разряд числа}
N: word; {Число разрядов в числе от 1 до Digits}
end;
var
C1: TNumber; {Первый сомножитель}
C2: TNumber; {Второй сомножитель}
R: TNumber; {Результат умножения}
Error: boolean; {True — ошибка переполнения}
var
p: word; {Значение числа переноса при умножении C1.D на очередную цифру C2.D}
var {Рабочие переменные}
i, j, ir, C1D, RD, InCode: word;
ch: char; begin
ClrScr; {Очистка экрана}
{Ввод корректного значения числа цифр первого сомножителя}
repeat
Write('Введите число цифр первого сомножителя)
Write(' 1 до ', Digits, ' ');
ReadLn(C1.N);
until ((C1.N >= 1) and (C1.N <= Digits));
Write('Вводите цифры первого сомножителя ');
{Ввод цифр первого сомножителя в порядке от C1.D[C1.N] до C1.D[1]}
for i:= C1.N downto 1 do
begin
{До ввода корректного символа цифры}
repeat
ch:= ReadKey; {Чтение символа клавиатуры}
Val(ch, C1.D[i], InCode); {Преобразование в значение}
until(InCode = 0);
Write(ch);
end;
WriteLn;
{Ввод корректного значения числа цифр второго сомножителя}
repeat
Write('Введите число цифр второго сомножителя');
Write(' от 1 до ', Digits,' ');
ReadLn(C2.N);
until ((C2.N >= 1) and (C2.N <= Digits));
Write('Вводите цифры второго сомножителя ');
{Ввод цифр второго сомножителя в
порядке от C2.D[C2.N] до C2.D[1]}
for i:= C2.N downto 1 do
begin
{До ввода корректного символа цифры}
repeat
ch:= ReadKey; {Чтение символа клавиатуры}
Val(ch, C2.D[i], InCode); {Преобразование в
значение}
until(InCode = 0);
Write(ch);
end;
WriteLn;
{Расчет произведения сомножителей}
{Цикл задает номер j очередной цифры
второго сомножителя}
ERROR:= False;
j:= 1;
R.D[1]:= 0;
while ((j <= C2.N) and
(not(ERROR))) do
begin
{Увеличение результата на сдвинутый продукт умножения первого сомножителя на j-ю цифру второго сомножителя}
Р:= 0;
i:= 0; {Номер цифры первого сомножителя}
while(((i < C1.N) or (p <> 0)) and (not(ERROR))) do
begin
Inc(i);
{Расчет очередной цифры результата и цифры переноса}
{Контролируемый расчет ir — номера очередной цифры результата}
ir: = i + j — 1;
if (ir > Digits) then
ERROR:= True
else
begin
{Изменение длины результата R.N}
if (R.N < ir)
then
begin
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии