第4章 数组 - 44584 下载本文

3. 程序填空题

(1)下面程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。

#include #include main()

{ 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