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

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

毫米/日/年

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

月dd,yyyy

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

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

所以到目前为止,我能够获得每一天的正确日子,除了2005年的2013年2017年等等……他们总是落后一天,我注意到它每4年走一次趋势天最后一天落后。 我不确定什么是错的。 这是因为我每年使用365.25的方法是错误的吗?

我的代码:

#include 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; } 

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

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

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

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

浮点计算的小数部分被截断,因此day2不会计算从0272/29/197到01/01/1974的额外日期,而不是它应该的01/01/1973。

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

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

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