注册 登录
编程论坛 C语言论坛

判断日期是否合法,然后计算日期是星期几

王艾文 发布于 2020-05-13 02:41, 1742 次点击
再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。

输入:

    年 月 日

输出:

    0~6。
    星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
以下是我写的代码,但是却有一个用例显示错误,啊,有点崩溃啊,大神帮帮我。[code]#include<stdio.h>
int main()
{
    int  y,m,d,W,n=0,s=1;
    scanf("%d%d%d",&y,&m,&d);
    if (y<=1900)
       {
           printf("year is error.\n");
           s=0;
       }
    else{
        switch(m)
        {
            case 1:n=31;break;
            case 2:n=28;break;
            case 3:n=31;break;
            case 4:n=30;break;
            case 5:n=31;break;
            case 6:n=30;break;
            case 7:n=31;break;
            case 8:n=31;break;
            case 9:n=30;break;
            case 10:n=31;break;
            case 11:n=30;break;
            case 12:n=31;break;
            default:{printf("month is error.\n");
                     s=0;}
        }

    if(m=2)
    if((y%4==0&&y%100!=0)||(y%400==0))
        n=29;
    if(s==1&&d>n)
    {
        printf("day is error.\n");
        s=0;
    }}
   if(s==1){ if(m==1||m==2) {
        m+=12;
        y--;
    }
    W=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1;
    W+=7;
    W%=7;
      printf("%d\n",W);
      return 0;
}}[code]
只有本站会员才能查看附件,请 登录



2 回复
#2
fulltimelink2020-05-13 07:02
d=0时呢
#3
星泪成寒2020-05-13 16:31
程序代码:

#include <stdio.h>
#include <string.h>

//闰年判断
int is_leap_year(int year)
{
    return ((year % 4 == 0) && (year % 400 != 0));
}

//日期检查
int check_date(int year, int month, int day)
{
    static int months[] = {0,31,28,31,30,31,30,31,30,30,30,30,31};
    int tmp = 0;
   
    //基本判读
    if ((year <= 0) || (month <= 0) || (month > 12) || (day <= 0) || (day > 31)) {
        return -1;
    }
   
    tmp = months[month];
    if (28 == tmp) {//闰年2月加一天
        tmp += is_leap_year(year);
    }
    if (day > tmp) {
        return -1;
    }
   
    return 0;
}

//星期计算(0表示星期天)算法:基姆拉尔森计算公式
int get_weekday(int year, int month, int day)
{
    if ((1 == month) || (2 == month)) {
        month += 12;    /* 13/14月 */
        year -= 1;        /* 上一年 */
    }
   
    return (day + 2 * month + 3 * (month + 1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;
}

int main(void)
{
    int year, month, day;
   
    scanf("%d %d %d", &year, &month, &day);
   
    if (check_date(year, month, day) != 0) {
        printf("Error Input\n");
        return 0;
    }
   
    printf("%d\n", get_weekday(year, month, day));
    return 0;
   
}

1