万年历实验报告

河南城建学院

《C++语言程序设计》课程设计说明书

设计题目:           万年历            

    业:      计算机科学与技术     

    级:         0814132           

设计人员:  张宁博、杨文利、郭秀丽   

指导教师:  张星  魏新红  张芳芳     

计算机科学与工程学院

20## 1 5


一、 课程设计目的及要求

1、         设计目的

掌握一种编程工具和面向程序设计的基本思想和方法,培养我们的综合利用某种语言进行程序设计的能力、利用系统提供的功能进行创新设计的能力以及充分利用计算机的功能和特点分析实际问题及解决实际问题的能力。

我认为,这个课程设计的目的不是为了单独的课堂学习,而是要让我们掌握程序的基本思想及方法。一方面,在课程设计过程中,可以进行一对一的辅导,还能对所学的知识得到运用,更重要的是可以让我们对“面向对象”有一个更为清楚地认识、了解和掌握。

2、         设计具体内容及要求

设计一个日期类“Date”,包括年、月、日等私有数据成员。要求实现日期的基本运算,如一日期加上天数、减去天数、两日期相差的天数等(假定输入日期数据是合法的,考虑闰年的情况)。

在Date类中设计如下重载运算符函数:

Date operator-(int days);返回一日起减去天数得到的日期。

int operator-(Date &b);返回两日期相差的天数。

void displayMonth (Date &b);显示指定日期所在的月历,美观。

void displayYear(Date &b);显示指定日期所在的年历,美观。

在实现这些重载运算符函数调用一下私有成员函数:

leap(int);判断指定的年份是否是闰年。

dton(Date &);转换指定日期为从0年0月0日起的天数

数据成员为:int year, month , day;

按照如上的设计要求,做一个面向对象的设计完成所要求的操作。

二、 类的声明和涉及的函数

1、类的声明

class Date{

public:

   Date(){};

   Date(int newyear,int newmonth,int newday):

year(newyear),month(newmonth),day(newday){}

Date operator+(int days);

   Date operator-(int days);

int operator-(Date &c);

void displayMonth();

   void displayYear();

   void display()

    {cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;}

private:

    int year,month,day;

   int leap(int year0);

   int dton();};

2、   涉及的函数

1)、函数

  void menu();

  void goback();

  void adddays();

  void resucedays();

  void apartdate();

  void display1();

  void display2();

  int main();

三、主要流程图

 

四、运行及调试结果

1、   各步运行结果截图与说明

计算日期减天数      

输入当前日期,输入要减去的天数,即可显示得到的新的日期。

计算日期加天数

输入当前日期,输入要加上的天数,即可显示得到的新的日期。

计算两日期相差的天数

分别输入两个日期,按回车键,即可显示两日期相差的天数。

显示月历

输入要显示的月历的年份和月份,按回车键,即可显示该年该月的月历。

显示年历

输入要显示的年历的年份,按回车键,即可显示该年的年历。

2、   调试及解决问题

五、小结及感悟

六、源程序

# include<iostream>

# include<cmath>

# include<iomanip>

# include<stdlib.h>

using namespace std;

namespace{

const int DAYS_BEFORE_MONTH[]=

{0,31,59,90,120,151,181,212,243,273,304,334};//存储平年中的某个月1日之前有多少天。

}

void menu(){

cout<<"             欢迎进入万年历系统"<<endl;

cout<<"**********************************************"<<endl;

cout<<"                  万年历"<<endl;

cout<<"**********************************************"<<endl;

cout<<"1.计算日期减天数              2.计算日期加天数"<<endl;

cout<<"3.计算两日期相差的天数        4.显示月历"<<endl;

cout<<"5.显示年历                    0.退出程序"<<endl;

cout<<"**********************************************"<<endl;

cout<<"请输入您的选择:";

}

void goback()

{

getchar();

cout<<endl<<endl;

cout<<"按回车键返回主菜单"<<endl;

getchar();

system("cls");

menu();

}

class Date{

public:

Date(){};//无参的构造函数

Date(int newyear,int newmonth,int newday):

year(newyear),month(newmonth),day(newday){}

Date operator+(int days);

Date operator-(int days);

int operator-(Date &c);

void displayMonth();

       void displayYear();

void display()

    {cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl; }

private:

int year,month,day;

int leap(int year0);

int dton();

};

int Date::leap(int year0){

if((year0%4==0&&year0%100!=0)||year0%400==0)

    return 1;

else return 0;

}

int Date::dton(){

int days;

int years=year-1;

days=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTH[month-1]+day;

if(leap(year)==1&&month>2)days++;//考虑闰年时,若月份大于2,都加一天。

return days;

}

Date Date::operator+(int days){

while(days!=0){

    day++;

if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&days>31){

        month+=1;

        day=1;

    }

    else if(month==2&&leap(year)==1&&day>29){

        month+=1;

        day=1;

    }

    else if(month==2&&leap(year)==0&&day>28){

        month+=1;

        day=1;

    }

    else if(day>30){

        month+=1;

        day=1;

    }

    if(month>12){

        year+=1;

        month=1;

    }

    days--;

}

Date r;

r.year=year;

r.month=month;

r.day=day;

return r;

}

Date Date::operator-(int days){

while(days!=0){

    day--;

    if(day==0){

        month-=1;

    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){

           day=31;

        }

        else if(month==2&&leap(year)==1){

           day=29;

        }

        else if(month==2&&leap(year)==0){

        day=28;

        }

        else day=30;

    }

    if(month==0){

        year-=1;

        month=12;

        day=31;

    }

    days--;

}

Date a;

a.year=year;

a.month=month;

a.day=day;

return a;

}

int Date::operator-(Date &c){

return abs(dton()-c.dton());

}

void adddays(){

cout<<"*********************"<<endl;

cout<<"   欢迎进入时光机"<<endl;

cout<<"*********************"<<endl;

int year,month,day,days;

cout<<"请输入当前日期:";

cin>>year>>month>>day;

cout<<"请输入天数:";

cin>>days;

Date date(year,month,day);

date=date+days;

cout<<"时光机穿梭到:";

date.display();

}

void reducedays(){

int year,month,day,days;

cout<<"请输入日期:";

cin>>year>>month>>day;

cout<<"请输入天数:";

cin>>days;

Date date(year,month,day);

date=date-days;

cout<<year<<"年"<<month<<"月"<<day<<"日-"<<days<<"天-->";

date.display();

}

void apartdate(){

int year1,year2,month1,month2,day1,day2,days;

cout<<"请输入第一个日期:";

cin>>year1>>month1>>day1;

cout<<"请输入第二个日期:";

cin>>year2>>month2>>day2;

Date date1(year1,month1,day1);

Date date2(year2,month2,day2);

days=date2-date1;

cout<<"两日期相减的天数是:"<<days<<endl;

}

void Date::displayMonth(){

int i,j,monthdays;

int w=0;

w=dton()%7;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)

    monthdays=31;

else if(leap(year)==1&&month==2)

    monthdays=29;

else if(leap(year)==0&&month==2)

    monthdays=28;

else monthdays=30;

cout<<"   "<<year<<"年"<<"               "<<month<<"月"<<endl;

cout<<"--------------------------------"<<endl;

cout<<setw(4)<<"日"<<setw(4)<<"一"<<setw(4)<<"二"<<setw(4)<<"三"<<setw(4)<<"四"<<setw(4)<<"五"<<setw(4)<<"六"<<endl;

for(i=0;i<w;i++)

    cout<<"    ";

for(i=1;i<8-w;i++)  

  cout<<setw(4)<<i;

cout<<endl;

for(i=8-w,j=1;i<=monthdays;i++,j++){

    cout<<setw(4)<<i;

    if(j%7==0)cout<<endl;

}

cout<<endl<<"----------------------------------"<<endl;

}

void Date::displayYear(){

int i;

for(i=1;i<=12;i++){

    Date c(year,i,1);

    c.displayMonth();

    cout<<endl;

}

}

void display1(){

int year5,month5;

cout<<"请输入要显示的月历:";

cin>>year5>>month5;

cout<<endl<<"-----------------------------"<<endl;

Date date5(year5,month5,1);

date5.displayMonth();

}

void display2(){

    int year;

    cout<<"请输入要显示的年份:";

    cin>>year;

    Date date(year,1,1);

    date.displayYear();

}

int main()

{

    int a;

    int d=1;

    system("color 3F");

    menu();

    do

    {

        cin>>a;

        if(a<0||a>5){

           cout<<"选择错误请重新选择..."<<endl;

           cout<<"请选择:"<<endl;

           cin>>a;

        }

        switch(a)

        {

        case 1:

           system("cls");

           reducedays();

           goback();break;

          

        case 2:

           system("cls");

           adddays();

           goback();break;

          

       

        case 3:

           system("cls");

           apartdate();

           goback();break;

          

        case 4:

           system("cls");

           display1();

           goback();break;

          

       

case 5:

           system("cls");

           display2();

           goback();break;

       

        case 0:system("cls");exit(0);break;

        }

    }while(d==1);

return 0;

}

相关推荐