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

上传人:s****u 文档编号:12791588 上传时间:2020-05-24 格式:PDF 页数:8 大小:112.98KB
返回 下载 相关 举报
C语言数组典型例题分析与解答.pdf_第1页
第1页 / 共8页
C语言数组典型例题分析与解答.pdf_第2页
第2页 / 共8页
C语言数组典型例题分析与解答.pdf_第3页
第3页 / 共8页
点击查看更多>>
资源描述
数组练习解答 1 定义一个名为a的单精度实型一维数组,长度为 4,所有元素的初值均为 0 的数定义语句 是_ 【分析】按照一般数据定义语句的格式,可以直接写出方法一(参看答案);考虑到所有元 素均赋初值时可以省略数组长度,可以写出方法二(参看答案);考虑到不省略数组长度, 给部分元素赋初值时,所有未赋初值的元素均有空值(对数值型数组来说,初值为 0) ,可 以写出方法三(参看答案);考虑到选用静态型,不赋初值所有元素也自动赋予。空值(对 数值型数组来说,初值为 0) ,可以写出方法四(参看答案)。 【答案】方法一:float a400,00,00,00; 方法二:float a 00,00,00,00; 方法三:float a4= 00; 方法四: stati c float 4; 2 下列数组定义语句中,错误的是() char x1a; auto char x1=0; static char xl; char xl; 【分析】显然答案中给字符型数组赋初值的格式不对(不能直接赋予字符常量,必须用花 括号括住),所以备选答案是符合题意的答案。 【答案】 3 用冒泡排序法对n个数据排序,需要进行n一1 步。其中第k步的任务是:自下而上,相 邻两数比较,小者调上;该操作反复执行nk次。现在假设有 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个数据排序,需要进行n1 步。其中第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 a23a,b; int a3= 1,2,3,4,5,6; static int a1,2,3,4, 5,6; 【分析】 C语言 规定,二维数组定义时不允许省略第二维的长度,所以备选答案是错误 的。C语言 还规定,定义字符型数组时不允许直接使用字符常量的方式赋初值,所以备选 答案也是错误的。显然备选答案符合题意。【答案】 6 定义一个名为s的字符型数组, 并且赋初值为字符串123的错误语句是() char s=1,2,3,0 ; char s=123; char s=123n; char s4=1,2,3; 【分析】备选答案中省略了数组长度,所以每个元素都赋了初值,共计 4 个元素,初值依 次为l、2、3、0 ,最后一个元素的值为字符串结束标记,所以数组S 中存放的是 字符串123,该答案不符合题意(即正确的) ;备选答案中直接赋予字符串作为初值所以 数组s的长度为 4,其中的初值是字符串123,不符合题意(即正确的) ;备选答案中也 是给数组s赋予字符串的初值,但是字符串不是123,而是123n,所以该答案符合题意 (即错误的);显然答案也不符合题意(即正确的)。下面来分析答案为什么是正确的, 该答案给出了数组长度为 4,赋初值时仅给前 3 个元素赋予字符1 、 2、3,第 4 个 元素没有赋初值,按照 C语言 的规定,也有初值,且初值为空值, 对字符型数组来说,空 值就是0,即字符率结束标记,所以数组S中存放的也是字符串 123。【答案】 7 设有下列数据定义语句,则数组元素xi的值是_。 int i 3,x4= 1,2,3; 【分析】由于i的初值为3,所以xi就是x3。由于数组的下标是从 0开始的,所以x3 实际上是数组x的第4 个元素。从定义语句中可以看出数组x的前 3 个元素的初值依次为 1、 2、3,第4 个元素没有赋初值,其初值自动设为空值,对整型数组来说,空值是 0,显然x3 的值是0.【答案】0 8 设有下列数据定义语句,则 puts(s00)的输出结果是_; puts(s0 输出结果是_。 char s45=l,0,23,345,40; 【分析】首先分析字符型数组s的初值,s的第 1 行中存放的字符串是1、第 2 行中存放的 符串是23、第 3 行中存放的字符串是345、第 4 行中存放的字符串是4。puts()函数 的功能是输出从参数处开始存放的字符串中有效字符。按照上的分析,第 1 个输出的结果 是从S00开始的字符串,这个地址对应的就是数s的第 1 行,所以输出结果为 1;第 2 个输出的结果是从“s”开始的字符串,这个址对应的也是数组s的第1 行,所以输出结 果也为 1。 【答案】 1 1 9 设有下列数据定义语句: char a410=11,22,33,44; 则 puts(strcat(a1,a3) )的输出结果是_; putS(strcpy(a0,a2) )的输出结果是_。 【分析】字符数组a共有4 行,每行存放一个字符串。这 4 行的首地址依次为:a0、a1、 a2、a3,从这 4 个地址开始存放的字符串依次为:11、 22、33、44。strcat (a1,a3)函数调用的功能是将s3处的字符串连接到al的字符串后面,所以执行该 函数调用后的al处的字符串为2244,而该函数的返回值就是a1的首地址,puts() 函数的功能就是输出这个地址存放的字符串,由此,第 1个输出的结果就是:2244。同样理 由可以分析strcpy(a0,a2)的功能是将a2处的字符串(33)复制到a0处,返回 a0的地址,puts()输出的就是a0处的字符串,结果为:33。 【答案】2244 33 10 设有下列数据定义语句: char str210=abc,ABC; 则printf(d,strcmp(str1,str0 ) )的输出结果是_; printf(d,strcmp(strlwr(str1,str0) ) ,str0) )的输出结果是_。 【分析】字符型数组str中,从str0开始存放的字符串是abc、从strl开始存放的字符 串是ABC。strcmp(strl,str 0)是比较strl和str【0处的两个字符串的大小,由 于ABC是小于abc的,按照s rrcmp函数的功能可知,返回值是一个小于 0 的整数,这是第 1 个空的答案。再来分析第 2 个空的答案,strlwr(strl)函数的功能是将strl处的字 符串中大写字母改为小写字母,其返回值是修改后字符串的地址。strcmp(stlwr(sir1), str0) )函数的功能是比较strl和str0处 的字符串,由于strl处的字符串已经改为 小写字母了,所以和 str0处的字符串完全相同,返回值是 0,这就是第 2 个空的答案。 答案某个小于 11 下列程序的功能是读取 10 个实数,然后依 9 个实数和、前 10 个实数和。请填写程序中缺少的语句。 main() float f1 int i; for(i=0;i scanf( f, fi for(i=1;i=10;i+) _ printf(sum of NO 2d 【分析】 一个次数型循环是计算前i个实数和并存入变量X中,然后再输出这个x的值。程序中所缺少 的语句就是实现计算前i个实数和并存入变量X中的。当i等于 1 时,x要等于f0的值, 即fil的值;当i等于 2 时,x要等于f0 fl的值,即f0fi1的值,此时 f0的值已经计算并存入变量x中;当i等于3 时,x要等于f0f1f2的值,即f0 f1fil的值,此时f0f1的值已经计算并存入变量x中;由此可以推出:前i 个值的计算公式为:xxfi1,将这个表达式组成语句就是需要填写的内容。 【答案】 x=xfil ; 或 xfil; 12 运行下列程序的输 111ll llll lll 222 main() int a=1,2,3,4, 5 ,i; for( i=1;i printf( 1d, ai ai一 【分析】首先分析数组a各元素的值,由于是赋初 a45。 iai1 ,当i1 时,输出的是 211;当i2 时,输出的是 32l;当i=3 时, 输出的是 43l;当i4 时,输出的是 541。整个程序的输出结果是 1111。 【答案】 13 下列程序的功能是输入一个5 行5 列的实数矩阵,然后求出其中的最大数和最小数 且对调这两个 main() float f 55,max, x; int i,j, for(i0;i5;i) 0 的任意整数 0 次输出前l个实数和、前2个实数和、前 0,X00; 10;i+) ) ; _ fn,i,x) ; 浏览程序清单后,可以发现前一个次数型循环是输入 10 个实数存入数组 f中。后 出结果是() 5; i) 1) ; 值,很容易看出:a0 1、a12、 再分析次数型循环共计执行 4 次(i1、i2、i3、i4) ,每次输出 1 位整数; ,并 数后,再输出,请填写程序中缺少的语句。 max_l,max_J,min_i,min_J; for(j0;j5;j) scanf(f,x) ; fijx; maxminf00; max_imax for(i= 0;i5;i for(j0;j5;j) if(maxfij) maxfij,max_i if(minfij) _ fmax_imax_jmin; fmin_im for(i0;i5; printf(n) ; for(j0;j5;j printf(8 【分析】首先宏 列矩阵 输出交换后的矩阵元素值。需要填写的语句属于第 2 个部分。现在来仔细分析这个部分的程 序。通常寻找最大数(或最小数)的算法是首先假定最前面的数是最大数(或最小数) ,并 记录该数及其在数组中的下标,然后依次处理所有元素,若当前处理的元素大于(小于)最 大数(最小数),则重新记录新的最大数(最小数)及其下标。从本程序清单来看,的确是 采用了这个算法,由于是同时求最大数和最小数,所以用max、 max_i、max_j分别记录当前 的最大数及其行列下标,用min、min_i、 min_j分别记录当前的最小数及其行列下标。在二 重循环的循环体中有两条单分支语句,前一个单分支语句的功能很清楚,判断当前的数组元 素是否大于最大数,是则重新记录最大数及其行列下标(注意,这里是用一个逗号表达式完 成三项赋值工作的)。循环体中的第 2 条单分支语句当然是求当前最小数的,由此分析,当 条件成立(当前数组元素小于当前最小数)时,需要重新记录当前的最小数及其行列下标, 所缺少的语句正是完成这项工作的,由于只能用一条语句完成三项赋值工作,所以必须使用 远号表达式。对照该循环体的前一个单分支语句,很容易写出所缺少的语句。接下来阅读以 后的程序,来验证所填写的语句。接下来的两条赋值语句正好完成了最大数和最小数的交换 工作。前一个语句“fmax_imax_j min;”是将找到的最小数存入对应最大数的位置 (maxi是最大数的行下标,max_i是最大数的列下标, fmax_imaxj就是最大数) , 类似的,后一个语句“fminimi n_jmax ;”是将找到的最大数存入对应最小数的 位置。 【答案】minfij,mini i,minj=j; 14 阅读下列 main() int al=1,3,6,7,100,a2=2,4,5, _imin_imin_j 0; ) i,max_jj; in_jmax; i) ) 2f,fij) ; 观上阅读程序,可以看出程序的基本结构是:用双重次数型循环读取 5 行 5 的元素值存入二维数组f中;寻找矩阵中的最大数和最小数;交换最大数和最小数; 程序,写出程序运行后的输出结果。 8,100,a10,i,j,k; ij0; for(k0;k8;k) if(a1ia2 aka1i ; else aka2j; for (k printf(1d,ak) ; 【分析】程序开始用赋初值方式给数 从后面 下标开始的。重点分析其后的次数型循环,共计循环 8 次,控制变量k的值依次为 0、l、 7,这个控制循环的变量k也是作为下标使用的。再分析循环体,这是一条双分支语句,控制 条件是“a1iaj”,即a1 数组的第叶元素值小于a2 数组的第j个元素值。这个条件成 立时,执行的操作包括: al数组的第i个元素存入 a数组的第 k个元素中、同时 i加 1,使 得 a1i成为其后的元素;如果这个条件不成立(即a2 数组的第 j个元素值小于或等于 al 数组的第 i个元素值) ,执行的操作包括: a2 数组的第j个元素在入a数组的第k个地素中、 同时j加 1,使得a2j成为其后的元素。综合上述的分析,可以看出,循环体的工作是将数 组al和a2 的当前元素中值小的元素复制到数组 a中,如果数组 al的元素被复制,则其下标 后移一个位置,指向 al的新元素;如果数组a2的元素被复制,则其下标后移一个位置,指 向a2 的新元素。该循环执行 8 次,恰好把数组a1 和数组a2中的各 4 个元素按照从小到大的 顺序复制到数组a中。最后看看输出,是一个次数型循环语句,输出的结果是数组a中的 8 个元素值,而且输出格式为一位整数,结果当然是: 12345678。 请读者注意,由于原来的两个数组al和a2 中的元素是从小到大的顺序排列的,所以合 并后的数组a的元素也必然是从小到大的。这是一种排序的算法,称为两路归并排序法。 但是,真正的两路归并排序法要考虑到某个数组的元素全部复制后,另一个数组中的剩余元 素要全部复制。 本程序中没有考虑这个临界问题, 而是采用了在两个数组的有效数据之后, 放一个最大数的方法,并且知道归并后的数据总个数。 【答案】 12345678 15 阅读下列程序,写出程序运行后的输出结果。 include string.h main() char s320=2345 int i, k for( k 0, i1; i 3; i) if( (strcm puts(sk ); 【分析】该程序很简单, 求得变量 变量k的值等于多少?我们呵以用记录的方法来记录在循环中变量k的值。 执行循环语句,记录如下: k0,i1,控制循环的条件i 3成立,执行循环体的单分支语句,条件 (sk,si) )0相当于( 值不变,i加1 后继续循环; j) 0; k 8; k ) 组al和a2的所有元素赋值。接下来是给变量 i、j清0, 的for循环中可以看出,变量i、j是作为一 维数组的下标的,所以它们的初值是从 0 ,123456,2347; ; p(sk,si) )0) k i: 开始给二维字符型数组赋初值为 3 个字符串,通过一个次数型循环 k的值,然后输出sk对应的字符串。从上面的分析可知,关键是循环语句执行后 (strcmp strcmp(2 345,123456) )0,条件不成立,变量k k0,i 2,控制循环的条件i 3成立,执行循环体的单分支语句,条件(strcmp (sk,si) )0相当于(s 值为 2,i加1 后继续循环; k2,i=3,控制循环的条件i3不成立,退出循环。 此时变量k值为 2. 执行puts(sk) ;语句,输出的是s2处存放的 字符串 显然该程序的主要功 【答案】 2347 16 阅读下列程序,写出程序的主要功能。 main() int i, a10, x, flag 0; for(i=0; i1 scanf(d, a 【i】 ) ; scanf(d, X) ; for(i=0;i10;i十十) if( x ai) flag i十 1; break; if(flag= 0 ) printf( else printf(dn,flag) ; 【分析】该程序属于比较简单的,开始定 数型循环 接着输入一个整数到变量x中。接下来的次数型循环执行 10次,这是 trcmp(2345,2345) )0,条件成立,执行ki,k :2347 能是在 3个字符串中。寻找最大字符串的 0;i十十) no found!n) ; 义整型数组a以及整型变量x、flag和i。下面的次 是输入 10 个整数到数组a中,此时可以看出变量i是作为循环的控制变量使用的。 标准 的用单重次数型循 环来依次处理一维数组元素的程序段,处理的内容是循环体中的单分支语句,即判断当前的 数组元素是否等于变量x,是,则在变量师中记录 i1 后退出循环;否,则继续循环。由 此可以分析出,这个流环足在数组a中寻找x的,找不到,则变社flag的值不会改变(注意动 值为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 个待查 整数中的序号为 10.所以,找到则flag的值为 1、2、10;找不到则为 0。循环后面的输 出恰好是按照flag的值分别处理找到和找不到的两种情况。综上所述,可以总结出本程序的 主要功能。 【答案】输入 10 个整数存入数组a,再输入一个整数x,在数组a中查找x。找到输出x在 10 个整数中的序号(从 1开始) ,找不 17 阅读下列程序,写出程序的主要功能。 main() int i,sum 0,a 10; 到则输出no found!。 for(i scanf( d,ai) for(i9;i0;i) if( ai 7 0) sumai; printf(d,ai) printf(nsumdn,su 【分析】这是 0;i10;i) ; ; m) ; 标准 的次数型循环结构。第 1 个循 循环是从 断当前数是否满足条件“ai70”,满足条件的元素则参加累加的计算,并输出满足 条件的数组元素。退出循环后,再输出这些满足条件的数组元素之和。 程序功能的关键是搞清楚条件ai7 0的含义,其实很简单,这个条件就是 数组元素能被 7 整除。综上所述,可以总结出该程序的主要功能。 【答案】输入 10 个整数,按从后向前的顺序依次寻找并输出其中能被 7 整除的所有整数以 及能被 7 整除的这些整数的和。 18 编一个程序,计算并输出下列数列的前24 项,每行输出4 项。 数列第1 项的值 1 数列第2 项的值 2 数列第k项的值=第k 数列第k项的值=第k 【分析】求数列的前 24项可使用次数型循环结构,只要按照给出的公式计算并 按每行4 个数据的格式输出一维数组中的数据是一个 环是输入 10 个整数存入数组a中;第 2 个 后向前的顺序依次处理一维数组的元素。具体的处理是体现在其循环体中,它是判 l项的值十第k2 项的值,当k为奇数时, l项的值一第k2 项的值,当k为偶数时。 保存即可。 标准 的次数型循环。 【答案】 void main() long int a25=0,1,2 ; 2! 0) 1; i 25; i ) 入一个 3X3 的实数矩阵,求两个对角线元素中各自的最大值。 重次数型循环解决矩阵的输入。用一重次数型循环求主对角线元素的最大数, int i; for(i3;i25;i) if( i aiailai2 ; else aiai一1ai2 ; for (i printf(8ld,ai) ; if(i40) printf(n) ; 19 编一个程序,输 【分析】用二 用单分支结构求次主对角线元素中的最大数。 【答案】 main() float s33 ,max1,max2,x; int i,j; for(i0;i3 ;i) for(j=0 scanf(f, sijx; max1s00 ; for(i=1;i if(max1si max2=s02; if(max2s11) max2=s11; if(max2s2 printf(max1fn,max1) ; printf(max2= f n,max2) ; 20 编一个程序,输入3个字符串(长度均不超过 3 3 个字符串连 入一维的字符型数组中,然后输出该新的字符串(说明:本题不允许使用字符串连接函数) 。 【分析】两个字符率的连接算法如下,第 1 个字符串复制到某个字符数组中(注意不包括 字符串结束标记),然后再将第 2 个字符串复制到字符数组中(注意包括字符率结束标记)。 本题要求连接 3 个字符串,可以用次数为 3 的次数型循环来实现。 【答案】 void main() cha ;j3;j+) x) ; 3;i 十) i ) max1=sii ; 0 ) max2s20 ; 0)存入一个二维的字符型数组中,将第 接到第2 个字符率之后,然后再连接到第1 个字符串之后,组成新的字符串存 r s9l,a331; ; i) 0;j=30;j) break; ; s, s) int i, j, k for(i=0;i=2;i+) gets(ai) ; k0; for(i0;i=2; for(j if(aij0) else skaij; k sk0; printf(
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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