Вывести календарь на экран - 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, то переход к следующему месяцу
- Ввод символа для завершения работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д