} }
else printf(\is too large!\n\printf(\\n\; }
(16)以下程序中函数fun的功能是:构成一个如图所示的带头结点的单向链表,在结点的数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单链表中所有结点中的字符串。请填空完成函数disp。 #include
typedef struct node/*链表结点结构*/ {char sub[3]; struct node *next; }Node;
Node fun(char s) /*建立链表*/ {…… }
void disp(Node *h) {Node *p; p=h->next; while(【19】)
{printf(\%s\n\,P->sub); p=【20】; } }
main()
{Node *hd;
hd=fun();disp(hd);printf(\\n\; }
2006年4月笔试试卷 一、选择题
(1)D)解析:结构化程序设计方法的主要原则是:自顶向下,逐步求精,模块化,限制使用goto语句。可复用性是指软件元素不加修改和稍加修改可在不同的软件开发过程中重复使用的性质。软件可复用性是软件工程追求的目标之一,是提高软件生产效率的最主要方法。面向对象的程序设计具有可复用性的优点。
(2)A)解析:模块的独立程度可以由两个定性标准度量:内聚性和耦合性。耦合衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚衡量一个模块内部各个元素彼此结合的紧密程度。一般来说,要求模块之间的耦合尽可能地弱,而要求模块的内聚程度尽可能的高。
(3)D)解析:因为测试的目的在于发现错误,从心理学角度讲,由程序的编写者自己进行测试是不合适的,为了达到最好的测试效果,应该由独立的第三方进行测试工作,所以选项A)错误;程序调试,修改一个错误的同时可能引入了新的错误,解决的办法是在修改了错误之后,必须进行回归测试,所以选项B)错误;所谓软件维护,就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程,可见选项C)也是错误的。
(4)B)解析:栈的特点是栈顶元素总是最后被插入的元素,也是最早被删除的元素;栈底元素总是最早被插入的元素,也是最晚才能被删除的元素。即栈的修改原则是“后进先出”(Last In First Out,简称LIFO) 或“先进后出”(First In Last Out,简称FILO),因此,栈也称为“后进先出”表或“先进后出”表。
(5)A)解析:所谓线性链表,就是指线性表的链式存储结构,简称链表。线性表链式存储结构的基本单位称为存储结点,每个存储结点包括数据域和指针域两个组成部分。栈、队列和双向链表是线性结构,二叉树是非线性结构。线性结构和非线性结构是从数据的逻辑结构角度来讲的,与该数据结构中有多少个元素没有关系,即使是空的二叉树也是非线性结构。 (6)D)解析:后序遍历可以描述为:若二叉树为空,则空操作;否则: ①后序遍历左子树; ②后序遍历右子树; ③访问根结点。
对于后序遍历,第一个访问的结点一定是最左下的结点,最后一个访问的结点一定是根结点,如果知道这个小技巧,可以迅速确定本题的答案为选项D)。
(7)C)解析:满二叉树是指除最后一层外,每一层上的所有结点都有两个子结点的二叉树。满二叉树在其第i层上有2i-1个结点,即每一层上的结点数都是最大结点数。对于深度为7的满二叉树,叶子结点所在的是第7层,一共有27-1=64个叶子结点。
(8)D)解析:两个实体集之间的联系实际上是实体集间的函数关系,主要有3种:一对一的联系,一对多的联系,多对多的联系。“商品”与“顾客”两个实体集之间的联系一般是多对多,因为,一种 “商品”可以被多个“顾客”购买,而一个“顾客”也可以购买多个“商品”。
(9)A)解析:在ER图中,用矩形表示实体集,用椭圆形表示属性,用菱形(内部写上联系名)表示联系。
(10)C)解析:DB即数据库(Database),是统一管理的相关数据的集合;DBMS即数据库管理系统(Database Management System),是位于用户与操作系统之间的一层数据管理软件,为用户或应用程序提供访问DB的方法;DBS即数据库系统(Database System)由如下5部分组成,数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、系统平台之一——硬件平台(硬件)、系统平台之二——软件平台(软件)。
(11)C)解析:C语言规定,标志符由字母、数字或下划线组成,它的第一个字符必须是字母或下划线。
(12)C)解析:数值常量包括整型常量和字符常量。在用字母e(或E)表示指数形式的实型常量时,字母e(或E)之前必须有数字且字母e(或E)后面的指数必须为整数。
(13)A)解析:字符常量是括在一对单引号内的字符。选项A)?\018?是八进制字符串格式,所以里面的数不能大于8。选项B)、C)、D)都是转义字符。
(14)D)解析:这道题要注意2/5的结果是2,因为运算符两边的数值类型均为整型,故运算结果的数值类型也被认定为整型。
(15)D)解析:字符串常量是用一对双引号括起来的字符序列,用字符数组来存放,不用大括号。
(16)B)解析:二维数组的初始化有以下几种形式:①分行进行初始化。②不分行的初始化。③部分数组元素初始化。④省略第一维的定义,不省略第二维的定义。选项B)等号右边分了3行,大于等号左边数组的行数2。
(17)B)解析:canf()语句用“空格”区别不同的字符串;getc()与getchar()语句不能用于字符串的读入。
(18)B)解析:选项A)main();的分号是错误的,不能有分号;选项C)的注释语句多了两个*号;选项D)include前面没有#。
(19)C)解析:C语言中,switch语句专用于实现多分支结构程序,其特点是各分支清晰而直观。switch后面括号中可以是任何表达式,取其整数部分与各常量表达式进行比较。常量表达式中不能出现变量,且类型必须是整型、字符型或枚举型,各常量表达式各不相同。
(20)A)解析:在调用子函数时,应对其进行说明。选项A)中,调用时,没有对子函数进行说明。选项B)、C)中被调用函数在主调函数之前定义,不用说明;选项D)中在主调函数中对被调用函数的返回值类型进行了说明。
(21)C)解析:E代表不是0的整数。在选项A)、B)、D)中的switch后面的表达式都是E不等于0为真。
(22)A)解析:while语句的功能是:计算表达式的值,如为真,则执行循环体语句,执行完毕后,再计算表达式的值,若仍为真,则重复执行循环体语句。直到表达式的值为假时,结束循环。ch=getchar()应加一个括号,表示输入字符的函数。
(23)B)解析:返回值为指针变量指向的数据,该数据已被定义为整型。
(24)D)解析:p=&a表示将变量a的地址送给指针p; scanf(“%lf”,p)表示用键盘输入的数给变量p地址中。
(25)D)解析:r->next=q,这时r指向的节点为q; p->next=r, 这时p指向的节点为r; q->next=r->next,因为r节点已经指向q,所以执行这个语句后q又指向q,所以不对。
(26)C)解析:->的运算优先级比++高,此时,pt->=10,执行自加运算后为11。
(27)B)解析:函数feof的功能是:测试fp所指的文件的位置是否已达到文件尾,如果达到文件尾,则函数返回非0值,否则返回0,表示文件尚未结束。
(28)D)解析:^为按位异或运算符;<<为左移运算符。b<<2二进制左移两位,后得8,与a进行或运算后,得9。
(29)D)解析:putchar(c1)输出1,putchar(c2)输出2,printf(“%c%c\n”,c5,c6)输出45。 (30)B)解析:while(y--)执行后,y若大于1,则循环,等y=0时,循环结束,并执行自减运算,得-1。
(31)D)解析:else子句不能作为语句单独使用,在题中if 与else 语句被 “c=2;”语句分隔开了。
(32)B)解析:此程序考察了for循环和x++。对于大循环,有两个x++,其中循环3次,对于小循环,循环三次,但是运行了两次x++,所以最后结果是6+2=8。
(33)C)解析:题中变量w的定义为double型,函数fun2()的定义为int型,按照各类数值型数据间的混合运算,整型数据被转换为实型数据。
(34)B)解析:本题考查多维数组的初始化。使用一个大括号初始化多维数组时,初始化原则为先列后行,即初始化完第一行的所有列后再初始化下一行的元素。程序输出t[2][0]、t[1][1]、t[0][2],它们的值分别为3、5、7。
(35)B)解析:此程序是统计一周七天中英文名称首字母为“T”的个数。P[i][0]是字符串的首字符,一共有两个“T”,所以n=2。
(36)C)解析:统计1~9九个数中的奇数和,此题考察指向数组的指针。C语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此*(t+i)代表数组的第i+1个元素。程序运行的结果是1+2+3+4+5+6+7+8+9=25。
(37)A)解析:(*q)++是q所指的字符加1,q++就是指针移到下一个字符。
(38)C)解析:这是一个转换程序:低字节相互转换,高字节不变。“abc”的ab和“123”的12相互转化。
(39)A)解析:本程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+4+5+6+7+8+9+10=55。
(40)C)解析:内部静态变量是始终存在的,当函数被调用退出后,内部静态变量会保存数据,再次调用该函数时,以前调用时的数值仍然保留着。Fun(a,5)的值是15,再次调用后sum=15,所以Fun(b,4)=45,s=45+15=60。
(41)A)解析:因为联合的两个变量共用一段内存,ch[0]占用低字节,ch[1]占用高字节,所以在读它们的时候还是原来的数据,没发生改变。
(42)C)解析:while(p[i][j]!=′\0′)表示p[i][j]不等于′\0′时,继续执行while中的语句。if语句表示(p[i][j]-′\0′)除2的余数不为0时,执行后面的语句。最后执行的结果是39。
(43)A)解析:第一次fwrite操作把Fortran写到文件fp中,第二次操作,把Basic写入文件fp中,此时把Fortr字符覆盖了,所以最后输出的是Basican。
(44)D)解析:并不是源程序中的所有行都参加编译。在条件编译形式下,相关内容只在满足一定条件时才进行编译。选项D)中的非执行语句不在其范围内。 (45)B)解析:算法应该具有下列五个特性: ①有穷性:一个算法必须在执行有穷步之后结束。
②确定性:算法中的每一步,必须有确切的含义,在他人理解时不会产生二义性。 ③动态性:算法中描述的每一步操作都可以通过已有的基本操作执行有限次实现。 ④输入:一个算法应该有零个或多个输入。
⑤输出:一个算法应该有一个或多个输出。这里所说的输出是指与输入有某种特定关系的量。 (46)D)解析:形参是函数定义时由用户定义的形式上的变量,实参是函数调用时,主调函数为被调函数提供的原始数据。在C语言中,实参向形参传送数据的方式是“值传递”。
(47)A)解析:str[0]、*p都指向字符串的首地址。选项B)不能说str和p完全相同,p是指针,而str是数组。选项C)中str数组的长度是20,而p的长度是字符串的长度。选项D)中,str中存放的内容是字符串,而p存放的内容是地址。
(48)D)解析:模运算“%”也称为求余运算,运算符要求两个运算对象都为整型,其结果是整数除法的余数。
(49)B)解析:预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。
(50)A)解析:关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型。 二、填空题 (1)【1】45
解析:对长度n为10的线性表进行冒泡排序,最坏情况下需要比较的次数为n(n-1)/2=5×9=45。 (2)【2】类
解析:在面向对象方法中, 类(class)描述的是具有相似属性与操作的一组对象,而一个具体对象则是其对应类的一个实例(Instance)。 (3)【3】关系
解析:在关系模型中,把数据看成是二维表,每一个二维表称为一个关系 。 (4)【4】静态分析(静态测试)
解析:原则上讲,可以将软件测试方法分为两大类,即静态测试和动态测试。静态测试无须执行被测代码,而是借助专用的软件测试工具评审软件文档或程序,度量程序静态复杂度,检查软件是否符合编程标准,借以发现编写的程序的不足之处,减少错误出现的概率。动态测试,是使被测代码在相对真实环境下运行,从多角度观察程序运行时能体现的功能、逻辑、行为、结构等的行为,以发现其中的错误现象。程序测试分为静态测试和动态测试。静态测试一般是指人工评审软件文档或程序,借以发现其中的错误。由于被评审的文档或程序不必运行,所以称为静态测试。
(5)【5】物理独立性
解析:当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程序不必修改,称为物理独立性。当数据库总体逻辑结构改变,不需要修改应用程序,这是数据的逻辑独立性。 (6)【6】printf(“a=%d,b=%d”,a,b); 解析:printf是格式化输出函数。
(7)【7】(a+b>c)&&(a+c>b)&&(b+c>a)
解析:三角形的条件是两边之和大于第三边。要用“&&”指令连接三个条件,表示三个条件都要满足。
(8)【8】30
解析:程序运行后的结果是a[0][0]+a[0][2]+a[1][1]+a[1][1]+a[2][2]+a[2][0]=1+9+4+4+7+5=30 (9)【9】a*b*c*d*
解析:在子程序中,如果条件成立,则执行下面的语句,如果不成立,跳过。最后的输出结果是a*b*c*d*。 (10)【10】11
解析:此题涉及函数的调用和if语句。程序先执行第二个if语句,然后在执行第一个if语句,最后用return返回数值。 (11)【11】!knahT
解析:此程序是一道次序颠倒题,即输入“Thank!”,则输出“!knahT”。 (12)【12】p+n
解析:n++到一定数值,就找到所指的字符,返回c的地址。 (13)【13】i<10 【14】j%3!=0
解析:(j=i*10+6)<100,所以i 的范围是0-9之间。j=i*10+6满足了个位数为6的要求,因此这个条件应该满足能被3整除这个要求。 (14)【15】return 0 【16】return 1
解析:如果a能被i整除,则a是素数,返回值为0。如果a不能被i整除,则a不是素数,返回值为1。
(15)【17】ch++ 【18】printf(“\n”);
解析:ch自身加1,指向下一个字母(以ASCII的顺序)。此程序语句的作用是换行。 (16)【19】p!=NULL 【20】p->next
解析:NULL的ASCII码的值和?\0?的ASCII码的值相等,条件到NULL停止循环。把下一个节点的地址赋给p,这样循环,节点可以依次向后取值。