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 г. Матричный принтер может печатать информацию последовательно одна строка за другой.
Ниже представлен разработанный макет печати выходной информации. Из анализа макета стало очевидно, что входной информацией программы является только год выводимого на печать календаря. Разрабатываем макет экрана диалога программы.
Приступаем к разработке оперативной структуры данных программы. Что надо для печати календаря конкретного года? Конечно, можно создать статическую матрицу, содержащую все символы календаря, или статический вектор всех строк макета календаря. Попробуем обойтись без огромных массивов, формируя последовательно очередную строку информации.
Что видим? Информация дат месяца представлена на макете семью строками и шестью колонками дат месяцев. Что нужно для печати дат конкретного месяца? Количество пустых клеток дат в начале месяца и количество дней в месяце. Количество дней во всех месяцах года фиксировано, за исключением февраля. Количество дней в феврале зависит от того, является ли год високосным или нет. Итак, количество дней во всех месяцах года располагаем в статическом массиве.
Количество пустых клеток дат в начале следующего месяца определяется информацией предшествующего месяца. Эту информацию также располагаем в статическом массиве. Для заполнения статического массива количества пустых клеток дат в начале месяцев года необходимо знать информацию о количестве пустых клеток дат в начале января года печати календаря.
Количество пустых клеток дат в начале января года печати календаря можно определить исходя из количества пустых клеток дат в начале января 1917 г. с учетом выявленного из макета следующего факта, который состоит в том, что количество пустых клеток дат в начале января следующего года больше на 1 в невисокосный год и на 2 в високосный год.
Программа печати календаря заданного года
Укажите год распечатываемого календаря после 1917 года
(Не могу составить календарь года
Для завершения программы нажмите любую клавишу…)
Ждите, идет печать…
Для завершения программы нажмите любую клавишу…
Нам требуется четыре строки наименований месяцев квартала и семь строк наименований дней недели. Эта информация остается неизменной в процессе выполнения программы, поэтому размещаем ее в константных массивах Turbo Pascal.
Итак, нам требуется многократно применяемое действие: определение, является ли исследуемый год високосным или нет. Оформляем это действие как функцию с возвращаемым результатом логического типа. Алгоритм данной функции возьмем из школьного учебника по астрономии.
Текст программы печати календаря на матричном принтере приведен ниже. Сверяясь с этим текстом, самостоятельно закодируйте программу.
Program Calendar;
{Программа печати календаря заданного года на матричном принтере.
Год должен быть начиная с YEARBASE года}
Uses
Crt, Dos;
Const
YEARBASE = 1917; {Начальный базовый год }
BLANKS1917 = 0; {Число пустых клеток в
начале января базового года}
KVARTALNAME: array [1…4] of String [53] =
({Константы укорочены при макетировании! }
'
Январь Февраль Март',
'
Апрель Май Июнь',
' Июль Август Сентябрь',
'
Октябрь Ноябрь Декабрь'
);
WEEKDAYNAME: Array [1…7] of String [2] =
('Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс');
Var
F: Text; {Файловая переменная}
Year: Word; {Год распечатываемого календаря}
Kvartaclass="underline" Word; {Квартал года}
{Количество дней в каждом месяце}
MonthsDays: Array [1…12] of Word;
{Количество пустых клеток в начале января года Year}
Balnks: Word;
{Количество пустых клеток в начале каждого месяца }
BlanksDaus: Array [1…12] of Word;
idW: Word; {Номер дня недели }
iMonth: Word; {Номер месяца в году }
iKvartalMonth: Word; {Номер месяца в квартале }
iCoclass="underline" Word; {Номер колонки в месяце квартала }
iCelclass="underline" Word; {Номер клетки в месяце квартала}
i: Integer;
Function Vys (Year: Word): Boolean;
{Функция возвращает True в случае високосности
года Year}