28.02.2012, 17:19 | #22 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
USES GRAPH, GrfStart, CRT; CONST NumDays:ARRAY[1..2,1..12] of WORD=((31,28,31,30,31,30,31,31,30,31,30,31), (31,29,31,30,31,30,31,31,30,31,30,31)); Ds:ARRAY[1..7] of STRING=('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'); Months:ARRAY[1..12] of STRING=('JANUARU', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER'); DY=12; DX=20; VAR D400,M400,D100,M100,D4,M4,SumDays1,SumDays,Mo:LongInt; i,line,day,month,CurYear,X0,Y0,Xcur,Ycur:WORD; YearType,Cl,WeekDay,WeDa:ShortInt; Function Int2Str(L : LongInt) : string; { Converts an integer to a string for use with OutText, OutTextXY } var S : string; begin Str(L, S); Int2Str := S; end; { Int2Str } PROCEDURE WD(CY,CM,CD:LongInt;VAR YT,DW:ShortInt); BEGIN D400:=(CY-1) div 400; M400:=(CY-1) mod 400; D100:=M400 div 100; M100:=M400 mod 100; D4:=M100 div 4; M4:=M100 mod 4; SumDays1:=D400*146097+D100*36524+D4*1461+M4*365; SumDays:=SumDays1; M400:=CY mod 400; M100:=M400 mod 100; M4:=M100 mod 4; IF (M400=0) OR ((M100>0) AND (M4=0)) THEN YT:=2 ELSE YT:=1; FOR Month:=1 TO CM-1 DO SumDays:=SumDays+NumDays[YearType,Month]; SumDays:=SumDays+CD; DW:=SumDays mod 7; END; BEGIN WRITE('Enter the year: '); Readln(CurYear); INITIALIZE; ClearDevice; SetTextStyle(TriplexScriptFont, HorizDir, 7); SetTextJustify(CenterText, TopText); SetColor(LightCyan); OutTextXY(320,10,Int2Str(CurYear)); SetTextStyle(DefaultFont, HorizDir, 1); SetTextJustify(LeftText,TopText); FOR Line:=1 TO 3 DO FOR Day:=1 TO 7 DO BEGIN IF (Day=6) OR (Day=7) THEN SetColor(LightRed) ELSE SetColor(Yellow); X0:=30; Y0:=100+(Line-1)*120+Day*DY; OutTextXY(X0,Y0,Ds[Day]); X0:=610; OutTextXY(X0,Y0,Ds[Day]); END; FOR Mo:=1 TO 12 DO BEGIN SetTextStyle(DefaultFont, HorizDir, 1); SetTextJustify(CenterText,BottomText); SetColor(LightGreen); IF Mo<5 THEN BEGIN X0:=80+(Mo-1)*140; Y0:=100; OutTextXY(X0+50,Y0+4,Months[Mo]); END ELSE IF Mo<9 THEN BEGIN X0:=80+(Mo-5)*140; Y0:=220; OutTextXY(X0+50,Y0+4,Months[Mo]); END ELSE BEGIN X0:=80+(Mo-9)*140; Y0:=340; OutTextXY(X0+50,Y0+4,Months[Mo]); END; SetTextStyle(DefaultFont, HorizDir, 1); SetTextJustify(RightText,TopText); WD(CurYear,Mo,1,YearType,WeekDay); IF WeekDay=0 THEN WeDa:=1 ELSE WeDa:=8-WeekDay; FOR i:=1 TO NumDays[YearType,Mo] DO BEGIN IF i<=WeDa THEN Xcur:=0 ELSE Xcur:=(((i-1-WeDa) div 7)+1)*DX; IF i<=WeDa THEN Ycur:=(7-(WeDa-i))*DY ELSE Ycur:=((i-WeDa) mod 7)*DY; IF Ycur=0 THEN Ycur:=7*DY; IF (Ycur div DY = 6) OR (Ycur div DY = 7) THEN SetColor(LightRed) ELSE SetColor(Yellow); OUTTEXTXY(Xcur+X0,Ycur+Y0,Int2Str(i)); END; END; ReadKey; CloseGraph; END. |
|
29.02.2012, 09:51 | #24 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну да. Суть программы в том, чтобы по номеру года правильно определить день недели 1 января, учесть тип года (високосный/обычный), ну и расположить оптимально.
Хотя, если переводить на Delphi, то графика, скорее всего, и не нужна, достаточно организовать выдачу текстовой информации. Просто в DOS-Паскале в текстовой моде календарь не впихивается в экран (символы слишком большие), вот и пришлось перейти на графическую моду. |
12.03.2012, 23:29 | #25 (permalink) |
Member+
Регистрация: 08.10.2010
Сообщений: 563
Записей в дневнике: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1337
|
Ну вот и подоспела делфи-версия Только вашего алгоритма я не понял немного, делал с нуля, но принцип тот же. Календарь можно сохранить в jpeg-е, напечатать(функция глючит немного пока что), задать цвет, шрифт, язык и отображение праздников.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
12.03.2012, 23:56 | #27 (permalink) |
Member+
Регистрация: 08.10.2010
Сообщений: 563
Записей в дневнике: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1337
|
Мне просто стыдно выкладывать исходник т.к. код уж очень убогий и абсолютно нечитабельный Ну ладно может кто разберется и оптимизирует...
|
15.03.2012, 20:54 | #28 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Так, потестировал. Увы - не пойдёт! Неправильно описан Григорианский календарь, алгоритм соответствует скорее Юлианскому. Объясняю.
В Юлианском календаре каждый четвертый год - високосный, т.е. в феврале 29 дней. А вот в принятом сейчас почти во всём мире Григорианском - чуть сложнее: вековые года (1900, 2100, 2200 и т.д) - невисокосные, кроме тех, что кратны 400. Таким образом, 2000, 2400 и т.п. - високосные, как и в Юлианском календаре. Именно поэтому дальнейшего расхождения календарей в 2000 году не произошло. А вот если существующая система сохранится до 2100 года, то после него Рождество переедет с 7 на 8 января, а Старый новый год - с 14 на 15. Всё это в моей программе как раз учтено, а вот в Вашей - нет. Ну и еще дефектик. У бедолаг вроде меня, предпочитающих низкое видеоразрешение (600х800) окно календаря не лезет в экран. Если выберете время поправить - будет очень даже здорово. |
16.03.2012, 12:40 | #30 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|