C++习题 下载本文

第一章 1.下列程序有什么错误 #include Using namespce std; Int main() { int x,y,z; cin>>x>>y; z=x+y;

cout<<”x+y=”<

(2)#include using namespace std; class Box { public:

int Box(int,int,int); int volume();

private:

int height; int width;

};

int length;

Int Box::Box(int h,int w,int len) { }

Int Box:: volume() { }

void main() { }

2.C++中引用与指针有什么区别?

1.指针可以不用初始化,而引用必须初始化。 2.指针可以赋值为空,而引用不可以。 3.指针的指向可以改变,而引用不可以。

3.程序分析题 #include

height=h; width=w; length=len;

return (height*width*length);

Box box(1,2,3);

cout<

using namespace std; void fun1(int &x,int &y) { Int t;

t=x; x=y; y=t; }

void fun2(int *x,int *y) { Int *t; t=x; x=y; y=t; }

Int main(void) { Int a,b; a=11; b=22; fun2(&a,&b);

cout<<”a=”<

cout<<”a=”<

22 11 4.程序设计题

(1)使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和浮点型数的两点间距离。

(2)写一个重载的max函数,它获取double类型的两个或三个参数,返回其中最大的数。

(3)声明一个Circle类,有数据成员Radius(半径),成员函数GetArea(),计算圆的面积,构造一个Circle的对象进行测试

(4)声明一个类box,有数据成员height(高),width(宽),length(长),volume(体积)请编写两个成员函数,一个用于设置其数据成员的值,另一个它将box类的引用作为形参,并显示每个成员的值

(5)编写一个程序输入3个学生的英语和计算机成绩,并按总分从高到低排序。要求设计一个学生类。

(6)编写程序,用关键字声明一个“学生”类类型,并声明三个私有数据成员:num(学号),name(姓名)和sex(性别)。建立一个成员函数输出学生信息。

(7)声明一个类,有数据成员年,月,日,建立两个成员函数依次用以输入日期,计算所输入日期在本年中是第几天,注意闰年问题。

第二章

1.程序分析题

(1)#include using namespace std; class Foo { public: Foo(int x)

{ (*this).x=x; cout<<'A'<

{ x=0; cout<<'Z'; }

private: int x;

}; int main() { Foo f[3], g(3); return 0;

}

(2)#include

}

using namespace std; class Sample { public: };

int main(void) { }

2.程序设计题

(1)有两个长方柱,其长,宽,高分别为“12,30,25”和“10,14,20”,求它们的体积,在类中用带参数的构造函数。 (2)建立一个对象数组,内放5个学生的数据(学号,成绩),用指针指向数组首元素,输出第1,3,5个学生的数据,初值自拟。

(3)定义一个描述学生基本情况的类,数据成员包括姓名,学号,C++成绩,英语和数学成绩,成员函数包括输出数据,求出总成绩和平均成绩,数据自拟。

(4)设计一个类CRectangle,要求其满足下述要求:

Sample(){}

~Sample(){cout<<\

Sample temp[2],*pTemp; return 0;

1> 定义一个带参数的构造函数,参数有四个:前两个参数和后两个参数分别代表矩形的左上角和右下角坐标,当给定的坐标不能构成矩形时则将矩形的左上角和右下角坐标初始化为(0,0)和(1,1);

2>定义并实现成员函数IsSquare(),该函数用于判断该矩形是否是正方形,是正方形则返回1,否则返回0;

3> 定义并实现成员函数PrintRectangle(),该函数打印矩形四个点的坐标值;

4> 定义并实现成员函数Area(),该函数返回矩形的面积; (5)建立一个类WORD,统计一个英文字符串中单词的个数。字符串中单词以空格符分隔。如字符串“shut the door after you.”中单词个数为5。要求如下: 1>私有数据成员: char s[80]:存放字符串。

int c:存放字符串中英文单词的个数。 2>公有成员函数:

构造函数:WORD(char *str)初始化字符数组成员s void fun():统计字符串中英文单词的个数 void disp():输出字符串及其英文的单词个数

3>在主程序中对该类进行测试。使用字符串”shut the door after you.”

(6)定义一个有理数类Rational。该类存放分数形式的有理

数。要求如下:

1>定义私有变量x和y分别存放分子和分母,同时分子和分母要以最简形式存放。

2>定义带默认参数值的构造函数,默认有理数为0(分子为0,分母为1)

3>定义成员函数Add,Sub,Mul和Div,分别用来完成两个有理数的加减乘除运算,运算结果仍以最简形式存放。 4>以X/Y的形式打印有理数。 5>以浮点数的形式打印有理数。

第三章

1.C++中内存的分配方式有几种?

2.什么叫拷贝构造函数?拷贝构造何时被调用? 3.程序分析题 (1)#include using namespace std; class DA { int k;

public:

};

DA(int x=1):k(x){} ~DA(){cout<

int main(void) { }

(2)#include using namespace std; class myClass { public:

myClass() { cout<<\~myClass(){cout<<\myClass(int i):data(i) { }

cout<<\DA d[]={DA(3),DA(3),DA(3)}; DA *p=new DA[2]; delete []p; return 0;

private:

};

int data;

myClass play(myClass b) { }

int main(void) { }

4.程序设计题

(1)为二维点(x,y)实现一个Point类,该类包括一个默认构造函数,一个拷贝构造函数,一个negate()函数,把点转换为负数,一个norm()函数,返回从原点(0,0)到该点的距离,以及print()函数。

(2)编写一个程序,该程序建立一个动态数组,为动态数组的元素赋值,显示动态数组的值并删除动态数组。 (3)建立一个学生类,数据成员包括学号,姓名,性别,成绩等,成员函数自拟,创建一个单链表,用于保存输入的若干学生信息,给出一个age,在链表中删除第一个年龄等于age的学生信息。

return b;

myClass temp=play(5); return 0;

(4)在上题的基础上,编写若干成员函数分别用于计算学生成绩最高分,统计小于60分的学生人数,计算学生成绩的平均分。

(5)在扑克牌游戏中,每次游戏开始都要求把54张牌重新排列一下,称为洗牌。试编写程序将一副扑克牌随机洗牌后,顺序输出54张牌的情况。

提示:为使用随机数,C++语言中有如下两个函数。 原型:int rand(void)

功能:函数返回一个在0到RAND_MAX之间的伪随机整数 原型:int srand(unsigned seed)

功能:设置rand()随机序列种子。对于给定的种子seed,rand()会反复产生特定的随机序列

第四章

1.static全局变量与普通全局变量有什么区别?static局部变量与普通局部变量有什么区别? 2.程序分析题 (1) #include using namespace std;

class myClass { public: };

int myClass::number=0; int main(void) { }

(2)#include using namespace std; class Test

myClass() { number++;} ~myClass(){ number--;} static int number;

myClass *ptr; myClass A,B;

myClass *ptr_Arr=new myClass[3]; ptr=ptr_Arr; myClass C;

cout<

{ public:

static int func(); static void sfunc(Test& r);

private: };

int Test::val=20; int Test::func() { }

void Test::sfunc(Test& r) { }

int main(void) {

static int val; int a;

val+=val; return val;

r.a=25;

cout<<\

cout<<\

}

Test a;

cout<<\Test::sfunc(a); return 0;

3.程序设计题

(1)编一个类,声明一个数据成员和一个静态数据成员,其构造函数初始化数据成员,并把静态数据成员加1,其析构函数把静态数据成员减1.

1>编写一个应用程序,创建该类的3个对象,然后显示其

数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响

2>修改该类,增加静态成员函数并访问静态数据成员,并

声明静态数据成员为保护成员,体会静态成员函数的使用,静态成员之间与非静态成员之间相互访问题。

(2)定义一个处理日期的类TDate,它有3个私有数据成员:Month,Day,Year和若干个公有成员函数,并实现如下要求:(1)成员函数设置缺省参数;(2)定义一个友元函数来打印日期。 (3)设计一个类CTimeInfo,要求其满足下述要求。

1>要求有一个无参数的构造函数,其初始的小时和分钟分别为:0,0;

2>要求有一个带参数的构造函数,其参数分别对应小时

和分钟;

3>要求用一个成员函数实现时间的设置;

4>要求用一个友元函数实现以12小时的方式输出时间; 5>要求用一个友元函数实现以24小时的方式输出时间; (4)定义学生成绩类Score,其私有数据成员有学号,姓名,物理,数学,外语,平均成绩,再定义一个能计算学生平均成绩的普通函数Average(),并将该普通函数定义为Score类友元函数,在主函数中定义学生成绩对象,通过构造函数输入除平均成绩外的其他信息,然后调用Average()函数计算平均成绩,并输出学生成绩的所有信息。

(5)某次歌手比赛中,有JudgeNum个评委给选手打分,参加比赛的选手有PlayerNum名,现为比赛记分编写一个CompetitionResult类,类的定义如下: class CompetitionResult {

short num; //选手号码 char name[10]; //选手姓名 float score[JudgeNum]; //记录各评委

给选手的打分

float average; //选手最后得分,去掉一

个最高分和最低分后的平均分 public:

CompetitionResult();

CompetitionResult(short n,char *ps);

float MaxScore(); //求评委

打的最高分

float MinScore(); //求评委

打的最低分

void SetAvg(); 手的最后得分

float GetAvg(); 手的最后得分

short GetNo(); 的编号

void setNo(int j); 手的编号

char * GetName(); 手的姓名

float GetScore(int j); 个评委的打分

void SetScore(int k,float av); 第j个评委的打分

friend void Sort(CompetitionResult *pr,int n); 得分从高到低排序

//求选

//读选

//求选手

//设置选

//读选

//读第j

//记录

//按最后

};

1>写出所有成员函数的实现代码

2>编写main()函数对该类进行测试。在函数体中定义CompetitionResult类的对象数组r[PlayerNum],它的每个元素记录每个选手的所有信息,各评委的打分通过键盘输入,在屏幕上应有提示信息进行交互式操作,比赛结果按选手得分从高到低排序输出。

第五章

1. 继承概念?

2.在多继承方式下,派生类的构造函数和析构函数调用顺序是怎么样的?

3.什么叫做抽象类,抽象类有何作用,抽象类的派生类是否一定要给出纯虚函数的实现? 4.程序分析题

(1)#include using namespace std; class PARENT { public:

};

PARENT(){ cout<<\

class SON:public PARENT { public: }; int main() { }

(2)#include using namespace std; class A { public: };

SON(){ cout<<\

SON son; PARENT *p; p=&son; return 0;

A(){ cout<<\~A(){cout<<\

class B:public A { A *p;

public: }; int main() { }

(3)#include using namespace std; class B { public:

B(int x=0){X=x; cout<<\~B(){cout<<\void print(){ cout<

B(){ cout<<\~B(){ cout<<\

private:

int X;

};

class D:public B { public:

D(int x,int y):B(x)

{Y=y; cout<<\~D(){ cout<<\void print() { }

B::print(); cout<

private: }; int main() { }

int Y;

D d(11,22); d.print(); return 0;

(4)#include using namespace std; class A { public: };

class B:public A { public: }; int main() { A *pA; B b;

void fun(int data) {cout<<\void fun(char *str) {cout<<\virtual void fun(int data){cout<<\void fun(char *str) {cout<<\

pA=&b;

pA->fun(1); pA->fun(\return 0;

}

(5) #include using namespace std; class B { public:

B(int i) { b=i+50; show(); } B() { }

virtual void show() { cout<<\ protected: int b; };

class D :public B {

public: D(int i):B(i) { d=i+100; show(); } D() { }

void show() { cout<<\ protected: int d; }; void main() { D d1(108);

}

(6)#include using namespace std; class A { int x;

public: };

class B:virtual public A { int y; A(int a){x=a;}

void Display() { cout<

public: };

class C:virtual public A { int z;

B(int a,int b):A(a) { y=b; } void Display() { cout<

public:

C(int a,int b):A(a) { z=b; }

};

void Display() { cout<

class D:public B,public C {

int m,n;

public: };

void main() { }

5.程序设计题

(1)编写程序设计一个汽车类vehicle,包含的数据成员有车

D(int a,int b,int c,int d):B(c,a),C(c,b),A(c) { m=d; n=a; } void Display() { }

A::Display(); B::Display(); C::Display();

cout<

D dd(12,13,14,15); dd.Display();

轮个数wheels和车重weight。小车类car是它的派生类,其中包含载人数passenger_load。卡车类truck也是vehicle的派生类,其中包含载人数passenger_load和载重量payload。每个类都有相关数据的输出方法。

(2)某销售公司有销售经理和销售员工,月工资的计算方法为:销售经理的底薪为4000元,并将销售额的2/1000作为提成,销售员工无底薪,只提取销售额的5/1000作为工资。编写程序:

1》定义一个基类Employee,它包含3个数据成员number(职员编号),name(职员姓名)和salary(职工工资),以及用于输入编号和姓名的构造函数。

2》由Employee类派生Saleman类。Saleman类包含两个新数据成员commrate(提成比例)和sales(销售额),还包含用于输入销售额并计算销售员工工资的成员函数pay()和用于输出的成员函数print()。

由Saleman派生Salemanager类。Salemanager类包含新数据成员monthlypay(底薪),以及用于输入销售额并计算销售经理工资的成员函数pay(),用于输出的成员函数print()。 编写main()函数中,测试所设计的类结构,并计算若干个不同员工的工资。

(3)定义一个哺乳动物Mammal类,再由此派生出狗Dog类,两个都定义Speak成员函数,基类中定义为虚函数,定

义一个Dog类的对象,调用Speak函数,观察运行结果。 (4)设计一个基类base为抽象类,其中包含gettitle()和printtitle()两个成员函数,另有一个纯虚函数isgood(),由该类派生Book和Journal两个类,分别实现纯虚函数 isgood(),对于前者版本,如果每月图书销量超过500,则返回True,对于后者版本,如果每月杂志销售量超过2500,则返回true,编程实现

(5)编写程序计算正方体,圆柱体和球的表面积和体积。要求抽象出一个公共的基类Body,把他作为抽象类,在该类中定义求表面积和体积的纯虚函数。抽象类中定义一个数据成员data,它作为球的半径,正方体的边长或圆柱体底面圆的半径。由这个抽象类派生出描述球,正方体和圆柱的3个具体类,在这3个类中都有计算表面积和体积的函数的具体实现。

(6)写一个程序,定义抽象类型Shape,由他派生五个类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Triange(三角形)。用虚函数分别计算几种图形的面积,并求他们的和。要求用基类指针数组,使它的每一个元素指向一个派生类的对象。

第六章

1.程序设计题

(1)定义人民币类RMB表示人民币信息,重载强制类型转换运算符将其转换为双精度数。

(2)编写一个时间类,实现时间的自增,自减,读和输出 (3)定义学生成绩类Score,其私有数据成员有学号,姓名,物理,数学,外语,平均成绩,再定义一个能计算学生平均成绩的普通函数Average(),并将该普通函数定义为Score 类友元函数,在主函数中定义学生成绩对象,通过构造函数输入除平均成绩外的其他信息,然后调用Average()函数计算平均成绩,并输出学生成绩的所有信息。 (4)设有一个字符串类String的定义如下: class String { public:

String();

String(const char * ch); String(const String& str); ~String(); int size(); char *c_str();

String& operator=(const String& str); String& operator=(const char* ch);

char& operator[](int index); bool operator==(const String& str); bool operator==(const char* ch); String operator+(const String& str); String operator+(const char* ch); String& operator+=(const String& str); String& operator+=(const char* ch);

private: 小 };

写出类中各成员函数和重载运算符的实现代码,并编写主函数测试。

(5)定义一个多项式类Polynomial,重载运算符+,-,+=,-=,*=,使之能用于多项式的加减乘运算,编写程序,求两个多项式的和,差,积。

(6)编写程序,重载运算符“<<”和“>>”,使用户能直接输入和输出固定电话的号码,电话号码以“(027)********”形式输入和输出。

int _size; //字符串大

char* _string; //字符串

第七章

1.程序设计题

(1)编写模板函数maxn(),它将一个包含5个T类型元素的数组作为参数,并返回数组中最大的元素,在一个程序中使用该函数,将T替换为一个包含5个int值的数组和5个double值的数组,以测试该函数。

(2)利用函数模板设计一个求数组元素中和的函数,并检验之。

(3)已知void Sort(int a[],int size);和void Sort(double a[],int size);是一个函数模板的实例,其功能是将数组a中的前size个元素按从小到大顺序依次排列。试设计这个函数模板。 (4)设有如下的类声明: class Test { public:

void SetData1(int val) {data1=val;} void SetData2(double val) {data2=val;} int GetData1() {return data1;} double GetData2() {return data2;}

private:

int data1; double data2;

}

试将此类声明改为类模版声明,使得数据成员data1和data2可以是任何类型。

(5)下面是一个整形栈类的定义: const int MaxSize=100; class IStack { public: IStack(); void Pop(); void Push(int &n); int GetTop(); bool Empty(); int Size(); void ClearStack();

~IStack();

private: int elem[MaxSize]; int Top;

}

试编写一个栈的类模版(包括其成员函数的实现),以便为任何类型的对象提供栈结构的数据操作。

(6)同上,试编写一个队列的类模版(包括其成员函数的实现),以便为任何类型的对象提供队列结构的数据操作。