资源描述
上海电机学院2023年专升本《C++程序设计》考试试卷 A卷
一、选择题(每题1分,共25分)
1. 编写C++程序一般需通过的几个环节依次是( )。
A. 编译、编辑、连接、调试 B. 编辑、编译、连接、调试
C. 编译、调试、编辑、连接 D. 编辑、调试、编辑、连接
2. 可用作C++语言用户标记符的一组标记符是( )。
A. void define +WORD B. a3_b3 _123 YN
C. for -abc Case D. 2a do sizeof
3. 设”int a=12;”,则执行完语句”a+=a*a;”后,a的值是( )。
A. 12 B. 144 C. 156 D. 288
4. x>0 || y==5的相反表达式为( )。
A. x<=0 && y!=5 B. x<=0 || y!=5
C. x>0 || y!=5 D. x>0 && y==5
5. 在下面循环语句中循环体执行的次数为( )。
for(int i=0; i<n; i++)
if(i>n/2) break;
A. n/2 B. n/2+1 C. n/2-1 D. n-1
6. switch语句可以改写为( )语句。
A. for B. if C. do D. while
7. 假定一个二维数组的定义语句为“int a[3][4]={{3,4},{2,8,6}};”,则元素a[2][1]的值为( )。
A. 0 B. 4 C. 8 D. 6
8. 函数重载是指( )。
A. 两个或两个以上的函数取相同的函数名,但形参的个数或类型不同
B. 两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同
C. 两个以上的函数名字不同,但形参的个数或类型相同
D. 两个以上的函数取相同的函数名,并且函数的返回类型相同
9. 若用数组名作为函数调用的实参,传递给形参的是( )。
A. 数组的首地址 B. 数组中第一个元素的值
C. 数组所有元素的值 D. 数组元素的个数
10. 将两个字符串连接起来组成一个字符串时,选用( )函数。
A. strlen() B. strcap() C. strcat() D. strcmp()
11. C++语言的编译系统对宏命令的解决是( )。
A. 在程序运营时进行
B. 在程序连接时进行
C. 和C++程序的其它语句同时进行编译
D. 在对源程序中其它成分正式编译之前进行
12. 在下面存储类中,( )的对象不是局部变量。
A. 函数形参 B. 自动类 C. 外部静态类 D. 寄存器类
13. 定义p并使p指向动态空间中的包含30个整数的数组所使用的定义语句为( )。
A. int *p=new int[30]; B. int *p=new int(30);
C. int *p=new [30]; D. *p=new int[30];
14. 关于封装,下列说法中不对的的是( )。
A. 通过封装,对象的所有属性和操作结合在一起,形成一个整体
B. 通过封装,一个对象的实现细节被尽也许地隐藏起来(不可见)
C. 通过封装,每个对象都成为相对独立的实体
D. 通过封装,对象的属性都是不可见的
15. 假定AA为一个类,a为该类公有的数据成员,x为该类的一个对象,则访问x对象中数据成员a的格式为( )。
A. x(a) B. x[a] C. x->a D. x.a
16. 假定AA是一个类,abc是该类的一个成员函数,则参数表中隐含的第一个参数为( )。
A. abc B. *this C. this D. this&
17. 结构中定义的成员默认为( )访问属性。
A. public B. private C. protected D. friend
18. 假定AB为一个类,则执行 “AB r1=r2;”语句时将自动调用该类的( )。
A. 无参构造函数 B. 带参构造函数
C. 赋值重载函数 D. 复制构造函数
19. 一个类的静态数据成员所表达属性 ( )。
A. 是类的或对象的属性 B. 只是对象的属性
C. 只是类的属性 D. 类和友元的属性
20. 当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()可以直接访问类B的( )。
A. 只能是公有成员 B. 只能是保护成员
C. 只能是除私有成员之外的任何成员 D. 具有任何权限的成员
21. 假如表达式a+b中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表达为( )。
A. a.operator+(b) B. b.operator+(a)
C. operator+(a,b) D. operator(a+b)
22. 从一个基类派生出的各个类的对象之间( )。
A. 共享所有数据成员,每个对象还包含基类的所有属性
B. 共享部分数据成员,每个对象还包含基类的所有属性
C. 不共享任何数据成员,但每个对象还包含基类的所有属性
D. 共享部分数据成员和函数成员
23. 对于公有继承,基类的公有和保护成员在派生类中将( )成员。
A. 所有变成公有 B. 所有变成保护
C. 所有变成私有 D. 仍然相应保持为公有和保护
24. C++中的虚基类机制可以保证:( )。
A. 限定基类只通过一条途径派生出派生类
B. 当一个类多次间接从基类派生以后,其基类只被一次继承
C. 当一个类多次间接从基类派生以后,派生类对象能保存多份间接基类的成员
D. 允许基类通过多条途径派生出派生类,派生类也就能多次继承该基类
25. 派生类的对象对其基类中( )可直接访问。
A. 公有继承的私有成员 B. 公有继承的公有成员
C. 公有继承的保护成员 D. 私有继承的公有成员
二、填空题(25%)
1. 用于从键盘上为变量输入值的标准输入流对象是________。
2.程序文献的编译错误分为________和________两类。
3. 十进制常数245相应的八进制的C++表达为_0_________。
4. 字符串”This\’s a book.\n”的长度为__________。
5. 数学算式的C++表达式为________________。
6. 若while循环的“头”为“while(i++<=10)”,并且i的初值为0,同时在循环体中不会修改i的值,则循环体将被反复执行______次后正常结束。
7. strlen(”apple”)的值为_______,strcmp(”a”,”A”)的值为________。
8. 在C++语言中,一个函数由函数头和__________组成。
9. 全局变量和静态局部变量具有静态生存期,存放在内存的____________区中。
10. 假定p所指对象的值为25,p+1所指对象的值为42,则*p++的值为________。
11. 执行int *p=new int操作得到的一个动态分派的整型对象为__*p______。
12. 以面向对象方法构造的系统,其基本单位是__________。
13. C++支持两种多态性:_________时的多态性和__________时的多态性。
14. 为了使类中的成员不能被类外的函数通过成员操作符访问,则应把该成员的访问权限定义为________。
15. 若采用x.abc(y)表达式调用一个成员函数,在成员函数中使用的__*this______就代表了类外的x对象。
16.假定AB为一个类,则类定义体中的“AB(AB& x);”语句为该类______________的原型语句。
17. 在重载一个单目运算符时,参数表中没有参数,说明该运算符函数只能是类的_____________。
18. 派生类的成员函数可以直接访问基类的 成员,不能直接访问基类的 ______成员。
19. 引进虚基类的主线目的是为了消除____________。
20. 设有如下定义:
#include<iostream.h>
class A1
{ int a1;
protected:
int b1;
public:
void show1() { cout<<”class A1”<<endl; }
};
class A2: public A1
{ int a2;
protected:
int b2;
public:
void show2() { cout<<”class A2”<<endl; }
};
void main()
{ A1 obj1;
A2 obj2;
…
}
派生类A2的成员函数show2()中可以访问的成员涉及a1、b2、 、 。
1. 阅读下面的程序,写出输出结果
#include<iostream.h>
int a[8]={6,11,13,4,12,7,16,15};
void main()
{ int s0,s1,s2;
s0=s1=s2=0;
for(int i=0; i<8; i++) {
switch(a[i]%3) {
case 0: s0+=a[i];break;
case 1: s1+=a[i];break;
case 2: s2+=a[i];break;
}
}
cout<<s0<<'\t'<<s1<<'\t'<<s2<<endl;
}
2. 阅读下面的程序,写出输出结果
#include<iomanip.h>
void fun(int *&a, int &m)
{ a=new int[m];
int * p=a;
for(int i=0;i<m;i++)
*p++=i*i+1;
}
void main()
{ int *b,n=5;
fun(b,n);
for(int i=0;i<n;i++)
cout<<b[i]<<’ ‘;
cout<<endl;
delete[]b;
}
3. 阅读下面的程序,写出输出结果
#include <iostream.h>
int fun(int n )
{ int a=1;
static int b=1;
a=a+1;
b=b*n;
return a*b;
}
void main( )
{ int i;
for(i=1;i<5;i++)
cout<<fun(i)<<endl;
}
4. 阅读下面的程序,写出输出结果
#include<iostream.h>
class AA
{ int n;
public:
AA(int i) { n=i; cout<<"调用类AA构造函数 n: "<<n<<endl;}
~AA() { cout<<"删除类 AA "<<endl;}
};
class BB
{ int n;
public:
BB(int j) {n=j; cout<<"调用类BB构造函数 n: "<<j<<endl;}
~BB() { cout<<"删除类 BB "<<endl;}
};
class CC:public BB,public AA
{
public:
CC(int a,int b,int c):AA(a),BB(b),n(c)
{ cout<<"调用类CC构造函数 n: "<<n<<endl; }
~CC() { cout<<"删除类 CC "<<endl;}
private: //派生类的私有对象成员
int n;
};
void main( )
{ CC obj(10,20,30); }
四.改正错误(每题有几处错误,在错误处画线,并写出对的语句。)(每题 3分,共9分)
1. 下列程序是输出设1-100之间素数,并且每行只输出5个数。
#include<iostream.h>
#include<math.h>
void main()
{int i,j,t,k=0;
int a[101];
for(i=1;i<=100;i++)
a[i]=1;
a[1]=0;i=2;
while(i<=100)
{ for(j=i*i;j<= 100;j=j+i)
a[j]=0;
i++;
}
cout<<"\n";
for(i=2;i<=100;i++)
if(a[i]==1)
{cout<<i<<'\t';
k++;
if(k%5==0) cout<<endl;
}
cout<<endl;
}
2.定义计数器类Counter。规定具有以下成员:计数器值;可进行增值和减值记数;可提供记数值。
#include<iostream.h>
class Counter
{ int n;
public:
Counter(int i=0)
{n=i;}
void init_Counter(int m) {n=m;}
void in_Counter() {n++;}
void de_Counter() {n--;}
int get_Counter() {return n;}
friend void show(Counter t) {cout<<t.n<<endl;}
};
void main()
{ Counter a(0);
a.in_Counter();
a.init_Counter(10);
a.show();//show(a)
a.de_Counter();
cout<<a.get_Counter()<<endl;
}
3. 用函数重载运算符,使对整形的运算符+、- 合用于整数运算。
#include<iostream.h>
class Franction {
int nume; //定义分子
int deno; //定义分母
public:
Franction(int a=1,int b=1)
{ nume=a;deno=b;}
friend Franction operator +(const Franction &x1,const Franction &x2)
{ int c,d;
c=x1.nume*x2.deno+x2.nume*x1.deno;
d=x1.deno*x2.deno;
return Franction(c,d);
}
friend Franction operator -(const Franction &x1,const Franction &x2)
{ int c,d;
c=x1.nume*x2.deno-x2.nume*x1.deno;
d=x1.deno*x2.deno;
return Franction(c,d);
}
void FranOutput()
{ cout<<nume<<'/'<<deno<<endl;}
};
void main()
{
Franction c1(1,3),c2(1,4),c3,c4;
cout<<"c1=";c1.FranOutput();
cout<<"c2=";c2.FranOutput();
c3=c1+c2;
cout<<"c1+c2=";c3.FranOutput();
c4=c1-c2;
cout<<"c1-c2=";c4.FranOutput();
}
五.程序填空(每空1.5分,共12分)
1.求组合数值,如。 n!/(n-m)!*m!
#include<iostream.h>
int fun(int n) ;
void main()
{ int c,n,m;
cin>>n>>m;
if(m>n) cout<<"输入数据错误。\n";
else { c= fun(n)/(fun(n-m)*fun(m) ) ;
cout<<"c("<<m<<","<<n<<")="<<c<<endl; }
}
int fun(int n)
{int p=1 ;
int i;
for(i=2;i<=n;i++)
p*=i;
return p ;
}
2.从建立的数据文献f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。
#include <fstream>
#include<iostream>
using namespace std;
int main( )
{ int a[10],max,i,order;
fstream infile("f1.dat", ios::in );
if( !infile )
{cerr<<"open error!"<<endl; exit(1); }
for(i=0;i<10;i++)
{ infile>>a[i] ;
cout<<a[i]<<" ";
}
cout<<endl;
max=a[0];
order=0;
for(i=1;i<10;i++)
if(a[i]>max)
{max=a[i]; order=i; }
cout<<"max="<<max<<endl<<"order="<<order<<endl;
infile.close() ;
return 0;
}
六、编程题(17%)
1. 在二维数组a(3行4列)中选出各行最大的元素组成一个一维数组b。(7%)
若数组a中的数据为(3 16 87 65 4 32 11 108 10 125 12 27),则数组b中的数据为(87 108 27)。
2. 已知类定义如下,其中Shape为基类,园Circle和矩形Rectangle分别Shape的直接派生类,正文形Square为Rectangle的直接派生类和Shape的间接派生类。并计算园半径为10,矩形花边宽为10,20及正方形连长为10时它们的周长和面积。用抽象类指针输出所有值。 (10%)
#include<iostream.h>
const float PI=3.14159f;
class Shape //几何图形抽象类
{ public:
virtual float GetPerimeter()=0; //纯虚函数,计算周长
virtual float GetArea()=0; //纯虚函数,计算面积
};
展开阅读全文