Задача определение дня+квартала+недели

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
zAra
Сообщения: 3
Зарегистрирован: 16 окт 2007, 17:06

Помогите кто знает программу на Turbo Pascale Определите дату следующего дня+квартал+день недели!Кто знает,кому не трудно,реально надо!Заранее спасибо!
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

zAra писал(а):Помогите кто знает программу на Turbo Pascale Определите дату следующего дня+квартал+день недели!Кто знает,кому не трудно,реально надо!Заранее спасибо!
В библиотеках Turbo/Object Professional есть модуль TpDate (OpDate). Там для несложно делается.
zAra
Сообщения: 3
Зарегистрирован: 16 окт 2007, 17:06

Ну а по подробнее можно,пожалуйста!К завтра надо!
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

а что - "подробнее"???? ну вот, выложил Tpdate.rar

Если я правильно понял вам нужно три отдельные подзадачи решить.
1) прибавить день к текущей дате
в модуле TPDate это делается через работу с Юлианской датой (это число дней с
Юлианские дни (юлианские даты) - система непрерывной нумерации дней. Юлианский день равен числу суток прошедших с гринвичского полудня (12:00 GMT) 1 января 4713 г. до нашей эры до заданного момента.)
там прибавить день (или любое число дней - это просто inc(Число, КоличествоДней)
подробоности - смотри в tpdate.pas

но, мне кажется, в вашем случае будет проще использовать
банально day := day + 1;
if day > DaysInMonth then begin
day := 1
Month := Month + 1;
if Month > 12 then begin
Month := 1;
Year := Year + 1;
end
end;

а вот функцию DaysInMonth можно взять из TPDate

Код: Выделить всё

  function IsLeapYear(Year : Integer) : Boolean;
    {-Return True if Year is a leap year}
  begin
    IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
      ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;

  function DaysInMonth(Month, Year : Integer) : Integer;
    {-Return the number of days in the specified month of a given year}
  begin
    if Word(Year) < 100 then
      Inc(Year, 1900);
    case Month of
      1, 3, 5, 7, 8, 10, 12 :
        DaysInMonth := 31;
      4, 6, 9, 11 :
        DaysInMonth := 30;
      2 :
        DaysInMonth := 28+Ord(IsLeapYear(Year));
    else
      DaysInMonth := 0;
    end;
  end;
2) по дате определить квартал:

получаете месяц,
потом Квартал = Int((Month - 1) / 3) + 1



3) задача по дате определить день недели:
например, так:

Код: Выделить всё

function DayOfWeek(Day, Month, Year: Integer) : Integer;
var
  century, yr, dw: Integer;
begin
  if Month < 3 then
  begin
    Inc(Month, 10);
    Dec(Year);
  end
  else
     Dec(Month, 2);
  century := Year div 100;
  yr := year mod 100;
  dw := (((26 * month - 2) div 10) + day + yr + (yr div 4) +
    (century div 4) - (2 * century)) mod 7;
  if dw < 0 then DayOfWeek := dw + 7
  else DayOfWeek := dw;
  if (dw = 0) or ((dw+7)=0) then DayOfWeek:=7
end;
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

вдогонку..
текущую дату можно получить так:

GetDate (procedure) (WinDos unit)
Returns the current date set in the operating system.
например,
GetDate(Year,Month,Day,DayOf);

таким образом завтрашний день недели можно определить БЕЗ ВСЯКИХ заморочек чисто по DayOf (если сегодня среда, завтра будет четверг вне зависимости от месяца, года и високосности!!!) ;-))))

удачи.
Ответить