概述
中国有句俗语叫“三天打鱼两天晒网”。某人从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",¤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<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语言实现)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复