Технологии программирования | страница 135
>p:= 0;
>i:= 0; {Номер цифры первого сомножителя}
>while(((i < C1.N) or (p <> 0)) and (not(ERROR))) do
>begin
>Inc(i);
>{Расчет очередной цифры результата и цифры переноса}
>end;
Выход: R.D, R.N, ERROR
Шаг 5.9. Детализация СЛЕДОВАНИЯ "Расчет очередной цифры результата и цифры переноса"
СЛЕДОВАНИЕ детализируется альтернативой:
Вход: i, j, C1.D[i], C2.D[j], p, R.D, Digits.
>{Расчет очередной цифры результата и цифры переноса}
>{Контролируемый расчет ir — номера очередной цифры результата}
>ir:= i + j — 1;
>if (ir > Digits) then
>ERROR:= True else
>begin
>{Изменение длины результата R.N}
>if (R.N < ir)
>then
>begin
>R.N:= ir;
>R.D[ir]:= 0; {Обнуление новой цифры результата}
>end;
>{Получение очередной цифры 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; {Рабочие переменные}
Шаг 6. РЕЗУЛЬТАТЫ СБОРКИ ПРОГРАММЫ
>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
>{До ввода корректного символа цифры}