好文档 - 专业文书写作范文服务资料分享网站

C语言数组典型例题分析与解答

天下 分享 时间: 加入收藏 我要投稿 点赞

.. . .. . .

数组练习解答

1 定义一个名为a的单精度实型一维数组,长度为4,所有元素的初值均为0的数定义语句是________________

【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为0),可以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。空值(对数值型数组来说,初值为0),可以写出方法四(参看答案)。 【答案】方法一:float a[4]={0.0,0.0,0.0,0.0}; 方法二:float a[]={ 0.0,0.0,0.0,0.0}; 方法三:float a[4]= {0.0}; 方法四: static float [4];

2 下列数组定义语句中,错误的是()

① char x[1]='a'; ②auto char x[1]={0}; ③ static char x[l]; ④ char x[l];

【分析】显然答案①中给字符型数组赋初值的格式不对(不能直接赋予字符常量,必须用花括号括住),所以备选答案①是符合题意的答案。 【答案】 ①

3 用\冒泡排序法\对n个数据排序,需要进行n一1 步。其中第k步的任务是:自下而上,相邻两数比较,小者调上;该操作反复执行n-k次。现在假设有4个数据:4、l、3、2要排序,假定4为上、2为下,则利用\冒泡排序法\执行第2步后的结果是_________________。 【分析】开始排序前的排列执行第1步后的排列执行第2步后的排列

4 1 1 1 4 2 3 2 4 2 3 3 【答案】 l、2、4、3

4 用\选择排序法\对n个数据排序,需要进行n-1步。其中第k步的任务是:在第k个数据到第n个数据中寻找最小数,和第k个数据交换。现在假设有4个数据:4、1、3、2要排序,则利用\冒泡排序法\执行第2步后的结果是______________________。 【分析】 开始排序前的排列为: 4 1 3 2 执行第1步后的排列为: 1 4 3 2 执行第2步后的排列为: 1 2 3 4 【答案】1、2、3、4

5 下列数组定义语句中,正确的是()

① int a[][]={1,2,3,4,5,6}; ② char a[2]「3]='a','b';

③ int a[][3]= {1,2,3,4,5,6}; ④ static int a[][]={{1,2,3},{4,5,6}};

【分析】C语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案①④是错误的。C语言还规定,定义字符型数组时不允许直接使用\字符常量\的方式赋初值,所以备选答案②也是错误的。显然备选答案③符合题意。【答案】③

6 定义一个名为\的字符型数组,并且赋初值为字符串\的错误语句是() ①char s[]={‘1','2','3','\\0 '}; ②char s「」={\; ③char s[]={\ ④ char s[4]={'1','2','3'};

S. . . . . ..

.. . .. . .

【分析】备选答案①中省略了数组长度,所以每个元素都赋了初值,共计4个元素,初值依次为'l'、'2'、'3'、'\0',最后一个元素的值为字符串结束标记,所以数组S中存放的是字符串\,该答案不符合题意(即正确的);备选答案③中直接赋予字符串作为初值所以数组s的长度为4,其中的初值是字符串\,不符合题意(即正确的);备选答案③中也是给数组s赋予字符串的初值,但是字符串不是\,而是\\n\,所以该答案符合题意(即错误的);显然答案④也不符合题意(即正确的)。下面来分析答案④为什么是正确的,该答案给出了数组长度为4,赋初值时仅给前3个元素赋予字符'1 '、 '2'、'3',第 4个元素没有赋初值,按照 C语言的规定,也有初值,且初值为空值, 对字符型数组来说,空值就是'\0',即字符率结束标记,所以数组S中存放的也是字符串\。【答案】③ 7 设有下列数据定义语句,则数组元素x[i]的值是__________________。 int i= 3,x[4]={ 1,2,3};

【分析】由于i的初值为3,所以x[i]就是x[3]。由于数组的下标是从0开始的,所以x[3]实际上是数组x的第4个元素。从定义语句中可以看出数组x的前3个元素的初值依次为1、2、3,第4个元素没有赋初值,其初值自动设为空值,对整型数组来说,空值是0,显然x[3」的值是0.【答案】0

8 设有下列数据定义语句,则 puts(&s[0][0])的输出结果是__________; puts(s[0]〕 输出结果是_____________。

char s[4][5]={{'l','\0'},{\,\,\\0\;

【分析】首先分析字符型数组s的初值,s的第1行中存放的字符串是\、第2行中存放的符串是\、第3行中存放的字符串是\、第4行中存放的字符串是\。puts()函数的功能是输出从\参数\处开始存放的字符串中有效字符。按照上的分析,第1个输出的结果是从\&S[0][0]\开始的字符串,这个地址对应的就是数s的第1行,所以输出结果为1;第2个输出的结果是从“s[]”开始的字符串,这个址对应的也是数组s的第1行,所以输出结果也为1。

【答案】 1 1

9 设有下列数据定义语句:

char a[4][10]={\,\,\,\; 则 puts(strcat(a[1],a[3]))的输出结果是________________; putS(strcpy(a[0],a[2]))的输出结果是________________。

【分析】字符数组a共有4行,每行存放一个字符串。这4行的首地址依次为:a[0]、a[1]、a[2]、a[3],从这4个地址开始存放的字符串依次为:\、\、\、\。strcat(a[1],a[3])函数调用的功能是将s[3]处的字符串连接到a[l]的字符串后面,所以执行该函数调用后的a「l」处的字符串为\,而该函数的返回值就是a[1]的首地址,puts()函数的功能就是输出这个地址存放的字符串,由此,第1个输出的结果就是:2244。同样理由可以分析strcpy(a[0],a[2])的功能是将a[2]处的字符串(\)复制到a[0]处,返回a[0]的地址,puts()输出的就是a[0]处的字符串,结果为:33。 【答案】2244 33 10 设有下列数据定义语句:

char str[2][10]={\,\; 则printf(\%d\,strcmp(str[1],str[0]))的输出结果是__________; printf(\%d\,strcmp(strlwr(str[1],str[0])),str[0]))的输出结果是_______。

【分析】字符型数组str中,从str[0]开始存放的字符串是\、从str[l]开始存放的字符串是\。strcmp(str[l],str[0])是比较str[l]和str【0」处的两个字符串的大小,由于\

S. . . . . ..

.. . .. . .

是小于\的,按照srrcmp函数的功能可知,返回值是一个小于0的整数,这是第1个空的答案。再来分析第2个空的答案,strlwr(str[l])函数的功能是将str[l]处的字符串写字母改为小写字母,其返回值是修改后字符串的地址。strcmp(stlwr(sir[1]),str[0]))函数的功能是比较str[l]和str[0]处的字符串,由于str[l]处的字符串已经改为小写字母了,所以和 str[0]处的字符串完全相同,返回值是0,这就是第2个空的答案。

[答案]某个小于0的任意整数 0

11 下列程序的功能是读取10个实数,然后依次输出前l个实数和、前2个实数和、…、前9个实数和、前10个实数和。请填写程序中缺少的语句。

main()

{float f[10],X=0.0; int i;

for(i=0;i<10;i++) scanf(\% f\, &f[i]); for(i=1;i<=10;i++)

{_______________________

printf(\%2d----%f\n\,i,x); } }

【分析】浏览程序清单后,可以发现前一个次数型循环是输入 10个实数存入数组 f中。后一个次数型循环是计算前i个实数和并存入变量X中,然后再输出这个x的值。程序中所缺少的语句就是实现\计算前i个实数和并存入变量X中\的。当i等于1时,x要等于f[0]的值,即f[i-l]的值;当i等于2时,x要等于f[0] +f[l]的值,即f[0]+f[i-1」的值,此时f[0]的值已经计算并存入变量x中;当i等于3时,x要等于f[0]+f[1]+f[2]的值,即f[0]+f[1]+f[i-l]的值,此时f[0]+f[1]的值已经计算并存入变量x中;由此可以推出:前i个值的计算公式为:x=x+f[i-1],将这个表达式组成语句就是需要填写的容。 【答案】 x=x+f[i-l]; 或 x+=f[i-l]; 12 运行下列程序的输出结果是()

① 111ll ②llll ③lll ④ 222 main()

{int a[]={1,2,3,4, 5 },i; for( i=1;i< 5; i++)

printf(\% 1d\, a[i]- a[i一1]); }

【分析】首先分析数组a各元素的值,由于是赋初值,很容易看出:a[0]= 1、a[1]=2…、a[4]=5。再分析次数型循环共计执行4次(i=1、i=2、i=3、i=4),每次输出1位整数;[i]-a[i-1],当i=1时,输出的是2-1=1;当i=2时,输出的是3-2=l;当i=3时,输出的是4-3=l;当i=4时,输出的是5-4=1。整个程序的输出结果是1111。 【答案】②

13 下列程序的功能是输入一个5行5列的实数矩阵,然后求出其中的最大数和最小数,并且对调这两个数后,再输出,请填写程序中缺少的语句。 main()

{ float f[ 5][5],max, x;

int i,j,max_l,max_J,min_i,min_J; for(i=0;i<5;i++)

S. . . . . ..

.. . .. . .

for(j=0;j<5;j++) {scanf(\%f\,&x); f[i][j]=x; }

max=min=f[0][0];

max_i=max_i=min_i=min_j= 0; for(i= 0;i<5;i++)

for(j=0;j<5;j++) {if(max<f[i][j])

max=f[i][j],max_i=i,max_j=j; if(min>f[i][j])

___________________ }

f[max_i][max_j]=min; f[min_i][min_j]=max;

for(i=0;i<5;i++) {printf(\\n\);

for(j=0;j<5;j++) printf(\%8.2f\,f[i][j]); } }

【分析】首先宏观上阅读程序,可以看出程序的基本结构是:用双重次数型循环读取5行5列矩阵的元素值存入二维数组f中;寻找矩阵中的最大数和最小数;交换最大数和最小数;输出交换后的矩阵元素值。需要填写的语句属于第2个部分。现在来仔细分析这个部分的程序。通常寻找最大数(或最小数)的算法是首先假定最前面的数是最大数(或最小数),并记录该数及其在数组中的下标,然后依次处理所有元素,若当前处理的元素大于(小于)最大数(最小数),则重新记录新的最大数(最小数)及其下标。从本程序清单来看,的确是采用了这个算法,由于是同时求最大数和最小数,所以用max、max_i、max_j分别记录当前的最大数及其行列下标,用min、min_i、min_j分别记录当前的最小数及其行列下标。在二重循环的循环体中有两条单分支语句,前一个单分支语句的功能很清楚,判断当前的数组元素是否大于最大数,是则重新记录最大数及其行列下标(注意,这里是用一个逗号表达式完成三项赋值工作的)。循环体中的第2条单分支语句当然是求当前最小数的,由此分析,当条件成立(当前数组元素小于当前最小数)时,需要重新记录当前的最小数及其行列下标,所缺少的语句正是完成这项工作的,由于只能用一条语句完成三项赋值工作,所以必须使用远号表达式。对照该循环体的前一个单分支语句,很容易写出所缺少的语句。接下来阅读以后的程序,来验证所填写的语句。接下来的两条赋值语句正好完成了最大数和最小数的交换工作。前一个语句“f[max_i][max_j]= min;”是将找到的最小数存入对应最大数的位置(max_i是最大数的行下标,max_i是最大数的列下标,f[max_i][max_j]就是最大数),类似的,后一个语句“f[min_i][min_j〕=max ;”是将找到的最大数存入对应最小数的位置。

【答案】min=f[i][j],min_i=i,min_j=j; 14 阅读下列 程序,写出程序运行后的输出结果。

main()

{int al[]={1,3,6,7,100},a2[]={2,4,5,8,100},a[10],i,j,k;

S. . . . . ..

.. . .. . .

i=j=0;

for(k=0;k<8;k++) if(a1[i]

a[k]=a2[j++];

for (k= 0; k< 8; k++ ) printf(\%1d\,a[k]); }

【分析】程序开始用赋初值方式给数组al和a2的所有元素赋值。接下来是给变量 i、j清0,从后面的for循环中可以看出,变量i、j是作为一维数组的下标的,所以它们的初值是从0下标开始的。重点分析其后的次数型循环,共计循环8次,控制变量k的值依次为0、l、…、7,这个控制循环的变量k也是作为下标使用的。再分析循环体,这是一条双分支语句,控制条件是“a1[i]<a[j]”,即a1数组的第叶元素值小于a2数组的第j个元素值。这个条件成立时,执行的操作包括: al数组的第i个元素存入 a数组的第 k个元素中、同时 i加1,使得 a1[i]成为其后的元素;如果这个条件不成立(即a2数组的第 j个元素值小于或等于 al数组的第 i个元素值),执行的操作包括: a2数组的第j个元素在入a数组的第k个地素中、同时j加1,使得a2[j]成为其后的元素。综合上述的分析,可以看出,循环体的工作是将数组al和a2的当前元素中值小的元素复制到数组 a中,如果数组 al的元素被复制,则其下标后移一个位置,指向 al的新元素;如果数组a2的元素被复制,则其下标后移一个位置,指向a2的新元素。该循环执行8次,恰好把数组a1和数组a2中的各4个元素按照从小到大的顺序复制到数组a中。最后看看输出,是一个次数型循环语句,输出的结果是数组a中的8个元素值,而且输出格式为一位整数,结果当然是: 12345678。

请读者注意,由于原来的两个数组al和a2中的元素是从小到大的顺序排列的,所以合并后的数组a的元素也必然是从小到大的。这是一种排序的算法,称为\两路归并排序法\。但是,真正的两路归并排序法要考虑到某个数组的元素全部复制后,另一个数组中的剩余元素要全部复制。本程序中没有考虑这个\临界问题\,而是采用了在两个数组的有效数据之后,放一个最大数的方法,并且知道归并后的数据总个数。【答案】 12345678 15 阅读下列程序,写出程序运行后的输出结果。

#include \ main()

{char s[3][20]={\,\,\; int i, k;

for( k= 0, i=1; i< 3; i++) if((strcmp(s[k],s[i]))<0) k= i: puts(s「k」); }

【分析】该程序很简单,开始给二维字符型数组赋初值为3个字符串,通过一个次数型循环求得变量k的值,然后输出s[k]对应的字符串。从上面的分析可知,关键是循环语句执行后变量k的值等于多少?我们呵以用记录的方法来记录在循环中变量k的值。

执行循环语句,记录如下:

k=0,i=1,控制循环的条件\< 3'成立,执行循环体的单分支语句,条件\(strcmp (s[k],s[i]))<0\相当于\(strcmp(\,\))<0\,条件不成立,变量k值不变,i加1后继续循环;

S. . . . . ..

C语言数组典型例题分析与解答

.......数组练习解答1定义一个名为a的单精度实型一维数组,长度为4,所有元素的初值均为0的数定义语句是________________【分析】按照一般数据定义语句的格式,
推荐度:
点击下载文档文档为doc格式
1g5j38a9z60wacw0f2p46m3qp9xkpa00ypt
领取福利

微信扫码领取福利

微信扫码分享