LINUX.ORG.RU

типа календарь


0

0

Вот такая интересная задача появилась, нужно сделать что-то навроде календаря.

То есть нам известная сегодняшняя дата
magadan@home:~$ date
Чтв Ноя  8 16:53:10 NOVT 2007

от этой(ну или любой другой "сегодняшней") даты мы будем отталкиваться..
задача: зная сегодняшню дату определить название дня недели (понедельник, вторник, etc) только по введёным пользователем данным
 
число --> 08
месяц --> 11
год --> 2689(или 1978) 

честно, даже не знаю с чего начать. -_-
буду рад любой помощи. )

P.S. Требуемый ЯП: C 
anonymous

1. Это можно сделать обычной командой date. Это если не стоит задача изобрести велосипед.

2. Однако задача изобрести велосипед стоит, то есть ты двоечник, неспособный решить домашнее задание. По доброте душевной и от нечего делать рассказываю. :) Куришь григорианский календарь. Он сравнительно простой: високосные годы — все, которые делятся на четыре, кроме тех, которые делятся на 100, но не делятся на 400 (то есть 2000-й был високосным, а 1900-й — нет). Вооружившись этим мощным знанием, осознаёшь, что номер 1 января n-го года есть 365*n-n/100+n/400 (деление целочисленное, формула наверняка с ошибками, проверяй и думай сам). Составляем номера первых чисел каждого месяца относительно начала года, и складываем смещения годовое, месячное, номер дня в месяце и некую константу от 1 до 7. Остаток от деления полученного long int на 7 и есть день недели.

Это одна из первых программ, что я написал ещё на spectrum basic'е в фиг знает каком году. :)

Teak ★★★★★
()
Ответ на: комментарий от Teak

1) Я догадывался ^^ 2) А вы догадливый. Спасибо. ) правда слегка сумбурно описано, имхо, но не беда, попробую разобраться.

anonymous
()
Ответ на: комментарий от anonymous

Не забудь ещё, что месячное смещение для месяцев начиная с марта зависит от того, високосный этот год или нет, про это я не написал. Ну и корректность исходных данных было бы очень полезно проверять, и тоже с учётом високосности.

Насчёт сумбурности, ну знаете ли, это наглость. :)

Teak ★★★★★
()
Ответ на: комментарий от Teak

Спасибо ещё раз )

>Насчёт сумбурности, ну знаете ли, это наглость. :) ну наглость не порок, а жить помогаает. (с) ^^

anonymous
()
Ответ на: комментарий от anonymous

Если ты думаешь, что я тебе только что помог, то ты глубочайшим образом заблуждаешься. Хотя, если ты планируешь работать грузчиком, а диплом тебе нужен, чтобы маме показать, тогда да, помог. :)

Teak ★★★★★
()
Ответ на: комментарий от Teak

Кстати, не обязательно знать сегодняшнюю дату, чтобы получить нужный ответ...

yz
()

(defun get-day-of-week (day month year)
  (let* ((a (truncate (/ (- 14 month) 12)))
	 (y (- (+ year 4800) a))
	 (m (- (+ month (* 12 a)) 3))
	 (date (- 
		(+ day 
		   (truncate (/ (+ (* 153 m) 2) 5))
		   (* 365 y)
		   (truncate (/ y 4))
		   (truncate (/ y 400)))
		(truncate (/ y 100))
		32045))
	 (day-of-week (+ (rem date 7) 1)))
    day-of-week))


Извини, но на Си переписать это тебе домашнее задание ;)

catap ★★★★★
()
Ответ на: комментарий от catap

Вообще надо учесть еще пару фактов (моя формула верна, до определеного момента)

1) Раньше использовалось другое летоисчисление (Юлианское). Т.е. до 4 откября 1582 года, следующий день следовал 15 откября 1582 года (в числах могу ошибиться) в европе. Россия перешла в 1918 году (или 17?) и потеряла числа с 1 по 13 февраля (после 31 января следовало 14 февраля).

2) Нулевого года нет :)

catap ★★★★★
()

system("ruby -e \"require 'date';puts Date.new(2689,11,12).wday\");

anonymous
()

и ни один не ткнул человека носом в гуглу.

спрашиваю у гугла "вычисление дня недели"

первая же сцыла на википедию... "Алгоритм вычисления дня недели" - http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC...

терзай! студент! :)

не смотря на то, что моя первая курсовая работа звучала "вывест на экран календарь (любого формата от 1х12 до 12х1) на любой год, я ни черта не помню что и как там вычисляется :)

кста, буквально на днях, на работе я доказывал человеку, что акромя деления на 4 есть еще что-то для определения високосного года :)... как увидел 400 и 100, вспомнил :)... чутье не подвело ;)

Deleted
()
Ответ на: комментарий от Deleted

Угу, только мы так получим не человека способного придумать алгоритм, а его найти :)

Согласись, это сложнее. Кстати, хорошо бы знать, кто когда и с какого на какое лето исчисление переходил, что бы реально показывать дни недели, а не хрен пойми что ;)

catap ★★★★★
()

#include <time.h>
#include <string.h>
#include <stdio.h>
int get_week_day(int year, int month, int day) {
    struct tm tm;
    memset(&tm, 0, sizeof(tm));
    tm.tm_year = year - 1900;
    tm.tm_mon = month - 1; 
    tm.tm_mday = day;
    time_t date = mktime(&tm);
    struct tm * result = gmtime(&date);
    return result -> tm_wday;
}
int main() {
    printf("day = %d", get_week_day(2007, 11, 10));
    return 0;
}


Как вам такое решение?
про алгоритм в википедии я видел, правда позже чем сюда запостил, более того нашёл даже реализацию этой задачки на паскале http://www.codenet.ru/progr/alg/Leap-Year.php 

кстати это не домашнее задание, я просто учу С, задачки беру у знакомых.
Нашёл интересную книгу Богатырёва, хрестоматия по программированию на С в unix читаю вот и стараюсь разбираться и пробовать писать что либо. )

anonymous
()
Ответ на: комментарий от anonymous

Ну, надо было ставить вопрос по-другому, ткнули бы пальцем в time.h, а так выложили тебе расклад вычисления :)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.