《 面向对象程序设计》课程设计
指导教师 小组成员:专业班级:开设时间:
实 验 报 告
级计算机科学与技术专业 2011-2012(一)
2010
目录
1. 任务1„„„„„„„„„„„„„„„„„„„„„„„2
1.1 任务介绍……………………………………………2 1.2 小组成员任务分配…………………………………2 1.3.1设计思想及主要流程图 …………………………2 1.3.1主要程序清单 ……………………………………2 1.3.1 运行结果及分析…………………………………4 1.3.2设计思想及主要流程图 …………………………2 1.3.2主要程序清单 ……………………………………2 1.3.2 运行结果及分析 …………………………………4 1.3.3设计思想及主要流程图 …………………………2 1.3.3主要程序清单 ……………………………………2 1.3.3 运行结果及分析…………………………………4
2. 任务2 „„„„„„„„„„„„„„„„„„„„„„2
2.1 任务介绍……………………………………………2 2.2 小组成员任务分配…………………………………2 2.3设计思想及主要流程图 ……………………………2 2.3主要程序清单 ………………………………………2 2.3 运行结果及分析 ……………………………………4 3收获、体会和建议 ……………………………………4
任务1.按照要求设计类 1.根据输出设计类
设计类就是根据数据封装的要求,抽象出适合的类。
有如下测试程序和测试程序的输出结果,要求设计类Welcome。 void main() {
Welcome we; Welcome you(we); you.Display();
you.Set(“Thank you.”); cout
测试程序的输出结果如右: 设计类Welcome 的原则 1)在头文件Cpp1.h 中声明类 2)在Cpp1.cpp中实现类
3)使用内联函数定义Display()函数
2.使用类改写程序
22
编写一个求方程axbxc0的根的程序,用三个函数分别求当b4ac大于零、等于零和小于零时方程的根。要求从主函数输入a、b、c的值并输出结果。使用面向过程的解法一般是把变量设为double型,适用库函数cmath进行计算。 请注意:使用面向对象的方法解决这个问题,首先要从解一元二次方程出发,抽象一个代表一元二次方程的类。为了使用这个类,必须根据要结局的问题,为这个类设计合适的数据成员和成员函数。 3.使用包含(聚合)和派生设计新类
(1)使用包含的方法,编写一个点类Point和线段类Line,演示构造函数、复制构造函数、析构函数作用及其调用顺序;
(2)使用派生的方法,编写一个点类Point,然后由它派生线段类,并演示构造函数、复制构造函数、析构函数作用及其调用顺序。
任务1:小组成员任务分配:
李小拉:任务一中的第一个 任务(包括设计思想,流程图,程序编写) 胡海薇:任务一中的第二个 任务(包括设计思想,流程图,程序编写) 周子研:任务一中的第三个 任务(包括设计思想,流程图,程序编写) 最后的结果分析大家一起分析与总结 设计思想:
1. 根据所给的主函数及运行结果来分析,类welcome包含成员函数和数据成
员,输入数据和输出数据都将会显示出来,当输入OK时结束输出数据,最后调用析构函数。
2. 根据题意求二元一次方程的跟,并且要用成员函数和数据成员,应该首先判
断是否是二元一次方程,然后再判断有无根,利用选择函数分别调用1个,0个,2个根的函数并将其输出。每输出一个方程的跟后再选择是否要继续。 3. 1)
2)先定义一个point类,再由point类派生出line类,利用构造函数,复制构造函数和析构函数来计算出点点之间的距离也就是线的长度。
任务1:1 //Cpp1.h
#include
#include//函数strcpy(),stcmy()包含在此头文件中
using namespace std;
class Welcome { private: char str[100]; public:
Welcome(char s[]="Welcome!"); Welcome (Welcome &); void Set(char []); void Display(); char *Get(); void talk(); ~Welcome(); };
//Cpp1.cpp
#include #include #include"Cpp1.h" using 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() {
cout
char* Welcome::Get() {
return str; }
Welcome::~Welcome() {
cout
void Welcome::talk() {
char s[100]; cout
while(strcmp(s,"OK")!=0) //s不等于"OK"时,循环输出及输出 {
cout
strcpy(str,"OK"); cout
void main() {
Welcome we; Welcome you(we); you.Display(); you.Set("Thank you."); cout
结果分析:该程序采用了多文件结构,利用构造函数、析构函数和复制构造函数将结果输出。前面先自动输出Welcome!和Thank you.然后调用函数自己输入什么就输出什么。左后当遇到OK时输出“All right!”和“Goodbye!”最后调用析构函数输出“Goodbye!” 任务2
#include //包含iostream的头文件#include
#include//字符串处理函数 using namespace std;
class FindRoot//定义类FindRoot { private:
float a,b,c;
double r,q,x1,x2;//定义数据成员类型
int jud; public:
void Input();//输入函数 void Display();//显示函数 void Find();//求根函数 };
//以上是类的声明部分,以下是类的实现部分 void FindRoot::Input()
{cout
cout>a; if(a==0)
cout
}//输入a,并对a的可能情况进行判断 cout>b;//输入b
cout>c;//输入c }
void FindRoot::Find()//定义求根的函数 {
float delta=b*b-4*a*c;//定义求根公式的数据类型 if(delta
q=sqrt(-delta)/(2*a);//有两个共轭复数根的情况
}
else if(delta==0) { x1=-b/(2*a);
jud=1;}//有两个相同的根的情况 else
{ x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a);
jud=2; } //有两个不同的根的情况 }
void FindRoot::Display()//定义显示函数 { }
void main()//主函数 {
while(1) {
switch(jud) { case 0:
{cout
cout
cout
cout
的解
FindRoot f;//定义类型 f.Input(); f.Find();
f.Display();//以上各函数按顺序执行
cout>m;
if(strcmp(m,Y)==0||strcmp(m,y)==0) break;//如果退出则终止运行 else
cout
}
任务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(){}; 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 Point { public:
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) {return sqrt(x*x+y*y);} Line::~Line(){}; void main() { Point a;
Point b(1,1), c(2, 2); a = c;
cout
cout
结果分析:主要利用函数来实现根的求解。先判断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 //Line类的声明 {
public: //外部接口
Line (Point xp1, Point xp2); Line (Line &);
double GetLen(){return len;} ~Line(){cout
Point p1,p2; //Point类的对象p1,p2 double 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*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);//利用拷贝构造函数建立一个新对象
cout
cout
}
#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); }
class Line:public Point { public:
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) {
return sqrt(x*x+y*y); }
Line::~Line(){}; void main() { Point a;
Point b(1, 1), c(2, 2); a = c;
cout
cout
}
任务2.人力资源管理系统(局部)
某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员信息编号顺序加1。 月薪计算方法:
(1)经理拿固定月薪8000元;
(2)兼职技术人员按每小时100元领取月薪;
(3)兼职推销员的月薪按该推销员当月销售额的4%提成;
(4)销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。
程序要对所有人员有提升级别的功能。可将所有人员的初始级别均定为1级,然后进行升级,经理升为4级,兼职技术人员和销售经理升为3级,销售人员仍为1级。(本项提升级别的方法可以自行确定。) 设计要求:
在附件中给出的资料基础上进行完善。
完成类的设计
(1)按照给定资料,设计类 (2)进行类成员函数的实现 (3)给出代码的注释
(4)画出系统中出现的类的类图 屏幕显示采用菜单形式 整体功能
(1) 可以随时通过雇员的名字查询他的工资情况。 (2) 有查询结束标志。 (3) 有查询提示。
小组成员任务分配:小组成员都参与了这次的程序设计,一起讨论并且交换设计思想,一起设计流程图,一起将其改成与题目相符合的程序。最后一起分析完成这次的设计。
//3.cpp
#include #include "date1.h"
#include "string.h" using std::string; int main() { manager m1; technician t1; salesmanager sm1; salesman s1; m1.promote(3); m1.pay();
// m1.displayStatus(); cout
// t1.displayStatus();
cout
// sm1.displayStatus();
cout
// s1.displayStatus();
cout>chazhao; string emName = chazhao;
for(int i =0 ; i
employee em = e[i];
if(strcmp(em.name.c_str(),chazhao)==0) { em.pay(); em.displayStatus(); } }
cout> m;
if(strcmp(m,Y)==0||strcmp(m,y)==0) break; else
cout
return 0; } //3.h
#include #include "string.h" using std::string; class employee {protected: 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
};
class technician:public employee {private: float hourlyRate; int workHours; public: technician(); void pay(); };
class salesman:virtual public employee {protected:
double CommRate; double sales; public: salesman(); void pay(); };
class manager:virtual public employee {protected: float monthlyPay; public: manager(); void pay(); };
class salesmanager:public manager,public salesman {public: salesmanager(); void pay(); }; //3.h1
#include #include #include "date.h"
int employee::employeeNo = 1000; employee::employee() { char namestr[50]; cout>namestr; name = namestr; individualEmpNo = employeeNo++; grade = 1;
}
employee::~employee(){ } void employee::pay(){}
void employee::promote(int increment){ grade += increment;} technician::technician(){ zhiwu = "技术员"; hourlyRate = 100;} void technician::pay()
{ cout>workHours; accumPay = hourlyRate * workHours; cout
salesman::salesman(){ zhiwu = "销售员"; CommRate = 0.04;} void salesman::pay()
{ cout>sales; accumPay = sales * CommRate; cout
manager::manager(){ zhiwu = "经理"; monthlyPay = 8000;} void manager::pay()
{ accumPay = monthlyPay; cout
salesmanager::salesmanager()
{ zhiwu = "销售经理";monthlyPay = 5000; CommRate = 0.05;} void salesmanager::pay()
{ accumPay = monthlyPay; cout>sales; accumPay = monthlyPay + sales * CommRate; cout
浙江理工大学科技与艺术学院机电系课程设计报告
结果分析:
21