两天晒网(C语言实现)"/>
三天打渔两天晒网(C语言实现)
- 问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从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天 */elsesum1+=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天 */elsesum3+=365; /* 平年有365天 */sum = sum1+sum2+sum3;}int x = sum%5; /* 通过总天数sum对5取余的余数来判断打渔还是晒网 */if(x>0 && x<4)printf("今天打渔!\n"); /* 若总天数sum对5取余的值为1、2、3时,则打渔 */elseprintf("今天晒网!\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);}elsebreak;else{printf("您的输入不合法,请重新输入!\n");scanf("%d、%d、%d", &days.year, &days.month, &days.day);} } /* while循环判断所输入的日期是否合法 */Days(days); /* 调用Days函数*/ }
- 程序设计流程图
-
更多推荐
三天打渔两天晒网(C语言实现)
发布评论