суббота, 22 января 2011 г.

Задача 103.

Напишите программу, которая по дате определяет день недели, на который эта дата приходится. Для вычисления дня недели воспользуйтесь формулой:

W = ( d+[(13m-1)/5]+Y+[Y/4]+[c/4]-2c + 777) % 7.

Здесь d - число месяца, m - номер месяца, если начинать счет с марта, как делали это в Древнем Риме (март -1, апрель -2, ... , февраль 12 ), Y - номер года в столетии, с - количество столетий. Квадратные скобки означают, что надо взять целую часть от значения, находящегося в скобках. Вычисленное по формуле значение определяет день недели: 1 - понедельник, 2 - вторник, ... , 6 - суббота, 0 - воскресенье.


/*
    Программа по дате определяет день недели.
    фрмула: (d + [1/5*(13*m - 1)] + Y + [Y/4] + [c/4] - 2*c + 777) * mod(7);
*/
#include "locale.h"
#include <stdio.h>
#include <curses.h>

int main()
{
    int day, month, year; // день, месяц, год
   
    int c,y;    //    столетие и год в столетии
    int m;    //    месяц по древнеримскому календарю
    int d;    //    день недели
    char *loc;
     loc = setlocale(LC_CTYPE,"ru_RU.UTF-8");
   
    initscr();
   
    printw("Определение дня недели по дате\n");
    printw("Введите дату: день, месяц, год.\n");
    printw("Например: 5 12 1939\n");
    printw("-> ");
    scanw("%i %i %i", &day, &month, &year);
   
    if(month == 1 || month == 2)
    year--;
   
    m = month - 2;
    if(m <= 0) m = m + 12;
    c = year / 100;
    y = year - c * 100;
   
    d = (day + (13*m - 1)/5 + y + y/4 + c/4 - 2*c + 777) % 7;
   
    switch(d)
    {
        case 1: printw("Понедельник.");    break;
        case 2: printw("Вторник.");    break;
        case 3: printw("Среда.");    break;
        case 4: printw("Четверг.");    break;
        case 5: printw("Пятница.");    break;
        case 6: printw("Суббота.");    break;
        case 0: printw("Воскресенье.");    break;
    }
   
    getch();
    endwin();
    return 0;
}

Комментариев нет:

Отправить комментарий