40410126甘全中实验一.docx
- 文档编号:756164
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:104.18KB
40410126甘全中实验一.docx
《40410126甘全中实验一.docx》由会员分享,可在线阅读,更多相关《40410126甘全中实验一.docx(14页珍藏版)》请在冰点文库上搜索。
40410126甘全中实验一
实验一类与对象
实验课程名:
面向对象程序设计
专业班级:
计算机科学与技术
(一)班学号:
201540410126姓名:
甘全中
实验时间:
2016.3.29-4.7实验地点:
K4-207指导教师:
邓丹君
一、实验目的和要求
1.掌握类的定义的基本格式和类成员的访问控制
2.掌握对象定义和利用构造函数对对象的数据成员进行初始化的方法
3.了解成员函数的定义与使用
二、实验内容
1.编制定义类和使用类的程序:
定义一个关于日期的类,然后声明对象,判断该日期是否为闰年并输出(年份%400==0||年份%4==0&&年份%100!
=0)
注意:
(1)类定义的末尾有一个分号
(2)成员函数在类内声明,在类外定义
(3)体会类的定义方法以及类的成员函数的调用方法
解答:
(1)源代码:
#include
usingnamespacestd;
classTime
{
private:
intyear;
intmonth;
intday;
public:
Time(inty,intm,intd):
year(y),month(m),day(d){}
voidDate_time();
};
voidTime:
:
Date_time()
{
if(this->year%400==0||this->year%4==0&&this->year%100!
=0)
cout<
"<<"该年是闰年"< else cout< "<<"该年不是闰年"< } intmain() { Timet1(2016,3,31); Timet2(2015,3,31); Timet3(2012,3,31); Timet4(2000,3,31); t1.Date_time(); t2.Date_time(); t3.Date_time(); t4.Date_time(); return0; } (2)运行结果: (alt+printscreen) (3)运行结果分析: 定义一个Time的类,在类里定义私有的数据成员,在类里声明一个公用的成员函数作为对外的接口。 在类外定义成员函数,最后在main函数中声明并调用即可。 2.编制带有构造函数和析构函数的类以及用构造函数来初始化对象: 编写一个程序,定义一个日期时间类,并在类中定义构造函数、析构函数 (1)构造函数和析构函数都没有返回值 (2)构造函数可以有参数,析构函数则不可以有 (3)构造函数和析构函数都是系统自动调用的 解答: (1)源代码: #include usingnamespacestd; classTime { private: intyear; intMonth; intday; inthour; intminute; intsex; public: Time(inty,intM,intd,inth,intm,ints): year(y),Month(M),day(d),hour(h),minute(m),sex(s){} voiddisplay_time() { cout<<"thisdateis: "< "< "< } ~Time() { cout<<"Destructorcalled."< "< "< } }; intmain() { Timet1(2016,3,31,22,37,30); Timet2(2016,3,31,23,50,35); Timet3(2016,3,31,00,40,50); Timet4(2016,4,1,00,00,00); t1.display_time();cout< t2.display_time();cout< t3.display_time();cout< t4.display_time();cout< return0; } (2)运行结果: (alt+printscreen) (3)运行结果分析: 定义时间的一个类,在类里定义私有的有关时间的数据成员和对外的成员函数接口。 并用析构函数作清理工作。 3.输入下列程序 #include usingnamespacestd; classCoordinate {public: Coordinate(intx1,inty1) {x=x1; y=y1; } Coordinate(Coordinate&p); ~Coordinate() {cout<<”Destructoriscalleded\n”;} intgetx() {returnx;} intgety() {returny;} private: intx,y; }; Coordinate: : Coordinate(Coordinate&p) {x=p.x; y=p.y; cout<<”copy-initializationConstructoriscalled\n”; } intmain() {Coordinatep1(3,4); Coordinatep2(p1); Coordinatep3=p2; cout<<”p3=(“< return(0); } (1)写出程序的运行结果。 解答: (2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增添下述语句: cout<<”Constructoriscalled.\n”; 写出程序的运行结果,并解释输出结果。 解答: 在构造函数中添加了一个输出语句。 在定义类的对象时,自动调用构造函数,在main函数中只调用一次构造函数,故只有一个输出语句! (3)按下列要求进行调试: 在主函数体内,添加下列语句: Coordinatep4; Coordinatep5 (2); 调试程序时会出现什么错误? 为什么? 如何对已有的构造函数进行适当修改? 解答: 在构造函数中没有设置默认值,因此它是不确定的。 可以用带参数的构造函数来解决! (4)经过以上第 (2)步和第(3)步的修改后,结合运行结果分析。 解答: 创建不同的对象时会调用不同的构造函数! 运行结果分析: 本程序充分使用了类的用法。 如intgetx(),intgety().的使用。 并且用析构函数完成清理工作。 再则能定义多个构造函数,即函数的重载。 在调用时会根据具体的构造函数。 4.设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果: A(x1,y1),B(x2,y2) Distance1=d1 Distance1=d2 其中: x1、x2、y1、y2为指定的坐标值,d1和d2为两个坐标点之间的距离。 【提示】 类Location的参考框架如下: classLocation{ public: Location(double,double); doubleGetx() doubleGety() doubledistance(Location&); frienddoubledistance1(Location&,Location&); private: doublex,y; }; 解答: (1)源代码: #include #include usingnamespacestd; classLocation { public: Location(double,double); doubleGetx(); doubleGety(); doubledistance(Location&); frienddoubledistance1(Location&,Location&); private: doublex,y; }; Location: : Location(doublex1,doubley1) { x=x1; y=y1; } doubleLocation: : Getx() { returnx; } doubleLocation: : Gety() { returny; } doubleLocation: : distance(Location&l1) { return(sqrt((x-l1.x)*(x-l1.x)+(y-l1.y)*(y-l1.y))); } doubledistance1(Location&x1,Location&x2) { return(sqrt((x1.x-x2.x)*(x1.x-x2.x)+(x1.y-x2.y)*(x1.y-x2.y))); } intmain() { LocationA(-1,-2),B(-1,3); cout<<"A("< doubled1=A.distance(B); doubled2=distance1(A,B); cout<<"Distanced1="< cout<<"Distanced2="< return0; } (2)运行结果: (alt+printscreen) (3)运行结果分析: 分别按题意定义成员函数和友元函数,在成员函数中写出计算两点之间的距离,在主函数中定义并调用。 用友元函数时同理。 5.声明一个Student类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全班成绩的平均值。 在main函数中,输入某班同学的成绩,并调用上述函数求出全班学生的成绩之和和平均分。 解答: (1)源代码: #include usingnamespacestd; classStudent { private: floatscore; staticfloattotal_score; staticintcount; public: voidaccount(floatscore) { total_score=total_score+score; count++; } staticfloatsum() {return(total_score); } staticfloataverage() { return(total_score/count); } }; intStudent: : count=0; floatStudent: : total_score=0.0; intmain() { Students1,s2,s3,s4,s5; s1.account(99); s2.account(70); s3.account(85); s4.account(89); s5.account(91); cout<<"thesumis: "< : sum()< cout<<"theaverageis: "< : average()< return0; } (2)运行结果: (alt+printscreen) (3)运行结果分析: 按照题目的要求设计。 其中静态成员函数能直接访问静态数据成员。 在每个成员函数中完成各自的任务。 最后在主函数中定义变量并调用即可。 6.使用C++的string类,从键盘输入5个字符串,排序后按从小到大的顺序显示出来。 例如,输入的5个字符串是: GermanyJapanAmericaBritainFrance,排序后从小到大的顺序输出字符串是: AmericaBritainFranceGermanyJapan 解答: (1)源代码: #include #include usingnamespacestd; intmain() { inti; stringstr[5]; voidsort(strings[]); cout<<"Pleaseinputstring: "< for(i=0;i<5;i++) cin>>str[i]; sort(str); cout<<"Thesortedstringis: "< for(i=0;i<5;i++) cout< return0; } voidsort(strings[]) { inti,j; stringtemp; for(i=0;i<4;i++) for(j=0;j<4-i;j++) if(s[j]>s[j+1]) { temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } } (2)运行结果: (alt+printscreen) (3)运行结果分析: 用string类,输入五个字符串。 通过比较大小来排序,运用冒泡法的排序将五个字符串从小到大的顺序输出。 三、结论 1.学习C++的重要思想,面向对象的设计。 用class类实现对对象的操作,学会使用类和对象。 2.认识友元函数的用法,友元函数可以访问本类中的数据成员。 3.关于静态数据成员和静态成员函数,静态成员函数能访问静态数据成员 说明: 1.电子实验报告填写好后,以学生的学号+实验项目名作为该word文件名保存,例如某学生学号为20150001,姓名为某某,本次实验是实验一,则本次实验报告的保存文件名为: 01某某实验一.doc。 2.在规定的时间内,学生将本报告提交给实验指导教师。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 40410126 甘全中 实验