Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение дня недели, зная дату dd.mm.yyyy 
:(
    Опции темы
politex
  Дата 20.11.2004, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.11.2004

Репутация: нет
Всего: нет



Есть ли какой нибудь алгоритм нахождение дня недели зная дату dd.mm.yyyy ? smile
Например если 20.11.2004 то ответ СУББОТА. smile
PM MAIL   Вверх
Alex
Дата 20.11.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



В Delphi, это функция DayOfTheWeek из модуля DateUtils.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
GePo
Дата 20.11.2004, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 30.3.2003
Где: Москва

Репутация: нет
Всего: 3



politex
конечно же есть. Самое простое, это взять какой-нибудь понедельник, подсчитать сколько от него прошло дней до данной даты и сделать c mod 7 + 1. В дельфе вроде так и работает smile
--------------------
PM MAIL WWW   Вверх
Akina
Дата 20.11.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



politex
Практически в любом языке есть функция форматирования вывода. И для форматов даты-времени там есть вывод дня недели.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
III.nfo
Дата 21.11.2004, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 18.10.2004

Репутация: 2
Всего: 2



В своё время я решил проблему так (lang C#):

Код

public static string Get (int day, int month, int year)
{
    year -= 2000;
    int yd = 0;
    int y = year;
    int [] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int md = 0;
    int k = 0;
    for (int i = 1; i < month; i++)
    {
              md += m[k];
              k++;
    }
    int sum = 0;
    if (year <  0)
    {
              y = - y;
              yd = 365 * y + y / 4;
              if (month > 2 & year % 4 == 0) {yd--;}
              sum = 6 - (yd - md - day) % 7;
    }
    if (year == 0)
    {
              sum = (md + day) % 7;
              if (month < 3) {sum--;}
              if (sum == -1) {sum=6;}
              if (sum == -2) {sum=5;}
    }
    if (year >  0)
    {
              y--;
              yd = 365 * y + y / 4 + 1;
              if (month > 2 & year % 4 == 0)    {yd++;} 
              sum = (yd + md + day) % 7;
    }
    string [] d = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    return (d[sum]);
}


Это сообщение отредактировал(а) III.nfo - 17.2.2006, 23:06
PM MAIL WWW   Вверх
Peter
Дата 6.12.2004, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Есть такая формула Зеллера. Поищи в интернете.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Albinos_x
Дата 8.12.2004, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: нет
Всего: 108



Смотри DRKB, там есть


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
neutrino
Дата 8.12.2004, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Вот простенькая программа, которая дает следующую дату. Можно отсчитать со дня, о котором известно какой он день недели. Считать надо по модулю 7.

Код

#include <iostream.h>
#include <math.h>

void main()
{
int day, month, year;
printf("\nEnter today's date (d/m/y):");
scanf("%d/%d/%d", &day, &month, &year);
if (month!=2) { // It is not feb?
     day=(day+1)%31; // If it is not feb, the maximum is 31 days
     if (day==0) { // Jumped over the maximum?
        day++; // Add 1 to the day. There are no zero days!
        if (!(month==4||month==6||month==9||month==11)) day+=30; // If it is
     }                                   // 31 days month, add 30 days more.
} else { // It is feb
     day=(day+1)%29; // There are 29 days maximum in feb
     if (day==0) { // Jumped over the maximum?
        day++; // Add 1 to the day.
        if (year%4==0) day+=28; // If it is a leap-year, add 28 days more.
     }
}
if (day==1) month=(month+1)%13; // New month?
if (month==0) { // Jumped over maximum months=12?
     month++; // It is jan.
     year++; // and new year! Happy new year!!! :)
  }
printf("\nTomorrow's date: %d/%d/%d", day, month, year);
}



--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Elvis
Дата 11.12.2004, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.12.2004

Репутация: нет
Всего: нет



Хотите прикол?

2000 -- не високосный год был!!!

формула год/4 _ПОЧТИ_ верная!!! В феврале 29 дней если год нацело делится на 4 и не делится на 400!!!

400, 800, 1200, 1600, 2000, 2400... годы НЕ високосные!

P.S. кста, календарь виндовый говорит, что есть 29,02,2000. (((у мя ХР). Гляньте плз что в 98
PM MAIL   Вверх
Alex
Дата 11.12.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



Elvis, ты перегрелся
--Resize_Images_Alt_Text--


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Alex
Дата 12.12.2004, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



Григорианский календарь. Вследствие того, что продолжительность юлианского года больше тропического на 11 мин 14 сек, то за 128 лет накапливалась ошибка в целые сутки. Поэтому к концу 16 в. весеннее равноденствие, которое в 325 н. э. приходилось на 21 марта, наступало уже 11 марта. Ошибка была исправлена в 1582, когда на основе буллы папы римского Григория XIII была произведена реформа юлианского К. Для его исправления счёт дней был передвинут на 10 сут вперёд, и день после четверга 4 октября предписывалось считать пятницей, но не 5, а 15 октября Так весеннее равноденствие вновь было возвращено на 21 марта. Чтобы избежать новой ошибки, было решено в каждые 400 лет выбрасывать из счёта 3 дня. Таким образом, вместо 100 високосных дней на каждые 400 лет в юлианском К. в новом К. их стало только 97. Из числа високосных были исключены те вековые годы (годы с двумя нулями на конце), число сотен которых не делится без остатка на 4. Такими годами, в частности, являлись: 1700, 1800 и 1900. Исправленный К. получил название григорианского К., или нового стиля (в отличие от юлианского, за которым укрепилось назв. «старый стиль»). Средняя длина года в нём превосходит продолжительность тропического всего на 26 сек, что приводит к ошибке в одни сутки лишь за 3280 лет. Разница между старым и новым стилями составляет: для 18 в. 11 сут, для 19 в. 12 сут и для 20 в. 13 сут.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
podval
Дата 14.12.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



До кучи. В образовательных целях.

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Calculating day of week by date
//  (c) Johna Smith, 1996
//
//  Method description:
//    Here we use special formulas different for January & February
//  and other monthes. Use this algorithm only for dates after
//  October, 15, 1528
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

enum Month {January=1,February,March,April,May,June,July,August,
           September,October,November,December};

struct Date
{
 float day;
 Month month;
 int year;
};

int DayOfWeek(Date date)
{
 float F;

 if (date.month<March)
   F=365*date.year+date.day+31*(date.month-1)+
     (int)((date.year-1)/4)-(int)(3*(int)((date.year-1)/100+1)/4);
 else
   F=365*date.year+date.day+31*(date.month-1)-(int)(0.4*date.month+2.3)+
     (int)(date.year/4)-(int)(3*(int)(date.year/100+1)/4);

 return  F-7*(int)(F/7)-1;
}


Date Today={11,October,1996};

void main(void)
{
 printf("%f/%d/%d is ",Today.day,Today.month,Today.year);
 switch (DayOfWeek(Today))
 {
      case -1:printf("Sunday\n");break;
      case 0:printf("Monday\n");break;
      case 1:printf("Tuesday\n");break;
      case 2:printf("Wednesday\n");break;
      case 3:printf("Thursday\n");break;
      case 4:printf("Friday\n");break;
      case 5:printf("Saturday\n");break;
 }
}

PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0824 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.