面向对象的程序设计实验报告.docx
- 文档编号:3261779
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:19
- 大小:131.71KB
面向对象的程序设计实验报告.docx
《面向对象的程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《面向对象的程序设计实验报告.docx(19页珍藏版)》请在冰点文库上搜索。
面向对象的程序设计实验报告
面向对象的程序设计
课程设计报告
姓名:
学号:
班级:
院系:
日期:
题目1:
通过组合和派生构成新的类
本设计题目的任务是使用Point类产生Circle类。
分别通过组合类及派生类两种方法实现,并要求分别给出使用类模板实现的程序。
写出每个类的构造函数,拷贝构造函数,析构函数,并在每个函数中添加输出语句,用于观察函数的调用顺序。
本设计题的目的是使学生掌握在不同的实现方法中,如何设计相应的构造函数和拷贝构造函数,进一步理解程序调用它们及析构函数的执行顺序,掌握组合类和派生类。
另外本设计题目要让学生进一步掌握和理解类模板的技术及其实现方法。
实验过程:
按照要求分别写出组合类、派生类以及这两种方法的类模板,并且用C++程序实现
组合类实现
#include
usingnamespacestd;
classPoint
{
public:
Point();
Point(int);
~Point(){cout<<"Point类的析构函数被调用\n";}
Point(Point&p)
{cout<<"Point的拷贝构造函数\n";}
private:
intj;
};
classCircle{
public:
Circle();
Circle(int,int,int);
~Circle(){cout<<"Circle类的析构函数被调用\n";}
Circle(Circle&c)
{cout<<"Circle的拷贝构造函数\n";}
private:
inti;
Pointp;
};
Circle:
:
Circle()
{
i=0;
cout<<"Circle类的默认构造函数被调用\n";
}
Circle:
:
Circle(inti1,intj1,intk1):
p(k1)
{
i=i1;
cout<<"Circle类的带参数的构造函数被调用\n";
}
Point:
:
Point()
{intk;
k=0;
cout<<"Point类的默认构造函数被调用\n";
}
Point:
:
Point(intk1)
{intk;
k=k1;
cout<<"Point类的带参数的构造函数被调用\n";
}
voidmain()
{
cout<<"使用组合类调用\n";
CircleC1;
CircleC2(1,2,3);
CircleC3=C2;
}
}
派生类实现
#include
usingnamespacestd;
classPoint
{
public:
Point(){cout<<"Point类的默认的构造函数\n";i1=0;}
Point(inti)
{cout<<"Point类的带参数构造函数\n";i1=i;}
Point(Point&p)
{cout<<"Point类的拷贝构造函数\n";i1=p.i1;}
~Point(){cout<<"Point类的析构函数\n";}
private:
inti1;
};
classCircle:
publicPoint
{
public:
Circle(){cout<<"Circle类的默认的构造函数\n";i2=0;}
Circle(int,int);
Circle(Circle&c);
~Circle(){cout<<"Circle类的析构函数\n";}
private:
inti2;
};
Circle:
:
Circle(intp1,intp2):
Point(p1)
{
cout<<"Circle类的带参数构造函数\n";
i2=p2;
}
Circle:
:
Circle(Circle&c):
Point(c)
{
cout<<"Circle类的拷贝构造函数\n";
i2=c.i2;
}
voidmain()
{cout<<"使用派生类调用\n";
Circlec1;
Circlec2(1,2);
Circlec3=c2;
}
组合类模板
#include
usingnamespacestd;
classPoint
{
public:
Point();
Point(int);
~Point(){cout<<"Point类的析构函数被调用\n";}
Point(Point&p)
{cout<<"Point的拷贝构造函数\n";}
private:
intj;
};
classCircle{
public:
Circle();
Circle(int,int,int);
~Circle(){cout<<"Circle类的析构函数被调用\n";}
Circle(Circle&c)
{cout<<"Circle的拷贝构造函数被调用\n";}
private:
inti;
Pointp;
};
Circle:
:
Circle()
{
i=0;
cout<<"Circle类的默认构造函数被调用\n";
}
Circle:
:
Circle(inti1,intj1,intk1):
p(k1)
{
i=i1;
cout<<"Circle类的带参数的构造函数被调用\n";
}
Point:
:
Point()
{intk;
k=0;
cout<<"Point类的默认构造函数被调用\n";
}
Point:
:
Point(intk1)
{intk;
k=k1;
cout<<"Point类的带参数的构造函数被调用\n";
}
template
classStack
{
public:
Stack();
Stack(Stack&);
~Stack();
private:
Tn;
};
template
Stack
:
Stack(){cout<<"类模板的默认构造函数\n";}
template
Stack
:
Stack(Stack&s){n=s.n;}
template
Stack
:
~Stack(){cout<<"类模板的析构函数\n";}
voidmain()
{
cout<<"使用组合类模板调用\n";
CircleC1;
CircleC2(1,2,3);
CircleC3=C2;
}
派生类模板
#include
usingnamespacestd;
classPoint
{
public:
Point(){cout<<"Point类的默认的构造函数\n";i1=0;}
Point(inti)
{cout<<"Point类的带参数构造函数\n";i1=i;}
Point(Point&p)
{cout<<"Point类的拷贝构造函数\n";i1=p.i1;}
~Point(){cout<<"Point类的析构函数\n";}
private:
inti1;
};
classCircle:
publicPoint
{
public:
Circle(){cout<<"Circle类的默认的构造函数\n";i2=0;}
Circle(int,int);
Circle(Circle&c);
~Circle(){cout<<"Circle类的析构函数\n";}
private:
inti2;
};
Circle:
:
Circle(intp1,intp2):
Point(p1)
{
cout<<"Circle类的带参数构造函数\n";
i2=p2;
}
Circle:
:
Circle(Circle&c):
Point(c)
{
cout<<"Circle类的拷贝构造函数\n";
i2=c.i2;
}
template
classStack
{
public:
Stack();
Stack(Stack&);
~Stack();
private:
Tn;
};
template
Stack
:
Stack(){cout<<"类模板的默认构造函数\n";}
template
Stack
:
Stack(Stack&s){n=s.n;}
template
Stack
:
~Stack(){cout<<"~类模板的析构函数\n";}
voidmain()
{cout<<"使用派生类模板\n";
Circlec1;
Circlec2(1,2);
Circlec3=c2;
}
总结
上机操作中,熟悉书中知识,复习巩固组合类、派生类以及类模板的使用和实现;掌握在不同的实现方法中,如何设计相应的构造函数和拷贝构造函数,进一步理解程序调用它们及析构函数的执行顺序,掌握组合类和派生类。
另外进一步掌握和理解类模板的技术及其实现方法。
在上机操作中需要不断进行思考和调试,耐心改正代码错误,进一步完善代码。
题目2:
人员信息管理系统
本设计题目的任务是设计一个人员信息管理系统,并使用虚函数实现多态性,完成显示不同人员信息的任务。
设计employee类,用来存储雇员的编号,级别,月薪等信息,能够对其进行操作和显示。
以employee为基类派生出technician类,表示兼职技术人员,以及manager类,表示经理,以及salesman类,表示兼职推销员。
利用manage类和salesman类派生出salesmanager类,表示销售经理。
注意使用虚基类。
进一步使用虚函数和抽象类改进上面的程序。
本设计题目的目的是让学生进一步理解和掌握C++中类的继承,虚基类,多态性,虚函数以及抽象类技术及实现方法。
代码
#include
usingnamespacestd;
classemployee
{
protected:
charname[20];
intempNo;
floatsalary;
public:
employee(char*cp="",intno=1001);
employee(employee&);
voidsetname(char*cp);
voidsetempNo(intno);
voidsetsalary(floatsa);
char*getname();
intgetempNo();
floatgetsalary();
virtualfloatpay(){return0;}
};
employee:
:
employee(char*cp,intno)
{
inti=0;
while(*cp)
{
name[i]=*cp;
i++;
cp++;
}
name[i]='\0';
empNo=no;
}
employee:
:
employee(employee&em)
{
inti=0;
while(em.name[i])
{
name[i]=em.name[i];
i++;
}
name[i]='\0';
empNo=em.empNo;
salary=em.salary;
}
voidemployee:
:
setname(char*cp)
{
inti=0;
while(*cp)
{
name[i]=*cp;
i++;
cp++;
}
name[i]='\0';
}
voidemployee:
:
setempNo(intno)
{
empNo=no;
}
voidemployee:
:
setsalary(floatsa)
{
salary=sa;
}
char*employee:
:
getname()
{
returnname;
}
intemployee:
:
getempNo()
{
returnempNo;
}
floatemployee:
:
getsalary()
{
returnsalary;
}
classmanager:
publicemployee
{
public:
manager(char*,int,int);
voidsetproductNum(intn)
{productNum=n;}
intgetproductNum()
{returnproductNum;}
floatpay();
private:
intproductNum;
staticfloatproper;
};
floatmanager:
:
proper=20;
manager:
:
manager(char*name,intno,intpronum)
:
employee(name,no)
{
productNum=pronum;
}
floatmanager:
:
pay()
{
salary=productNum*proper*0.2;
returnsalary;
}
classtechnician:
publicvirtualemployee
{
public:
technician(char*,int,float);
voidsethours(floath)
{workHours=h;}
floatgethours()
{returnworkHours;}
floatpay();
private:
floatworkHours;
staticfloatpayperhour;
};
floattechnician:
:
payperhour=40;
technician:
:
technician(char*name,intno,floathours)
:
employee(name,no)
{
workHours=hours;
}
floattechnician:
:
pay()
{
salary=workHours*payperhour;
returnsalary;
}
classsalesman:
publicvirtualemployee
{
public:
salesman(char*,int,float);
voidsetmonthlysales(intnum)
{monthlysales=num;}
intgetmonthlysales()
{returnmonthlysales;}
floatpay();
private:
floatmonthlysales;
staticfloatpercent;
};
floatsalesman:
:
percent=0.5;
salesman:
:
salesman(char*name,intn,floatsn)
:
employee(name,n)
{
monthlysales=sn;
}
floatsalesman:
:
pay()
{
salary=monthlysales*percent;
returnsalary;
}
classsalesmanager:
publicvirtualemployee
{
public:
salesmanager(char*,int,float);
voidsetsales(intm)
{sales=m;}
intgetsales()
{returnsales;}
floatpay();
private:
floatsales;
staticfloatpercent;
};
floatsalesmanager:
:
percent=0.5;
salesmanager:
:
salesmanager(char*name,intno,floatsm)
:
employee(name,no)
{
sales=sm;
}
floatsalesmanager:
:
pay()
{
salary=sales*percent+5000;
returnsalary;
}
floatCalculateSalary(employee*emptr)
{
floatsalary=emptr->pay();
returnsalary;
}
voidmain()
{
managerw1("张三",1001,1000);
techniciant1("李四",1002,200);
salesmans1("王五",1003,10000);
salesmanagerz1("桂六",1004,2000);
cout<<"工人"< cout<<"科研人员"< cout<<"销售人员"< cout<<"销售经理"< } 总结 写代码出现很多错误,同学之间互相合作请教可以顺利解决难题,并且将知识融会贯通,写的代码很粗糙,可以改进,比如可以单一的选择看一个人的业绩也可以全部显示,总之学习C编程方面还需要很多的努力
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 实验 报告