《高等程序设计实验报告.pdf》由会员分享,可在线阅读,更多相关《高等程序设计实验报告.pdf(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 高等程序设计实验报告 实验名称 实验 12 运算符重载(2)系 别 姓 名 学 号 班 级 实验时间 实验地点 实验成绩 一、实验目的及要求 进一步理解运算符重载,运用成员函数和友元函数等方法实现运算符的重载。二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等)硬件设备:联网的个人计算机 操作系统:Windows xp 编译系统:Dev C+三、实验内容及步骤(包含简要的实验步骤流程)1、重载函数调用运算符(),将以下的二维数组的下标表示方法:chessBoardrowcolumn改为常用的表示方法:chessBoard(row,column)2、重载下标运算符使之返回集合中最
2、大的元素、次最大的元素以及第三大的元素。3、开发多项式类 Polynomial,多项式的每一项用数组表示,每项包含一个系数和一个指数。例如:2x4的指数为 4,系数为 2。请开发一个完整的 Polynomial 类,包括构造函数、析构函数以及get函数和set函数。该类还要提供下述重载的运算符(分别使用成员函数和友元函数):1)重载加法运算符+,将两个多项式相加;2)重载减法运算符-,将两个多项式相减;3)重载赋值运算符=,将一个多项式赋给另外一个多项式;4)重载乘法算符*,将两个多项式相乘;5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。4设计一个日期类 Date,,要
3、求:(1)包含年(year)、月(month)和日(day)私有数据成员。(2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符等。提示:由于各 C+编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如:void SetYear(int y);/设置年 int SetMonth(int m);/设置月 int SetDay(int d);/设置日 int GetYear()const;/返回年 int GetMonth()const;
4、/返回月 int GetDay()const;/返回日 static int IsLeapyear(int y);/判断年份 y 是否为润年 static int GetDays(int y);/年份 y 的天数 static int GetDays(const Date&d);/日期 d 当前月份的天数 static int DateToNum(const Date&d);/返回从公元 1 年 1 月 1 日起的天数 static Date NumToDate(int n);/由从公元 1 年 1 月 1 日起的天数返回日期 润年条件:年份能被 4 整除,并且年份不能被 100 整除,或者年
5、份能被 400 整除 润年天数:366 平年天数:365 润年 2 月份天数:29 平年 2 月份天数:28 5设计一个时间类 Time,要求:(1)包含时(hour)、分(minute)和秒(second)私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符等。提示:可仿照第 4 题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。时间转换成秒数:秒数=时*3600+分*60+秒 秒数转换成时间:时=秒数/3600 分=(秒数-时*3600)/60 秒=秒数%60 为编程更方便,可增加一些成员函数,比如:
6、void SetHour(int hh);/设置小时 void SetMinute(int mm);/设置分钟 void SetSecond(int ss);/设置秒 int GetHour()const;/返回小时 int GetMinute()const;/返回分钟 int GetSecond()const;/返回秒 四、实验结果(包括程序或图表、结论陈述、数据记录及分析等,可附页)1、重载函数调用运算符(),将以下的二维数组的下标表示方法:chessBoardrowcolumn改为常用的表示方法:chessBoard(row,column)代码实现:#include#include us
7、ing namespace std;class shuzu int chessBoard88;public:shuzu()for(int i=0;i8;i+)for(int j=0;j8;j+)chessBoardij=i+j;int operator()(int a,int b)return chessBoardab;int main()shuzu a;cout输出(6,7)=a(6,7)endl;cout矩阵:endl;for(int i=0;i8;i+)for(int j=0;j8;j+)couta(i,j)t;coutendl;getch();return 0;结果截图:2、重载下标运
8、算符使之返回集合中最大的元素、次最大的元素以及第三大的元素。3、开发多项式类 Polynomial,多项式的每一项用数组表示,每项包含一个系数和一个指数。例如:2x4的指数为 4,系数为 2。请开发一个完整的 Polynomial 类,包括构造函数、析构函数以及get函数和set函数。该类还要提供下述重载的运算符(分别使用成员函数和友元函数):1)重载加法运算符+,将两个多项式相加;2)重载减法运算符-,将两个多项式相减;3)重载赋值运算符=,将一个多项式赋给另外一个多项式;4)重载乘法算符*,将两个多项式相乘;5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。代码实现:#
9、include#include using namespace std;class J private:int a5;public:J(int s)for(int i=0;i5;i+)ai=si;void paixu()for(int i=0;i4;i+)for(int j=0;jaj+1)int temp=aj;aj=aj+1;aj+1=temp;int operator(int b)return ab;int main()int s5;cout请输入 5 个数:endl;for(int i=0;isi;J j(s);j.paixu();cout 最 大 的 元 素、次 最 大 的 元 素
10、以 及 第 三 大 的 元 素 依 次 为:j4,j3,j2endl;getch();return 0;结果截图:4设计一个日期类 Date,,要求:(1)包含年(year)、月(month)和日(day)私有数据成员。(2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符等。提示:由于各 C+编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如:void SetYear(int y);/设置年 int SetMonth(int m)
11、;/设置月 int SetDay(int d);/设置日 int GetYear()const;/返回年 int GetMonth()const;/返回月 int GetDay()const;/返回日 static int IsLeapyear(int y);/判断年份 y 是否为润年 static int GetDays(int y);/年份 y 的天数 static int GetDays(const Date&d);/日期 d 当前月份的天数 static int DateToNum(const Date&d);/返回从公元 1 年 1 月 1 日起的天数 static Date Num
12、ToDate(int n);/由从公元 1 年 1 月 1 日起的天数返回日期 润年条件:年份能被 4 整除,并且年份不能被 100 整除,或者年份能被 400 整除 润年天数:366 平年天数:365 润年 2 月份天数:29 平年 2 月份天数:28(1)程序实现#includeiostream.h#include class Date public:Date(int a=0,int b=0,int c=0);void Set_Date(int a,int b,int c);void Get_Date();Date operator+(int);Date operator-(int);fr
13、iend ostream&operator(istream&,Date&);private:int year,mounth,date,m;Date:Date(int a,int b,int c)year=a;mounth=b;date=c;m=1;void Date:Set_Date(int a,int b,int c)year=a;mounth=b;date=c;void Date:Get_Date()if(m=1)coutyear年mounth月date日endl;else cout刚才输入的天数不符合要求!28)m=0;return*this;else if(year%400=0)|(y
14、ear%4=0)&(year%100!=0)if(mounth=4)|(mounth=6)|(mounth=9)|(mounth=11)if(date+a)=30)date=date+a;else date=date+a-30;mounth+;else if(mounth=2)if(date+a)=29)date=date+a;else date=date+a;mounth+;/处理 2 月 else if(date+a)=31)date=date+a;else date=date+a-31;if(mounth=12)year+;mounth=1;else mounth+;else if(mo
15、unth=4)|(mounth=6)|(mounth=9)|(mounth=11)if(date+a)=30)date=date+a;else date=date+a-30;mounth+;else if(mounth=2)if(date+a)=28)date=date+a;else date=date+a-28;mounth+;else if(date+a)28)m=0;return*this;else if(year%400=0)|(year%4=0)&(year%100!=0)if(mounth=5)|(mounth=7)|(mounth=10)|(mounth=12)if(date=a
16、)date=date-a;else date=date-a+30;mounth-;else if(mounth=3)if(date=a)date=date-a;else date=date-a+29;mounth-;else if(date=a)date=date-a;else date=date-a+31;if(mounth=1)year-;mounth=12;else mounth-;else if(mounth=5)|(mounth=7)|(mounth=10)|(mounth=12)if(date=a)date=date-a;else date=date-a+30;mounth-;el
17、se if(mounth=3)if(date=a)date=date-a;else date=date-a+28;mounth-;else if(date=a)date=date-a;else date=date-a+31;if(mounth=1)year-;mounth=12;else mounth-;return*this;ostream&operator(ostream&output,Date&a)couta.year年a.mounth月a.date日(istream&input,Date&a)couta.year;couta.mounth;couta.date;return input
18、;int main()Date a,b,c;int x,y,z;cout请输入第一个日期:endl;coutx;couty;coutz;a.Set_Date(x,y,z);c=a;cout请输入第二个日期:b;cout请输入需要加上的天数:z;a=a+z;cout日期c加上z天得到的日期为:endl;a.Get_Date();a=c;cout请输入需要减去的天数:z;cout日期b减去z天得到的日期为:endl;b=b-z;b.Get_Date();getch();return 0;(2)结果截图 5设计一个时间类 Time,要求:(1)包含时(hour)、分(minute)和秒(second
19、)私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符等。提示:可仿照第 4 题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。时间转换成秒数:秒数=时*3600+分*60+秒 秒数转换成时间:时=秒数/3600 分=(秒数-时*3600)/60 秒=秒数%60 为编程更方便,可增加一些成员函数,比如:void SetHour(int hh);/设置小时 void SetMinute(int mm);/设置分钟 void SetSecond(int ss);/设置秒 int GetHour()const;
20、/返回小时 int GetMinute()const;/返回分钟 int GetSecond()const;/返回秒 代码实现:#include#include using namespace std;class Time int hour,minute,second,sall;public:Time();Time operator+(Time a);Time operator-(Time a);Time operator(Time&a);void SetHour(int hh);/设置小时 void SetMinute(int mm);/设置分钟 void SetSecond(int ss)
21、;/设置秒 int GetHour()const;/返回小时 int GetMinute()const;/返回分钟 int GetSecond()const;/返回秒 int GetSall()const;Time:Time()second=0;hour=0;minute=0;sall=0;Time Time:operator+(Time a)Time temp;temp.sall=sall+a.sall;temp.hour=temp.sall/3600;temp.minute=(temp.sall-3600*temp.hour)/60;temp.second=temp.sall%60;ret
22、urn temp;Time Time:operator-(Time a)Time temp;temp.sall=sall-a.sall;temp.hour=temp.sall/3600;temp.minute=(temp.sall-3600*temp.hour)/60;temp.second=temp.sall%60;return temp;Time Time:operator(Time&a)a.minute=minute;a.second=second;a.hour=hour;a.sall=sall;return a;void Time:SetHour(int hh)/设置小时 hour=h
23、h;void Time:SetMinute(int mm)/设置分钟 minute=mm;void Time:SetSecond(int ss)/设置秒 second=ss;sall=3600*hour+60*minute+second;int Time:GetHour()const /返回小时 return hour;int Time:GetMinute()const /返回分钟 return minute;int Time:GetSecond()const /返回秒 return second;int Time:GetSall()const return sall;int main()Ti
24、me t1,t2,t3,t4,t5,t6,t7,t8;int s1,s2,h1,h2,m1,m2;couth1m1s1;couth2m2s2;t1.SetHour(h1);t1.SetMinute(m1);t1.SetSecond(s1);t2.SetHour(h2);t2.SetMinute(m2);t2.SetSecond(s2);coutt1时 间 为:t1.GetHour()时 t1.GetMinute()分 t1.GetSecond()秒 endl;coutt1时 间 为:t2.GetHour()时 t2.GetMinute()分 t2.GetSecond()秒 t3;t4t2;co
25、utt3:t3 时间为:t3.GetHour()时 t3.GetMinute()分 t3.GetSecond()秒 endl;coutt4t2:t4 时间为:t4.GetHour()时 t4.GetMinute()分 t4.GetSecond()秒=t2.GetSall()t5=t1-t2;coutt5=t1-t2:t5 时间为:t5.GetHour()时 t5.GetMinute()分 t5.GetSecond()秒 endl;else t5=t2-t1;coutt5=t2-t1:t5 时间为:t5.GetHour()时 t5.GetMinute()分 t5.GetSecond()秒 endl;t6=t3+t4;coutt6=t3+t4:t6 时间为:t6.GetHour()时 t6.GetMinute()分 t6.GetSecond()秒 endl;getch();return 0;结果截图:五、总结 1、注意函数之间的调用 2、注意模的使用 例如:时间的模为 60 年份的模为 366 或 265 月的模各不相同