1、国家二级(C+)机试模拟试卷 170 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列叙述中正确的是( )。(分数:2.00)A.栈是“先进先出”的线性表B.队列是“先进后出”的线性表C.循环队列是非线性结构D.有序线性表既可以采用顺序存储结构,也可以采用链式存储结构2.支持子程序调用的数据结构是( )。(分数:2.00)A.栈B.树C.队列D.二叉树3.某二叉树有 5 个度为 2 的结点,则该二叉树中的叶子结点数是( )。(分数:2.00)A.10B.8C.6D.44.下列排序方法中,最坏情况下比较次数最少的是( )。(分数:2.00)
2、A.冒泡排序B.简单选择排序C.直接插入排序D.堆排序5.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是( )。(分数:2.00)A.编译程序B.操作系统C.教务管理系统D.汇编程序6.下面叙述中错误的是( )。(分数:2.00)A.软件测试的目的是发现错误并改正错误B.对被调试的程序进行“错误定位”是程序调试的必要步骤C.程序调试通常也称为 DebugD.软件测试应严格执行测试计划,排除测试的随意性7.耦合性和内聚性是对模块独立性度量的两个标准。下列叙述中正确的是( )。(分数:2.00)A.提高耦合性降低内聚性有利于提高模块的独立性B.降低耦合性提高内
3、聚性有利于提高模块的独立性C.耦合性是指一个模块内部各个元素间彼此结合的紧密程度D.内聚性是指模块间互相连接的紧密程度8.数据库应用系统中的核心问题是( )。(分数:2.00)A.数据库设计B.数据库系统设计C.数据库维护D.数据库管理员培训9.有两个关系 R,S 如下: (分数:2.00)A.选择B.投影C.插入D.连接10.将 ER 图转换为关系模式时,实体和联系都可以表示为( )。(分数:2.00)A.属性B.键C.关系D.域11.字面常量 42、42、42L 的数据类型分别是( )。(分数:2.00)A.long、double、intB.long、float、intC.int、doub
4、le、longD.int、float、long12.执行下列语句段后,输出字符“,一 c”的个数是( )。 for(int i=50;i1;-i) cout1;-i) coutcolor=color; (2)const char getName()cons return*name; (3)Dog dogl(“Hoho“,WHITE),dog2(“Haha“,BLACK),dog3(“Hihi“,OTHER);)解析:解析:(1)主要考查考生对 strcpy 函数的掌握,如果看到上一条语句 strcpy(this-name,name);,就以为本条语句也要用 strcpy 函数来赋值,这是错误的
5、。strcpy 函数只能复制字符串,根据类的私有成员声明可知,color 是 DOGCOLOR 型的,这里直接使用赋值语句“=”即可。 (2)主要考查考生对函数返回值的掌握,先解读语句 const char*getName()constreturn*name;,要返回的是一个 const 的字符指针,同时函数内的值不能改变,name 在类的私有成员声明中是个字符数组,*name 代表字符数组而不是字符指针,问题就出来了,需要修改返回类型:const char getName()constreturn*nalne;。 (3)语法错误,定义变量时,变量之间应使用“,”分开。三、简单应用题(总题数:
6、1,分数:2.00)42.请使用 VC6 或使用【答题】菜单打开考生文件夹 proj2 下的工程 proj2,该工程中包含一个程序文件maincpp,其中有日期类 Date、人员类 Person 及排序函数 sortByName 和主函数 main 的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为: 按姓名排序 排序前: 张三 男 出生日期:1978 年 4 月 20 日 王五 女 出生日期:1965 年 8 月 3 日 杨六 女 出生日期:1965 年 9 月 5 日 李四 男 出生日期:1973 年 5 月 30 日 排序后: 李四
7、男 出生日期:1973 年 5 月 30 日 王五 女 出生日期:1965 年 8 月 3 日 杨六 女 出生日期:1965 年 9 月 5 日 张三 男 出生日期:1978 年 4 月 20 日 注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“*found*”。 #includeiostream using namespace std; class Date 日期类 int year,month,day;年、月、日 public: Date(int year,int month,int day):year(year),month(month),day(day)
8、int getYear()constreturn year; int getMonth()constreturn month; int getDay()constreturn day; ; class Person 人员类 char name14;姓名 bool is_male;性别,为 true 时表示男性 Date birth_date;出生日期 public: Person(char*name,bool is_male,Date birth_date) *found* :_ strcpy(this-name,name); const char*getName()constreturn n
9、ame; bool isMale()constreturn is_male; Date getBirthdate()constreturn birth_date; 利用strcmp()函数比较姓名,返回一个正数、0 或负数,分别表示大于、等于、小于 int compareName(const Person&p)const *found* _ void show() toutendl: coutname(is_male?“男“:“女“)“出生日期:“birth_dategetYear()“年“显示出生年 *found* 显示出生月 birth_dategetDay()“日“;显示出生日 ; vo
10、id sortByName(Person ps,int size) 将人员数组按姓名排列为升序 for(int i=0;isize-1;i+) 采用选择排序算法 int m=i; for(int j=i+1;jsize;j+) if(psijcompareName(psm)0) m=j; if(mi) Person p=psm; ps m=ps1; psi=p; int main() Person staff= Person(“张三“,true,Date(1978,4,20),Person(“王五“,false,Date(1965,8,3), Person(“杨六“,false,Date(19
11、65,9,5), Person(“李四“,true,Date(1973,5,30) ; const int size=sizeof(staff)sizeof(staff0); int i; coutendl“按姓名排序“; coutendl“排序前:“; for(i=0;isize;i+)staffishow(); sortByName(staff,size); coutendlendl“排序后:“; for(i=0;isize;i+)staffishow(); coutendl: return 0; (分数:2.00)_正确答案:(正确答案:(1)is_male(is_male),birth
12、_date(birth_date) (2)return strcmp(name,p-getName(); (3)name,name);可知,要使用成员列表初始化的成员为 is_male 和 birth_date。 (2)主要考查考生对 strcmp()函数的掌握,先看程序对该函数的功能要求:利用 strcmp()函数比较姓名,返回一个正数、0 或负数,分别表示大于、等于、小于。因为 strcmp()函数的功能是比较字符串大小,因此可以直接被 return 语句调用:return strcmp(name,pgetName();。 (3)主要考查考生对成员函数的掌握,程序的注释为:显示出生月,由此
13、可以知道这里要输出出生月份,直接调用函数 getMonth()即可。四、综合应用题(总题数:1,分数:2.00)43.请使用 VC6 或使用【答题】菜单打开考生目录 proj3 下的工程文件 proj3,此工程中包含一个源程序文件 proj3cpp,补充编制 C+程序 proj3cpp,其功能是读取文本文件 indat 中的全部内容,将文本存放到 doc 类的对象 myDoc 中。然后将 myDoc 中的字符序列反转,并输出到文件 outdat 中。文件indat 的长度不大于 1000 字节。 要求: 补充编制的内容写在“*333*”与“*66666*”两行之间。实现将 myDoc 中的字符
14、序列反转,并将反转后的序列在屏幕上输出。不得修改程序的其他部分。 注意:程序最后已将结果输出到文件 outdat 中,输出函数write To File 已经给出并且调用。 proj3cpp #includeiostream #includefstream #includecstring using namespace std; class doc private: char*str;文本字符串首地址 int length;文本字符个数 public: 构造函数,读取文件内容,用于初始化新对象,filename 是文件名字符串首地址 doc(char*filename); void rever
15、se();将字符序列反转 doc();void writeToFile(char*filename); ; doc:doc(char*filename) ifstream myFile(filename);int len=1001,tmp; str=new char1en; length=0; while(tmp=myFileget()!=EOF) strlength+=trap; strlength=0; myFileclose();void doc:reverse()将数组 str 中的 length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换*333*666*
16、doc:doc() deletestr;void doc:writeToFile(char*filename) ofstream outFile(filename); outFilestr; outFileclose();void main()doc myDoc(“indat“);myDocreverse();myDocwriteToFile(“outdat“);(分数:2.00)_正确答案:(正确答案:int i,j;定义两个整数临时变量 ij for(i=0,j=length-1;ij;i+,j-) char temp=stri; 把 Stri中的值保存在临时变量 temp stri =strj;把 Strj值赋给 Stri,实现字符前后替换 str1 j=temp; 把保存在临时变量 temp 中的值再赋值给 strj )解析:解析:题目要求将 myDoc 中的字符序列反转,在 main 函数中我们看到 myDoc 是 doc 类,根据 doc类的定义可以知道它是把读取文件的字符串存到 str 动态数组中。reverse 函数实现将数组 str 中的length 个字符中的第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,依次类推。使用变量 i 和 j,分别表示第一个字符和最后一个字符的下标,定义 temp 作为中间变量进行交换。