《《-面向对象程序设计》课程设计实验报告(共21页).doc》由会员分享,可在线阅读,更多相关《《-面向对象程序设计》课程设计实验报告(共21页).doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 面向对象程序设计课程设计实验报告指导教师小组成员:专业班级: 2010级计算机科学与技术专业开设时间: 2011-2012(一)目录1. 任务121.1 任务介绍21.2 小组成员任务分配2 1.3.1设计思想及主要流程图 21.3.1主要程序清单 21.3.1 运行结果及分析41.3.2设计思想及主要流程图 21.3.2主要程序清单 21.3.2 运行结果及分析 41.3.3设计思想及主要流程图 21.3.3主要程序清单 21.3.3 运行结果及分析42. 任务2 22.1 任务介绍22.2 小组成员任务分配2 2.3设计思想及主要流程图 22.3主要程序清单 2
2、2.3 运行结果及分析 43收获、体会和建议 4任务1.按照要求设计类1.根据输出设计类设计类就是根据数据封装的要求,抽象出适合的类。有如下测试程序和测试程序的输出结果,要求设计类Welcome。void main()Welcome we;Welcome you(we);you.Display();you.Set(“Thank you.”);coutyou.Get()endl;you.talk();you.Display();测试程序的输出结果如右:设计类Welcome 的原则1)在头文件Cpp1.h 中声明类2)在Cpp1.cpp中实现类3)使用内联函数定义Display()函数2.使用类改
3、写程序编写一个求方程的根的程序,用三个函数分别求当大于零、等于零和小于零时方程的根。要求从主函数输入a、b、c的值并输出结果。使用面向过程的解法一般是把变量设为double型,适用库函数cmath进行计算。请注意:使用面向对象的方法解决这个问题,首先要从解一元二次方程出发,抽象一个代表一元二次方程的类。为了使用这个类,必须根据要结局的问题,为这个类设计合适的数据成员和成员函数。3.使用包含(聚合)和派生设计新类(1)使用包含的方法,编写一个点类Point和线段类Line,演示构造函数、复制构造函数、析构函数作用及其调用顺序;(2)使用派生的方法,编写一个点类Point,然后由它派生线段类,并演
4、示构造函数、复制构造函数、析构函数作用及其调用顺序。任务1:小组成员任务分配:李小拉:任务一中的第一个 任务(包括设计思想,流程图,程序编写)胡海薇:任务一中的第二个 任务(包括设计思想,流程图,程序编写)周子研:任务一中的第三个 任务(包括设计思想,流程图,程序编写)最后的结果分析大家一起分析与总结设计思想:1 根据所给的主函数及运行结果来分析,类welcome包含成员函数和数据成员,输入数据和输出数据都将会显示出来,当输入OK时结束输出数据,最后调用析构函数。2 根据题意求二元一次方程的跟,并且要用成员函数和数据成员,应该首先判断是否是二元一次方程,然后再判断有无根,利用选择函数分别调用1
5、个,0个,2个根的函数并将其输出。每输出一个方程的跟后再选择是否要继续。3 1)2)先定义一个point类,再由point类派生出line类,利用构造函数,复制构造函数和析构函数来计算出点点之间的距离也就是线的长度。任务1:1/Cpp1.h #include#include/函数strcpy(),stcmy()包含在此头文件中using namespace std; class Welcome private: char str100; public: Welcome(char s=Welcome!); Welcome (Welcome &); void Set(char ); void Di
6、splay(); char *Get(); void talk(); Welcome(); ;/Cpp1.cpp#include #include#includeCpp1.husing namespace std; Welcome:Welcome(char s)strcpy(str,s); /把字符串数组s中的所有字符,拷贝到字符串数组str中 Welcome:Welcome(Welcome &c) /拷贝构造函数strcpy(str,c.str); void Welcome:Set(char s) strcpy(str,s); inline void Welcome:Display() co
7、utstrendl; char* Welcome:Get() return str;Welcome:Welcome() coutGoodbye!endl;void Welcome:talk() char s100; cout输入:; cin.getline(s,100); while(strcmp(s,OK)!=0) /s不等于OK时,循环输出及输出 cout输出:sendl; cout输入:; cin.getline(s,128); strcpy(str,OK); coutAll right!endl; coutGoodbye!endl;void main() Welcome we; Wel
8、come you(we); you.Display(); you.Set(Thank you.); coutyou.Get()endl; you.talk(); you.Display();结果分析:该程序采用了多文件结构,利用构造函数、析构函数和复制构造函数将结果输出。前面先自动输出Welcome!和Thank you.然后调用函数自己输入什么就输出什么。左后当遇到OK时输出“All right!”和“Goodbye!”最后调用析构函数输出“Goodbye!”任务2#include /包含iostream的头文件 FindRoota,b,c,d,p,q:floatx1,x2:doubleFi
9、ndRoot Find:voidGTzero:voidEQzero:voidLTzero:void#include #include/字符串处理函数using namespace std;class FindRoot/定义类FindRootprivate: float a,b,c;double r,q,x1,x2;/定义数据成员类型 int jud;public: void Input();/输入函数 void Display();/显示函数 void Find();/求根函数;/以上是类的声明部分,以下是类的实现部分void FindRoot:Input()cout这是一个求解ax2+bx+
10、c=0的根的程序:endl;/总述程序 for(; ;) couta; if(a=0) cout错误:a不能为0!endl; else break; /输入a,并对a的可能情况进行判断 coutb;/输入b coutc;/输入cvoid FindRoot:Find()/定义求根的函数 float delta=b*b-4*a*c;/定义求根公式的数据类型 if(delta0) jud=0; r=-b/(2*a); q=sqrt(-delta)/(2*a);/有两个共轭复数根的情况 else if(delta=0) x1=-b/(2*a); jud=1;/有两个相同的根的情况 else x1=(-
11、b+sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); jud=2; /有两个不同的根的情况void FindRoot:Display()/定义显示函数switch(jud)case 0: coutx1=r+qiendl;coutx2=r-qiendl;break;/显示有共轭复数根时的解case 1:coutx1=x2=x1endl;break;/显示有一实根时的解case 2:coutx1=x1nx2=x2endl;break;/显示有两不同根情况的解void main()/主函数while(1) FindRoot f;/定义类型 f.Input();
12、 f.Find(); f.Display();/以上各函数按顺序执行 cout是否退出?(Y退出,其它任意键继续)m;if(strcmp(m,Y)=0|strcmp(m,y)=0)break;/如果退出则终止运行elsecout请继续endl;/如果不退出则继续执行任务3#include #include using namespace std;class Point public: Point(double x1=0, double y1=0)px = x1; py = y1; void Display(void); double Distance(Point &point); Point(
13、); double px, py;double Point:Distance(Point &point) double t1, t2; t1 = point.px - px; t2 = point.py - py; return sqrt(t1*t1+t2*t2);class Line:public Pointpublic: Line(double x1, double y1, double x2, double y2); Line (Line &line); double Display(Line &line); Line(); double x, y;Line:Line(double x1
14、, double y1, double x2, double y2)x = x2 - x1; y = y2 - y1;Line:Line(Line &line) x = line.x; y = line.y;double Line:Display(Line &line)return sqrt(x*x+y*y);Line:Line();void main() Point a; Point b(1,1), c(2, 2); a = c; cout两点之间的距离为: a.Distance(b)endl; Line s(1,1, 2,2); Line s1(s); couts1.Display(s1)
15、endl结果分析:主要利用函数来实现根的求解。先判断a是否为0,若a=0则输出“a不能为0!”不为0则继续输入bc,根据求根公式分别调用函数,实现不同的功能。#include using namespace std;class Point/Point类声明public:Point(int xx=0, int yy=0) X=xx;Y=yy;Point(Point &p);int GetX() return X;int GetY() return Y;private:int X,Y;Point:Point(Point &p)/拷贝构造函数的实现X=p.X;Y=p.Y;class Line/Lin
16、e类的声明public:/外部接口Line (Point xp1, Point xp2);Line (Line &);double GetLen()return len;Line()coutendendl;private:/私有数据成员Point p1,p2;/Point类的对象p1,p2double len;/组合类的构造函数Line: Line (Point xp1, Point xp2):p1(xp1),p2(xp2)double x=double(p1.GetX()-p2.GetX();double y=double(p1.GetY()-p2.GetY();len=sqrt(x*x+y
17、*y);/组合类的拷贝构造函数Line: Line (Line &Seg): p1(Seg.p1), p2(Seg.p2)len=Seg.len;/主函数void main()Point myp1(0,3),myp2(4,0);/建立Point类的对象Line line(myp1,myp2);/建立Line类的对象Line line2(line);/利用拷贝构造函数建立一个新对象coutThe length of the line is:;coutline.GetLen()endl;coutThe length of the line2 is:;coutline2.GetLen()endl;#
18、include #include using namespace std;class Point public: Point(double x1=0, double y1=0)px = x1; py = y1; void Display(void); double Distance(Point &point); Point(); double px, py;double Point:Distance(Point &point) double t1, t2; t1 = point.px - px; t2 = point.py - py; return sqrt(t1*t1+t2*t2);clas
19、s Line:public Pointpublic: Line(double x1, double y1, double x2, double y2); Line (Line &line); double Display(Line &line); Line(); double x, y;Line:Line(double x1, double y1, double x2, double y2) x = x2 - x1; y = y2 - y1;Line:Line(Line &line) x = line.x; y = line.y;double Line:Display(Line &line)
20、return sqrt(x*x+y*y);Line:Line();void main() Point a; Point b(1, 1), c(2, 2); a = c; cout两点之间的距离为: a.Distance(b)endl; Line s(1, 1, 2,2); Line s1(s); couts1.Display(s1)endl;任务2人力资源管理系统(局部)某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员信息编号顺序加1。月薪计算方法:(1)
21、经理拿固定月薪8000元;(2)兼职技术人员按每小时100元领取月薪;(3)兼职推销员的月薪按该推销员当月销售额的4%提成;(4)销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。程序要对所有人员有提升级别的功能。可将所有人员的初始级别均定为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,销售人员仍为1级。(本项提升级别的方法可以自行确定。)设计要求:在附件中给出的资料基础上进行完善。完成类的设计(1)按照给定资料,设计类(2)进行类成员函数的实现(3)给出代码的注释(4)画出系统中出现的类的类图屏幕显示采用菜单形式整体功能(1
22、)可以随时通过雇员的名字查询他的工资情况。(2)有查询结束标志。(3)有查询提示。小组成员任务分配:小组成员都参与了这次的程序设计,一起讨论并且交换设计思想,一起设计流程图,一起将其改成与题目相符合的程序。最后一起分析完成这次的设计。/3.cpp#include #include date1.h#include string.husing std:string;int main()manager m1;technician t1;salesmanager sm1;salesman s1;m1.promote(3);m1.pay();/m1.displayStatus();cout *endl;
23、 cout endl;t1.promote(2);t1.pay();/t1.displayStatus(); cout endl;cout *endl; cout endl;sm1.promote(2);sm1.pay();/sm1.displayStatus(); cout endl;cout *endl;cout endl;s1.pay();/s1.displayStatus(); cout endl; cout *endl;cout endl;employee e4 =m1,t1,sm1,s1;while(true)char chazhao50;coutchazhao;string em
24、Name = chazhao;for(int i =0 ; i 4 ; i+)employee em = ei;if(strcmp(em.name.c_str(),chazhao)=0)em.pay();em.displayStatus();cout 是否退出?(Y退出,其它任意键继续) m;if(strcmp(m,Y)=0|strcmp(m,y)=0)break;elsecout 继续.endl;return 0;/3.h#include #include string.husing std:string;class employeeprotected:int individualEmpNo
25、;int grade;float accumPay;static int employeeNo;string zhiwu;public:employee();employee(); void pay(); string name;void promote(int increment); void displayStatus()cout ; coutzhiwu.c_str(); coutname.c_str(); cout编号 individualEmpNo级别为grade级,已付本月工资accumPayendl;class technician:public employeeprivate:f
26、loat hourlyRate;int workHours;public:technician();void pay();class salesman:virtual public employeeprotected: double CommRate;double sales;public:salesman();void pay();class manager:virtual public employeeprotected:float monthlyPay;public:manager();void pay();class salesmanager:public manager,public
27、 salesmanpublic:salesmanager();void pay();/3.h1#include #include #include date.hint employee:employeeNo = 1000;employee:employee()char namestr50;coutnamestr;name = namestr;individualEmpNo = employeeNo+;grade = 1;accumPay = 0.0;employee:employee()void employee:pay()void employee:promote(int increment
28、)grade += increment;technician:technician()zhiwu = 技术员;hourlyRate = 100;void technician:pay()cout 请输入name.c_str()workHours;accumPay = hourlyRate * workHours;cout 技术员name.c_str()编号individualEmpNo本月工资accumPayendl;salesman:salesman()zhiwu = 销售员;CommRate = 0.04;void salesman:pay()cout 请输入name.c_str()sal
29、es;accumPay = sales * CommRate;cout 推销员name.c_str()编号individualEmpNo本月工资accumPayendl;manager:manager()zhiwu = 经理;monthlyPay = 8000;void manager:pay()accumPay = monthlyPay;cout 经理name.c_str()编号individualEmpNo本月工资accumPayendl;salesmanager:salesmanager() zhiwu = 销售经理;monthlyPay = 5000;CommRate = 0.05;void salesmanager:pay()accumPay = monthlyPay;cout 请输入employee:name.c_str()sales;accumPay = monthlyPay + sales * CommRate;cout 销售经理name.c_str()编号individualEmpNo本月工资accumPayendl;结果分析: 专心-专注-专业