首页 文章

C初学者帮助:任何给定日期的星期几

提问于
浏览
0

提示符为:实现一个函数,该函数读入包含日历日期的文本描述的字符串,并打印出一周中相应的星期几(星期一到星期日) . 此函数的两种有效输入格式为:

毫米/日/年

示例:03/04/2014
输出:星期二

月dd,yyyy

示例:2014年3月4日
输出:星期二

其中dd是数字日,mm是数字月,yyyy是年,月是月的名称 . 使用两位数指定所有日期和月份(即3月,使用03而不是3) . 在第二种有效格式中,Month和dd之间以及dd和yyyy之间有一个空格 . 为了获得此任务的全部功劳,您的程序应以正确的格式打印出正确的一周中的任何输入 .

So as of right now i am able to get the correct days for every single day except in the years 2005 2009 2013 2017 etc etc... they are always a day behind, i notice that its going by a trend of every 4 years the days end up 1 day behind. Im not sure whats wrong. is it cause my method of using 365.25 as each year is wrong?

我的代码:

#include<stdio.h>

int main()
{
int month,day1,day2,totdays,year,dm,dn,leap,rmd;


    printf(" ");
    scanf("%d/%d/%d",&month,&day1,&year);


    if(((year%4==0) && (year%100!=0)) || (year%400==0))
      {
         if(month==1)
            dm=0;

         if(month==2)
            dm=31;

         if(month==3)
            dm=60;

         if(month==4)
            dm=91;

         if(month==5)
            dm=121;

         if(month==6)
            dm=152;

         if(month==7)
            dm=182;

         if(month==8)
            dm=213;

         if(month==9)
            dm=244;

         if(month==10)
            dm=274;

         if(month==11)
            dm=305;

         if(month==12)
            dm=335;
       }
    else
       {
         if(month==1)
            dm=0;

         if(month==2)
            dm=31;

         if(month==3)
            dm=59;

         if(month==4)
            dm=90;

         if(month==5)
            dm=120;

         if(month==6)
            dm=151;

         if(month==7)
            dm=181;

         if(month==8)
            dm=212;

         if(month==9)
            dm=243;

         if(month==10)
            dm=273;

         if(month==11)
            dm=304;

         if(month==12)
            dm=334;
       }


      day2=(year-1970)*(365.25);
      dn=dm+day1;
      totdays=day2+dn;

      rmd=totdays%7;

      if(rmd==5)
        {
           printf("Monday \n");
        }

      if(rmd==6)
        {
           printf("Tuesday \n");
        }

      if(rmd==0)
        {
            printf("Wednesday \n");
        }

      if(rmd==1)
        {
            printf("Thursday \n");
        }

      if(rmd==2)
        {
            printf("Friday \n");
        }

      if(rmd==3)
        {
            printf("Saturday \n");
        }

      if(rmd==4)
        {
            printf("Sunday \n");
        }

      return 0;

}

2 回答

  • 0

    1969年不是闰年,1972年是 . 当你这样做

    day2=(year-1970)*(365.25);
    

    要发现一年的1月1日离开多少天,你算一算

    '70的

    • 0天
      71 365.25天'71
      '72的
    • 730.5天
      '73的
    • 1095.75天
      '74的
    • 1461天

    浮点计算的小数部分被截断,因此day2不会计算从2002年2月2日到1949年1月1日的额外日期,而不是它应该的01/01/1973 .

    换句话说,你假设1970年是闰年后的第一年,所以闰日直到四年后才会被计算在内 .

  • 1

    day2 计算不起作用 . 每四年有1461天 . 首先,您需要计算已经过了多少4年 . 然后计算出指定年份开始的天数,类似于您几个月的情况 .

    year%100year%400 例外增加了一点复杂性,但幸运的是2000年是闰年,所以你第一次处理这个小皱纹是2100年 .

相关问题