Вывести календарь на экран - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Снова к вам! Задача: Вывод двенадцати месяцев на одном экране, начиная с заданного месяца. Получилось вот что:
Листинг программы
  1. Program TestC;
  2. Uses Crt;
  3. var
  4. I,J,Q,R,C: integer;
  5. Mo,Yr: integer;
  6. M: array [1..4,1..3,1..7,1..6] of integer; {2.ЋЎкпў«Ґ*ЁҐ ¬*ббЁў* 7е6}
  7. p: integer;
  8. const
  9. WDay: array[1..7] of string=('Mon ', 'Tue ', 'Wed ', 'Thu ', 'Fr ', 'Sat ', 'Sun '); {8.„®Ў*ўЁвм **§ў**Ёп ¤*Ґ© *Ґ¤Ґ«Ё}
  10. MaxD: array[1..12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31); {10.„®Ў*ўЁвм ¬*Єб зЁб«® ¤*Ґ© ў ¬ҐбпжҐ}
  11. MoName: array[1..12] of string=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
  12. function DayWeek (Day, Month, Year: integer): byte;
  13. var
  14. DaysInYears, AllDays, DaysInMonths, Weeks: longint;
  15. begin
  16. if Month < 3 then begin
  17. Month := Month+12;
  18. Year := Year-1;
  19. end;
  20. Month := Month+1;
  21. DaysInMonths := trunc(Month*30.6);
  22. DaysInYears := trunc(Year*365.25);
  23. AllDays := DaysInMonths+DaysInYears+Day-114;
  24. Weeks := AllDays div 7;
  25. DayWeek := AllDays - Weeks*7;
  26. if DayWeek=0 then DayWeek:=7;
  27. end;
  28. begin
  29. Clrscr;
  30. Writeln('Enter month, year: '); {9.‚ў®¤ *®¬Ґа®ў ¬Ґбпж* Ё Ј®¤*}
  31. Read(Mo,Yr);
  32. Clrscr;
  33. for I:=1 to 4 do {3.‡*Ї®«*Ё«Ё ¬*ббЁў *г«п¬Ё}
  34. for J:=1 to 3 do begin
  35. for R:=1 to 7 do
  36. for C:=1 to 6 do
  37. M[I,J,R,C]:=0; {4.‚лў®¤ ¬*ббЁў* *г«Ґ©}
  38. //for I:=1 to 7 do begin
  39. //DayWeek(I,2,2017), ' '); {1. ‚맮ў дг*ЄжЁЁ DayW}
  40. //for J:=1 to 6 do begin
  41. //M[I,J]:=D; Write(M[I,J]); end;
  42. //Writeln;
  43. //end;
  44. P:=DayWeek(1,Mo,Yr); {5.®ЇаҐ¤Ґ«Ё«Ё *®¬Ґа ап¤* 1-Ј® зЁб«* ¬Ґбпж*}
  45. R:=P;
  46. C:=1;
  47. if (Yr mod 4=0) and (Yr mod 100<>0) then MaxD[2]:=29; {11. „®Ў*ўЁ«Ё гзҐв ўЁб®Є®б*®Ј® Ј®¤*}
  48. for Q:=1 to MaxD[Mo] do begin {6.а*бЇ®«®¦Ґ*ЁҐ *®¬Ґа®ў ¤*Ґ© ¬Ґбпж* ў ¬*ббЁўҐ}
  49. if (R > 7) then begin
  50. Inc(C);
  51. R:=1;
  52. end;
  53. M[I,J,R,C]:=Q;
  54. Inc(R);
  55. end;
  56. end;
  57. for I:=1 to 4 do begin
  58. for R:=1 to 7 do begin
  59. for J:=1 to 3 do begin
  60. if R=1 then begin
  61. TextColor(LightGreen);
  62. Writeln(' ', MoName[Mo]); {12.‚лў®¤ **§ў**Ёп ¬Ґбпж*}
  63. TextColor(White);
  64. if Mo=12 then begin
  65. Mo:=0;
  66. Inc(Yr);
  67. end;
  68. Inc(Mo);
  69. end
  70. else begin
  71. Write(WDay[R]);
  72. for C:=1 to 6 do
  73. if M[I,J,R,C]<>0 then begin
  74. if R=7 then TextColor(LightRed); {17.1 ‚뤥«Ё«Ё ў®бЄаҐбҐ*мп Єа 梥⮬}
  75. Write(' ', M[I,J,R,C]); {7.ўлўҐбвЁ ¬*ббЁў ¤*Ґ© ¬Ґбпж*}
  76. end
  77. else Write (' ',' ');
  78. end;
  79. Writeln;
  80. end;
  81. TextColor(White);
  82. Writeln;
  83. end;
  84. Writeln;
  85. end;
  86. Readln;
  87. end.
Выходит черте что! Помогите разобраться??

Решение задачи: «Вывести календарь на экран»

textual
Листинг программы
  1. uses Crt;
  2. var
  3.   a,y,m,d,i,j,k,t:integer;
  4.   vg:boolean;
  5.   dx,dy,ny:integer;
  6. begin
  7.   window(1,1,80,43);
  8.   clrscr;
  9.   write('Enter Month Year(01 2017):');readln(m,y);
  10.   j:=m;
  11.   dx:=1;
  12.   dy:=2;
  13.   repeat
  14.     vg:=(y mod 4=0) and ((y mod 100<>0) or (y mod 400=0));
  15.     a:=(14-j) div 12;
  16.     k:=y-a;
  17.     t:=j+12*a-2;
  18.     d:=(7000+(1+k+k div 4-k div 100+k div 400+(31 * t) div 12)) mod 7;
  19.     window(dx,dy,dx+20,dy+8);textbackground(LightBlue+j mod 2+2*ny);clrscr;
  20.     textcolor(Yellow);
  21.     if j<10 then write('0');write(j);textcolor(LightRed);writeln(' ',y);
  22.     textcolor(lightgray);
  23.     writeln(' Su Mo Tu We Th Fr Sa');
  24.     if d>0 then gotoxy(d*3,3);
  25.     if j in [1,3,5,7,8,10,12] then t:=31;
  26.     if j in [4,6,9,11] then t:=30;
  27.     if j=2 then if vg then t:=29 else t:=28;
  28.     for i:=1 to t do write(i:3);
  29.     j:=j+1;
  30.     dx:=dx+23;
  31.     if j=13 then begin j:=1;y:=y+1;ny:=1;dy:=dy+8;end;
  32.     if dx>65 then begin dx:=1;dy:=dy+8;end;
  33.   until j=m;
  34.   readln;
  35. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы