当前位置:文档之家› C期末考试题及答案

C期末考试题及答案

一、选择填空题(共20小题,每小题2分,共40分)。

1. 关于C++与C语言关系的描述中,(D)是错误的。

语言是C++语言的一个子集语言与C++语言是兼容的++语言对C语言进行了一些改进++语言和C语言都是面向对象的2.按照标识符的要求,(A)符号不能组成标识符。

a.连接符b.下划线c.大小写字母d.数字字符3. 为了避免嵌套的if-else语句的二义性,C语言规定else总是与(C)组成配对关系。

a.缩排位置相同的ifb.在其之前未配对的ifc.在其之前未配对的最近的ifd.同一行上的if4. 在"int a[ ][3]={{1},{3,2},{4,5,6},{0}};"中,a[2][2]的值是(C)。

5. 设"char **s;",以下正确的表达式是(B)。

="computer"; b.*s="computer";c.**s="computer";d.*s='c';6. 对于"int *pa[5];"的描述中,(D)是正确的。

是一个指向数组的指针,所指向的数组是5个int型元素是一个指向某数组中第5个元素的指针,该元素是int型变量[5]表示某个元素的第5个元素的值是一个具有5个元素的指针数组,每个元素是一个int型指针7. 在下列表示引用的方法中,(A)是正确的。

已知:int m=10;&x=m; &y=10;&z; &t=&m;8. 下列for循环的次数为(B)。

for(i=0, x=0; !x&&i<=5; i++)d.无限9. 对于C/C++语言的函数,下列叙述中正确的是(A)。

a.函数的定义不能嵌套,但函数调用可以嵌套b.函数的定义可以嵌套,但函数调用不能嵌套c.函数的定义和调用都不能嵌套d.函数的定义和调用都可以嵌套10. 在一个被调用函数中,关于return语句使用的描述,(D)是错误的。

a.被调用函数中可以不用return语句b.被调用函数中可以使用多个return语句c.被调用函数中,如果有返回值,就一定要有return语句d.被调用函数中,一个return语句可以返回多个值给调用函数11. 在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( A)。

a.内联函数b.重载函数c.递归调用d.嵌套调用12. 使用fseek函数可以实现的操作是(A)。

a.改变文件指针的当前位置b.文件的顺序读写c.文件的随机读写d.以上都不对13. 下列存储标识符中,(C)的可见性与存在性不一致。

a.外部类b.自动类c.内部静态类d.寄存器类14. 在如下结构定义中,不正确的是(B)。

student{int no;char name[10];float score;};stud[20]{int no;char name[10];float score;};student{int no;char name[10];float score;} stud[20];{int no;char name[10];float score;}stud[100] ;15. 将两个字符串连接起来组成一个字符串时,选用(C)函数。

( ) ( )( ) ( )16. ( D)不是构造函数的特征a.构造函数的函数名与类名相同b.构造函数可以重载c.构造函数可以设置缺省参数d.构造函数必须指定类型说明17. 已知:类A中一个成员函数说明如下:void Set(A&a);其中,A&的含义是(C )。

a.指向类A的指针为ab.将a的地址值赋给变量Set是类A对象的引用,用来作函数Set()的参数d.变量A与a按位与作为函数Set( )的参数18. 已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,(A)是正确的。

print( ) const; void print( );const print( ); print(const);19. 关于虚函数的描述中,(C)是正确的。

a.虚函数是一个static类型的成员函数b.虚函数是一个非成员函数c.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数d.派生类的虚函数与基类的虚函数具有不同的参数个数和类型20. 关于new运算符的下列描述中,(D)是错的。

a.它可以用来动态创建对象和对象数组b.使用它创建的对象和对象数组可以使用运算符delete删除c.使用它创建对象时要调用构造函数d.使用它创建对象数组时必须指定初始值三、(6分)分析下面程序的运行结果#include <>class B{public:B(){}B(int i){b=i;}virtual void virfun(){cout<<"B::virfun() called.\n";}private:int b;};class D:public B{public:D(){}D(int i,int j):B(i){d=j;} private:int d;void virfun(){cout<<"D::virfun() called.\n";}};void fun(B *obj){obj->virfun();}void main(){D *pd=new D;fun(pd);}四、(9分)下面的程序可以统计命令行第一个参数中出现的字母个数,请填充下面空白,完成程序。

#include <>#include <>void main(int argc, argv[];){char *str;int count=0;if(argc<2)exit(1);str= ;while(*str)if(isalpha( )) count++;printf("\n字母个数:%d\n",count);}提示:int isalpha(int ch)函数功能是检查ch是否是字母五、(8分)定义一个字符栈类Stack(包括类的实现)。

数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。

栈数组的尺寸由常量SIZE确定。

栈的基本操作为Push()和Pop()。

六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。

void inverse(int *a, int n){}七、(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。

请完成该函数。

int str_count(char *substr, char *str){}二、问答题1、虚析构函数有什么作用?解答要点:对象销毁时,需要调用析构函数。

在多态调用时,是用基类的指针访问派生类的对象。

如果析构函数是非虚函数,则基类指针只能访问基类的析构函数,而不能访问派生类的析构函数,导致派生类对象销毁时,没有调用派生类的析构函数,只是调用了基类的析构函数。

如果把析构函数定义成虚函数,则可克服这个问题。

2、拷贝构造函数在哪几种情况下调用?解答要点:用一个对象初始化另一个对象时当用对象作为函数参数传递时当函数返回对象时3、函数重载与函数覆盖有什么不同,它们与多态有什么关系?解答要点:函数重载是指函数名相同,而函数的参数个数或类型不同;覆盖是指在派生类中成员函数与基类成员函数的函数名、参数个数、类型与返回值均相同;C++中正是通过虚函数的覆盖,实现多态的功能。

4、 C++继承是如何工作的?答:继承使得派生类能够使用基类的公有和保护成员,从而实现代码的复用,派生类可以增加成员,也可以隐藏和覆盖基类的成员。

对于公有继承,基类成员的访问权限在派生类保持不变。

5、类与对象有什么区别?答:类是类型,是对象的抽象,对象是类的具体实例。

一个类可以有多个对象,每个对象都有自己的存储单元,而类不占存储单元。

三、运行结果为: D::virfun() called.四、填空① char * ② argv[1] ③ *str++五、(8分)定义一个字符栈类Stack(包括类的实现)。

数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。

栈数组的尺寸由常量SIZE确定。

栈的基本操作为Push()和Pop()。

const int SIZE=27;class Stack{public:Stack():tos(0){};void Push(char ch);char Pop();private:char stck[SIZE];int tos;};void Stack::Push(char ch){if(tos==SIZE)cout<<"\nStack is full\n";else{stck[tos]=ch;tos++;}}char Stack::Pop(){if(tos==0){cout<<"\nStack is empty\n";return 0;}tos--;return stck[tos];}六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。

void inverse(int *a, int n){}int i,*p;p=new int[n];for(i=0;i<=n-1;i++)p[i]=a[i];for(i=0;i<=n-1;i++)a[i]=p[n-i-1];delete []p;七、(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。

请完成该函数。

int str_count(char *substr, char *str){}int count=0;char *pChar;if(substr==NULL||str==NULL) return count;while(*str!='\0'){pChar=substr;while(*pChar==*str){pChar++;if(*pChar=='\0'){count++;break;}else str++;}.) statementstr++;}.) statement return count;。

相关主题