中国有句俗话“三天打鱼,俩天晒网”。某人从2010年1月1日起开始三天打鱼,俩天晒网,问这个人在以后某一天中是打鱼还是晒网。用c语言的解决方法

程序源代码:
/*
问题:某人从2010年1月1日起开始"三天打鱼俩天晒网",问这个人在以后的某一天中是打鱼还是晒网。
思路:1:根据起始年份,及各个月份,号数的规定,判断输入数据是否正确
2:求出某人工作的天数(注意闰年366天,2月29天)
3:除以5取余,判断某人在干什么
*/
#include<stdio.h>
#define year0 2010//设置初始变量,从2010年1月1号开始工作的
#define month0 1
#define day0 1
int main()
{
int panduan(int b[3]);//验证输入数据的正确性
int days(int b[3]);//计算某人的工作时间
int works(int c);//判断某人在做什么工作
int data,a[3],time=0;
int validity=1;//如果年份正确,继续判断。如果年份不正确,退出运行
FILE *fpt;
printf(“请输入要判断的年,月,日:\n”);
scanf("%d",&data);
a[0]=data/10000;//通过整除取余的方法分离年、月、日
a[1]=(data/100)%100;
a[2]=data%100;
validity=panduan(a);//判断结果返回给变量validity
while(validity)
{
time=days(a);
printf(“一共工作了%d天\n”,time);
if(works(time))
{
printf("%d年%d月%d日是打鱼\n",a[0],a[1],a[2]);
fpt = fopen(“out.txt”,“w”);//打开文档,写入
fprintf(fpt,"%d年%d月%d日是打鱼\n",a[0],a[1],a[2]);
fclose(fpt);
}
else
{
printf("%d年%d月%d日是晒网\n",a[0],a[1],a[2]);
fpt = fopen(“wendangming.txt”,“w”);//打开文档,写入
fprintf(fpt,"%d年%d月%d日是晒网\n",a[0],a[1],a[2]);
fclose(fpt);
}
break;
}
return 0;
}
int panduan(int b[3])//验证输入数据的正确性
{
int leap=0,c=1;
if(b[0]<year0)//输入的年份不能小于起始年份
{
printf(“输入的年份不对\n”);
c=0;
}

if(b[1]==0||b[1]>12)//输入的月份不能等于0或者大于12月
{	
	printf("输入的月份不对\n");
	c=0;
}
switch(b[2])
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
	leap=3;break;//将月份是大月的归为一类
case 4:case 6:case 9:case 11:
	leap=2;break;//将月份是小月的归为一类
default:
	leap=1;//将2月归为一类
}
if(b[0]%400==0||((b[0]%4==0)&&(b[0]%100!=0)))//判断某一年是不是闰年
{
	switch(leap)//根据上面对月份的分类来判断号数是否正确
	{
	case 3:
		if(b[2]>31)
		{printf("输入的号数不对");c=0;break;}
	case 2:
		if(b[2]>30)
		{printf("输入的号数不对");c=0;break;}
	case 1:
		if(b[2]>29)
		{printf("输入的号数不对");c=0;break;}
	}
}
else
{
	switch(leap)//根据上面对月份的分类来判断号数是否正确
	{
	case 3:
		if(b[2]>31)
		{printf("输入的号数不对");c=0;break;}
	case 2:
		if(b[2]>30)
		{printf("输入的号数不对");c=0;break;}
	case 1:
		if(b[2]>28)
		{printf("输入的号数不对");c=0;break;}
	}
}
if(c==1)
	return 1;
else
	return 0;

}
int days(int b[3])//计算某人的工作时间
{
int i;
int sum=0;
for(i=year0;i<b[0];i++)//从起始年份开始循环
if(b[0]%4000||((b[0]%40)&&(b[0]%100!=0)))//如果是闰年工作天数加366
sum+=366;
else//如果不是闰年工作天数加355
sum+=365;
if(b[0]%4000||((b[0]%40)&&(b[0]%100!=0)))//如果是闰年,则2月有29天
{
switch(b[1])
{
case 1:
sum+=0;break;//如果月份是1月,则经历了完整的0月
case 2:
sum+=31;break;//如果月份是2月,则经历了完整的1月份,以此类推
case 3:
sum+=31+29;break;
case 4:
sum+=31+29+31;break;
case 5:
sum+=31+29+31+30;break;
case 6:
sum+=31+29+31+30+31;break;
case 7:
sum+=31+29+31+30+31+30;break;
case 8:
sum+=31+29+31+30+31+30+31;break;
case 9:
sum+=31+29+31+30+31+30+31+31;break;
case 10:
sum+=31+29+31+30+31+30+31+31+30;break;
case 11:
sum+=31+29+31+30+31+30+31+31+30+31;break;
case 12:
sum+=31+29+31+30+31+30+31+31+30+31+30;break;
}
}
else//如果不是闰年,则2月有28天
{
switch(b[1])
{
case 1:
sum+=0;break;//与上面闰年的算法一样,区别在于2月份只有28天
case 2:
sum+=31;break;
case 3:
sum+=31+28;break;
case 4:
sum+=31+28+31;break;
case 5:
sum+=31+28+31+30;break;
case 6:
sum+=31+28+31+30+31;break;
case 7:
sum+=31+28+31+30+31+30;break;
case 8:
sum+=31+28+31+30+31+30+31;break;
case 9:
sum+=31+28+31+30+31+30+31+31;break;
case 10:
sum+=31+28+31+30+31+30+31+31+30;break;
case 11:
sum+=31+28+31+30+31+30+31+31+30+31;break;
case 12:
sum+=31+28+31+30+31+30+31+31+30+31+30;break;
}
}
sum+=b[2];
return sum;
}
int works(int c)//判断某人在做什么工作
{
int leap;
if(c%51||(c%52||(c%53)))//如果工作的天数取余是1、2、3,则为打鱼
leap=1;
else if(c%5
4||c%5==0)//如果工作的天数取余是4、0,则为晒网
leap=0;
return leap;
}
程序流程图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44382383/article/details/88070177