3. 程序填空题
(1)下面程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。
#include
{ char a[]=\ int i,j,k; k=strlen(a); for(i=0;i<=k-2;i+=2)
for(j=i+2;j {t=a[i];a[i]=a[j];a[j]=t;} puts(a);printf(\} (3)下面程序的功能是把给定的字符按其矩阵格式读入数组str中,并输出行号与列号之和为3的数组元素。请填空。 main( ) { char str[4][3]={'A','b','C','d','E','f','G','h','I','j','K','l'}; int x,y,z; for(x=0;x<4;x++) for (y=0; ⑤ ;y++) { z=x+y; if( ⑥ ) printf(\ } } (4)下面程序的功能是输入一个3×3的实数矩阵,求两条对角线元素中各自的最大值。请填空。 main() { float s[3][3],max1,max2,x; int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) { scanf(\ max1= ⑦ ; for(i=1;i<3;i++) if(max1 if(max2 70 请填空 main() { long int a[40]={1,1}; int i; for(i=2;i<40;i++) a[i]= ⑨ ; for(i=0;i<40;i++) { if( ⑩ ) printf(\ printf(\ } } 4. 程序设计题 (1)给定一维整型数组,输入数据并求第一个值为奇数元素之前的元素和。 (2)给定一维整型数组,输入数据并对前一半元素升序排序,对后一半元素降序排序。 (3)输入字符串并统计各数字字符出现的次数。 (4)给定N×N矩阵,输入矩阵元素并互换主次对角线元素值。 (5)给定二维数组a[M][N],输入数据并将元素按照行序存入到一维数组b中。 4.4 实验题目 (1)数组a中存放N个非0整数,编写程序,将数组a中的所有正数存放在数组的前面,负数存放在数组的后面。 (2)将数组a中的N个元素后移m位,移出的m位顺序存放在数组的前m位。 (4)将整型N×N矩阵主对角线元素进行升序排序。 (5)将4×4阶矩阵的4个最小值按升序存放在主对角线上。 (6)求N×N矩阵每行最大值的和。 (7)由键盘输入一个字符串,按照ASCII码由小到大的顺序排序,要求删除所输入的重复字符。如输入\,则应输出\。 4.5 思考题 (1)定义二维数组时是否可以省略第一维长度?省略时系统如何计算长度? (2)定义一维数组与引用一维数组元素时,“[]”内数据的含义是什么? (3)若有定义:int a[3][4],(*q)[4]=a;,则如何利用指针变量q引用数组a的元素? (4)若有如下定义和语句: int a[3][4],*p[3]; p[0]=&a[0][0];p[1]=&a[1][0];p[2]=&a[2][0]; 则如何利用指针数组名p引用数组a的元素? (5)试说明下列两种定义方式的区别。 char a[3][8]={\ char *a[3]={\ 4.6 习题解答 71 1. 单项选择题(下列每小题有4个备选答案,将其中一个正确答案填到其后的括号内) (1)设有定义:int a[10],*p=a;,对数组元素的正确引用是( )。 ① a[p] ② p[a] ③ *(p+2) ④ p+2 解答:a和p是地址,不可以用作数组元素的下标,所以①②错误,选项④为p之后两个元素的地址即等价于&a[2],选项③为元素a[2]。 答案:③ (2)若有如下定义,则不能表示数组a元素的表达式是( )。 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; ① *p ② a[10] ③ *a ④ a[p-a] 解答:因为p初值为a,所以选项①为元素a[0],选项③也为元素a[0],选项④为a[0],选项②元素下标超出下标界限(0~9)。 答案:② (3)若有如下定义,则值为3的表达式是( )。 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; ① p+=2,*(p++) ② p+=2,*++p ③ p+=3,*p++ ④ p+=2,++*p 解答:四个表达式都是逗号表达式,表达式的值为第二个式子的值,选项①的p从指向a[0]改变为指向a[2],因此表达式值为3,选项②的p指向a[2],计算*++p时指针指向a[3],表达式值为4,选项③的p指向a[3],表达式值为4,选项④的p指向a[2],计算++*p后a[2]元素值变为4。 答案:① (4)设有定义:char a[10]=\,则*(p+4)的值是( )。 ① \② ’D’ ③ ’\\0’ ④ 不确定 解答:数组所赋初值为串,数组a[4]及其后的六个元素值都为'\\0',*(p+4)等价于*(a+4)即a[4]。 答案:③ (5)将p定义为指向含4个元素的一维数组的指针变量,正确语句为( )。 ① int (*p)[4]; ② int *p[4]; ③ int p[4]; ④ int **p[4]; 解答:①定义p为指向含4个整型元素的一维数组的指针变量。②定义了一个有四个元素的指针数组,数组名为p,数组中的每一个元素都是指向整型变量的指针变量。③定义了一个有四个元素的整型数组,数组名为p。④定义了一个有四个元素的二级指针数组,数组名为p,数组中的每一个元素都是指向整型指针变量的指针变量。 答案:① (6)若有定义int a[3][4];,则输入其3行2列元素的正确语句为( )。 ① scanf(\② scanf(\③ scanf(\④ scanf(\ 解答:输入3行2列元素的值,应使用其地址,即&a[2][1],或*(a+2)+1,或a[2]+1,所以③是正确的。 答案:③ (7)下面对指针变量的叙述,正确的是( )。 ① 指针变量可以加上一个指针变量。 ② 可以把一个整形数赋给指针变量。 ③ 指针变量的值可以赋给指针变量。 ④ 指针变量不可以有空值,即该指针变量必须指向某一变量。 解答:指针变量加上一个指针变量没有意义,所以①是错误的。不能把一个整型数直接 72 赋给指针变量,因为类型不匹配,所以②是错误的。指针变量可以有空值(NULL),即不指向任何变量,所以④是错误的。指针变量的值可以赋给指针变量,同类型可以直接赋值,不同类型可通过强制类型转换,所以③是正确的。 答案:③ (8)设有定义:int a[10],*p=a+6,*q=a;,则下列运算哪种是错误的( )。 ① p-q ② p+3 ③ p+q ④ p>q 解答:指向同一个数组的两个指针变量可以相减,其值是两个指针之间的元素个数。指向同一个数组的两个指针变量也可以比较,指向前面元素的指针“小于”指向后面元素的指针。指向数组元素的指针变量可以加减一个整型数c,加c后指向其后面的第c个元素,减c后指向其前面的第c个元素。但指向同一个数组的两个指针变量进行加法运算没有意义。 答案:③ (9)C语言中,数组名代表( )。 ① 数组全部元素的值 ② 数组首地址 ③ 数组第一个元素的值 ④ 数组元素的个数 解答:C语言规定,数组名代表数组的首地址。 答案:② (10)若有如下定义,则值为4的表达式是( )。 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c=’a’,d,g; ① a[g-c] ② a[4] ③ a[’d’-’c’] ④ a[’d’-c] 解答:值为4的数组元素的下标为3,所以②是错误的,g-c的值不确定,’d’-’c’的值为1,只有’d’-c的值为3,所以④是正确的。 答案:④ (11)设有定义:char s[12]=\则printf(\的输出结果是( )。 ① 6 ② 7 ③ 11 ④ 12 解答:函数strlen()的功能是返回字符串中第一个’\\0’之前的字符个数,所以输出结果为6。 答案:① (12)语句printf(\的输出结果是( )。 ① 11 ② 10 ③ 9 ④ 8 解答:字符串中的“\\n”、“\\1”和“\\\\”都是转义字符,都表示一个字符,所以字符串中的字符个数为9。 答案:③ (13)设有定义:int t[3][2];,能正确表示t数组元素地址的表达式是( )。 ① &t[3][2] ② t[3] ③ t[1] ④ *t[2] 解答:C语言中,数组元素的下标从0开始,所以①和②是错误的,④表示数组元素a[2][0],③表示第二行的首地址,所以③是正确的。 答案:③ (14)语句strcat(strcpy(str1,str2),str3);的功能是( )。 ① 将字符串str1复制到字符串str2中后再连接到字符串str3之后。 ② 将字符串str1连接到字符串str2中后再复制到字符串str3之后。 ③ 将字符串str2复制到字符串str1后再将字符串str3连接到字符串str1之后。 ④ 将字符串str2连接到字符串str1后再将字符串str1复制到字符串str3中。 解答:先执行strcpy(str1,str2),即将字符串str2复制到字符串str1中,再执行 73