原题目:有一个人从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("今天打渔!");
}
}