Вывести календарь на экран - 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.

Объяснение кода листинга программы

  1. Объявление переменных:
    • a, y, m, d, i, j, k, t (integer)
    • vg (boolean)
    • dx, dy, ny (integer)
  2. Отображение окна с размерами 80x43 символов
  3. Запрос на ввод номера месяца и года (01 2017)
  4. Присваивание переменной j значения номера месяца
  5. Установка значения dx равным 1 и dy равным 2
  6. Повторение от 1 до m:
    • Вычисление значения vg (определяет високосный год)
    • Вычисление значения a (количество полных лет с начала эпохи)
    • Вычисление значения k (год относительно начала эпохи)
    • Вычисление значения t (год относительно начала эпохи + номер месяца)
    • Вычисление значения d (номер дня недели)
    • Отображение окна с заданными координатами и размерами
    • Отображение названия месяца и года
    • Отображение числа дней в месяце (31, 30, 29, 28)
    • Увеличение значения j на 1
    • Если значение j равно 13, то переход к следующему году
    • Если значение dx больше 65, то переход к следующему месяцу
  7. Ввод символа для завершения работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы