C语言趣味编程之三天打鱼两天晒网

include <stdio.h>

typedef struct date {//定义一个日期结构体date,三个成员变量year\month\day,使得年月日作为一个整体,相互联系。

//结构体:【适用形式:typedef struct m{ int a;int b;int c }M;M c;】【typrdef:类型定义、说明】-将struct m命名为M,再定义结构体变量-M c;

int year;

int month;//结构体一般形式:【struct 类型名{成员列表}变量;小心分号】在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。

int day;

}DATE;

int countDay(DATE);//声明函数countDay\runYear接受DATE\int类型参数,countDay(year、month、day)表示指定(年、月、日),runYear函数为判断闰年

int runYear(int);

void main()

{

DATE today;//指定日期-定义结构体变量

int totalDay;//指定日期距离1990年1月1日的天数

int result;//totalDay对5取余的结果

printf("please input 指定日期 包括年, 月, 日 如:1999 1 31\n");//输入指定的日期,包括年月日

scanf_s("%d%d%d",&today.year,&today.month,&today.day);//scanf输入可能不安全,可替换使用scanf_s

//求出指定日期距离1990年1月1日的天数

totalDay = countDay(today);

//天数%5,判断输出打鱼还是晒网

result = totalDay % 5;//每5天一个周期,%为取余运算

if (result > 0 && result < 4)//判断每一个周期的5天内,取余结果为1---3:前三天是打鱼,取余结果为4、5:后两天是晒网。即三天打鱼两天晒网,&&(逻辑与)有一个为0则结果为0。

printf("今天打鱼");

else

printf("今天晒网");

}

int runYear(int year)//闰年判断函数runYear函数的函数体

{//闰年:如果(该年能被4整除并且不能被100整除)或者(该年能被400整除则是闰年)

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))//判断指定日期是否闰年,是返回1,否返回0,||(逻辑或)有一个为1则判断结果为1。

return 1;

else

return 0;

}

//求指定日期距离1990年1月1日的天数-算法核心部分【到指定日期距离1990年1月1日的天数totalDay=1990年至指定日期前一年共有多少天+指定年中到指定日期的天数】

int countDay(DATE currentDay)//countDay函数计算指定日期距离1990年1月1日的天数,的函数体,函数定义:函数名(countDay)类型(DATE)参数(currentDay表示指定日期)

{

int perMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//每月天数数组,数组初始化,数组是一种数据结构,用于存储一组相同类型的数据。它可以按照索引来访问和操作其中的元素,使得对数据的处理更加方便和高效。

int totalDay = 0, year, i;

for (year = 1990; year < currentDay.year; year++)//将年份作为循环变量,求指定年之前的每年的天数累加和

{

if (runYear(year))//如果指定年份前的某一年为闰年则执行totalDay = totalDay + 366;//否则执行totalDay = totalDay + 365;

totalDay = totalDay + 366;

else

totalDay = totalDay + 365;

}

if (runYear(currentDay.year))//判断指定年是否为闰年,若是则该年2月加一天

perMonth[2] += 1;//是闰年则2月加一天为29天

for (i = 0; i < currentDay.month; i++)//将本年内的天数累加到totalDay

totalDay += perMonth[i];//计算指定日期到指定日期年初的天数,a+=b;含义同a=a+b;赋值运算将右运算结果赋给左变量

totalDay += currentDay.day;//将本月的天数累加到totalDay

return totalDay;//返回totalDay的值

}