孟州市第二人民医院
信息管理中心人员
第二篇:面向对象的程序设计(C++)课程设计报告,通过组合和派生构成新的类、人员信息管理系统、成绩管理系统
面向对象的程序设计
姓
学
班
院 日
课程设计报告 名: 号: 100511217 级:大类1002班 系:数学与计算机学院 期:2011.12.30
题目1:通过组合和派生构成新的类
本设计题目的任务是使用Point类产生Line类。分别通过组合类及派生类两种方法实现,并要求分别给出使用类模板实现的程序。
本设计题的目的是使学生掌握在不同的实现方法中,如何设计相应的构造函数和拷贝构造函数,进一步理解程序调用它们及析构函数的执行顺序,掌握组合类和派生类。另外本设计题目要让学生进一步掌握和理解类模板的技术及其实现方法。
1. 设计框图:
2、源程序
(1)组合类实现
#include<iostream>
#include<cmath>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;}
Point(Point &p);
intGetX(){return X;}
intGetY(){return Y;}
private:
int X,Y;
};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
cout<<"Point拷贝构造函数被调用"<<endl; }
//类的组合
class Line
{
public:
Line(Point xp1,Point xp2);
Line(Line &);
doubleGetLen(){return len;}
private:
Point p1,p2;
doublelen;
};
//组合类的构造函数
Line::Line(Point xp1,Point xp2)
:p1(xp1),p2(xp2)
{
cout<<"Line构造函数被调用"<<endl; double x=double(p1.GetX()-p2.GetX()); double y=double(p1.GetY()-p2.GetY()); len=sqrt(x*x+y*y);
}
//组合类的拷贝构造函数
Line::Line(Line &L):p1(L.p1),p2(L.p2) {
cout<<"Line拷贝构造函数被调用"<<endl; len=L.len;
}
//主函数
void main()
{
Point myp1(1,1),myp2(3,7);
Line line(myp1,myp2);
Line line2(line);
cout<<"The length of the line is:"; cout<<line.GetLen()<<endl;
cout<<"The length of the line2 is:"; cout<<line2.GetLen()<<endl;
}
编译结果;
(2)派生类实现
#include <iostream>
#include <cmath>
using namespace std;
class Point //Point类
{
public:
Point(int xx=0, intyy=0)
{
cout<<"Point类的构造函数被调用"<<endl; X=xx;
Y=yy;
}
Point(Point &p);
~Point()
{
cout<<"Point类的析构函数被调用"<<endl; }
intGetX() {return X;}
intGetY() {return Y;}
private:
int X,Y;
};
Point::Point(Point &p) //拷贝构造函数的实现 {
X=p.X;
Y=p.Y;
cout<<"Point类的拷贝构造函数被调用"<<endl; }
class Line:public Point //派生类Line
{
public:
Line (int x1, int y1,int x2,int y2,double z=0.0)
:p1(x1,y1),p2(x2,y2) //初始化列表
{
cout<<"Line类的构造函数被调用"<<endl; len=z;
double x=double(p1.GetX()-p2.GetX());
double y=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);
}
Line (Line &L);
~Line()
{
cout<<"Line类的析构函数被调用"<<endl; }
doubleGetLen()
{
return len; //返回得到的长度
}
private:
Point p1,p2; //Point类的对象p1,p2
doublelen;
};
Line::Line(Line &L):p1(L.p1),p2(L.p2)
{
cout<<"Line类的拷贝构造函数被调用"<<endl; len=L.len;
}
int main() //主函数
{
Point myp1(1,1),myp2(4,6); //建立Point类的对象 Line line1(1,1,4,6);
Line line2(line1); //利用拷贝构造函数建立一个新对象 cout<<"The length of the line1 is:";
cout<<line1.GetLen()<<endl;
cout<<"The length of the line2 is:";
cout<<line2.GetLen()<<endl;
return 0;
}
3、编译结果:
4、小结
首先由于刚开始没读懂题意,我直接把课题中的模板类实现做成只有一个display()函数,根本没有真正显示出模板类的优点,后来通过和其他同学的讨论研究才发现自己在理解上有些偏差,于是我毫不犹豫地把原来学的程序放弃了,直接重新开始我的新任务,最后终于搞出来时,心情异常激动。
题目2:人员信息管理系统
本设计题目的任务是设计一个人员信息管理系统,并使用虚函数实现多态性,完成显示不同人员信息的任务。
设计employee类,用来存储雇员的编号,级别,月薪等信息,能够对其进行操作和显示。
以employee为基类派生出technician类,表示兼职技术人员,以及manager类,表示经理,以及salesman类,表示兼职推销员。利用manage类和salesman类派生出salesmanager类,表示销售经理。注意使用虚基类。
进一步使用虚函数和抽象类改进上面的程序。
本设计题目的目的是让学生进一步理解和掌握C++中类的继承,虚基类,多态性,虚函数以及抽象类技术及实现方法。
2、源程序:
#include<iostream>
#include<cstring>
using namespace std;
class employee
{
protected:
char name[20]; //姓名
intindividualEmpNo; //个人编号
int grade; //级别
float accumPay; //月薪总额
static intemployeeNo; //本公司职员编号目前最大值 public:
employee(); //够造函数 ~employee(); //
void pay();
void promote(int);
voidSetName(char *);
char * GetName();
intGetindividualEmpNo();
intGetgrade();
floatGetaccumPay();
};
classtechnician:public employee
{
private:
floathourlyRate;
intworkHours;
public:
technician();
voidSetworkHours(intwh);
void pay();
};
classsalesman:virtual public employee
{
protected:
floatCommRate;
float sales;
public:
salesman();
voidSetsales(float sl);
void pay();
};
classmanager:virtual public employee {
protected:
floatmonthlyPay;
public:
manager();
void pay();
};
classsalesmanager:publicmanager,public salesman {
public:
salesmanager();
void pay();
};
int employee::employeeNo=1000;
employee::employee()
{
individualEmpNo=employeeNo++; grade=1;
accumPay=0.0;
}
employee::~employee(){}
void employee::pay(){}
void employee::promote(int increment) {grade+=increment;}
void employee::SetName(char * names) {strcpy(name,names);}
char * employee::GetName()
{return name;}
int employee::GetindividualEmpNo()
{returnindividualEmpNo;}
int employee::Getgrade()
{return grade;}
float employee::GetaccumPay()
{
returnaccumPay;
}
technician::technician()
{hourlyRate=100;}
void technician::SetworkHours(intwh) {workHours=wh;}
void technician::pay()
{accumPay=hourlyRate*workHours;}
salesman::salesman()
{CommRate=0.04;}
void salesman::Setsales(float sl)
{sales=sl;}
void salesman::pay()
{accumPay=sales*CommRate;}
manager::manager()
{monthlyPay=8000;}
void manager::pay()
{accumPay=monthlyPay;}
salesmanager::salesmanager()
{
monthlyPay=5000;
CommRate=0.005;
}
voidsalesmanager::pay()
{accumPay=monthlyPay+CommRate*sales;}
void main()
{
manager m1;
technician t1;
salesmanager sm1;
salesman s1; charnamestr[20]; cout<<"请输入下一个雇员的姓名:"<<endl; cin>>namestr; m1.SetName(namestr); cout<<"请输入下一个雇员的姓名:"<<endl; cin>>namestr; t1.SetName(namestr); cout<<"请输入下一个雇员的姓名:"<<endl; cin>>namestr; sm1.SetName(namestr); cout<<"请输入下一个雇员的姓名:"<<endl; cin>>namestr; s1.SetName(namestr); m1.promote(3); m1.pay(); cout<<"请输入兼职技术人员"<<t1.GetName()<<"本月的工作时数:"; intww; cin>>ww; t1.SetworkHours(ww); t1.promote(2); t1.pay(); cout<<"请输入销售经理"<<sm1.GetName()<<"所管辖部门本月的销售总额:"; floatsl; cin>>sl; sm1.Setsales(sl); sm1.pay(); sm1.promote(2); cout<<"请输入推销员"<<s1.GetName()<<"本月的销售额:"; cin>>sl; s1.Setsales(sl); s1.pay(); //显示m1信息 cout<<m1.GetName()<<"编号"<<m1.GetindividualEmpNo() <<"级别为"<<m1.Getgrade()<<"级,本月工资"<<m1.GetaccumPay()<<endl;
//显示t1信息
cout<<t1.GetName()<<"编号"<<t1.GetindividualEmpNo()
<<"级别为"<<t1.Getgrade()<<"级,本月工资"<<t1.GetaccumPay()<<endl; //显示sml的信息
cout<<sm1.GetName()<<"编号"<<sm1.GetindividualEmpNo()
<<"级别为"<<sm1.Getgrade()<<"级,本月工资"<<sm1.GetaccumPay()<<endl; //显示s1信息
cout<<s1.GetName()<<"编号"<<s1.GetindividualEmpNo()
<<"级别为"<<s1.Getgrade()<<"级,本月工资"<<s1.GetaccumPay()<<endl; }
3、编译结果:
4、小结
对于第二个课题,原本以为很简单的事,忽然发现运行时总是提醒调用了private的数据成员,搞得我很迷糊,虽然很努力的整天对着电脑修改错误,但结果收效甚微,错误没改好,貌似又出现了更多的错误,简直是一团乱麻,当时真想放弃,最终在同学的帮忙下终于做完,有点身心疲惫的感觉。
题目3:成绩管理系统
输入一个班级的学生基本信息(包括学号,姓名,性别,科目),对N门考试的成绩进行管理(例N=5)
要求
? 用户录入每个学生每门课程的分数;
? 能够计算每个学生的各门功课总分和平均分,并按总分将成绩排序,显示每个学生的
总分和排名;
? 计算全班各门功课的平均分,显示每门课程中低于平均分的每一个学生的学号,姓名,
性别,科目,成绩等信息;
? 显示每门科目中,成绩在90分以上的学生信息。另外还输出每门科目中不及格的学
生信息;
? 能按姓名或者学号查找,增加,删除和保存各个学生的信息。
源程序:
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <iostream>
#include <ctime>
#define max 100
structstu //学生资料结构体 {
char name[10];
intnum;
charadress[10];
floatx,y,z,score;
int number;
};
int count=0;
int temp=0;
class student //学生类
{
private:
stu data[max];
charstart_del;
public:
void input(char *ch1,int num,char *ch2,float x,floaty,float z); //输入
void find(intnum); //查找 void del(intnum); //删除
intcheck_num(intnum) //确定没有重复学号 {
int m=0;
while(m<=count)
if(num==data[m++].num)
break;
if(m>count)
return 0;
else
return 1;
}
void taxis();
void show();
};
void student::input(char *ch1,int num,char *ch2,float x,floaty,float z)
{
strcpy(data[count].name,ch1);
data[count].num=num;
strcpy(data[count].adress,ch2);
data[count].x=x; data[count].y=y; data[count].z=z;
count++;
}
void student::find(intnum)
{
int m=0;
while(m<=count)
if(num==data[m++].num)
break;
if(m>count)
{
cout<< "很抱歉,没有该学号的学生" <<endl;
start_del='n';
getch();
}
else
{
temp=count; count=m; start_del='y';
cout<< "该学生的资料为" <<endl //总分排序 //输出
<< "序号 \t姓名\t学号\tC++\t数据结构\t英语\t体育" <<endl;
show();
count=temp; getch();
}
}
void student::del(intnum)
{
char chose;
find(num);
if(start_del=='y')
{
cout<< "确实要删除该学生资料? Y/N" <<endl;
cin>> chose;
if(chose=='y'||chose=='Y')
{
int m=0;
while(m<=count)
if(num==data[m++].num)
break;
temp=count; count=m;
while(count<temp)
{
strcpy(data[count-1].name,data[count].name);
data[count-1].num=data[count].num;
strcpy(data[count-1].adress,data[count].adress); data[count-1].x=data[count].x; data[count-1].y=data[count].y; data[count-1].z=data[count].z;
count++;
}
count=temp-1;
cout<< "该学生资料已删除" <<endl;
}
else
cout<< "学生资料未删除" <<endl;
getch();
}
}
void student::taxis()
{
intx,y,array[max];
int change;
for(x=0;x<count;x++)
array[x]=data[x].score=data[x].x+data[x].y+data[x].z;
for(x=0;x<count-1;x++)
for(y=0;y<count-1-x;y++)
if(array[y]<array[y+1])
{
change=array[y];
array[y]=array[y+1];
array[y+1]=change;
}
cout<< "总分\t姓名\t学号\tC++\t数绝结构\t英语\t体育" <<endl;
for(x=0;x<count;x++)
for(y=0;y<count;y++)
if(array[x]==data[y].score)
{
cout<< data[y].score << "\t" << data[y].name << "\t"
<<data[y].num<< "\t" << data[y].adress<< "\t"
<<data[y].x << "\t" << data[y].y << "\t"
<<data[y].z <<endl;
}
getch();
}
void student::show()
{
cout<< count << "\t" << data[count-1].name << "\t"
<<data[count-1].num<< "\t" << data[count-1].adress<< "\t"
<<data[count-1].x << "\t" << data[count-1].y << "\t"
<<data[count-1].z <<endl;
}
//main.cpp
void main()
{
studentst;
char *ch1,*ch2,chose;
intnum,find,del;
floatx,y,z;
time_t t;
time(&t);
while(1)
{
system("cls");
cout<< "欢迎进入武工院数计学院大类1002班学生成绩管理系统制作:张聪"<<endl; cout<< "当前系统时间是:" <<ctime(&t) <<endl;
cout<< "1.输入/添加学生资料 2.输出学生资料 3.查找 4.删除5.总分排序 6.退出" <<endl; cout<<" 请选择你要的服务(1-6)" <<endl;
cin>> chose;
if(chose=='6') break;
switch(chose)
{
case '1':
{
cout<< "请输入学生姓名\t学号\tC++\t数据结构\t英语\t体育" <<endl;
ch1=new char[]; ch2=new char[];
cin>> ch1 >>num;
while(st.check_num(num))
{
cout<< "学号重复,请重新输入" <<endl;
cin>>num;
}
cin>> ch2 >> x >> y >> z;
st.input(ch1,num,ch2,x,y,z);
}break;
case '2':
{
temp=count; count=1;
cout<< "序号\t姓名\t学号\tC++\t数据结构\t英语\t体育" <<endl;
while(count<=temp)
{
st.show(); count++;
}
count--; getch();
}break;
case '3':
{
cout<< "请输入你要查找学生的学号" <<endl;
cin>> find;
st.find(find);
}break;
case '4':
{
cout<< "请输入你要删除的学生学号" <<endl;
cin>> del;
st.del(del);
}break;
case '5':
{
st.taxis();
}break;
default:
{
cout<< "输入错误!!!,请重新输入" <<endl;
getch();
}
}
}
getch();
}
3、编译结果:
4、小结
第三个题目很有挑战性,因为越做越觉得很吸引我,它一点一点促使我向前进。在可以运行时我激动地搂着宿舍同学跳啊跳的,但是程序运行一段时间后就会自动中止,这让我很头疼,实在是有种受不了的感觉,看看其他同学也是很郁闷,但总不能只做一半就放弃,于是我上网看程序、图书馆查资料、看课本,终于成功了!
实验总结
这次C++课程设计让我有实战的感觉,在实践编程过程中积累了宝贵的经验.
我
对此门课充满了兴趣,也学到了很多知识, C++在社会中的用处也随处可见,它的作用也是不会被忽视的,我们也应该重视。这将会是一门日益重要的学科。 我这次编制的这个程序,在编程过程中,曾遇到了很多问题,也失败了很多次,不过最终通过不懈的努力,翻阅资料,征求老师和同学的意见还是圆满完成了。这次的设计进一步提高了我对C++的认识,也发现了许多问题,更学到了许多知识。在这次课程设计的过程中,在同学们的相互指导下,我的编程、理解、动手及思维能力有了提高,同时也对C++的感觉更好了。