练习题2019.6 一、单项选择题 1. 关于预处理命令#includeiostream作用的描述中,错误的是( )。 A. 命令提供C++程序的结构框架 B. 程序编译时先处理#include等预处理命令 C. 文件iostream向程序提
练习题2019.6
一、单项选择题
1. 关于预处理命令#include<iostream>作用的描述中,错误的是( )。
A. 命令提供C++程序的结构框架
B. 程序编译时先处理#include等预处理命令
C. 文件iostream向程序提供输入和输出所需的信息
D. 将文件”iostream”的内容代替该命令包含到程序中
2、 语句using namespace std;的作用是( )。
A. 使用标准库std B. 使用命名空间std
C. 使用工作空间std D. 使用内存空间std
3. ( )不是C++语言的基本数据类型。
A. double B. unsigned C. bool D. int *
4、. 若有定义int a=123,b=8;,执行语句a%=b+2; 之后,变量a的值为( )。
A. 1 B. 2 C. 3 D. 5
5、已知int i, x, y;在下列选项中错误的是( )。
A. if ( x && y ) i ++; B. if ( x == y) i --;
C. if ( xy ) i --; D. if ( x + y ) i++;
6、 char ch;
cin>>ch;
ch=(ch>=’A’&&ch<=’Z’)?:(ch+32),ch;
若以上程序输入了字符’B’,则变量ch的内容是( )。
A. ‘B’ B. ‘b’ C. ‘Z’ D. ‘z’
7、i=2,执行下列语句后的值为( )。
switch ( i )
{ case 1: i++;
case 2: i- -;
case 3: ++i; break;
case 4: - -i;
default : i++; }
A. 1 B. 2 C. 3 D. 4
8、已知int m=10;下列表示引用的方法中,( )是正确的。
A. int &x=m; B. int &y=10;
C. int &z; D. float &t=&m;
9、执行语句:
int a = 10, b;
int & pa = a , & pb =b;后,下列正确的语句是( )。
A. &pb = a; B. pb = pa; C. &pb = &pa; D. *pb = *pa;
10、执行语句
int a = 10,b=20;
const int *pa = &a; 后,执行下列哪条语句会发生错误( )。
A. *pa = *pa+b; B. a=a+b; C. a = *pa+b; D. pa = &b;
11、以下为死循环的程序段是( )。
A. for ( int x = 0;x < 3; ) { x++; }
B. int k = 0;
do { ++k; } while ( k>=0 );
C. int a=5; while ( a ) { a- -; }
D. int i=3; for ( ;i ; i-- ) ;
12、系统在调用重载函数时,根据一些条件选择调用哪个重载函数,下列选项中不能做为依据的是( )。
A. 函数类型 B. 参数类型
C. 参数个数 D. 参数类型或参数个数
13、函数原型声明:void testDP(int a,int b=7,char c=’*’);,下列函数调用中不合法的是( )。
A. testDP(5); B. testDP(5,8 );
C. testDP(5,’#’); D. testDP(5,8,’a’);
14、若用数组名作为调用函数的实参,则传递给形参的是( )。
A. 数组存储区首地址 C. 数组的第一个元素值
B. 数组中全部元素的值 D. 数组元素的个数
15、执行语句
int a[2][10] ,(*p)[10] = a;
a[1][1] =8;下列语句要与本赋值语句功能相同,其中错误语句是( )。
A. *(a[1]+1)=8; B. *(*(p+1)+1)=8; C. p[1][1] =8; D. * p[1][1] =8;
16、有函数声明 int fun1(int); ,定义指向该函数的指针,下面选项正确的是( )。
A. int * pf = &fun1; B. int * pf (int) = &fun1;
C. int( * pf) (int) = fun1(); D. int (* pf) (int) = fun1;
17、有如下语句:
int fun4 (int);
int (* pf) (int) = fun4; 下面选项正确的是( )。
A. int a = 15; int n = fun4 (&a);
B. int a = 15; cout<<pf (a*3.14);
C. cout<<(* pf) (256); D. cout<<*pf (256);
18、在类的外部,可以被访问的成员是( )属性的类成员。
A. 所有 B. private或protected
C. public D. public 或 private
19、类中可以被对象无限制使用的成员是( )。
A. public 成员 B. private成员
C .protected 成员 D .public与private 成员
20、关于类和对象不正确的说法是( )。
A. 类是一种类型,它封装了数据和操作 B. 对象是类的实例
C. 一个类只能定义一个对象 D. 一个对象必属于某个类
21、已知类Xcls,语句Xcls array[3]定义对象数组时,调用了( )次构造函数。
A . 0 B. 1 C. 2 D. 3
22、运算符delete用于删除一个动态对象时,以下正确的是( )。
A.先调用构造函数,再释放对象占用的内存
B.先释放对象占用的内存,再调用构造函数
C.先调用析构函数,再释放对象占用的内存
D. 先释放对象占用的内存,再调用析构函数
23、以下常成员的说法,不正确的是( )。
A.常数据成员定义与常变量定义相同,但必须在类中
B.常数据成员要在定义时直接初始化
C.常数据成员只能用构造函数的参数初始化表来初始化
D. 常数据成员初始化后不能更新
24、void Time:: fun (int){…;}是Time类的成员函数,定义一个指向该成员函数的指针,下面选项正确的是( )。
A. void (Time:: * pf) (int) =& Time:: fun;
B. void Time:: * pf (int) = &Time:: fun;
C. void (Time:: * pf) (int) = &fun;
D. void (* pf )(int) =&Time:: fun;
25、下面对构造函数的不正确描述是( )。
A. 用户未定义构造函数时系统可以提供默认构造函数。
B. 构造函数可以有参数,所以也可以有返回值
C. 构造函数可以重载。
D. 构造函数可以设置默认参数。
26、下面对析构函数的不正确描述是( )。
A. 析构函数只能有一个。
B. 与构造函数一样,析构函数可以有参数。
C. 析构函数功能是用于释放对象前做清理扫尾工作。
D. 析构函数没有函数类型。
27、已知类myclass,则该类的拷贝构造函数声明语句是( )。
A. myclass(myclass x); B. myclass&(myclass x);
C. myclass(myclass &x); D. myclass(myclass *x);
28、Complex是复数类,语句Complex(2.8 , 12.5);的功能是( )。
A. 定义名字是Complex的对象
B. 调用析构函数进行初始化
C. 定义一个无名对象
D. 二个数据转为复数后求和
29、以下关于友元函数的描述中,错误的是( )。
A. 友元函数可以访问类的私有数据成员
B. 一个类的友元类的成员函数,都是这个类的友元函数
C. 友元函数有助于数据共享和提高程序的效率
D. A类是B类的友元类,B类是C类的友元类,所以A类也是C类的友元类
30、类模板的使用,实际上是将类模板实例化为一个( )。
A. 类 B.对象 C.函数 D. 数据
31、在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的( )。
A. 私有成员 B. 公有成员 C. 保护成员 D. 保护成员或私有成员
32、 在公有继承的情况下,基类的公有或保护成员在派生类中的访问权限( )。
A. 受限制 B. 受保护 C. 保持不变 D. 不受保护
33、如果从原有类定义新类可以实现的是( )。
A. 信息隐藏 B. 数据封装 C. 数据抽象 D. 继承机制
34、 C++类体系中,不能被派生类继承的有( )。
A. 常成员函数 B. 构造函数
C. 虚函数 D. 静态成员函数
35、下面不能重载的运算符是( )。
A. && B. [] C. :: D. new
36、在复数类Complex中声明重载“+”运算符函数,用于二复数对象的求和运算,下面正确的声明是( )。
A. Complex operator+( Complex &c2);
B. double operator+( double &c2);
C. Complex double+( Complex c2);
D. operator double ( Complex &c2);
37、以下基类中的成员函数表示纯虚函数的是()
A. void tt(int)=0 B. virtual void tt(int){}
C. virtual void tt(int) D. virtual void tt( )=0
38、所谓多态性是指 ()
A. 不同的对象调用不同名称的函数
B. 不同的对象调用相同名称的函数
C. 一个对象调用不同名称的函数
D. 一个对象调用不同名称的对象
39、类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针 ,则p->A::func()将( )。
A. 既调用类A中函数,也调用类B中的函数
B. 根据p所指对象类型确定调用类A中或类B中的函数func()
C. 调用类B中的函数func()
D. 调用类A中的函数func()
二、填空题
1.请写出“A小于B或小于C”的表达式为 ( )。
2、设"int a=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是( )。
3、判断变量char a中是大写字母字时,转为小写的语句是:( )。
4、为变量int d赋一个-20≤d≤+20之间的随机整数的语句是:( )。
5.在C++中,函数的参数有两种传递方式,它们是值传递和 ( )。
6、已有函数声明int fun(float,char);,把它声明成内置(内联)函数的语句是:( )。
7、在 C++中定义重载函数时,应至少使重载函数的参数个数或参数类型 ( )。
8、举出C++中两种用户自定义的数据类型:( )。
9.面向对象的程序设计有四大特征,它们是( ) 。
10、用户声明类时,未定义任何构造函数,系统会自动产生一个( )。
11. 用类定义一个新对象时,系统总是要匹配一个合适的( )并调用它去初始化对象,若没有合适的,应用程序会产生一个编译错误。
12、用户声明的类中不可缺少的成员函数是( )和( )。
13 若用户在类声明中已定义了构造函数,系统( )自动产生一个默认构造函数。
14、构造函数与析构函数在定义形式上,它们的区别包括构造函数名与类名相同,而析构函数名是在类名前加一个~、( )。
15.静态数据成员只能在( )进行初始化,未初始化的静态数据成员,系统会自动赋予初值0;静态数据成员不属于( ),而属于( )。
16、类的常数据成员只能通过( )进行初始化。
17.声明成员函数void get_time()为常成员函数的声明语句是:( ),常成员函数只能引用而不能能修改本类中的数据成员。
18、单目运算符作为类成员函数重载时,形参个数为( )个。
19、在C++类中,const关键字可以修饰对象和成员函数,const对象不能( ),const成员函数不能( )。
20、 基类的公有成员在派生类中的访问权限由( )决定。
21、 C++中有两种继承:单继承和( )。虚基类的作用是( )。
22、一个抽象类的派生类可以实例化的必要条件是所有的( )。
三、程序分析题
1、给出下面程序输出结果,程序的功能是?
#include < iostream >
using namespace std;
int main ( )
{ const int n=10;
int i,f[n]={12,-61,125,33,268,-107,29,0,41,-80};
int max=f[0],min=f[0];
for (i=0; i<n; i++)
{ if(f[i] > max) max = f[i];
if(f[i] < min) min = f[i];
}
cout<<"max="<<max<<",min="<<min<<endl;
return 0;
}
2、给出下面程序输出结果。
#include <iostream>
using namespace std;
class Base
{ public:
Base(int s=0) : y(s){ cout<<"Base("<<y<<”)”<<endl; }
~Base() {cout<<"~Base()"<<endl;}
void print() {cout <<y<< ",";}
protected:
int y;
};
class Derived: public Base
{ public:
Derived (int a, int b): Base(a) { z=b;
cout<<"Derived("<< y <<","<<z <<”)”<<endl; }
~Derived( ) {cout<<"~Derived()"<<endl;}
void print() { Base:: print();
cout<< z <<endl; }
private:
int z;
};
int main( )
{ Derived d(10,20);
d.print();
return 0;
}
3.给出下面程序输出结果。
#include < iostream >
using namespace std;
int main()
{ int a[5][5];
int i,j;
for(i=0;i<5;i++)
{ a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<5;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<5;i++)
{ for(j=0;j<=i;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
return 0;
}
4、给出下面程序输出结果。
#include<iostream>
using namespace std;
class A
{public:
virtual void print(){ cout<< "A 打印程序..."<< endl; } };
class B: public A
{ public:
void show(){ cout<< "B 打印程序..."<< endl; } };
class C: public B
{ public:
void print(){ cout<<"C 打印程序..."<<endl; } };
int main( )
{ A a, *p1, *p2, *p3;
B b; C c;
p1=&a; p2=&b; p3=&c;
p1-> print();
p2-> print();
p3-> print();
b. show();
return 0 ;
}
5、程序运行到断点所在行,写出程序的显示结果。
#include <iostream>
using namespace std;
class Cardgame
{ private:
int players;
static int total;
public:
Cardgame(int p);
~Cardgame(void);
};
Cardgame::Cardgame(int p)
{ players = p;
total += p;
cout<<" "<<p<<" 人加入游戏。现在共有 ";
cout<< total <<" 人参加。"<< endl;
}
Cardgame::~Cardgame(void)
{ total -= players;
cout <<" "<< players << " 人退出游戏。现在共有";
cout << total << " 人参加。" << endl;
}
int Cardgame::total = 0;
int main()
{ Cardgame *bridge = new Cardgame(4);
Cardgame *blackjack = new Cardgame(8);
delete blackjack;
Cardgame *poker = new Cardgame(5);
return 0; //断点所在行
}
五、程序设计
1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。
2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。
4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。
6、如下数组类模板:
template<typename T, int SIZE>
class array
{private:
T arr[SIZE];
int len;
public:
array( );
array( T b[] );
T& operator[]( int i ) { return arr[i];}
T get_elem( int i ) const { return arr[i]; }
void set_elem( int i,const T& value ) { arr[i]=value; }
};
请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。
7、设计一函数,能对有n个元素的整形数组a[]进行排序。
8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。
9、程序设计,键盘输入a,程序求数a的平方根,用迭代式
,
,结果输出显示。迭代进行到fabs(xn+1-xn)<10-5为止。
10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
private:
int element[3][3];
};
11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。
12.声明复数的类Complex,使用成员函数add()实现复数加法。
class Complex
{ private:
double real, image;
public :
Complex();
Complex(double a,double b);
void setRI(double a, double b) ;
double getReal() ;
double getImage();
void print();
Complex add(Complex);
};
13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
void display( );
private:
double real;
double imag;
};
14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。
牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。
二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。
请以类外定义方式:
①编写无参构造函数,功能:初始化各系数ai为1
②编写有参构造函数,功能:按参数初始化各系数ai
class Solve
{public:
Solve();
Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);
void half(float,float);
void display(float,int);
void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a0=aa0,a1=aa1,a2=aa2,a3=aa3;}
float getx(){ return x;}
private:
float x,a0,a1,a2,a3;
};
15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。
16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。
#include<iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetArea()=0;
} ;
17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。
#include <iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetPerim()=0;
} ;
18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:
(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;
(2) 按a/b的形式输出分数的值,a、b为整数。
最后在main函数中对上述功能进行测试。
*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。
*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,
Minmultiple=m×n/Maxdivisor
一、单项选择题
1A. 2B. 3 D. 4C. 5C. 6B. 7B. 8A. 9B. 10A. 11B. 12A. 13C. 14A. 15D. 16D. 17B.
18C. 19A. 20C. 21D. 22C.23B.24A. 25B. 26B. 27C. 28C. 29D. 30A.31A. 32C.
33D. 34B. 35C. 36A. 37D. 38B. 39D.
二、填空题
1. ( A<B||A<C ) 2、( 0 )。
3、 ( if(a>=’A’&&a<=’Z’) a+=32; ) 4、 ( int d=rand()%41-20; )
5. ( 地址传递(包括引用) )。 6、 ( inline int fun(float,char); )
7、( (至少有一个)不同 ) 8、( 类、结构、枚举、联合)。
9.( 抽象、封装、继承、多态 )。
10、((无参数函数体为空的)默认构造函数 )。
11. ( 构造函数 )。
12、( 构造函数 ); ( 析构函数 );
13 、( 不会再 )。
14、( 析构函数不能有参数 )
15.( 类外 ); ( 对象 ), ( 类 )。
16、( 构造函数的参数初始化表 )
17.( void get_time() const )
18、( 0 )。
19、( 被修改 ); ( 修改类数据成员 );
20、(访问控制方式或继承方式)。
21、( 多继承 ) ;( (多继承时)避免(重复继承)产生二义性 )。
22、( 纯虚函数都要定义 )。
三、程序分析题
1、给出下面程序输出结果,程序的功能是?
1答: max=268,min=-107 功能是求一维数组中最大、最小元素。
2、给出下面程序输出结果。
2答案:
Base(10)
Derived(10,20)
10, 20
~Derived()
~Base()
3.给出下面程序输出结果。
3答:输出杨辉三角。或画出图象。

4、给出下面程序输出结果。
4答案
A 打印程序...
A 打印程序...
C 打印程序...
B 打印程序...
5、程序运行到断点所在行,写出程序的显示结果。
5答案:
4人加入游戏。现在共有4人参加。
8人加入游戏。现在共有12人参加。
8人退出游戏。现在共有 4人参加。
5人加入游戏。现在共有9人参加。
五、程序设计
1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。。
答案:
#include <iostream>
using namespace std;
int main()
{ int a[10][10];
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
a[i][j]=i+j;
int sum = 0;
for(i=0;i<10;i++)
{ sum+=a[i][i];
sum+=a[9-i][i];
}
cout<<sum;
return 0;
}
2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
答案:
template<class T>
T getmax(T a,T b,T c)
{ T temp;
temp=a>b? a:b;
return (temp>c? temp:c);
}
3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。
答案
template<class Type >
Type getmax(Type x[],int n)
{
Type max=x[0] ;
int i;
for(i=1;i<n;i++)
if (max<x[i]) max=x[i];
return max;
}
4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
答案:
template<class T>
T getmidd(T a,T b,T c)
{ if((a>b && b>c)||(a<b && b<c)) return b;
if((b >a &&a>c)||( b < a &&a<c)) return a;
if((a>c&& c > b)||(a<c&& c < b)) return c; }
5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。
答案:
#include < iostream >
using namespace std;
template<class T>
T sum (T a[],int n)
{ int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
int main ()
{ int a[5]={1,2,3,4,5};
int s = sum(a,5);
cout<< s<< endl;
return 0;
}
6、如下数组类模板:
template<typename T, int SIZE>
class array
{private:
T arr[SIZE];
int len;
public:
array( );
array( T b[] );
T& operator[]( int i ) { return arr[i];}
T get_elem( int i ) const { return arr[i]; }
void set_elem( int i,const T& value ) { arr[i]=value; }
};
请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。
答案:
template<typename T,int SIZE>
array1<T,SIZE>::array(T b[]):len(SIZE)
{ for(i=0;i<len;i++) arr[i]=b[i];
}
7、设计一函数,能对有n个元素的整形数组a[]进行排序。
答案:
void sortn(int a[],int n)
{ int min,i,j,temp;
for (i=1;i<n;i++)
{ min=i;
for (j=i+1;j<=n;j++)
if(a[min]>a[j]) min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。
答案:
#include <iostream>
#include <iomanip>
using namespace std;
float ConvertT(float TempF){return ((TempF-32.0)*5/9);}
int main()
{ float tf,tc;
char y='y';
do { cout<<endl<<" 请输入华氏温度:";
cin>>tf;
cout<<endl;
tc= ConvertT(tf);
cout<<" 摄氏温度为:";
cout<< setioflags(ios::fixed)<<setprecision(2) <<tc<<endl<<endl;
cout<<" 继续变换华氏温度到摄氏温度吗(y/n)?";
cin>>y;
cout<<endl;
}while (y==’Y’||y==’y’);
return 0;
}
9、程序设计,键盘输入a,程序求数a的平方根,用迭代式
,
,结果输出显示。迭代进行到fabs(xn+1-xn)<10-5为止。
答案:
#include <iostream>
#include<cmath>
using namespace std;
int main ()
{ double x1,x2,p=0,a;
cout<<"请输入a的值:";
cin>>a;
if (a<0)
{ cout<<"a的值应当是正值,请重新输入a的值:";
cin>>a;
}
x1=a/2;
do
{ x2=(x1+a/x1)/2 ;
p=x1;
x1=x2;
x2=p;
} while( fabs(x2-x1) >1e-5 );
cout<<"a的平方根为:"<<x1<<endl;
return 0;
}
10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
private:
int element[3][3];
};
答案:
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
friend ostream& operator<<( ostream&, Matrix &);
private:
int element[3][3];
};
ostream& operator<<( ostream &output, Matrix &m)
{
for(int i=0;i<3;i++)
{ for(int j=0;j<3;j++)
output<<m.element[i][j]<<’\t’;
output<<endl;
}
return output;
}
11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。
答案:
#include < iostream >
using namespace std;
class Point //点类
{private:
int x, y; //私有成员变量,坐标
public :
Point() { x = 0; y = 0; }
Point(int a, int b) { x = a; y = b; }
void setXY(int a, int b){ x = a; y = b; }
int getX(){ return x; }
int getY(){ return y; }
};
class Rectangle //矩形类
{private:
Point point1, point2, point3, point4;
public :
Rectangle();
Rectangle(Point one, Point two)
{ point1 = one;
point4 = two;
init();
}
Rectangle(int x1, int y1, int x2, int y2)
{ point1.setXY(x1, y1);
point4.setXY(x2, y2);
init();
}
void init() //给另外两个点做初始化的函数
{ point2.setXY(point4.getX(), point1.getY() );
point3.setXY(point1.getX(), point4.getY() );
}
void printPoint() //打印四个点的函数
{
cout<<"A:("<< point1.getX() <<","<< point1.getY() <<")"<< endl;
cout<<"B:("<< point2.getX() <<","<< point2.getY() <<")"<< endl;
cout<<"C:("<< point3.getX() <<","<< point3.getY() <<")"<< endl;
cout<<"D:("<< point4.getX() <<","<< point4.getY() <<")"<< endl;
}
int getArea()//计算面积的函数
{
int height, width, area;
height = point1.getY() - point3.getY();
width = point1.getX() - point2.getX();
area = height * width;
if(area >=0) return area;
else return -area;
}
};
int main()
{ Point p1(-15, 56), p2(89, -10); //定义两个点
Rectangle r1(p1, p2) ; //用两个点做参数,声明一个矩形对象r1
Rectangle r2(1, 5, 5, 1);//用两队左边,声明一个矩形对象r2
cout<<"矩形r1的4个定点坐标:"<< endl;
r1.printPoint();
cout<<"矩形r1的面积:"<< r1.getArea() << endl;
cout<<"\n矩形r2的4个定点坐标:"<< endl;
r2.printPoint();
cout<<"矩形r2的面积:"<< r2.getArea() << endl;
return 0;
}
12.声明复数的类Complex,使用成员函数add()实现复数加法。
class Complex
{ private:
double real, image;
public :
Complex();
Complex(double a,double b);
void setRI(double a, double b) ;
double getReal() ;
double getImage();
void print();
Complex add(Complex);
};
答案:
#include < iostream >
using namespace std;
class Complex
{ private:
double real, image;
public :
Complex(){real=0; image=0; }
Complex(double a,double b){ real = a; image = b; }
void setRI(double a, double b) { real = a; image = b; }
double getReal() { return real; }
double getImage(){ return image; }
void print(){
cout<<"复数:("<< real <<" , "<< image <<"i )"<< endl;
}
Complex add(Complex); //声明成员函数
};
Complex Complex::add( Complex c2) //定义成员函数
{ Complex c;
c.real = real + c2.real;
c.image = image + c2.image;
return c;
}
int main()
{ Complex c1(19, 0.864), c2, c3;
c2.setRI(90,-125.012);
c3 = c1.add( c2);
cout<<"复数一:";c1.print();
cout<<"复数二:";c2.print();
cout<<"相加后:";c3.print();
return 0;
}
13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
void display( );
private:
double real;
double imag;
};
答案:
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
friend Complex operator+( Complex &, Complex &);
friend ostream& operator<<( ostream &, Complex &);
void display( );
private:
double real;
double imag;
};
Complex operator+( Complex &c1, Complex &c2)
{
Complex temp;
temp.real=c1.real+c2.real;
temp.imag=c1.imag+c2.imag;
return temp;
}
ostream& operator<<( ostream &out, Complex &c)
{ out<<”(”<<c.real<<”,”<<c.imag<<”i )”; }
14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。
牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。
二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。
请以类外定义方式:
①编写无参构造函数,功能:初始化各系数ai为1
②编写有参构造函数,功能:按参数初始化各系数ai
class Solve
{public:
Solve();
Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);
void half(float,float);
void display(float,int);
void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a0=aa0,a1=aa1,a2=aa2,a3=aa3;}
float getx(){ return x;}
private:
float x,a0,a1,a2,a3;
};
答案:
①Solve::Solve(){a0=1;a1=a0;a2=a0;a3=a0;}
②Solve::Solve(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a3=aa3;a2=aa2;a1=aa1;a0=aa0;}
15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。
答案:
#include < iostream >
using namespace std;
class Dog
{private:
static int dogs; //静态数据成员,记录Dog的个体数目
public :
Dog(){}
void setDogs(int a) { dogs = a; }
static int getDogs(){ return dogs; }
};
int Dog::dogs = 25; //演示静态数据成员初始化值
int main()
{ cout<<"未定义Dog类对象之前:x = "<< Dog::getDogs() << endl;
//dogs静态数据成员在产生对象之前即存在,输出
Dog a, b;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
a.setDogs(360);
cout<<"给对象a中的x设置值后:"<< endl;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
return 0;
}
程序可以说明静态成员属于类:main中第一句未定义Dog类对象之前dogs就可以使用并输出说明其静态特性,用类名域Dog::getDogs()调用成员函数说明静态成员属于类;第五句虽通过对象a设置值为360,其后通过a和b对象输出的dogs值全是360,说明dogs并不是a的,而是a和b的公共的,即静态成员属于类。
16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。
#include<iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetArea()=0;
} ;
(1)答案
class Rectangle: public Shape
{
public:
Rectangle(float a,float b):L(a),W(b){}
~Rectangle(){}
float GetArea(){return (L*W);}
float GetPerim(){return (L+W)*2;}
private:
float L,W;
};
(2)答案:
class Cyl: public Shape
{public:
Cyl(float r0,float h0):r(r0),h(h0){}
~Cyl(){}
float GetArea(){return (2*r*r*3.14f+2*3.14f*r*h);}
private:
float r,h;
};
17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。
#include <iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetPerim()=0;
} ;
答案:
class Circle:public Shape
{ public:
Circle(float r0):r(r0){}
float GetPerim(){return 3.14*2*r;}
float GetArea(){return 3.14*r*r;}
private:
float r;
};
int main()
{ Circle c1(8.5);;
cout<<c1.GetPerim ()<<endl;
cout<<c1.GetArea()<<endl;
return 0;
}
18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:
(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;
(2) 按a/b的形式输出分数的值,a、b为整数。
最后在main函数中对上述功能进行测试。
*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。
*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,
Minmultiple=m×n/Maxdivisor
答:
(1)类的私有成员有:
①分子:int up;
②分母:int down;
③最小公倍数int Minmultiple(int a,int b);
④最大公约数int Maxdivisor(int a,int b);
(2)公有成员:
①构造函数(有参,无参):Rational( );
②转换构造函数:Rational(double a); 由实数转分数
③类型转换函数:operator double();由分数转实数
④分子与分母值更改函数:void setval();通过键盘输入方式完成
⑤分数显示函数:void Rational::showNomal() ;以分式方式显示分数
⑥重载运算符“+”、“*”和“<<”,实现2分数类对象的相加和相乘运算,结果以化简分式显示。
最后在main函数中对上述功能进行测试。
#include <iostream>
using namespace std;
class Rational
{ public:
Rational(int num1=1,int num2=1);
Rational(double a);
void setval();
void showNomal();
Rational operator*(Rational r1);
friend ostream& operator<<(ostream &out,const Rational &r);
friend Rational operator+(Rational r1,Rational r2);
operator double()
{ double a=double(up)/down;
return a;
}
private:
int up; //分子
int down; //分母
int Minmultiple(int a,int b); //最小公倍数
int Maxdivisor(int a,int b); //最大公约数
};
Rational::Rational(int num1,int num2)
{ up=num1;
down=(num2==0)?1:num2;
int i;
i=Maxdivisor(up,down);
up=up/i;
down=down/i;
}
Rational::Rational(double a){ //添加代码实现实数转分数...... }
void Rational::setval()
{ cout<<"输入分数的分子:";
cin>>up;
cout<<"输入分数的分母:";
cin>>down;
cout<<"输入的分数是:"<<up<<"/"<<down<<endl;
}
int Rational::Maxdivisor(int a,int b)
{ int temp;
int remainder;
if(a<b) { temp=a; a=b; b=temp; }
remainder=a%b;
while(remainder!=0)
{ a=b;
b=remainder;
remainder=a%b;
}
return b;
}
int Rational::Minmultiple(int x,int y)
{ return x*y/Maxdivisor(x,y);
}
Rational Rational::operator*(Rational r1)
{ int Ndown,Nup,i;
Ndown=down*r1.down;
Nup=up*r1.up;
i=Maxdivisor(Nup,Ndown);
return Rational(Nup/i,Ndown/i);
}
void Rational::showNomal()
{ cout<<up<<"/"<<down<<endl; }
ostream& operator<<(ostream &out,const Rational &r)
{ out<<r.up<<"/"<<r.down;
return out; }
Rational operator+(Rational r1,const Rational r2)
{
int Ndown,Nup,i;
Ndown=r1.down*r2.down;
Nup=r1.up*r2.down+r2.up*r1.down;
i=r1.Maxdivisor(Nup,Ndown);
Ndown/=i; Nup/=i;
Rational r(Nup,Ndown);
return r;
}
int main()
{ Rational r1(4,14), r2(5,8), r3, r4;
cout<<"The r1 is: ";
r1.showNomal();
cout<<"The r2 is: ";
r2.showNomal();
r3=r1*r2;
cout<<"The r1*r2 is: "<<r3<<endl;
r4=r1+r2;
cout<<"The r1+r2 is: "<<r4<<endl;
r1.setval();
r2.setval();
r4=r1+r2;
cout<<"The r1+r2 is: "<<r4<<endl;
double a;
cout<<"输入一个实数";
cin>>a;
r4=r1+Rational(a); //调用转换构造函数和+重载函数,显式类型转换
cout<<"The r1 is: "<<r1<<endl;
cout<<"The r1+"<<a<<" is: "<<r4;
a=r4; //隐含调用类型转换函数
cout<<" = "<<a<<endl;
return 0;
}
一、单项选择题
1. 关于预处理命令#include<iostream>作用的描述中,错误的是( )。
A. 命令提供C++程序的结构框架
B. 程序编译时先处理#include等预处理命令
C. 文件iostream向程序提供输入和输出所需的信息
D. 将文件”iostream”的内容代替该命令包含到程序中
2、 语句using namespace std;的作用是( )。
A. 使用标准库std B. 使用命名空间std
C. 使用工作空间std D. 使用内存空间std
3. ( )不是C++语言的基本数据类型。
A. double B. unsigned C. bool D. int *
4、. 若有定义int a=123,b=8;,执行语句a%=b+2; 之后,变量a的值为( )。
A. 1 B. 2 C. 3 D. 5
5、已知int i, x, y;在下列选项中错误的是( )。
A. if ( x && y ) i ++; B. if ( x == y) i --;
C. if ( xy ) i --; D. if ( x + y ) i++;
6、 char ch;
cin>>ch;
ch=(ch>=’A’&&ch<=’Z’)?:(ch+32),ch;
若以上程序输入了字符’B’,则变量ch的内容是( )。
A. ‘B’ B. ‘b’ C. ‘Z’ D. ‘z’
7、i=2,执行下列语句后的值为( )。
switch ( i )
{ case 1: i++;
case 2: i- -;
case 3: ++i; break;
case 4: - -i;
default : i++; }
A. 1 B. 2 C. 3 D. 4
8、已知int m=10;下列表示引用的方法中,( )是正确的。
A. int &x=m; B. int &y=10;
C. int &z; D. float &t=&m;
9、执行语句:
int a = 10, b;
int & pa = a , & pb =b;后,下列正确的语句是( )。
A. &pb = a; B. pb = pa; C. &pb = &pa; D. *pb = *pa;
10、执行语句
int a = 10,b=20;
const int *pa = &a; 后,执行下列哪条语句会发生错误( )。
A. *pa = *pa+b; B. a=a+b; C. a = *pa+b; D. pa = &b;
11、以下为死循环的程序段是( )。
A. for ( int x = 0;x < 3; ) { x++; }
B. int k = 0;
do { ++k; } while ( k>=0 );
C. int a=5; while ( a ) { a- -; }
D. int i=3; for ( ;i ; i-- ) ;
12、系统在调用重载函数时,根据一些条件选择调用哪个重载函数,下列选项中不能做为依据的是( )。
A. 函数类型 B. 参数类型
C. 参数个数 D. 参数类型或参数个数
13、函数原型声明:void testDP(int a,int b=7,char c=’*’);,下列函数调用中不合法的是( )。
A. testDP(5); B. testDP(5,8 );
C. testDP(5,’#’); D. testDP(5,8,’a’);
14、若用数组名作为调用函数的实参,则传递给形参的是( )。
A. 数组存储区首地址 C. 数组的第一个元素值
B. 数组中全部元素的值 D. 数组元素的个数
15、执行语句
int a[2][10] ,(*p)[10] = a;
a[1][1] =8;下列语句要与本赋值语句功能相同,其中错误语句是( )。
A. *(a[1]+1)=8; B. *(*(p+1)+1)=8; C. p[1][1] =8; D. * p[1][1] =8;
16、有函数声明 int fun1(int); ,定义指向该函数的指针,下面选项正确的是( )。
A. int * pf = &fun1; B. int * pf (int) = &fun1;
C. int( * pf) (int) = fun1(); D. int (* pf) (int) = fun1;
17、有如下语句:
int fun4 (int);
int (* pf) (int) = fun4; 下面选项正确的是( )。
A. int a = 15; int n = fun4 (&a);
B. int a = 15; cout<<pf (a*3.14);
C. cout<<(* pf) (256); D. cout<<*pf (256);
18、在类的外部,可以被访问的成员是( )属性的类成员。
A. 所有 B. private或protected
C. public D. public 或 private
19、类中可以被对象无限制使用的成员是( )。
A. public 成员 B. private成员
C .protected 成员 D .public与private 成员
20、关于类和对象不正确的说法是( )。
A. 类是一种类型,它封装了数据和操作 B. 对象是类的实例
C. 一个类只能定义一个对象 D. 一个对象必属于某个类
21、已知类Xcls,语句Xcls array[3]定义对象数组时,调用了( )次构造函数。
A . 0 B. 1 C. 2 D. 3
22、运算符delete用于删除一个动态对象时,以下正确的是( )。
A.先调用构造函数,再释放对象占用的内存
B.先释放对象占用的内存,再调用构造函数
C.先调用析构函数,再释放对象占用的内存
D. 先释放对象占用的内存,再调用析构函数
23、以下常成员的说法,不正确的是( )。
A.常数据成员定义与常变量定义相同,但必须在类中
B.常数据成员要在定义时直接初始化
C.常数据成员只能用构造函数的参数初始化表来初始化
D. 常数据成员初始化后不能更新
24、void Time:: fun (int){…;}是Time类的成员函数,定义一个指向该成员函数的指针,下面选项正确的是( )。
A. void (Time:: * pf) (int) =& Time:: fun;
B. void Time:: * pf (int) = &Time:: fun;
C. void (Time:: * pf) (int) = &fun;
D. void (* pf )(int) =&Time:: fun;
25、下面对构造函数的不正确描述是( )。
A. 用户未定义构造函数时系统可以提供默认构造函数。
B. 构造函数可以有参数,所以也可以有返回值
C. 构造函数可以重载。
D. 构造函数可以设置默认参数。
26、下面对析构函数的不正确描述是( )。
A. 析构函数只能有一个。
B. 与构造函数一样,析构函数可以有参数。
C. 析构函数功能是用于释放对象前做清理扫尾工作。
D. 析构函数没有函数类型。
27、已知类myclass,则该类的拷贝构造函数声明语句是( )。
A. myclass(myclass x); B. myclass&(myclass x);
C. myclass(myclass &x); D. myclass(myclass *x);
28、Complex是复数类,语句Complex(2.8 , 12.5);的功能是( )。
A. 定义名字是Complex的对象
B. 调用析构函数进行初始化
C. 定义一个无名对象
D. 二个数据转为复数后求和
29、以下关于友元函数的描述中,错误的是( )。
A. 友元函数可以访问类的私有数据成员
B. 一个类的友元类的成员函数,都是这个类的友元函数
C. 友元函数有助于数据共享和提高程序的效率
D. A类是B类的友元类,B类是C类的友元类,所以A类也是C类的友元类
30、类模板的使用,实际上是将类模板实例化为一个( )。
A. 类 B.对象 C.函数 D. 数据
31、在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的( )。
A. 私有成员 B. 公有成员 C. 保护成员 D. 保护成员或私有成员
32、 在公有继承的情况下,基类的公有或保护成员在派生类中的访问权限( )。
A. 受限制 B. 受保护 C. 保持不变 D. 不受保护
33、如果从原有类定义新类可以实现的是( )。
A. 信息隐藏 B. 数据封装 C. 数据抽象 D. 继承机制
34、 C++类体系中,不能被派生类继承的有( )。
A. 常成员函数 B. 构造函数
C. 虚函数 D. 静态成员函数
35、下面不能重载的运算符是( )。
A. && B. [] C. :: D. new
36、在复数类Complex中声明重载“+”运算符函数,用于二复数对象的求和运算,下面正确的声明是( )。
A. Complex operator+( Complex &c2);
B. double operator+( double &c2);
C. Complex double+( Complex c2);
D. operator double ( Complex &c2);
37、以下基类中的成员函数表示纯虚函数的是()
A. void tt(int)=0 B. virtual void tt(int){}
C. virtual void tt(int) D. virtual void tt( )=0
38、所谓多态性是指 ()
A. 不同的对象调用不同名称的函数
B. 不同的对象调用相同名称的函数
C. 一个对象调用不同名称的函数
D. 一个对象调用不同名称的对象
39、类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针 ,则p->A::func()将( )。
A. 既调用类A中函数,也调用类B中的函数
B. 根据p所指对象类型确定调用类A中或类B中的函数func()
C. 调用类B中的函数func()
D. 调用类A中的函数func()
二、填空题
1.请写出“A小于B或小于C”的表达式为 ( )。
2、设"int a=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是( )。
3、判断变量char a中是大写字母字时,转为小写的语句是:( )。
4、为变量int d赋一个-20≤d≤+20之间的随机整数的语句是:( )。
5.在C++中,函数的参数有两种传递方式,它们是值传递和 ( )。
6、已有函数声明int fun(float,char);,把它声明成内置(内联)函数的语句是:( )。
7、在 C++中定义重载函数时,应至少使重载函数的参数个数或参数类型 ( )。
8、举出C++中两种用户自定义的数据类型:( )。
9.面向对象的程序设计有四大特征,它们是( ) 。
10、用户声明类时,未定义任何构造函数,系统会自动产生一个( )。
11. 用类定义一个新对象时,系统总是要匹配一个合适的( )并调用它去初始化对象,若没有合适的,应用程序会产生一个编译错误。
12、用户声明的类中不可缺少的成员函数是( )和( )。
13 若用户在类声明中已定义了构造函数,系统( )自动产生一个默认构造函数。
14、构造函数与析构函数在定义形式上,它们的区别包括构造函数名与类名相同,而析构函数名是在类名前加一个~、( )。
15.静态数据成员只能在( )进行初始化,未初始化的静态数据成员,系统会自动赋予初值0;静态数据成员不属于( ),而属于( )。
16、类的常数据成员只能通过( )进行初始化。
17.声明成员函数void get_time()为常成员函数的声明语句是:( ),常成员函数只能引用而不能能修改本类中的数据成员。
18、单目运算符作为类成员函数重载时,形参个数为( )个。
19、在C++类中,const关键字可以修饰对象和成员函数,const对象不能( ),const成员函数不能( )。
20、 基类的公有成员在派生类中的访问权限由( )决定。
21、 C++中有两种继承:单继承和( )。虚基类的作用是( )。
22、一个抽象类的派生类可以实例化的必要条件是所有的( )。
三、程序分析题
1、给出下面程序输出结果,程序的功能是?
#include < iostream >
using namespace std;
int main ( )
{ const int n=10;
int i,f[n]={12,-61,125,33,268,-107,29,0,41,-80};
int max=f[0],min=f[0];
for (i=0; i<n; i++)
{ if(f[i] > max) max = f[i];
if(f[i] < min) min = f[i];
}
cout<<"max="<<max<<",min="<<min<<endl;
return 0;
}
2、给出下面程序输出结果。
#include <iostream>
using namespace std;
class Base
{ public:
Base(int s=0) : y(s){ cout<<"Base("<<y<<”)”<<endl; }
~Base() {cout<<"~Base()"<<endl;}
void print() {cout <<y<< ",";}
protected:
int y;
};
class Derived: public Base
{ public:
Derived (int a, int b): Base(a) { z=b;
cout<<"Derived("<< y <<","<<z <<”)”<<endl; }
~Derived( ) {cout<<"~Derived()"<<endl;}
void print() { Base:: print();
cout<< z <<endl; }
private:
int z;
};
int main( )
{ Derived d(10,20);
d.print();
return 0;
}
3.给出下面程序输出结果。
#include < iostream >
using namespace std;
int main()
{ int a[5][5];
int i,j;
for(i=0;i<5;i++)
{ a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<5;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<5;i++)
{ for(j=0;j<=i;j++)
cout<<a[i][j]<<'\t';
cout<<endl;
}
return 0;
}
4、给出下面程序输出结果。
#include<iostream>
using namespace std;
class A
{public:
virtual void print(){ cout<< "A 打印程序..."<< endl; } };
class B: public A
{ public:
void show(){ cout<< "B 打印程序..."<< endl; } };
class C: public B
{ public:
void print(){ cout<<"C 打印程序..."<<endl; } };
int main( )
{ A a, *p1, *p2, *p3;
B b; C c;
p1=&a; p2=&b; p3=&c;
p1-> print();
p2-> print();
p3-> print();
b. show();
return 0 ;
}
5、程序运行到断点所在行,写出程序的显示结果。
#include <iostream>
using namespace std;
class Cardgame
{ private:
int players;
static int total;
public:
Cardgame(int p);
~Cardgame(void);
};
Cardgame::Cardgame(int p)
{ players = p;
total += p;
cout<<" "<<p<<" 人加入游戏。现在共有 ";
cout<< total <<" 人参加。"<< endl;
}
Cardgame::~Cardgame(void)
{ total -= players;
cout <<" "<< players << " 人退出游戏。现在共有";
cout << total << " 人参加。" << endl;
}
int Cardgame::total = 0;
int main()
{ Cardgame *bridge = new Cardgame(4);
Cardgame *blackjack = new Cardgame(8);
delete blackjack;
Cardgame *poker = new Cardgame(5);
return 0; //断点所在行
}
五、程序设计
1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。
2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。
4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。
6、如下数组类模板:
template<typename T, int SIZE>
class array
{private:
T arr[SIZE];
int len;
public:
array( );
array( T b[] );
T& operator[]( int i ) { return arr[i];}
T get_elem( int i ) const { return arr[i]; }
void set_elem( int i,const T& value ) { arr[i]=value; }
};
请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。
7、设计一函数,能对有n个元素的整形数组a[]进行排序。
8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。
9、程序设计,键盘输入a,程序求数a的平方根,用迭代式



10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
private:
int element[3][3];
};
11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。
12.声明复数的类Complex,使用成员函数add()实现复数加法。
class Complex
{ private:
double real, image;
public :
Complex();
Complex(double a,double b);
void setRI(double a, double b) ;
double getReal() ;
double getImage();
void print();
Complex add(Complex);
};
13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
void display( );
private:
double real;
double imag;
};
14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。
牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。
二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。
请以类外定义方式:
①编写无参构造函数,功能:初始化各系数ai为1
②编写有参构造函数,功能:按参数初始化各系数ai
class Solve
{public:
Solve();
Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);
void half(float,float);
void display(float,int);
void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a0=aa0,a1=aa1,a2=aa2,a3=aa3;}
float getx(){ return x;}
private:
float x,a0,a1,a2,a3;
};
15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。
16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。
#include<iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetArea()=0;
} ;
17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。
#include <iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetPerim()=0;
} ;
18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:
(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;
(2) 按a/b的形式输出分数的值,a、b为整数。
最后在main函数中对上述功能进行测试。
*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。
*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,
Minmultiple=m×n/Maxdivisor
一、单项选择题
1A. 2B. 3 D. 4C. 5C. 6B. 7B. 8A. 9B. 10A. 11B. 12A. 13C. 14A. 15D. 16D. 17B.
18C. 19A. 20C. 21D. 22C.23B.24A. 25B. 26B. 27C. 28C. 29D. 30A.31A. 32C.
33D. 34B. 35C. 36A. 37D. 38B. 39D.
二、填空题
1. ( A<B||A<C ) 2、( 0 )。
3、 ( if(a>=’A’&&a<=’Z’) a+=32; ) 4、 ( int d=rand()%41-20; )
5. ( 地址传递(包括引用) )。 6、 ( inline int fun(float,char); )
7、( (至少有一个)不同 ) 8、( 类、结构、枚举、联合)。
9.( 抽象、封装、继承、多态 )。
10、((无参数函数体为空的)默认构造函数 )。
11. ( 构造函数 )。
12、( 构造函数 ); ( 析构函数 );
13 、( 不会再 )。
14、( 析构函数不能有参数 )
15.( 类外 ); ( 对象 ), ( 类 )。
16、( 构造函数的参数初始化表 )
17.( void get_time() const )
18、( 0 )。
19、( 被修改 ); ( 修改类数据成员 );
20、(访问控制方式或继承方式)。
21、( 多继承 ) ;( (多继承时)避免(重复继承)产生二义性 )。
22、( 纯虚函数都要定义 )。
三、程序分析题
1、给出下面程序输出结果,程序的功能是?
1答: max=268,min=-107 功能是求一维数组中最大、最小元素。
2、给出下面程序输出结果。
2答案:
Base(10)
Derived(10,20)
10, 20
~Derived()
~Base()
3.给出下面程序输出结果。
3答:输出杨辉三角。或画出图象。

4、给出下面程序输出结果。
4答案
A 打印程序...
A 打印程序...
C 打印程序...
B 打印程序...
5、程序运行到断点所在行,写出程序的显示结果。
5答案:
4人加入游戏。现在共有4人参加。
8人加入游戏。现在共有12人参加。
8人退出游戏。现在共有 4人参加。
5人加入游戏。现在共有9人参加。
五、程序设计
1.编程求矩阵a[10][10]两条对角线上的元素之和并输出结果。。
答案:
#include <iostream>
using namespace std;
int main()
{ int a[10][10];
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
a[i][j]=i+j;
int sum = 0;
for(i=0;i<10;i++)
{ sum+=a[i][i];
sum+=a[9-i][i];
}
cout<<sum;
return 0;
}
2、定义一能用于返回三个参数中的最大值的函数模板getmax(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
答案:
template<class T>
T getmax(T a,T b,T c)
{ T temp;
temp=a>b? a:b;
return (temp>c? temp:c);
}
3、定义能用于返回有n个元素数组中的最大值的函数模板getmax(Type x[],int n),模板中type可适用于整形数组、单精数组、双精数组和字符数组参数。
答案
template<class Type >
Type getmax(Type x[],int n)
{
Type max=x[0] ;
int i;
for(i=1;i<n;i++)
if (max<x[i]) max=x[i];
return max;
}
4、定义能用于返回三个参数的中间值的函数模板getmidd(),三个参数是同类型的,模板可适用于整形、单精、双精和字符参数。
答案:
template<class T>
T getmidd(T a,T b,T c)
{ if((a>b && b>c)||(a<b && b<c)) return b;
if((b >a &&a>c)||( b < a &&a<c)) return a;
if((a>c&& c > b)||(a<c&& c < b)) return c; }
5.利用函数模板设计,求一维数组a[]中元素和的函数,并检验之。
答案:
#include < iostream >
using namespace std;
template<class T>
T sum (T a[],int n)
{ int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
int main ()
{ int a[5]={1,2,3,4,5};
int s = sum(a,5);
cout<< s<< endl;
return 0;
}
6、如下数组类模板:
template<typename T, int SIZE>
class array
{private:
T arr[SIZE];
int len;
public:
array( );
array( T b[] );
T& operator[]( int i ) { return arr[i];}
T get_elem( int i ) const { return arr[i]; }
void set_elem( int i,const T& value ) { arr[i]=value; }
};
请在类模板外定义有参构造函数模板array( T b[] ),用SIZE初始化数组长度len,用数组b[]元素初始化成员arr[]的元素。
答案:
template<typename T,int SIZE>
array1<T,SIZE>::array(T b[]):len(SIZE)
{ for(i=0;i<len;i++) arr[i]=b[i];
}
7、设计一函数,能对有n个元素的整形数组a[]进行排序。
答案:
void sortn(int a[],int n)
{ int min,i,j,temp;
for (i=1;i<n;i++)
{ min=i;
for (j=i+1;j<=n;j++)
if(a[min]>a[j]) min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
8、设计程序,把输入的一个华氏温度变换成摄氏温度输出,程序能在提示下重复运行,输出的温度只保留二位小数(要求用流控制符)。
答案:
#include <iostream>
#include <iomanip>
using namespace std;
float ConvertT(float TempF){return ((TempF-32.0)*5/9);}
int main()
{ float tf,tc;
char y='y';
do { cout<<endl<<" 请输入华氏温度:";
cin>>tf;
cout<<endl;
tc= ConvertT(tf);
cout<<" 摄氏温度为:";
cout<< setioflags(ios::fixed)<<setprecision(2) <<tc<<endl<<endl;
cout<<" 继续变换华氏温度到摄氏温度吗(y/n)?";
cin>>y;
cout<<endl;
}while (y==’Y’||y==’y’);
return 0;
}
9、程序设计,键盘输入a,程序求数a的平方根,用迭代式



答案:
#include <iostream>
#include<cmath>
using namespace std;
int main ()
{ double x1,x2,p=0,a;
cout<<"请输入a的值:";
cin>>a;
if (a<0)
{ cout<<"a的值应当是正值,请重新输入a的值:";
cin>>a;
}
x1=a/2;
do
{ x2=(x1+a/x1)/2 ;
p=x1;
x1=x2;
x2=p;
} while( fabs(x2-x1) >1e-5 );
cout<<"a的平方根为:"<<x1<<endl;
return 0;
}
10、矩阵类Matrix 中定义了3×3整型数组int element[3][3]作为矩阵,重载运算符“<<”,用于输出Matrix类的对象。
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
private:
int element[3][3];
};
答案:
class Matrix
{ public:
Matrix ( );
Matrix (int m[3][3]);
friend ostream& operator<<( ostream&, Matrix &);
private:
int element[3][3];
};
ostream& operator<<( ostream &output, Matrix &m)
{
for(int i=0;i<3;i++)
{ for(int j=0;j<3;j++)
output<<m.element[i][j]<<’\t’;
output<<endl;
}
return output;
}
11.设计一个点类Point,再设计一个矩形类,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。
答案:
#include < iostream >
using namespace std;
class Point //点类
{private:
int x, y; //私有成员变量,坐标
public :
Point() { x = 0; y = 0; }
Point(int a, int b) { x = a; y = b; }
void setXY(int a, int b){ x = a; y = b; }
int getX(){ return x; }
int getY(){ return y; }
};
class Rectangle //矩形类
{private:
Point point1, point2, point3, point4;
public :
Rectangle();
Rectangle(Point one, Point two)
{ point1 = one;
point4 = two;
init();
}
Rectangle(int x1, int y1, int x2, int y2)
{ point1.setXY(x1, y1);
point4.setXY(x2, y2);
init();
}
void init() //给另外两个点做初始化的函数
{ point2.setXY(point4.getX(), point1.getY() );
point3.setXY(point1.getX(), point4.getY() );
}
void printPoint() //打印四个点的函数
{
cout<<"A:("<< point1.getX() <<","<< point1.getY() <<")"<< endl;
cout<<"B:("<< point2.getX() <<","<< point2.getY() <<")"<< endl;
cout<<"C:("<< point3.getX() <<","<< point3.getY() <<")"<< endl;
cout<<"D:("<< point4.getX() <<","<< point4.getY() <<")"<< endl;
}
int getArea()//计算面积的函数
{
int height, width, area;
height = point1.getY() - point3.getY();
width = point1.getX() - point2.getX();
area = height * width;
if(area >=0) return area;
else return -area;
}
};
int main()
{ Point p1(-15, 56), p2(89, -10); //定义两个点
Rectangle r1(p1, p2) ; //用两个点做参数,声明一个矩形对象r1
Rectangle r2(1, 5, 5, 1);//用两队左边,声明一个矩形对象r2
cout<<"矩形r1的4个定点坐标:"<< endl;
r1.printPoint();
cout<<"矩形r1的面积:"<< r1.getArea() << endl;
cout<<"\n矩形r2的4个定点坐标:"<< endl;
r2.printPoint();
cout<<"矩形r2的面积:"<< r2.getArea() << endl;
return 0;
}
12.声明复数的类Complex,使用成员函数add()实现复数加法。
class Complex
{ private:
double real, image;
public :
Complex();
Complex(double a,double b);
void setRI(double a, double b) ;
double getReal() ;
double getImage();
void print();
Complex add(Complex);
};
答案:
#include < iostream >
using namespace std;
class Complex
{ private:
double real, image;
public :
Complex(){real=0; image=0; }
Complex(double a,double b){ real = a; image = b; }
void setRI(double a, double b) { real = a; image = b; }
double getReal() { return real; }
double getImage(){ return image; }
void print(){
cout<<"复数:("<< real <<" , "<< image <<"i )"<< endl;
}
Complex add(Complex); //声明成员函数
};
Complex Complex::add( Complex c2) //定义成员函数
{ Complex c;
c.real = real + c2.real;
c.image = image + c2.image;
return c;
}
int main()
{ Complex c1(19, 0.864), c2, c3;
c2.setRI(90,-125.012);
c3 = c1.add( c2);
cout<<"复数一:";c1.print();
cout<<"复数二:";c2.print();
cout<<"相加后:";c3.print();
return 0;
}
13、复数类声明如下,请为复数类添加友元函数,将运算符“+”和“<<”重载为适用于复数对象加法和复数对象输出。
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
void display( );
private:
double real;
double imag;
};
答案:
class Complex
{ public:
Complex( ){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
friend Complex operator+( Complex &, Complex &);
friend ostream& operator<<( ostream &, Complex &);
void display( );
private:
double real;
double imag;
};
Complex operator+( Complex &c1, Complex &c2)
{
Complex temp;
temp.real=c1.real+c2.real;
temp.imag=c1.imag+c2.imag;
return temp;
}
ostream& operator<<( ostream &out, Complex &c)
{ out<<”(”<<c.real<<”,”<<c.imag<<”i )”; }
14、Solve类声明如下所示,功能是用于求方程a3x3+a2x2+a1x+a0=0的根,方程各系数ai可由构造函数或成员函数seta()设置,成员函数void half(float,float)使用二分法求方程在(x1,x2)之间根。成员函数void iteration(float)使用牛顿迭代法求方程在x0附近的根。
牛顿迭代法: 迭代式xn+1=xn-fn/fn’,其中fn=a3x3+a2x2+a1x+a0,f’是f在xn处的导数,迭代进行到|(xn+1-xn)}<10-5(或|f|<10-5)为止。
二分法:f(x)=a3x3+a2x2+a1x+a0,左界点x1,右界点x2,求f1(x1)和f2(x2),⑴若f1和f2同号(f1*f2>0),则无解;⑵否则,计算x1和x2的中点x0(=(x1+x2)/2),并求f0(x0);①若中点与左界点的f异号(f1*f0<0),则把中点当成右界点(x2=x0,f2=f0);②否则,把中点当成左界点(x1=x0,f1=f0);③判断当| f |<10-5为止,否则循环回⑵处继续计算。
请以类外定义方式:
①编写无参构造函数,功能:初始化各系数ai为1
②编写有参构造函数,功能:按参数初始化各系数ai
class Solve
{public:
Solve();
Solve(float aa3,float aa2=0,float aa1=0,float aa0=0);
void half(float,float);
void display(float,int);
void seta(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a0=aa0,a1=aa1,a2=aa2,a3=aa3;}
float getx(){ return x;}
private:
float x,a0,a1,a2,a3;
};
答案:
①Solve::Solve(){a0=1;a1=a0;a2=a0;a3=a0;}
②Solve::Solve(float aa3,float aa2=0,float aa1=0,float aa0=0)
{a3=aa3;a2=aa2;a1=aa1;a0=aa0;}
15.定义一个Dog类,它用静态数据成员Dogs记录Dog的个体数目,静态成员函数GetDogs用来存取Dogs。设计并测试这个类,说明静态数据成员属于类而不属于对象。
答案:
#include < iostream >
using namespace std;
class Dog
{private:
static int dogs; //静态数据成员,记录Dog的个体数目
public :
Dog(){}
void setDogs(int a) { dogs = a; }
static int getDogs(){ return dogs; }
};
int Dog::dogs = 25; //演示静态数据成员初始化值
int main()
{ cout<<"未定义Dog类对象之前:x = "<< Dog::getDogs() << endl;
//dogs静态数据成员在产生对象之前即存在,输出
Dog a, b;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
a.setDogs(360);
cout<<"给对象a中的x设置值后:"<< endl;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
return 0;
}
程序可以说明静态成员属于类:main中第一句未定义Dog类对象之前dogs就可以使用并输出说明其静态特性,用类名域Dog::getDogs()调用成员函数说明静态成员属于类;第五句虽通过对象a设置值为360,其后通过a和b对象输出的dogs值全是360,说明dogs并不是a的,而是a和b的公共的,即静态成员属于类。
16、已定义一个Shape抽象类, GetArea()是纯虚函数,(1)通过继承派生出矩形类 Rectangle,类 Rectangle含私有成员: float L,W;(矩形的长L和宽W);公有成员:①2参数构造函数,用于初始化L和W;②用GetArea()函数计算Rectangle对象的面积;③添加float GetPerim( )函数计算Rectangle对象的周长;请写出矩形类 Rectangle声明及成员定义。(2) 派生出圆柱Cyl类,圆柱类有新增私有成员半径和高(double r, h);公有成员有:①有参构造函数,做底圆半径r和高h的初始化,②定义 GetArea( )函数计算并返回圆柱表面积。请写出圆柱类Cyl声明及成员定义。
#include<iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetArea()=0;
} ;
(1)答案
class Rectangle: public Shape
{
public:
Rectangle(float a,float b):L(a),W(b){}
~Rectangle(){}
float GetArea(){return (L*W);}
float GetPerim(){return (L+W)*2;}
private:
float L,W;
};
(2)答案:
class Cyl: public Shape
{public:
Cyl(float r0,float h0):r(r0),h(h0){}
~Cyl(){}
float GetArea(){return (2*r*r*3.14f+2*3.14f*r*h);}
private:
float r,h;
};
17、用已声明的Shape抽象类,派生出圆形Circle类,圆形类有新增私有成员半径(double r);公有成员有:①有参构造函数做圆半径初始化,②定义 GetPerim( )函数计算并返回圆对象的周长,③新增成员函数GetArea( )计算并返回圆面积。再编写一测试主函数,定义半径为8.5的圆形Circle对象,分别输出显示对象的周长和面积。
#include <iostream>
using namespace std;
class Shape
{ public:
Shape(){}
virtual ~Shape(){}
virtual float GetPerim()=0;
} ;
答案:
class Circle:public Shape
{ public:
Circle(float r0):r(r0){}
float GetPerim(){return 3.14*2*r;}
float GetArea(){return 3.14*r*r;}
private:
float r;
};
int main()
{ Circle c1(8.5);;
cout<<c1.GetPerim ()<<endl;
cout<<c1.GetArea()<<endl;
return 0;
}
18.定义分数类Rational,private部分用整数表示分子和分母,分子和分母以化简形式表示,即2/6应该以1/3的形式表示,并实现如下功能:
(1) 两个分数对象可以用+和*做相加和相乘,结果表示为简化形式;
(2) 按a/b的形式输出分数的值,a、b为整数。
最后在main函数中对上述功能进行测试。
*工具1:m和n的最大公约数Maxdivisor(辗转算法):设m>n,⑴k=m%n,若k=0,则n为最大公约数;⑵否则,用n做被除数,k做除数,回⑴处循环继续。
*工具2:m和n的最小公倍数Minmultiple:Minmultiple×Maxdivisor=m×n,
Minmultiple=m×n/Maxdivisor
答:
(1)类的私有成员有:
①分子:int up;
②分母:int down;
③最小公倍数int Minmultiple(int a,int b);
④最大公约数int Maxdivisor(int a,int b);
(2)公有成员:
①构造函数(有参,无参):Rational( );
②转换构造函数:Rational(double a); 由实数转分数
③类型转换函数:operator double();由分数转实数
④分子与分母值更改函数:void setval();通过键盘输入方式完成
⑤分数显示函数:void Rational::showNomal() ;以分式方式显示分数
⑥重载运算符“+”、“*”和“<<”,实现2分数类对象的相加和相乘运算,结果以化简分式显示。
最后在main函数中对上述功能进行测试。
#include <iostream>
using namespace std;
class Rational
{ public:
Rational(int num1=1,int num2=1);
Rational(double a);
void setval();
void showNomal();
Rational operator*(Rational r1);
friend ostream& operator<<(ostream &out,const Rational &r);
friend Rational operator+(Rational r1,Rational r2);
operator double()
{ double a=double(up)/down;
return a;
}
private:
int up; //分子
int down; //分母
int Minmultiple(int a,int b); //最小公倍数
int Maxdivisor(int a,int b); //最大公约数
};
Rational::Rational(int num1,int num2)
{ up=num1;
down=(num2==0)?1:num2;
int i;
i=Maxdivisor(up,down);
up=up/i;
down=down/i;
}
Rational::Rational(double a){ //添加代码实现实数转分数...... }
void Rational::setval()
{ cout<<"输入分数的分子:";
cin>>up;
cout<<"输入分数的分母:";
cin>>down;
cout<<"输入的分数是:"<<up<<"/"<<down<<endl;
}
int Rational::Maxdivisor(int a,int b)
{ int temp;
int remainder;
if(a<b) { temp=a; a=b; b=temp; }
remainder=a%b;
while(remainder!=0)
{ a=b;
b=remainder;
remainder=a%b;
}
return b;
}
int Rational::Minmultiple(int x,int y)
{ return x*y/Maxdivisor(x,y);
}
Rational Rational::operator*(Rational r1)
{ int Ndown,Nup,i;
Ndown=down*r1.down;
Nup=up*r1.up;
i=Maxdivisor(Nup,Ndown);
return Rational(Nup/i,Ndown/i);
}
void Rational::showNomal()
{ cout<<up<<"/"<<down<<endl; }
ostream& operator<<(ostream &out,const Rational &r)
{ out<<r.up<<"/"<<r.down;
return out; }
Rational operator+(Rational r1,const Rational r2)
{
int Ndown,Nup,i;
Ndown=r1.down*r2.down;
Nup=r1.up*r2.down+r2.up*r1.down;
i=r1.Maxdivisor(Nup,Ndown);
Ndown/=i; Nup/=i;
Rational r(Nup,Ndown);
return r;
}
int main()
{ Rational r1(4,14), r2(5,8), r3, r4;
cout<<"The r1 is: ";
r1.showNomal();
cout<<"The r2 is: ";
r2.showNomal();
r3=r1*r2;
cout<<"The r1*r2 is: "<<r3<<endl;
r4=r1+r2;
cout<<"The r1+r2 is: "<<r4<<endl;
r1.setval();
r2.setval();
r4=r1+r2;
cout<<"The r1+r2 is: "<<r4<<endl;
double a;
cout<<"输入一个实数";
cin>>a;
r4=r1+Rational(a); //调用转换构造函数和+重载函数,显式类型转换
cout<<"The r1 is: "<<r1<<endl;
cout<<"The r1+"<<a<<" is: "<<r4;
a=r4; //隐含调用类型转换函数
cout<<" = "<<a<<endl;
return 0;
}