二、填空题。
(1)算法的复杂度主要包括空间复杂度和【1】复杂度。 【解析】算法的复杂度主要指时间复杂度和空间复杂度。
(2)在线性结构中,队列的操作顺序是先进先出,而栈的操作顺序是【2】 。 【解析】队列和栈都是线性结构,但是不同之处在于队列的操作顺序是先进先出,而栈的操作顺序是先进后出。
(3)数据流图的类型有【3】和事务型。 【解析】典型的数据流图有两种,即变换型和事务型。
(4)在数据库理论中,数据物理结构的改变,如存储设备的更换、物理存储的更换、存取方式等都不影响数据库的逻辑结构,从而不引起应用程序的变化,称为【4】 。 【解析】数据的物理结构改变,不影响数据库的逻辑结构,从而不引起应用程序的变化,这种性质叫做物理独立性。
(5)数据库管理系统是位于用户与【5】之间的软件系统。 【解析】数据库管理系统是帮助用户创建和管理数据库的应用程序的集合。因此,数据库管理系统需要操作系统的支持,为用户提供服务。
(6)若从键盘输入58,则以下程序的输出结果是【6】 。 main() { int a; scanf("%d",&a); if(a>50) printf("%d",a); if(a>40) printf("%d",a); if(a>30) printf("%d",a); } 【解析】在程序中,执行scanf()语句后,a被赋值为58。接着执行第一个if语句,因为,a=58>50,执行第一个if语句后面的输出语句,输出58;接着执行第二个if语句,因为,a=58>40,执行第二个if语句后面的输出语句,输出58;接着执行第三个if语句,因为,a=58>30,执行第三个if语句后面的输出语句,输出58,所以最后的输出为585858。
(7)以下程序的输出结果是【7】 。 main() { int a=177; printf("%o\n",a); } 【解析】在控制格式符中“o”代表的是将数据按八进制数输出,十进制数的177代表的八进制数是261。
(8)以下程序的输出结果是【8】 。 main() { int a=0; a+=(a=8); printf("%d\n",a); } 【解析】在程序中首先将8赋值给变量a,然后再进行复合赋值运算。即a=a+a=8+8=16,所以该空格处应该填16。
(9)以下程序的输出结果是【9】 。 main() { int a=5,b=4,c=3,d; d=(a>b>c); printf("%d\n",d); } 【解析】关系运算符“>”的结合方式是从左向右的,所以在本题中的表达式a>b>c;从左向右开始计算,a>b的结果为“1”,接着1和c比较假,该空格处应该填0。
(10)以下定义的结构体类型包含两个成员,其中成员变量info用来存放整型数据;成员变量link是指向自身结构体的指针。请将定义补充完整。 struct node { int info; 【10】link; }; 【解析】link是指向结构体自身的指针,因此link是指针,指向struct node类型的数据,可定义成“struct node *link”。
(11)以下程序的输出结果是【11】 。 main() { int s,i; for(s=0,i=1;i<3;i++,s+=i); printf("%d\n",s); } 【解析】此程序中,for循环语句后面直接跟了一个“;”,表明循环体为空。输出语句不在for循环体内,所以在循环执行完毕后才输出s的值。s、i的初值分别为0和1,判断循环条件,表达式“1<3”成立,执行“i++,s+=i”后,i和s的值分别为2和1,继续判断循环条件,表达式“2<3”成立,执行“i++,s+=i”后,i和s的值分别为3,再次判断循环条件,表达式“3<3”不成立,循环结束。
(12)以下程序的输出结果是【12】 。 main() { char *p="abcdefgh",*r; long *q; q=(long *)p; q++; r=(char *)q; printf("%s\n",r); } 【解析】本题定义了一个字符型指针变量p并通过赋初值让它指向了一个字符串,定义了另一个字符型指针变量r和一个长整型指针变量q。首先通过语句“q=(long*)p;”把p的地址值强制转换为长整型地址值并赋值给q,然后执行“q++;”,地址值增加了4,执行语句“r=(char*)q;”,把长整型指针变量q的值再强制转换成字符型地址值并赋给r,r的值应为字符串中字符“e”的地址,最后输出r指向的字符串,是“efgh”。
(13)以下程序的输出结果是【13】 。 main() { char s[]="abcdef"; s[3]='\0'; printf("%s\n",s); } 【解析】字符串的结束标记'\0',当输出一个存放在字符数组中的字符串时,只需输出到'\0'为止,而不管其后有什么数据。本题给字符数组s的元素s[3]赋值为'\0',故只能输出3个字符“abc”。
(14)以下程序的输出结果是【14】 。 main() { int x=0; sub(&x,8,1); printf("%d\n",x); } sub(int *a,int n,int k) { if(k<=n)sub(a,n/2,2*k); *a+=k; } 【解析】在主函数中定义了一个变量x并赋初值0,然后执行函数调用语句,该语句的执行过程为sub(&x,8,1)调用sub(&a,4,2),sub(&a,4,2)调用sub(&a,2,4),sub(&a,2,4)中由于2<4,所以if后面括号里的判断为假,递归结束,执行其后的*a+=k;语句此时x=x+k=0+4=4,回退到上一层调用函数sub(&x,4,2)中,执行后面的语句,x=x+k=4+2=6,再回推到最上一层调用函数sub(&x,8,1)执行后面的语句,x=x+k=6+1=7,所以最后输出7。
(15)设有如下宏定义 #define MYSWAP(z,x,y) {z=x;x=y;y=z;} 以下程序段通过宏调用实现变量a、b内容的交换,请填空。 float a=5,b=16,c; MYSWAP(【15】,a,b); 【解析】本题关键在考生是不是了解宏的基本运用,在使用宏的时候明显少了一个实参。在定义宏的时候变量z是用来做中间变量的,题目中缺的变量就是一个中间变量c。
(16)以下程序用来统计文件中字符的个数。请填空。 #include "stdio.h" main() { FILE * fp; long num=0L; if((fp=fopen("fname.dat", "r"))==NULL); { printf("Open error\n");exit(0);} while(【16】) { fgetc(fp);num++;} printf("num=%1d\n",num-1); fclose(fp); } 【解析】统计文件中字符个数的算法可描述如下:首先判断文件位置指针是否指向了文件尾,如果不是则读出一个字符,同时字符的个数加1,再判断文件位置指针是否位于文件尾,如此循环,直到文件位置指针位于文件尾为止。本题首先以读文件的方式打开了文件“fname.dat”,如果打开成功则把返回的文件型指针赋值给fp,然后通过循环求文件中的字符数。首先判断文件位置指针是否位于文件尾,如果不是则循环读取字符,每次字符数加1。所以下划处应填循环条件,文件位置指针不是指向文件尾,即“!feof(fp)”。
(17)以下程序中,select函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。请填空。 #define N 3 #define M 3 select(int a[N][M],int *n) { int i,j,row=1,colum=1; for(i=0;i<N;i++) for(j=0;j<M;j++) if(a[i][j]>a[row][colum]){row=i;colum=j;} *n=【17】; return(【18】); } main() { int a[N][M]={9,11,23,6,1,15,9,17,20},max,n; max=select(a,&n); printf("max=%d,line=%d\n",max,n); } 【解析】指针变量作为函数参数及二维数组的一个典型算法—求最大值及其下标。通过对题意的分析,在select()函数中,变量row的作用是用来记录最大元素的行下标,colum的作用是用来记录最大元素的列下标。程序中通过一个循环求得数组元素中最大值的行列下标,分别存放在变量row和colum中,根据题意,应该把行下标赋值给形参指针变量n指向的变量,把最大值a[row][colum]作为函数值返回。
(18)mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空。 int mystrlen(char *str) { int i; for(i=0;【19】!= '\0';i++); return(【20】); } 【解析】求str指向的字符串长度的算法是:用一个变量i表示字符串中字符的位置,一开始赋值为0,取出i位置的字符,判断是否为“\0”,若不是,则i的值加1,如此循环直到取出的字符是“\0”为止,此时i的值就是字符串的长度。由此可知,第一个空处应填第i位置上的字符*(str+i);第二个空格应该填字符串的长度i。
|