СЛЕДОВАНИЕ "Ввод цифр первого сомножителя в порядке от C1.D[C1.N] до C1.D[1] декомпозируется циклом:
{Ввод цифр первого сомножителя в порядке от 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;
Описания новых переменных:
var {Рабочие переменные}
InCode: word;
ch: Char;
Несмотря на то что здесь в нарушение правил детализировано сразу два цикла, в тестировании нет необходимости.
Аналогично декомпозируется процесс "Ввод цифр второго сомножителя в порядке от C2.D[C2.N] до C2.D[1].
СЛЕДОВАНИЕ "Вывод результата произведения" декомпозируется АЛЬТЕРНАТИВОЙ — РАЗВИЛКА С ДВУМЯ ДЕЙСТВИЯМИ:
{Вывод результата произведения}
if ERROR
then
WriteLn(Ошибка переполнения)
else
begin
{Вывод продукта умножения}
end;
Тесты: ERROR = True; ERROR = False.
СЛЕДОВАНИЕ "Вывод продукта умножения" декомпозируется циклом:
{Вывод продукта умножения}
for i:= R.N downto 1 do
Write(R.D[i]);
В тестировании нет необходимости.
СЛЕДОВАНИЕ "Устранение лидирующих нулей" декомпозируется циклом:
{Устранение лидирующих нулей}
while ((R.N > 1) and (R.D[i] = 0)) do
Dec(R.N); {R.N:= R.N — 1}
В тестировании нет необходимости.
СЛЕДОВАНИЕ "Расчет произведения сомножителей" декомпозируется циклом:
Вход: C1, C2.
{Расчет произведения сомножителей}
{Цикл задает номер j очередной цифры второго сомножителя}
ERROR:= False;
j:= 1;
R.D[1]:= 0;
while ((j <= C2.N) and
(not(ERROR))) do
begin
{Увеличение результата на сдвинутый продукт умножения первого сомножителя на j-ю цифру второго сомножителя}
Inc(j); {j:= j + 1}
end;
Выход: R.D, R.N, ERROR
Структура тестировалась на тестах: 390*56; 390*56, но при Digits = 5; 0*0 при C1.N = 0; 1*0 при C1.N = 1 и других тестах.
СЛЕДОВАНИЕ детализируется циклом:
Вход: C1, C2.
{Увеличение результата на сдвинутый продукт умножения первого сомножителя на j-ю цифру второго сомножителя}
p:= 0;
i:= 0; {Номер цифры первого сомножителя}
while(((i < C1.N) or (p <> 0)) and (not(ERROR))) do
begin
Inc(i);
{Расчет очередной цифры результата и цифры переноса}
end;
Выход: R.D, R.N, ERROR
СЛЕДОВАНИЕ детализируется альтернативой:
Вход: 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;
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии