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、清单 22.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()
3、函数2.使用类改写程序编写一个求方程的根的程序,用三个函数分别求当大于零、等于零和小于零时方程的根。要求从主函数输入a、b、c的值并输出结果。使用面向过程的解法一般是把变量设为double型,适用库函数cmath进行计算。请注意:使用面向对象的方法解决这个问题,首先要从解一元二次方程出发,抽象一个代表一元二次方程的类。为了使用这个类,必须根据要结局的问题,为这个类设计合适的数据成员和成员函数。3.使用包含(聚合)和派生设计新类(1)使用包含的方法,编写一个点类Point和线段类Line,演示构造函数、复制构造函数、析构函数作用及其调用顺序;(2)使用派生的方法,编写一个点类Point,然后由它
4、派生线段类,并演示构造函数、复制构造函数、析构函数作用及其调用顺序。任务1:小组成员任务分配:李小拉:任务一中的第一个 任务(包括设计思想,流程图,程序编写)胡海薇:任务一中的第二个 任务(包括设计思想,流程图,程序编写)周子研:任务一中的第三个 任务(包括设计思想,流程图,程序编写)最后的结果分析大家一起分析与总结设计思想:1 根据所给的主函数及运行结果来分析,类welcome包含成员函数和数据成员,输入数据和输出数据都将会显示出来,当输入OK时结束输出数据,最后调用析构函数。2 根据题意求二元一次方程的跟,并且要用成员函数和数据成员,应该首先判断是否是二元一次方程,然后再判断有无根,利用选
5、择函数分别调用1个,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 );
6、 void Display(); 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:Disp
7、lay() coutstrendl; 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
8、 we; Welcome 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:
9、doubleFindRoot 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这是一个求
10、解ax2+bx+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;/有两个相同的根的情况 el
11、se x1=(-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
12、;/定义类型 f.Input(); 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(Poi
13、nt &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);class Line:public Pointpublic: Line(double x1, double y1, double x2, double y2); Line (Line &line); double Display(Line &line); Line(); double x, y;L
14、ine: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)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);
15、couts1.Display(s1)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;
16、Y=p.Y;class Line /Line类的声明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(
17、)-p2.GetY();len=sqrt(x*x+y*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
18、is:;coutline2.GetLen()endl;#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; r
19、eturn 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, double y1, double x2, double y2) x = x2 - x1; y = y2 - y1;Line:Line(Line &line) x = line.x; y = line.y;doub
20、le 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)endl;任务2人力资源管理系统(局部)某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号基数为100
21、0,每输入一个人员信息编号顺序加1。月薪计算方法:(1)经理拿固定月薪8000元;(2)兼职技术人员按每小时100元领取月薪;(3)兼职推销员的月薪按该推销员当月销售额的4%提成;(4)销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。程序要对所有人员有提升级别的功能。可将所有人员的初始级别均定为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,销售人员仍为1级。(本项提升级别的方法可以自行确定。)设计要求:在附件中给出的资料基础上进行完善。完成类的设计(1)按照给定资料,设计类(2)进行类成员函数的实现(3)给出代码的注释(4)
22、画出系统中出现的类的类图屏幕显示采用菜单形式整体功能(1) 可以随时通过雇员的名字查询他的工资情况。(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.
23、pay();/ m1.displayStatus(); cout *endl; 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,sm
24、1,s1;while(true) char chazhao50; coutchazhao; string emName = 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.husi
25、ng std:string;class employeeprotected: int individualEmpNo; 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: float hourlyRate; int workHours;public: technician();void pay();class s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1