Календарные задачи в Pascal

Количество просмотров: 454

В данном примере мы будем вычислять високосный ли год, количество дней в месяце, предыдущую и следующую даты относительно текущей.

Начнем с определения високосного года. Год считается високосным, если он делится на 4 и 400 и не делится на 100.

Определяем пользовательские типы данных: year, month, day. Далее определяем запись data. Создадим функцию Leap, возвращающую логическое значение: true - если год високосный, false - обычный год.


function Leap(yy: year): boolean; 
    begin 
        if (((yy mod 4 = 0) and (yy mod 100<>0)) or ((yy mod 4=0) and (yy mod 100=0) and (yy mod 400=0)))
        then
            Leap:=true
        else Leap:= false;
    end;


Найдем количество дней в месяце. В зависимости от номера месяца выводим количество дней, для февраля вводим дополнительную проверку: високосный год или нет.


function Dmonth(mm: month; yy: year): day;
  begin
     case mm of
        4,6,9,11:
            Dmonth:=30;
        1,3,5,7,8,10,12:
            Dmonth:=31;
        2:
            if Leap(yy)=true then
                Dmonth:=29; 
            else
                     Dmonth:=28;  
    end;
  end; 

При определении следующей даты необходимо учитывать следующие моменты:

  • если текущая дата - это последний день месяца, то день будет равен 1, месяц берем следуюший, год оставляем тем же
  • если дата равна 31 декабря, то следующая дата - это 1.01

procedure Tomorrow(yy: year; mm: month; dd: day); 
begin 
  if dd<>Dmonth(mm, yy)
    then
    begin
        dd:=dd+1;
        mm:=mm;
        yy:=yy;
    end
  else if mm=12 then
    begin 
        dd:=1;
        mm:=1;
        yy:=yy+1;
    end 
  else 
        begin       
        dd:=1;
        mm:=mm+1;
        yy:=yy;
  end;
  writeln(dd,' ',mm,' ',yy);
end; 

Определяем предыдущую дату:

  • если 1.01, то дата будет 31.12, а год уменьшаем на 1
  • если дата - первый день месяца, то вычисляем количество дней предыдущего месяца, это и будет требуемой датой

procedure Prev(yy: year; mm: month; dd: day); 
begin 
  if (dd<>1) and (mm<>1)
    then
    begin
        dd:=dd-1;
        mm:=mm;
        yy:=yy;
    end
  else if (dd=1) and (mm<>1) then
    begin 
        dd:=Dmonth(mm-1, yy);
        mm:=mm-1;
        yy:=yy;
    end 
  else 
        begin      
        dd:=Dmonth(mm, yy);
        mm:=12;
        yy:=yy-1; 
  end;
  writeln(dd,' ',mm,' ',yy);
end;

Листинг полностью:


type year=1500..2000; month=1..12; day=1..31; data=Record y: year; m: month; d: day; End; function Leap(yy: year): boolean; begin if ( ((yy mod 4 = 0) and (yy mod 100<>0)) or ((yy mod 4=0) and (yy mod 100=0) and (yy mod 400=0)) ) then Leap:=true else Leap:= false; end; function Dmonth(mm: month; yy: year): day; begin case mm of 4,6,9,11: Dmonth:=30; 1,3,5,7,8,10,12: Dmonth:=31; 2: if Leap(yy)=true then Dmonth:=29; else Dmonth:=28; end; end; procedure Tomorrow(yy: year; mm: month; dd: day); begin if dd<>Dmonth(mm, yy) then begin dd:=dd+1; mm:=mm; yy:=yy; end else if mm=12 then begin dd:=1; mm:=1; yy:=yy+1; end else begin dd:=1; mm:=mm+1; yy:=yy; end; writeln(dd,' ',mm,' ',yy); end; procedure Prev(yy: year; mm: month; dd: day); begin if (dd<>1) and (mm<>1) then begin dd:=dd-1; mm:=mm; yy:=yy; end else if (dd=1) and (mm<>1) then begin dd:=Dmonth(mm-1, yy); mm:=mm-1; yy:=yy; end else begin dd:=Dmonth(mm, yy); mm:=12; yy:=yy-1; end; writeln(dd,' ',mm,' ',yy); end; var a,b,c: year; index: integer; begin write('Год: '); readln(a); write('Месяц: '); readln(b); write('День: '); readln(c); repeat writeln('введите номер задания '); readln(index); case index of 1: writeln('високосный ',Leap(a)); 2: writeln(Dmonth(b,a)); 3: Tomorrow(a,b,c); 4: Prev(a,b,c); end until index = 0; readln; end.

© 2015-2018 Goodweb.me --- Карта сайта --- info@goodweb.me

Наверх