提示是: 实现一个函数,该函数读入包含日期日期的文本描述的字符串,并打印出相应的星期几(星期一到星期日)。此函数的两种有效输入格式为:
mm / dd / yyyy
示例:03/04/2014
输出:星期二
月dd,yyyy
示例:2014年3月4日
输出:星期二
其中dd是数字日,mm是数字月,yyyy是年,月是月的名称。使用两位数指定所有日期和月份(即3月,使用03而不是3)。在第二种有效格式中,Month和dd之间以及dd和yyyy之间有一个空格。 为了获得此任务的全部功劳,您的程序应以正确的格式打印出正确的一周中的任何输入。
所以截至目前我能够获得每一天的正确日期,除了2005年的2013年2017年等等......他们总是落后一天,我注意到每4年这一天的趋势最终落后1天。我不确定什么是错的。这是因为我每年使用365.25的方法是错误的吗?
我的代码:
#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;
}
答案 0 :(得分:1)
day2=(year-1970)*(365.25);
要发现年年1月1日休息多少天,
浮点计算的小数部分被截断,因此day2不会计算从2002年2月29日到1949年1月1日的额外日期,而不是01/01/1973因为它应该
换句话说,你假设1970年是闰年后的第一年,所以闰日不会被计算到四年之后。
答案 1 :(得分:0)
day2
计算无效。每四年有1461天。首先,您需要计算已经过了多少4年。然后计算出指定年份开始的天数,类似于您几个月的情况。
year%100
和year%400
例外增加了一点复杂性,但幸运的是,2000年是闰年,因此第一次处理这种小皱纹是2100年。