我是靠谱客的博主 寂寞绿茶,最近开发中收集的这篇文章主要介绍三天打鱼两天晒网(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、程序框图

3、调试

编译单个文件...

--------

- 文件名: C:UsersmiDesktop程序设计方法try三天两天.cpp

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

 

处理 C++ 源文件...

--------

- C++ 编译器: C:Program Files (x86)Dev-CppMinGW64bing++.exe

- 命令: g++.exe "C:UsersmiDesktop程序设计方法try三天两天.cpp" -o "C:UsersmiDesktop程序设计方法try三天两天.exe" -std=c++11 -I"C:Program Files (x86)Dev-CppMinGW64include" -I"C:Program Files (x86)Dev-CppMinGW64x86_64-w64-mingw32include" -I"C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2include" -I"C:Program Files (x86)Dev-CppMinGW64libgccx86_64-w64-mingw324.9.2includec++" -L"C:Program Files (x86)Dev-CppMinGW64lib" -L"C:Program Files (x86)Dev-CppMinGW64x86_64-w64-mingw32lib" -static-libgcc

 

编译结果...

--------

- 错误: 0

- 警告: 0

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

- 输出大小: 129.69921875 KiB

- 编译时间: 0.45s

4、程序测试

1)闰年测试

2)日期正确性测试

5、程序代码

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

 * Copyright (C), 2019, Alon Yan,1366480684@qq.com

 * 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 <stdio.h>

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",&currentDay.year,&currentDay.month,&currentDay.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<currentDate.year;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语言实现)的全部内容,希望文章能够帮你解决三天打鱼两天晒网(C语言实现)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部