*****三天打鱼两天晒网****
//
//作者信息:徐甜新 软件工程1602班 16408070105
//创建时间: 2018/8/31
//主要功能:根据某人从2010年1月1日起开始“三天打鱼两天晒网”,在输入时判断输入是否有效,输出从这天起到特定的某一天共经历的总天数,
//并且实现对这个人在以后的某一天是打鱼还是晒网进行计算,完善用户选择系统,使运行界面更友好、人性化
//
//**************************
#include<stdio.h>
bool isRight(int year,int month,int day){
if (year<2010) //判断输入年份的正确性
{
printf("输入年份过小,请重新输入:\n");
return false;
}
else if (month<1||month>12) //判断输入月份的正确性
{
printf("输入月份错误,请重新输入:\n");
return false;
}
else if ((month=1||3||5||7||8||10||12)&&(day>31||day<1)) //当月份为1.3.5.7.8.10.12时,天数不超过31天
{
printf("输入天数错误,请重新输入:\n");
return false;
}
else if ((month=4||6||9||11)&&(day>30||day<1)) //当月份为4.6.9.11时, 天数不超过30天
{
printf("输入天数错误,请重新输入:\n");
return false;
}
else if (((year%4==0 && year%100!=0)||year%400==0)&&(month=2)&&(day>29||day<1)) //当闰年二月天数不超过29天
{
printf("输入天数错误,请重新输入:\n");
return false;
}
else if ((year%4!=0)&&(month=2)&&(day>28||day<1)) //平年二月天数不超过28天
{
printf("输入天数错误,请重新输入:\n");
return false;
}
else
return true;
}
int main()
{
int year,month,day,y,days=0,select=1; //设置变量的初始值
int num[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //每个月份的天数
while (select)
{
printf("**************三天打鱼两天晒网**************\n");
printf("请输入所查询的年月日(空格键隔开):\n");
scanf("%d%d%d",&year,&month,&day);
while(!isRight(year,month,day))
{ scanf("%d%d%d",&year,&month,&day);
}
if(year%400==0||(year%4==0 && year%100!=0)) // 判断该年是否为闰年在二月基础加一天
num[2]+=1; //闰年在二月基础加一天
for(y=2010;y<year;y++) //将年之差换算成天数
{
if(y%400==0||(y%4==0 && y%100!=0))
days+=366;
else
days+=365;
}
for(y=1;y<month;y++) //将月之差换算成天数
{
days+=num[y];
}
days+=day; //将该月天数加上去
printf("\n从2010年1月1日起到%d年%d月%d日共经过了%d天\n\n",year,month,day,days);
if(days%5==1||days%5==2||days%5==3) //用计算出的总天数除以5,求模, 判断打鱼还是晒网
printf("%d年%d月%d日他在打鱼\n\n",year,month,day);
else
printf("%d年%d月%d日他在晒网\n\n",year,month,day);
printf("\n继续请选1,退出请选0:"); //选择完善
scanf("%d",&select);
if(select==0)
return 0;
}
return 0;
}
2程序流程图
3运行界面
1、初始运行界面如下图:
2、输入错误的年月份测试运行界面如下图:
测试平年闰年二月天数
3、输入正确的日期计算结果及界面如下图:
4、完善选择运行界面如下图:
5程序调试过程
3 个人心得体会
这次作业是“三天打鱼两天晒网”,主要实现了计算从某一天开始到需要知道的日期中,该人是在打鱼还是晒网,并识别错误日期的输入,输出。
在这次作业中主要遇到的难题是判断年份是否为闰年和总天数的计算。要计算指定日期到2010年的天数,首先要搞清楚每一月有几天,当闰年时2月的天数也不同,因此要判断指定日期是否是闰年和月份。
如果指定日期是2010以后的日期,用364+到指定日期前一年经过的天数+指定日期当年的经过的天数。
在写程序的过程中我遇到了一个难题,输入错误的年月日会提示错误,重新输入一个错误的年份却不会提示错误,而显示的是从2010年1月1日到第一个错误年月之间的天数,例如输入2009年8月9日,会提示错误,重新输入2010年12月2日则会显示从2010年1月1日到2009年8月9日经历了多少天,我仔细看了看代码还是没发现错误,后来知道是第二次输入的值没有赋值到年月日上,最终我修改了代码用一个循环判断输入数据的正确性,若正确则跳出循环,错误则继续赋值,从而得到了正确的结果。
通过编写程序发现我在编程过程中细心程度不够,会出现小错误,在以后的学习过程中应该养成好的编程习惯。还有从最初的一个简单的程序,通过自己的努力慢慢调试完善修改,得到最后成果,虽然还有不足,但是这个过程我享受到了收获的感觉。