|
一、选择题(1)~(10)每小题2分,(11)-(50)每小题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1)算法分析的目的是________。 A)找出数据结构的合理性 B)找出算法中输入和输出之间的关系 C)分析算法的易懂性和可靠性 D)分析算法的效率以求改进 答案:D 评析:算法分析是指对一个算法的运行时间和占用空间做定量的分析,一般计算出相应的数掌级,常用时间复杂度和空间复杂度表示。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。 (2)n个顶点的强连通图的边数至少有________。 A)n-1 B)n(n-1) C)n D)n+l 答案:C 评析:在有向图中,若任意两个顶点都连通,则称该图是强连通图,这样的有向图的形状是环状,因而至少应有n条边。 (3)已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是________。 A)堆排序 B)直接插入排序 C)快速排序 D)直接选择排序 答案:B 评析:当数据表A中每个元素距其最终位置不远,说明数据表A按关键字值基本有序,在待排序序列基本有序的情况.下,采用插入排序所用时间最少,故答案为选项B。 (4)用链表表示线性表的优点是________。 A)便于插入和删除操作 B)数据元素的物理顺序与逻辑顺序相同 C)花费的存储空间较顺序存储少 D)便于随机存取 答案:A 评析:链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。 (5)下列不属于结构化分析的常用工具的是________。 A)数据流图 B)数据字典 C)判定树 D)PAD图 答案:D 评析:结构化分析的常用工具有数据流图、数据字典、判定树和判定表。而PAD图是常见的过程设计工具中的图形设计。 (6)软件开发的结构化生命周期方法将软件生命周期划分成________。 A)定义、开发、运行维护 B)设计阶段、编程阶段、测试阶段 C)总体设计、详细设计、编程调试 D)需求分析、功能定义、系统设计 答案:A 评析:通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。它可以分为软件定义、软件开发及软件运行维护三个阶段。 (7)在软件工程中,白盒测试法可用于测试程序的内部结构。此方法将程序看做是________。 A) 循环的集合 B)地址的集合 C)路径的集合 D)目标的集合 答案:C 评析:软件的白盒测试方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。 (8)在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有________。 A)数据无冗余 B)数据可共享 C)专门的数据管理软件 D)特定的数据模型 答案:D 评析:在文件系统中,相互独立的记录其内部结构的最简单形式是等长同格式记录的集合,易造成存储空间大量浪费,不方便使用。而在数据库系统中,数据是结构化的,这种结构化要求在描述数据时不仅描速数据本身,还要描述数据间的关系,这正是通过采用特定的数据模型来实现的。 (9)分布式数据库系统不具有的特点是________。 A)分布式 B)数据冗余 C)数据分布性和逻辑整体性 D)位置透明性和复制透明性 答案:B 评析:分布式数据库系统具有数据分布性、逻辑整体性、位置透明性和复制透明性的特点,其数据也是分布的;但分布式数据库系统中数据经常重复存储,数据也并非必须重复存储,主要视数据的分配模式而定。若分配模式是一对多,即一个片段分配到多个场地存放,则是冗余的数据库,否则是非冗余的数据库。 (10)下列说法中,不属于数据模型所描述的内容的是________。 A)数据结构 B)数据操作 C)数据查询 D)数据约束 答案:C 评析:数据模型所描述的内容有3个部分,它们是数据结构、数据操作和数据约束。数据操作主要是描述在相应数据结构上的操作类型与操作方式;数据模型中的数据约束主要描述数据结构内数据间的语法、语义联系,它们之间的制约与依存关系,以及数据动态变化的规则,以保证数据的正确、有效与胡容。 (11)在结构化程序设计中,限制使用goto语句的原因是________。 A)提高程序的执行效率 B)提高程序的清晰性和可靠性 C)便于程序的合成 D)该语句对任何结构的程序都不适用 答案:B 评析:在c语言中,限制使用goto语句,其目的是为了提高程序的清晰性与可靠性,一般来说,除了从多重循环中跳出,一般不使用goto语句。 (12)以下选项中合法的实型常数是________。 A)5E2.0 B)E-3 C).2E0 D)1.3E 答案:C 评析:以指数形式表示实数时,字母e(或E)之前必须有数字,且e后面指数必须为整数。 (13)下列叙述中,正确的是________。 A)C语言中既有逻辑类型也有集合类型 B)c语言中没有逻辑类型但有集合类型 B)C语言中有逻辑类型但没有集合类型 B)C语言中没有逻辑类型也没有集合类型 答案:B 评析:在c语言中只提供了整型、浮点型、字符型这几种基本类型,c语言没有提供逻辑类型,在c中一般用整型来表示逻辑类型。在自定义类型中,c提供了struct,enum及union类型,但没有提供集合类型,在pascal中提供了集合类型set。 (14)已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,则用八进制表示的字符常量'\10l'是________。 A)字符A B)字符a C)字符e D)非法的常量 答案:A 评析:八进制101转换为十进制即为65,而字母A的ASCII码是65,所以用八进制表示的字符常量'\101'是A。 (15)设a和b均为double型常量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是________。 A)6.500000 B)6 C)5.500000 D)6.000000 答案:D 评析:各类数值型数据在进行混合运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则为:总是转换为精度更大的数据类型,字符数据转换为整数,short型转为int型,float型数据在运算时转换成双精度型,以提高运算精度。 (16)以下四个选项中不能看作一条语句的是________。 A){;} B)a=0,b:0,c=0; C)if(a>0); D)if(b==0)m=l;n=2; 答案:D 评析:选项A为空语句,选项B是一个由逗号运算符表达式形成的语句,选项c为一个条件语句,选项D有两个分号,是由两个语句构成,不能看成一条语句。 (17)已知i、j、k为int型变量,若从键盘输入:1,2,3↙,使i的值为l、j的值为2、k的值为3,以下选项中正确的输入语句是________。 A)scanf("%2d%2d%2 dtt,&i,&j,&k); B)scanf("%d %d %d",&i,&j,&k); C)scanf("%d,%d,%dfI,&i,&j,&k); D)scanf("i=%d,j=%d,k=%d-t,&i,&j,&k); 答案:C 评析:如果在"格式控制"字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。 (18)关于goto语句的使用,下面正确的是________。 A)goto 2; B)goto g; C)goto g:; D)goto 2; 2:exit(0); g:exit(O); g:exit(O); 2 exit(0); 答案:B 评析:在c中,goto语句后面的标号的命名规则与c语言中标识符的命名规则相同,在goto语句后面的标号后不要加":"号,在某一行上添加标号时,在标号的后面要添加":"号。 (19)若有以下程序: main() {int k=2,i=2,m; m=(k+=I*=k); printf("%d,%d、n",m,i); } 执行后的输出结果是__________。 A)8,6 B)8,3 C)6,4 D) 7,4 答案:C 评析:在赋值符"="之前加上其它运算符,可以构成复合的运算符。此运算为右结合性,即从右往左计算。I*=k即i=i*k=2*2=4,k=k+i=2+4=6,然后将k的值赋给m。 (20)以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。 #define N 10 void arrin(int x[N]) { int i=0; while(i<N)scanf("%d",_________); } 在下划线处应填入的是_________。 A)x+i B)&x[i+l] C)x+(i++) D)&x[++I] 答案:C 评析:在c中,对于一维数组而言,数组变量表示数组中首元素的的地址。当用scanf函数向数组x的第i个元素中输入整型数据时,只要执行scanf("%d"x+i):由于要循环输入数组中和各个元素,必须要使其地址值不断自增。故本题答案为c。 (21)已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-l&&y+z/2的值是_________。 A)6 B)0 C)2 D)1 答案:D 评析:在本题中,运算符的优先级分别为:!>/>+,->&&即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=l。 (22)以下选项中,与k=11++完全等价的表达式是__________。 A)k=n,n=n+1 B)n=n+1,l(=n C)l(=什n D)k+--n+1 答案:A 评析:n++是自增运算,是先使用,然后再使n加1,分开来写即为:k=n,n=n+l。 (23)以下程序运行后,输出结果为__________。 main() { int y=18,i=0J,a[8]; do {a[I]=y%2;i++;y。y/2; }while(y>。1); for(j=i一1 0>=00一) printf("%d"a[j]); printf("\n"); } A)10000 B)10010 C)00l 10 D)10100 答案:B 评析:分析程序不难得知该程序的功能实际上就是采用除余取整法实现将10进制数据转换成二进制数。对于10进制数18,其转化为二进制数后,结果为10010。 (24)以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下: main() {int n,k; float score,sum,ave; sum=0.0; for(n=1;n<=10;n++) {for(k=l;k<=4;k++) {seal3f("%f",&score); sum+=score; } ave=sum/4.0; printf("NO%d:%f\n",n,ave); } } 上述程序运行后结果不正确,调试中发现有一条语句出现在程序的位置不正确。这条 语句是________。 A)sum=O.O; B)sum+=score; C)ave=sum/4.0; D)printf("NO%d:%fua",n,ave); 答案:A 评析:题目中要求每位学生的平均分数,首先要求每位学生的总分,也就是程序中的Sum,所以sum应在第一个for循环体内赋初值,如果在循环体外赋初值就会得到所有学生的分数总和,不合题意。 (25)下面程序执行后的输出结果是__________。 main() { charx=Oxddff; printf("%d\n",x); } A)-35 B)-1 C)255 D)-8705 答案:B 评析:由于程序中对字符变量x赋值为0xddff,而字符型变量只占一个字节,故实际存入c单元的为该16进制的低字节部分,即ff。对该数按整型格式输出,其结果为-1。 (26)有以下程序 main() { int a=15,b=21,m=O; switch(a%3) { case O:m++;break; case l:m++: switch(b%2) { default:m++; case O:m++;break; } } printf("%d\n",m); } 程序运行后的输出结果是_________。 A)l B)2 C)3 D)4 答案:A 评析:因为a%3是个常数,所以只执行一次就跳出switch结构。即只执行m++,此时m为1。 (27)若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是_________。 A)p=q; B)*p=*q; C)n=*q; D)p*n; 答案:D 评析:指针变量不同于整型变量和其它类型的变量,它是用来存放地址(指针)的,不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量,这样的赋值是不合法的。
(28)已定义以下函数: fun(char*p2,char*p1) {while((*p2=*p1)!='\0'){pl++;p2++;}} 函数的功能是__________。 A)将p1所指字符串复制到p2所指内存空间 B)将pl所指字符串的地址赋给指针p2 C)对p1和p2两个指针所指字符串进行比较 D)检查p1和p2两个指针所指字符串中是否有'\O' 答案:A 评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!='\0'的作用是判断当前字符是否为字符串结束字符'\O'。在循环体中p1++,p2++的目的是移动字 (29)有以下程序 void fun(char*c,int d) {*c=*c+1;d=d+1; printf("%c,%c,",*c,d); } main() {char a:。A',b。'a'; fun(&b,a);printf("%c,%c\n",a,b); ) 程序运行后的输出结果是_________。 A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b 答案:D 评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b; a=a+l=A+l=B,打印出第二个字符B; a='A',输出字母A; b由于是按地址传到函数而被修改,为'b',输出字母b (30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。 void sort(int a[],im n) {intiJ,t; for(i=O;i<n-1;i++) for=i+1 0<n0++) if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;} } main() {int aa[10]:{1,2,3,4,5,6,7,8,9,10},i; sort(&aa[3],5); for(i=0;i<lO;i++)primf("%d,",aa[I]); printf("\n"); ) 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1, C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3, 答案:C 评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。 (31)对于基类型相同的两个指针变量,不能进行的运算是________。 A)< B)= C)+ D) 答案:C 评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。 (32)有以下程序 main() {char a[]={'a','b','c','d','e','f','g','h','\O'};int I,J; i=sizeof(a); j=strlen(a); printf("%d,%d\n",I,J); } 程序运行后的输出结果是________。 A)9,9 B)8,9 C)1,8 D)9,8 答案:D 评析:sizeof()函数是计算字符数组的长度,因为'\0'也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到'\0'即认为是字符串结束,不把空字符计入字符串的长度。 (33)以下不能正确定义二维数组的选项是_________。 A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4} C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}} 答案:D 评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。 (34)有一函数 ┏ l x>O y=┨ O x=O ┗ -1 x<O 以下程序段中不能根据x的值正确计算出y的值的是___________。 A)if(x>O)y=l;else if(x==O)y=0;else y=-l; B)y=O;if(x>O)y=1;else if(x<O)y=-1; C)y=0;if(x>=0)if(x>O)y=1;else y=-l; D)if(x>=0)if(x>O)y=l;else y=O;else y=-1; 答案:C 评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。 (35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。 void reverse(int a[],im n) {int i,t; for(i=O;i<n/2;i++) {t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;} } main() {int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[I]; printf("%d\n",s); } 程序运行后的输出结果是 A)22 B)10 C)34 D)30 答案:A 评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1,9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。 (36)执行下面的程序段后,变量k的值为___________。 int k=3,s[2]; s[0]=k;k=s[1]*10; A)不确定 B)33 C)30 D)10 答案:A 评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。 (37)有以下程序 #include<string.h> main() { char'p="abcde\0fghjik\O"; printf("%d\n",strlen(p)); } 程序运行后的输出结果是__________。 A)12 B)15 C)6 D)5 答案:D 评析:"\0"是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。 (38)程序中头文件t)rpel_h的内容是: #define N 5 #define Ml N*3 程序如下: #include"type 1.h" #define M2 N*2 main() { int i; i=MI+M2; printf("%d\n",i); } 程序编译后运行的输出结果是_________。 A)lO B)20 C)25 D)30 答案:C 评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define 标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为"宏名"。 (39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。 int t[3][3],*pt[3],k; for(k=0;k<3;k++)pt[k]=&t[k][O]; A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1] 答案:C 评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1][2]的元素的值。 (40)以下叙述中错误的是_________。 A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以 B)在程序结束时,应当用fclose函数关闭已打开的文件 C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数 据 D)不可以用FILE定义指向二进制文件的文件指针 答案:D 评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。 (41)有以下程序 #include<string.h> main(int argc,char *argv[]) { inti,len=0; for(i=1;i<argc;i++)len+=strlen(argv[I]); printf("%d\n",len); ) 程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是: exl abcd efg 10↙ 则运行的结果是________。 A)22 B)17 C)12 D)9 答案:D 评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv用来存放命令行中命令字和所有参数的字符串,并规定argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv[21用来存放第二个参数的字符串e龟,argv[3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到len中,所以答案为9。 (42)若有以下说明和定义:__________。 fun(*C){…} main() {int(*a)()=fun,(*b)(),w[10],c;} 在必要的赋值后,对fun函数调用正确的是_________。 A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b); 答案:B 评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。 (43)有以下程序 intfa(intx、 {returnx*x;} int fb(intxl {returnX*X*x;} int f(int(*f1)(),int(*f2)(),int x) {return f2(x)-fl(x);) main() { int i; i=f(fa,fb,2);printf("%d\n",i); } 程序运行后的输出结果是 A) 4 B)1 C)4 D)8 答案:C 评析:f[fa,fb,2]即为fb(2)-fa(2)=2*2*2-2*2=8-4=4。 (44)有以下程序 void ss(char *s,char t) {while(*s) { if(*s==t)*s=t-'a'+'A'; s++: } } main() {char strl[100]="abcddfefdbd",c='d'; ss(strl,C); printf("%s\n",strl); } 程序运行后的输出结果是_________。 A)ABCDDEFEDBD B)abcDDfefDbD C)abcAAfefAbA D)Abcddfefdbd 答案:B 评析:在主函数中因为c被赋值为字符'd.,所以函数的功能是将字符串中d字母转换为大写。 (45)下面程序运行后的输出结果是__________。 intf() { static int i=O: int s=l: s+=i;i++; return s: } main() { inti,a=0; for(I=0;i<5;i++)a+=f(); printf("%dha",a); ) A)20 B)24 C)25 D)15 答案:D 评析:在主函数main中,当I=0时,f()返回1;当I=1时,f()中保留前次执行后的i,返回2,i为n时;f()返回n+l,,在主函数main中一共调用了5次f(),其返回值分别是1,2,3,4,5,对各次的返回值进行累加,其和为15。 (46)设有如下定义: struct sk {int a; float b: }data; int*p; 若要使p指向data中的a域,正确的赋值语句是_________。 A)p=&a; B)p=data.a; C)p=&data.a; D)*p。data.a 答案:C 评析:将data.a的起始地址赋给指针变量p,也就是使p指向data.a。 (47)有以下程序 #include<stdlib.h> struct NoDE {int num;struct NoDE。next;} main() {struct NODE *p,*q,*r; p=(struct NoDE*)malloc(sizeof(struct NODE)); q=(struct NODE*)malloc(sizeof(struct NODE)); r==(struct NODE*)malloc(sizeof(struct NODE)); p->num=10;q->num=20;r->num=30; p->next=q;q->next=r; pdntf("%d\n",p->num+q->next->num); } 程序运行后的输出结果是____________。 A)10 B)20 C)30 D)40 答案:D 评析:p->num即为10,q->next->num即为r->num,为30,所以p->num+q->next=>num=10+30=40。 (48)若有以下说明和定义 typedef int *INTEGER INTEGER p,*q; 以下叙述正确的是________。 A)p是int型变量 B)p是基类型为int的指针变量 C)q是基类型为int的指针变量 D)程序中可用INTEGER代替int类型名 答案:B 评析:typedef int*INTEGER;(声明INTEGER为整型指针类型): INTEGER p,*q;(定义p,*q为整型指针类型),所以p是基类型为int的指针变量;*q是基类型为int的指针变量;程序中可用*INTEGER代替int类型名。 (49)有以下程序 main() {unsigned char a,b,c; a=0x3;b=a︱0x8;c=b<<l; printf("%d%d\n",b,C); } 程序运行后的输出结果是___________。 A)-11 12 B)-6 -13 C)12 24 D)l1 22 答案:D 评析:0x3表示16进制表,"︱"为按位或,"<<"为按位左移,将a,b转换为二进制数进行位运算,再将结果以十进制打印出,结果为11 22。 (50)以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 #include<string.h> void f(char p[][lO],int n) {chart[201;int ij; for(i=0;i<n-1;i++) for 0=i+l;j<n;j++) if[strcmp(p[i],p[j])<O] {strcpy(t,p[i]);strcpy(p[i],pD)};strcpy(p[j],t);) } main() {char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i; f(p,5);print"%d\n",strlen(p[0])); } 程序运行后的输出结果是__________。 A)6 B)4 C)5 D)3 答案:C 评析:比较字符串的大小是从字符串的第一个字母开始比较,如果第一个字母相同则比较第二个字母,以此类推,直至字符串结束。 二、填空题(每空2分,共40分) 请将每一个空的正确答案写在答题卡的【l】至【20】序号的横线上,答在试卷上不得分。 (1)测试的目的是暴露错误,评价程序的可靠性;而 【1】 的目的是发现错误的位置并 改正错误。 答案:【1】调试 评析:软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定:调试是一个与测试有联系又有区别的概念。具体来说,测试的目的是暴露错误,评价程序的可靠性,而调试的目的是发现错误的位置,并改正错误。 (2)在最坏情况下,堆排序需要比较的次数为 【2】 。 答案:【2】O(nlog2n1) 评析:在最坏情况下,冒泡排序所需要的比较次数为n(n-1)/2;简单插入排序所需要的比较次数为n(n-1)/2;希尔排序所需要的比较次数为O(n^1.5);堆排序所需要的比较次数为O(nlog2n)。 (3)若串s="Program,,,则其子串的数目是 【3】 。 答案:【3】29 评析:串s中共有7个字符,由于串中字符各不相同,则其子串中字符个数为0的串有1个,即空串;字符个数为1的字符串有7个;字符个数为2的字符串有6个;字符个数为3的字符串有5个;字符个数为4的字符串有4个;字符个数为5的字符串有3个;字符个数为6的字符串有2个;字符个数为7的字符串有1个;共有1+2+3+4+5+6+7+1=29。 (4)一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体""项目主管""与实体""项目""的联系属于 【4】 的联系。 答案:【4】l对多或1:N 评析:两个实体集间的联系实际上是实体集间的函数关系,这种函数关系可以有3种,即一对一(1:1)的联系、一对多(1:N)或多对一(N:1)的联系和多对多(N:N)的联系。 (5)数据库管理系统常见的数据模型有层次模型、网状模型和 【5】 三种。 答案:【5】关系模型 评析:数据库管理系统是位于用户与操作系统之间的一层系统管理软件,是一种系统软件,是用户与数据库之间的一个标准接口,其总是基于某种数据模型,可以分为层次模型、网状模型和关系模型。 (6)以下程序运行后的输出结果是 【6】 。 main() { int x=10,y=20,t=O; if(x==y)t=x;x=y;y=t; printf("%d,%d\n",x,y); } 答案:【6】20,0 评析:在本题给出的程序中,if条件为假,不执行t=x;语句,而去执行x=y;和y=t;语句,所以打印出x的值为20,y的值为0;但是如果程序这样写{t=-x;x=y;y=t;},那么就是实现x与y的交换。 (7)若已知a=20,b=lO,则表达式!a>b的值为 【7】 。 答案:【7】O 评析:c语言中逻辑运算符按由高到低顺序依次为:逻辑非(!)、算术运算符、关系运算符、逻辑与(&&)和逻辑或(1f)、赋值运算符。所以表达式!a>b先运算!a的值为0,再运算0>b,所以结果为0。 (8)以下程序运行后的输出结果是 【8】 。 main() {intx=15; while(x>10&&x<50) {x++; if(x/3){x++;break;) else continue; } print("%d\n",x); } 答案:【8】17 评析:当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++:后跳出循环体,此时x的值为17a (9)有以下程序: #include<stdio.h> main() {charc; while((c=getchar())!d?。)putchat(--C); } 程序运行时,如果从键盘输入:Y?N?↙,则输出结果为 【9】 。 答案:【9】X 评析:getchar()只能接收一个字符,当从键盘输入Y?N?↙,系统判断出第一个字符Y!='?'条件为真,输出x,继续循环,这时while条件不成立,循环结束。 (10)以下函数的功能是计算s=1+1/2!+1/3!+……+l/n!,请填空。 double fun(int n) {double s=0.0,fac=1.O;int i; for(i=1;i<=n;i++) { fac=fac 【10】 ; s=s+fac; } return s; } 答案:【10】/i或*1.0/i或*1/I或*(1.0/i)或/(double)i 评析:该程序实现的功能是求各个因式的和,观察表达式可以看出,只要将i的值的倒数乘以fac就得到每个因式的值。 (11)下面程序的运行结果是: 【11】 。 #define N 10 #define s(x)X*X #define f(x)(x*x) main() {int i1,i2; il=1000/s(N);i2=1000/f(N); printf("%d%d\n",t1,i2); } 答案:【11】1000 10 评析:根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*lO)=lO (12)以下程序的运行结果是 【12】 。 main() { static int a[]={l,2,3,4}; int iJ=2; for(I=l;i<3;i++) {n(a);J++;} printf(%d,%d\n",a[0],J); } f1(int a[4]) { int I,J=l; for(I=1;i<4;i+|+) a[I-1]=a[I]; j++; } 答案:【12】3,4 评析:用static对局部变量声明,则为该变量分配的空间在整个程序执行期间始终存在。n函数中定义的变量为局部变量,主函数中j的初值为2,循环执行了两次,所以j=4。主函数通过对n的调用输出原数组a[3]的值。 (13)下面程序的运行结果是: 【13】 。 typedef union student {char name[10]; long sno; char sex; float score[4]; }STU; main() {STU a[5]; primf("%d\n",sizeof(a)); } 答案:【13】80 评析:共用体变量所占的内存长度等于最长的成员的长度,所以变量、STU所占的字节数等于其成员score[4]所占的字节数,即为16个字节,最终打印出共用体数组a[5]的长度为J6*5=80。 (14)若f1)已正确定义为一个文件指针,d1.dat为二进制文件,请填空,以便为"读"而打开此文件:f1):fopen(【14】 );。 答案:【14】"d1.dat"."rb" 评析:ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件,其调用方式为(fb已定义为一个文件指针):fb=fopen(文件名,使用文件方式)。 (15)以下程序的功能是将无符号八进制数构成的字符串转换为十进制的整数,请填空。 #include<stdio-b> main() { char*p,s[6]; int n: p=s; gets(p); n=*p-'0'; while(【15】 !='\0')n=n*8+*p-'0'; printf("%d\n",n); } 答案:【15】*++D 评析:本题中,主要是通过将8进制数各位上的数乘以对应位的权值,然后累加转换成10进制数的。在程序中,n=*p-'0',用于将8进制字符串的最高位转换成10进制字符。在while循环中,通过不断对已转换的10进制数*8+*p-'0'形成新的10进制数。由于在该循环中没有其它地方对指针p的值进行更改,要实现对8进制字符串的遍历,必须要对其进行自加,而在循环的外面己处理了第1个8进制字符,故应该是采用先自加的形式,同时要对自加后的p所对应的字符进行判断以确定该字符串是否结束,故该空应填*++p。 (16)设有定义:int n,*k=&n;,以下语句将利用指针变量k读写变量n中的内容,请将语 句补充完整。 scanf("%d",【16】); printf("%d",【17】); 答案:【16】k 【17】*k 评析:本题中的笫一空,要求输入变量n的地址,而指针变量k指向整型变量n,故填写k.第二空要求打印输出变量n的值,应该填入*k。 (17)以下程序的功能是:从键盘输入一行字符,存入一个字符数组中,然后输出该字符 串,请填空。 #include<ctype.H> #include<stdio.h> main() { char str[8l],*sptr; int i: for(I=0;i<80;i++) { str[I]=getchar(); if(str[I]=='\n')break; } str[i]= 【18】 ; sptr=str; while(*sptr)putchar(*sptr【19】 ); } 答案:【18】0或NULL 【19】++ 评析:在for循环中,其作用是直接从标准输入设备获取字符,直到遇到回车符结束。由于在while循环输出字符时,是根据*sptr来判断字符串是否结束,故在字符串的结束部分必须添加上字符'\0'。对于第二空,要实现对字符串的遍历,必须要进行自加操作,以使下次访问时能够访问下一个字符,故第二空应为++。 (18)fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。 #include<stdio.h> #define N 100 int fun(im(*a)[N]) { int row,col,max,min; for(row=0;row<N;row++) {for(max=a[row][0],col=1;coI<N;col++) if(【20】]max=a[row][col]; if(row==0)min=max; else if(max<min)min=max; } retummin; } 答案:【20】max<a[row][col]或max<=a[row][col]或a[row][col]>max或a[row][col]>=max 评析:本题空格所在的if条件要求判断出每一行中的最大数,应该填写条件max<a[row][col]。
|