Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2012, 16:19   #1
Ind
Новичок
Джуниор
 
Регистрация: 22.12.2012
Сообщений: 1
Восклицание задача на типы по Паскалю: Вывести число первого понедельника для каждого месяца для заданного года

Водится номер года. Вывести число первого понедельника для каждого месяца
Ind вне форума Ответить с цитированием
Старый 22.12.2012, 20:07   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, задача исходно кривая. В подобных задачах в исходных данных обычно задают либо какой день недели будет 1 января заданного года, либо первый понедельник года какого числа января будет.. Иначе, задачу можно решить исключительно через использование функцкий для работы с календарём (работа с датами, например, получение по указанной дате день недели). А в случае использования подобных функций задача вырождается в банальную!

во-вторых, подобные задачи (с учётом замечания из пункта "во-первых") на форуме решались неоднократно. Поиском пройдитесь по форуму...

в-третьих, а Вы сами что-то делать собираетесь? Или будете ждать готового решения на блюдечке с голубой каёмочкой?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.12.2012, 23:37   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
А в случае использования подобных функций задача вырождается в банальную!
Знаю что в Дельфушке есть такие процедурки\функции, а про Free не слышал.. Просветите?
Poma][a вне форума Ответить с цитированием
Старый 23.12.2012, 00:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Poma][a,

Давным давно, когда в ходу был компилятор (среда) TurboPascal, сторонней фирмой TurboPower Software была выпущена библиотека под него, сначала TurboProfessional, а позже, после появления объектов в версии Паскаля 5.5 и ObjectProfessional (она, конечно, была коммерческой, впрочем, как и сама среда программирования TurboPascal... )

Цитата:
Код:
{*********************************************************}
{*                    OPDATE.PAS 1.21                    *}
{*     Copyright (c) TurboPower Software 1988, 1992.     *}
{*                 All rights reserved.                  *}
{*********************************************************}
в этой библиотеке было множество полезнейших функций и процедур собранных в модулях.
Один из таких модулей был TPDATE.PAS (позже OPDATE.PAS)
в нём были собрано всё, что необходимо для работы с календарными датами.
я уже на форуме неоднократно приводил вырезки из этого модуля.

вот, например, такая выжимка:
Код:
type
    DayType = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
    Date = LongInt;

const

    MinYear = 1600;
    MaxYear = 3999;
    MinDate = $00000000;     {= 01/01/1600}
    MaxDate = $000D6025;     {= 12/31/3999}
    Date1900 = $0001AC05;    {= 01/01/1900}
    Date1980 = $00021E28;    {= 01/01/1980}
    Date2000 = $00023AB1;    {= 01/01/2000}
    BadDate = $FFFFFFFF;

    Threshold2000 : Integer = 1900;

    
    First2Months = 59;         {1600 was a leap year}
    FirstDayOfWeek = Saturday; {01/01/1600 was a Saturday}

  DayWeekRus : array[0..6] of string[12]=(
  'Воскресение',
  'Понедельник',
  'Вторник',
  'Среда',
  'Четверг',
  'Пятница',
  'Суббота');

  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 begin
      Inc(Year, 1900);
      if Year < Threshold2000 then
        Inc(Year, 100);
    end;

    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;
    
    
  function ValidDate(Day, Month, Year : Integer) : Boolean;
  {-Verify that day, month, year is a valid date}
  begin
    if Word(Year) < 100 then begin
      Inc(Year, 1900);
      if Year < Threshold2000 then
        Inc(Year, 100);
    end;

    if (Day < 1) or (Year < MinYear) or (Year > MaxYear) then
      ValidDate := False
    else case Month of
      1..12 :
        ValidDate := Day <= DaysInMonth(Month, Year);
    else
      ValidDate := False;
    end
  end;
  

  function DMYtoDate(Day, Month, Year : Integer) : Date;
    {-Convert from day, month, year to a julian date}
  begin
    if Word(Year) < 100 then begin
      Inc(Year, 1900);
      if Year < Threshold2000 then
        Inc(Year, 100);
    end;

    if not ValidDate(Day, Month, Year) then
      DMYtoDate := BadDate
    else if (Year = MinYear) and (Month < 3) then
      if Month = 1 then
        DMYtoDate := Pred(Day)
      else
        DMYtoDate := Day+30
    else begin
      if Month > 2 then
        Dec(Month, 3)
      else begin
        Inc(Month, 9);
        Dec(Year);
      end;
      Dec(Year, MinYear);
      DMYtoDate :=
          ((LongInt(Year div 100)*146097) div 4)+
          ((LongInt(Year mod 100)*1461) div 4)+
          (((153*Month)+2) div 5)+Day+First2Months;
    end;
  end;

  function DayOfWeek(Julian : Date) : DayType;
    {-Return the day of the week for the date. Returns DayType(7) if Julian =
      BadDate.}
  var
    B : Byte;
  begin
    if Julian = BadDate then begin
      B := 7;
      DayOfWeek := DayType(B);
    end
    else
      DayOfWeek := DayType( (Julian+Ord(FirstDayOfWeek)) mod 7 );
  end;

{КОД НИЖЕ - ПРОСТО ТЕСТОВАЯ ПРОГРАММА, которая печатает одну
  неделю февраля по дням недели}
var
  i,D,M,Y : longint;
  MyDate : Date;
begin
  D:=17;
  M:=2;
  Y:=2012;

  WriteLn('----  FEBRUARY ----');
  for i:=D to D+6 do
  begin
    MyDate := DMYtoDate(i,M,Y);
    Writeln(i:1,'.',M:1,'.',Y:4,' (Day#',MyDate:1,') ', DayWeekRus[ord(DayOfWeek(MyDate))]);
  end;
  Readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напечатать различные слова предложения, указав для каждого из них число его вхождений. Милашка2012 Паскаль, Turbo Pascal, PascalABC.NET 0 17.10.2012 07:46
Для вводимой даты года вывести название соответствующего знака Зодиака (Qbasic) Anamnes Помощь студентам 0 09.11.2011 18:52
Задача построить R деревьев и вывести для каждого из них определенные значения в файл user1990 Общие вопросы C/C++ 2 15.10.2010 20:47
Создать итоги для каждого дня, месяца, года kammal Microsoft Office Excel 1 03.10.2010 21:30