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
R.N:= ir;
R.D[ir]:= 0; {Обнуление новой цифры результата}
end;
{Получение очередной цифры C1D первого
сомножителя}
if (i <= C1.N)
then
C1D:= C1.D[i]
else
C1D:= 0;
{Изменение очередной цифры результата и p}
RD:= p + R.D[ir] + C1D * C2.D[j];
R.D[ir]:= RD mod 10;
p:= RD div 10;
end;
end;
Inc(j); {j:= j + 1}
end;
{Устранение лидирующих нулей}
while ((R.N > 1) and (R.D[i] =0)) do
Dec(R.N); {R.N:= R.N — 1}
WriteLn;
{Вывод результата произведения}
if ERROR
then
WriteLn('Ошибка переполнения')
else
begin
{Вывод продукта умножения}
for i:= R.N downto 1 do
Write(R.D[i]);
end;
WriteLn;
end.
По окончании сборки программы имеет смысл еще раз отредактировать комментарии с изъятием "лишних" комментариев.
5.11. ПРИМЕР ПРИМЕНЕНИЯ ПРОЕКТНОЙ ПРОЦЕДУРЫ ДЛЯ КОДИРОВАНИЯ ПРОГРАММЫ ПЕЧАТИ КАЛЕНДАРЯ НА ПРИНТЕРЕ
Пусть требуется разработать программу печати календаря заданного года на матричном принтере. Ограничимся годами после 1917 г. Матричный принтер может печатать информацию последовательно одна строка за другой.
Ниже представлен разработанный макет печати выходной информации. Из анализа макета стало очевидно, что входной информацией программы является только год выводимого на печать календаря. Разрабатываем макет экрана диалога программы.
Приступаем к разработке оперативной структуры данных программы. Что надо для печати календаря конкретного года? Конечно, можно создать статическую матрицу, содержащую все символы календаря, или статический вектор всех строк макета календаря. Попробуем обойтись без огромных массивов, формируя последовательно очередную строку информации.