admin 管理员组

文章数量: 1086019


2024年5月6日发(作者:linux就该这么学第2版txt)

实验二

二、实验内容

1.请先阅读下面的2个程序,写出程序运行的结果,然后再上机运行程序,

验证自己分析的结果是否正确。

程序1:

#include

using namespace std;

int main()

{

cout<<"This "<<"is ";

cout<<"a "<<"C++ ";

cout<< "program."<

return 0;

}

程序运行的结果:

This is a C++ program.

程序2:

#include

using namespace std;

int main()

{ int a,b,c; //定义三个变量

a、b、c

cout<<"Please input to a and b:"<

cin>>a>>b;

c=a+b;

cout<< "a+b=" ;

cout<

cout<

return 0;

}

程序运行的结果:

Please input to a and b:

1 2

a+b=3

This is a C++ program.

2.输入以下程序,进行编译,观察编译结果,如果有错误,请修改程序,再

进行编译,直到没有错误,然后进行连接和运行,并分析运行结果。

#include

using namespace std;

int main()

{ int a,b; //定义两个变量

a和b

cout<<"Please input to a and b: "<

cin>>a>>b;

cout<< "Max="<< max(a,b)<

return 0;

}

int max(int x, int y) { return (x> y) ?x:y; } //求两个数中的大者的函

测试的知识点:

若函数的调用在前,定义在后,则需要在函数调用语句前对函数作原型声

3.编写一个函数,用来求2个或3个正整数中的最大数,并在主函数中调用

此函数。

(1) 用不带默认参数的函数实现。

(2) 用带默认参数的函数实现。

对比两种方法,分析使用带默认参数的函数的优点和应用场合。总结如何选择

默认参数的值。请分析本题中默认参数的值应该在什么范围选取。

4.编写一个函数,用来实现对3个数按由小到大的顺序排序,并在主函数中

调用此函数。要求函数的形参用以下两种形式实现:

(1)使用指针形参

(2)使用引用形参

5.编写程序,用同一个函数名实现n个数据的升序排序,数据类型可以是整

型、单精度型、字符串型。用重载函数实现。

6.编写程序,将两个字符串连接起来,结果取代第一个字符串。

实验三、类和对象(10学时)

二、实验内容

1.检查下面的程序,找出其中的错误,并改正之。然后上机调试,使之能正

常运行。

(1)

#include

using namespace std;

class Clock

{ void set_clock(void);

void show_clock(void);

int hour;

int minute;

int second;

};

Clock clock;

int main()

{

set_clock();

show_clock ();

}

int set_clock(void)

{

cin>>;

cin>>;

cin>>;

}

int show_clock(void)

{

cout<<<<":"<<<<":"<<<

}

(2)

#include

using namespace std;

class A

{public:

void A(int i=0){m=i;}

void show(){cout<

void ~A(){}

private:

int m;

};

int main()

{ A a(5);

a.m+=10;

();

return 0;

}

(3)

#include

using namespace std;

class X

{ private:

int a=0;

int &b;

const int c;

void setA(int i){a=i;}

X(int i){ a=i;}

public:

int X(){ a=b=0;}

X(int i, int j, int k){ a=i; b=j; c=k; }

setC(int k) const { c=c+k;}

};

int main()

{

X x1;

X x2(2) ;

//包含头文件命令

X x3(1,2,3) ;

//使用名字空间std

(3) ;

return 0 ;

}

2.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证

自己分析的结果是否正确。

(1)

#include

using namespace std;

class test{

public:

//包含头文件命令

test();

//使用名字空间std

int getint( ){return num;}

float getfloat( ){return fl;}

~test( );

private:

//输出提示信息到屏幕

int num;

//等待用户从键盘输入数据

float fl;

};

test::test( )

{

cout << "Initalizing default" << endl;

num=0;fl=0.0;

}

test::~test( )

{

cout << "Destructor is active" << endl;

}

int main( )

{

test array[2];

//包含头文件命令

cout << array[1].getint( )<< "

//使用名字空间std

" << array[1].getfloat( ) <

return 0;

}

(2)

#include

//输出提示信息到屏幕

using namespace std;

//等待用户从键盘输入数据

#include //输出结果信息至屏幕

class X

{public:

//主函数返回0至操作系统

X(int x1,char *x2,float x3):a(x1),c(x3)

{ b=new char[sizeof(x2)+1];

strcpy(b,x2);

}

X():a(0),b("X::X()"),c(10){ }

X(int x1,char *x2="X::X(....)",int x3=10):a(x1),b(x2),c(x3){}

X(const X&other)

{ a=other.a;

b="X::X(const X &other)";

c=other.c;

}

void print()

{ cout<<"a="<

}

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算

法对合并后的向量进行排序,最后输出排序结果。


本文标签: 函数 成员 数据 数组 进行