资源描述
面向对象程序设计课程期末针对性训练
训练第一套
一、单项选择题(每小题2分,共20分)
1.设x和y均为bool量,则x || y为假的条件是( )。
A. 它们均为真 B. 其中一个为真
C. 它们均为假 D. 其中一个为假
2. 假定一个二维数组的定义语句为“int a[3][4]={{3,4},{2,8,6}};”,则元素a[1][2]的值为( )。
A. 2 B. 4 C. 6 D. 8
3. 假定p是具有int**类型的指针变量,则给p赋值的对的语句为( )。
A. p=new int; B. p=new int*; C. p=new int**; D. p=new int[10];
4. 软件产品在需求发生变化、运营环境发生变化或发现软件产品自身的错误或局限性时进行相应的软件更新的难易限度叫做软件的( )。
A. 可维护性 B. 可复用性 C. 兼容性 D. 对的性
5. 若需要把一个类外定义的成员函数指明为内联函数,则必须把关键字( )放在函数原型或函数头的前面。
A. in B. inline C. inLine D. InLiner
6. 在一个用数组实现的队列类中,假定数组长度为MS,队首元素位置为first,队列长度为length,则队尾的后一个位置为( )。
A. length+1 B. first+length
C. (first+length-1)%MS D. (first+length)%MS
7. 假定一个类的构造函数为 “A(int aa, int bb) {a=aa; b=aa*bb;}”,则执行 “A x(4,5);”语句后,x.a和x.b的值分别为( )。
A. 4和5 B. 5和4 C. 4和20 D. 20和5
8. 假定AB为一个类,则执行“AB *p=new AB(1,2);”语句时共调用该类构造函数的次数为( )。
A. 0 B. 1 C. 2 D. 3
9. 一个类的成员函数也可以成为另一个类的友元函数,这时的友元声明( )类域的限定。
A. 需加上 B. 不需加上 C. 可加可不加 D. 取消
10. 队列具有( )的操作特性。
A. 先进先出 B. 先进后出 C. 进出无序 D. 仅进不出
二、填空题(每小题2分,共20分)
1. 多行注释的开始标记符为__________。
2. 假定x=5,y=6,则表达式x++*++y的值为__________。
3. 假定x是一个逻辑量,则x && true的值与x的值__________。
4. 含随机函数的表达式rand()%20的值在0至______的整数区间内。
5. 程序的编译是以__________为单位进行的。
6. 一个数组的________事实上是指向该数组的第一个元素的指针,并且在任何时候都不允许修改它。
7. 指针变量pv和pc定义为“void *pv =”Hello, word!”; char *pc;”,要将pv值赋给pc,则对的的赋值语句是pc=(___________)pv。
8.一个类的__________函数通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。
9. 假定用户为类AB定义了一个构造函数“AB(int aa):a(aa){}”,则__________是该类的数据成员。
10. 在多文献结构的程序中,通常把具有main()函数的文献称为该程序的________。
三、程序填充题,根据题旨在横线上填写合适的内容。(每小题6分,共24分)
1. 采用辗转相除法求出两个整数的最大公约数。
#include<iostream.h>
void main()
{
int a,b;
cout<<"请输入两个正整数:";
cin>>a>>b;
while(a<=0 || b<=0) {cout<<"重新输入:"; cin>>a>>b;}
while(b) {
int r;
r=a%b;
______________; ______________; //分别修改a和b的值
}
cout<<a<<endl; //输出最大公约数
}
2. 用插入排序方法对table指针数组中size个指针所指向的字符串进行按升序排序的算法。
void sort(char *table[], int size){
for(int i=1; i<size; i++){
char *p=table[i];
for(int j=i-1; j>=0 ; j--)
if(strcmp(p,table[j])<0) table[j+1]=___________;
else break;
table[j+1]=__________;
}
}
3.类A的定义
class A {
char *a;
public:
A() {a=NULL;} //定义无参构造函数,使a为空指针
A(char *aa) {
a=__________ char[strlen(aa)+1];
strcpy(a,aa); //用aa所指字符串初始化a所指向的动态存储空间
}
__________________ //定义析构函数,删除a所指向的动态存储空间
};
4. 类Goods的定义
class
{
private:
char Name[20]; //商品名称
int Weight; //商品重量
static int totalWeight; //同类商品总重量
public:
Goods (char*str,int w){ //构造函数
strcpy(Name,str);
Weight=w;
totalWeight+=Weight;
}
~Goods (){totalWeight-=Weight;}
char* GetN(){__________________;} //返回商品名称
int GetW(){return weight;}
static int GetTotalWeight() { //定义静态成员函数返回总重量
____________________;
}
}
四、理解问答题,分别写出前2小题的程序运营结果和指出后2小题的程序或函数功能。(每小题6分,共24分)
1. #include<iostream.h>
const int T=6;
void main()
{
int i,j,k=0;
for(i=1;i<=T;i+=2){
for(j=2;j<=T;j+=2) k++;
}
cout<<”k=”<<k<<endl;
}
运营结果:
2. #include<iostream.h>
class CE {
private:
int a,b;
int getmax() {return (a>b? a:b);}
public:
int c;
void SetValue(int x1,int x2, int x3) {
a=x1; b=x2; c=x3;
}
int GetMax();
};
int CE::GetMax() {
int d=getmax();
return (d>c? d:c);
}
void main()
{
int x=5,y=12,z=8;
CE ex;
ex.SetValue(x,y,z);
cout<<ex.GetMax()<<endl;
}
运营结果:
3. #include<iostream.h>
void main()
{
int i,p=1;
int N;
cout<<"输入一个正整数:";
cin>>N;
for(i=1;i<=N;i++) p*=i;
cout<<”N!=”<<p<<endl;
}
程序功能:
4. int f(char *s)
{
int i=0;
while(*s++)i++;
return i;
};
函数功能:
五、编程题(每小题6分,共12分)
1. 编写一个函数,分别求出由指针a所指向的字符串中包含的每种十进制数字出现的次数,把记录结果保存在数组b的相应元素中,该函数的原型声明如下:
void fun(char* a, int b[]);
2. 根据下面类中CompareBig 函数成员的原型和注释写出它的类外定义。
class AA {
int* a;
int n;
int MS;
public:
void InitAA(int aa[], int nn, int ms) {
if(nn>ms) {cout<<"Error!"<<endl; exit(1);}
MS=ms;
n=nn;
a=new int[MS];
for(int i=0; i<n; i++) a[i]=aa[i];
}
int CompareBig(AA& b); //比较*this与b的大小,从前向后按两数组
//中的相应元素比较,若*this中元素值大则返回1,若b中
//元素值大则返回-1,若相等则继续比较下一个元素,直到
//一个数组中无元素比较,此时若两者的n值相同则返回0,
//否则若*this中的n值大则返回1,若b中的n值大则返回-1。
};
答案供参考
一、单项选择题(每小题2分,共20分)
1. C 2. C 3. B 4. A 5. B
6. D 7. C 8. B 9. A 10. A
二、填空题(每小题2分,共20分)
1. /* 2. 35 3. 相同 4. 19 5. 文献
6. 数组名 7. char * 8. 析构 9. a 10. 主文献
三、程序填充题,根据题旨在横线上填写合适的内容。(每小题6分,共24分)
评分标准:每空3分
1. a=b、b=r
2. table[j]、p
3. new、~A() {delete []a;}
4. return Name、return totalWeight
四、理解问答题,分别写出前2小题的程序运营结果和指出后2小题的程序或函数功能。(每小题6分,共24分)
1. k=9
2. 12
3. 计算并输出N阶乘的值,其中N值由键盘输入。
4. 求出并返回字符指针参数s所指向的字符串长度。
五、编程题(每小题6分,共12分)
评分标准:按编程完整限度酌情给分。
1. void fun(char* a, int b[])
{
int i;
for(i=0;i<10;i++) b[i]=0; //2分
while(*a) {
int j=*a-’0’;
if(j>=0 && j<=9) b[j]++;
a++;
} //6分
}
2. int AA::CompareBig(AA& b)
{
int k;
if(n>b.n) k=b.n; else k=n; //1分
for(int i=0; i<k; i++)
if(a[i]>b.a[i]) return 1;
else if(a[i]<b.a[i]) return -1; //3分
if(k==n && k==b.n) return 0; //4分
else if(k<n) return 1;
else return -1; //6分
}
训练第二套
一、单项选择题(每小题2分,共20分)
1. 字符串”a+b=12\n”的长度为( )。
A. 6 B. 7 C. 8 D. 9
2. 假定一个二维数组的定义语句为“int a[3][4]={{3,4},{2,8,6}};”,则元素a[2][1]的值为( )。
A. 0 B. 4 C. 8 D. 6
3. 以下对的的描述是( )。
A. 函数的定义可以嵌套,函数的调用不可以嵌套
B. 函数的定义不可以嵌套,函数的调用可以嵌套
C. 函数的定义和函数的调用均可以嵌套
D. 函数的定义和函数的调用均不可以嵌套
4. 设有定义“double array[10];”,则表达式sizeof(array)/sizeof(array[0])的结果为array数组的( )。
A.首地址 B.元素个数
C.每个元素所占的字节数 D.总字节数
5. 若使p指向包含30个整型元素的动态数组空间,则使用的定义语句为( )。
A. int *p=new int[30]; B. int *p=new int(30);
C. int *p=new [30]; D. *p=new int[30];
6. 软件产品与其他软件产品组合成一个整体的难易限度叫做软件的( )。
A. 可维护性 B. 可复用性 C. 兼容性 D. 对的性
7. 在多文献结构的程序中,通常把类的声明单独存放于( )中。
A. 主文献 B. 实现文献 C. 库文献 D. 头文献
8. 在一个用数组实现的队列类中,假定数组长度为MS,队首元素位置为first,队列长度为length,则队首的后一个位置为( )。
A. first+1 B. (first+1)%MS
C. (first-1)%MS D. (first+length)%MS
9. 假定一个类的构造函数为“A(int aa=1, int bb=0) {a=aa; b=bb;}”,则执行“A x(4);”语句后,x.a和x.b的值分别为( )。
A. 1和0 B. 1和4 C. 4和1 D. 4和0
10. 假定AB为一个类,则执行“AB a(2), b[3], *p[4];”语句时共调用该类构造函数的次数为( )。
A. 3 B. 4 C. 5 D. 9
二、填空题(每小题2分,共20分)
1. 用于输出表达式值的标准输出流对象是____________。
2. 假定x=5,y=6,则表达式x--*--y的值为__________。
3. 假定x是一个逻辑量,则x || true的值为__________。
4. C++提供的预解决命令有宏定义命令,条件编译命令和____________命令。
5. 假定a是一个一维数组,则a[i]的指针访问方式为________。
6. 变量v定义为“double v=23.4;”,要使指针pv指向v,则定义pv的语句为______________。
7. 若在类的定义体中只给出了一个成员函数的原型,则在类外给出完整定义时,其函数名前必须加上________和两个冒号分隔符。
8. 若采用x.abc(y)表达式调用一个成员函数,在成员函数中使用的________就代表了类外的x对象。
9.假定用户没有给一个名为AB的类定义析构函数,则系统为其定义的析构函数为__________。
10.假定用户只为类AB定义了一个构造函数"AB(int aa, int bb=0) {a=aa; b=bb;}",则定义该类的对象时,其实参表中至多带有_________个实参。
三、程序填充题,根据题旨在横线上填写合适的内容。(每小题6分,共24分)
1. 下面函数是求两个整型参数a和b的最小公倍数。
int f2(int a, int b)
{
int i=2, p=1;
do {
while(a%i==0 && ____________) {
p*=i; a/=i; b/=i;
}
i++;
}while(a>=i && ____________);
return p*a*b;
}
2. 对数组a中的元素按相反顺序重新排列。
void PV(int a[], int n)
{
int i;
for(i=0; i<n/2; i++) {
int x=a[i];
____________________;
____________________;
}
}
3. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法是把以L为表头指针的链表中各结点依次按相反顺序链接并返回新链表的表头指针。
NODE* f8(NODE* L)
{
if(L==NULL) return NULL;
NODE *p=NULL, *q=L, *t; //p为新链表的表头指针,初始值为空
while(q!=NULL) {
t=q;
q=q->next;
t->next=__________;
p=__________;
}
return p;
}
4. 类A的定义
class A {
int *a; int n; int MaxLen;
public:
A(): a(0), n(0), MaxLen(0) {} //无参构造函数
A(int *aa, int nn, int MM) { //带参构造函数
n=nn;
MaxLen=MM;
if(n>MaxLen) exit(1);
a=new int[MaxLen];
for(int i=0; i<n; i++) ____________; //运用数组aa给数组a赋值
}
~A(){______________;} //释放动态存储空间
int GetValue(int i) {return a[i];} //函数体返回a[i]的值
};
四、理解问答题,分别写出前2小题的程序运营结果和指出后2小题的程序或函数功能。(每小题6分,共24分)
1. #include<iostream.h>
const int B=2;
void main()
{
int p=1,s=1;
while(s<50) {
p*=B;
s+=p;
}
cout<<"s="<<s<<endl;
}
运营结果:
2. #include<iostream.h>
class CE {
private:
int a,b;
int getmin() {return (a<b? a:b);}
public:
int c;
void SetValue(int x1,int x2, int x3) {
a=x1; b=x2; c=x3;
}
int GetMin();
};
int CE::GetMin() {
int d=getmin();
return (d<c? d:c);
}
void main()
{
int x=5,y=12,z=8;
CE *ep=new CE;
ep->SetValue(x+y,y-z,10);
cout<<ep->GetMin()<<endl;
}
运营结果:
3. int ff(int x, int y, char op) {
int z;
switch(op) {
case '+':
cout<<x<<'+'<<y<<'='; cin>>z;
if(x+y==z) return 1; else return 0;
break;
case '-':
cout<<x<<'-'<<y<<'='; cin>>z;
if(x-y==z) return 1; else return 0;
break;
case '*':
cout<<x<<'*'<<y<<'='; cin>>z;
if(x*y==z) return 1; else return 0;
break;
case '/':
cout<<x<<'/'<<y<<'='; cin>>z;
if(x/y==z) return 1; else return 0;
break;
default: cout<<"运算符错,退出!"; exit(1);
}
}
函数功能:
4. char* f(char *s){
int n=strlen(s);
char* r=new char[n+1];
for(int i=0; i<n; i++)
if(s[i]>='a' && s[i]<='z') r[i]=s[i]-'a'+'A';
else r[i]=s[i];
r[n]=’\0’;
return r;
}
函数功能:
五、编程题(每小题6分,共12分)
1. 按照下面函数原型语句编写一个递归函数求出并返回数组a中n个元素的平方和。
int f(int a[],int n);
2. 根据下面类中拷贝构造函数的原型写出它的类外定义。
class Array {
int *a; //指向动态分派的整型数组空间
int n; //记录数组长度
public:
Array(int aa[], int nn); //构造函数,运用aa数组长度nn初始化n,
//运用aa数组初始化a所指向的数组空间
Array(Array& aa); //拷贝构造函数
};
答案供参考
一、单项选择题每小题2分,共20分)
1. B 2. A 3. B 4. B 5. A
6. C 7. D 8. B 9. D 10. B
二、填空题(每小题2分,共20分)
1. cout 2. 25 3. true (或1) 4. 文献包含 5. *(a+i)
6. double *pv=&v; 7. 类名 8. *this 9. ~AB() {} 10. 2
三、程序填充题,根据题旨在横线上填写合适的内容。(每小题6分,共24分)
评分标准:每空3分。
1. b%i==0、b>=i
2. a[i]=a[n-i-1]、a[n-i-1]=x
3. p、t
4. a[i]=aa[i]、delete []a
四、理解问答题,分别写出前2小题的程序运营结果和指出后2小题的程序或函数功能。(每小题6分,共24分)
评分标准:第3、4小题根据叙述完整限度酌情给分。
1. s=63
2. 4
3. 以参数x和y作为运算对象,以参数op所存字符作为运算符,规定从键盘上输入运算结果,若对的则返回1否则返回0。
4. 根据参数s所指向的字符串,生成一个由r所指向的新字符串并返回,该字符串使s字符串中的小写字母均变为大写。
五、编程题(每小题6分,共12分)
评分标准:按编程完整限度酌情给分。
1. int f(int a[],int n)
{
if(n==0) return 0; //1分
else return a[n-1]*a[n-1]+f(a,n-1); //6分
}
2. Array::Array(Array& aa) {
n=aa.n; //1分
a=new int[n]; //3分
for(int i=0; i<n; i++) a[i]=aa.a[i]; //6分
}
训练第三套
一、单项选择题(每小题2分,共20分)
1. C++程序的基本功能模块为( )。
A. 表达式 B. 标记符 C. 语句 D. 函数
2. 当解决特定问题的循环次数已知时,通常采用( )来解决。
A. for循环 B. while循环 C. do循环 D. switch语句
3. 下面函数原型语句对的的是( )。
A. int Function(void a); B. void Function (int);
C. int Function(a); D. int(double a);
4. 假定变量m定义为“int m=7;”,则定义变量p的对的语句为( )。
A. int p=&m; B. int *p=&m; C. int &p=*m; D. int *p=m;
5. 假定变量a和pa定义为“double a[10], *pa=a;”,要将12.35赋值给数组a中的下标为5的元素,不对的的语句是( )。
A. pa[5]=12.35; B. a[5]=12.35;
C. *(pa+5)=12.35; D. *(a[0]+5)=12.35;
6. 假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( )。
A. x.a
展开阅读全文