问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。(c++语言)
解题思路
1.建立一个时间类Time,并公有输入日期的函数、判断日期规范性并显示结果的函数;
2.给函数定义,输入日期、判断日期是否规范(年是否小于2010,月份是否正常,日是否可以对应在闰年/平年的相应月份天数的范围内)、计算自2010年1月1日到输入日期经过的总天数、总天数%5取余(三天为打鱼,两天为晒网,一个周期时间为五天);
3.输出结果,若余数为“1、2、3”,则输出“今天打鱼”,余数为“4、5”,则输出“今天晒网”。
流程图
代码
#include<iostream>
#include<fstream>
using namespace std;
class Time //时间类
{
private:
int year; //年
int month; //月
int day; //日
public:
Time(int,int,int); //构造函数
void set(); //输入日期函数
void display(); //输出计算结果的函数
};
//构造函数
Time::Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
//输入日期函数
void Time::set()
{
cin>>year>>month>>day;
}
//显示计算自2010 01 01经过的总天数结果的函数
void Time::display()
{
int Day=0; //自2010 01 01经过的天数
int day1=0; //从2010年开始,今年为止,一共多少天
int day2=0; //本年开始,本月为止,一共多少天
int day3=0; //自本月起,本天为止,一共多少天
int a=year-2010;
int b=month-1;
int d;
int m1[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年相对应的月份数组
int m2[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年相对应的月份数组
//判断输入的年份是否正确
if(year<2010)
{
printf("您输入的年份错误,请重新输入!");
}
//判断输入的月份是否正确
else if(month<1||month>12)
{
printf("您输入的月份错误,请重新输入!");
}
//判断输入的日期是否可以对应相应月份
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //判断天数为31的月份
{
if(day>31||day<1)
{
printf("您输入的日期错误,请重新输入!");
}
}
else if(month==4||month==6||month==9||month==11) //判断天数为30的月份
{
if(day>30||day<1)
{
printf("您输入的日期错误,请重新输入!");
}
}
else if(month==2) //判断二月
{
if((year%4==0&&year%100!=0)||year%400==0)
{
if(day>29||day<1)
{
printf("您输入的日期错误!当前年份为闰年,二月不能超过29天!\n");
}
}
else
{
if(day>28||day<1)
{
printf("您输入的日期错误!当前年份为闰年,二月不能超过28天!\n");
}
}
}
else
{
//计算从2010年开始,今年为止,一共多少天
for(int j=0;j<a;j++)
{
if(((2010+j)%4==0&&(2010+j)%100!=0)||(2010+j)%400==0)
{
day1+=366;
}
else
{
day1+=365;
}
}
//计算本年开始,本月为止,一共多少天
for(int p=0;p<b;p++)
{
if(((year%4==0&&year%100!=0)||year%400==0))
{
day2+=m1[p]; //如果是闰年,月份采用第一个月份数组
}
else
{
day2+=m2[p]; //如果是平年,月份采用第二个月份数组
}
}
day3=day;
Day=day1+day2+day3; //计算总天数
d=Day%5; //总天数取余
}
if(d>=1&&d<=3)
{
cout<<"今天打渔"<<endl;
}
else
{
cout<<"今天晒网"<<endl;
}
}
//主函数
int main()
{
int year;
int month;
int day;
int date;
ifstream fin("in.txt");
ofstream fout;
fout.open("out.txt");
while(!fin.eof())
{
fin>>date;
year=date/10000;
month=(date%10000)/100;
day=date%100;
cout<<"请输入年 月 日\n注意:起始时间2010年1月1日\n格式:2010 1 1\n"<<endl;
Time time(0,0,0);
time.set(); //输入
time.display(); //计算总天数
fin.close();
fout.close();
}
return 0;
}
运行结果图
学习心得
程序设计,首先要有一个清晰的思路,知道自己为什么要这么设计,然后有明确的编程步骤,最后完成设计及调试测试成功。
通过本次的课题设计,学会了用新的软件visio画流程图,对之前不大牢固的程序设计基础有了一定的提高,在本程序中用到了if,else,else if等相应的语句,一些基础算法等,成功应用到实际问题中并解决问题。之前基础一般,所以在用程序解决实际应用问题是一个弱项,但这次课题设计让我对于用程序解决实际应用问题的功能和实用性、严密性、和对程序的编写都有了深刻的体会。
但是文件的输入输出代码还是有问题,没有正常显示,希望之后可以努力攻克这个环节。