级C++阶段测验2print.docx
《级C++阶段测验2print.docx》由会员分享,可在线阅读,更多相关《级C++阶段测验2print.docx(18页珍藏版)》请在冰点文库上搜索。
级C++阶段测验2print
东南大学考试卷
课程名称
C++程序设计
考试学期
03-04-2
得分
适用专业
2、31系07级
考试形式
开、闭、半开
考试时间长度
120分钟
共
7页
说明:
(1)请在答题纸上答题,答题结束后,保留试卷,仅交答题纸。
一.选择题(以下各题均只有一个正确答案,每题1分,共20分)
1、设有说明intb[4][4],以下不能等价表示元素b[3][3]的是:
(6)
A.*&b[3][3]B.(*(*(b+3))+3)C.*(b[3]+3)D.*(*(b+3)+3)
2、以下语句中不正确的是(12)。
A)int*p=0B)floatp=(float)50;
C)int*p=new50D)float*p=newfloat[50];
3、设s和t分别为指向两个长度相同的字符数组指针,则循环语句while((13))可以正确实现字符串t到s的完整复制功能。
A)*s=*t&&t!
=0B)s++=t++&&*t!
=0
C)*(++s)=*(++t)D)*s++=*t++
4、设有以下定义:
classBall:
publicCircle{
doubler;
public:
…….
}
则正确的描述为(14)。
A)Circle是Ball的派生类
B)r是Circle的数据成员
C)Ball是Circle的派生类
D)r是Ball和Circle共同的数据成员
5、当数组名为函数的实参时,它传递给函数的是(15)。
A)数组的首地址B)数组名
C)数组第一个元数值D)数组全部元数
6、C++中多态性包括两种:
编译时和运行时的。
运行时多态性是通过(16)实现的。
①函数重载②运算符重载③类继承关系④动态链接⑤虚函数
A)①和②B)③和⑤C)④和⑤D)③和④
7、下列有关运算符重载的叙述正确的是(17)。
A.非静态成员函数重载运算符时带this指针
B.友元函数重载运算符时带this指针
C.成员函数与友元函数重载运算符时都不带this指针
D.用成员函数与友元函数重载同一运算符时,两者的参数类型与参数个数相同
8、设有以下说明语句:
chars1[20]=”hello”,s2[20]=”China”,constchar*ptr=s1;
以下语句中不符合C++语法规则的语句是(18)
A.strcpy(s2,ptr)B.ptr=s2C.ptr=ptr+4D.*ptr=*s2
9、以下test类中定义了四个函数,分A、B、C、D四行书写。
没有错误的函数定义是(3)行
A)A行B)B行C)C行D)D行
classtest{
private:
inta;
public:
intb;
friendints1(intx,test&y){x=a;returny;}//A
test(intx=0,inty=0){a=x;b=y;}//B
staticvoidShow(intx,test&z){b=a=x;cout<~test(intx=0,inty=b){a=b=x=y;cout<
};
10、设有数组说明inta[10],数组中各元素已含有如下数据:
数组元素:
a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
元素的值:
941282107513
以下(11)不能正确访问该数组的数组元素。
A)a[a[0]]B)a[a[2]]C)a[a[1]+a[9]]D)a[a[8]+a[2]]
11、若有以下语句,则下面(15)是正确的描述
staticcharx[]=”12345”;
staticchary[]={‘1’,’2’,’3’,’4’,’5’};
A)x数组和y数组的长度相同B)x数组长度大于y数组长度
C)x数组长度小于y数组长度D)x数组等价于y数组
12、设有宏定义如下:
#defineMIN(x,y)(x)>(y)?
(x):
(y)
#defineT(x,y,r)x*r*y/4
则执行以下语句后,s1、s2的值分别为(23)。
inta=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);s2=T(a++,a*++b,a+b+c);
A)327B)273
C)241D)324
13、若定义类A:
classA{
public:
A(intx=0);
…
};
执行语句“Aa(4),b[3],*p[2];”,则自动调用该类的构造函数的次数为(20)。
A.6B.4C.3D.1
14、有关虚函数的说法正确的是:
(5)
A)虚函数是虚设的函数,它没有函数体;B)虚函数必须是一个类的成员函数
C)含有虚函数的类称为抽象类D)析构函数和构造函数都可以是虚函数
15、设有说明:
chars1[10]*s2=s1,则以下正确的语句是:
(2)
A.s1[]=”computer”B.s1[10]=”computer”
C.s2=”computer”D.*s2=”computer”
16、1.若有说明语句char*name="newspaper";则获取串中的字符's'的正确方法是
。
A、name[0]+3B、*name+3
C、*(name+3)D、name[4]
17、如果在main函数中定义了数组inta[15],在赋值后调用一个排序函数为a数组排序,那么下面给出的排序函数参数定义可正确地将数组a及其大小传递过来?
A、sort(intx[],intn)B、sort(intx[15])
C、sort(int&x,intn)D、sort(int&x[15])
18、若定义函数longintfunc(ints){……},该循环体中有一条语句
returns*func(s-1);则此函数是一个。
A、递推函数B、递归函数
C、迭代函数D、嵌套函数
19、关于类的下列说法中,是正确的。
A、系统在程序运行时为定义的类分配存储空间
B、只有在定义了类的对象后,系统才为类分配存储空间
C、在程序执行时,系统为类的对象分配存储空间
D、一个类的所有对象(实例)共享同一块内存区域
二.阅读程序,回答问题(共32分)
1.(本题3分)
#include
classA
{intx,y;
public:
A(inta,intb){x=a;y=b;cout<<"ABC"<<'\t';}
A(){x=3;y=4;cout<<"CBA"<<'\n';}
voidShow()
{cout<<"x="<~A(){cout<<"XYZ"<<'\n';}
};
voidmain(void)
{As(1,2);s=A(2,3);s.Show();}
问题一:
本程序输出的第一行是
(1)1.ABCABC XYZ
问题二:
本程序输出的第二行是
(2)2.x=2y=3XYZ
2.(本题4分)
#include
classA{
public:
A(inta){x=a;cout<<"x="<~A(){cout<<"-A-"<<'\n';}
private:
intx;
};
classB{
Ay;ints;
public:
B(inta,intb,intc):
y(a+b+c)
{s=c-b;cout<<"s="<
~B(){cout<<"-B-"<<'\n';}
};
voidmain(void)
{Bs(1,2,3);}
问题一:
本程序共输出(3)行 3.4行
x=6*A*
s=1*B*
-B-
-A-
问题一:
各行的输出结果依次是(4)
3.(本题3分)
#include
classnode{
intx,y;
5.(node&a)
6.node_1
node_2
x=5y=6
public:
node(inta,intb)
{x=a;y=b;cout<<"node_1"<<'\n';}
node()
{x=a.x;y=a.y;cout<<"node_2"<<'\n';}
voidShow()
{cout<<"x="<};
voidmain(void){
nodef1(5,6);nodef2(f1);f2.Show();
}
问题一:
类中定义了两个构造函数,其中一个是缺省参数的构造函数。
但主函数中的对象要求有对应的形参,这个形参的正确定义是(5)
问题二:
当对应的形参被正确定义后,执行结果依次是(6)
4.程序输出的第一行是7,第三行是8。
#include
7.china
8.caaca
#include
voidfun(char*s,intm){
chartemp,*p1,*p2;
p1=s;p2=s+m-1;
cout<<"s="<
cout<<"length="<while(p1temp=*p1++;
*p1=*p2--;
*p2=temp;
}
voidmain(){
chars[]=”china”;
fun(s,5);
cout<
9.4行
10.2次
11.
x=1*A1*
*A2*
x=2-A-
x=1-A-
}
5.(6分)
#include
classA
{intx;
public:
A(inta)
{x=a;cout<<"x="<A(A&s)
{x=s.x+1;cout<<"*A2*"<<'\n';}
~A(){cout<<"x="<};
voidmain(void)
{Af1
(1),f2(f1);}
问题一:
本程序共输出(9)行,类中的析构函数被访问(10)次
问题二:
各行的输出结果依次是(11)
6.(10分)
#include
enumec{a,b,c,d,e};
charcp[]={'a','b','c','d','e'};
classRect{
private:
intwidth,hight,color;
public:
Rect(intx=10,inty=10,intc=a):
width(x),hight(y),color(c){};
voidSetRec(intw,inth,intc){width=w;hight=h;color=c;}
intArea(){returnwidth*hight;}
Rectoperator+(Rectb);
voidDisplay();
};
RectRect:
:
operator+(Rectb){
Rects;
s.width=width+b.width;
s.hight=hight+b.hight;
s.color=(color+b.color)%5;
returns;
}
voidRect:
:
Display(){
cout<<"w="<}
12.6行
13.w=20h=40c=b
w=30h=50c=d
w=50h=70c=e
w=70h=110c=a
A:
7700
B:
3500
voidmain(){
RectA(20,40,b),B(30,50,d);
A.Display();
B.Display();
B.SetRec(50,70,e);
B.Display();
A=A+B;
A.Display();
cout<<"A:
"<cout<<"B:
"<}
问题一:
本程序共输出(12)行
问题二:
各行的输出结果依次是(13)
7.(5分)
#include
longintf(intn)
{
if(n>1)returnn-f(n-1);
elsereturn
(1);
}
voidmain()
{cout<问题一:
执行以上递归函数时,执行过程包括递推和回归两个过程,其中递推过程可分为以下4个步骤:
递推:
①5-f(4)②4-f(3)③3-f
(2)④2-f
(1)
当执行回归过程时,有两个步骤产生的结果相同。
根据回归顺序,这两个步骤依次是第(14)步和第(15)步14.
15.
问题二:
当递归函数执行完毕后,将结果返回给主函数调用语句的是以上步骤中的第(16)步,它执行的return语句是:
return(17)
问题三:
程序的输出结果是(18)16.
17.5-f(4)18.3
三、完善程序,并回答问题:
(每空1分,共28分)
1.确定一个数(例如i)是否为素数的算法是,只要2~
之间的所有自然数都不能整除i(其中
取整数),则i必为素数。
显然,只要i能被其中任一个数整除,i必然不是素数。
以下程序用于求300以内的素数,并按每行5个素数的格式输出。
(9分)
#include
#include//A
prime(int_
(1)_,int_
(2)_){//1.a2.b
intn;
for(n=2;n<=a;n++)if(b%n==0)_(3)_;3.break
return(n);
}
voidmain(){
intk,i,j;
cout<<2<<'\t'<<3;
for(k=2,i=5;i<300;i+=2){
j=sqrt(i);
if(prime(j,i)>=_(4)_){//4.j
cout<<'\t'<
_(5)_;//5.k++
if(k%5==0)cout<<'\n';
}
}
cout<<'\n';
}
问题一:
算法中是把(6)作为待求素数
A)300以内的所有自然数B)300以内的所有奇数
C)2~300之间的所有自然数D)5~300之间的所有奇数
问题二:
算法中有一个变量用作求素数的除数,这个变量是(7),其中作为最大除数的变量是(8)7.n8.a
问题三:
与A行预处理指令有关的语句是(9)//9.j=sqrt(i)
2.ball是关于球的类定义,其数据成员包括半径和重量。
通过运算符重载实现对象的初始化(赋值)、两个对象相加和判断两个对象是否相等的运算。
#include
classball{
private:
floatradii;
floatweight;
public:
ball(floatx=0,floaty=0){_(10)_}//10.radii=x;weight=y;
floatgetr(){returnradii;}
floatgetw(){returnweight;}
intoperator==(ball);
voidoperator()(float,float);
voidoperator+=(ballB);
};
intball:
:
operator==(ballB){
if(_(11)_)//11.radii==B.radii&&weight==B.weight
return1;
else
return0;
}
voidball:
:
operator()(floata,floatb){
_(12)_=a;//12.radii
_(13)_=b;//13.weight
}
voidball:
:
operator+=(ballB){
radii+=_(14)_;14.B.radii
weight+=_(15)_;15.B.weight
}
voidmain(){
balla,b(30,500),c(40,600);
a(b.getr()+10,b.getw()+100);
cout<<"a.radii="<b+=c;
cout<<"b.radii="<if(a==c)cout<<"a球和c球相等!
"<elsecout<<"a球和c球不相等!
"<}
3.使用结构体和指针建立链式成绩表,表中每个结点中包含的信息有学号,姓名,数学成绩和链指针。
输入数据时指定学生人数,调用函数Addnew()输入每个学生的信息,新结点插在链首。
从键盘输入一个学号key,调用函数Search()在已建立的结构链表中查找该学号所在的结点,若找到则输出姓名和成绩以及该结点在链表中的序号;若找不到则返回-1,输出提示信息。
#include
structpupil{
intsnum;
charname[8];
floatmath;
pupil*next;
};
voidAddnew(pupil*&head,intk){
pupil*p=16;//16.newpupil
cout<<"输入第"<"<cin>>p->snum>>p->name>>p->math;
if(head==0){p->next=0;head=p;}
else{
p->next=17;17.head
head=18;18.p
}
}
intSearch(constpupil*head,constpupil*&t,intk){
constpupil*p;
inti=0;
p=head;
while(p!
=0){
i++;
if(19){t=p;returni;}//19.p.snum==k
elsep=20;//20.p->next
}
return-1;
}
voidmain()
{
pupil*s=0,*first=0;
inti,total,key;
cout<<"请输入学生人数:
";
cin>>total;
for(i=0;iAddnew(first,i+1);
}
cout<<"请输入要查找的学号:
";
cin>>key;
i=Search(21);//21.first,s,key
if(i>=0&&s!
=0){
cout<<"学号为"<";
cout<name<math;
cout<<"位于链表中第"<
}
elsecout<";
return;
}
4.本程序调用构造函数实现字符串对象的初始化。
调用重载运算符”+”把两个字符串拼接,并通过重载运算符“>”来实现字符串的比较运算。
#include
#include
classstring
{char*str;
public:
string(char*s=0)
{
if(_(22)_){str=newchar[strlen(s)+1];strcpy(__(23)__);}
elsestr=0;
}
friendstringoperator+(string&,string&);
intoperator>(string&);
voidshow(){if(str)cout<};
stringoperator+(string&s1,string&s2)
22.s!
=0
23.str,s
24.newchar[strlen(s1.str)+strlen(s2.str)+1];
strcpy(t.str,s1.str)
25.returnt
26.str,s.str
{
stringt;
t.str=____(24)_____;
strcat(t.str,s2.str);
______(25)_______;
}
intstring:
:
operator>(string&s)
{
if(strcmp(____(26)_____)>0)return1;
elsereturn0;
}
voidmain(void)
{
strings1("southeastuniversity"),s2("mechanicaldepartment");
strings3;s3=s1+s2;
s1.show();s2.show();s3.show();
cout<<(s1>s2)<<'\n';
}
sort(x,num);
Output(x,num);
}