Param62. Используя тип TDate и функции DaysInMonth и CheckDate (см. задания Param59-Param61), описать процедуру PrevDate ($$D$$) с параметром типа TDate, которая преобразует дату $$D$$ к предыдущей дате (если дата $$D$$ является неправильной, то она не изменяется). Запись $$D$$ является входным и выходным параметром. Применить процедуру PrevDate к пяти данным датам.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
program Param62; type TDate = record Day:integer; Month:integer; Year:integer; end; var D:TDate; i:integer; Function LeaP_Year(D:TDate):boolean; begin if (D.Year mod 100)=0 then if (D.Year mod 400)=0 then LeaP_Year:=True else LeaP_Year:=False else if (D.Year mod 4)=0 then LeaP_Year:=True else LeaP_Year:=False; end; Function DaysInMonth(D:TDate):integer; begin Case D.Month of 1,3,5,7,8,10,12 : DaysInMonth:=31; 4,6,9,11 : DaysInMonth:=30; 2 : if LeaP_Year(D) then DaysInMonth:=29 else DaysInMonth:=28; end; end; Function CheckDate(D:TDate):integer; begin if D.Month>12 then CheckDate:=1 else if D.Day>DaysInMonth(D) then CheckDate:=2 else CheckDate:=0; end; Procedure PrevDate(var D:TDate); begin if CheckDate(D)=0 then begin if D.Day<>1 then D.Day:=D.Day-1 else if D.Month<>1 then begin D.Month:=D.Month-1; D.Day:=DaysInMonth(D); end else begin D.Year:=D.Year-1; D.Month:=12; D.Day:=DaysInMonth(D); end; end; end; begin for i:=1 to 5 do begin Write('Date: '); Readln(D.Day,D.Month,D.Year); PrevDate(D); Writeln(D.Day,' ',D.Month,' ',D.Year); end; end. |
Другие задачи из раздела Param можно посмотреть здесь.
Комментарии: