|
一、选择题(1)~(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1)在下列选项中,_________不是一个算法一般应该具有的基本特征。 A)确定性 B)可行性 C)无穷性 D)拥有足够的情报 答案:C 评析:一个算法,一般应具有以下几个基本特征。①可行性②确定性③有穷性④拥有足够的情报 (2)希尔排序法属于_________类型的排序法。 A)交换类排序法 B)插入类排序法 C)选择类排序法 D)建堆排序法 答案:B 评析:希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。所以希尔排序法属于插入类排序,但它对简单插入排序做了很大的改进。 (3)下列关于队列的叙述中正确的是_________。 A)在队列中只能插入数据 B)在队列中只能删除数据 C)队列是先进先出的线性表 D)队列是先进后出的线性表 答案:C 评析:队列是指允许在一端进行插入、而在另一端进行删除的线性表。它又称为"先进先出"或"后进后出"的线性表,体现了"先来先服务"的原则。 (4)对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为_________。 A)N+I B)N C)(N+I)/2 D)N/2 答案:B 评析:在进行顺序查找过程中,如果被查的元素是线性表中的最后一个,或者被查元素根本不在线性表中,则为了查找这个元素需要与线性表中所有元素进行比较,这是顺序查找最坏的情况。 (5)信息隐蔽的概念与下述_________概念直接相关。 A)软件结构定义 B)模块独立性 C)模块类型划分 D)模拟耦合度 答案:B 评析:信息隐蔽是指在一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。衡量软件的模块独立性的度量标准是耦合性和内聚性。一个模块的内聚性越强,则该模块的模块独立性越强。而内聚性是信息隐蔽和局部化概念的自然扩长。 (6)面向对象的设计方法与传统的面向过程的方法有本质不同,它的基本原理是_________。 A)模拟现实世界中不同事物之间的联系 B)强调模拟现实世界中的算法而不强调概念 C)使用现实世界的概念抽象地思考问题从而自然地解决问题 D)鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考 答案:C 评析:面向对象的设计方法基本原理:使用现实世界的概念抽象地思考问题从而自然地解决问题。强调模拟现实世界中的概念而不强调算法,鼓励开发者在软件开发的绝大部分中都用应用领域的概念去思考。 (7)在结构化方法中,软件功能分解属于软件开发中的_________阶段。 A)详细设计 B)需求分析 C)总体设计 D)编程调试 答案:C 评析:总体设计过程通常由两个主要阶段组成:系统设计,确定系统的具体实现方案;结构设计,确定软件结构。为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。 (8)软件调试的目的是_________。 A)发现错误 B)改正错误 C)改善软件的性能 D)挖掘软件的潜能 答案:B 评析:由程序调试的概念可知:程序调试活动由两部分组成,其一是根据错误的迹象确定程序中错误的确切性质、原因和位置。其二,对程序进行修改,排除这个错误。所以程序调试的目的就是诊断和改正程序中的错误。 (9)按条件f对关系R进行选择,其关系代数表达式为_________。 RooR A)RooR B) f C)6f(R) D)兀f(R) 答案:C 评析:选择运算是一个一元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中那些满足逻辑条件的元组所组成。如果关系的逻辑条件为C则R满足f的选择运算可以写成:6f(R)。 (10)数据库的物理设计是为一个给定的逻辑结构选取一个适合应用环境的_______的过程, 包括确定数据库在物理设备上的存储结构和存取方法。 A)逻辑结构 B)物理结构 C)概念结构 D)层次结构 答案:B 评析:根据数据库物理设计的概念可知:为一个给定的逻辑数据模型选取一个最合适应用要求的物理结构的过程,就是数据库的物理设计。数据库的物理结构就是指数据库在物理设备上的存储结构与存取方法。 (11)下列叙述中正确的是_______。 A)C语言编译时不检查语法 B)C语言的子程序有过程和函数两种 C)C语言的函数可以嵌套定义 D)C语言中,根据函数能否被其它源文件调用,被区分为内部函数和外部函数 答案:D 评析:选项A的错误在于编译过程中是检查语法的,若发现源程序有语法错误,则系统会提示出错信息;选项B的错误在于c语言中,子程序的作用是由函数来完成的,无过程的概念;选项c的错误在于函数不可以嵌套定义,但可以嵌套调用。 (12)有以下程序: main() { int a: char c=10; float f=100.0;double x; a=f/=c*=(x=6.5); printf("%d%d%3.1f%3.1f\n",a,c,f,x); } 程序运行后的输出结果是_______。 A)1 65 1 6.5 B)1 65 1.5 6.5 C)l 65 1.0 6.5 D)2 65 1.5 6.5 答案:B 评析:本题求解步骤如下:先进行"c*=(x=6.5)"的运算,由于x=6.5,表达式相当于c=c*6.5=10*6.5=65.再进行"f/=65"的运算,相当于f=-f/65=100.0/65,由于f为单精度实型变量,因此f的值约为1.538462.然后进行"a=f"的运算,由于a为整型变量,因此a=1.最后将各个变量的值按照printf中的格式要求输出到屏幕,注意变量f,x按照"%3.1f"格式输出,,即只输出一位小数。 (13)以下变量x、y、z均为double类型且已正确赋值,不能正确表示数学式子x/(y*z)的C语言表达式是_______。 A)x/y*z B)x*(1/(y*z)) C)x/y*1/z D)x/y/z 答案:A 评析:按照自左向右的运算逻辑,选项A是先做x/y,然后再乘以x,显然与题意不符。 (14)若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是_______。 A)-3 B)9 C)-12 D)6 答案:C 评析:c语言中对赋值运算的运算顺序是自右向左。本题中,计算a*a之后,a的值依然为3,表达式a*a的值为9;a-=9,a=3-9=-6;a+=-6,a=-6+-6=-12。 (15)以下程序段中与语句k=a>b?(b>c?1:0):0;功能等价的是_______。 A)if((a>b)&&(b>C))k=l;else k=0; B)if((a>b)‖(b>C))k=l;else k=O; C)if(a<=b)k=0;else if(b<=C)k=1; D)if(a>b)k=1,else if(b>C)k=l;else k=0; 答案:A 评析:"a>b?(b>c?1:0):0"的求解顺序是:先判断a>b是否为真,如果为真,则执行b>c?1:0:如果b>c为真,则(b>c?l:0)的值为1,从而整个表达式返回1,否则整个表达式返回0;如果a<=b,则表达式返回0。因此功能等价的语句应为if((a>b)&&(b>C))k=l;else k=0;。 (16)设x、y、t均为int型变量,则执行语句:x=y=3;t=++x‖++y;后,y的值为_______。 A)不定值 B)4 C)3 D)1 答案:C 评析:e语言中在做逻辑或运算时,自左向右判断各个参加或运算的表达式,一旦运算到某式的值为非零时,表明整个表达式一定为真,余下的语句则不再进行运算。本题中,++x的值为真,则++y并没有进行运算,所以y值不变。 (17)假设a和b为int型变量,则执行以下语句后,b的值为_______。 a=l:b=10: do { b-=a: a++: } while(b一<0): A)9 B)-2 C)-l D)8 答案:D 评析:本题程序第一轮循环后b的值为9,在进行循环条件测试时,先取b的现值9与O比较,然后再将b减l。由于9<0不成立,因此循环结束,这时b的值已变成8,本题正确答案为D。 (18)若执行以下程序时从键盘上输入9,则输出结果是_________。 main() { int n: scanf("%d:",&n); if(n++<10)printf("%d\n",n); else printf("%d\n",n--); } A)ll B)lO C)9 D)8 答案:B 评析:n++是在语句结束后再加l,因此,if语句中相当于判断的是9<10,当然是执行if语句后面的lorintf语句,而这时,因为if语句被执行,n的值也被加1,所以在打印时,n值为10,而n--是在printf语句执行完毕后再减1的。 (19)有以下程序段 int k=O: while(k=l)k++; while循环执行的次数是_________。 A)无限次 B)有语法错,不能执行 C)一次也不执行 D)执行1次 答案:A 评析:c语言里关系表达式的等于应该是"=="。一个等于号表示赋值,即这里面重复的把1赋给k,自然表达式k=l的值总为1,while后面的表达式恒为真,当然会进入死循环。 (20)有以下程序: void sum(int*a) {a[O]=a[1];} main() { Int aa[10]={1,2,3,4,5,6,7,8,9,10},i; for(i=1;i>O;i--)sum(&aa[i]); printf("%d\n",aa[0]); ) 程序运行后的输出结果是_________。 A)4 B)3 C)2 D)1 答案:D 评析:c语言规定,实参变量对形参变量的数据传递是"值传递",只由实参传给形参,而不能由形参传回来给实参。函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题要求输出aa[0]的值,结果应为1。 (21)以下程序执行后sum的值是_________。 main() { int I,sum; for(i=1;i<6;i++)sum+=i; printf("%d\n",sum); } A)15 B)14 C)不确定 D)0 答案:C 评析:变量sum在使用时未赋初值,所以无法确定sum最终的值。 (22)有以下程序: main() { int x[8]={8,7,6,5,0,0},*s; s=x+3: printf("%d\n",s[2]); } 程序运行后的输出结果是________。 A)随机值 B)0 C)5 D)6 答案:B 评析:本题定义了数组x[8]和指针变量s,由c语言规定,指针加1的含义是使指针指向数组的下一个元素,而不是指针值简单的加l,因此通过s=x+3;使s指向数组元素x[3]。由于指向数据的指针变量可以带下标表示,如s[i]与*(s+i)等价。因此题目要求输出s[2]的值,即+(s+2)的值,也就是x[51的值,为0。 (23)有以下程序段 int x=3: do { printf("%d",x-=2); } while(!(--x)); 其输出结果是_______。 A)l B)3 0 C)1 -2 D)死循环 答案:C 评析:本题中循环执行了两次,第一次,执行完printf语句后,x=l,而--X是先自减后执行语句,所以(!(--X))的值为非零,所以又执行了一次。第二次x的值为-2,--x的值为-3,求非后,值为0,跳出循环。 (24)若变量c为char类型,能正确判断出c为小写字母的表达式是_______。 A)'a'<=c<='z' B)(c>='a')‖(c<='z') C)('a'<=C)and('z'>=C) D)(c>='a')&&(c<='z') 答案:D 评析:(c>='a')和(c<='z')的关系应该是"与"的关系。 (25)下列不合法的main函数命令行参数的表示形式是_______。 A)main(n a,char*c[]); B)main(ac,av)int arc;char**av; C)main(C,V)int c,char*v[]; D)main(argc,argv)int argc;char argv[]; 答案:D 评析:main函数的参数通常有两个,前者为整型,后者为字符型指针数组。参数的名字可以是任意合法的标识符。而且,形如**av与*av[]等价,所以选项A、B、c均正确,选项D是错误的。 (26)以下所列的各函数首部中,正确的是_______。 A)void play(var a:Integer,var b:Integer) B)void play(int a,b) C)void play(int a,int b) D)Sub play(a as integer,b as integer) 答案:C 评析:除选项c项外,其它各项都没有按照c语言中的函数定义规则定义函数。 (27)在c语言中,引用数组元素时,其数组下标的数据类型允许是_______。 A)整型常量 B)整型表达式 C)整型常量或整型表达式 D)任何类型的表达式 答案:C 评析:c语言规定只能逐个引用数组元素而不能一次引用整个数组,数据元素的表示形式为数组名[下标],下标可以是整型常量或整型表达式。
(28)以下选项中,非法的字符常量是 ______。 A)'\t' B)'\17' C)"\n" D)'\xaa' 答案:C 评析:C语言中字符常量是以单引号括起来的单个字符,或为以"\"与三位八进制数值或两位十六进制数值代替单个字符。 (29)以下程序的输出结果是______ 。 #include<stdio.h> main() { int a=200; #define a lOO printf("%d",a); #undef a printf ("%dt",a); } A)200 100 B)100 100 C)100 200 D)200 200 答案:C 评析:#define宏名的有效范围为定义命令之后到本源文件结束,可以在程序中使用#undef命令终止宏定义的作用域。本题由于#undef的作用,使a的作用范围在#define a 100到#undefa之间,故答案为c。 (30)若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是______。 A)i=*p; B)*p=*&j; C)i=&j; D)i=**p; 答案:B 评析:指针是一种用来存放变量地址的特殊变量。本题中指针变量p用于存放整型变量i的地址,改变*p的值即为改变i的值。又因为"&"和"∥两个运算符的优先级别相同,按自右而左的方向结合,所以。&j先进行&j运算,得j的地址,再进行+运算,取所得地址里面的值,故t&j与i等价。 (31)假定int类型变量占用两个字节,若有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是______。 A)3 B)6 C)10 D)20 答案:D 评析:当数组定义后,系统就为其分配内存空间,而不论其中有没有内容。因此,本题中数组x[10]不论是否为其元素初始化,它所分配的存储空间仍为2+10=20个字节。 (32)执行以下的程序段后,m的值是______。 int a[2][3]={{l,2,3},{4,5,6}}; int m,*p; p=&a[0][0]; m=p[41; A)4 B)5 C)3 D)不确定 答案:B 评析:程序中定义了一个指向整型变量的指针变量,并对其赋值为二维整型数组a的首元素的地址。P[4]等价于*(p+4),即二维数组a中第四个元素的值,而a是一个2*3的二维数组,其第四个元素为a[1][1],即5。 (33)以下程序的输出结果是______。 main() {int i,a[10]; for(i=9;i>=O;i--) a[i]=lO-i; printf("%d%d%d",a[2],a[5],a[8]); } A)258 B)74l C)852 D)369 答案:C 评析:在本题运行时主要注意的是当i=9时,a[i]=10-9=1;i=8时,a[i]=10-8=2;i=7时,a[i]=10-7=3:……依此类推,,直到i=0时,a[i]=10-0=10;此时,i的值已变为.1,判断for的循环条件,不成立,然后输出a[2],a[5],a[8]分别为8,5,2。 (34)下面程序的输出结果为______ 。 #include<string.h> main() { char pl[7]="abc",p2[]="ABC",str[50]= "xyz"; strcpy(str,strcat(pl,p2)); printf("%s",str); } A)xyzabcABC B)abcABC C)xyzabc D)xyzABC 答案:B 评析:strcpy(strl,s1):作用是将字符串s1拷贝到字符数组strl中去。strcat(字符数组1,字符数组2):把。字符串2接到字符串l的后面,结果放在字符数组1中,函数调用后返回字符数组l的地址。 本题定义了三个字符数组pl,p2,str,strcat(p1,p2)函数的作用是将字符串数组p2接到字符串p1的后面,结果放在字符数组p1,再通过sffcpy()函数将该字符串拷贝到str数组中,原str数组中的字符串xyz被覆盖,因此打印输出字符串str即可得到abcABC。 (35)以下数组定义中不正确的是______。 A)int a[2Ⅱ3]; B)int b[][3]={0,1,2); C)int c[100][100]={0}; D)int d[3][]={{l,2},{l,2,3},{1,2,3,4}}; 答案:D 评析:一维数组的定义方式为: 类型说明符数组名[常量表达式]; 选项A符合此定义形式,正确;c语言中多维数组赋初值时可以部分赋值,也可以不指定除第一维以外的其它维的大小,故选项c正确;另外,如果对全部数组元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以选项B正确,而选项D是错误的。 (36)以下程序的输出结果是______。 main() { jnt a[4][4]:{{1,3,5},{2,4,6},{3,5,7}}; printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]); } A)0650 B)1470 C)5430 D)输出值不定 答案:A 评析:对未给出初始值的整数数组元素,被缺省初始化为零。 (37)在说明语句:int *f();中,标识符f代表的是______。 A)一个用于指向整型数据的指针变量 B)一个用于指向一维数组的行指针 C)一个用于指向函数的指针变量 D)一个返回值为指针型的函数名 答案:D 评析:带回指针值的函数,其一般定义形式为: 类型标识符 *函数名(参数表); 例如:int *f(x,y); 其中,f是函数名,调用它以后能得到一个指向整型数据的指针(地址),x,y是函数f的形参。在f的两侧分别为。运算符和()运算符,而()优先级高于s,因此f先与()结合,显然是函数形式。这个函数前面有一个。,表示此函数是指针型函数(函数值是指针)。前面的int表示返回的指针指向整型变量。 (38)以下程序的输出结果是______。 main() { char st[20]= "hello\0\t\\"; printf("%d%d\n",strlen(st),sizeof(st)); } A)99 B)520 C)1320 D)2020 答案:B 评析:c语言中字符串是以'\0'字符结束的,且strlen()函数计算的是'\0'字符前的所有字符的个数。本题中strlen(st)应为5。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。sizeof()函数是计算变量或数组的所分配到的内存空间的大小。所以本题的sizeof(st)为20。 (39)下面程序运行后的输出结果是______。 int d=1: fun(int p) { static int d=5;d+=p; printf("%d",d);return d; } main() {int a=3;printf("%d\n",fun(a+fun(d)));} A)6 9 9 B)6 6 9 C)6 15 15 D)6 6 15 答案:C 评析:静态局部变量在编译时赋初值,即只赋初值一次,在程序运行时它已有初值。以后每次调用时不再重新赋初值而只是保留上次函数调用结束时的值,而对自动变量赋初值,不是在编译时进行的,而在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。 本题在程序开头定义了全局变量d并赋初值1,在被调函数fun()中,定义了静态局部变量d,初值为5。在第一次调用函数fun时,d初值为5,p由主函数传递过来的值为1,则d=d+p=5+l=6,由于d是静态局部变量,在函数调用结束后,它仍保留d=6。再次调用fun函数,d的初值为6,而由主函数传递的p的值为9,则此时d=d+p=6+9=15,最后打印输出d的值并返回主函数。 (40)以下选项中,不能正确赋值的是______。 A)char s1[10];sl="chest"; B)char s2[]。{'C','t','e','s','t'); C)char s3[20]= "Chest"; D)char*s4="Ctest\n"' 答案:A 评析:c语言中不能将字符串常量直接赋给数组。但在赋初值时可以。 (41)以下程序输出正确的是______。 alnovep(int *p,int(*a)[3],int n) {int i,j; for(i=0;i<n;i++) for(j=0 ;j<n;j++){ *p=a[i][j];p++;} } main() {int *p,a[3][3]={{1,3,5},{2,4,6}}; p=(int*)malloc(100); amovep(p,a,3); printf("%d%d\n",p[2],p[5]);free(p); } A)56 B)25 C)34 D)程序错误 答案:A 评析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别为:a[0][0]=l,a[0][1]=3,a[0][2]=5,a[1][0]=2,a[l][1]=4,a[1][2]=6,a[2][O]=0,a[2][1]=0,a[2][2]=0a 通过malloc()函数给指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参p,实参数组a与形参中指向数组的指针变量共用同一存储空间。最后输出p[2],p[5]为56。 (42)下面程序的输出结果是______。 #define a 121 const b=12: enum c{a1,a2}; main() { printf("%d,%d,%d.",sizeOf(a),sizeOf(b),sizeof(enum C)); } A)121,0,4 B)2,2,2 C)0,2,4 D)0,2,2 答案:B 评析:sizeof函数是取变量所占的存储空间的字节数,标识a代表常量121;const b=12;,其中数据类型可以缺省,默认为整型;enum c{al,a2};定义了一个枚举类型enum c,al,a2为枚举元素,在c编译时,对枚举元素按常量处理,它们的值按定义顺序依次为0,1。因此它们的字节数均为2,2,2。 (43)以下程序的输出结果是______。 struct HAR {int x,y;struct HAR *p;} h[2]; main() { h[0].X=1; h[O].y=2; h[1].x=3;h[1].y=4; h[0].p=&h[1];h[1].p=h; printf("%d%d\n",(h[O].p)->x,(h[1].p)->y); } A)12 B)23 C)14 D)32 答案:D 评析:本题中是一个含有两个结点的循环链表。 c语言中结构体的定义为:. struct结构体类型名 { 成员项表: }; (44)变量a所占的内存字节数是______ 。 A)4 B)5 C)6 D)8 Union U { char st[4]; Int i: Long l; }; Struct A { int c; Union U u; }a; 答案:C 评析:结构体变量所占内存长度是各成员占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。本题结构体变量a中成员c为整型占2个字节,共用体变量u最大长度为4个字节,故选C。 (45)以下程序的结果是______。 int a,b; void fun() { a=100;b=200;) main() {int a=5,b=7; fun(); printf("%d%d\n",a,b); } A)100200 B)57 C)200100 D)75 答案:B 评析:全程变量是可以在子函数中对其值作改变,且它也可作为函数间的值传递。但当函数或子函数中定义了与全程变量名称相同的局部变量,则全程变量将被屏蔽。 (46)以下程序的输出结果是______。 #define M(x,y,z) x*y+z main() { int a=l,b=2,c=3; printf("%d\n",M(a+b,b+c,c+a)); } A)19 B)17 C)15 D)12 答案:D 评析:c语言的宏定义包括不带参数的宏定义与带参数的宏定义。本题为带参数的宏定义,其形式为:#define宏名(形参表) 字符串,本题的M(a十b,b+c,c+a)被字符串a+b*b+c+c+a代替。 (47)若有以下说明和语句: struct st {int n;char *ch;); struct st a[3]={5,"abc",7,"def',9,"ghK"},*p=a;则值为6的表达式是______。 A)p++ ->n B)p一>n++ C)(*p).n++ D)+十p->n 答案:D 评析:根据结构变量的存储特点,p+l意味着增加地址值为结构体数组a的一个元素所占的字节数,'即p++使p由a[0]指向a[1]起始地址。本题++p>n得到p指向的结构体变量中成员n的值使之加l。因为p指向数组a起始地址,p->n的值为5,再执行自加l运行,结果为6。 (48)整型变量x和Y的值相等,且为非O值,则以下选项中结果为0的表达式是______。 A)x||Y B)X|Y C)X&Y D)X^Y 答案:D 评析:"‖"为或运算符,当其左右表达式中只要一个为非零则整个表达式的值1。︱是按位或,&是按位与,^是按位异或,这三位运算符是按值的二进制位来比较的。 (49)C语言中,组成数据文件的成分是______。 A)记录 B)数据行 C)数据块 D)字符(字节)序列 答案:D 评析:c语言中的文件是流式文件。流式文件是一种无结构文件,即整个文件是一串字符流或二进制流。文件的存取以字符或字节为单位。 (50)下面的程序执行后,文件test.t中内容是______。 #include<stdio.h> void fun(char *fname,char *st) { FILE *myf;int i; myf=fopen(fname, "w"); for(i=0;i<strlen(st);i++)fputc(st[i],myf); fclose(myf); } main() {fun("test.t","new world");fun("test.t","hello,");} A)hello, B)new worldhello C)new world D)hello,rid 答案:A 评析:c语言中文件有文本文件与二进制文件,对文件的使用前必须先打开,打开方式有只读、写入、读写等方式。 二、填空题(每空2分,共40分) 请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。 (1)实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 【1】 。 答案:【1】空间复杂度和时间复杂度 评析:算法的复杂性是指对一个在有限步骤内终止算法和所需存储空间大小的估计。算法所需存储空间大小是算法的空间复杂性,算法的计算量是算法的时间复杂性。 (2)数据结构包括数据的逻辑结构、数据的 【2】 以及对数据的操作运算。 答案:【2】存储结构 评析:数据结构包括3个方面,即数据的逻辑结构、数据的存储结构及对数据的操作运算。 (3)一个类可以从直接或间接的祖先中继承所有属性和方法。采用这个方法提高了软件的 【3】 。 答案:【3】可重用性 评析:继承的优点:相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余,提高软件的可重用性。 (4)面向对象的模型中,最基本的概念是对象和 【4】 。 答案:【4】类 评析:面向对象模型中,最基本的概念是对象和类。对象是现实世界中实体的模型化;将属性集和方法集相同的所有对象组合在一起,可以构成一个类。 (5)软件维护活动包括以下几类:改正性维护、适应性维护、 【5】 维护和预防性维护。 答案:【5】完善性 评析:软件维护活动包括以下几类:改正性维护、适应性维护、完善性维护和预防性维护。完善性维护是指为了满足用户对软件提出的新功能与性能要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。 (6)语句:X++;、++X;、X=X+1;、X=l+X;,执行后都使变量X中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【6】 。 答案:【6】X+=1: 评析:在c语言中使变量增l的方法有:自增运算符与赋值语句。其中自增运算符有前置与后置方式,赋值语句也有两种类型。 本题中的主要增l方式有:x++;、++x;、X=X+I;、x=1+x;、x+=l;。 (7)设Y是int型变量,请写出判断Y为奇数的关系表达式 【7】 答案:【7】Y%2==1 或Y%2!=0 评析:判断变量是否为奇数可以用变量与2取模,判断结果是为1或不为0。本题具体做法如下:Y%2==1或Y%2 1=0。 (8) 以下程序的输出是 【8】 。 main() { char strl[]="How do you do",*pl=strl: strcpy(strl+strlen(strl)/2,"es she"); printf("%s\n",p1); } 答案:【8】How does she 评析:strcpy(strl,s1):字符串拷贝函数,作用是将字符串s1拷贝到字符数组strl中去。strlen(str):测试字符串str的长度,函数的值为字符串中实际长度,不包括'\O'在内。本题中strlen(strll的值为13,则strcpy(strl+strlen(strl)/2,"es she",);相当于strcpy(strl+6,"es she");,因此可得答案为How does she。 (9)以上程序运行后的输出结果是 【9】 。 main() {int i=10,J=0; do {j=j+i;i--;} while(i>2); printf("%d\n",j); } 答案:【9】52 评析:do...while语句的形式为: do { 语句: }while(条件表达式) 当条件表达式为非零时,继续执行循环体,直到条件表达式为零时退出循环。 (10)设有如下程序: main() {int nl,n2; scanf("%df",&n2); while(n2!=0) { nl=n2%lO; n2=n2/10: printf("%d",n1); } } 程序运行后,如果从键盘上输入1298,则输出结果为 【10】 。 答案:【10】8921 评析:本题的程序的功能是将输入的整数反向输出。 (11)以下程序输出的最后一个值 【11】 。 Int ff(int n) {static int f=1: f=f*n: retun f } main() { int i; for(i=1;i<=5;i++)printf("%d\n",ff(i)); } 答案:【ll】120 评析: 静态变量的类型说明符是static,静态局部变量属于静态存储方式,它具有以下特点: ①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。 ②对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。 ③如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。(注意:c语言中的非静态变量在定义时,系统并不会自动给它赋初值) ④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。 本题中函数的功能是:与for语句一起求一个整数的阶乘。 (12)以下函数的功能是:求x的y次方,请填空. double fun(double x,int y) {int i; double z; for(i=1,z=x;i<y;i++)z=z* 【12】 ; return z: ) 答案:【12】x 评析:函数的定义形式为: 函数类型函数名(形参表) { 类型说明语句; 执行语句: } 本题中函数的功能是:累积变量以求得变量的Y次方。 (13)下列程序的输出结果是 【13】 。 main() { int a[]={2,4,6},*ptr=&a[0],x=8,y,z; for(y=O;y<3;y++) z=(*(ptr+y)<x)?*(ptr十y):x; printf("%d\n",z); } 答案:【13】6 评析:条件运算符的优先级高于赋值运算符,因此本题先计算关系表达式(*(ptr+y)<x)?*(ptr+y):x的值,再赋给变量z。当y=O时,*(ptr+y)=2,而x=8,(*ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=2,所以Z=2;当y=l时,*(ptr+y)=4,(*(pty+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=4,所以z=4;当y=2时,*(ptr+y)=6,(*(ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=6,所以z=6;循环结束。因此输出z的结果为6。 (14)以下程序运行后的输出结果是 【14】 。 main() { char s[]="9876",*p; for(p=s;p<s+2;p++)printf("%s\n",p); } 答案:【14】9876 876 评析:指针是一种数据类型,这种数据类型的变量用来存放内存中分配的存储单元的首地址。 指针的定义: 类型说明符 *指针变量名; (15)若有定义语句:char s[100],d[100];int j=0,i=0;且s中已赋字符串,请填空以实现拷贝。(注:不使用逗号表达式) while(s[i]){d[j]= 【15】 ;j++;} d[j]=0; 答案:【15】s[i++] 评析:本题中为了能实现字符串的拷贝,需要使字符数组s从头到尾依次遍历其所有元素。本题应使用i的自增后置来实现。 (16)若有如下结构体说明: struct STRU { int a,b;char c:double d: struct STRU *pl,*p2; }; 请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。 【16】 t[20] 答案:【16】struct STRU 评析:结构体类型是构造数据类型,是用户自己定义的一种类型。 结构体类型的定义: struct结构体类型名 { 成员项表: }; 定义结构体变量的的形式为: struct结构体类型名 变量1,变量2,... 其中变量包括:一般变量、指针变量、数组变量等。 (17)下面的程序可对指定字符串中的字符串进行从大到小排序,请将程序填完整(注:程序采用了冒泡排序算法) #include<stdio.h> #include<string.h> main() { char *str="ABCDabcd",temp; Int n,i; n=strlen(str); while(n-->1) for(i=0;i<n;i++) if(str[i]<str[i+1]) { temp= 【17】 ; str[i]=str[i+1]; _【18】 =temp; } Printf(_【19】 ); } 答案:【17】str[i] 【18】str[i+1] 【19】"%s",str 评析:本题要求将字符串str中的字符用冒泡排序算法从大到小排列,其实现过程是将相邻两个字符进行比较,如果当前字符小于下一个字符,则通过中间变量temp将字符两两交换,所以第一空应填:str[i],第二空应填:str[i+1]。最终打印输出得到的字符串str,所以第三空应填;"%s",str。 (18)以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调 用ftell函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。 FILE *myf;long fl; myf=_【20】 ("test.t","rb"); fseek(myf,(),SEEK_END);fl+ftell(myf); fclose(myf); printf("%l d\n",f1); 答案:【20】fopen 评析:C语言中的文件分为:ASCII文件与二进制文件。文件在使用前打开,使用后要关闭。 打开文件的函数为:fopen(),调用形式为:fp=fopen("文件名","使用文件方式"); 关闭文件的函数为:fclose(),调用形式为:fclose(fp);其中fp为文件指针。 |