Технологии программирования | страница 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

>{До ввода корректного символа цифры}