c语言数组典型例题分析与解答.pdf

上传人:蓝**** 文档编号:90994353 上传时间:2023-05-19 格式:PDF 页数:8 大小:442.69KB
返回 下载 相关 举报
c语言数组典型例题分析与解答.pdf_第1页
第1页 / 共8页
c语言数组典型例题分析与解答.pdf_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《c语言数组典型例题分析与解答.pdf》由会员分享,可在线阅读,更多相关《c语言数组典型例题分析与解答.pdf(8页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-数组练习解答数组练习解答1 1 定义一个名为定义一个名为 a a 的单精度实型一维数组,长度为的单精度实型一维数组,长度为4 4,所有元素的初值均为,所有元素的初值均为0 0 的数定义语句的数定义语句是是_【分析】按照一般数据定义语句的格式,可以直接写出方法一参看答案;考虑到所有元素均赋初值时可以省略数组长度,可以写出方法二参看答案;考虑到不省略数组长度,给局部元素赋初值时,所有未赋初值的元素均有空值对数值型数组来说,初值为 0,可以写出方法三参看答案;考虑到选用静态型,不赋初值所有元素也自动赋予。空值对数值型数组来说,初值为0,可以写出方法四参看答案。【答案】方法一:float a400,

2、00,00,00;方法二:float a 00,00,00,00;方法三:float a4=00;方法四:static float 4;2 2 以下数组定义语句中,错误的选项是以下数组定义语句中,错误的选项是 char*1 char*1aa;auto char*1=0auto char*1=0;static char*l static char*l;char*l char*l;【分析】显然答案中给字符型数组赋初值的格式不对 不能直接赋予字符常量,必须用花括号括住,所以备选答案是符合题意的答案。【答案】3 3 用用 冒泡排序法冒泡排序法 对对 n n 个数据排序,个数据排序,需要进展需要进展 n

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

4、n n 个数据排序,需要进展个数据排序,需要进展 n n1 1 步。其中第步。其中第 k k 步的任务是:在第步的任务是:在第 k k 个数个数据到第据到第 n n 个数据中寻找最小数,和第个数据中寻找最小数,和第 k k 个数据交换。现在假设有个数据交换。现在假设有 4 4 个数据:个数据:4 4、1 1、3 3、2 2 要要排序,则利用排序,则利用 冒泡排序法冒泡排序法 执行第执行第 2 2 步后的结果是步后的结果是_。【分析】开场排序前的排列为:4 1 3 2执行第 1 步后的排列为:1 4 3 2执行第 2 步后的排列为:1 2 3 4【答案】1、2、3、45 5 以下数组定义语句中,

5、正确的选项是以下数组定义语句中,正确的选项是 int a=1 int a=1,2 2,3 3,4 4,5 5,66;char a2 char a233aa,bb;int a3=1 int a3=1,2 2,3 3,4 4,5 5,66;static int a static int a1,2,3,4,5,61,2,3,4,5,6;【分析】C 语言规定,二维数组定义时不允许省略第二维的长度,所以备选答案 是错误的。C 语言还规定,定义字符型数组时不允许直接使用字符常量的方式赋初值,所以备选答案也是错误的。显然备选答案符合题意。【答案】6 6 定义一个名为定义一个名为ss的字符型数组,的字符型数组

6、,并且赋初值为字符串并且赋初值为字符串123123的错误语句是的错误语句是char s=1,char s=1,22,33,0 0;char schar s=123=123;char s=123n;char s=123n;char s4=1 char s4=1,22,33;.z.-【分析】备选答案中省略了数组长度,所以每个元素都赋了初值,共计4 个元素,初值依次为l、2、3、0,最后一个元素的值为字符串完毕标记,所以数组S 中存放的是字符串123,该答案不符合题意即正确的;备选答案中直接赋予字符串作为初值所以数组 s 的长度为 4,其中的初值是字符串123,不符合题意即正确的;备选答案中也是给数

7、组 s 赋予字符串的初值,但是字符串不是123,而是123n,所以该答案符合题意 即错误的;显然答案也不符合题意 即正确的。下面来分析答案为什么是正确的,该答案给出了数组长度为 4,赋初值时仅给前 3 个元素赋予字符1、2、3,第 4 个元素没有赋初值,按照 C 语言的规定,也有初值,且初值为空值,对字符型数组来说,空值就是0,即字符率完毕标记,所以数组S 中存放的也是字符串 123。【答案】7 7 设设有以下数据定义语句,则数组元素有以下数据定义语句,则数组元素*i*i的值是的值是_。int iint i 3 3,*4=1*4=1,2 2,33;【分析】由于i 的初值为 3,所以*i就是*3

8、。由于数组的下标是从0 开场的,所以*3实际上是数组*的第 4 个元素。从定义语句中可以看出数组*的前 3 个元素的初值依次为 1、2、3,第 4 个元素没有赋初值,其初值自动设为空值,对整型数组来说,空值是 0,显然*3的值是 0.【答案】08 8 设有以下数据定义语句,则设有以下数据定义语句,则 puts putss00s00的输出结果是的输出结果是_;puts putss0s0输出结果是输出结果是_。char s45=lchar s45=l,00,2323,345345,4400;【分析】首先分析字符型数组 s 的初值,s 的第 1 行中存放的字符串是1、第 2 行中存放的符串是23、第

9、3 行中存放的字符串是345、第4 行中存放的字符串是4。puts函数的功能是输出从参数处开场存放的字符串中有效字符。按照上的分析,第 1 个输出的结果是从S00开场的字符串,这个地址对应的就是数s 的第 1 行,所以输出结果为1;第 2 个输出的结果是从s开场的字符串,这个址对应的也是数组s 的第 1 行,所以输出结果也为 1。【答案】1 19 9 设有以下数据定义语句:设有以下数据定义语句:char a410=11char a410=11,2222,3333,4444;则则 puts putsstrcatstrcata1a1,a3a3 的输出结果是的输出结果是_;putSputSstrcp

10、ystrcpya0a0,a2a2 的输出结果是的输出结果是_。【分析】字符数组 a 共有 4 行,每行存放一个字符串。这 4 行的首地址依次为:a0、a1、a2、a3,从这 4 个地址开场存放的字符串依次为:11、22、33、44。strcata1,a3函数调用的功能是将 s3处的字符串连接到 al的字符串后面,所以执行该函数调用后的 al处的字符串为2244,而该函数的返回值就是 a1的首地址,puts函数的功能就是输出这个地址存放的字符串,由此,第1 个输出的结果就是:2244。同样理由可以分析 strcpya0,a2的功能是将 a2处的字符串33复制到 a0处,返回 a0的地址,puts

11、()输出的就是 a0处的字符串,结果为:33。【答案】2244 331010 设有以下数据定义语句:设有以下数据定义语句:char str210=abc char str210=abc,ABCABC;则则 printf(printf(dd,strcmpstrcmpstr1str1,str0str0 的输出结果是的输出结果是_;printfprintf dd,strcmp(strlwr(str1,str0strcmp(strlwr(str1,str0 ,str0str0 的输出结果是的输出结果是_。【分析】字符型数组 str 中,从 str0开场存放的字符串是abc、从 strl开场存放的字符串

12、是ABC。strcmp(strl,str0是比拟strl和 str【0处的两个字符串的大小,.z.-由于ABC是小于abc的,按照 srrcmp 函数的功能可知,返回值是一个小于0 的整数,这是第 1 个空的答案。再来分析第 2 个空的答案,strlwrstrl函数的功能是将 strl处的字符串写字母改为小写字母,其返回值是修改后字符串的地址。strcmp stlwr sir1,str0 函数的功能是比拟 strl和 str0处的字符串,由于 strl处的字符串已经改为小写字母了,所以和 str0处的字符串完全一样,返回值是0,这就是第2 个空的答案。答案*个小于 0 的任意整数 01111

13、以下程序的功能是读取以下程序的功能是读取 1010 个实数,个实数,然后依次输出前然后依次输出前 l l 个实数和、个实数和、前前 2 2 个实数和、个实数和、前前9 9 个实数和、前个实数和、前 1010 个实数和。请填写程序中缺少的语句。个实数和。请填写程序中缺少的语句。main main float f10 float f10,*0 00 0;int i int i;for fori=0i=0;i i1010;i+i+scanf scanf f f,fifi;for fori=1;ii=1;i=10=10;i+i+_ _ printf printfsum of NOsum of NO 2

14、d2df fnn,i i,*;【分析】浏览程序清单后,可以发现前一个次数型循环是输入 10 个实数存入数组 f 中。后一个次数型循环是计算前i 个实数和并存入变量*中,然后再输出这个*的值。程序中所缺少的语句就是实现计算前 i 个实数和并存入变量*中的。当 i 等于 1 时,*要等于 f0 的值,即 fil的值;当i 等于 2 时,*要等于 f0 fl的值,即f0fi1的值,此时 f0的值已经计算并存入变量*中;当 i 等于 3 时,*要等于 f0f1f2的值,即f0f1fil的值,此时 f0f1的值已经计算并存入变量*中;由此可以推出:前 i 个值的计算公式为:*fi1,将这个表达式组成语句

15、就是需要填写的容。【答案】*=*fil;或 *fil;1212 运行以下程序的输出结果是运行以下程序的输出结果是 111ll 111llllllllllllllll 222 222 main main int a=1 int a=1,2 2,3 3,4 4,5 5,i;i;for for i=1;i i=1;i 5 5;i i printf printf 1d 1d,ai ai ai ai 一一 11;【分析】首先分析数组a 各元素的值,由于是赋初值,很容易看出:a0 1、a12、a45。再分析次数型循环共计执行4 次i1、i2、i3、i4,每次输出 1 位整数;iai1,当i1 时,输出的是

16、211;当i2 时,输出的是32l;当i=3 时,输出的是 43l;当 i4 时,输出的是 541。整个程序的输出结果是1111。【答案】1313 以下程序的功能是输入一个以下程序的功能是输入一个5 5 行行 5 5 列的实数矩阵,然后求出其中的最大数和列的实数矩阵,然后求出其中的最大数和最小数,并且对调这两个数后,再输出,请填写程序中缺少的语句。最小数,并且对调这两个数后,再输出,请填写程序中缺少的语句。main main float f 55 float f 55,ma*ma*,*;int i int i,j j,ma*_lma*_l,ma*_Jma*_J,min_imin_i,min_J

17、min_J;for fori i0 0;i i5 5;i i for forj j0 0;j j5 5;j j.z.-scanf scanf ff,*;fij fij*;ma*ma*minminf00f00;ma*_ima*_ima*_ima*_imin_imin_imin_jmin_j 0;0;forfori=0i=0;i i5 5;i i for forj j0 0;j j5 5;j j if ifma*ma*fijfij ma*ma*fijfij,ma*_ima*_ii i,ma*_jma*_jj j;if ifminminfijfij _ _ fma*_ima*_jfma*_ima*_

18、jmin;min;fmin_ifmin_imin_jmin_jma*ma*;for(i for(i0 0;i i5 5;i i printf(printf(nn;for forj j0 0;j j5 5;j j printf printf 8 82f2f,fijfij;【分析】首先宏观上阅读程序,可以看出程序的根本构造是:用双重次数型循环读取5 行 5列矩阵的元素值存入二维数组f 中;寻找矩阵中的最大数和最小数;交换最大数和最小数;输出交换后的矩阵元素值。需要填写的语句属于第2 个局部。现在来仔细分析这个局部的程序。通常寻找最大数或最小数的算法是首先假定最前面的数是最大数或最小数,并记录该数及

19、其在数组中的下标,然后依次处理所有元素,假设当前处理的元素大于小于最大数最小数,则重新记录新的最大数最小数及其下标。从本程序清单来看,确实是采用了这个算法,由于是同时求最大数和最小数,所以用ma*、ma*_i、ma*_j 分别记录当前的最大数及其行列下标,用min、min_i、min_j 分别记录当前的最小数及其行列下标。在二重循环的循环体中有两条单分支语句,前一个单分支语句的功能很清楚,判断当前的数组元素是否大于最大数,是则重新记录最大数及其行列下标 注意,这里是用一个逗号表达式完成三项赋值工作的。循环体中的第 2 条单分支语句当然是求当前最小数的,由此分析,当条件成立 当前数组元素小于当前

20、最小数 时,需要重新记录当前的最小数及其行列下标,所缺少的语句正是完成这项工作的,由于只能用一条语句完成三项赋值工作,所以必须使用远号表达式。对照该循环体的前一个单分支语句,很容易写出所缺少的语句。接下来阅读以后的程序,来验证所填写的语句。接下来的两条赋值语句正好完成了最大数和最小数的交换工作。前一个语句fma*_ima*_j min;是将找到的最小数存入对应最大数的位置ma*i 是最大数的行下标,ma*_i 是最大数的列下标,fma*_ima*j就是最大数,类似的,后一个语句fminimin_jma*;是将找到的最大数存入对应最小数的位置。【答案】【答案】minminfijfij,minmi

21、ni ii i,minminj=jj=j;1414 阅读以下阅读以下 程序,写出程序运行后的输出结果。程序,写出程序运行后的输出结果。main mainint al=1int al=1,3 3,6 6,7 7,100100,a2=2a2=2,4 4,5 5,8 8,100100,a10a10,i i,j j,k k;i ij j0 0;.z.-for fork k0 0;k k8 8;k k if ifa1ia2ja1ia2j ak aka1ia1i;else else ak aka2ja2j;for for k k 0 0;k k 8 8;k k printf printf 1d1d,aka

22、k;【分析】程序开场用赋初值方式给数组al 和 a2 的所有元素赋值。接下来是给变量 i、j 清0,从后面的for 循环中可以看出,变量i、j 是作为一维数组的下标的,所以它们的初值是从 0 下标开场的。重点分析其后的次数型循环,共计循环8 次,控制变量 k 的值依次为 0、l、7,这个控制循环的变量k 也是作为下标使用的。再分析循环体,这是一条双分支语句,控制条件是a1iaj,即 a1 数组的第叶元素值小于 a2 数组的第 j 个元素值。这个条件成立时,执行的操作包括:al 数组的第 i 个元素存入 a 数组的第 k 个元素中、同时 i 加 1,使得 a1i成为其后的元素;如果这个条件不成立

23、即a2 数组的第 j 个元素值小于或等于 al 数组的第 i 个元素值,执行的操作包括:a2 数组的第 j 个元素在入 a 数组的第 k 个地素中、同时 j 加 1,使得a2j成为其后的元素。综合上述的分析,可以看出,循环体的工作是将数组 al 和 a2 的当前元素中值小的元素复制到数组 a 中,如果数组 al的元素被复制,则其下标后移一个位置,指向 al 的新元素;如果数组 a2 的元素被复制,则其下标后移一个位置,指向a2 的新元素。该循环执行8 次,恰好把数组 a1 和数组 a2 中的各 4 个元素按照从小到大的顺序复制到数组a 中。最后看看输出,是一个次数型循环语句,输出的结果是数组

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

25、include string.h main main char s320=2345 char s320=2345,123456123456,23472347;int i int i,k k;for for k k 0 0,i i1 1;i i 3 3;i i if if strcmpstrcmpsksk,sisi 0 0 k k i i:puts putss sk k;【分析】该程序很简单,开场给二维字符型数组赋初值为3 个字符串,通过一个次数型循环求得变量 k 的值,然后输出 sk对应的字符串。从上面的分析可知,关键是循环语句执行后变量 k 的值等于多少?我们呵以用记录的方法来记录在循环中变

26、量k 的值。执行循环语句,记录如下:k0,i1,控制循环的条件i 3成立,执行循环体的单分支语句,条件strcmpsk,si 0相当于strcmp2345,123456 0,条件不成立,变量k 值不变,i 加 1 后继续循环;k0,i 2,控制循环的条件i 3成立,执行循环体的单分支语句,条件strcmp.z.-sk,si 0相当于strcmp2345,2345 0,条件成立,执行 ki,k 值为 2,i 加 1 后继续循环;k2,i=3,控制循环的条件i3不成立,退出循环。此时变量 k 值为 2.执行putssk;语句,输出的是 s2处存放的 字符串:2347显然该程序的主要功能是在3 个字

27、符串中。寻找最大字符串的【答案】23471616 阅读以下程序,写出程序的主要功能。阅读以下程序,写出程序的主要功能。main main int i int i,a10 a10,*,flag flag 0 0;for fori=0;i10i=0;i10;i i 十十十十 scanf scanf dd,a a【i i】;scanf scanf dd,*;for fori=0;ii=0;i10;i10;i 十十十十 if if*ai ai flag flag i i 十十 1;1;break break;if(flag=0 if(flag=0 printf printfno found!no fo

28、und!nn;else else printf printf d dnn,flagflag;【分析】该程序属于比拟简单的,开场定义整型数组a 以及整型变量*、flag 和 i。下面的次数型循环是输入 10 个整数到数组 a 中,此时可以看出变量i 是作为循环的控制变量使用的。接着输入一个整数到变量*中。接下来的次数型循环执行10 次,这是标准的用单重次数型循环来依次处理一维数组元素的程序段,处理的容是循环体中的单分支语句,即判断当前的数组元素是否等于变量*,是,则在变量师中记录 i1 后退出循环;否,则继续循环。由此可以分析出,这个流环足在数组a 中寻找*的,找不到,则变社flag 的值不会改

29、变注意动值为 0;如果找到,则 lleq 变量的值将等于 il,其中的 i 是循环控制变量,也就是找到的数组元素的下标,将其加 1 后存入变量 flag,所以此时的 flag 是对应数组元素的下标加 1 的。我们再仔细分析一下,当 i0 时,找到的是数组元素 a0,此时 flag 为 1,表示是数组的第 1 个元素,即在10 个待查整数中的序号为 1;当 i l 时,找到的是数组元素 a1,此时 flag 为 2,表示是数组的第 2 个元素,即在 10 个待查整数中的序号为 2.当 i9 时,找到的是数组元素 a9,此时 flag 为 10,表示是数组的第 1O 个元素,即在10 个待查整数中

30、的序号为10.所以,找到则 flag 的值为 1、2、10;找不到则为 0。循环后面的输出恰好是按照 flag 的值分别处理找到和找不到的两种情况。综上所述,可以总结出本程序的主要功能。【答案】输入10 个整数存入数组 a,再输入一个整数*,在数组a 中查找*。找到输出*在 10个整数中的序号从 1 开场,找不到则输出no found!。1717 阅读以下程序,写出程序的主要功能。阅读以下程序,写出程序的主要功能。main main int i int i,sumsum 0 0,a 10;a 10;for fori i0 0;i i1010;i i.z.-scanf scanf d d,aia

31、i;for fori i9 9;i i0 0;i i if if ai ai 7 7 0 0 sum sumaiai;printf printf dd,aiai;printf printf nsumnsumd dnn,sumsum;【分析】这是标准的次数型循环构造。第1 个循环是输入 10 个整数存入数组 a 中;第 2 个循环是从后向前的顺序依次处理一维数组的元素。具体的处理是表达在其循环体中,它是判断当前数是否满足条件ai70,满足条件的元素则参加累加的计算,并输出满足条件的数组元素。退出循环后,再输出这些满足条件的数组元素之和。程序功能的关键是搞清楚条件ai7 0的含义,其实很简单,这个

32、条件就是数组元素能被 7 整除。综上所述,可以总结出该程序的主要功能。【答案】输入 10 个整数,按从后向前的顺序依次寻找并输出其中能被7 整除的所有整数以及能被 7 整除的这些整数的和。1818 编一个程序,计算并输出以下数列的前编一个程序,计算并输出以下数列的前2424 项,每行输出项,每行输出 4 4 项。项。数列第数列第 1 1 项的值项的值 1 1数列第数列第 2 2 项的值项的值 2 2数列第数列第 k k 项的值项的值=第第 k kl l 项的值十第项的值十第 k k2 2 项的值,当项的值,当 k k 为奇数时,为奇数时,数列第数列第 k k 项的值项的值=第第 k kl l

33、项的值一第项的值一第 k k2 2 项的值,当项的值,当 k k 为偶数时。为偶数时。【分析】求数列的前【分析】求数列的前 24 24 项可使用次数型循环构造,只要按照给出的公式计算并保存即可。项可使用次数型循环构造,只要按照给出的公式计算并保存即可。按每行按每行 4 4 个数据的格式输出一维数组中的数据是一个标准的次数型循环。个数据的格式输出一维数组中的数据是一个标准的次数型循环。【答案】void main long int a25=0,1,2;int i;fori3;i25;i if i 2!0 aiailai2;else aiai 一 1ai2;for i 1;i 25;i printf

34、8ld,ai;ifi40 printfn;1919 编一个程序,输入一个编一个程序,输入一个 3*33*3 的实数矩阵,求两个对角线元素中各自的最大值。的实数矩阵,求两个对角线元素中各自的最大值。【分析】用二重次数型循环解决矩阵的输入。用一重次数型循环求主对角线元素的最大数,用单分支构造求次主对角线元素中的最大数。【答案】main float s33,ma*1,ma*2,*;int i,j;.z.-fori0;i3;i forj=0;j3;j+scanff,*;sij*;ma*1s00;fori=1;i3;i 十十 if(ma*1sii ma*1=sii;ma*2=s02;ifma*2s11

35、ma*2=s11;ifma*2s20 ma*2s20;printfma*1fn,ma*1;printfma*2=f n,ma*2;2020 编一个程序,输入编一个程序,输入3 3 个字符串长度均不超过个字符串长度均不超过3030存入一个二维的字符型数组中,将第存入一个二维的字符型数组中,将第3 3 个字符串连接到第个字符串连接到第 2 2 个字符率之后,然后再连接到第个字符率之后,然后再连接到第1 1 个字符串之后,个字符串之后,组成新的字符串存组成新的字符串存入一维的字符型数组中,入一维的字符型数组中,然后输出该新的字符串然后输出该新的字符串 说明:说明:此题不允许使用字符串连接函数此题不允许使用字符串连接函数。【分析】两个字符率的连接算法如下,第 1 个字符串复制到*个字符数组中注意不包括字符串完毕标记,然后再将第 2 个字符串复制到字符数组中 注意包括字符率完毕标记。此题要求连接 3 个字符串,可以用次数为3 的次数型循环来实现。【答案】void main char s9l,a331;int i,j,k;for(i=0;i=2;i+)gets(ai;k0;fori0;i=2;i forj0;j=30;j ifaij0 break;else skaij;k;sk0;printf s,s.z.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理手册

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com