查询万年历

#include
#include
#include
int main()
{
    while (1)
    {
        char date[20] = {0 }, c;
    int year = 0, month = 0, day = 0, week;
    int d, i=0, dm, dy, m2;
    char WEEK[9];
    
        printf("\n Please enter the perpetual calendar.The input format is eg:XXXX/XX/XX or XXXX.XX.XX\n");
        printf("\n Input e and exit the program.\n");
        while ((c = getchar()) != '\n')  date[i++] = c;
        if (date[0] =='e') exit(0);
        if (date[0] == 0 || i < 4)
        {
            printf("\n ERROR! you forgot to enter the right date you want to view\n");
            continue;
        }
        for (int j = 0; j < i; j++)
        {
            if (date[j] >= '0' && date[j] <= '9' || date[j] == '/' || date[j] == '.');
            else {
                printf("\n ERROR! Please enter the correct date number or format.\n");
                continue;
            }
        }
        i = 0; d = -1;
        while (date[i])/*遍历传入的参数日期,计算出year,month,day*/
        {
            if ((date[i] == '/' || date[i] == '.') && d == -1) { d = 0; i++; continue; }
            if ((date[i] == '/' || date[i] == '.') && d == 0) { d = 1; i++; continue; }
            if (d == -1) year = year * 10 + (date[i] - '0');
            if (d == 0) month = month * 10 + (date[i] - '0');
            if (d == 1) day = day * 10 + (date[i] - '0');
            i++;
        }printf(" %2d  ", day);
        if (month < 1 || month>12)/*若月份传入错误数字*/
        {
            printf("\n ERROR! the entered MONTH is invalid\n");
            continue;
        }
        if (year == 2000)
        {
            dy = 0;                /*年引起的星期差为0个*/
            m2 = 1;                /*2月引起的星期差为1个*/
            goto la_100;
        }
        if (year > 2000)
            d = (year - 1 - 2000) / 4 - (year - 1 - 2000) / 100 + (year - 1 - 2000) / 400 + 1;
        else
            d = (year - 2000) / 4 - (year - 2000) / 100 + (year - 2000) / 400;
        dy = (year - 2000) + d;     /*** 该年 1月1号 到2000年1月1号的 " 星期差 " ***/
        if ((year % 4 == 0 && year % 100 != 0) || (year % 100 == 0 && year % 400 == 0))
            m2 = 1;
        else
            m2 = 0; printf("%2d", dy);  /*** 该年是否润 ***/
    la_100:                    /**** la_100 ****/
        /*** 该月以前的月所引起的 " 星期差 " ***/
        switch (month)
        {
        case 1: dm = 0; month = 31; break;   /*** month 在此存放该月天数 ***/
        case 2: dm = 3; month = d == 1 ? 29 : 28; break;
        case 3: dm = 3 + m2; month = 31; break;
        case 4: dm = 6 + m2; month = 30; break;
        case 5: dm = 1 + m2; month = 31; break;
        case 6: dm = 4 + m2; month = 30; break;
        case 7: dm = 6 + m2; month = 31; break;
        case 8: dm = 2 + m2; month = 31; break;
        case 9: dm = 5 + m2; month = 30; break;
        case 10: dm = m2; month = 31; break;
        case 11: dm = 3 + m2; month = 30; break;
        case 12: dm = 5 + m2; month = 31; break;
        }
        if (day<0 || day>month)
        {
            printf("\n ERROR! the entered DAY is invalid\n");
            continue;
        }
        week = (dy + dm  - 1 + 6) % 7; 
        int week1 = (dy + dm +day - 1 + 6) % 7;
        if (week < 0)
            week += 7; 
        if (week1 < 0)
            week1 += 7;
        if (day > 0)       /*** 判定查看类型 ***/
        {
            switch (week1)
            {
            case 0: strcpy(WEEK, "SUNDAY"); break;
            case 1: strcpy(WEEK, "MONDAY"); break;
            case 2: strcpy(WEEK, "TUESDAY"); break;
            case 3: strcpy(WEEK, "WEDNESDAY"); break;
            case 4: strcpy(WEEK, "THURSDAY"); break;
            case 5: strcpy(WEEK, "FRIDAY"); break;
            case 6: strcpy(WEEK, "SATURDAY"); break;
            }
            printf("\n this day is %s  \( %d \)\n\n OK!\n", WEEK, week1);
        }

        week = ++week % 7;
        printf("\n the calender of this month as following\n");
        printf("\n *********************************\n");
        printf(" SUN  MON  TUE  WEN  THU  FRI  STA\n");
        for (i = 0; i < week; i++)
            printf("     ");
        for (i = 1; i <= month; i++)
        {
            printf(" %2d  ", i);
            week++;
            if (week % 7 == 0 && i != month)
                printf("\n");
        }
        printf("\n *********************************\n");
        printf("\n OK!\n");
    }
}
 

 

你可能感兴趣的:(c语言)