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

上传人:b****6 文档编号:16454936 上传时间:2023-07-13 格式:DOCX 页数:18 大小:115.88KB
下载 相关 举报
C语言数组典型例题分析与解答0001.docx_第1页
第1页 / 共18页
C语言数组典型例题分析与解答0001.docx_第2页
第2页 / 共18页
C语言数组典型例题分析与解答0001.docx_第3页
第3页 / 共18页
C语言数组典型例题分析与解答0001.docx_第4页
第4页 / 共18页
C语言数组典型例题分析与解答0001.docx_第5页
第5页 / 共18页
C语言数组典型例题分析与解答0001.docx_第6页
第6页 / 共18页
C语言数组典型例题分析与解答0001.docx_第7页
第7页 / 共18页
C语言数组典型例题分析与解答0001.docx_第8页
第8页 / 共18页
C语言数组典型例题分析与解答0001.docx_第9页
第9页 / 共18页
C语言数组典型例题分析与解答0001.docx_第10页
第10页 / 共18页
C语言数组典型例题分析与解答0001.docx_第11页
第11页 / 共18页
C语言数组典型例题分析与解答0001.docx_第12页
第12页 / 共18页
C语言数组典型例题分析与解答0001.docx_第13页
第13页 / 共18页
C语言数组典型例题分析与解答0001.docx_第14页
第14页 / 共18页
C语言数组典型例题分析与解答0001.docx_第15页
第15页 / 共18页
C语言数组典型例题分析与解答0001.docx_第16页
第16页 / 共18页
C语言数组典型例题分析与解答0001.docx_第17页
第17页 / 共18页
C语言数组典型例题分析与解答0001.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《C语言数组典型例题分析与解答0001.docx》由会员分享,可在线阅读,更多相关《C语言数组典型例题分析与解答0001.docx(18页珍藏版)》请在冰点文库上搜索。

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

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

数组练习解答

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

【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元

素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度,给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为0),可

以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。

空值(对数值型数组来说,初值为0),可以写出方法四(参看答案)。

【答案】方法一:

floata[4]={0.0,0.0,0.0,0.0};

方法二:

floata[]={0.0,0.0,0.0,0.0};

方法三:

floata[4]={0.0};方法四:

staticfloat[4];

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

①charx[1]='a';②autocharx[1]={0};

③staticcharx[l];④charx[l];

【分析】显然答案①中给字符型数组赋初值的格式不对

括号括住),所以备选答案①是符合题意的答案。

【答案】①

3用"冒泡排序法"对n个数据排序,需要进行n一1

相邻两数比较,小者调上;该操作反复执行n—k次。

【分析】C语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案①④是错误

的。

C语言还规定,定义字符型数组时不允许直接使用”字符常量”的方式赋初值,所以备选

答案②也是错误的。

显然备选答案③符合题意。

【答案】③

6定义一个名为"s"的字符型数组,并且赋初值为字符串"123"的错误语句是()

①chars[]={‘1','2',3,'\0'};②chars「」={"123"};

③chars[]={"123\n"};④chars[4]={'1','2',3};

【分析】备选答案①中省略了数组长度,所以每个元素都赋了初值,共计4个元素,初值依

次为T、2、3、’\0',最后一个元素的值为字符串结束标记,所以数组S中存放的是

字符串"123",该答案不符合题意(即正确的);备选答案③中直接赋予字符串作为初值所以数组s的长度为4,其中的初值是字符串"123",不符合题意(即正确的);备选答案③中也是给数组s赋予字符串的初值,但是字符串不是"123",而是"123\n",所以该答案符合题

意(即错误的);显然答案④也不符合题意(即正确的)。

下面来分析答案④为什么是正确的,

该答案给出了数组长度为4,赋初值时仅给前3个元素赋予字符'1'

元素没有赋初值,按照C语言的规定,也有初值,且初值为空值,值就是’\0',即字符率结束标记,所以数组S中存放的也是字符串

7设有下列数据定义语句,则数组元素x[i]的值是

inti=3,x[4]={1,2,3};

【分析】由于i的初值为3,所以x[i]就是x[3]。

由于数组的下标是从0开始的,所以x[3]实际上是数组x的第4个元素。

从定义语句中可以看出数组x的前3个元素的初值依次为1、2、3,第4个元素没有赋初值,的值是0.【答案】0

8设有下列数据定义语句,则

输出结果是。

chars[4][5]={{'l','\0'}

【分析】首先分析字符型数组的符串是"23"、第3行中存放的字符串是数的功能是输出从"参数"处开始存放的字符串中有效字符。

果是从"&S[0][0]"开始的字符串,这个地址对应的就是数第2个输出的结果是从“出结果也为1。

【答案】1

、'2'、'3',第4个对字符型数组来说,空

"123"。

【答案】③

x的前3个元素的初值依次为

其初值自动设为空值,对整型数组来说,空值是0,显然x[3」

puts(&s[0][0])的输出结果是

;puts(s[0]〕

,{"23"},s的初值,

"345","4、0"};

s的第1行中存放的字符串是"1"、第2行中存放

"345"、第4行中存放的字符串是"4"。

puts()函按照上的分析,第1个输出的结s的第1行,所以输出结果为1;

s[]”开始的字符串,这个址对应的也是数组s的第1行,所以输

1

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

chara[4][10]={"11",

则puts(strcat(a[1]

"22",

,a[3]

"33","44"};

))的输出结果是;

的输出结果是_。

每行存放一个字符串。

这4行的首地址依次为:

a[0]、a[1]、

"11"、"22"、"33"、"44"。

strcat

putS(strcpy(a[0],a[2]))

【分析】字符数组a共有4行,

a[2]、a[3],从这4个地址开始存放的字符串依次为:

(a[1],a[3])函数调用的功能是将s[3]处的字符串连接到a[l]的字符串后面,所以执行

该函数调用后的a「l」处的字符串为"2244",而该函数的返回值就是a[1]的首地址,puts()函数的功能就是输出这个地址存放的字符串,由此,第1个输出的结果就是:

2244。

同样理由可以分析strcpy(a[0],a[2])的功能是将a[2]处的字符串("33")复制到a[0]处,返回a[0]的地址,puts()输出的就是

【答案】224433

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

charstr[2][10]={"abc"

则printf("%d",strcmp(str[1],

a[0]处的字符串,结果为:

,"ABC"};str[0]))的输出结果是

33。

printf("%d",strcmp(strlwr(str[1],str[0])),str[0]))的输出结果是。

【分析】字符型数组str中,从str[0]开始存放的字符串是"abc"、从str[l]开始存放的字

符串是"ABC"。

strcmp(str[l],str[0])是比较str[l]和str【0」处的两个字符串的大小,

 

由于"ABC"是小于"abc"的,按照srrcmp函数的功能可知,返回值是一个小于0的整数,这

是第1个空的答案。

再来分析第2个空的答案,strIwr(str[I])函数的功能是将str[I]处的字符串中大写字母改为小写字母,其返回值是修改后字符串的地址。

strcmp

(sir[1]),str[0]))函数的功能是比较str[I]和str[0]处的字符串,由于str[I]处的字

stlwr

符串已经改为小写字母了,所以和str[0]处的字符串完全相同,返回值是0,这就是第2个空的答案。

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

11下列程序的功能是读取前9个实数和、前

main(){fIoatf[10]intifor

0

10个实数,然后依次输出前I个实数和、前2个实数和、…、10个实数和。

请填写程序中缺少的语句。

X=0.0;

for

i=0;

scanf("%f",&f[i]);

i=1;i<=10;i++)

{

printf

}

i<10;i++)

("sumofNO%2d%f、n",i,x);

}

【分析】浏览程序清单后,一个次数型循环是计算前少的语句就是实现”计算前i个实数和并存入变量X中”的。

当i等于1时,x要等于f[0:

可以发现前一个次数型循环是输入10个实数存入数组f中。

后i个实数和并存入变量X中,然后再输出这个x的值。

程序中所缺

的值,即f[i—I]的值;当i等于2时,x要等于f[0]+f[l]的值,即f[0]+f[i—1」的

值,此时f[0]的值已经计算并存入变量x中;当的值,即f[0]+f[1]+f[i—I]的值,此时f[0]+f[1]的值已经计算并存入变量此可以推出:

前i个值的计算公式为:

x=X+f[i

写的内容。

【答案】x=x+f[i—I:

;或x+=f[i—I];

12运行下列程序的输出结果是()

①111II②IIII

main()

i等于3时,x要等于f[0]+f[1]+f[2]

x中;由

-1],将这个表达式组成语句就是需要填

③III

④222

 

{inta[]={1,2,3,4,5},i;

for(i=1;i<5;i++)

printf("%1d",a[i]—a[i一1]);

a[0]=1、a[1]=2…、4次(i=1、i=2、i=3、i=4),每次输出1位整数;2—1=1;当i=2时,输出的是3—2=I;当i=3时,

1111。

}

【分析】首先分析数组a各元素的值,由于是赋初值,很容易看出:

a[4]=5。

再分析次数型循环共计执行

[i]—a[i—1],当i=1时,输出的是

输出的是4—3=I;当i=4时,输出的是5—4=1。

整个程序的输出结果是【答案】②

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

,max,x;

main(){fIoatf[5][5]

inti,j,max_l,max_J,min_i,min_J;

for(i=0;i<5;i++)

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++)

,max_i=i,max_j=j;

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

}

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

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

}

【分析】首先宏观上阅读程序,列矩阵的元素值存入二维数组输出交换后的矩阵元素值。

序。

通常寻找最大数(或最小数)的算法是首先假定最前面的数是最大数(或最小数)记录该数及其在数组中的下标,然后依次处理所有元素,大数(最小数),则重新记录新的最大数(最小数)及其下标。

从本程序清单来看,的确是采用了这个算法,由于是同时求最大数和最小数,所以用max、max_i、max_j分别记录当前的最大数及其行列下标,用min、min_i、min_j分别记录当前的最小数及其行列下标。

在二重循环的循环体中有两条单分支语句,前一个单分支语句的功能很清楚,判断当前的数组元素是否大于最大数,是则重新记录最大数及其行列下标(注意,这里是用一个逗号表达式完成三项赋值工作的)。

循环体中的第2条单分支语句当然是求当前最小数的,由此分析,当条件成立(当前数组元素小于当前最小数)时,需要重新记录当前的最小数及其行列下标,所缺少的语句正是完成这项工作的,由于只能用一条语句完成三项赋值工作,所以必须使用远号表达式。

对照该循环体的前一个单分支语句,很容易写出所缺少的语句。

接下来阅读以后的程序,来验证所填写的语句。

接下来的两条赋值语句正好完成了最大数和最小数的交换工作。

前一个语句“f[max_i][max_j]=min;”是将找到的最小数存入对应最大数的位置

(ma—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()

{intal[]={1i=jfor(

,3,6,7,100},a2[]={2

,4,5,8,100},a[10],i,j,k;

for

=0;(k=0;

if

k<8;k++)

a1[i]

a[k]=a1[i++];else

a[k:

=a2[j++];

(k=0;k<8;k++printf("%1d",a[k]

));

}

【分析】程序开始用赋初值方式给数组0,从后面的for循环中可以看出,变量

a2的所有元素赋值。

接下来是给变量i、j清是作为一维数组的下标的,所以它们的初值是从0下标开始的。

重点分析其后的次数型循环,共计循环8次,控制变量k的值依次为0、

l、…、7,这个控制循环的变量k也是作为下标使用的。

再分析循环体,这是一条双分支语句,控制条件是“a1[i]

这个条件成立时,执行的操作包括:

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个元素值,而且输出格式为一位整数,结果当然是:

请读者注意,由于原来的两个数组al和a2中的元素是从小到大的顺序排列的,所以合并后的数组a的元素也必然是从小到大的。

这是一种排序的算法,称为"两路归并排序法"。

但是,真正的两路归并排序法要考虑到某个数组的元素全部复制后,另一个数组中的剩余元素要全部复制。

本程序中没有考虑这个"临界问题",而是采用了在两个数组的有效数据之后,放一个最大数的方法,并且知道归并后的数据总个数。

【答案】

15阅读下列程序,写出程序运行后的输出结果。

#include""main(){chars[3][20]={"2345"intifor

al和

i、j

,"123456","2347"};

,k;

(k=0,i=1;i<3;i++)

if((strcmp(s[k],s[i]))<0)k=i:

(s「k」);

puts

}

【分析】该程序很简单,开始给二维字符型数组赋初值为3个字符串,通过一个次数型循环求得变量k的值,然后输出s[k]对应的字符串。

从上面的分析可知,关键是循环语句执行后变量k的值等于多少我们呵以用记录的方法来记录在循环中变量

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

k=0,i=1,控制循环的条件"i<3'成立,执行循环体的单分支语句,条件"(strcmp

k的值。

 

(s[k],s[i]))<0"相当于"(strcmp("2345","123456"))<0",条件不成立,变量k值不变,i加1后继续循环;

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

"i<3"不成立,退出循环。

k=2,i=3,控制循环的条件此时变量k值为2.

输出的是s[2]处存放的字符串:

2347

3个字符串中。

寻找最大字符串的

执行"puts(s[k]);"语句,显然该程序的主要功能是在

【答案】234716阅读下列程序,写出程序的主要功能。

main()

{inti,a[10],

for(i=0;i<10scanfscanf("%d",

if(flag==0

printfelse

printf

<10;i

x=={flag

break;

}

(”%d、n",flag);

(”nofound!

、n");

}【分析】该程序属于比较简单的,开始定义整型数组a以及整型变量x、flag和i。

下面的次数型循环是输入10个整数到数组a中,此时可以看出变量i是作为循环的控制变量使用的。

接着输入一个整数到变量x中。

接下来的次数型循环执行10次,这是标准的用单重次数型循环来依次处理一维数组兀素的程序段,处理的内容是循环体中的单分支语句,即判断当前的数组元素是否等于变量X,是,则在变量师中记录i+1后退出循环;否,则继续循

环。

由此可以分析出,这个流环足在数组a中寻找x的,找不到,则变社flag的值不会改变(注意动值为0);如果找到,则lleq变量的值将等于i+l,其中的i是循环控制变量,也就是找到的数组元素的下标,将其加1后存入变量flag,所以此时的flag是对应数组元素的下标加1的。

我们再仔细分析一下,当i=0时,找到的是数组元素a[0],此时flag

为1,表示是数组的第1个元素,即在10个待查整数中的序号为1;当i=I时,找到的

a[9],此时flag为10,表示是数组的第10个兀10.所以,找到则flag的值为1、2、…、10;找不到则

flag的值分别处理找到和找不到的两种情况。

综上所述,

是数组元素a[1],此时flag为2,表示是数组的第2个元素,即在10个待查整数中的序号为2.当i=9时,找到的是数组元素素,即在10个待查整数中的序号为为0。

循环后面的输出恰好是按照可以总结出本程序的主要功能。

a,再输入一个整数x,在数组a中查找x。

找到输出x在

【答案】输入10个整数存入数组

10个整数中的序号(从1开始),找不到则输出"nofound!

"。

17阅读下列程序,写出程序的主要功能。

main(){inti

for

for

sum=0,a[10];

(i=0;i<10;i++)

scanf("%d",&a[i]);

(i=9;i>=0;i——)

if(a[i]%7==0)

{sum+=a[i];

printf("%d",a[i]);}

(”\"nsum=%d\n",sun);

printf

}

【分析】这是标准的次数型循环结构。

第1个循环是输入10个整数存入数组a中;第2个循环是从后向前的顺序依次处理一维数组的元素。

具体的处理是体现在其循环体中,它是判断当前数是否满足条件“a[i]%7==0”,满足条件的元素则参加累加的计算,并输出满足

条件的数组元素。

退出循环后,再输出这些满足条件的数组元素之和。

程序功能的关键是搞清楚条件"a[i]%7==0"的含义,其实很简单,这个条件就是

"数组元素能被7整除"。

综上所述,可以总结出该程序的主要功能。

【答案】输入10个整数,按从后向前的顺序依次寻找并输出其中能被及能被7整除的这些整数的和。

18编一个程序,计算并输出下列数列的前

数列第

数列第

数列第数列第

【分析】求数列的前24

24项,每行输出4项。

7整除的所有整数以

1项的值1

2项的值2k项的值=第k-lk项的值=第k-l

项的值十第k-2项的值,

项的值一第k-2项的值,

k为奇数时,k为偶数时。

项可使用次数型循环结构,只要按照给出的公式计算并保存即可。

按每行4个数据的格式输出一维数组中的数据是一个标准的次数型循环。

【答案】

voidmain()

{longinta[25]={0

inti

for

,1,2};

(i=3;i<25;i++)if(i%2!

a[i]=a[i

else

a[i]

==0)

-l]+a[i-2];

一1]-a[i-2];

for

(i=1;i

{printf

if

=a[i

<25;i++)

("%8ld",a[i]);

(i%4==0)

printf("、n");

}

19编一个程序,输入一个3X3的实数矩阵,求两个对角线元素中各自的最大值。

【分析】用二重次数型循环解决矩阵的输入。

用一重次数型循环求主对角线元素的最大数,用单分支结构求次主对角线元素中的最大数。

 

答案】main()

{floats[3inti

][3],max1,max2,x;

for

=0;

for

maxi=s[0]for(i=1;i

i<3;i++)

(j=0;j<3;j++){scanf("%f",&x);

s[i][j]

}

[0];

<3;i十十)

=x;

if(max1

max2=s[0][2];

if(max2

if(max2

printf("max1=%f\n",

printf("max2=%f\n"

max1=s[i][i];

max2=s[1][1]

max2=s[2][0];

max1);

,max2);

}

20编一个程序,输入

3个字符串连接到第入一维的字符型数组中,

3个字符串(长度均不超过

2个字符

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2