会计考友 发表于 2012-7-31 22:22:49

07年4月等级考试二级C语言练习一[4]

  二、填空题。

   (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赋值为'\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作为函数值返回。

   (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。
页: [1]
查看完整版本: 07年4月等级考试二级C语言练习一[4]