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

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

基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。

提高要求:1.输入数据的正确性验证。

                  2.使用文件进行数据测试。如将日期 20100101   20111214  等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。

1、问题分析

本题可以分为三个步骤进行解题:

1)计算指定日期到2010年1月1日相差的天数;

2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;

3)根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”,否则  是在“晒网”。

在这三步中,最关键的是第一步。计算相差的天数要判断很多东西,每个月的天数的不同,是否有闰年都要考虑进去。

2、程序框图

三天打鱼两天晒网(C语言实现)_第1张图片

3、调试

编译单个文件...

--------

- 文件名: C:\Users\mi\Desktop\程序设计方法\try\三天两天.cpp

- 编译器名: TDM-GCC 4.9.2 64-bit Release

 

处理 C++ 源文件...

--------

- C++ 编译器: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++.exe

- 命令: g++.exe "C:\Users\mi\Desktop\程序设计方法\try\三天两天.cpp" -o "C:\Users\mi\Desktop\程序设计方法\try\三天两天.exe" -std=c++11 -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc

 

编译结果...

--------

- 错误: 0

- 警告: 0

- 输出文件名: C:\Users\mi\Desktop\程序设计方法\try\三天两天.exe

- 输出大小: 129.69921875 KiB

- 编译时间: 0.45s

4、程序测试

1)闰年测试

三天打鱼两天晒网(C语言实现)_第2张图片

2)日期正确性测试

三天打鱼两天晒网(C语言实现)_第3张图片

5、程序代码

/********************************************************************

 * Copyright (C), 2019, Alon Yan,[email protected]

 * File name: 三天打鱼两天晒网.c

 * Author: Alon Yan    Version:2019030101     Date: 20190301

 * Description:  本程序用于解决某人从2010年1月1日起开始"三天打鱼两天晒网",这个人在以后的某一天中是"打鱼"还是"晒网" 的问题。输入2010年1月1日后的某一个日期 ,程序输出在这一天此人是“打鱼”还是“晒网”。  

 * Function List:

    1. leapyear(): 判断闰年函数。若该年是闰年则返回"1",若不是闰年则返回"0"。

    2. validate(): 验证日期正确性函数。 判断输入的日期是否是正常的并在2010年1月1日之后。          

    3. totaldays(): 计算天数函数。计算出指定日期到2010年1月1日的总天数。               

 * History:

    1. Date: 2019/3/1

     Author: Alon Yan

       Modification: 补充程序的若干注释。

********************************************************************/

#include

struct date{      //创建日期结构体

    int year;

    int month;

    int day;

};

int leapyear(int year);                //声明判断闰年函数

int validate(struct date currentDay);  //声明日期验证函数

int totaldays(struct date currentDate);   //声明计算天数函数

 

int main(void)

{

    struct date currentDay;

    int count;

    validate(currentDay);              //验证日期正确性

    count=totaldays(currentDay);       //求出指定日期      

    if(count%5>0&&count%5<4)        //判断指定日期使打鱼还是晒网

       printf("He was fishing at that day.\n");

    else

       printf("He was sleeping at that day.\n");

}

/********************************************************************

 Function:       leapyear()判断闰年函数。

 Description:    判断输入参数是否是闰年。

 Calls:          无

 CalledBy:       validate()、 totaldays()

 Input:          year:需要函数判断的年份。

 Return:         若该年是闰年则返回"1",若不是闰年则返回"0"。

********************************************************************/

/*判断闰年函数*/

int leapyear(int year)

{

    if((year%4==0&&year%100!=0)||(year%400==0))

       return 1;

    else

       return 0;

 }

/***************************************************************************

 Function:       validate() 验证日期函数。

 Description: 判断输入的日期是否是正常的并在2010年

               1月1日之后。         

 Calls:          leapyear()

 CalledBy:       main()

 Input:          currentDay:通过scanf获取指定日期,判断是否是合法的日期。

********************************************************************/

/*日期验证函数*/

int validate(struct date currentDay)

{

    int flag = 0;

    while(!flag) {

    printf("Please input appoint year/month/day.Note that  input the date after 2010.\n");

    scanf("%d%d%d",¤tDay.year,¤tDay.month,¤tDay.day);    //输入指定日期

    if(currentDay.year<2010)        //判断日期输入是否正确

       {printf("Please input right year!\n"); continue;}

    if(currentDay.month<1||currentDay.month>12)

       {printf("Please input right month!\n"); continue;}

    if(currentDay.month==2)            //对2月的天数进行判断

    {

       if(leapyear(currentDay.year))

           {

              if(currentDay.day<0||currentDay.day>29)

                  {printf("Please input right day!\n"); continue;}

           }

       else

           {

              if(currentDay.day<0||currentDay.day>28)

                  {printf("Please input right day!\n"); continue;}

           }

     }

    if(currentDay.day<0||currentDay.day>31)          //对其它月份的天数进行判断

       {printf("Please input right day!\n"); continue;}

       flag = 1;

    }

 }

/********************************************************************

 Function:       totaldays()计算天数函数。

 Description:    计算出指定日期到2010年1月1日的总天数

 Calls:          leapyear()

 CalledBy:       main()

 Input:          currentDate:输入指定日期

 Return:         指定日期到2010年1月1日的天数

********************************************************************/

/*计算天数函数*/

int totaldays(struct date currentDate)

{

    int Emonth[13]={0,31,28,31,30,31,30,31,31,30,31,30};

    int count=0,year,month;

    for(year=2010;year

    {

       if(leapyear(year))   /*判断是否闰年*/

           count=count+366;

       else

           count=count+365;

    }

    if(leapyear(currentDate.year))

       Emonth[2]=29;

    for(month=1;month<=currentDate.month;month++)

       count=count+currentDate.day;

       return count;

}

6、学习心得

在进行本题的设计过程中,我又重新复习了一遍C语言的相关语法,除了基本的循环结构还有文件读写。本题中最核心的部分莫过于计算指定日期到2010年1月1日的总天数这一个环节了,在考虑了多个算法之后,最终选定了源代码中呈现的算法。这个过程也学习到了很多。提高要求由于个人能力和时间关系尚未完成,待完成之后会进行更新。

你可能感兴趣的:(三天打鱼两天晒网(C语言实现))