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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 16:24   #1
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию определения дня недели по дате

Ув. программисты у меня стоит задача я не знаю как правильно ее решить.суть задачи в том что:Первого января года был понедельник. Определить по данной дате день недели и его порядковый номер в году. и надо ее решить используя смешанный тип.
Есть идея посчитать по дате сколько дней и делить на 7 пока не выпадет число меньше или равное 7 и сопоставить это число с днем недели
KoFeMaN вне форума Ответить с цитированием
Старый 06.12.2009, 17:10   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот функции, которые вам помогут:

Код:

{*                    OPDATE.PAS 1.21                    *}
{*     Copyright (c) TurboPower Software 1988, 1992.     *}

  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
    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;
а алгоритм проще некуда.
определяете порядковый номер дня в году.
разбираете дату на день, месяц и год. (например, в переменные ДеньДаты, МесяцДаты, ГодДаты)
год нужен, чтобы определить високосный год или нет.

Код:
ПорядковыйНомер := 0;
  for i:=1 to МесяцДаты-1 do
    ПорядковыйНомер := ПорядковыйНомер + DaysInMonth(i, ГодДаты);
ПорядковыйНомер := ПорядковыйНомер + ДеньДаты;
ну а дальше делите ПорядковыйНомер на 7, берите остаток - получите день недели (т.к. первое января, по условию задачи, было понедельник!!!!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.12.2009, 18:58   #3
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию

Спасибо.А подскажи пожалуйста как использовать это с комбинированными типами?знаю глупый вопрос.просто я еще новичок=(А по теории что то никак не пойму.как можно присваивать значения комбинированному типу.ну т.е. для меня он должен выглядеть как 12 массивов по 31 элементу.и в цикле им нужно сопоставить число,дня который он по счету с 1 января.как мне сделать это с комбинированным типом?
KoFeMaN вне форума Ответить с цитированием
Старый 06.12.2009, 22:49   #4
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию

Код:
program lab_8;
Type year = 1500..3000;
month = 1..12;
day = 1..31;
data = Record
y : year;
m : month;
d : day;
End;
Function Leap(td:data): Boolean;
Begin
Leap:=(td.y Mod 4 = 0) And ( td.y Mod 400 <> 0);
End;
Function Dmonth (mm: month;td:data): day; {функция определения количества дней данного месяца в данном году}
Begin
Case mm Of
1, 3, 5, 7, 8, 10, 12 : Dmonth := 31;
4, 6, 9, 11 : Dmonth := 30;
If Leap(td) Then Dmonth:= 29
Else Dmonth := 28;
End;
End;
function ch_d(td:data):integer;
var mm:month;
begin
for mm:=1 to td.m do
ch_d:=ch_d+Dmonth(mm,td);
end;
function dn_n(td:data):string;
var s:integer;
begin
s:=ch_d
while (s<=7) do
s:=s-7;
case s of
     1: dn_n:='ponedelnik'
     2: dn_n:='vtornik'
     3: dn_n:='cpeda'
     4: dn_n:='4etverg'
     5: dn_n:='pyatnica'
     6: dn_n:='cybbota'
     7: dn_n:='voskpecene'
     end;
end;
var td:data;
begin
write('vvedite date d m y');
read( td.d,td.m,td.y);
Leap(td:data);
ch_d(td:data);
dn_n(td:data);
write(dn_n);
end.
написал такой код нахождения дня недели,но он не работает.подскажите плз де ошибка=(
KoFeMaN вне форума Ответить с цитированием
Старый 07.12.2009, 00:54   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Кофеман, а Вы знаете что такое "процедура" и что такое "функция"? и чем они друг от друга отличаются?
например, у Вас есть функция leap, которая возвращает булевское значение високосный год или нет.. И кому она эта значение возвращает? в пустоту... ;(
то же самое и с другими функциями...

тот код, который Вы привели мало того, что не работает! Он же даже не компилируется ;(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.12.2009, 03:10   #6
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию

уже решил проблему.пришлось написать весь код заново.вот что получил.если кому понадобится
Код:
program lab_8;
Type year = 1500..3000;
month = 1..12;
day = 1..31;
data = Record
y : year;
m : month;
d : day;
End;
function sum_day(td:data):integer;
var i:byte;
    s:integer;
begin
for i:=1 to td.m-1 do
    begin
      Case i Of
        1, 3, 5, 7, 8, 10, 12 : s := 31;
        4, 6, 9, 11 : s := 30;
        else if ((td.y mod 4=0) And (td.y mod 400<>0)) Then s:=29
        Else s := 28;
      end;
     sum_day:=sum_day+s;
    end;
sum_day:=sum_day+td.d-1;
end;
function name_day(sum_day:integer):string;
begin
  while (sum_day>7) do
    sum_day:=sum_day-7;
  case sum_day of
     1: name_day:='ponedelnik';
     2: name_day:='vtornik';
     3: name_day:='cpeda';
     4: name_day:='4etverg';
     5: name_day:='pyatnica';
     6: name_day:='cybbota';
     7: name_day:='Bockpecene';
  end;
end;
var td:data;
    sd:integer;
    nd:string;
begin
  writeln('vvedite date');
  readln(td.d, td.m, td.y);
  sd:=sum_day(td);
  nd:=name_day(sd);
  writeln(nd);
  readln;
end.
KoFeMaN вне форума Ответить с цитированием
Старый 07.12.2009, 09:59   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Отлично!
Только вместо цикла
while (sum_day>7) do
sum_day:=sum_day-7;
лучше
Код:
sum_day := sum_day mod 7;
только у Воскресения тогда код будет НОЛЬ.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2009, 21:27   #8
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию

Вы прям как чувствовали)Преподователь именно этот кусок кода мне и сказал упростить) А можете подсказать как упростить момент
Код:
 
Case i Of
        1, 3, 5, 7, 8, 10, 12 : s := 31;
        4, 6, 9, 11 : s := 30;
        else if ((td.y mod 4=0) And (td.y mod 400<>0)) Then s:=29
        Else s := 28;
У меня был вариант заменить на if но я слышал еще как то можно через записи с вариантами.подскажите пожалуйста как
и вообще как избавится от case в коде без существенного усложнения в коде
KoFeMaN вне форума Ответить с цитированием
Старый 11.12.2009, 23:20   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вы прям как чувствовали)
я про другую часть кода говорил, где Вы в цикле вычитаете 7, чтобы получить отстаток - день недели..

а это можно заменить ОЧЕНЬ легко. Ведь количество дней в каждом месяце фиксированно! А февраль можно потом и через if подкорректировать...
вот так, например:
Код:
const DaysInMonth : array[1..12] of integer =
   (31,28,31,30,31,30,31,31,30,31,30,31);
а потом, в коде такой цикл:

Код:
for i:=1 to td.m-1 do
    begin
        sum_day:=sum_day+DaysInMonth[i];
        {если февраль и год високосный - добавим один день}
        if (i=2) and 
            ((td.y mod 4=0) And (td.y mod 400<>0)) Then
         sum_day:=sum_day+1;
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2009, 23:55   #10
KoFeMaN
Пользователь
 
Аватар для KoFeMaN
 
Регистрация: 29.11.2009
Сообщений: 13
По умолчанию

Спасибо большое!=)про массив я как то не подумал=)
KoFeMaN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод дня недели по дате и наоборот (СИ) Xcess Помощь студентам 6 08.10.2009 14:02
Зависимость даты дней от дня недели valerij Microsoft Office Excel 16 18.06.2009 01:17
Первая номер дня в дате mirawoo Microsoft Office Access 3 17.06.2008 15:19
Добавление дня к дате Askat БД в Delphi 2 03.03.2008 11:30