全国计算机等级考试二级C语言笔试试题及全真解析.doc
2006年9月全国计算机等级考试二级C语言笔试试题及答案 一、 选择题(每小题2 分,共70 分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。(1)下列选项中不符合良好程序设计风格的是_。A)、源程序要文档化 B)、数据说明的次序要规范化C)、避免滥用goto 语句 D)、模块设计要保证高耦合,高内聚(2)从工程管理角度,软件设计一般分为两步完成,它们是_。A)、概要设计与详细设计 B)、数据设计与接口设计C)、软件结构设计与数据设计 D)、过程设计与数据设计(3)下列选项中不属于软件生命周期开发阶段任务的是_。A)、软件测试 B)、概要设计 C)、软件维护 D)、详细设计(4)在数据库系统中,用户所见的数据模式为_。A)、概念模式 B)、外模式 C)、内模式 D)、物理模式(5)数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和_。A)、编码设计 B)、测试阶段 C)、运行阶段 D)、物理设计(6)设有如下三个关系表下列操作中正确的是A)、T=RS B)、T=RS C)、T=R×S D)、T=R/S(7)下列叙述中正确的是A)、一个算法的空间复杂度大,则其时间复杂度也必定大B)、一个算法的空间复杂度大,则其时间复杂度必定小C)、一个算法的时间复杂度大,则其空间复杂度必定小D)、上述三种说法都不对(8)在长为64 的有序线性表中进行顺序查找,最坏情况下需要比较的次数为_。A)、63 B)、64 C)、6 D)、7(9)数据库技术的根本目标是要解决数据的_。A)、存储问题 B)、共享问题 C)、安全问题 D)、保护问题(10)对下列二叉树: 进行中序遍历的结果是_。A)、ACBDFEG B)、ACBDFGE C)、ABDCGEF D)、FCADBEG(11)下列有关内联函数的叙述中,正确的是_。A)、内联函数在调用时发生控制转移B)、内联函数必须通过关键字inline 来定义C)、内联函数是通过编译器来实现的D)、内联函数体的最后一条语句必须是rennin 语句(12)下列情况中,不会调用拷贝构造函数的是_。A)、用一个对象去初始化同一类的另一个新对象时B)、将类的一个对象赋予该类的另一个对象时C)、函数的形参是类的对象,调用函数进行形参和实参结合时D)、函数的返回值是类的对象,函数执行返回调用时(13)下列有关继承和派生的叙述中,正确的是_。A)、如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B)、派生类的成员函数可以访问基类的所有成员C)、基类对象可以赋值给派生类对象D)、如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类(14)下列运算不能重载为友元函数的是_。A)、= ( ) -> B)、+ - + -C)、> < >= <= D)、+= -= *= /=(15)关于在调用模板函数时模板实参的使用,下列表述正确的是_。A)、对于虚类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B)、对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,FC EA DBG则都可以省略C)、对于虚拟型参数所对应的模板实参,若能够省略则必须省略D)、对于常规参数所对应的模板实参,任何情况下都不能省略(16)下列关于输入流类成员函数getline( )的描述中,错误的是_。A)、该函数是用来读取键盘输入的字符串的B)、该函数读取的字符串长度是受限制的C)、该函数读取字符串时,遇到终止符便停止D)、该函数读取字符串时,可以包含空格(17)下列符号中,正确的C+标识符是_。A)、enum B)、2b C)、foo-9 D)_32(18)下列语句中,错误的是_。A)、const int buffer=256; B)、const double*point;C)、int const buffer=256; D)、double*const point;(19)if 语句的语法格式可描述为格式1:if(<条件>)<语句>或格式2:if(<条件>)<语句1>else<语句2>关于上面的语法格式,下列表述中错误的是A)、<条件>部分可以是一个if 语句,例如if(if(a =0)?)?B)、<条件>部分可以是一个if 语句,例如if(?)if(?)?C)、如果在<条件>前加上逻辑非运算符!并交换<语句1>和<语句2>的位置,语句功能不变D)、<语句>部分可以是一个循环语句,例如if(?)while(?)?(20)有如下说明int a 10=1,2,3,4,5,6,7,8,9,10,*p=a;则数值为9 的表达式是_。A)、*p+9 B)、*(p+8) C)、*p+=9 D)、p+7 (21)或下面的函数调用fun(a+b,3,max(n-1)b)则fun 的实参个数是_。A)、3 B)、4 C)、5 D)、6(22)以下关键字不能用来声明类的访问权限的是_。A)、public B)、static C)、protected D)、private(23)在公有继承的情况下,允许派生类直接访问的基类成员包括_。A)、公有成员 B)、公有成员和保护成员C)、公有成员、保护成员和私有成员 D)、保护成员(24)关于运算符重载,下列表述中正确的是_。A)、C+已有的任何运算符都可以重载B)、运算符函数的返回类型不能声明为基本数据类型C)、在类型转换符函数的定义中不需要声明返回类型D)、可以通过运算符重载来创建C+中原来没有的运算符(25)关于关键字class 和typename,下列表述中正确的是_。A)、程序中的typename 都可以替换为classB)、程序中的class 都可以替换为typenameC)、在模板形参表中只能用typename 来声明参数的类型D)、在模板形参表中只能用class 或typename 来声明参数的类型(26)有如下程序#include#includeusing namespace std;int main()count<<12,345<<&NBSP;<<34,567;return 0;若程序的输出是:*12.345*34.567则程序中下划线处遗漏的操作符是_。A)、setprecision(3) B)、fixed C)、setfill(*) D)、stew(8)(27)有如下程序#include#includeusing namespace std;class MyClasspublic:MyClass()cout<<A”;MyClass(char c cout<MyClass()sout<<B”;Int main()MyClassp1,*p2p2=new MyClass(X);delete p2;return 0;执行这个程序幕上将显示输出_。A)、ABX B)、ABXB C)、AXB D)、AXBB(28)有如下程序#includeusing namespace std;int i=1;class Funpublic;static int i;int value()return i-1int value ()constreturn i+1;int Fun;i=2;int main()int i=3;Fun Fun1const Fun fun2;return 0;若程序的输出结果是:123则程序中下划线处遗漏的语句是_。A)、cout<B)、cout<C)、cout<D)、cout<(29)有如下程序#includeusing namespace std;class Objstatic int i;public:Obj()i+;Obj()i-;static int getVal()teturn i;int Obj:i=0;void f ()Obj ob2;coutObj obl;F();Obj*ob3=new Obj;coutDelete ob3;cout程序的输出结果是_。A)、232 B)、231 C)、222 D)、221(30)有如下程序#includeusing namespace std;class Baseprotected;Base()cout<<A;Base(char c)cout<class Derived; public Basepublic:Derived(char c )cout <int main()Derived d1(B);return 0;执行这个程序屏幕上将显示输出_。A)、B B)、BA C)、AB D)、BB(31)有如下类定义:class MyBaseint k;public;MyBase(int n=0):k(n)int value()constreturn k;class MyDerived; MyBaseint j;public;MyDerived(int i): j(i)int getK()const return k;int gutj()constreturn j;编译时发现有一处语法错误,对这个错误最佳准确的描述是A)、函数getK 试图访问基类的私有成员变量KB)、在类MyDerived 的定义中,基类名MyBase 前缺少关键字public、protected 或privateC)、类MyDerived 缺少一个无参的构造函数D)、类MyDerived 的构造的数没有对基数数据成员K 进行初始化(32)在一个派生类对象结束其生命周期时A)、先调用派生类的析构函数后调用基类的析构函数B)、先调用基类的析构函数后调用派生类的析构函数C)、如果基数没有定义析构函数,则只调用派生类的析构函数D)、如果派生类没有定义析构函数,则只调用基类的析构函数(33)有如下的运算重载函数定义:Double operator+(int i, int k)return double(i+k);但定义有错误,对这个错误的最准确的描述是_。A)、+只能作为成员函数重载,而这里的+是作为非成员函数重载的B)、两个int 型参数的和应该是int 型,而这里将+的返回类型声明为doubleC)、没有将运算符重载函数声明为某个类的友元D)、C+已经提供了求两个int 型数据之和运算符+,不能再定义同样的运算符(34)语句ofstreamf(“SALARY.DAT”,ios_base:app)的功能是建立流对象f,并试图打开文件SALARY.DAT 与f 关联,而且_。A)、若文件存在,将其置为空文件;若文件不存在,打开失败B)、若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件C)、若文件存在,将文件指针定位于文件首;若文件不存在,打开失败D)、若文件存在,打开失败;若文件不存在,建立一个新文件(35)有如下程序#includeusing namespace std;class Apublic:virtual Void funcl()cout<< “A1”;void fune2()cout<< “A2”;class B: public Apublic:void func1()cout<< “B1”;void func2()cout<< “B2”;Int main()A*p=new B;p->funcl();p->func2();retum0;运行程序,屏幕上将显示输出_。A)、B1B2 B)、A1A2 C)、B1A2 D)、A1B2 二、填空题(每空2 分,共30 分)请将每一个空的正确答案写在答题卡115序号的横线上,答在试卷上不得分。(1)下列软件系统结构图的宽度为 1 。(2) 2 的任务是诊断和改正程序中的错误。(3)一个关系表的行为 3 。(4)按“行进后出”原则组织数据的数据结构是 4 。(5)数据结构分为线性结构和非线性结构,带链的队列属于 5 。(6)若有定义语句:int*a,b;,则变量b 的数据类型是 6 。(7)已知数组a 中的元素个数为n,下列语句的作用是将下标为i 的元素移动到下标为i1 的单元,其中1in。例如,当n=4,a 中原有数据为1,2,3,4 时,则移动后a中元素为2,3,4,4。请将语句补充完整:For(int i=0;i(8)已知递归函数f 的定义如下:int f (int n)If(n<1)return 1;/递归结束情况else return n*f(n-2);/递归则函数调用语句f(5)的返回值是 8 。(9)创建对象数组时,对数组的每一个元素都将调用一次构造函数,如果没有显式给出数组元素的初值,则调用缺省构造函数,下列程序涉及到对象数组的创建和单个对象的创建,其输出结果是 9 。#includeusing namespace std;class Foopublic:Foo(int X)cout <<A”Foo();int main()Foo f3,g(3);return 0;(10)习惯性在下列程序的输出结果是42,请将画线处缺失的部分补充完整。#includeUsing namespace atd;Class Fooint value;public:Foo():value(0)Void setvalue(int value) 10 =value; /给Foo 的数据成员value 赋值void print()cout<Int main()Foo f;f.setvalue(42);f.print();retum0;(11)如果不能使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基数继承的成员,下列程序没有使用多态机制,其输出结果是 11 。#includeusing namespace std;class Basepublic:Void print()cout<< B;class Derived: public Basepublicvoid print()cout<< D;int main()Derived*pd=new Dreived);Base*pb=pd;pb->print();pd->print();delete pd;return 0;(12)在声明派生类时,如果不显式地给出继承方式,缺省的类继承方式是私有继承private。已知有如下类定义:class Baseprotected:void fun();Class Derived: Base;则Base 类中的成员函数fun(),在Derived 类中的访问权限是 12 (注意:要求填写private、protected 或public 中的一项)。(13)在MyClass 类的定义中,对赋值运算符=进行重载。请将画线处缺失的部分补充完整。13 MyClass:operator=(const MyClass rhs)if(this=&rhs)return*this;value=rhs. value;return*this;(14)插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置,InsertSort 类的成员函数sort()实现了插入排序算法,请将画线处缺失的部分补充完整。class InsertSortpublic:InsertSort(int*a0,int n0):a(a0),n(n0)/参数组首地址,n 是数组元素个数void sort()/此函数假设已排离序列初始化状态只包含a0,未排序序列初始为a1?an-1for (int i=1;iint j;for( 14 j>0;-j)if(t>aj-1)break;aj=aj-1;aj=t;protected:int*a,n;/指针a 用于存放数组首地址,n 用于存放数组元素个数;(15)下列程序的输出结果是 15#includeusing namespace std;class Aint apublic:A():a(9)virtual void print() const cout<class B:public Achar b;public:B()b= S;void print()constcout<void show(Aa&X)X,print()int main() Ad1;*p;Bd2;p=&d2;d1,print();d2,print();p->print();show(d1);show(d2);return 0;2007年4月全国计算机等级考试二级C语言笔试试题及答案 2007年4月全国计算机等级考试二级笔试试卷C语言程序设计(考试时间120分钟,满分100分)一、选择题((1)(10)每小题2分,(11)(50)每题1分,共60分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。(1)下列叙述中正确的是(B)A)算法的效率只与问题的规模有关,而与数据的存储结构无关B)算法的时间复杂度是指执行算法所需要的计算工作量C)数据的逻辑结构与存储结构是一一对应的D)算法的时间复杂度与空间复杂度一定相关(2)在结构化程序设计中,模块划分的原则是(D)A)各模块应包括尽量多的功能B)各模块的规模应尽量大C)各模块之间的联系应尽量紧密D)模块内具有高内聚度、模块间具有低耦合度(3)下列叙述中正确的是(A)A)软件测试的主要目的是发现程序中的错误B)软件测试的主要目的是确定程序中错误的位置C)为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作D)软件测试是证明软件没有错误(4)下面选项中不属于面向对象程序设计特征的是(C)A)继承性 B)多态性C)类比性D)封装性(5)下列对队列的叙述正确的是(D)A)队列属于非线性表B)队列按“先进后出”原则组织数据C)队列在队尾删除数据D)队列按“先进先出”原则组织数据(6)对下列二叉树 A B C D E F X Y Z进行前序遍历的结果为(C) A) DYBEAFCZX B) YDEBFZXCAC) ABDYECFXZ D) ABCDEFXYZ(7) 某二叉树中有n个度为2的结点,则该二叉树中的叶子结点数为(A)A) n+1 B) n-1 C) 2n D) n/2(8)在下列关系运算中,不改变关系表中的属性个数但能减少元组个数的是(B)A) 并 B)交 C)投影 D)笛卡儿乘积(9)在E-R图中,用来表示实体之间联系的图形是(C)A) 矩形 B)椭圆形 C)菱形 D)平行四边形(10)下列叙述中错误的是(A)A) 在数据库系统中,数据的物理结构必须与逻辑结构一致B)数据库技术的根本目标是要解决数据的共享问题C)数据库设计是指在已有数据库管理系统的基础上建立数据库D)数据库系统需要操作系统的支持11)算法中,对需要执行的每一步操作,必须给出清楚、严格的规定,这属于算法的(C)A)正当性 B)可行性 C)确定性 D)有穷性 (12)下列叙述中错误的是(D)A)计算机不能直接执行用C语言编写的源程序B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件D)后缀为.obj和.exe的二进制文件都可以直接运行 (13)按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(B)A)大写字母 B)连接符 C)数字字符 D)下划线 (14)以下叙述中错误的是(C)A)C语言是一种结构化程序设计语言B)结构化程序有顺序、分支、循环三种基本结构组成C)使用三种基本结构构成的程序只能解决简单问题D)结构化程序设计提倡模块化的设计方法 (15)对于一个正常运行的C程序,以下叙述中正确的是(A) A)程序的执行总是从main函数开始,在main函数结束 B)程序的执行总是从程序的第一个函数开始,在main函数结束 C)程序的执行总是从main函数开始,在程序的最后一个函数中结束 D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束(16)设变量均已正确定义,若要通过scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:代表空格字符)(D)A)10X20Y回车 B)10X20Y回车 C)10X回车 D)10X回车 20Y回车 20Y回车(17)若有代数式(其中e仅代表自然对数的底数,不是变量),则以下能够正确表示该代数式的C语言表达式是(C)A)sqrt(abs(nx+ex) B) sqrt(fabs(pow(n,x)+pow(x,e)C)sqrt(fabs(pow(n,x)+exp(x) D) sqrt(fabs(pow(x,n)+exp(x) (18)设有定义:int k=0;,以下选项的四个表达式中与其他三个表达式的值不相同的是(A)A)k+ B)k+=1 C)+k D)k+1(19)有以下程序,其中%u表示按无符号整数输出(B)main()unsigned int x=0xFFFF; /* x的初值为十六进制数*/ printf(“%un”,x);程序运行后的输出结果是A)-1 B)65535 C)32767 D)0xFFFF(20)设变量x和y均已正确定义并赋值,以下if语句中,在编译时将产生错误信息的是(C)A)if(x+); B)if(x>y&&y!=0); C)if(x>y) x- - D)if(y<0) ; else y+; else x+;(21)以下选项中,当x为大于1的奇数时,值为0的表达式(D)A)x%2=1 B)x/2 C)x%2!=0 D)x%2=0(22)以下叙述中正确的是(C)A)break语句只能用于switch语句体中B)continue语句的作用是:使程序的执行流程跳出包含它的所有循环C)break语句只能用在循环体内和switch语句体内D)在循环体内使用break语句和continue语句的作用相同(23)有以下程序(A)main()int k=5,n=0; do switch(k) case1: case3:n+=1; break;default;n=0;k-;case2: case4:n+=2;k-;break;printf(“%d”,n);while(k>0&&n<5);程序运行后的输出结果是A)235 B)0235 C)02356 D)2356(24)有以下程序mian()int i,j; for(i=1;i<4;i+)for(j=i;j<4;j+) printf(“%d*%d=%d “,i,j,i*j);printf(“n”);程序运行后的输出结果是(B)A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=32*1=2 2*2=4 2*2=4 2*3=63*1=3 3*3=9C) 1*1=1 D) 1*1=1 1*2=2 2*2=4 2*1=2 2*2=4 1*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9(25)以下合法的字符型常量是(A)A)”x13” B)”018” C)”65” D)”n”(26)在C语言中,函数返回值的类型最终取决于(A)A)函数定义时在函数首部所说明的函数类型B)return语句中表达式值的类型C)调用函数时主函数所传递的实参类型D)函数定义时形参的类型(27)已知大写字母A的ASCII码是65,小写字母aASCII码是97,以下不能将变量c中大写字母转换为对应小写字母的语句是(D)A)c=(c-A)&+a B)c=c+32C)c=c-A+a D)c=(A+c)&-a (28)有以下函数 int fun(char *s) char *t=s; while(*t+); return(t-s); 该函数的功能是(B)A)比较两个字符的大小 B)计算s所指字符串占用内存字节的个数C)计算s所指字符串的长度 D)将s所指字符串复制到字符串t中(29)设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是(D)A)float *p=1024; B)int *p=(float x);C)float p=&x; D)float *P=&x;(30)有以下程序 #include main() int n,*p=NULL;*p=&n;printf(“Input n:”); scanf(“%d”,&p); printf(“output n:”); printf(“%dn”,p);该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(A)A)int n,*p=NULL; B)*p=&n; C)scanf(“%d”,&p) D)printf(“%dn”,p);(31)以下程序中函数f的功能是:当flag为1时,进行有由小到大排序;当flag为0时,进行由大到小排序。 void f(int b,int n,int flag) int i,j,t;for(i=0;i for (j=i+1;j if(flag?bi>bj:bimain()int a10=5,4,3,2,1,6,7,8,9,10,i; f(&a2,5,0); f(a,5,1); for(i=0;i<10;i+) printf(“%d,”ai);程序运行后的输出结果是(B)A)1,2,3,4,5,6,7,8,9,10,B)3,4,5,6,7,2,1,8,9,10,C)5,4,3,2,1,6,7,8,9,10,D)10,9,8,7,6,5,4,3,2,1,(32)有以下程序void f(int b)int i; for(i=2;i<6;i+) bi*=2; main()int a10=1,2,3,4,5,6,7,8,9,10,i;f(a);for(i=0;i<10;i+) printf(“%d,”,ai);程序运行后的输出结果是(B)A)1,2,3,4,5,6,7,8,9,10,B)1,2,6,8,10,12,7,8,9,10C)1,2,3,4,10,12,14,16,9,10,D)1,2,6,8,10,12,14,16,9,10,(33)有以下程序 typedef structint b,p;A; void f(A c) /*注意:c是结构变量名*/ int j;c.b+=1; c.p+=2;main()int i;A a=1,2;f(a);printf(“%d,%dn”,a.b,a.p);程序运行后的输出结果是(D) A)2,3 B)2,4 C)1,4 D)1,2(34)有以下程序main()int a44=1,4,3,2,8,6,5,7,3,7,2,5,4,8,6,1,i,j,k,t;for(i=0;i<4;i+) for(j=0;j<3;j+) for(k=j+1;k<4;k+) if(aji>aki)t=aji;aji=