三天打鱼两天晒网C语言编程
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
算法描述:
1.求总天数:
因为最后的天数要对5求余,365可以整除5,故我在计算总天数的时候对于年份只用对闰年+1即可;再判断这一年是否为闰年,若是则对2月天数+1,然后再对当年的天数求和。
2.判断打鱼还是晒网:
所得总天数对5求余,若值为1,2,3,则为打鱼;否则为晒网。
3.判断是否为闰年:
输入年份可以整除4但是不能整除100或者可以整除400即为闰年,返回值为1;否则为0。
C语言源代码
#include<stdio.h>
#include<stdio.h>
//判断是否为闰年
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int leapyear(int year){
if(year%400==0||(year%4==0&&year%100!=0))
return 1;
else
return 0;
}
//计算总天数
int day(int year,int mon,int date){
int days=0;
for(int i=2010;i<year;i++){//2010到输入年份间的闰年计数
days+=leapyear(i);
}
if(leapyear(year)==1)//当年为闰年,2月天数+1;
m[1]=29;
for(int j=0;j<mon-1;j++){//当年的天数
days+=m[j];
}
days+=date;//加上当月日期
return days;
}
int main(){
int year,mon,date,days;
//使用fopen函数存储数据
FILE* fa=fopen("E:\\in.txt","w");
FILE* fb=fopen("E:\\out.txt","w");
printf("请输入日期:\n");
while(scanf("%d%d%d",&year,&mon,&date)!=EOF){
if(year<2010)
printf("请重新输入2010年之后的日期:\n");
else if((mon<1&&mon>12)||date>(m[mon-1]+leapyear(year)))//判断输入是否合法
printf("请重新输入合法日期:\n");
else{
fprintf(fa,"%d%d%d\n",year,mon,date);
days=day(year,mon,date);//调用函数计算总天数
//总天数对5求模,输出相应结果
if(days%5==4||days%5==0){
printf("晒网\n");
fprintf(fb,"晒网\n");
}
else {
printf("打鱼\n");
fprintf(fb,"打鱼\n");
}
}
}
fclose(fa);
fclose(fb);
return 0;
}
程序流程图: