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

2022-02-24 15:19:50 浏览数 (1)

原题目:有一个人从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&&year0!=0||year@0==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&&year0!=0||year@0==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 人点赞