震惊!三天打鱼两天晒网这样写。

原题目:有一个人从1990年一月一日开始三天打鱼两天晒网,问他今天在干嘛?

拿到这样的一个题目瞬间会有一点懵,但是仔细分析其中的逻辑关系,可以得到下面的思路。

首先,从1990年1月1日到今天共计多少天。

其次,如何得到今天是打渔还是晒网,可以看出三天打鱼两天晒网是一个循环,也就是是说五天为一个周期。

顺着这样的一个思路,我们开始写代码。

1.针对一个具体的日期,我们需要知道是何年何月何日。因此,在C语言中的结构题类型就可以满足定义这样一个具体日期。

typedef struct 
{
      int year;
      int month;
      int day;
}data;
2.接着我们要计算1990年1月1日到今天为止总计为多少天。考虑到要计算天数,我们要细化日期的内容。对于年,有平年和闰年之分,平年365天,闰年366天,这都是常识。对于月,定义这样的一个平年通用型的数组比较贴切。

int  Permonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义长度为13且Permonth[0]=0,这样下标与月份一致,便于计算。

如果今年刚好不是闰年,我们只要计算出这个月前今年的总天数加上这个月的天数就可以了。但是如果是闰年我们还需要继续划分,如果是二月前,同上。如果月份大于三,我们还是需要在二月天数的基础上增加一。即Permonth[2]+=1;

3.二步骤虽然略麻烦一点,但为三步骤提供了思路。C语言就是函数(function)构成的,一个大的功能往往也可以分解为多个子功能去合作完成,也正所谓模块化程序设计。这样,首先我们写一个判断平闰年的函数,在这样的一个题目里,它得到两次使用。

bool is_leapyear(int year)
{ 
    if(year<0)
   {
        printf("输入错误!");
   }
    else
   {
         if(year%4==0&&year%100!=0||year%400==0)//判断为闰年核心
         {
               return true;
         }
         else
        {
               return false;
        }
    }
}
接下来我们写总天数的函数

void countday(date *p,int *sum)//传入结构题的地址,并传入保存总天数值的地址
{
	int permonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int totalday=0;
	for(int year=1990;year<p->year;++year)
	{
		if(is_leapyear(p->year))
		{
			totalday+=366;
		}
		else
		{
			totalday+=365;
		}
	}
	if(is_leapyear(p->year))
	{
		permonth[2]+=1;
	}
	for(int i=0;i<p->month;++i)
	{
		totalday+=permonth[i];
	}
	totalday+=p->day;
	*sum=totalday;
}
到此为止,我们就把从1990年1月1日到今天的总天数计算出来了。

4.总天数计算出来后,因为三天打渔两天晒网,五天即一个循环,所以总天数对5取模。结果为4和0时,即为晒网。结果为1,2,3时,即为打渔。
5.考虑程序的冗余性,输入的具体日期完全可能出现意料之外的情况,因此也需要考虑在内。

最后,附上源代码。

# include<stdio.h>


typedef struct 
{
	int year;
	int day;
	int month;
}date;
void init_date(date *p)
{
	p->day=0;
	p->month=0;
	p->year=0;
}
bool is_leapyear(int year)
{
	if(year%4==0&&year%100!=0||year%400==0)
	{
		return true;
	}
	else
	{
		return false;
	}
}
void countday(date *p,int *sum)
{
	int permonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int totalday=0;
	for(int year=1990;year<p->year;++year)
	{
		if(is_leapyear(p->year))
		{
			totalday+=366;
		}
		else
		{
			totalday+=365;
		}
	}
	if(is_leapyear(p->year))
	{
		permonth[2]+=1;
	}
	for(int i=0;i<p->month;++i)
	{
		totalday+=permonth[i];
	}
	totalday+=p->day;
	*sum=totalday;
}
int main()
{
	date l;
	init_date(&l);
	printf("请输入今天是几年几月几日:\n");
	scanf("%d%d%d",&l.year,&l.month,&l.day);
	printf("\n");
	int s;                        //用来接收总天数
	countday(&l,&s);
	if(s%5==4||s%5==0)
	{
		printf("今天晒网!");
	}
	else
	{
		printf("今天打渔!"); 
	} 	
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值