1、国家二级( C+)机试模拟试卷 162及答案与解析 一、选择题 1 程序流程图中带有箭头的线段表示的是 ( )。 ( A)图元关系 ( B)数据流 ( C)控制流 ( D)调用关系 2 结构化程序设计的基本原则不包括 ( )。 ( A)多态性 ( B)自顶向下 ( C)模块化 ( D)逐步求精 3 软件设计中模块划分应遵循的准则是 ( )。 ( A)低内聚低耦合 ( B)高内聚低耦合 ( C)低内聚高耦合 ( D)高内聚高耦合 4 在软件开发中,需求分析阶段产生的主要文档是 ( )。 ( A)可行性分析报告 ( B)软件需求规格说明书 ( C)概要设计说明书 ( D)集成测试计划 5 算法的有
2、穷性是指 ( )。 ( A)算法程序的运行时间是有限的 ( B)算法程序所处理的数据量是有限的 ( C)算法程序的长度是有限的 ( D)算法只能被有限的用户使用 6 对长度为 n的线性表排序,在最坏情况下,比较次数不是 n(n-1) 2的排序方法是 ( )。 ( A)快速排序 ( B)冒泡排序 ( C)直接插入排序 ( D)堆排序 7 下列关于栈的叙述正确的是 ( )。 ( A)栈按 “先进先出 ”组织数据 ( B)栈按 “先进后出 ”组织数据 ( C)只能在栈底插入数据 ( D)不能删除数据 8 在数据库设计中,将 E-R图转换成关系数据模型的过程属于 ( )。 ( A)需求分析阶段 ( B
3、)概念设计阶段 ( C)逻辑设计阶段 ( D)物理设计阶段 9 有三个关系 R、 S和 T如下: 由关系R和 S通过运算得到关系 T,则所使用的运算为 ( )。 ( A)并 ( B)自然连接 ( C)笛卡尔积 ( D)交 10 设有表示学生选课的三张表,学生 S(学号,姓名,性别,年龄,身份证 号 ),课程 C(课号,课名 ),选课 SC(学号,课号,成绩 ),则表 SC的关键字 (键或码 )为( )。 ( A)课号,成绩 ( B)学号,成绩 ( C)学号,课号 ( D)学号,姓名,成绩 11 下列语句中,错误的是 ( )。 ( A) const int buffer=256; ( B) co
4、nst int temp; ( C) const double*point; ( D) const double*=new double(5 5); 12 有如下程序: int x=3: do x-=2: cout x; while(!(-x); 执行这个程序的输出结果是 ( )。 ( A) 1 ( B) 3 0 ( C) 1-2 ( D)死循环 13 有如下程序: #include iostream using namespace std; int main() int*p; *p=9; cout “The value at p: “ *p; return0: 编译运行程序将出现的情况是 (
5、 )。 ( A)编译时出现语法错误,不能生成可执行文件 ( B)运行时一定输出: The value atp: 9 ( C)运行时一定输出: The value at p: *9 ( D)运行时有可能出错 14 if语句的语法格式可描述为: 格式 1: if(条件 )语句 或 格式 2: if(条件 )语句 1 else语句 2 关于上面的语法格式,下列表述中错误的是 ( )。 ( A)条件部分可以是一个 if语句,例如 if(if(a=0) ( B)语句部分可以是一个 if语句,例如 if()if() ( C)如果在条件前加上逻辑非运算符 !并交换语句 1和语句 2的位置,语句功 能不变 (
6、 D)语句部分可以是一个循环语句,例如 if()while() 15 下列符号中,正确的 C+标识符是 ( )。 ( A) enum ( B) 2b ( C) foo-9 ( D) _32 16 下列关于 C+函数的说明中,正确的是 ( )。 ( A)内联函数就是定义在另一个函数体内部的函数 ( B)函数体的最后一条语句必须是 return语句 ( C)标准 C+要求在调用一个函数之前,必须先声明其原型 ( D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 17 运算符重载是对已有的运算符赋予多重含义,因此 ( )。 ( A)可以对基本类型 (如 int类型 )的数据,重新定义
7、 “+”运算符的含义 ( B)可以改变一个已有运算符的优先级和操作数个数 ( C)只能重载 C+中已经有的运算符,不能定义新运算符 ( D) C+中已经有的所有运算符都可以重载 18 下列有关内联函数的叙述中,正确的是 ( )。 ( A)内联函数在调用时发生控制转移 ( B)内联函数必须通过关键字 inline来定义 ( C)内联函数是通过编译器来实现的 ( D)内联函数函数体的最后一条语句 必须是 return语句 19 下列运算符不能重载为友元函数的是 ( )。 ( A) =()( ) - ( B) + - + - ( C) = = ( D) += -= *= = 20 有如下程序: #i
8、nclude iostream using namespace std; int main() void function(double val); double val; function(val); cout val: return0; void function(double val) val=3; 编译运行这个程序将出现的情况是 ( )。 ( A)编译出错,无法运行 ( B)输出: 3 ( C)输出: 3 0 ( D)输出一个不确定的数 21 下面是重载为非成员函数的运算符的函数原型,其中错误的是 ( )。 ( A) Fraction operator+(Fraction, Fract
9、ion); ( B) Fraction operator-(Fraction); ( C) Fraction& operator=(Fraction&, Fraction); ( D) Fraction& operator+=(Fraction&, Fraction); 22 有如下类定义: clas MyClass public: _ private: in tdata; ; 若要为 MyClass类重载流输入运算符 “ ”,使得程序中可以 “cin obj; ”的形式改变 MyClass类的对象 obj中数据成员 data的值,则横线处的声明语句应为( )。 ( A) friend ist
10、ream& operator (istream& is, MyClass& a); ( B) friend istream& operator (istream& is, MyClass a); ( C) istream& operator (istream& is, MyClass& a); ( D) istream& operator (istream& is, MyClass a); 23 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员都 是常成员 ( D)通过常对象可以调用任何不改变对象值的成
11、员函数 24 有如下类定义: class AA int a; public: int getRef()constreturn &a; int getValue()constreturn a; void set(int n)consta=n; friend void show(AA aa)constcout a; ; 其中四个函数的定义中正确的是 ( )。 ( A) ( B) ( C) ( D) 25 下列关于 this指针的描述中,正确的是 ( )。 ( A)类的成员函数都有 this指针 ( B)类的友元函数都有 this指针 ( C)任何与类相关的函数都有 this指针 ( D)类的非静态
12、成员函数都有 this指针 26 下列关于虚函数的说明中,正确的是 ( )。 ( A)从虚基类继承的函数都是虚函数 ( B)虚函数不得是静态成员函数 ( C)只能通过指针或引用调用虚函数 ( D)抽象类中的成员函数都是虚函数 27 下列关于基类和派生类关系的叙述中,正确的是 ( )。 ( A)每个类最多只能有一个直接基类 ( B)派生类中的成员可以访问基类中的任何成员 ( C)基类的构造函数必须在派生类的构造函数体中调用 ( D)派生类除了继承基类的成员,还可以定义新的成员 28 有如下类定义: class B public: void fun1() private: void fun2()
13、protected: void fun3() ; class D: public B protected: void fun4() ; 若 obj是类 D的对象,则下列语句中不违反访问 控制权限的是 ( )。 ( A) obj fun1(); ( B) obj fun2(); ( C) obj fun3(); ( D) obj fun4(); 29 有如下类定义: class Foo public: Foo(int v): value(v) Foo() private: Foo() int value=0; ; 其中存在语法错误的行是 ( )。 ( A) ( B) ( C) ( D) 30 有
14、如下类定义: class Point int XX, YY; public: Point(): xx(0), yy(0) Point(int x, int y=0): xx(x), yy(y) ; 若执行语句 Point a(2), b3, *c4; 则 Point类的构造函数被调用的次数是 ( )。 ( A) 2次 ( B) 3次 ( C) 4次 ( D) 5次 31 有如下类定义: class Test public: Test()a=0; c=0; int f(int a)constthis- a=a; static int g()return a; void h(int b)Test:
15、 b=b; ; private: int a; static int b; const int c; ; int Test: b=0: 在标注号码的行中,能被正确编译的是 ( )。 ( A) ( B) ( C) ( D) 32 有如下类声明: class SAMPLE int n; public: SAMPLE(int i=0): n(i) void setValue(int n0); ; 下列关于 getValue成员函数的定义中,正确的是 ( )。 ( A) SAMPLE: setValue(int n0)n=n0; ( B) void SAMPLE: setValue(int n0)n:
16、 n0; ( C) void setValue(int n0)n=n0; ( D) setValue(int n0)n=n0; 33 有如下程序: #include iostream using namespace std; class A public: A()cout “A“; A()cout “ A“: ; class B: public A A*p; public: B()cout “B“; P=new A(); B()cout “ B“; delete p; ; int main() B obj; return0; 执行这个程序的输出结果是 ( )。 ( A) BAA A B A (
17、 B) ABA B A A ( C) BAA B A A ( D) ABA A B A 34 有如下程序: #include iostream using namespace std; class Base private: void fun1()constcout “fun1“; protected: void fun2()constcout “fun2“; public: void fun3()constcout “fun3“; ; class Derived: protected Base public: void fun4()constcout “fun4“; ; int main()
18、 Derived obj; obj fun1(); obj fun2(); obj fun3(); obj fun4(); return0; 其中有语法错误的语句是 ( )。 ( A) ( B) ( C) ( D) 35 有如下程序: #include iostream using namespace std; class Base1 public: Basel(int d)cout d; Basel() ; class Base2 public: Base2(int d)cout d; Base2() ; class Derived: public Base1, Base2 public:
19、Derived(int a, int b, int c, int d): Base1(b), Base2(a), b1(d), b2(c) private: int b1; int b2; ; int main() Derived d(1, 2, 3, 4); return0; 执行这个程序的输出结果是 ( )。 ( A) 1234 ( B) 2134 ( C) 12 ( D) 21 36 有如下程序: #include iostream using namespace std; class Base public: void fun1()cout “Base n“; virtual void
20、 fun2()cout “Base n“; ; class Derived: public Base public: void fun1()cout “Derived n“; void fun2()cout “Derived n“; ; void f(Base& b)b fun1(); b fun2(); int main() Derived obj; f(obj); return0; 执行这个程序的输出结果是 ( )。 ( A) Base Base ( B) Base Derived ( C) Derived Base ( D) Derived Derived 37 模板对类型的参数化提供了
21、很好的支持,因此 ( )。 ( A)类模板的主要作用是生成抽象类 ( B)类模板实例化时,编译器将根据给出的模板实参生成一个类 ( C)在类模 板中的数据成员都具有同样类型 ( D)类模板中的成员函数都没有返回值 38 有如下函数模板: template typename T, typename U T cast(U u)return u; 其功能是将 U类型数据转换为 T类型数据。已知 i为 int型变量,下列对模板函数cast的调用中正确的是 ( )。 ( A) east(i); ( B) east (i); ( C) east char*, int (i); ( D) cast doub
22、le, int (i); 39 要建立文件流并打开当前目录 下的文件 file dat用于输入,下列语句中错误的是 ( )。 ( A) ifstream fin=ifstream open(“file dat“); ( B) ifstream*fin=new ifstream(“file dat“); ( C) ifstream fin; fin open(“file dat“); ( D) ifstream*fin=new ifstream(); fin- open(“file dat“); 40 当使用 ifstream流类定义一个流对象并打开一个磁盘文件时,文件的默认 打开方式为 ( )
23、。 ( A) ios_base: in ( B) ios_base: in|ios_base: out ( C) ios_base: out ( D) ios_base: in & ios_base: out 二、基本操作题 41 请使用 VC6或使用【答题】菜单打开考生文件夹 proj1下的工程 proj1,此工程中包含一个源程序文件 main cpp,其中有类 Book(“书 ”)和主函数 main的定义。程序中位于每个 “ ERROR*found*”下的语句行有错误,请加以改正。改正 后程序的输出结果应该是: 书名: C+语句程序设计总页数: 299 已把 “C+语言程序设计 ”翻到第
24、50页 已把 “C+语言程序设计 ”翻到第 51页 已把 “C+语言程序设计 ”翻到第 52页 已把 “C+语言程序设计 ”翻到第 51页 已把书合上。 当前页: 0 注意:只修改每个 “ ERROR*found*”下的那一行,不要改动程序中的其他内容。 #include iostream using namespace std; class Book char*title; int num_pages; 页数 int cur_page;当前打开页面的页码, 0表示书未打开 public: ERROR*found* Book(const char *theTitle, int pages)nu
25、m_pages(pages) title=new charstrlen(theTitle)+1; strcpy(title, theTitle); cout endl “书名: “ title “总页数: “ num_pages; Book()deletetitle; bool isClosed()constreturn cur_page=0; 书合上时返回 true,否则返回 false bool isOpen()constreturn! isClosed(); 书打开时返回 true,否则返回 false mt numOfPages()constreturn num_pages; 返回书的
26、页数 int currentPage()constreturn cur_page; 返回打开页面的页码 ERROR*found* void openAtPage(int page_no)const把书翻到指定页 cout endl: if(page_no 1|page_no num_pages) cout “无法翻到第 “ cur_page “页。 “; close(); else cur_page=page_no; cout ”已把 “ title “”翻到第 “ cur_page “页 “; void openAtPrevPage()openAtPage(cur_page-1); 把书翻到
27、上一页 void openAtNextPage()openAtPage(cur_page+1); 把书翻到下一页 void close()把书合上 cout endl: if(isClosed() cout “书是合上的。 “; else ERROR*found* num_pages=0; cout “已把书合上。 “; cout endl: ; int main() Book book(“C+语言程序设计 “, 299); book openAtPage(50); book openAtNextPage(); book openAtNextPage(); book openAtPrevPag
28、e(); book close(); cout “当前页: “ book currentPage() endl; return0; 三、简单应用题 42 使用 VC6打开考生文件夹 proj2下的工程 proj2,其中有元素类 Element和队列类 Queue的定义。请在程序中的横线处填写适当的代码,然后删除横线,以实现上述类 定义。此程序的输出结果应为: 3850 507 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容。 #include iostream #include cmath #include cstdliti using nameespace std: #defin
29、e MaxLength100 class Element “元素 ”类 public: int n; Element(int i=0): n(i) ; class Queue “队列 ”类 Element*element;指向 存储元素的数组的指针 int tail;队尾元素的下标 public: Queue(): element(new Element100), tail(-1) Queue()deleteelement; void push(Element ele);在队列尾端添加一个元素 Element pop();在队列首端删除一个元素,返回被删元素 Element front()co
30、nstreturn element0; 返回队首元素,但不从队列中删除该元素 *found* int size()constreturn(_); 返回元素个数 void show()const;显示集合中所有元素 ; void Queue: push(Element ele) if(tail=MaxLength-1)return;空间满,不做任何处理 *found* _; Element Queue: pop() if(size()=0)exit(1);队列空,不做任何处理 Element tmp=element0; for(int i=0; i tail; i+) elementi=elem
31、enti+1; *found* _; return tmp; void Queue: show()const *found* for(_) cout elementi n ; cout endl: int main() Queue q; q push(3); q push(8); q push(5); q push(0); q show(); q pop(); q poP(); q push(7); q show(); return0; 四、综合应用题 43 请使用 VC6或使用【答题】菜单打开考生文件夹 proj3下的工程 proj3,其中包含了类 IntegerSet和主函数 main的定
32、义。一个 IntegerSet对象就是一个整数的集合,其中包含 0个或多个无重复的整数;为了便于进行集合操作,这些整数按升序存放在成员数组 elem的前若干单元中。成员函数 add的作用是将一个元素添加到集合中 (如果集合中不存在该元素 ),成员函数 remove从集合中删除指定的元素 (如果集合中存在该元素 )。请编写成员函数 remove。在 main函数中给出了一组测试数据,此时程序的正确输出结果应为: 2 3 4 5 27 28 31 66 75 2 3 4 5 6 27 28 31 66 75 2 3 4 5 6 19 27 28 31 66 75 3 4 5 6 19 27 28
33、31 66 75 3 4 5 6 19 27 28 31 66 75 要求: 补充编制的内容写在 “ *333*”与 “*666*”之间,不得修改程序的其他部分。 注意:程序最后将结果输出到文件 out dat中。输出函数 WriteToFile已经编译为obj文件,并且在本程序中调用。 IntegorSet h #ifndef INTEGERSET #define INTEGERSET #include iostream using namespace std; const int MAXELEMENTS=100; 集合最多可拥有的元素个数 class IntegerSet int elem
34、MAXELEMENTS; 用于存放集合元素的数组 int counter;用于记录集合中元素个数的计数器 public: IntegerSet(): counter(0) 创建一个空集合 IntegerSet(int data, int size); 利用数组提供的数据创建一个整数集合 void add(int element); 添加一个元素到集合中 void remove(int element); 删除集合中指定的元素 int getCount()constreturn counter; 返回集合中元素的个数 int getElement(int i)constreturn elemi;
35、 返回集合中指定的元素 void show()const; ; void WriteToFile(char*); #endif main cpp #include“IntegerSet h“ #include iomanip IntegerSet: IntegerSet(int data, int size): counter(0) for(int i=0; i size; i+) add(datai); void IntegerSet: add(int element) int j; 从后往前寻找第一个小于等于 element的元素 for(j=counter; j 0; j-) if(el
36、ement =elemj-1)break; 如果找到的是等于 element的元素,说明要添加的元素已经存在,直接返回 if(j 0) if(element=elemj-1)return; 如果找到的是小于 element的元素, j就是要添加的位置 该元素及其后面的元素依次后移,腾出插入位置 for(int k=counter; k j; k-) elemk=elemk-1; elemj=element;将 element插入到该位置 counter+;计数器加 1 void IntegerSet: remove(int element) *333* *666* void IntegerSe
37、t: show()const for(int i=0; i getCount(); i+) cout setw(4) getElement(i); cout endl: int main() int d=5, 28, 2, 4, 5, 3, 2, 75, 27, 66, 31; IntegerSet s(d, 11); s show(); s add(6); s show(); s add(19); s show(); s remove(2); s show(); s add(4); s show(); WriteTOFile(“ “); return0; 国家二级( C+)机试模拟试卷 16
38、2答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用标有名字的箭头表示控制流。所以选择 C。 2 【正确答案】 A 【试题解析】 结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用 goto语句,所以选择 A。 3 【正确答案】 B 【试题解析】 软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。 4 【正确答案】
39、 B 【试题解析】 A错误,可行性分析阶段产生可行性分析 报告。 C错误,概要设计说明书是总体设计阶段产生的文档。 D错误,集成测试计划是在概要设计阶段编写的文档。 B正确,软件需求规格说明书是后续工作如设计、编码等需要的重要参考文档。 5 【正确答案】 A 【试题解析】 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。有穷性是指算法程序的运行时间是有限的。 6 【正确答案】 D 【试题解析】 除了堆排序算法的比较次数是 O(nlog2n),其他的都是 n(n-1) 2。 7 【正确答案】 B 【试题解析】 栈是按 “先进后出 ”的原则组织数据的,数据的插入和删除都在栈顶进行
40、操作。 8 【正确答案】 C 【试题解析】 ER图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。 9 【正确答案】 D 【试题解析】 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以 B错误。笛卡尔积是用 R集合中元素为第一元素, S集合中元素为第二元素构成的有序对,所以 C错误。根据关系 T可以很明显地看出是从关系 R与关系 S中取得相同的 关系组所以取得是交运算,选择 D。 10 【正确答案】 C 【试题解析】 学号是学生表 s的主键,课号是课程表 C的主键,所以选课表 SC的
41、关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择 C。 11 【正确答案】 B 【试题解析】 const是一个 C+语言的关键字,它限定一个变量不允许被改变。使用 const在一定程度上可以提高程序的安全性和可靠性。限定符声明变量只能被读,必须初始化。 B选项中没有初始化, C选项为指向常量的指针,定义时初始化与否均可,如果是 const*double point形式,则为常指针,必须在定义时进行初始化, A、 C、 D都正确。 12 【正确答案】 C 【试题解析】 本题考查 dowhile 语句,执行 dowhile 语句时,先执行循环体内的语句,然后判断 while中
42、表达式的值,表达式为非零时,返回重新执行循环体语句。在本题中,先执行循环体内的语句,输出 1,然后判断表达式,为非零,且此时 x为 0;再次执行循环体时,输出 -2,然后判断表达式为 0,不执行,退出,所以答案为 C。 13 【正确答案】 D 【试题解析】 先定义指针变量,然后给指针变 量赋初值有三种情况: 用取地址运算符 “&”将变量地址赋给指针变量,如 p=&a; 将一个指针变量中的地址赋给另一个指针变量,如 p=p1; 给指针变量赋空值 0,如 q=0,表示该指针变量不指向任何变量。而不能用一个常量给指针变量赋初值,所以本题选 D。 14 【正确答案】 A 【试题解析】 本题考查 if语
43、句, if语句的条件部分不能嵌套 if语句,所以 A选项错误; B选项就是 if语句嵌套; C选项其实就是将判断条件颠倒,然后执行语句也颠倒,所以效果一样; D选项也正确。 15 【正确答案】 D 【试 题解析】 本题考查 C+标识符的命名规则,规定如下: 所有标识符可以由字母、数字和下画线组成,且必须以字母或下画线开头; C+的关键字不能作为标识符; 大、小写字母表示不同意义,即代表不同的标识符,如 mun和 Mun。 A选项是C+的关键字, B选项不能以数字开头, C选项 “一 ”不能用于组成标识符。 16 【正确答案】 C 【试题解析】 一般函数进行调用时,要将程序执行权转到被调用函数中
44、,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,而不是在定义在另一个函数体 内,所以 A选项错误。函数可以没有返回值,所以就不需要 return了,如果被调函数在调用函数之前已经定义,那么就不需要声明,所以 C选项错误,正确选项为 D。 17 【正确答案】 C 【试题解析】 重载运算符的规则如下: C+不允许用户自己定义新的运算符,只能对已有的 C+运算符进行重载; C+不能重载的运算符只有 5个; 重载不能改变运算符运算对象的个数; 重载不能改变运算符的优先级和结合性; 重载运算符的函数不能有默认的参数; 重载的运算符必须和用户定义的自定义类型的对象一起使
45、用,至少 应有一个是类对象,即不允许参数全部是 C+的标准类型。故本题答案为 C。 18 【正确答案】 C 【试题解析】 一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换,所以在调用时不发生控制转移。在类内部实现的函数都是内联函数,可以不用 inline定义;只有函数外部定义的内联函数才必须加关键字 inline。编译系统并非对内联函数必须使用内联,而且根据具体情况决定。内联函数不是必须要有返回值的。 19 【正确答案】 A 【试题解析】 关于运算符重载为友元函数有如下规定: 一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数; 双目运算符 “=、 ()、 、 - ”不能重载为类的友元函数。所以本题答案为 A。 20 【正确答案】 D 【试题解析】 本题考查函数调用及传值方式传递参数,执行函数 funetion时,并没有将 3的值传回来,而 val又没有初始化,所以会输出一个不确定的值, D选项正确。 21 【正确答案】 C 【试题解析】 本题考查四种运算符作为非成员函数的重载的使用 方法,根据重载规则,本题答案为 C, C项正