|
一、选择题(1)~(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1)算法能正确地实现预定功能的特性称为算法的__________。 A)确定性 B)易读性 C)健壮性 D)高效性 答案:A 评析:算法的确定性是指算法中的每一个步骤都必须是有明确定义的,不允许有摸棱两可的解释,也不允许有多义性,即每个步骤都是预先定义好的。 (2)数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为__________。 A)存储结构 B)逻辑结构 C)顺序存储结构 D)链式存储结构 答案:C 评析:如果数据之间在逻辑上有相邻关系时,能够在物理位置上体现出来,则这种存储结构称为顺序存储结构。如果数据之间的逻辑相邻关系在存储时是靠存储地址的指针来体现的,则称为链式存储结构。 (3)从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放 在已排序序列的合适位置,该排序方法称为__________。 A)希尔排序 B)冒泡排序 C)插入排序 D)选择排序 答案:C 评析:最基本的排序方法有三大类,即选择排序、交换排序和插入排序。 (4)对线性表进行折半查找时,要求线性表必须__________。 A)以顺序方式存储 B)以链接方式存储 C)以顺序方式存储,且结点按关键字有序排列 D)以链接方式存储,且结点按关键字有序排列 答案:C 评析:折半查找算法要求被查找的对象必须采用顺序的存储结构,并且关键字有序排列。 (5)链表不具备的特点是__________。 A)可随机访问任意一个结点 B)插入和删除不需要移动任何元素 C)不必事先估计存储空间 D)所需空间与其长度成正比 答案:A 评析:顺序表可以随机访问任意一个结点,而链表必须从第一个数据结点出发,逐一查找每个结点。 (6)下列描述中正确的是__________。 A)软件是物理产品 B)程序就是软件 C)软件工程由方法、工具和过程三部分组成 D)软件工程是一个机械工程 答案:B 评析:软件是与计算机系统操作有关的程序、规程、规则及任何与之有关的文档和数据。计算机软件是一种逻辑产品,而不是物理产品。软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。软件工具可以自动或半自动的生成软件文档。软件工程过程是管理者控制软件开发各环节的基本方法。 (7)软件测试是保证软件质量最关键的步骤,下列关于白盒测试技术描述中不正确的是_______。 A)保证模块中每一独立的路径至少执行一次 B)保证所有判断的每一分支至少执行一次 C)保证每一循环都在边界条件和一般条件下最多执行一次 D)验证所有内部数据结构的有效性 答案:C 评析:软件测试技术中,白盒测试技术和黑盒测试技术是两种基本的软件测试手段。白盒测试技术有四个原则:保证模块中每一个独立的路径至少执行一次;保证所有判断的每一分支至少执行一次;保证每一循环都在边界条件和一般条件下至少执行一次;验证所有内部数据结构的有效性。 (8)客观世界中任何一个事物都可以看成一个对象。但是从计算机的角度看,一个对象应 该包含两个要素:一个是_______,另一个是需要进行的操作。 A)语句 B)命令 C)算法 D)数据 答案:D 评析:在面向对象的程序设计中,从计算机的角度看,一个对象应该包含两个元素:数据,相当于家庭中的成员;操作,相当于家庭成员的活动。对象就是一个包含数据与这些数据有关的操作的集合。 (9)下列概念中,不是数据库管理系统必须提供的数据控制功能的是_______。 A)安全性 B)完整性 C)移植性 D)一致性 答案:C 评析:数据库管理系统提供的数据控制功能是指在数据库建立、运行和维护时,由DBMS统一管理、统一控制,以保证数据的安全性、完整性和一致性。 (10)设关系R和关系S的元数分别是3和4,关系T是R和S的笛卡儿积,即T=R×S,则关系T的元数是_______。 A)7 B)9 C)12 D)16 答案:A 评析:笛卡儿积的定义是设关系R和s的元数分别是r和s,R和s的笛卡儿积是一个(r十s)元属性的集合,每一个元组的mr个分量来自R的一个元组,、后s爪分量来自s的一个元组。所以关系T的属性元数是3+4=7。 (11)以下叙述中正确的是_______。 A)C语言中的全部数据类型都是基本类型 B)C语言中的全部数据类型都是构造类型 C)C语言中的数据类型只有两种,即基本类型和构造类型 D)以上都不对 答案:D 评析:c语言中的数据类型有四种,即基本类型、构造类型、指针类型和空类型。 (12)下列可作为C语言赋值语句的是_______。 A)x=3,y=5 B)a=b=6 C)i--; D)y=6 答案:C 评析:此题实际上是考查对c语言中"语句"概念的理解。表达式后面只有加上分号才能成为语句,因此,A),B),D)均是表达式,只有C)为语句。且利用自减运算符使i值减l。 (13)以下可以定义为用户标识符的是_______。 A)printf B)net C)3com D)int 答案:B 评析:c语言中的标识符分为两类。一类是系统标识符,即系统定义使用的关键字标识符等。另一类是用户自定义标识符。两类标识符都只能用字母、数字和下划线三种字符组成。且第一个字母必须为字母或下划线。并且用户自定义标识符不能使用系统关键字相同的标识符。 (14)以下选项中,不能作为合法常量的是_______。 A)0X2A B)015 C).2.8e9 D)123.6e0.4 答案:D 评析:c程序中的基本数据类型有整型、实型和字符型。其中整型常量三种形式,即八进制、十进制和十六进制。而实型常量有十进制小数和指数形式两种。 (15)有以下程序 main() { int a; char c=10: float f=-100.0;double x; clrscrO; a=f/=c*=(x=6.5); printf("%d,%c,%3.1C%3.1f\n",a,c,Cx); } 程序运行后的输出结果是_______。 A)1,65,1,6.5 B)1,A,1.5,6.5 C)1,65,1.5,6.5 D)2,65,1.5,6.5 答案:B 评析:在赋值语句a=f/=c*=(x=6.5);中,可得x=6.5,将x的值乘以10赋予c,为65,再将f=100的值除以65,并按照四舍五入的原则,重新赋给f'得到f=-I.5。最后将f的值赋给a,由于a是整型,所以得到a=l。 (16)以下语句序列中错误的是_______。 A)int x=l; B)int x=0; C)int x=2.3; D)int x=l,y=l; x++; (x+1)++; (x++)+1; (x++)+(y一); 答案:B 评析:c语言中的自加、自减运算只能用于变量,而不能用于常量或表达式。 (17)有定义语句:im.a;char b[10],c;则错误的输入语句是__________。 A)scanf("%d%s%c",&a,D,&C); B)scanf("%d%s%c",&a,&b,&C); C)scanf("%d%s%d",&a;b,&C); D)scanf("%d%s"&c,a,%,&C); 答案:D 评析:在scanf()语句中,在给整型变量和字符型赋值时,必须要在变量名前加取地址符号(&),而对字符型数组赋值时,可以不在变量名前不加取地址符号,也可以加取地址符号。而且对于字符型变量既可以赋给整型值,也可以赋给字符型值。 (18)有定义语句:int x,y;,若要通过scan即x=%d,y=%n&x,&y);语句使变量x得到数值11,变量y得到数值12,下面四组输入形式中,正确的是________。 A)1l 12<回车> B)ll,12<回车> C)x=l l,y=12<回车> D)x=ll,<回车>12,<回车> 答案:C 评析:在scanf()语句中,对于变量的赋值必须与数据的输入格式相一致。特别是一些字符说明。 (19)设有如下程序段: int x=6, y=4; printf("%d\n",(x%y,x&&y)); 则以下叙述中正确的是__________。 A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出 B)运行时产生出错信息 C)输出值为2 D)输出值为l 答案:D 评析:在逗号表达式(表达式1,表达式2)中,其运算方法是先求表达式1的值,然后求表达2的值,整个逗号表达式的值是表达式2的值。 (20)有以下程序 main() { int i=1.j=2,k=3; clrscr(); if(i++==j&&k--==j) printf("%d,%d,%d",i++'j,k); else printf("%d,%d,%d",++i,++j,k--); } 程序运行后的输出结果是_________。 A)l,2,3 B)2,2,3 C)2,3,2 D)3,3,3 答案:D 评析:按照运算符的优先级,最先计算的是关系运算i++==j,由于此关系式不成立,,它的结果是为"假"值,由此可以确定逻辑与运算的结果必然是"假"值,因此参加逻辑与运算的另一个关系表达式"k--==j"的值,系统不再对它进行运算。此时变量i的值自加1变成2,然后执行else语句后的printf语句。 (21)有定义语句:int a=l,b=l,c=3,x;,则以下选项中各程序段执行后,x的值不等于3是__________。 A)if(c<a)x=l; B)if(a<3&&b<C) x=3; else if(b<a‖b<C)x=3; else if(a<2) x:2; C)if(a%b>a) x=3; D)if(a<b+C)x:b; if(a<2)x=2; if(b&&a<C)x=c= if(a<1)z=l; if(c<a)x=a; 答案:C 评析:在各种运算符中,运算级别最高的是算术运算,如果有括号,当然先算括号内的表达式的值。 (22)有以下程序,其输出结果是____________。 main() { float x=l; int y; X++: y=x+l; printf("x=%d,y=%f",x, y); } A)x=2,y=3 B)x=2,y=3.0 C)x=2.0,y=3 D)x=0.y=O.000000 答案:D 评析:一般在对变量定义为何种类型的数据时,对输出应有完全一致的数据类型格式。但整型与实型数据在进行混合运算时,一般其数据类型可以自动转换。如本题的y=x+l;语句中,系统自动将实型表达式x+l的结果转换为整数赋给整型变量y,但整型变量y只能得到实型数的整数部分。 (23)有以下程序 main() { int a[6]={5,6,7,8,9,10},s=0,I=0; clrserO; do { if(a[i]%2 I-0) s+=a[I]; }while(++i<5); primf("%d\n",s); } 程序运行后的输出结果是_________。 A)21 B)22 C)23 D)24 答案:A 评析:引用数组中的某个元素时,可以直接使用数组名加下标的形式。如p[1],就是数组中下标为1的元素,按顺序数,是第2个元素,因为数组的下标是从0开始的。本题实际上是求数组中所有奇数元素的和。 (24)若有如下程序段, main() { char a[7]="123\010\032"; int i,j=0; clrscr0; for (I=0;i<strlen(a);i++) j+=sizeof(a); printf("%d,%d\n",I,J); } 程序运行后的输出结果是_________。 A)5,30 B)5,35 C)5,25 D)5,20 答案:B 评析:数组的存储空间是在其定义后就分配的。字符数组a[7]="123\010\032"的存储空间是7个单元。即sizeof(a)=7。而函数strlen()是求字符串的长度的。a[7]="123\010\032"中,有两个转义字符,因此字符串的长度实际上是5个字符。所以strlen(a)=5。在程序的for循环中,其循环的次数是5次,j每次加7,所以最后的结果是35。i的值就是循环的次数。 (25)如果在c程序中要用到库函数中的字符串比较函数strcmp(),那么在程序前面应该 添加的头文件是__________。 A)stdio.h B)string.h C)alloc.h D)math.H 答案:B 评析:库函数并不是c语言的一部分,它是由人们根据需要编制并提供用户使用的。在调用不同类别的库函数时,必须在程序前添加相应的头文件。 (26)若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是_________。 A)函数调用可以嵌套和递归 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参 答案:D 评析:函数的调用有三种方式。一是将函数调用作为一个语句。二是函数出现在_个表达式中。三是作为一个函数的实参。但是没有函数调用作为形参。而且函数在调用时还有嵌套和递归两种特殊的情形。 (27)下列关于c语言中字符常量与字符串常量的叙述中,错误的是_________。 A)字符常量是用单撇号括起来的一个字符 B)空格字符也可用作字符常量 C)字符串常量是用单撇号括起来的一个字符序列 D)字符串常量是用双撇号括起来的一个字符序列 答案:C 评析:c语言中的字符型数据常量有两类,一类是用单撇号括起来的字符常量。字符常量除了常用的字符外,还包括特殊的空格符和以"\"开头的转义字符。字符串常量则是用双撇号括起来的一个字符序列。
(28)有以下程序 void fun(char *a,char *b) { a=b; (*a)++; } main() { char c1='A',c2='a,*p1,*p2; clrscr0; pl=&cl; p2=&c2; fun(p1,p2); printf("%c%c\n",cl,c2); } 程序运行后的输出结果是__________。 A)Ab B)aa C)Aa D)Bb 答案:A 评析:在函数调用中,可以分值传递和地址传递。若参数传递的是简单数据类型的数值,称为值传递方式。若参数传递的是变量的地址,称为地址传递方式。 (29)若有定义:static int fun(int a,int b),则以下叙述中错误的是_________。 A)定义了一个返回值为整型的静态函数 B)该函数只能被同一文件内的函数调用 C)该函数可以在任何文件中被调用 D)该函数属于内部函数 答案:C 评析:根据函数能否被其他源文件调用,将函数区分为内部和外部函数。如果将函数定义为外部函数,则在函数首部最左端冠以关键字eXtem。如果将函数定义为内部函数,则在函数首部最左端冠以关键字static。内部函数只能被本文件中的其它函数调用。而外部函数则可以被其他任何c程序文件调用。 (30)以下能正确定义一维数组的选项是_________。 A)int num[]; B)int num[0..100]; C)#define N 100; D)int N=100; int num[N]; int num[N]; 答案:C 评析:有二种方法指定数组长度。其一是直接在数组名后面的方括号内输入数组的长度。其二是,在定义数组的同时对其赋值,由实际赋值的元素个数自动确定数组的长度。 (31)有以下程序 fun(int a[],intm,int n) { int I,J; for(i=m;i<n;i++) a[i+ll=a[I]+3; } main() { int i,a[6l={2,4,6,8,10,12}; clrscr0; fun(a,2,5); for(i=O;i<6;i++) printf("%"a[I]); } 程序运行后输出的结果是__________。 A)24691315 B)24691215 C)249121518 D)249121415 答案:B 评析:在调用函数时,既可以用单个的变量作为参数,也可以用数组名作为参数。还可将数组的下标值作为实参使用。在本题中,是将数组名和数组的下标值作为实参。 (32)以下不正确的叙述是__________. A)在C程序中,逗号运算符的优先级最低。 B)在C程序中,T和t是两个不同的变量 C)若a和b类型相同,在执行了赋值表达式a=b后,b中的值将放入a中,而b中的值不变。 D)当从键盘输入数据时,对于整型变量只能输入整型数据。对于实型变量只能输入实型数据。 答案:D 评析:在c语言中,为方便表达式的运算,对所有的运算符都设定了一定的优先级,其中逗号运算符的优先级最低。c语言中的数据有常量和变量之分,其中变量是区分大小写的,也就是说T和t是两个不同的变量名。将某个变量的值赋给其它的变量之后,并不影响其本身的值。当定义一个整型变量后,可以从键盘上对其输入整型值,也可以是字符型的数据。如果将字符型的值赋给整型变量,则它接受的是字符常量的ASCII码值。实型变量也可以接收整型值。 (33)有以下程序 pf(char *p,int n) { int i; for(i=0;i<n;i++1 p[i]=p[I]+32; } main() { char a[]="ABCD"; int i: clrscr(); pf(a,4); for(i=0;i<4;i++) printf("%c",a[I]); } 程序运行后的输出结果是________。 A)ABCD B)ABCD\0 C)abcd D)abed\0 答案:C 评析:通过指向数组的指针可以引用数组中的任何元素,并且对其进行各种运算。本题中就是通过指向数组的指针将一字符数组中的所有大写字母转换成相应的小写字母。 (34)有以下程序 main() { int a[3][3],*p,i; clrscr(); p=&a[0][0]; for(i=0;i<9;i++) p[i]:i+2; printf("%d\n",a[2][11); } 程序运行后的输出结果是_________。 A)3 B)6 C)9 D)2 答案:C 评析:当某个指针变量指向多维数组时,可以用其每次加l来顺序操作数组中的元素。在此题中,a[3][3]={{2,3,4},{5,6,7},{8,9,10}}。而最后输出的a[2][1]就是第3行的第2列的元素,即9。 (35)有以下程序 #include<stdio.h> #define F(X,Y)(X)*(Y) main() { int a=3,b=4; clrscr(); printf("%d\n",F(a--,++b)); } 程序运行后的输出结果是_________。 A)8 B)10 C)12 D)15 答案:D 评析。在带参数的宏定义中,不是简单的字符替换。其方法是:在程序中如果有带实参的宏, (如F(x,Y)),则按#define命令行中指定的字符串进行置换。如果串中包含宏中的形参(女NX,Y),、则将程序语句中相应的实参代替形参。本题中的宏定义展开后为:(a.--)*(++b)=(3)*(5)=15。 (36)有以下程序 main() { int x=3,y=2,z=l; printf("%d\n",x/y&&z); } 程序运行后的输出结果是_________。 A)0 B)l C)2 D)3 答案:B 评析:在c程序的标准输出函数prim冲,要注意表达式的优先级。如本题的表达式x/y&&z,先运算的是算术运算x/v,结果是1,然后才运算l&&z,结果是1。 (37)下列关于c程序编译的描述中,错误的是_________。 A)在程序的编译过程中可以发现所有的语法错误 B)在程序的编译过程中可以发现部分的语法错误 C)在程序的编译过程中不能发现逻辑错误 D)程序编译是调试程序的必经过程 答案:B 评析:编译过程实际上就是调试程序,找出程序中所有可能存在的语法错误。但是,对于程序逻辑上的一些错误,编译过程无能为力,只有程序编写人员自己通过一些良好的编程技巧和方法来排除。 (38)若有以下说明和定义 union、s { int i; char ch float e }a; 下列对共用体的操作正确的是________。 A)a='A'; B)re=a; C)a.i=3; D)printf("%dha",a); 答案:C 评析:共用体实际上用同一内存段来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是现时存放几种。因此,不能对共用体名赋值,不能引用共用体名以得到某一个值,也不能把共用体变量作为函数参数。 (39)下列选项中正确的语句组是_________。 A)char s[8];s={"Beijing"}; B)char *s;s={"Beijing"}; C)char s[8];s="Beijing"; D)char *s;s="Beijing"; 答案:D 评析:字符串通常是指用一对双引号括起来的一组字符常量序列。在c语言中,可以直接定义一个指向字符串的指针变量,然后对其赋值为字符串常量后,指向字符串的指针就指向了字符串的首地址。 (40)如果一个C程序由多个文件组成,在将多个文件编译连接成一个统一的可执行文件时,可采用的方法有多种,以下叙述中错误的是__________。 A)可以利用Turbo c集成环境 B)在MS C上进行编译连接 C)用#include命令 D)用文字处理软件Word 答案:D 评析:运算多个文件的程序有3种方法,第1种是利用Turbo c集成环境,先将每个文件输入并存储在磁盘上,然后在编译在状态下建立一个"项目文件",最后再编译连接。第2种方法是在MS c上先分别对多个文件进行编译得到.obj文件,然后用link命令把四个文件连接起来。第3种方法是用#include命令将多个文件包含进某个文件中。 (41)有以下程序 main() { int n,s=0; clrscr0; for(n=10;n<30;n++) { if(n%3==O) { s+=n; continue; } if(s>100)break; } printf("%d",s); } 程序运行后的输出结果是___________。 A)117 B)147 C)127 D)137 答案:A 评析:continue语句的功能是结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。而break语句是从循环体内跳出,即提前结束循环。 (42)有以下程序 main() { char s[]={'T','E','A','C','H','E','R'},*p; clrscr0; p=s+3; printf("%c",*p++); printf("%c",*p++); } 程序运行后的输出结果是________。 A)AC B)CH C)HE D)TEA 答案:B 评析:如果有指向字符数组的指针,那么字符数组中的元素可以用指针变量表示,执行第一个输出语句printf("%c",*p++);后,输出字符'C',执行第二个输出语句printr("%c",*p++);后,输出字符'H'。 (43)已定义以下函数 fun(char *pl,char*p2) { while(('pl='p2)『-'\0'』 { pl++; p2++; } } 函数的功能是__________。 A)将p2所指字符串复制到pl所指内存空间 B)将p2所指字符串的地址赋给指针p1 C)对pl和p2两个指针所指字符串进行比较 D)检查pl和p2两个指针所指字符串中是否有'\O' 答案:A 评析:指针的白加或自减运算,表示指针向前或向后移动一个存储单元。 (44)有以下程序 main() { char s[][5]={{",",'*'},{",'*',",'*'},{'*'",",",'*'},{",'*',",'*'},{",",'*'}}; int i, j; for(i=0;i<5;i十+) { for(j=O;__________j++) printf("%c",s[i][I]); printf("\n"); } } 若输出如下的钻石形平面图,则在程序的下划线处应填入的表达式是__________。 * * * * * * * * A)j<5 B)j<=5 C)j>5 D)j>=5 答案:A 评析:在一个二维数组中,可以通过其行标和列标来控制其输出的数据元素。 (45)有以下程序 sum(char *p) { *p=*p+3;} main() { char str[10]={"abcde"},*p=str; clrscr0; sum(p); primf("%c\n",*p--); } 程序运行后的输出结果是_________。 A)c B)d C)e D)f 答案:B 评析:在用字符指针作为形式参数时,先让指针p指向字符数组的首地址,然后可以用*(p+i)的形式直接存取各对应单元中的元素,而*p+i的意义则不样,它是指将指针变量p所指向的存储单元的值加上i。 (46)已定义以下函数 fun(int *p) (return *p;) 该函数的返回值是_________。 A)不确定的值 B)形参p中存放的值 C)形参p所指存储单元的值 D)形参p的地址值 答案:C 评析:指针p是指向一个地址,而*p是表示指针p指向存储单元中的数据。 (47)有如下语句 int *p, a[]={2,4,6,8,10}; p=a; 则与语句*p++;等价的语句是__________。 A)(*p)++; B)*(p++); C)*(++p); D)++*p; 答案:B 评析:由于++和*同优先级,结合方向为自右向左,因此语句*p++;等价于*(p++);,而*(++p)是先使p加l,再取*p的值。语句++*p;相当于++(*p),则是先取p所指变量的值,然后自加l。 (48)下列关于结构体与苯用体的说法中,错误的是_________。 A)结构体变量所占内存长度是各成员占的内存长度之和 B)共用体变量所占内存长度是各成员占的内存长度之和 C)共用体变量所占内存长度等于最长成员的长度 D)共用体变量和结构体变量中的所有成员可以是不同数据类型 答案:B 评析:共用体也称"联合体",与结构体定义形式相同,而它们是含义不同的两类构造数据类型。结构体中每个成员都有自己独立的内存空间,是所有成员的内存长度之和。而共用体不同,所有成员是共用一个内存区的,所以共用体变量的内存长度是最长成员的长度。 (49)下列对于文件的打开方式叙述中,错误的是_________。 A)用"r"方式打开的文件只能读 B)用"w"方式打开的文件只能向该文件写数据 C)用"a"方式打开的文件既能读,又可以向该文件写数据 D)如果不能打开文件,fopen函数将会带回一个错信息 答案:C 评析:在c程序中打开文件时,必须要确定文件的打开方式。在文件打开函数fopen中,用"r"方式打开的文件只能读,即从文件向计算机输入,而不是向文件输入;用"w"方式打开的文件只能写,即向文件写入数据,而不能从文件中向计算机输入数据。用"a"方式打开的文件只能在文件末尾添加数据。在用"r"方式打开时,fopen函数如果不能打开一个文件,会返回一个出错信息。 (50)下列关于c语言数据文件的叙述中正确的_________。 A)文件由ASCII码字符序列组成,c语言只能读写文本文件 B)文件由二进制数据序列组成,c语言只能读写二进制文件 C)文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件 D)文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件 答案:D 评析:c语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)数据顺序组成。根据数据的组织形式,可分为ASCII码文件和二进制文件。因此,一个c文件是一个字节流或二进制流。它把数据看作是一连串的字符(字节)。而不考虑记录的界限。换句话说,c语言文件并不是由记录组成的。 二、填空题(每空2分,共40分) 请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。 (1)某二叉树中共有27个结点,其中度为2的结点有10个,则该二叉树中有 【1】 个度为l的结点。 答案:【1】6 评析:已知n2=10,根据二叉树中度为2的结点与叶子结点的关系:n0=n2+l可知,为1l。因此,度为l的结点数为:n1=n-n0-n2=27-10-l1=6 (2)1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种新的流程图中,完全去掉了带箭头的流程线,全部算法写在一个矩形框内。这种流程图称为 【2】 流程图。 答案:【2】N-S 评析:基于可以用顺序结构表示任何复杂算法结构的思想,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。这种流程图称为N-S流程图(N和s是两位美国学者的英文姓名的第一个字母)。 (3)在软件测试过程中,单元测试的目的 【3】 ,多采用白盒测试法。 答案:【3】保证每个模块单独运行正确 评析:软件测试的实施过程分为四步,即单元测试、综合测试、确认测试利系统测试。其中单元测试的主要的目的是保证每个模块单独运行正确:多采用白盒测试法,检查模块控制结构的某些特殊路径,期望覆盖尽可能多的出错点。 (4)在数据库系统中,数据冗余度大大降低的最主要原因是 【4】 。 答案:【4】实现数据共享 评析:数据库中的数据是可以被多个用户共享的,这和以前的文件系统有所不同。由于数据库中的数据实现数据共享,可以极大的降低数据冗余度,并且只花费很少的存储空间。 (5)在软件生存周期中,软件定义阶段的主要任务是 【5】 。 答案:【5】确定软件系统的工程需求 评析:一个软件生存周期主要包含三个阶段,即软件定义、软件开发、软件维护。软件定义阶段主要任务是确定软件系统的工程需求。为准确明确软件的工程需求,软件定义又分成软件系统的可行研究和需求分析两个子阶段。 (6)如果在运行以下程序时从键盘输入:bcd<回车>。输出结果 【6】 。 #include<stdio.h> main() { char I='a'J='a',k='a'; clrscr(); scanf("%c%*c%c",&i,&j,&k); printf("%c%c%c",i,j,k); } 答案:【6】bda 评析:在scanf()语句中,如果输入格式中带有"*",则变量在接收数据时,自动忽略掉数据输入序列中"*'对应位置的的数据元素,其对应变量的值从"*"对应位置的下一个数据开始接收。 (7)以下程序运行后的输出结果是 【7】 。 #define SQ(y) y*y main() { int x=lO,y; y=SQ(x+3); primf("%d",y); } 答案:【7】43 评析:在使用带参数的宏定义时不是进行简单的字符替换。如果在程序有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换。如果是表达式时,一定要注意其替换后得到的表达式。本题中,有宏定义行#define sQ(y) y*y。在用实参x+3进行替换后,其得到的字符串表达式为:x+3*x+3=10+3*10+3=43。 (8)已知字符"A"的ASCII值为65,以下程序运行后的输出结果是 【8】 。 main() { int x=30,y=50,t=4; char z='A': clrscr(); if(y>x+2&&y<z-12) x=y; y=t; if(y<z&&y>z-20) t=x: x=y; y=t; printf("%d,%d,%d\n",x,y,z); } 答案:【8】4,4, 65 评析:如果多个分支结构处于顺序关系时,每个分支语句都要执行。本题中的两个if语句就是这种关系。 (9)以下程序的运行结果是 【9】 。 main() { int a=4,b=8,c; c=("b==a)&&(a+b!=20); printf("%d,%d,%d\n",a,b,C); } 答案:【9】4,8,0 评析:如果在表达中出现多种运算符时,一定要撂照他们的优先级别进行运算,否则其结果可能会产生错误。本题中,由于赋值表达中式c=(a/b==a)&&(a+b!=20)中有两个括号,而且两个括号是进行逻辑与运算。当第1个括号内的值为假时,不管后面括号内的值是否为假,两个括号内的值进行逻辑与(&&)运算时,其结果肯定为假。 (10)以下程序的运行结果是 【10】 。 main() { char a='A',b='E'; int sum=1,i=1; do { sum*=i; i++: }while(i<=b-a); printf("%d",sum); } 答案:【10】24 评析:字符数据进行算术运算时,是将字符对应的ASCII值当作一个整型数据来处理。同样要将整数进行字符运算时,可以将整数转换成ASCII值与其相等的字符。 (11)已知数字'0'的AsCII码值为48,在程序运行时若从键盘输入:096<回车>,则下列程序运行后的输出结果是 【11】 。 #include<stdio.h> main() { char x,y; x=getchar(); scanf("%d",&y); x=x+4; y=y/2; printf("%c%C",x,y); } 答案:【11】40 评析:以ASCII码值为桥梁,可以将字符数据与其ASCII值相等的整型数进行相互转换,并且可以用这个特性对字符进行一些整型数据的运算。 (12)以下程序中,min函数的功能是求4行5列二维数组每列元素的最小值。请填空。 Void min(int m,int n,int fI)[5],int *bt) { inti,j,k=0; for (j=0;j<n;j++) { k=f[0][j]}; for(i=0;i<m;i++) if( 【12】 )k=f[i][j]; bt[j]=k; } } main() { int a[4][5],i,j,b[5]; for(i=0;i<4.i++) for(j=0;0<5.J++) scanf("%d",&a[i][j]); min(4,5,a,b); f'0r(j=0;j<5;j++) printf("%d",b[j]); primf("\n"); } 答案:【12】k>f[i][j] 评析:求二维数组中每列的最小值时,其方法是先让每列中的第一个元素同第二个元素比较,然后将较小的值保存在临时变量k中,最后再将k中的值与问列中剩余的元素进行比较,每次都是将较小的值保存在临时变量k中。靳列比较后完成后,其最小值就是k的值。然后将k值赋给一维数组b啪中对应的单元。最后得到的一维数组b啪中的所有值就是所要求的二维数组中每列的最小值。 (13)有以下程序 main() { int a,b,c,d; clrsc(); scanf("%o",&a); b=a>>4: c:~(~0<<4); d=b&c: printf("%d,%d\n",a,d); } 若从键盘上输入331,则程序运行后的输出结果 【13】 。 答案:【13】217,13 评析: c语言中的位运算符有6种,本程序有其中4种位运算符,分别是左移、右移、取反和按位与运算。 (14)以下程序运行后输出结果是 【14】 。 int a=30,b=40; voidfun(int x,inty) { int z; z=(x>y)?x:y; a=z+10; b=z+20; } main() { printf("a=%d,b=%d\n",a,b); fun(a,b); printf("a=%d,b=%d\n",a,b); } 答案:【14】a=30,b=40 a=50,b=60 评析:全局变量的作用域是从定义变量的位置开始到本源文件的结束。在本题中,变量a,b就是属于全局变量。其初值分别为a=30,b=4O。在没有对两个全局变量作任何处理前,它们的值保持原值,所以第1次输出a,b的值分别是初值a=30,b=40。但在fun函数中a,b的值改变后,其值在结束fun函数后仍然保留,所以第2次输出a,b的值分别为a=50,b=60。 (15)以下程序运行后的输出结果是 【15】 。 #include<string.h> main() { int i: char a[]。"abcdef',*p,*s; p=a; for(I=O;i<strlen(a)/2;i++) { a[strlen(a)-i-1]=*p; p++; } s=strupr(a); puts(s); } 答案:【15】ABCCBA 评析:for循环是将字符数组a的前半段元素取出,然后按原来相反的顺序覆盖字符数组的后半段。字符串函数strupr的功能是将字符串中小写字母转换为大写字母。然后用字符串输出函数puts输出。 (16)以下程序运行后其输出的结果是 【16】 。 ma(int a) { static int y=l,z=2; y*=a; Z*=a: printf("y=%d,z=%d",y,z); } main() { int i,a=2: clrsc"); for(i=0;i<3;I++) { printf("%d",i); ma(a); printf("\n"); } } 答案:【16】0 y=2,z=4 l y=4,z=8 2 y=8,z=16 评析:静态存储变量的定义方法是在定义变量里,前面加关键字static,而且一次允许定义多个静态变量。一旦某个变量在函数中被定义成静态的类型,在程序运行期间,每次调用函数时,它不再重新赋初值,而是保留上次函数调用结束时的值。.如本题中,在第1次调用函数ma()结束时,y、z的值分别是y=2,z=4。在第2次调用ma()函数时,静态存储变量y、z不再重新被赋初值,而是保留上次结束时的值。 (17)已知有如图所示的单链表,则以下函数的功能是 【17】 。 #include<stdio.h> typedef struct node { int data; struct node *next; }Node; Node *reverlist(Llist *head) { Node *p,*q; if(head&&head->nex0 { p=head; q=p->next; p->next=null; while(q) { p=q; q=q->next; p->next=head; head=p; } } return(head); 答案:【17】逆置单链表 知识点:单链表的运算 评析:该函数是首先将head指向的链表在第l和第2个结点间断开成前后两个链表,用指针head指向前面单个结点的链表,而用指针q指向后面断开部分的链表,每次将指针q指向链表的第1个结点取出,然后插入到head指针指向链表的最前面,直到q指针指向链表的结点全部取出,并插入到head指针指向的链表中,最后指针head指向的链表就是原来链表的逆置链表。 (18)以下程序的功能是将一个字符串sl中的内容复制到字符串s2中,请填空。 void copy_string(char *pl,char *p2) { for ( ;*p1 !='\0' ;p1 ++,p2++) 【18】 ; 【19】 ; ; } main( ) { char * s1 ="hello!"; char *s2="Good morning!"; prinff("\nstring sl=%s\nstring s2=%s\n",sl,s2); copy_string( 【20】 ); printf("\nstring sl=%s\nstring s2=%s\n",sl,s2); 答案:【18】*p2=*pl 【19】*p2='\0' 【20】sl,s2 评析:形式参数可以有不同的数据类型,其中本题中的字符指针也是一种形式a在本题中,pl,p2都是字符指针,在调用copy_string函数时,将数组s1的首地址传给p1,把数组s2的首地址传给p2。在函数copy_string中的for循环中,每次将*pl赋给*p2,第1次就是将s1数组的第1个字符赋给s2数组。在执行pl++和p2++后,p1和p2就分别指向s1[1]和s2[1]。然后依此类推。在复制所有字符后,还要记得在最后将结束符'\0'赋给p2。 |