C программа для поиска дня недели с заданной датой - PullRequest
13 голосов
/ 19 мая 2011

Есть ли способ узнать дату недели по заданной дате всего в одной строке кода C?

Например

Учитывая 19-05-2011 (дд-мм-гггг)) дает мне четверг

Ответы [ 15 ]

0 голосов
/ 16 декабря 2016

Суперэффективный однострочный код C для поиска дня недели

int dayOfWeek(int y, int m, int d) {
    return ((y-=m<3)+y/4-y/100+y/400+"-bed=pen+mad."[m]+d)%7;
}

Источник- здесь ↗

Подробности- здесь ↗

0 голосов
/ 02 июля 2013
#include<stdio.h>
static char day_tab[2][13] = {
        {0,31,28,31,30,31,30,31,31,30,31,30,31},
        {0,31,29,31,30,31,30,31,31,30,31,30,31}
        };
int main()
{
     int year,month;
     scanf("%d%d%d",&year,&month,&day);
     printf("%d\n",day_of_year(year,month,day));
     return 0;
}
int day_of_year(int year ,int month,int day)
{
        int i,leap;
        leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
        if(month < 1 || month >12)
        return -1;
        if (day <1 || day > day_tab[leap][month])
        return -1;
        for(i= 1;i<month ; i++)
        {
                day += day_tab[leap][year];
        }
        return day;
}
0 голосов
/ 08 июля 2011

Это работает: я взял январь 2006 в качестве ссылки. (Это воскресенье)

int isLeapYear(int year) {

     if(((year%4==0)&&(year%100!=0))||((year%400==0))) 
        return 1;
     else 
        return 0;

 }

int isDateValid(int dd,int mm,int yyyy) {

    int isValid=-1; 
    if(mm<0||mm>12) {
        isValid=-1;
    }
    else {

    if((mm==1)||(mm==3)||(mm==5)||(mm==7)||(mm==8)||(mm==10)||(mm==12)) {
           if((dd>0)&&(dd<=31))
             isValid=1;
    }  else if((mm==4)||(mm==6)||(mm==9)||(mm==11)) {
         if((dd>0)&&(dd<=30))
             isValid=1;
    }  else {
             if(isLeapYear(yyyy)){
                 if((dd>0)&&dd<30)
                     isValid=1;
             } else {
                   if((dd>0)&&dd<29)
                     isValid=1;
             }
        }  



    }
               return isValid;



 }


int calculateDayOfWeek(int dd,int mm,int yyyy)  {

                if(isDateValid(dd,mm,yyyy)==-1) {
                    return -1;
                }

                 int days=0;
                  int i; 

                   for(i=yyyy-1;i>=2006;i--) {
                         days+=(365+isLeapYear(i));

                     }
                     printf("days after years is %d\n",days);

                   for(i=mm-1;i>0;i--) {

                       if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)) {

                           days+=31;
                       }
                       else if((i==4)||(i==6)||(i==9)||(i==11)) {
                           days+=30;
                       } else {

                           days+= (28+isLeapYear(i));

                       }


                   }
                       printf("days after months is %d\n",days);

                   days+=dd;

                   printf("days after days is %d\n",days);

                   return ((days-1)%7);                


              }
0 голосов
/ 19 мая 2011

Я думаю, вы можете найти это в glib: http://developer.gnome.org/glib/unstable/glib-Date-and-Time-Functions.html#g-date-get-day

Привет

0 голосов
/ 19 мая 2011

Не в одной строке кода, нет ничего для работы с датами в стандартной библиотеке Си.Было бы довольно просто написать функцию, основанную на алгоритме Судного дня или аналогичную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...