1、计算机二级(C+)60 及答案解析(总分:4230.00,做题时间:90 分钟)一、选择题(每小题 2 分,共 70 分) 下列各(总题数:60,分数:4200.00)1.有如下程序 #includeiostreamh void main( ) float x=20,y; if(x00)y=00; else if(x100)y=10/x; else y=10; cout y; 该程序的输出结果是( )。 (分数:70.00)A.8KB.16KC.32KD.64K2.以下程序的输出结果是( )。 #includeiostreamh void main( ) inti,j,x=0; for(i=0
2、;i 2;i+) x+; for(j=0;j 3;j+) if (j% 2)continue; x+; x+; cout “x=“ x; (分数:70.00)A.若干个二维表B.一个 DBF 文件C.一个 DBC 文件D.若干个 DBC 文件3.下面程序输出的结果是( )。 #includeiostream.h voidmain( ) inti; inta33:1,2,3,4,5,6,7,8,9; for(i=0;iA.159B.753C.357D.5914.关于 this 指针的说明不正确的是( )。(分数:70.00)A.不能在程序中修改 this 指针B.this 指针可以给其他指针赋值
3、,但不能修改 this 指针C.静态成员函数中没有 this 指针D.this 指针可以被赋值5.为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为 ( )。(分数:70.00)A.publicB.protectedC.privateD.static6.如果表达式-X+y 中,-是作为成员函数重载的,+是作为成员函数重载的,则该表达式还可为( )。(分数:70.00)A.将继承这个类的所有行为B.子类将自动成为监听器C.不必实现任何不需要的 WindowListener 方法D.为了层次清楚,美观大方7.下面的哪个选项不能作为函数的返回类型?(分数:70.00
4、)A.NameB.CaptionC.PasswordCharD.Text8.有以下程序: struct STU char name10; int num; float TotalScore; ; void f(struct STU *p) struct STU s2=“SunDan“,20044,550,“Penghua“,20045,537,*q=s; +p; +q; *p=*q; main() struct STU s3= “YangSan“,20041,703,“LiSiGuo“,20042,580; f(s); printf(“%s %d %3.0f/n“,s1.name, s1.nu
5、m,s1.TotalScore); 程序运行后的输出结果是_。 (分数:70.00)A.SunDan 20044 550B.Penghua 20045 537C.LiSiGuo 20042 580D.SunDan 20041 7039.有以下程序段: int n,t=1,s=0; scanf(“%d“, do s=s+t; t=t-2; while (t!=n); 为使此程序段不陷入死循环,从键盘输入的数据应该是_。 (分数:70.00)A.任意正奇数B.任意负偶数C.任意正偶数D.任意负奇数10.程序中若有如下说明和定义语句 char fun(char *); main() char *s=
6、“one“,a5=0,(*f1)()=fun,ch; 以下选项中对函数 fun 的正确调用语句是_。(分数:70.00)A.(*f1)(;B.*f1(*s);C.fun(D.ch=*f1(s);11.while 和 do-while 循环的主要区别是( )。(分数:70.00)A.native2asciiB.ascii 2 nativeC.RMID.tnameser12.关于面向对象的程序设计方法,下列说法正确的是【 】(分数:70.00)A.“封装性“指的是将不同类型的相关数据组合在一起,作为一个整体进行处理B.“多态性“指的是对象的状态会根据运行时要求自动变化C.基类的私有成员在派生类的对
7、象中不可访问,也不占内存空间D.在面向对象的程序设计中,结构化程序设计方法仍有着重要作用13.若有以下说明和定义 union dt int a;char b;double c;data; 以下叙述中错误的是_。 (分数:70.00)A.data 的每个成员起始地址都相同B.变量 data 所占的内存字节数与成员 c 所占字节数相等C.程序段 data.a=5;printf(“%f/n“,data.;输出结果为 5.000000D.data 可以作为函数的实参14.若定义 intk=7,x=12;,则能使值为 3 的表达式是( )。(分数:70.00)A.Alt+F2B.ablC.随机出儿个数D
8、.不发生变化15.执行以下程序后,test.txt 文件的内容是(若文件能正常打开)_。 #include main() FILE *fp; char *s1=“Fortran“,*s2=“Basic“; if(fp=fopen(“test.txt“,“wb“)=NULL) printf(“Cant open test.txt file/n“); exit(1); fwrite(s1,7,1,fp); /*把从地址 s1 开始的 7 个字符写到 fp 所指文件中*/ f seek(fp, 0L,SEEK_SET); /*文件位置指针移到文件开头*/ fwrite(s2,5,1,fp); fcl
9、ose(fp); (分数:70.00)A.BasicanB.BasicFortranC.BasicD.FortranBasic16.已知:int m10:在下列定义引用的语句中,正确的是【 】(分数:70.00)A.int for(i=0;iY)C.NOT(XY)D.NOT(X=Y)57.派生类对象对其基类中的什么成员是可访问的?(分数:70.00)A.publicB.privateC.protectedD.以上都对58.关于动态存储分配,下列说法正确的是【 】(分数:70.00)A.new 和 delete 是 C语言中专门用于动态内存分配和释放的函数B.动态分配的内存空间也可以被初始化C.
10、当系统内存不够时,会自动回收不再使用的内存单元,因些程序中不必用 delete 释放内存空间D.当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用 new59.建立派生类对象时,3 种构造函数分别是 a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这 3 种构造函数的调用顺序为( )。(分数:70.00)A.abcB.acbC.cabD.cba60.下列说法正确的是( )。(分数:70.00)A.s.equals(t);B.t.equals(c);C.s = =tD.t = = c;二、填空题(每空 2 分,共 30 分)(总题数:20,分数:30.00)61.以下程序
11、的执行结果为 1。 #includeiostream using namespace std; class base public: virtual void who2 cout “base class“ end1; ; class derivel:public base public: void who3 cout “derivel class“ end1; ; class derive2:public base public: void who4 cout “derive2 class“ end1; ; void main5 base obj1,* p; derivel obi2; der
12、ive2 obj3; p=&obj1; p-who6; p=&obj2; p-who7; p=&obj3; p-who8; (分数:1.50)填空项 1:_62.语句 cout /n还可表示为 1。(分数:1.50)填空项 1:_63.请定义一个函数名为 A,返回值为 int,没有参数的纯虚函数的定义是 1。(分数:1.50)填空项 1:_64.下面是用来计算 n 的阶乘的递归函数,请将该函数的定义补充完整。(注:阶乘的定义是 n!n*(n1)*.*2*1) unsigned fact (unsigned n) if(n1) retum 1; return 1; (分数:1.50)填空项 1:
13、_65.插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置。InsertSort 类的成员函数 sort1 实现了插入排序算法。请将画线处缺失的部分补充完整。 class InserSort public: InsertSort(int*a0,int n0):a(a0),n(n0)参数 a0 是某数组首地址,n是数组元素个势 void sort2 此函数假设已排序序列初始化状态只包含 a0,未排序序列初始为a1an-1 for(int i=1;i3;j0;-j) if(t=aj-1)break; aj:aj-1; aj=t; protected: int*a
14、,n;指针 a 用于存放数组首地址,n 用于存放数组元素个数 ; (分数:1.50)填空项 1:_66.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:1.50)填空项 1:_67.如果一个工人可管理多个设备,而一个设备只被一个工人管理,则实体“工人“与实体“设备“之间存在 1 关系。(分数:1.50)填空项 1:_68.若从键盘输入 70,则以下程序输出的结果是 1。 #includeiostreamh void main2 int a;cina; if(a50) couta; if(a40)couta; if(a30)co
15、uta (分数:1.50)填空项 1:_69.程序 #include“ iostreamh“ void main1 int i=10; jnt j=5; cout j+i+ end1; 的结果为 2 (分数:1.50)填空项 1:_70.coutput(A);,还可以表示为 1。(分数:1.50)填空项 1:_71.若变量 a,b 已定义为 int 类型并赋值 21 和 55,要求用 printf 函数以 a=21,b=55 的形式输 出,请写出完整的输出语句 1。(分数:1.50)填空项 1:_72. 1 是一系列相关函数的模型或样板,这些函数的 2 形式相同,只是所针对的 3 不同。(分数
16、:1.50)填空项 1:_73.在关系模型中,把数据看成是二维表,每一个二维表称为一个 1。(分数:1.50)填空项 1:_74.下列程序段的输出结果是 1。 coutfixed509.123456789endl; (分数:1.50)填空项 1:_75.数据的逻辑结构在计算机存储空间中的存放形式称为数据的 1(分数:1.50)填空项 1:_76.C+语言中关键字运算符有 new,delete 和 1。(分数:1.50)填空项 1:_77.表达式 xoperator+(yoperator+(0)还可以写成 1。(分数:1.50)填空项 1:_78.operator 是运算符重载时必须使用的关键字
17、,它和被重载的运算符连在一起,作为运算符函数的专用函数名,务必把该函数说明为 1 的。(分数:1.50)填空项 1:_79.已知下列程序的输出结果是 42,请将画线处缺失的部分补充完整。 #include using namespace std; claSS Foo int value; void setValue(int value) 1=value;给 Foo 的数据成员 value赋值 void print2coutY)C.NOT(XY) D.NOT(X=Y)解析:对象的生成包括声明、实例化和初始化三个方面的内容。一般格式是先声明一个对象变量,再用关键字 new 生成一个对象,并为对象中
18、的变量赋初值(初始化)。注意:选项 B)public X xl=new X(int l23);参数不要加数据类型 int。选项 C)Y x1;类的类型必须是 X。选项 D)X xl;X();缺少 new。57.派生类对象对其基类中的什么成员是可访问的?(分数:70.00)A.publicB.privateC.protectedD.以上都对 解析:本题考查关于 c+语言继承问题中派生类对基类的访问能力 C+浯言中通常有三种继承修饰符public,protected,Privale,限制依次严格,另外对类中的数据和函数也有这三种修饰符进行限制,有3 种是不能继承的:公有继承基类的私有成员,私有继承
19、基类的私有成员,保护继承基类的私有成员。 58.关于动态存储分配,下列说法正确的是【 】(分数:70.00)A.new 和 delete 是 C语言中专门用于动态内存分配和释放的函数B.动态分配的内存空间也可以被初始化 C.当系统内存不够时,会自动回收不再使用的内存单元,因些程序中不必用 delete 释放内存空间D.当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用 new解析:本题考核动态存储分配。用于动态分配的内存空间称为堆内存,它通常由操作系统进行管理且数量有限,其内存空间可以被初始化。若程序不断分配堆内存,则可能耗尽,在这种情况下,系统无法再对new 提出的内存分配请求给予满足,此
20、时 new 会返回空指针 NULL,表示动态存储分配操作失败,不会造成系统崩溃。在 C程序中由 new 分配的动态内存空间必须通过 delete 运算符释放。59.建立派生类对象时,3 种构造函数分别是 a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这 3 种构造函数的调用顺序为( )。(分数:70.00)A.abc B.acbC.cabD.cba解析:本题考查的是在继承中派生类的对象调用构造函数的顺序,应该 是先调用基类的构造函数,然后是成员中的对象对应类的构造函数,最后是派生类自己 的构造函数。60.下列说法正确的是( )。(分数:70.00)A.s.equals(
21、t); B.t.equals(c);C.s = =tD.t = = c;解析:在定义内部类时,内外部类不能同名,不存在继承关系,可以把内部类当成类的成员。二、填空题(每空 2 分,共 30 分)(总题数:20,分数:30.00)61.以下程序的执行结果为 1。 #includeiostream using namespace std; class base public: virtual void who2 cout “base class“ end1; ; class derivel:public base public: void who3 cout “derivel class“ end
22、1; ; class derive2:public base public: void who4 cout “derive2 class“ end1; ; void main5 base obj1,* p; derivel obi2; derive2 obj3; p=&obj1; p-who6; p=&obj2; p-who7; p=&obj3; p-who8; (分数:1.50)填空项 1:_ (正确答案:base class derivel class derive2 class)解析:本题考查虚函数的用法。类 base 含有虚函数 who-|_|-,该类派生出 derivel 类和 de
23、rive2 类,两个派生类中都有虚函数 who-|_|-的定义。在 main-|_|-函数中定义了一个指向 base 类的指针,它也被允许指向其派生类。在执行过程中,不断改变它所指的对象,当 p-who-|_|-时就能调用不同的版本。这是因为使用了虚函数,因而进行动态联编。62.语句 cout /n还可表示为 1。(分数:1.50)填空项 1:_ (正确答案:cout end1;)解析:“/n”表示换行,end1 也可表示换行。end1 和“/n”可以通用。63.请定义一个函数名为 A,返回值为 int,没有参数的纯虚函数的定义是 1。(分数:1.50)填空项 1:_ (正确答案:virtua
24、l int A-|_|-=0;)解析:C+语言中的纯虚函数是一种特殊的函数,它没有自己的定义,只有声明,纯虚函数与虚函数声明的不同就在于在函数后面加上了“=0”。64.下面是用来计算 n 的阶乘的递归函数,请将该函数的定义补充完整。(注:阶乘的定义是 n!n*(n1)*.*2*1) unsigned fact (unsigned n) if(n1) retum 1; return 1; (分数:1.50)填空项 1:_ (正确答案:n*fact (n-1))解析:本题考核递归函数。一般递归函数由递归出口和递归体两部分组成。递归出口给出了递归终止的条件;递归体给出了递归的方式。题中程序给出了递归
25、出口,但是没有给出递归体,由阶乘的定义可知其递归体应该为 n*fact (n-1)。65.插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置。InsertSort 类的成员函数 sort1 实现了插入排序算法。请将画线处缺失的部分补充完整。 class InserSort public: InsertSort(int*a0,int n0):a(a0),n(n0)参数 a0 是某数组首地址,n是数组元素个势 void sort2 此函数假设已排序序列初始化状态只包含 a0,未排序序列初始为a1an-1 for(int i=1;i3;j0;-j) if(t=aj
26、-1)break; aj:aj-1; aj=t; protected: int*a,n;指针 a 用于存放数组首地址,n 用于存放数组元素个数 ; (分数:1.50)填空项 1:_ (正确答案:j=n-l)解析:给变量 j 赋初值。66.派生类构造函数的执行顺序是先执行 1 的构造函数,然后执行成员对象的构造 函数,最后执行 2 的构造函数。 (分数:1.50)填空项 1:_ (正确答案:基类)解析:本题主要考查的是派生类构造函数的执行顺序,在 C+语言中构造函数的执行顺序是先基类后派生类,而析构函数的执行顺序正好相反,是先调用派生类后调用基类。 67.如果一个工人可管理多个设备,而一个设备只
27、被一个工人管理,则实体“工人“与实体“设备“之间存在 1 关系。(分数:1.50)填空项 1:_ (正确答案:一对多(或 1 对多、或 1:M、或 1:N,其中 M、N 大小写均可))解析:实体之间的联系可以归结为三类:一对一的联系,一对多的联系,多对多的联系。设有两个实体集E1 和 E2,如果 E2 中的每一个实体与 E1 中的任意个实体(包括零个)有联系,而 E1 中的每一个实体最多与E2 中的一个实体有联系,则称这样的联系为“从 E2 到 E1 的一对多的联系“,通常表示为“1:n 的联系“。由此可见,工人和设备之间是一对多关系。68.若从键盘输入 70,则以下程序输出的结果是 1。 #
28、includeiostreamh void main2 int a;cina; if(a50) couta; if(a40)couta; if(a30)couta (分数:1.50)填空项 1:_ (正确答案:707070)解析:本题考查对 if 语句的掌握,当输入 70 以后,程序中的 3 个 if 语句都成立,所以分别输出 70。 69.程序 #include“ iostreamh“ void main1 int i=10; jnt j=5; cout j+i+ end1; 的结果为 2 (分数:1.50)填空项 1:_ (正确答案:15)解析:i+为先做与 i 有关的运算后,i 自加 1,而+i 是先给 i 加 1 再进行与 i 有关的操作70.coutput(A);,还可以表示为 1。(分数:1.50)填空项 1:_ (正确答案:coutvalue)解析:this 指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。80.请定义一个函数名为 A,返回值为 int,没有参数的纯虚函数的定义是 1。(分数:1.50)填空项 1:_ (正确答案:virtual int A-|_|-=0;)解析:C+语言中的纯虚函数是一种特殊的函数,它没有自己的定义,只有声明,纯虚函数与虚函数声明的不同就在于在函数后面加上了“=0”。