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