ch12_10021017_ljq
西安交通大学实验报告
课程_C++程序设计__实验名称_虚函数的定义和运算符的重载第页共
页
系别___材料科学与工程____ 实验日期 2012 年 11月 29日
专业班级___材料01___组别_____________ 实验报告日期年月日
姓名___李佳庆___学号__2010021017__ 报告退发 ( 订正、重做 )
同组人_________________________________ 教师审批签字
一.实验目的
(1)掌握使用虚函数实现多态性;
(2)掌握运算符重载的方法。
二.实验内容
(-)实验题目一:定义一个类Base,该类含有虚函数display,然后定义它的两个派生类FirstB和SecondB,这两个派生类均含有公有成员函数display,在主程序中,定义指向基类Base的指针变量ptr,并分别定义Base、FirstB、SecondB的对象b1、f1、s1,让ptr分别指向b1、f1、s1的起始地址,然后执行这些对象的成员函数display。
程序源代码:
#include
#include
class Base
{
public:
virtual void display()
{cout<<"Display Base"< class FirstB:public Base { public: virtual void display() {cout<<"Display FirstB"< class SecondB:public Base { public: void display() {cout<<"Display SecondB"< int main() { Base *ptr,b1; FirstB f1; SecondB s1; ptr=&b1; ptr->display(); ptr=&f1; ptr->display(); ptr=&s1; ptr->display(); return 0; } 实验结果: (二)实验题目二:扩充例12-6,从中派生出一个正方形类和圆柱体类,写一个测试程序,输出正方形的面积和圆柱体的体积。 程序源代码: #include using namespace std; class Shape { public: virtual double Area()const {return 0.0;} virtual void PrintShapeName()const =0; virtual void Print() const =0; }; class Point: public Shape { double x,y; public: Point(double =0,double=0); void SetPoint(double, double); double GetX(){return x;} double GetY(){return y;} virtual void PrintShapeName()const{cout<<"点坐标为:";} virtual void Print()const; }; Point::Point( double a,double b){ SetPoint(a,b);} void Point::SetPoint(double a,double b){x=a; y=b;} void Point::Print()const{cout<<"["< { double radius; public: Circle(double x=0,double y=0,double r=0.0); void SetRadius(double); double GetRadius()const; virtual double Area()const; virtual void Print()const; virtual void PrintShapeName()const{cout<<"关于圆:";} }; Circle::Circle(double x,double y,double r):Point(x,y){SetRadius(r);} void Circle::SetRadius(double r){radius=(r>=0?r:0);} double Circle::GetRadius()const{return radius;} double Circle::Area()const{return 3.14159*radius*radius;} void Circle::Print()const { cout<<"圆心坐标:"; Point::Print(); cout<<";半径R="< } class Cylinder: public Circle { double height; public: Cylinder(double x=0,double y=0,double r=0,double h=0); void SetHeight(double); double GetHeight()const; double volume(); virtual void Print()const; virtual void PrintShapeName()const{cout<<"关于圆柱体:";} }; Cylinder::Cylinder(double x,double y,double r,double h):Circle(x,y,r){SetHeight(h);} void Cylinder::SetHeight(double h){height=(h>=0?h:0);} double Cylinder::GetHeight()const{return height;} double Cylinder::volume(){return Circle::Area()*height;} void Cylinder::Print()const { cout<<"底面积:"; Circle::Print(); cout<<";高="< } class Square: public Point { double length; public: Square(double x=0,double y=0,double l=0); void SetLength(double); double GetLength()const; virtual double Area()const; virtual void Print()const; virtual void PrintShapeName()const{cout<<"正方形:";} }; Square::Square(double x,double y,double l):Point(x,y){SetLength(l);} void Square::SetLength(double l){length=(l>=0?l:0);} double Square::GetLength()const{return length;} double Square::Area()const{return length*length;} void Square::Print()const { cout<<"左上角坐标为="; Point::Print(); cout<<";Length="< } void sha(Shape *Sh) { Sh->PrintShapeName(); Sh->Print(); } void main() { double a,b,c,d,e,f,g,h,i,j,k,m; Shape *Sh; cout<<"请输入点坐标:"; cin>>a>>b; Point p(a,b); cout<<"请输入圆心坐标和半径:"; cin>>c>>d>>e; Circle c1(c,d,e); cout<<"请输入圆柱底面圆心和半径以及圆柱的高:"; cin>>f>>g>>h>>i; Cylinder cy(f,g,h,i); cout<<"请输入正方形左上角坐标及边长:"; cin>>j>>k>>m; Square s(j,k,m); Sh=&p; sha(Sh); cout< Sh=&c1; sha(Sh); cout< Sh=&cy; sha(Sh); cout<<"Volume="< Sh=&s; sha(Sh); } 实验结果: (三)实验题目三:扩充实例编程中的日期类,为Date类增加一个成员函数,可以判断一个日期是否是系统当前日期。从键盘输入你的生日,如果今天是你的生日则显示:“Happy Birthday!”,否则显示“还有xx天是你的生日”或“你的生日已经过去了xx天,明年的生日要再等yy天”。 程序源代码: #include #include using namespace std; class Date { int day,month,year; int DayCalc() const; //据基准日期的天数static const int days[]; //每月的天数 public: Date(int y,int m, int d); //构造函数 Date(); int GetDay(){return day;} //取得日期 int GetMonth(){return month;} //取得月份 int GetYear(){return year;} //取得年份 void SystemDate(); void SetDate(int yy, int mm ,int dd); //日期设置 void IncDay(); //日期增加一天 bool IsLeapYear(int y) const; //是否闰年 bool IsEndofMonth() const; //是否月末 void print_ymd(); //输出日期yy_mm_dd void print_mdy(); //输出日期mm_dd_yy const Date &operator +(int days); //日期增加任意天 const Date &operator +=(int days); //日期增加任意天 int operator -(const Date& ymd)const; //两个日期之间的天数void Birthday(); }; const int Date::days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; Date::Date(int y,int m,int d) { SetDate(y,m,d); } Date::Date(){SystemDate();} void Date::SystemDate() { tm *gm; time_t t=time(NULL); //定义一个取系统时间的函数gm=gmtime(&t); year=1900+gm->tm_year; month=gm->tm_mon+1; day=gm->tm_mday; } void Date::SetDate(int yy, int mm ,int dd) { month=(mm>=1 && mm<=12)? mm:1; year=(yy>=1900 && yy<=2100)? yy:1900; switch (month) { //小月天数的判断 case 4: case 6: case 9: case 11: day=(dd>=1 && dd<=30)? dd:1; break; case 2: //2月天数判断 if(IsLeapYear(year)) day=(dd>=1 && dd<=29)? dd:1; else day=(dd>=1 && dd<28)? dd:1; break; default: //大月天数的判断 day=(dd>=1 && dd<=31)? dd:1; } } const Date&Date::operator+(int days) { for (int i=0; i IncDay(); return *this; } const Date&Date::operator +=(int days) { for (int i=0; i IncDay(); return *this; } int Date::operator -(const Date& ymd)const { int days; days=DayCalc()-ymd.DayCalc(); return days; } bool Date::IsLeapYear(int y) const { if (y%400==0||(y%100!=0 && y%4==0)) return true; //闰年 else return false; //不是闰年 } bool Date::IsEndofMonth() const { if (month ==2 && IsLeapYear(year)) return day==29; else return day==days[month]; } void Date::IncDay() { if (IsEndofMonth()) if (month==12) {//年末 day=1; month=1; year++; } else {//月末 day=1; month++; } else day++; } void Date::print_ymd() { cout< } void Date::print_mdy() { char *monthName[12]={"January","February","March","April", "May","June","July","August","Septenber","Octorber", "November","December"}; cout< } int Date::DayCalc() const { int dd; int yy=year-1900; dd=yy*365; //不计闰年天数 if (yy) dd+=(yy-1)/4; //每逢闰年加一天 for(int i=1; i if (IsLeapYear(year)&&(month>2)) dd++; dd+=day; return dd; } void Date::Birthday() { int y,m,d; cout<<"Please input your Birthday(y m d):"; cin>>y>>m>>d; Date Birthday(y,m,d),today; Date b(today.GetYear(),Birthday.GetMonth(),Birthday.GetDay()); if (b-today==0) { cout<<"Happy Birthday! 过了今天,你就"; cout< cout<<" 岁了。"< } else { if (b-today<0) { cout<<"你"< cout<<"岁生日已经过了"; cout< cout<<"你的"< cout<<"岁生日将在"; b.SetDate(today.GetYear()+1,Birthday.GetMonth(),Birthday.GetDay()); cout< } else { cout<<"你"< cout<<"岁生日已经过了"; cout< b.SetDate(today.GetYear()-1,Birthday.GetMonth(),Birthday.GetDay()); cout<<"你的"< cout<<"岁生日将在"; cout< } } } void main() { Date today; cout<<"今天是:"; today.print_mdy(); cout<<"一年后的今天是:"; today+=365; today.print_ymd(); today.SystemDate(); today.Birthday(); today.Birthday(); today.Birthday(); } 实验结果: (四)实验题目四:定义二元一次方程组类,增加构造函数、+函数、-函数,==判相等函数,仍然保持原来求根函数、输出该二元一次方程组函数,并编写主函数测试各成员函数。提示:两个二元一次方程组对应相加和对应相减仍然是一个二元一次方程组。 程序源代码: #include #include class Abu { public: double a,b,c,d,e,f; Abu() {} Abu(double A,double B,double C,double D,double E,double F) { a=A;b=B;c=C;d=D;e=E;f=F; } double qiujie1(); double qiujie2(); Abu operator+(Abu&); Abu operator-(Abu&); }; double Abu::qiujie1() { while(a*e-d*b==0) { cout<<"结果无法计算。请重新输入:"; cin>>a>>b>>c>>d>>e>>f; }