}
private :
int a;
char *b;
float c;
};
int main(){
X *A=new X(4,"X::X(int,char,float)",32);
X B,C(10),D(B);
A->print();
();
();
();
return 0;
}
3.某单位的职工工资包括基本工资Wage,岗位津贴Subsidy,房租Rent,水
费WaterFee,电费ElecFee。设计实现工资管理的类Salary,该类的形式如下:
class Salary
{public:
Salary(){初始化工资数据的各分项数据为0}
Salary(……) {初始化工资数据的各分项数据}
void setXX(double f){ XX=f; }
double getXX(){ return XX; }
double RealSalary(){ …… }//计算实发工资
……
Private:
Bouble Wage, Subsidy, Rent, WaterFee, ElecFee;
};
其中,成员函数setXX()用于设置工资的各分项数据,成员函数getXX()用于获
取工资的各分项数据,XX代表Wage、Subsidy等数据成员,如Wage对应的
成员函数则为setWage()和
getWage()。
实发工资=Wage+Subsidy-Rent-WaterFee-ElecFee
编程完善该类的设计,并在主函数中测试该类的各成员函数。
4.设计一个时钟类Clock。数据成员包括hour(小时)、minute(分钟)、second
(秒)。要求用成员函数实现以下功能:
(1)创建具有指定时钟(小时、分钟、秒)的Clock对象,默认时钟为00:00:00。
(2)动态地设置时、分、秒。
(3)在屏幕上按“时:分:秒”的格式显示时钟。
(4)在主函数中测试该类。
5.设计一个职工类Employee。数据成员包括字符串型的name(姓名)、street
(街道地址)、city(市)、province(省)、postalcode(邮政编码)。要求用成员
函数实现以下功能:
(1)创建职工对象时,可以按不同方式指定职工信息。
(2)动态地设置职工对象信息。
(3)在屏幕上打印职工信息。
(4)在主函数中测试该类。
6.需要求3个三角形的体积,请编写一个基于对象的程序。数据成员包括三
角形的三边长a、b、 c。要求用成员函数实现以下功能:
(1) 定义构造函数完成三角形的初始化;
(2) 求三角形的周长;
(3) 求三角形的面积;
(4) 输出三角形信息。
7.下面是一个整型数组类intArray的声明,请给出该类所有数据成员的类外
定义。
class intArray
{public:
intArray(int size);//构造函数
intArray(const intArray &x);//复制构造函数
~intArray();//析构函数
bool Set(int i, int elem);//设置第i个数组元素的值,设置成功返回true,
失败返回false
bool Get(int i, int &elem); //获取第i个数组元素的值,获取成功返回
true,失败返回false
int Length( ) const;//获取数组的长度
void ReSize ( int size ); //重置数组
void Print();//输出数组
private:
int *element; //指向动态数组的指针
int arraysize; //数组的大小
};
8.下面是一个整型链表类intList的声明,请给出该类所有数据成员的类外定
义。
class intList
{protected:
struct Node{
Node * next;
int data;
};
Node * pFirst;
public:
intList();//构造函数
~intList(); //析构函数
//向链表的第i个位置插入一个元素,插入成功返回true,失败返回
false
bool Insert(int i, int elem) ;
//删除链表的第i个位置的元素,删除成功返回true,失败返回false
bool Remove(int i, int &elem) ;
int * Find(int elem)const; //查找值为elem的元素,返回该元素在链表
中的位置
int Length( ) const;//返回链表长度
void Printlist();//输出链表
};
9.下面是一个整型堆栈类intStack的声明,请给出该类所有数据成员的类外定
义。
class intStack
{public:
intStack (int size=10);//构造函数
~intStack ();//析构函数
bool Push(int elem);//入栈操作
bool Pop(int &elem); //出栈操作
int Length( ) const; //获取栈中元素的个数
private:
int *data; //指向动态数组的指针
int top; //栈顶指针
int size; //堆栈的容量
};
实验四、继承与组合(6学时)
二、实验内容
1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证
自己分析的结果是否正确。
(1)
#include
using namespace std;
class A
{public:
A(){cout<<"A::A() called.n";}
virtual ~A(){cout<<"A::~A() called.n";}
};
class B:public A
{public:
B(int i)
{ cout<<"B::B() called.n";
buf=new char[i];
}
virtual ~B()
{ delete []buf;
cout<<"B::~B() called.n";
}
private:
char *buf;
};
void fun(A *a)
{ cout<<"May you succeed!"< delete a;
}
int main()
{
A *a=new B(15);
fun(a);
return 0;
}
(2)
#include
using namespace std;
class A{
public:
A(int a,int b):x(a),y(b){ cout<<""< void Add(int a,int b){ x+=a;y+=b;}
void display(){ cout<<"("< ~A(){cout<<""<private:
int x,y;
};
class B:private A{
private:
int i,j;
A Aobj;
public:
B(int a,int b,int c,int d):A(a,b),i(c),j(d) ,Aobj(1,1){ cout<<"B
"< void Add(int x1,int y1,int x2,int y2)
{
A::Add(x1,y1);
i+=x2; j+=y2;
}
void display(){
A::display();
y();
cout<<"("<
}
~B(){cout<<""<};
int main()
{
B b(1,2,3,4);
y();
(1,3,5,7);
y();
return 0;
}
(3)
#include
using namespace std;
class A{
public:
A(int a):x(a){ cout<<""< int f(){return ++x;}
~A(){cout<<""<private:
int x;
};
class B:public virtual A{
private:
int y;
A Aobj;
public:
B(int a,int b,int c):A(a),y(c),Aobj(c){ cout<<"B
"< int f(){
A::f();
Aobj.f();
return ++y;
}
void display(){ cout< }
~B(){cout<<""<};
class C:public B{
public:
C(int a,int b,int c):B(a,b,c),A(0){ cout<<""<};
class D:public C,public virtual A{
public:
D(int a,int b,int c):C(a,b,c),A(c){ cout<<""< ~D(){cout<<""<};
int main()
{
D d(7,8,9);
d.f();
y();
return 0;
}
(4)
#include
using namespace std;
class Base1
{
public:
Base1()
{
cout<<"class Base1!"< }
};
class Base2
{
public:
Base2()
{
cout<<"class Base2!"< }
};
class Level1:public Base2,virtual public Base1
{
public:
Level1()
{
cout<<"class Level1!"< }
};
class Level2: public Base2,virtual public Base1
{
public:
Level2()
{
cout<<"class Level2!"< }
};
class TopLevel:public Level1,virtual public Level2
{
public:
TopLevel()
{
cout<<"class TopLevel!"< }
};
int main()
{
TopLevel obj;
return 0;
}
2.某出版系统发行图书和磁带,利用继承设计管理出版物的类。要求如下:
建立一个基类Publication存储出版物的标题title、出版物名称name、单价price
及出版日期date。用Book类和Tape类分别管理图书和磁带,它们都从
Publication类派生。Book类具有保存图书页数的数据成员page,Tape类具有
保存播放时间的数据成员playtime。每个类都有构造函数、析构函数,且都有
用于从键盘获取数据的成员函数inputData(),用于显示数据的成员函数
display()。
3.分别定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类
派生出新类Teacher_Cadre(教师兼干部类)。要求:
(1)在两个基类中都包含姓名、年龄、性别、地址、电话数据成员。
(2)在Teacher类中还包含数据成员职称title,在Cadre类中还包含数据成员
职务post,在Teacher_Cadre类中还包含数据成员工资wage。
(3)对两个基类中的姓名、年龄、性别、地址、电话数据成员用相同的名字,
在访问这类数据成员时,指定作用域。
(4)在类体中声明成员函数,在类外定义成员函数。
(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display
函数,输出姓名、年龄、性别、地址、电话,然后再用cout语句输出职务和工
资。
4.按下列要求编写程序。
(1)定义一个分数类Score。它有
3个数据成员:
Chinese //语文课成绩
English //英语课成绩
Mathematics //数学课成绩
2个构造函数:无参的和带参数的
3个成员函数:是否带参数根据需要自定
sum() //计算三门课总成绩
print() //输出三门课成绩和总成绩
modify() //修改三门课成绩
(2)定义一个学生类Student。它有
3个数据成员:
Num //学号
Name //姓名
MyScore //成绩
2个构造函数:无参的和带参数的
3个成员函数:是否带参数根据需要自定
sum() //计算某学生三门课总成绩
print() //输出某学生学号、姓名和成绩
modify() //修改某学生学号、姓名和成绩
(3)在主函数中,先定义一个学生类对象数组,再通过for循环给对象数组赋
上实际值,最后输出对象数组个元素的值。
5.编写一个程序实现小型公司的人员信息管理系统。该公司雇员
(employee)包括经理(manager),技术人员(technician)、销售员(salesman)
和销售部经理(salesmanager)。要求存储这些人员的姓名、编号、级别、当月
薪水,计算月薪并显示全部信息。
程序要对所有人员有提升级别的功能。为简单起见,所有人员的初
始级别均为1,然后进行升级,经理升为4级,技术人员和销售部经理升为3
级,销售员仍为1级。
月薪计算办法是:经理拿固定月薪8000元,技术人员按每小时100
元领取月薪,销售员按该当月销售额4%提成,销售经理既拿固定月工资也领
取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售额的5‰。
实验五、多态性与虚函数(4学时)
二、实验内容
1.阅读下面的程序,写出程序运行的结果。
#include
using namespace std;
class Base{
protected:
int n;
public:
Base (int m){ n=m++; }
virtual void g1(){cout<<"Base::g1()..."< virtual void g2(){cout<<"Base::g2()..."<<++n< void g3(){cout<<"Base::g3()..."<<++n< void g4(){cout<<"Base::g4()..."<<++n<};
class Derive:public Base{
int j;
public:
Derive(int n1,int n2):Base(n1){ j=n2; }
void g1(){cout<<"Deri::g1()..."<<++n< void g3(){cout<<"Deri::g2()..."<<++n<};
int main(){
Derive Dobj(1,0);
Base Bobj=Dobj;
Bobj.g1();
cout<<"------------------"< Base *bp=&Dobj;
bp->g1();
cout<<"------------------"< Base &bobj2=Dobj;
bobj2.g1();
cout<<"------------------"< Dobj.g1();
return 0;
}
2.先建立一个点类Point,包含数据成员x,y(坐标点)。以它为基类,派生
出圆类Circle,增加数据成员radius(半径),再以Cirlcle类为直接基类,派生
出圆柱体类Cylinder,再增加数据成员height(高)。要求:
(1)每个类都有构造函数、用于从键盘获取数据的成员函数set(),用于显示
数据的成员函数display()。
(2)用虚函数输出各类对象信息。
3.先建立一个职工类Employee,包含数据成员name(职工姓名),ID(职工
编号)。以它为基类,派生出经理类Manager和技术人员类Technician,在经理
类中增加数据成员salary(代表经理的月工资),在技术人员类中增加数据成员
wage(代表每小时的工资数)和hours(月工作时数)。在定义类时,所有类中
必须包含有构造函数、析构函数、修改和获取所有数据成员的函数,以及纯函
数计算职工的工资,输出职工的信息。
4.下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )
则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三
角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数。
实验六、面向对象的妥协(2学时)
二、实验内容
1.设计并测试点类Point,其数据成员是直角坐标系的点坐标,友元函数distance
用来计算两点间的距离。
2.设计一个书类Book,能够保存书名、定价,所有书的本数和总价。
实验七、运算符重载(2学时)
一、实验目的
1.掌握运算符重载的规则。
2.掌握几种常用的运算符重载的方法。
3.了解转换构造函数的使用方法。
4.了解在Visual C++6.0环境下进行运算符重载要注意的问题。
二、实验内容
1.阅读下面的程序,写出程序运行的结果。
(1)
#include
class ABC{
int a,b,c;
public:
ABC(int x,int y,int z):a(x),b(y),c(z){}
friend ostream &operator<<(ostream &out,ABC& f);
};
ostream &operator<<(ostream &out,ABC& f)
{
out<<"a="< return out;
}
int main(){
ABC obj(10,20,30);
cout< return 0;
}
(2)
#include
class Number{
int n;
public:
Number(int x):n(x){}
Number& operator++(){ ++n; return *this; }
Number& operator++(int){ n++; return *this;}
friend Number &operator--(Number &o);
friend Number &operator--(Number o,int);
void display(){cout<<"This Number is: "<};
Number &operator--(Number &o){--o.n; return o; }
Number &operator--(Number o,int){o.n--; return o; }
int main(){
Number N1(10);
++ ++ ++N1;
y();
N1++;
y();
--N1;
y();
N1-- -- --;
y();
return 0;
}
2.设计并实现一个日期类Date,要求:
(1)可以建立具有指定日期(年、月、日)的Date对象,默认日期是2009.1.1。
(2)可以从输出流输出一个格式为“年-月-日”的日期,其中年是四位数据,
月、日可以是一位也可以是两位数据。
(3)可以动态地设置年、月、日。
(4)可以用运算符= =、!=、<和>对两个日期进行比较。
(5)可以用运算符++、--、+=、-=等完成天数的加减一天或若干天的操作
(6)Date类必须能够正确表达日期,不会出现类似于13月,32日一类的情
况。Date类还必须处理闰年的问题,闰年包括:所有能被400整除的年份,以
及能被4整除同时又不能被100整除的年份。
(7)写出主函数对该类进行测试。
3.下面是一个数组类CArray的定义。要求:
(1)在此基础上增加print()成员函数打印数组,
(2)重载“=”、“+”、“-” 运算符使之能对该数组类对象进行赋值、加减运
算。
(3)写出主函数对该类进行测试。
class CArray
{private:
int* p_arr;
int size;
public:
CArray(); //缺省构造函数
CArray(int* p_a,int s); //构造函数
CArray(const CArray &r_other);//复制构造函数
~CArray();//析构函数
int operator[](int pos) const; //访问数组元素值的下标运算符重载函数
int& operator[](int pos); //设置数组元素值的下标运算符重载函数
Carray &operator=(const Carray &other)//赋值运算符“=”重载函数
Carray &operator+(const Carray &other) //加运算符“=”重载函数
Carray &operator-(const Carray &other) //减运算符“=”重载函数
void print() const;
};
CArray:: CArray() { p_arr=NULL; size=0;}
CArray:: CArray(int* p_a,int s)
{
if(s>0)
{ size=s; p_arr=new int[size];
for(int i=0;i }
Else
{ p_arr=NULL; size=0; }
}
CArray::CArray(const CArray &r_other)
{ size=r_;
if(size)
{ p_arr=new int[size];
for(int i=0;i }
}
CArray::~CArray()
{ if(p_arr) delete[] p_arr;
p_arr=NULL; size=0;
}
int CArray::operator[](int pos) const
{
if(pos>=size) return p_arr[size-1];
if(pos<0) return p_arr[0];
return p_arr[pos];
}
int& CArray::operator[](int pos)
{
if(pos>=size) return p_arr[size-1];
if(pos<0) return p_arr[0];
return p_arr[pos];
}
4.下面是一个自定义字符串类的声明。请写出该类所有成员函数的类外定义
代码。
class string
{private:
unsigned buflen;
char * buffer;
public:
string();//构造函数
string(unsigned);
string(char);
string(const char*);
string(const string &);//复制构造函数
~string();//析构函数
//重载赋值运算符
string& operator=(const string &right);
string& operator+=(const string &right);
char *operator+=(const char *right);
friend string operator+(const string & left,const string & right); //字符串连接
string operator()(unsigned start,unsigned len); //取子串
unsigned length()const; //求字符串长度
char & operator[](unsigned index)const; //访问单个字符
int compare(const string &)const; //字符串比较
operator const char *()const; //到普通c字符串的转换
friend ostream & operator<<(ostream &,string &);//字符串的输出
};
实验八、模板(2学时)
二、实验内容
1.设计一个函数模板,实现两数的交换,并用int、float、double、char类型
的数据进行测试。
2.设计一个函数模板,实现从int、float、double、char类型的数组找出最大
值元素。提示:可用类型参数传递数组、用非类型参数传递数组大小,为了找
出char*类型数组中的最大值元素,需要对该类型进行重载或特化。
3.编写一个顺序表类模板。
4.建立两个int类型的向量vector,利用merge算法将其合并,然后用sort算
法对合并后的向量进行排序,最后输出排序结果。
发表评论