Вывести календарь на экран - Free Pascal
Формулировка задачи:
Снова к вам!
Задача: Вывод двенадцати месяцев на одном экране, начиная с заданного месяца.
Получилось вот что:
Выходит черте что! Помогите разобраться??
Program TestC;
Uses Crt;
var
I,J,Q,R,C: integer;
Mo,Yr: integer;
M: array [1..4,1..3,1..7,1..6] of integer; {2.ЋЎкпў«Ґ*ЁҐ ¬*ббЁў* 7е6}
p: integer;
const
WDay: array[1..7] of string=('Mon ', 'Tue ', 'Wed ', 'Thu ', 'Fr ', 'Sat ', 'Sun '); {8.„®Ў*ўЁвм **§ў**Ёп ¤*Ґ© *Ґ¤Ґ«Ё}
MaxD: array[1..12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31); {10.„®Ў*ўЁвм ¬*Єб зЁб«® ¤*Ґ© ў ¬ҐбпжҐ}
MoName: array[1..12] of string=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
function DayWeek (Day, Month, Year: integer): byte;
var
DaysInYears, AllDays, DaysInMonths, Weeks: longint;
begin
if Month < 3 then begin
Month := Month+12;
Year := Year-1;
end;
Month := Month+1;
DaysInMonths := trunc(Month*30.6);
DaysInYears := trunc(Year*365.25);
AllDays := DaysInMonths+DaysInYears+Day-114;
Weeks := AllDays div 7;
DayWeek := AllDays - Weeks*7;
if DayWeek=0 then DayWeek:=7;
end;
begin
Clrscr;
Writeln('Enter month, year: '); {9.‚ў®¤ *®¬Ґа®ў ¬Ґбпж* Ё Ј®¤*}
Read(Mo,Yr);
Clrscr;
for I:=1 to 4 do {3.‡*Ї®«*Ё«Ё ¬*ббЁў *г«п¬Ё}
for J:=1 to 3 do begin
for R:=1 to 7 do
for C:=1 to 6 do
M[I,J,R,C]:=0; {4.‚лў®¤ ¬*ббЁў* *г«Ґ©}
//for I:=1 to 7 do begin
//DayWeek(I,2,2017), ' '); {1. ‚л§®ў дг*ЄжЁЁ DayW}
//for J:=1 to 6 do begin
//M[I,J]:=D; Write(M[I,J]); end;
//Writeln;
//end;
P:=DayWeek(1,Mo,Yr); {5.®ЇаҐ¤Ґ«Ё«Ё *®¬Ґа ап¤* 1-Ј® зЁб«* ¬Ґбпж*}
R:=P;
C:=1;
if (Yr mod 4=0) and (Yr mod 100<>0) then MaxD[2]:=29; {11. „®Ў*ўЁ«Ё гзҐв ўЁб®Є®б*®Ј® Ј®¤*}
for Q:=1 to MaxD[Mo] do begin {6.а*бЇ®«®¦Ґ*ЁҐ *®¬Ґа®ў ¤*Ґ© ¬Ґбпж* ў ¬*ббЁўҐ}
if (R > 7) then begin
Inc(C);
R:=1;
end;
M[I,J,R,C]:=Q;
Inc(R);
end;
end;
for I:=1 to 4 do begin
for R:=1 to 7 do begin
for J:=1 to 3 do begin
if R=1 then begin
TextColor(LightGreen);
Writeln(' ', MoName[Mo]); {12.‚лў®¤ **§ў**Ёп ¬Ґбпж*}
TextColor(White);
if Mo=12 then begin
Mo:=0;
Inc(Yr);
end;
Inc(Mo);
end
else begin
Write(WDay[R]);
for C:=1 to 6 do
if M[I,J,R,C]<>0 then begin
if R=7 then TextColor(LightRed); {17.1 ‚뤥«Ё«Ё ў®бЄаҐбҐ*мп Єа 梥⮬}
Write(' ', M[I,J,R,C]); {7.ўлўҐбвЁ ¬*ббЁў ¤*Ґ© ¬Ґбпж*}
end
else Write (' ',' ');
end;
Writeln;
end;
TextColor(White);
Writeln;
end;
Writeln;
end;
Readln;
end.Решение задачи: «Вывести календарь на экран»
textual
Листинг программы
uses Crt;
var
a,y,m,d,i,j,k,t:integer;
vg:boolean;
dx,dy,ny:integer;
begin
window(1,1,80,43);
clrscr;
write('Enter Month Year(01 2017):');readln(m,y);
j:=m;
dx:=1;
dy:=2;
repeat
vg:=(y mod 4=0) and ((y mod 100<>0) or (y mod 400=0));
a:=(14-j) div 12;
k:=y-a;
t:=j+12*a-2;
d:=(7000+(1+k+k div 4-k div 100+k div 400+(31 * t) div 12)) mod 7;
window(dx,dy,dx+20,dy+8);textbackground(LightBlue+j mod 2+2*ny);clrscr;
textcolor(Yellow);
if j<10 then write('0');write(j);textcolor(LightRed);writeln(' ',y);
textcolor(lightgray);
writeln(' Su Mo Tu We Th Fr Sa');
if d>0 then gotoxy(d*3,3);
if j in [1,3,5,7,8,10,12] then t:=31;
if j in [4,6,9,11] then t:=30;
if j=2 then if vg then t:=29 else t:=28;
for i:=1 to t do write(i:3);
j:=j+1;
dx:=dx+23;
if j=13 then begin j:=1;y:=y+1;ny:=1;dy:=dy+8;end;
if dx>65 then begin dx:=1;dy:=dy+8;end;
until j=m;
readln;
end.
Объяснение кода листинга программы
- Объявление переменных:
- a, y, m, d, i, j, k, t (integer)
- vg (boolean)
- dx, dy, ny (integer)
- Отображение окна с размерами 80x43 символов
- Запрос на ввод номера месяца и года (01 2017)
- Присваивание переменной j значения номера месяца
- Установка значения dx равным 1 и dy равным 2
- Повторение от 1 до m:
- Вычисление значения vg (определяет високосный год)
- Вычисление значения a (количество полных лет с начала эпохи)
- Вычисление значения k (год относительно начала эпохи)
- Вычисление значения t (год относительно начала эпохи + номер месяца)
- Вычисление значения d (номер дня недели)
- Отображение окна с заданными координатами и размерами
- Отображение названия месяца и года
- Отображение числа дней в месяце (31, 30, 29, 28)
- Увеличение значения j на 1
- Если значение j равно 13, то переход к следующему году
- Если значение dx больше 65, то переход к следующему месяцу
- Ввод символа для завершения работы программы