《 面向对象程序设计》课程设计实验报告.docx
《《 面向对象程序设计》课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《《 面向对象程序设计》课程设计实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
《面向对象程序设计》课程设计实验报告
《面向对象程序设计》课程设计
实
验
报
告
指导教师
小组成员:
专业班级:
2010级计算机科学与技术专业
开设时间:
2011-2012
(一)
目录
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。
voidmain()
{
Welcomewe;
Welcomeyou(we);
you.Display();
you.Set(“Thankyou.”);
cout<you.talk();
you.Display();
}
测试程序的输出结果如右:
设计类Welcome的原则
1)在头文件Cpp1.h中声明类
2)在Cpp1.cpp中实现类
3)使用内联函数定义Display()函数
2.使用类改写程序
编写一个求方程
的根的程序,用三个函数分别求当
大于零、等于零和小于零时方程的根。
要求从主函数输入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()包含在此头文件中
usingnamespacestd;
classWelcome
{
private:
charstr[100];
public:
Welcome(chars[]="Welcome!
");
Welcome(Welcome&);
voidSet(char[]);
voidDisplay();
char*Get();
voidtalk();
~Welcome();
};
//Cpp1.cpp
#include
#include
#include"Cpp1.h"
usingnamespacestd;
Welcome:
:
Welcome(chars[])
{strcpy(str,s);}//把字符串数组s中的所有字符,拷贝到字符串数组str中
Welcome:
:
Welcome(Welcome&c)//拷贝构造函数
{strcpy(str,c.str);}
voidWelcome:
:
Set(chars[])
{strcpy(str,s);}
inlinevoidWelcome:
:
Display()
{
cout<}
char*Welcome:
:
Get()
{
returnstr;
}
Welcome:
:
~Welcome()
{
cout<<"Goodbye!
"<}
voidWelcome:
:
talk()
{
chars[100];
cout<<"输入:
";
cin.getline(s,100);
while(strcmp(s,"OK")!
=0)//s不等于"OK"时,循环输出及输出
{
cout<<"输出:
"<
cout<<"输入:
";
cin.getline(s,128);
}
strcpy(str,"OK");
cout<<"Allright!
"<cout<<"Goodbye!
"<}
voidmain()
{
Welcomewe;
Welcomeyou(we);
you.Display();
you.Set("Thankyou.");
cout<you.talk();
you.Display();
}
结果分析:
该程序采用了多文件结构,利用构造函数、析构函数和复制构造函数将结果输出。
前面先自动输出Welcome!
和Thankyou.然后调用函数自己输入什么就输出什么。
左后当遇到OK时输出“Allright!
”和“Goodbye!
”最后调用析构函数输出“Goodbye!
”
任务2
#include//包含iostream的头文件
FindRoot
a,b,c,d,p,q:
float
x1,x2:
double
FindRoot
Find:
void
GTzero:
void
EQzero:
void
LTzero:
void
#include
#include//字符串处理函数
usingnamespacestd;
classFindRoot//定义类FindRoot
{
private:
floata,b,c;
doubler,q,x1,x2;//定义数据成员类型
intjud;
public:
voidInput();//输入函数
voidDisplay();//显示函数
voidFind();//求根函数
};
//以上是类的声明部分,以下是类的实现部分
voidFindRoot:
:
Input()
{cout<<"这是一个求解ax2+bx+c=0的根的程序:
"<for(;;)
{
cout<<"输入方程系数a:
";
cin>>a;
if(a==0)
cout<<"错误:
a不能为0!
!
!
"<elsebreak;
}//输入a,并对a的可能情况进行判断
cout<<"输入方程系数b:
";
cin>>b;//输入b
cout<<"输入方程系数c:
";
cin>>c;//输入c
}
voidFindRoot:
:
Find()//定义求根的函数
{
floatdelta=b*b-4*a*c;//定义求根公式的数据类型
if(delta<0)
{jud=0;
r=-b/(2*a);
q=sqrt(-delta)/(2*a);//有两个共轭复数根的情况
}
elseif(delta==0)
{x1=-b/(2*a);
jud=1;}//有两个相同的根的情况
else
{x1=(-b+sqrt(delta))/(2*a);
x2=(-b-sqrt(delta))/(2*a);
jud=2;}//有两个不同的根的情况
}
voidFindRoot:
:
Display()//定义显示函数
{
switch(jud)
{
case0:
{cout<<"x1="<cout<<"x2="<case1:
cout<<"x1=x2="<case2:
cout<<"x1="<}
}
voidmain()//主函数
{
while
(1)
{
FindRootf;//定义类型
f.Input();
f.Find();
f.Display();//以上各函数按顺序执行
cout<<"是否退出?
(Y退出,其它任意键继续)"<charm[2];charY[]="Y";chary[]="y";//定义字符串
cin>>m;
if(strcmp(m,Y)==0||strcmp(m,y)==0)
break;//如果退出则终止运行
else
cout<<"请继续……"<}
}
任务3
#include
#include
usingnamespacestd;
classPoint
{
public:
Point(doublex1=0,doubley1=0){px=x1;py=y1;};
voidDisplay(void);
doubleDistance(Point&point);
~Point(){};
doublepx,py;
};
doublePoint:
:
Distance(Point&point)
{
doublet1,t2;
t1=point.px-px;
t2=point.py-py;
returnsqrt(t1*t1+t2*t2);
}
classLine:
publicPoint
{
public:
Line(doublex1,doubley1,doublex2,doubley2);
Line(Line&line);
doubleDisplay(Line&line);
~Line();
doublex,y;
};
Line:
:
Line(doublex1,doubley1,doublex2,doubley2)
{x=x2-x1;
y=y2-y1;
}
Line:
:
Line(Line&line)
{x=line.x;
y=line.y;}
doubleLine:
:
Display(Line&line)
{returnsqrt(x*x+y*y);}
Line:
:
~Line(){};
voidmain()
{Pointa;
Pointb(1,1),c(2,2);
a=c;
cout<<"两点之间的距离为:
"<Lines(1,1,2,2);
Lines1(s);
cout<结果分析:
主要利用函数来实现根的求解。
先判断a是否为0,若a=0则输出“a不能为0!
!
!
”不为0则继续输入bc,根据求根公式分别调用函数,实现不同的功能。
#include
usingnamespacestd;
classPoint//Point类声明
{
public:
Point(intxx=0,intyy=0){X=xx;Y=yy;}
Point(Point&p);
intGetX(){returnX;}
intGetY(){returnY;}
private:
intX,Y;
};
Point:
:
Point(Point&p)//拷贝构造函数的实现
{
X=p.X;
Y=p.Y;
}
classLine//Line类的声明
{
public:
//外部接口
Line(Pointxp1,Pointxp2);
Line(Line&);
doubleGetLen(){returnlen;}
~Line(){cout<<"end"<private:
//私有数据成员
Pointp1,p2;//Point类的对象p1,p2
doublelen;
};//组合类的构造函数
Line:
:
Line(Pointxp1,Pointxp2):
p1(xp1),p2(xp2)
{
doublex=double(p1.GetX()-p2.GetX());
doubley=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);
}
//组合类的拷贝构造函数
Line:
:
Line(Line&Seg):
p1(Seg.p1),p2(Seg.p2)
{
len=Seg.len;
}
//主函数
voidmain()
{
Pointmyp1(0,3),myp2(4,0);//建立Point类的对象
Lineline(myp1,myp2);//建立Line类的对象
Lineline2(line);//利用拷贝构造函数建立一个新对象
cout<<"Thelengthofthelineis:
";
cout<cout<<"Thelengthoftheline2is:
";
cout<}
#include
#include
usingnamespacestd;
classPoint
{
public:
Point(doublex1=0,doubley1=0){px=x1;py=y1;};
voidDisplay(void);
doubleDistance(Point&point);
~Point(){};
doublepx,py;
};
doublePoint:
:
Distance(Point&point)
{
doublet1,t2;
t1=point.px-px;
t2=point.py-py;
returnsqrt(t1*t1+t2*t2);
}
classLine:
publicPoint
{
public:
Line(doublex1,doubley1,doublex2,doubley2);
Line(Line&line);
doubleDisplay(Line&line);
~Line();
doublex,y;
};
Line:
:
Line(doublex1,doubley1,doublex2,doubley2)
{
x=x2-x1;
y=y2-y1;
}
Line:
:
Line(Line&line)
{
x=line.x;
y=line.y;
}
doubleLine:
:
Display(Line&line)
{
returnsqrt(x*x+y*y);
}
Line:
:
~Line(){};
voidmain()
{
Pointa;
Pointb(1,1),c(2,2);
a=c;
cout<<"两点之间的距离为:
"<Lines(1,1,2,2);
Lines1(s);
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"
usingstd:
:
string;
intmain()
{
managerm1;
techniciant1;
salesmanagersm1;
salesmans1;
m1.promote(3);
m1.pay();
//m1.displayStatus();
cout<<"*******************************************"<cout<<""<t1.promote
(2);
t1.pay();
//t1.displayStatus();
cout<<""<cout<<"*******************************************"<cout<<""<sm1.promote
(2);
sm1.pay();
//sm1.displayStatus();
cout<<""<cout<<"*******************************************"<cout<<""<s1.pay();
//s1.displayStatus();
cout<<""<cout<<"*******************************************"<cout<<""<employeee[4]={m1,t1,sm1,s1};
while(true){
charchazhao[50];
cout<<"请输入要查找的雇员姓名:
";
cin>>chazhao;
stringemName=chazhao;
for(inti=0;i<4;i++)
{
employeeem=e[i];
if(strcmp(em.name.c_str(),chazhao)==0)
{
em.pay();
em.displayStatus();
}
}
cout<<"是否退出?
(Y退出,其它任意键继续)"<charm[2];charY[]="Y";chary[]="y";
cin>>m;
if(strcmp(m,Y)==0||strcmp(m,y)==0)
break;
else
cout<<"继续..."<}
return0;
}
//3.h
#include
#include"string.h"
usingstd:
:
string;
classemployee
{protected:
intindividualEmpNo;
intgrade;
floataccumPay;
staticintemployeeNo;
stringzhiwu;
public:
employee();
~employee();
voidpay();
stringname;
voidpromote(intincrement);
voiddisplayStatus(){cout<<"";
cout<cout<cout<<"编号"<};
classtechnician:
publicemployee
{private:
floathourlyRate;
intworkHours;
public:
technician();
voidpay();
};
classs