Что видим? Информация дат месяца представлена на макете семью строками и шестью колонками дат месяцев. Что нужно для печати дат конкретного месяца? Количество пустых клеток дат в начале месяца и количество дней в месяце. Количество дней во всех месяцах года фиксировано, за исключением февраля. Количество дней в феврале зависит от того, является ли год високосным или нет. Итак, количество дней во всех месяцах года располагаем в статическом массиве.
Количество пустых клеток дат в начале следующего месяца определяется информацией предшествующего месяца. Эту информацию также располагаем в статическом массиве. Для заполнения статического массива количества пустых клеток дат в начале месяцев года необходимо
знать информацию о количестве пустых клеток дат в начале января года печати календаря.
Количество пустых клеток дат в начале января года печати календаря можно определить исходя из количества пустых клеток дат в начале января 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; {Год распечатываемого календаря}
Kvartal: Word; {Квартал года}
{Количество дней в каждом месяце}
MonthsDays: Array [1…12] of Word;
{Количество
пустых клеток в начале января года Year}
Balnks: Word;
{Количество пустых клеток в начале каждого месяца }
BlanksDaus: Array [1…12] of Word;
idW: Word; {Номер дня недели }
iMonth: Word; {Номер месяца в году }
iKvartalMonth: Word; {Номер месяца в квартале }
iCol: Word; {Номер колонки в месяце квартала }
iCell: Word; {Номер клетки в месяце квартала}
i: Integer;
Function Vys (Year: Word): Boolean;
{Функция возвращает True в случае високосности
года Year}
begin
Vys: = False;
if (((Year mod 4 = 0) and (Year mod 100<>0))
or (Year mod 1000 = 0))
then
Vys: = True;
end; {Vys}
begin { Основная программа }
ClrScr; {Очистка экрана }
Write ('Программа печати календаря');
WriteLn ('заданного года');
Write ('Укажите год распечатываемого');
WriteLn ('календаря после', YEARBASE: 5, 'года');
ReadLn (Year);
{Контроль введенного года }
if Year < YEARBASE then
begin
{Аварийное завершение программы }
Write ('He могу составить календарь');
WriteLn (Year: 5, 'года');
Write ('Для завершения программы');
WriteLn ('нажмите любую клавишу…');
repeat until KeyPressed;
Halt (1);
end;
WriteLn ('Ждите, идет печать…');
Assign (F, 'PRN');
Rewrite (F);
{Печать календаря на принтере }
{Часть пробелов в следующей строке была изъята!}
WriteLn (F, ' ', Year);
{Подготовка информации}
{Определение количества пустых клеток в январе года Year}