1LIAOCHENGUNIVERSITY计算机学院实验报告【2015~2016学年第2学期】【一、基本信息】【实验课程】C++语言程序设计【设课形式】独立□非独立☑【课程学分】3【实验项目】多态、友元、虚函数、模板【项目类型】基础☑综合□设计□研究创新□其它[]【项目学时】4【学生姓名】苏睿【学号】2015205398【系别专业】【实验班组】2015级11班组台【同组学生】【实验室名】综合实验楼【实验日期】2016.5.10【报告日期】2016.5.17【二、实验教师对报告的最终评价及处理意见】实验成绩:(涂改无效)指导教师签名:李寰2016年5月20日注:要将实验项目、实验课程的成绩评定及课程考核办法明确告知学生,并报实验管理中心备案2【三、实验预习】实验目的和要求:1.理解多态性的概念,掌握虚函数的作用及使用方法。2.理解纯虚函数和抽象类的概念和用法。3.掌握友元的概念、友元函数的定义与使用方法。4.掌握静态数据成员与静态成员函数的定义与使用方法。实验内容和原理或涉及的知识点(综合性实验):1.先建立一个职工类Employee,包含数据成员name(职工姓名),ID(职工编号)。以它为基类,派生出经理类Manager和技术人员类Technician,在经理类中增加数据成员salary(代表经理的月工资),在技术人员类中增加数据成员wage(代表每小时的工资数)和hours(月工作时数)。在定义类时,所有类中必须包含有构造函数、析构函数、修改和获取所有数据成员的函数,以及计算职工工资的虚函数,输出职工信息的虚函数。在主程序中通过Employee指针分别访问经理对象和技术人员对象,调用验证相应方法。2.shape类是一个表示形状的抽象类,area()为求图形面积的成员函数,total()则是一个通用的用以求不同形状的图形面积总和的公共函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并在主程序中调用total()函数计算给出shape数组中所有形状的面积之和。【提示:total函数的原型可以为doubletotal(shape*s[],intcnt);其中,s为shape指针的数组,cnt为数组中元素个数。】3.设计并测试点类Point,其数据成员是直角坐标系的点横坐标和纵坐标,友元函数distance用来计算两点间的距离。4.定义函数模板,实现数组的冒泡排序。实验条件(实验设备、软件、材料等):1、装有Windows操作系统的微型计算机;2、C++集成开发环境软件。实验设计方案(实验方法、步骤、操作过程、设计型实验、实验数据记录表格):1、完成实验内容部分题目程序代码的编写。2、调试运行程序,直到程序符合题目要求。3、将程序的源代码和执行结果的截图贴在实验报告的【四】部分。4、对实验进行总结,认真填写【五、实验结果分析】部分。实验预习成绩(涂改无效)合格□不合格□3【四、实验过程、数据和实验结果记录】①实验方法、步骤、操作过程的记录描述或程序代码。②实验过程中输入/输出数据、程序运行结果的记录。(可加附页)1.#includeiostreamusingnamespacestd;classEmployee{protected:stringname,ID;public:Employee(){}Employee(stringname,stringID):name(name),ID(ID){}~Employee(){}virtualvoidinputInfo();virtualvoidoutputInfo();};voidEmployee::inputInfo(){coutendlPleaseinputthedata:endl;cinnameID;}voidEmployee::outputInfo(){coutendlTheinfois:endl;coutname:nameendl;coutID:IDendl;}classManager:publicEmployee{private:doublesalary;public:Manager(){}Manager(stringname,stringID,doublesalary):Employee(name,ID),salary(salary){}~Manager(){}virtualvoidinputInfo();virtualvoidoutputInfo();};voidManager::inputInfo(){coutendlManager,;4Employee::inputInfo();cinsalary;}voidManager::outputInfo(){coutendlManager,;Employee::outputInfo();coutsalary:salaryendl;}classTechnician:publicEmployee{private:doublewage,hours;public:Technician(){}Technician(stringname,stringID,doublewage,doublehours):Employee(name,ID),wage(wage),hours(hours){}~Technician(){}virtualvoidinputInfo();virtualvoidoutputInfo();virtualdoubleGetsalary();};voidTechnician::inputInfo(){coutendlTechnician,;Employee::inputInfo();cinwagehours;}voidTechnician::outputInfo(){coutendlTechnician,;Employee::outputInfo();coutwage:wageendl;couthours:hoursendl;couttotalsalary:Getsalary()endl;}doubleTechnician::Getsalary(){returnwage*hours;}intmain(){Employee*p=newManager;ManagerM1(IronMan,001,8000);p=&M1;p-outputInfo();p-inputInfo();p-outputInfo();TechnicianT1(SuperMan,002,300,6);p=&T1;5p-outputInfo();p-inputInfo();p-outputInfo();return0;}62.classshape{public:virtualdoublearea()=0;};classtriangle:publicshape{private:doublea,b,c;public:triangle():a(3),b(4),c(5){}triangle(doublea,doubleb,doublec):a(a),b(b),c(c){if((a+b=c)||(abs(a-b)=c)){coutError:thedatacannotconstructatriangle.endl;}}doublearea();};doubletriangle::area(){doublep=(a+b+c)/2;returnsqrt(p*(p-a)*(p-b)*(p-c));}classrectangle:publicshape{private:doublelenth,weith;public:rectangle():lenth(10),weith(8){}rectangle(doublelenth,doubleweith):lenth(lenth),weith(weith){}doublearea();};doublerectangle::area(){returnlenth*weith;}doubletotal(shape*s[],intcnt){doubletotal;for(inti=0;icnt;i++){total+=s[i]-area();}7returntotal;}intmain(){triangleT1(6,8,10);coutT1.area()endl;rectangleR1(5,10);coutR1.area()endl;shape*s[2]={&T1,&R1};couttotal(s,2)endl;return0;}3.#includeiostream#includecmathusingnamespacestd;classPoint{private:doublex,y;public:Point():x(0),y(0){}Point(doublea,doubleb):x(a),y(b){}frienddoubleDistance(constPoint&a,constPoint&b);};doubleDistance(constPoint&a,constPoint&b){returnsqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));}intmain(){Pointa(3,7),b(3,9);coutdistance:Distance(a,b);return0;8}4.#includeiostream#includecmathusingnamespacestd;templateclassTvoidBubbleSort(Ta[],intn){inti,j;Ttemp;for(i=0;in-1;i++){for(j=0;jn-1-i;j++){if(a[j]a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}}intmain(){inta[5]={1,4,2,3,5};BubbleSort(a,5);for(inti=0;i5;i++){couta[i];}return0;}9记录成绩(涂改无效)合格□不合格□【五、实验结果分析】①根据理论知识对所得到的实验数据或结果进行解释、分析。②对实验结果所作的一般性的判断、归纳、概括,实验的心得体会、建议等。这次实验,我又一次的体会到了继承,和多态的含义和用法,也学会了使用函数模版,知道了向上转型,再一次复习了冒泡排序的算法,真的是一开始着手写算法都记不起来了,一点思路都没了,另外,还写了个友元函数用来求两点之间的距离。