三天打鱼,两天晒网
内容: 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。我用C语言实现程序解决问题。
1.算法分析
(1).计算从某日期至开始时间2010.1.1共有多少天;
(2).由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
(3).根据余数判断他是在“打鱼”还是在“晒网”,若余数为1,2,3,则他是在“打鱼”,否则 是在“晒网”。
2. 概要设计
2.代码
#include <stdio.h>
#include <stdlib.h>
#define YEAR 2010 //宏定义初始年月日
#define MONTH 1
#define DAY 1
int Input(); //录入数据并判断是否合法
int Days(int, int, int); //求期间的天数,参数为年月日
int Days(int year, int month, int day)
{
int days = 0; //期间共有多少天
int days_tmp = 0; //不满一年的整月天数
int ping_nian[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int run_nian[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int i = 0;
int j = 0;
for(i = YEAR; i <= year; i++) //遍历每一年
{
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) //判断闰年
{
if((year - i) != 0) //判断是否为完整的一年
days += 366;
else
{
for(j = 0; j < month - MONTH; j++)
days_tmp += run_nian[j];
days += days_tmp + day;
}
}
else
{
if((year - i) != 0) //判断是否为完整的一年
days += 365;
else
{
for(j = 0; j < month - MONTH; j++)
days_tmp += ping_nian[j];
days += days_tmp + day;
}
}
}
return days;
}
int Input()
{
int days = 0, //从始至终的总天数
year = 0,
month = 0,
day = 0;
int num = 0;
printf("\t输入一个2010年包括1月1日之后的日期\n\n");
printf("输入年月日:");
while(1) //录入数据并判断是否合法
{
scanf("%d.%d.%d", &year, &month, &day);
if(year >= YEAR && month >= 1 && month <= 12) //判断年月
{
if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
{
if(day >= 1 && day <= 31) //大月天数是否合法
break;
else
{
printf("不存在该日期,请重新输出:");
fflush(stdin); //清空缓存区
}
}
else if(month == 2) //2月天数是否合法
{
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //闰年
{
if(day >= 1 && day <= 29)
break;
else
{
printf("不存在该日期,请重新输出:");
fflush(stdin);
}
}
else
{
if(day >= 1 && day <= 28)
break;
else
{
printf("不存在该日期,请重新输出:");
fflush(stdin);
}
}
}
else if(day >= 1 && day <= 30) //小月天数是否合法
break;
else
{
printf("不存在该日期,请重新输出:");
fflush(stdin);
}
}
else
{
printf("不存在该日期,请重新输出:");
fflush(stdin);
}
}
days = Days(year, month, day); //调用求天数的函数
return days; //返回天数
}
int main()
{
int days = 0; //从始至终的总天数
days = Input(); //调用函数
printf("这是第%d天\n", days);
if((days % 5 == 4) || (days % 5 == 0)) //利用取余判断打鱼还是晒网
printf("这一天晒网\n");
else
printf("这一天打鱼\n");
return 0;
}
3. 测试及调试
(1).建立月份天数,闰年平年的天数并返回到2010.1.1的天数
(2).判断是否存在该天数
(3).主函数(判断打鱼还是晒网)
(4).界面
(5). 输入平年的2月29日,不存在该日期
(6). 输入2010年之前的日期或者不存在该月份的日期
(7).打鱼天和晒网天
(8).闰年的2月29日
4.心得体会
通过这个题目能够让自己理性且有序的完成作业,思路很重要,没有思路只打代码的话往往半途而废,做不下去,只有在之前把思路设计好,才能更好的完成任务。其次是也复习了大一学习的C语言知识,感觉对java提供了一点点的小看法,使得在学习路上更加轻松。