Технологии программирования | страница 134
Аналогично декомпозируется процесс "Ввод корректного значения числа цифр второго сомножителя".
Шаг 5.3. Детализация СЛЕДОВАНИЯ "Ввод цифр первого сомножителя в порядке от C1.D[C1.N] до C1.D[1]
СЛЕДОВАНИЕ "Ввод цифр первого сомножителя в порядке от 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].
Шаг 5.4. Детализация СЛЕДОВАНИЯ "Вывод результата произведения"
СЛЕДОВАНИЕ "Вывод результата произведения" декомпозируется АЛЬТЕРНАТИВОЙ — РАЗВИЛКА С ДВУМЯ ДЕЙСТВИЯМИ:
>{Вывод результата произведения}
>if ERROR
>then
>WriteLn(Ошибка переполнения)
>else
>begin
>{Вывод продукта умножения}
>end;
Тесты: ERROR = True; ERROR = False.
Шаг 5.5. Детализация СЛЕДОВАНИЯ "Вывод продукта умножения"
СЛЕДОВАНИЕ "Вывод продукта умножения" декомпозируется циклом:
>{Вывод продукта умножения}
>for i:= R.N downto 1 do
>Write(R.D[i]);
В тестировании нет необходимости.
Шаг 5.6. Детализация СЛЕДОВАНИЯ "Устранение лидирующих нулей"
СЛЕДОВАНИЕ "Устранение лидирующих нулей" декомпозируется циклом:
>{Устранение лидирующих нулей}
>while ((R.N > 1) and (R.D[i] = 0)) do
>Dec(R.N); {R.N:= R.N — 1}
В тестировании нет необходимости.
Шаг 5.7. Детализация СЛЕДОВАНИЯ "Расчет произведения сомножителей"
СЛЕДОВАНИЕ "Расчет произведения сомножителей" декомпозируется циклом:
Вход: 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 и других тестах.
Шаг 5.8. Детализация СЛЕДОВАНИЯ "Увеличение результата на сдвинутый продукт умножения первого сомножителя на j-ю цифру второго сомножителя
СЛЕДОВАНИЕ детализируется циклом:
Вход: C1, C2.
{Увеличение результата на сдвинутый продукт умножения первого сомножителя на j-ю цифру второго сомножителя}