07年4月等级考试二级C语言练习一[4]
二。填写空问题。
(1)算法的复杂度主要包括空和[1]之间的复杂度。
【解析】算法的复杂度主要指时间复杂度和空之间的复杂度。
(2)线性结构中,队列的操作顺序是FIFO,而栈的操作顺序是[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语句之后执行output语句,输出58;然后执行第二条if语句,因为,a = 58 > 40,在第二条if语句之后执行output语句,输出58;然后执行第三条if语句,因为,a = 58 > 30,在第三条if语句之后执行output语句,输出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);
}
[解析]程序中,先给变量A赋值8,再进行复合赋值。即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是指向其自身结构的指针。请完成定义。
结构节点
{ int info;
【10】链接;
};
[解析] link是指向结构本身的指针,所以link是指向struct节点类型的数据的指针,可以定义为“struct node *link”。
(11)下面这个程序的输出结果是[11]。
main()
{ int s,I;
for(s=0,I = 1;I < 3;i++,s+= I);
printf("%d\n ",s);
}
[解决方法]在此程序中,for循环语句后面直接跟有一个“;”,表示循环体是空。output语句不在for循环体中,所以s的值只在循环执行后输出。s和I的初始值分别为0和1。确定循环条件。表达式“1 < 3”成立。执行“i++,s+=i”后,I和S的值分别为2和1。继续确定循环条件。表达式“2 < 3”成立。执行“i++,s+=i”后,I和s的值。
(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);
}
[解析]字符串的结束标记“[15]”。当输出存储在字符数组中的字符串时,只需要输出到' [15] '为止,而不考虑之后的任何数据。在这个问题中,字符数组s的元素s[3]被赋给了' [15] ',所以只能输出三个字符“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)。此时,语句x=x+k=0+4=4,于是回到上一个调用函数sub(&x,4,2),执行下面的语句,x=x+k=4+2=6,然后推回到上一个调用函数sub(&x,8,1)执行下面的语句,x = x+。
(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 ");退出(0);}
while(【16】)
{ fgetc(FP);num++;}
printf("num=%1d\n ",num-1);
f close(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][column]){ 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和column中。根据题意,应该将行下标赋给参数指针变量N所指向的变量,将值A [row] [column]作为函数值返回。
(18)mystrlen函数的作用是计算str引用的字符串的长度,并作为函数值返回。请填写空。
int mystrlen(char * str)
{ int I;
for(I = 0;【19】!= '[20]';i++);
return(【20】);
}
[解析]求str指向的字符串长度的算法是:用一个变量I来表示字符在字符串中的位置,先赋给0。取出I位置的字符,判断是否为“[20]”。如果没有,在I的值上加1,重复这个循环,直到提取的字符是“[20]”,此时I的值就是字符串。所以第I个位置要用字符* (STR+I)填充第空位;第二个空单元格应该用字符串的长度I填充。
0条评论