1、二级 C+笔试 13 及答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.若有以下程序: #include iostream using namespace std; int main() int a4 4 = 1,2,3,-4,0,-12,-13,14, -21,23,0,-24,-31,32,-33,0; int i,j,s = 0; for(i=0;i4;i+) for(j=O;j4;j+) if(ai j =0) continue; s+=a i j; coutsend1; return 0; 执行后的输出结果是( )。(分数:2.
2、00)A.-138B.141C.75D.-12.若有如下程序: #include iostream using namespace std; int main() char *p=“abcdefgh“,*r; long *q; q=(long *)p; q+; r=(char *)q; coutrend1; return 0; 上述程序的输出结果是( )。(分数:2.00)A.abcdefghB.0C.abcdD.efgh3.若有以下程序: #include iostream using namespace std; class Base private: int a,b; public: B
3、ase(int x, int y) a=x; b=y; void disp () couta“ “bend1; ; class Derived : public Base private: int c; int d; public: Derived(int x,int y, int z,int m) :Base(x,y) c=z; d=m; void disp () coutc“ “dend1; ; int main() Base b(5,5),*pb; Derived obj(1,2,3,4); pb= pb-disp(); return 0; 执行程序后的输出结果是( )。(分数:2.00
4、)A.1,2B.3,4C.2,3D.5,54.有以下程序: #include iostream using namespace std; class sample private: int x; public: void setx(int i) x=i; int putx () return x; ; int main ( ) sample *p; sample A3; A0 .setx(5); A1 .setx (6); A2 .setx(7); for (int j=0;j3;j+) p= coutp-putx () “, “; coutend1; return 0; 执行后执行结果是(
5、)。(分数:2.00)A.5,6,7,B.5,5,5,C.6,6,6,D.7,7,7,5.有以下程序: #include iostream using namespace std; class R public: R(int f1,int r2) R1=r1; R2=r2; void print(); void print ()const; private: int R1, R2; ; void R: :print() coutR1“, “R2end1; void R: :print() const coutRl“, “R2end1; int main () R a(5,4); const R
6、 b(20,52); b.print (); return 0; 执行后的输出结果是(分数:2.00)A.5,4B.20,52C.0,0D.4,56.有以下程序: #include iostream using namespace std; int main() int intone; int intone=5; rInt=7; coutintOne“,“rIntend1; return 0; 上述程序执行后的输出结果是( )。(分数:2.00)A.5,7B.7,5C.5,5D.7,77.下列关于构造函数的描述中,错误的是( )。(分数:2.00)A.构造函数可以设置默认参数B.构造函数在定义
7、类对象时自动执行C.构造函数可以是内联函数D.构造函数不可以重载8.下列关于指针运算的描述中,错误的是( )。(分数:2.00)A.在一定条件下,两个指针可以相加B.在一定条件下,两个指针可以进行逻辑判断C.在一定条件下,指针可以为空值D.在一定条件下,两个指针可以相互赋值9.下列变量定义中,合法的是( )。(分数:2.00)A.short_a=1-1e-1;B.doubleb=1+5e2.5;C.long do=0xfdaL;D.float2_and=1-e-3;10.在关系数据库中,用来表示实体之间联系的是( )。(分数:2.00)A.树结构B.网结构C.线形表D.二维表11.下面是“二维
8、向量” vector2D 的定义,其中作为成员函数重载的运算符“+”的功能是将两向量的分量 x 和 y 对应相加,然后返回作为相加结果的新对象。那么应该在横线上填入的语句是( )。 class vector2D private: double x; /x 分量 double y; /y 分量 public: vector2D(double x0=0,double y0=0) :x(x0),y(y0) void show(cout (, y) ; _; ; vector2D : operator + (vector2D a) return vector20(x+a.x,y+a.y); (分数:2
9、.00)A.vector2D operator + (vector2DB.vector2D operator + (vector2D couti; void print() coutiend1; ; class ClassTwo public: ClassTwo(int v=O) i=v;couti; void print() coutiend1; private: ClassOne myObj; int i; ; void main() ClassTwo obj(1); obj.print(); (分数:2.00)A.011B.111C.110D.10114.下列关于 C+运算符结合性的说法
10、中,正确的是( )。(分数:2.00)A.赋值运算符是左结合的B.复合运算符是左结合的C.单目运算符是左结合的D.双目算术运算符是左结合的15.有以下程序: #include iostream #include string using namespace std; class Y; class X private: int x; char *strx; public: X(int a, char *str) x=a; strx=new charstrlen(str)+1; strcpy(strx,str); void show(Y ; class Y private: int y; char
11、 *stry; public: Y(int b,char *str) y=b; stry=new charstrlen(str)+1; strcpy(stry, str); friend void X: :show(Y ; void X: :show(Y coutob, stryend1; int main ( ) X a(10,“X“); Y b (20, “Y“); a. show(B) ; return 0; 执行后的输出结果是( )。(分数:2.00)A.X,YB.a,bC.X,XD.Y,Y16.下面这个程序段的时间复杂度是( )。 for (i=1; in; i+) y=y+1; f
12、or (j=0;j=(2*n);j+) X+; (分数:2.00)A.O(10g2B.O(C.0(nlog2D.O(n2)17.需求分析阶段最后提供的文档是软件的( )。(分数:2.00)A.功能说明书B.加工说明书C.可行性分析报告D.需求规格说明书18.以下过程设计工具不属于图形工具的是( )。(分数:2.00)A.程序流程图B.PADC.HIPOD.PDL19.下列关于虚函数的说法中,正确的是( )。(分数:2.00)A.如果在重定义虚函数时使用了保留字 virtual,则该重定义函数仍然是虚函数B.虚函数不得声明为静态函数C.虚函数不得声明为另一个类的私有函数D.派生类必须重新定义基类
13、的虚函数20.在一个容量为 10 的循环队列中,若头指针为 6,尾指针为 1,则此时该循环队列中共有的元素个数为( )。(分数:2.00)A.4B.5C.6D.721.以下方法不属于结构化分析方法的是( )。(分数:2.00)A.面向数据流的结构化分析方法B.面向数据结构的 Jackson 方法C.面向数据结构的结构化数据系统开发方法D.面向对象的分析方法22.在一个长度为 n 的线性表中插入一个元素,最好情况下需要移动的数据元素数目(分数:2.00)A.0B.1C.nD.n/223.若有以下程序: #include iostream using namespace std; #define
14、PI 3.14 class Point private: int x,y; public: Point(int a,int b) x=a; y=b; int getx() return x; int gety() return y; ; class Circle : public Point private: int r; public: Circle(int a, int b,int c) :Point(a,b) r=c; int getr() return r; double area() return PI*r*r; ; int main() Circle c1(5,7,10); cou
15、tc1.area()end1; return 0; 程序执行后的输出结果是( )。(分数:2.00)A.314B.157C.78.5D.153.8624.下列描述中,表达错误的是( )。(分数:2.00)A.公有继承时基类中的 public 成员在派生类中仍是 public 的B.公有继承时基类中的 private 成员在派生类中仍是 private 的C.公有继承时基类中的 protected 成员在派生类中仍是 protected 的D.私有继承时基类中的 public 成员在派生类中是 private 的25.下列关于静态数据成员的描述中,正确的是( )。(分数:2.00)A.静态数据成
16、员是类的所有对象共享的数据B.类的每个对象都有自己的静态数据成员C.类的不同对象有不同的静态数据成员值D.静态数据成员不能通过类的对象调用26.下列关于对象概念的描述中,错误的是( )。(分数:2.00)A.C+中的对象就是 C 语言中的结构变量B.对象代表着正在创建的系统中的一个实体C.对象是一个状态和操作(或方法)的封装体D.对象之间的信息传递是通过消息进行的27.对建立良好的程序设计风格,下面有关语句结构的描述中,错误的是( )。(分数:2.00)A.在一行内只写一条语句B.程序编写应优先考虑清晰性C.程序编写要做到效率第一,清晰第二D.避免不必要的转移28.有以下程序: #includ
17、e iostream using namespace std; void fun(int i,int j) cout(i+j)end1; void fun(int i) couti+end1; int main() int a=1; fun(A) ; return 0; 该程序执行后的输出结果是( )。(分数:2.00)A.1B.2C.3D.429.VisualFoxPro 是一种( )。(分数:2.00)A.数据库管理系统软件B.操作系统软件C.文字处理软件D.CAD 软件30.t 为 int 类型,进入下面的循环之前,t 的值为 0。 while(t=1) 则以下叙述中,正确的是( )。(
18、分数:2.00)A.循环控制表达式的值为 0B.循环控制表达式的值为 1C.循环控制表达式不合法D.以上说法都不对二、B填空题/B(总题数:14,分数:28.00)31.设有二维数组 A09,019,其每个元素占两个字节,第一个元素的存储地址为 100,若按行优先顺序存储,则元素 A6,6的存储地址为,U 【1】 /U。(分数:2.00)填空项 1:_32.软件工程概念的出现源自U 【2】 /U。(分数:2.00)填空项 1:_33.数据流图的类型有U 【3】 /U和事务型。(分数:2.00)填空项 1:_34.一个学生关系模式为(学号,姓名,班级号,),其中学号为关键词:一个班级关系模式为(
19、班级号,专业,教室,),其中班级号为关键词:则学生关系模式中的外关键词为U 【4】 /U。(分数:2.00)填空项 1:_35.从工程管理的角度来看,软件设计分两步来完成。首先是概要设计,然后是U 【5】 /U。(分数:2.00)填空项 1:_36.函数 YangHui 的功能是把杨辉三角形的数据赋给二位数组的下半三角,形式如下: (分数:2.00)填空项 1:_37.阅读下面程序: #includeiostream using namespace std; long fib(int n) if ( n 2 ) return (fib(n-1)+fib(n-2); else return 2;
20、 int main() coutfib(3)end1; return 0; 则该程序的输出结果应该是U 【8】 /U。(分数:2.00)填空项 1:_38.以下程序的输出结果是U 【9】 /U。 #includeiostream using namespace std; void fun() static int a=0; a+=2; couta; int main() int cc; for(cc=1;cc4;cc+) fun(); coutend1; return 0; (分数:2.00)填空项 1:_39.C+中,设置虚基类的目的是U 【10】 /U。(分数:2.00)填空项 1:_40
21、.C+语言中,派生类继承了基类的全部数据成员和除U 【11】 /U之外的全部函数成员。(分数:2.00)填空项 1:_41.虚函数必须是类的U 【12】 /U。(分数:2.00)填空项 1:_42.有如下程序: #include iostream using namespace std; template typename T T total( T *data) T s=0; while (*data) s+=*data+; return s; int main () int x=2,4,6, 8,0, 12, 14,16, 18 ; couttotal (x); return 0; 执行上面
22、程序的输出结果是U 【13】 /U。(分数:2.00)填空项 1:_43.有以下程序: #include iostream using namespace std; class sample int x; public: void setx(int i) x=i; int putx () return x; ; int main ( ) sample *p; sample A3; A0 .set:(5); A1 .setx(6); A2 .setx(7); for (int j=0;j3;j+) p= coutp-putx () “, “; coutend1; return 0; 执行后的输出
23、结果是U 【14】 /U。(分数:2.00)填空项 1:_44.下面程序的预设功能是:统计文件 abc.txt 中的字符个数。 #include iostream.h #include fstream.h #include stdlib.h void main() fstream file; file.open( “abc.txt“, ios:in); if ( !file ) cout“Can not open abc.txt“end1; abort(); char ch; int i = O; while (_) file.get(ch); i+; cout“Characters : “i
24、end1; file.close(); 则程序中空白处应该填入的语句是U 【15】 /U。(分数:2.00)填空项 1:_二级 C+笔试 13 答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.若有以下程序: #include iostream using namespace std; int main() int a4 4 = 1,2,3,-4,0,-12,-13,14, -21,23,0,-24,-31,32,-33,0; int i,j,s = 0; for(i=0;i4;i+) for(j=O;j4;j+) if(ai j =0)
25、continue; s+=a i j; coutsend1; return 0; 执行后的输出结果是( )。(分数:2.00)A.-138 B.141C.75D.-1解析:解析 本题属于综合题,考查多个方面的知识点。程序首先定义了一个二维数组 a,并初始化其值。在内层 for 循环体中,遇到大于等于 0 的数,就继续执行下次循环,否则就执行“s+=aij”,即把其值累加并保存在变量 s 中。所以本题双重循环的功能是:计算数组中所有负数的累加和,即 s=-138。2.若有如下程序: #include iostream using namespace std; int main() char *p
26、=“abcdefgh“,*r; long *q; q=(long *)p; q+; r=(char *)q; coutrend1; return 0; 上述程序的输出结果是( )。(分数:2.00)A.abcdefghB.0C.abcdD.efgh 解析:解析 本题定义了一个字符型指针变量 p,并通过赋初值让它指向了一个字符串。还定义了另一个字符型指针变量 r 和一个长整型指针变量 q。首先通过语句“q=(long*)p;”,把 p 的地址值强制转换为长整型地址值并赋值给 q,然后执行“q+;”,地址值增加了 4,执行语句“r=(char*)q;”,把长整型指针变量 q 的值再强制转换成字符型
27、地址值并赋给 r,r 的值应为字符串中字符“e”的地址。最后输出r 指向的字符串。3.若有以下程序: #include iostream using namespace std; class Base private: int a,b; public: Base(int x, int y) a=x; b=y; void disp () couta“ “bend1; ; class Derived : public Base private: int c; int d; public: Derived(int x,int y, int z,int m) :Base(x,y) c=z; d=m;
28、void disp () coutc“ “dend1; ; int main() Base b(5,5),*pb; Derived obj(1,2,3,4); pb= pb-disp(); return 0; 执行程序后的输出结果是( )。(分数:2.00)A.1,2 B.3,4C.2,3D.5,5解析:解析 本题考核基类指针的使用。本题首先定义了一个基类 Base 和一个由 Base 派生出来的派生类 Derived。在主函数中,定义了一个基类 Base 指针 pb 和基类对象 b,还定义了派生类 Derived 的对象obj。然后将派生类对象 obj 的地址赋值给指向基类 Base 的指针
29、 pb。由于 Derived 是 Base 的子类型,因此允许上述赋值,但这时指针 pb 只能使用从基类 Base 继承的成员,即当 pb 指向 obj 对象时,pb-disp还是调用基类 Base 的成员函数 disp。所以程序最后输出的对象 d 中对基类成员的初始化值,即 1,2。4.有以下程序: #include iostream using namespace std; class sample private: int x; public: void setx(int i) x=i; int putx () return x; ; int main ( ) sample *p; sa
30、mple A3; A0 .setx(5); A1 .setx (6); A2 .setx(7); for (int j=0;j3;j+) p= coutp-putx () “, “; coutend1; return 0; 执行后执行结果是( )。(分数:2.00)A.5,6,7, B.5,5,5,C.6,6,6,D.7,7,7,解析:解析 对象数组是指数组元素为对象的元素,该数组中的每一个元素都是同一个类的对象。程序中,定义了类 sample 的对象数组 A,并调用各个对象的成员函数给其私有数据成员赋值。然后通过 for循环将其值输出。5.有以下程序: #include iostream u
31、sing namespace std; class R public: R(int f1,int r2) R1=r1; R2=r2; void print(); void print ()const; private: int R1, R2; ; void R: :print() coutR1“, “R2end1; void R: :print() const coutRl“, “R2end1; int main () R a(5,4); const R b(20,52); b.print (); return 0; 执行后的输出结果是(分数:2.00)A.5,4B.20,52 C.0,0D.
32、4,5解析:解析 使用 const 关键词修饰的对象成为常对象,题中对象 b 被声明为类 R 的常对象。使用const 关键词说明的成员函数称为常成员函数,类 R 中用 const 重载了函数 print()。在使用常对象和常成员函数时应注意以下几点: const 是函数类型的一个组成部分,因此在函数部分也要带 const 关键词。 常成员函数不能更新对象的数据成员,也不能调用该类中没有用 const 修饰的成员函数。 如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,不能调用其他的成员函数。 const 关键词可以参与区分重载函数。 本题中,b 为类 R 的常对象,通过 b
33、只能调用类 R 的常成员函数print()输出 20,52。6.有以下程序: #include iostream using namespace std; int main() int intone; int intone=5; rInt=7; coutintOne“,“rIntend1; return 0; 上述程序执行后的输出结果是( )。(分数:2.00)A.5,7B.7,5C.5,5D.7,7 解析:解析 程序中,引用 rim 用 intone 初始化以后,无论改变 intOne 还是 rInt,实际上都是intone,两者的值是一样的。所以执行语句“rInt=7;”后,整型变量 in
34、tOne、 rInt 的值都被置为 7。7.下列关于构造函数的描述中,错误的是( )。(分数:2.00)A.构造函数可以设置默认参数B.构造函数在定义类对象时自动执行C.构造函数可以是内联函数D.构造函数不可以重载 解析:解析 构造函数是类的一个特殊成员函数,它与类同名,并且没有返回值。C+在创建一个对象时,会自动调用类的构造函数,在构造函数中可以执行初始化成员变量的操作。构造函数可以是内联函数,也可以重载。8.下列关于指针运算的描述中,错误的是( )。(分数:2.00)A.在一定条件下,两个指针可以相加 B.在一定条件下,两个指针可以进行逻辑判断C.在一定条件下,指针可以为空值D.在一定条件
35、下,两个指针可以相互赋值解析:解析 本题考核指针的赋值和运算。在 C+语言中,指针可以进行赋值运算、算术运算、比较运算(逻辑判断)。但是在任何条件下,两个指针都不能允许相加。因为地址相加后可能会对内存进行不合法的访问。所以选项 A 的描述是错误的。9.下列变量定义中,合法的是( )。(分数:2.00)A.short_a=1-1e-1;B.doubleb=1+5e2.5; C.long do=0xfdaL;D.float2_and=1-e-3;解析:解析 本题考核变量名的定义和赋值。在选项 A 中,把实型表达式作为初值赋给整型变量,显然是非法的。在选项 C 中,使用了 C+保留字 do 作为变量
36、名,是错误的。在选项 D 中,表达式中的标识符 2 and 是非法的。10.在关系数据库中,用来表示实体之间联系的是( )。(分数:2.00)A.树结构B.网结构C.线形表D.二维表 解析:解析 数据库中的关系模型是采用二维表来表示实体与实体之间的联系。11.下面是“二维向量” vector2D 的定义,其中作为成员函数重载的运算符“+”的功能是将两向量的分量 x 和 y 对应相加,然后返回作为相加结果的新对象。那么应该在横线上填入的语句是( )。 class vector2D private: double x; /x 分量 double y; /y 分量 public: vector2D(
37、double x0=0,double y0=0) :x(x0),y(y0) void show(cout (, y) ; _; ; vector2D : operator + (vector2D a) return vector20(x+a.x,y+a.y); (分数:2.00)A.vector2D operator + (vector2D B.vector2D operator + (vector2D couti; void print() coutiend1; ; class ClassTwo public: ClassTwo(int v=O) i=v;couti; void print(
38、) coutiend1; private: ClassOne myObj; int i; ; void main() ClassTwo obj(1); obj.print(); (分数:2.00)A.011 B.111C.110D.101解析:解析 类 ClassTwo 中定义了成员对象 myObj,所以在构造类 ClassTwo 的对象 obj 时会先调用类ClassOne 的构造函数输出 0,然后调用 ClassTwo 的构造函数输出 1。主函数最后调用 obj 的成员函数print()输出 1。所以最后结果为 011。14.下列关于 C+运算符结合性的说法中,正确的是( )。(分数:2.
39、00)A.赋值运算符是左结合的B.复合运算符是左结合的C.单目运算符是左结合的D.双目算术运算符是左结合的 解析:解析 运算符的结合方式有两种:左结合和右结合。左结合表示运算符优先与其左边的标识符结合进行运算,如加法:右结合表示运算符优先与其右边的标识符结合,如单目算术运算符+和。赋值运算符、复合运算符和单目运算符都是右结合的。双目算术运算符是左结合的,所以只有选项 D 是正确的。15.有以下程序: #include iostream #include string using namespace std; class Y; class X private: int x; char *strx
40、; public: X(int a, char *str) x=a; strx=new charstrlen(str)+1; strcpy(strx,str); void show(Y ; class Y private: int y; char *stry; public: Y(int b,char *str) y=b; stry=new charstrlen(str)+1; strcpy(stry, str); friend void X: :show(Y ; void X: :show(Y coutob, stryend1; int main ( ) X a(10,“X“); Y b (
41、20, “Y“); a. show(B) ; return 0; 执行后的输出结果是( )。(分数:2.00)A.X,Y B.a,bC.X,XD.Y,Y解析:解析 本题考核类的定义和友元函数的应用。 该程序中,类 X 的成员函数 show()在类 Y 中说明为友元,因此,在该友元成员 show()中可以访问类 Y 的私有成员 stry。 成员函数 show()的功能就是输出类 X 的私有成员 strx 和 Y 对象 ob 的私有成员 stry, 主函数 main()中定义了 X 类的一个对象a 和 Y 类的一个对象 b,并且都进行了初始化。然后调用对象 a 的成员函数 show,输出对象 a
42、中私有成员strx 中的内容和对象 b 中私有成员 stry 中的内容,即字符串 stringX 和 stringY。16.下面这个程序段的时间复杂度是( )。 for (i=1; in; i+) y=y+1; for (j=0;j=(2*n);j+) X+; (分数:2.00)A.O(10g2B.O(C.0(nlog2D.O(n2) 解析:解析 语句的频度指的是该语句重复执行的次数。一个算法中所有语句的频度之和构成了该算法的运行时间。在本例算法中,其中语句“y=y+1;”的频度是 n-1,语句“x+;”的频度是(n-1)(2n+1)=2n 2-n-1, 则该程序段的时间复杂度是 T(n)=n
43、-1+2n 2-n-1=O(n2)。17.需求分析阶段最后提供的文档是软件的( )。(分数:2.00)A.功能说明书B.加工说明书C.可行性分析报告D.需求规格说明书 解析:解析 选项 A、B、C 都是需求分析阶段前段时间的文档。需求分析阶段最后成果就是软件需求规格说明书,它是软件开发的重要文档之一。18.以下过程设计工具不属于图形工具的是( )。(分数:2.00)A.程序流程图B.PADC.HIPOD.PDL 解析:解析 常用的过程设计工具有图形工具、表格工具和语言工具,其中图形工具包括:程序流程图、N-S、PAD、HIPO:表格工具有判定表:语言工具有 PDL(伪码)。19.下列关于虚函数
44、的说法中,正确的是( )。(分数:2.00)A.如果在重定义虚函数时使用了保留字 virtual,则该重定义函数仍然是虚函数B.虚函数不得声明为静态函数 C.虚函数不得声明为另一个类的私有函数D.派生类必须重新定义基类的虚函数解析:解析 使用虚函数时必须注意下列事项: 只有类的成员函数才能说明为虚函数。这是因为虚函数仅适用于有继承关系的类对象,所以普通函数不能说明为虚函数。 静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。 内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。 构造函数不能是虚函数,因为构造时对象还是
45、一片未定型的空间。只有在构造完成后,对象才能成为一个类的名副其实的实例。 析构函数可以是虚函数,而且通常说明为虚函数。说明虚函数的目的在于;使用 delete 运算符删除一个对象时,能确保析构函数被正确地执行。这是因为设置虚析构函数后,可以利用动态联编方式选择析构函数。一般要求基类中说明了虚函数后,派生类说明的虚函数应该与基类中虚函数的参数个数相等,对应参数的类型相同。如果不相同,则将派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。20.在一个容量为 10 的循环队列中,若头指针为 6,尾指针为 1,则此时该循环队列中共有的元素个数为( )。(分数:2.00)A.4B.5 C.6D.7解析:解析 题中队列为循环队列,由于尾指针为 1 比头指针小,说明尾指针已移动到 (10+1),即 11处,所以此时队列中元素个数为 11-6=5。21.以下方法不属于结构化分析方法的是( )。(分数:2.00)A.面向数据流的结构化分析方法B.面向数据结构的 Jackson 方法C.面向数据结构的结构化数据系统开发方法D.面向对象的分析方法 解析:解析 常见的需求分析方法有:结构化分析方法和面向对象的分析方法。其中结构化分析方法包括面向数