- 问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
- 问题分析与算法设计
根据题意可以将解题步骤分为以下几步:
1)用户键入日期,判断输入日期是否合法;
2)若合法计算从2010年1月1日至输入日期经过的总天数sum,若不合法继续步骤1);
3)由于“打渔”和“晒网”的周期为5天,则可以通过总天数sum对5取余后的余数x判断“打渔”还是“晒网”;
若 余数为1,2,3 打渔
否则 晒网
说明:该问题中计算总天数sum时涉及对闰年和平年的判断问题
if((year%4==0 && year%100!=0) || (year%400==0)) 闰年;
else 平年;
- 具体代码实现
# include <stdio.h> struct date { int year; int month; int day; }; /*定义结构体类型 */ void Days(struct date days) { int sum = 0; /* 记录输入日期距2010年1月1日的总天数 */ int sum1 = 0; /* 记录所输日期那一年已经过的天数 */ switch(days.month-1) { case 11: sum1+=30; case 10: sum1+=31; case 9: sum1+=30; case 8: sum1+=31; case 7: sum1+=31; case 6: sum1+=30; case 5: sum1+=31; case 4: sum1+=30; case 3: sum1+=31; case 2: if((days.year%4==0 && days.year%100!=0) || days.year%400==0) sum1+=29; /* 闰年二月有29天 */ else sum1+=28; /* 平年二月有28天 */ case 1: sum1+=31; } sum1+=days.day; if(days.year==2010) sum = sum1-1; else if(days.year>2010) { int sum2 = 365; /* 计算从2010年1月1日起这一年所剩余的天数 */ int sum3 = 0; /* 记录从2010年到所输入年之间的整数年的天数 */ int i; for(i = 2010; i<days.year-1; i++) if((days.year%4==0 && days.year%100!=0) || days.year%400==0) sum3+=366; /* 闰年有366天 */ else sum3+=365; /* 平年有365天 */ sum = sum1+sum2+sum3; } int x = sum%5; /* 通过总天数sum对5取余的余数来判断打渔还是晒网 */ if(x>0 && x<4) printf("今天打渔!\n"); /* 若总天数sum对5取余的值为1、2、3时,则打渔 */ else printf("今天晒网!\n"); /* 若总天数sum对5取余的值为0、4时,则晒网 */ } void main(void) { struct date days; /* 定义结构体类型变量days */ printf("从2010年1月1日起,请输入年、月、日。如:2017、9、11 \n"); scanf("%d、%d、%d", &days.year, &days.month, &days.day); /* 输入要判断的具体日期 */ int L = (days.year%4==0 && days.year%100!=0 || days.year%400==0); /* L==1为闰年, L==0为平年 */ while(days.year<2010 || days.month>12 || days.day>31) { if(days.month==2) if(((L==1) && (days.day>29)) || ((L!=1) && (days.day>28))) { printf("您的输入不合法,请重新输入!\n"); scanf("%d、%d、%d", &days.year, &days.month, &days.day); } else break; else { printf("您的输入不合法,请重新输入!\n"); scanf("%d、%d、%d", &days.year, &days.month, &days.day); } } /* while循环判断所输入的日期是否合法 */ Days(days); /* 调用Days函数*/ }
- 程序设计流程图
-