三天打渔两天晒网
一.内容:
二.步骤:
1、算法分析
2、概要设计(包括数据结构及算法绘制流程图或伪代码表示)
3、测试(设计测试用例或测试代码的设计与实现,测试结果截屏))
4、调试(对测试出的问题进行调试,界面截屏,调试修正编码)
5、代码的实现
三.心得体会(关键问题的解决思路及步骤总结)
一. 内容
中国有句俗语叫“三天打渔两天晒网”。某人从2010年1月1日起开始“三天打渔两天晒网”,问这个人在以后的某一天中是“打渔”还是“晒网”。用C++语言实现程序解决问题。
二.步骤
1、算法分析
利用C++面对对象程序设计的方法,分为年(year)、月(month)、日(day)三个部分,首先要判断年份是闰年还是平年,之后分别对年、月、日进行输入正确性的判断,若不正确用while循环进行再次输入,并注意日的输入应先判断输入年份是闰年还是平年以确定本年二月是29天还是28天。利用PrintTime()函数输出所输入的日期,并将输入的数据保存在in.txt文件中。利用PrintDay()函数输出输入的年份距2010年1月1日的天数。利用panduan()函数判断他是在打渔还是在晒网。
2、概要设计
3、测试
4、调试
5、代码的实现
// Text1
//
// Created by Lk on 2021/3/21.
//
#include <iostream>
#include<fstream>
using namespace std;
class Time //定义Time类
{
public: //公有函数
Time(){}; //无参构造函数
void set_Year(); //设置年
void set_Month(); //设置月
void set_Day(); //设置日
int get_Year(); //获取年
int get_Month(); //获取月
int get_Day(); //获取日
void n(int); //年相加的函数
void n1(int); //月相加的函数
void n2(int); //日相加的函数
void panduan(); //判断指定日他是否在打渔的函数
void PrintTime(); //输出日期的函数
void PrintDay(); //输出天数
private: //私有函数
int year; //年
int month; //月
int day; //日
int z; //天数
};
void Time::set_Year(){ //类外定义设置年,并确定年输入的正确性
cin>>year;
while(year<2010) //判断指定年是否大于2010年
{
cout<<"年份应大于2010年,年份输入错误,请重新输入!"<<endl;
cin>>year;
}
}
void Time::set_Month(){ //类外定义设置月,并确定月输入的正确性
cin>>month;
while(month<=0||month>12)
{
cout<<"月份应在1-12月选择,月份输入错误,请重新输入!"<<endl;
cin>>month;
}
}
void Time::set_Day(){ //类外定义设置日,并判断日输入的正确性
cin>>day;
if((year%4==0&&year%100!=0)||year%400==0) //判断指定年是否是闰年
{
if(month==2) //闰年的二月有29天
while(day>29||day<=0)
{
cout<<"本年是闰年二月共有29天,天数输入错误,请重新输入!"<<endl;
cin>>day;
}
}else
{
if(month==2) //平年的二月有28天
while(day>28||day<=0)
{
cout<<"本年是平年二月共有28天,天数输入错误,请重新输入!"<<endl;
cin>>day;
}
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //1、3、5、7、8、10、12月有31天
while(day>31||day<=0)
{
cout<<"1、3、5、7、8、10、12月每月共有31天,天数输入错误,请重新输入!"<<endl;
cin>>day;
}
if(month==4||month==6||month==9||month==11) //4、6、9、11月有30天
while(day>30||day<=0)
{
cout<<"4、6、9、11月每月共有30天,天数输入错误,请重新输入!"<<endl;
cin>>day;
}
}
int Time::get_Year(){return year;} //类外定义获取年
int Time::get_Month(){return month;} //类外定义获取月
int Time::get_Day(){return day;} //类外定义获取日
void Time::n(int year){ //计算指定年的前一年到2010年的天数
for(int i = 2010;i<year;i++)
{
if((year%4==0&&year%100!=0)||year%400==0) //判断year为闰年还是平年
{
z+=366; //year为闰年
}else
{
z+=365; //year为平年
}
}
}
void Time::n1(int month){ //计算由本年一月到指定月的天数(不算指定月当月的日)与年总天数相加
static int V[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31,},
{0,31,29,31,30,31,30,31,31,30,31,30,31,},}; //用数组定义平年与闰年每个月的天数
if((year%4==0&&year%100!=0)||year%400==0) //判断指定年是否为闰年
{
for(int i=1;i<month;i++)
{
z = z+V[1][i]; //指定年为闰年
}
}else
{
for(int i=1;i<month;i++)
{
z = z+V[0][i]; //指定年为平年
}
}
}
void Time::n2(int day){ //计算指定月中日的天数与年、月总天数相加
z+=day;
}
void Time::PrintDay(){
cout<<"距2010年1月1日有"<< z <<"天"<<endl; //输出指定日期到2010年1月1日的总天数
}
void Time::PrintTime(){
ofstream f1;
cout<<"今天是"<<get_Year()<<"年"<<get_Month()<<"月"<<get_Day()<<"日"<<endl; //输出XX年XX月XX日
f1.open("/Users/liukai/Desktop/程序设计/第一次作业//Text1\\in.txt",ios::out); //创建in.txt保存输入的日期
f1<<get_Year()<<"年"<<get_Month()<<"月"<<get_Day()<<"日";
f1.close();
}
void Time::panduan(){ //判断是否在打渔
int q = z%5;
ofstream f2("/Users/liukai/Desktop/程序设计/第一次作业//Text1\\out.txt",ios::out); //创建out.txt输出的判定结果
if(q<4&&q>0) //判断q是否为1、2、3
{
cout<<"今天他在打渔"<<endl; //q为1、2、3
f2<<"今天他在打渔";
}else
{
cout<<"今天他在晒网"<<endl; //q不为1、2、3
f2<<"今天他在晒网";
}
f2.close();
}
int main()
{
Time t; //定义一个对象t
cout<<"请输入日期的年:"<<endl;
t.set_Year(); //给对象t设置年
cout<<"请输入日期的月:"<<endl;
t.set_Month(); //给对象t设置月
cout<<"请输入日期的日:"<<endl;
t.set_Day(); //给对象t设置月
t.PrintTime();
t.n(t.get_Year()); //计算XX-1年到2010年的天数
t.n1(t.get_Month()); //计算XX年一月到指定月的天数并与年天数相加
t.n2(t.get_Day()); //计算指定月中日的天数并与年、月天数相加
t.PrintDay();
t.panduan(); //判断XX年XX月XX日他是否在打渔
}
三.心得体会
通过此次作业,再次对C++面对对象程序设计和文件的保存进行了二次学习。在编写判断年月日输入正确性的部分时,我先是用了if语句判断若是输入错误就直接退出程序,这样显得程序设计的很不灵活,之后我又想到了用while语句可以解决这个问题,而且还可以保证可以多次输入错误知道正确输入。同时学到了用二维数组来定义闰年和平年每个月的天数,极大的提高了程序运行的效率。同时我也认识到我还是对算法还是不够熟练,不能够灵活运用,还需要多学多练。