中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日开始“三天打鱼两天晒网”,问这个人在以后某一天中是“打鱼”,还是“晒网”
#include<stdio.h>
void main()
{
int year,month,day;
int a,february,number=0; //February为平闰年的二月天数,number为从2010/1/1到指定日期的相差天数
printf("1.手动输入日期 2.读取文档日期\n");
scanf("%d",&a);
if(a==1)
{
printf("请输入一个日期:(用空格隔开)"); //输入日期
scanf("%d%d%d",&year,&month,&day);
if(year<2010)
printf("年份不能小于2010\n"); //判断输入年份不能小于2010年
else if(month<1||month>12)
printf("请输入正确月份"); //月份必须在1到12之间
else if(((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))&&(day<1||day>31))
printf("请输入正确日期"); //大月的天数不能超过31
else if(((month==4)||(month==6)||(month==9)||(month==11))&&(day<1||day>30))
printf("请输入正确日期"); // 小月的天数不能超过30
else if((year%4==0&&year%100!=0)||year%400==0)
{
if(month==2&&(1>day||day>29))
printf("请输入正确日期"); //闰年的2月不能大于29天
}
else if(month==2&&(1>day||day>28))
printf("请输入正确日期"); //平年的2月不能大于28天
}
else if(a==2)
{
FILE *fp; //定义文件指针
fp=fopen("in.txt","r"); // 用只读的方式打开in.txt文件,读取里面的日期
fscanf(fp,"%d%d%d",&year,&month,&day); //把读取到的数赋值给year month day
}
for(int i=2010;i<year;i++)
{
if((i%4==0&&i%100!=0)||(i%400==0&&i%100==0))
number=number+366;
else
number=number+365;
} //从2010开始数到指定年份的前一年,每遇到一个闰年基础天数加366,遇到平年基础天数加365
if((i%4==0&&i%100!=0)||(i%400==0&&i%100==0))
february=29;
else
february=28;
switch(month)
{
case 1:number=number; break;
case 2:number=number+31; break;
case 3:number=number+31+february; break;
case 4:number=number+62+february; break;
case 5:number=number+92+february; break;
case 6:number=number+123+february; break;
case 7:number=number+153+february; break;
case 8:number=number+184+february; break;
case 9:number=number+215+february; break;
case 10:number=number+245+february; break;
case 11:number=number+276+february; break;
case 12:number=number+306+february; break; //在年份数完的基础上,把指定月份之前的天数加在相差天数上
}
number=number+day; // 再把指定日子加上
printf("日期是:%d年%d月%d日\n",year,month,day);
printf("今天是第%d天\n",number);
FILE * gp; // 定义输出文件的指针
gp=fopen("out.txt","wt"); //用只写的方式打开文件
if(number<5)
{
switch(number)
{
case 1:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 2:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 3:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 4:printf("今天该晒网");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该晒网\n",year,month,day,number);break;
}
}
else
{
switch(number%5)
{
case 1:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 2:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 3:printf("今天该打鱼");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该打鱼\n",year,month,day,number);break;
case 4:printf("今天该晒网");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该晒网\n",year,month,day,number);break;
case 0:printf("今天该晒网");fprintf(gp,"日期是:%d年%d月%d日\n今天是第%d天\n今天该晒网\n",year,month,day,number);break;
}
}
printf("\n");
}`
心得体会:这个程序和以前做过的一个求某天是某年第一天的问题类似。这个问题的关键就在于求出某一天距开始日期有多少天。不仅要考虑闰年和平年的区别。还要考虑输入的日期是否符合常规。所以在判断日期正确性方面我用多个if语句来判断日期的正确性。判断闰年也是用的if语句。之后用一个循环求出所有整年的天数。再用switch语句选择某月的天数。再把某日加入总天数。最后用总天数除以5求余。用得到的数判断这天是打鱼还是晒网。