前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >震惊!三天打鱼两天晒网这样写。

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

作者头像
lexingsen
发布2022-02-24 15:19:50
3070
发布2022-02-24 15:19:50
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

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

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

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

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

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

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

代码语言:javascript
复制
typedef struct 
{
      int year;
      int month;
      int day;
}data;

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

代码语言:javascript
复制
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)构成的,一个大的功能往往也可以分解为多个子功能去合作完成,也正所谓模块化程序设计。这样,首先我们写一个判断平闰年的函数,在这样的一个题目里,它得到两次使用。

代码语言:javascript
复制
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;
        }
    }
}

接下来我们写总天数的函数

代码语言:javascript
复制
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.考虑程序的冗余性,输入的具体日期完全可能出现意料之外的情况,因此也需要考虑在内。

最后,附上源代码。

代码语言:javascript
复制
# 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("今天打渔!"); 
	} 	
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档