三天打渔两天晒网(C语言实现)

时间:2024-04-09 13:00:46
  1. 问题描述

    中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。

  2. 问题分析与算法设计 

    根据题意可以将解题步骤分为以下几步:

    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   平年;

                                                                                                                                                                 
  3. 具体代码实现                                                                                                                                                                                 
    # 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函数*/
    }
    
    
    
    
    
    
    
  4. 程序设计流程图                                                                                                                                                                                                         三天打渔两天晒网(C语言实现)
  5.  

    心得体会    虽然这是一个简单的判断键入日期是“打渔”还是“晒网”的程序,但是在具体的程序设计和编写过程中我还是遇到了很多的问题。比如说在如何正确判断用户键入的日期是否合法这一问题上我就遇到了困难,刚开始尝试了用多个if语句的嵌套来解决可是还是有漏洞,经过与同学沟通交流最终用while循环和多个if的嵌套解决了问题。这一次程序设计我从中学到了很多,也成长了很多。ps:由于自身能力原因,程序中可能存在着错误和漏洞,悉望大家可以批评指正、不吝赐教。