《(中职)计算机程序设计(C语言)第六章第2节教学课件工信版.ppt》由会员分享,可在线阅读,更多相关《(中职)计算机程序设计(C语言)第六章第2节教学课件工信版.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、YCF(中职)计算机程序设计(C语言)第六章第2节教学课件工信版6.2 6.2 二维数组二维数组6.2.1 二维数组的定义与初始化二维数组的定义与初始化1二维数组的定义和存储方式二维数组的定义和存储方式一般形式:一般形式:类型说明符类型说明符 数组名数组名常量表达式常量表达式1常量表达式常量表达式2例如:例如:int a34;该数组的下标变量共有该数组的下标变量共有34个,即:个,即:a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22,a23 二维数组初始化也是在类型说明时给各下标变量二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值
2、,也可按行连续赋以初值。二维数组可按行分段赋值,也可按行连续赋值。赋值。例如例如:对数组对数组a53:按行分段赋值可写为按行分段赋值可写为:int a53=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;按行连续赋值可写为按行连续赋值可写为:int a53=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;这两种赋初值的结果是完全相同的。这两种赋初值的结果是完全相同的。2二维数组的初始化二维数组的初始化一维存储器中存放二维数组,有两种方式:一维存储器中存放二维数组,有两种方式:1.按行排列按行排列:即放完一行之后
3、顺次放入第二行;即放完一行之后顺次放入第二行;2.按列排列按列排列:放完一列之后再顺次放入第二列。放完一列之后再顺次放入第二列。在在C语言中,二维数组是按行排列的。即,先语言中,二维数组是按行排列的。即,先存放存放a0行,再存放行,再存放a1行,最后存放行,最后存放a2行。每行。每行中有四个元素也是依次存放。由于数组行中有四个元素也是依次存放。由于数组a说明为说明为int类型,该类型占两个字节的内存空间,所以每类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。个元素均占有两个字节。(1)可以只对部分元素赋初值,未赋初值的元)可以只对部分元素赋初值,未赋初值的元素自动取素自动取0值。
4、值。(2)如对全部元素赋初值,则第一维的长度可)如对全部元素赋初值,则第一维的长度可以不给出。以不给出。(3)数组是一种构造类型的数据。二维数组可)数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数以看作是由一维数组的嵌套而构成的。设一维数组的每个元素又都是一个数组,就组成了二维数组的每个元素又都是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维样的分析,一个二维数组也可以分解为多个一维数组。对这三个一维数组不需另作说明即可使用。数组。对这三个一维数组不需另作说明即
5、可使用。说明:说明:#include“stdio.h”main()int i,j,s=0;float average,v3,int 53=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;for(i=0;i3;i+)for(j=0;j5;j+)s=s+aji;vi=s/5.0;s=0;average=(v0+v1+v2)/3.0;printf(math:%fnc languag:%fndFoxpro:%fn,v0,v1,v2);printf(total:%fn,average);【例【例6.13】求各科平均分和总成绩平均分。】求各科平均分和总成绩平均分。
6、【例【例6.14】一个学】一个学习习小小组组有有5个人,每个人有个人,每个人有三三门课门课的考的考试试成成绩绩,成,成绩绩如表如表6-2-1所示。求所示。求全全组组分科的平均成分科的平均成绩绩和各科和各科总总平均成平均成绩绩。【分析】可【分析】可设设一个二一个二维维数数组组a53存放五个人三存放五个人三门课门课的成的成绩绩。再。再设设一个一一个一维维数数组组v3存放所求得各分科平存放所求得各分科平均成均成绩绩,设变设变量量average 为为全全组组各科各科总总平均成平均成绩绩。表表6-2-1 5个人三门课考试的成绩表个人三门课考试的成绩表#include main()int i,j,s=0;
7、float average,v3,a53;printf(input scoren);for(i=0;i3;i+)for(j=0;j5;j+)scanf(%d,&aji);s=s+aji;vi=s/5.0;s=0;average=(v0+v1+v2)/3.0;printf(math:%fnc languag:%fndbase:%fn,v0,v1,v2);printf(total:%fn,average);程序代码如下:程序代码如下:二维数组的元素也称为双下标变量,其表示的形二维数组的元素也称为双下标变量,其表示的形式为:式为:数组名数组名下标下标下标下标其中下标应为整型常量或整型表达式。其中下标
8、应为整型常量或整型表达式。例如:例如:a34 表示表示a数组三行四列的元素。数组三行四列的元素。下标变量和数组的比较:下标变量和数组的比较:说明在形式中有些相似,但这两者具有完全说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。后者可以是常量,变量或表达式。6.2.2 二维数组的引用二维数组的引用6.2.3 二维
9、数组的应用二维数组的应用极点与鞍点问题极点与鞍点问题【例【例6.15】随机产生】随机产生20个两位数存入数组个两位数存入数组int a45中,求二中,求二维数组维数组a中所有元素的最大值、最小值及其所在的位置。中所有元素的最大值、最小值及其所在的位置。#include#include#include void main()srand(unsigned)time(NULL);for(i=0;i4;i+)for(j=0;j5;j+)aij=rand()%90+10;for(i=0;i4;i+)for(j=0;j5;j+)printf(%5d,aij);printf(n);/求极值及其位置求极值及其
10、位置 min=max=a00;minh=minl=maxh=maxl=0;for(i=0;i4;i+)for(j=0;jmax)max=aij;maxh=i;maxl=j;if(aijmin)min=aij;minh=i;minl=j;/打印极值及其位置打印极值及其位置 printf(max=a%d%d=%dn,maxh,maxl,max);printf(min=a%d%d=%dn,minh,minl,min);#include#include#include main()int mat66,i,j;int h,l;srand(unsigned)time(NULL);for(i=0;i6;i+
11、)for(j=0;j6;j+)matij=rand()%90+10;printf(%4d,matij);printf(n);【例【例6.16】随机产生】随机产生36个两位数存入数组个两位数存入数组int mat66中中,找出二维数组找出二维数组mat中的极点和鞍点。中的极点和鞍点。分析:若某元素在所在行相邻两点中与所在列相邻两点中分析:若某元素在所在行相邻两点中与所在列相邻两点中均为最大或最小,则该点为极点。均为最大或最小,则该点为极点。若某元素在所在行(或列)相邻两点中为最大,同时该元若某元素在所在行(或列)相邻两点中为最大,同时该元素在所在列(或行)相邻两点中为最小,则该点为鞍点。素在所在
12、列(或行)相邻两点中为最小,则该点为鞍点。for(i=1;i5;i+)for(j=1;jmatij-1&matijmatij+1)/比左右还大比左右还大 h=3;else if(matijmatij-1&matijmati-1j&matijmati+1j)/比上下都大比上下都大 l=3;else if(matijmati-1j&matijmati+1j)/比上下都小比上下都小 l=1;else /一大一小一大一小 l=0;switch(h+l)case 6:printf(极大值点极大值点=%d,row=%d,col=%dn,matij,i,j);break;case 2:printf(极小值点
13、极小值点=%d,row=%d,col=%dn,matij,i,j);break;case 4:printf(鞍点鞍点=%d,row=%d,col=%dn,matij,i,j);break;【例【例6.176.17】编编程打印如程打印如图图6-2-16-2-1所示的所示的图图形:形:1 2 3 4 5 1 2 3 4 5 2 3 4 5 1 2 3 4 5 1 3 4 5 1 2 3 4 5 1 2 4 5 1 2 3 4 5 1 2 3 图图6-2-16-2-1程序代程序代码码如下:如下:#include#include main()main()int i,j,a45;int i,j,a45;
14、for(j=0;j5;j+)/for(j=0;j5;j+)/对对第一行元素第一行元素赋值赋值 a0j=j+1;a0j=j+1;for(i=1;i4;i+)/for(i=1;i4;i+)/对对第二第二 四行元素四行元素赋值赋值 for(j=0;j5;j+)for(j=0;j5;j+)aij=ai-1(j+1)%5;aij=ai-1(j+1)%5;for(i=0;i4;i+)/for(i=0;i4;i+)/打印二打印二维维数数组组 for(j=0;j5;j+)for(j=0;j5;j+)printf(%2d,aij);printf(%2d,aij);printf(n);printf(n);6.2.
15、4 二维数组的应用二维数组的应用图形打印图形打印【分析】本题中第二行起每一行元素的值都是上一【分析】本题中第二行起每一行元素的值都是上一行元素循环左移一个元素后的结果。行元素循环左移一个元素后的结果。【例【例6.186.18】编编程打印如程打印如图图6-2-26-2-2所示的所示的图图形:形:AAAAAAAAAAAAAAABBBBBAABBBBBAABCCCBAABCCCBAABCDCBAABCDCBAABCCCBAABCCCBAABBBBBAABBBBBAAAAAAAAAAAAAAA图图6-2-26-2-2程序代程序代码码如下:如下:#include#include main()main()
16、int i,j,k;int i,j,k;char a77;char a77;for(k=0;k=7/2;k+)for(k=0;k=7/2;k+)for(i=k;i7-k;i+)for(i=k;i7-k;i+)for(j=k;j7-k;j+)for(j=k;j7-k;j+)aij=65+k;aij=65+k;for(i=0;i7;i+)/for(i=0;i7;i+)/打印二打印二维维数数组组 for(j=0;j7;j+)for(j=0;j7;j+)printf(%c,aij);printf(%c,aij);printf(n);printf(n);【分析】本题可用复盖法实现,首先将所有元素【分析】
17、本题可用复盖法实现,首先将所有元素置为字符置为字符A,然后第二圈置为字符,然后第二圈置为字符B,从而从而实现所有元素的赋值。实现所有元素的赋值。1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6 4 1 图图6-2-36-2-3【分析】二【分析】二维维数数组赋值组赋值情况如表情况如表6-2-26-2-2所示:所示:1 11 11 11 12 21 11 13 33 31 11 14 46 64 41 1表表6-2-26-2-2ai-1j+ai-1j-1 (ai-1j+ai-1j-1 (其它其它)【例【例6.19】编程打印如图】编程打印
18、如图6-2-3所示的杨辉三角形。所示的杨辉三角形。由表可见:由表可见:aij=1 (j=0和和j=i)1 11 11 11 12 21 11 13 33 31 11 14 46 64 41 1表表6-2-26-2-2#include stdio.hmain()int a55,i,j;for(i=0;i5;i+)for(j=0;j=i;j+)if(j=0|i=j)aij=1;else aij=ai-1j+ai-1j-1;for(i=0;i5;i+)for(j=0;j40-4*i;j+)printf();for(j=0;j=i;j+)printf(%-9d,aij);/%-9d表示输出结果左对齐表
19、示输出结果左对齐 printf(n);程序代码如下:程序代码如下:【例【例6.19】编编程打印如程打印如图图6-2-4所示的所示的5阶阶魔方。魔方。17241815235714164613202210121921311182529【分析】所【分析】所谓谓“奇数奇数阶阶魔方魔方阵阵”是指是指n n为为不小不小于于3 3的奇数的魔方的奇数的魔方阵阵。我。我们们不不难发现难发现魔方魔方阵阵的的特点:所填入的特点:所填入的n n 2 2个不同整数依次个不同整数依次为为1 1、2 2、3 3、n n 2 2;各行、列和;各行、列和对对角角线线上的数字上的数字虽虽各不各不相同,但其和却是相同的;数字在相同
20、,但其和却是相同的;数字在阵阵列中的次列中的次序,并没有遵从序,并没有遵从阵阵列列单单元的行、列下元的行、列下标标的的顺顺序,序,但数字但数字“1”“1”却始却始终终出出现现在在阵阵列第一行的正中列第一行的正中间间位置,而数字位置,而数字“n“n 2 2”也始也始终终出出现现在在阵阵列第列第n n行的行的正中正中间间位置,位置,这说这说明明阵阵列中的数字排列列中的数字排列应该应该是是有一定有一定规规律的。律的。通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:(1)自然数)自然数1出现在第一行的正中间;出现在第一行的正中间;(2)若填入
21、的数字在第一行(不在第)若填入的数字在第一行(不在第n列),则下一个数字在第列),则下一个数字在第n行(最后一行)行(最后一行)且列数加且列数加1(列数右移一列);(列数右移一列);(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;(4)一般地,下一个数字在前一个数字的右上方(行数少)一般地,下一个数字在前一个数字的右上方(行数少1,列数加,列数加1););(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。(一般地,的下
22、方。(一般地,n的倍数的下一个数字是在该数的下方。)的倍数的下一个数字是在该数的下方。)17241815235714164613202210121921311182529图图6-2-4#include stdio.h#define N 5 main()int aNN,h,l,x;h=0;l=(N-1)/2;ahl=1;for(i=2;i=N)/如果该数的右上方的列已超出要打印的列数,则将该项如果该数的右上方的列已超出要打印的列数,则将该项数打印到该行的第一列数打印到该行的第一列 l=0;if(h0)h=N-1;ahl=1;for(h=0;h5;h+)for(l=0;l5;l+)printf(%
23、3d,ahl);printf(n);程序代码如下:程序代码如下:【例【例6.19】编编程打印如程打印如图图6-2-5所示的所示的图图形。形。11615141321724231231825221141920211056789 图图6-2-5【分析】本【分析】本题题二二维维数数组组的的赋值顺赋值顺序可按如序可按如图图6-2-66-2-6所示的所示的进进行:行:11615141321724231231825221141920211056789图6-2-611615141321724231231825221141920211056789 图图6-2-5#include stdio.h#define N
24、 5void main()int aNN,i,j,k=1;for(i=0;iN/2;i+)/控制圈控制圈 for(j=i;j4-i;j+)/j控制行控制行 aji=k+;for(j=i;ji;j+)/j控制行控制行 aj4-i=k+;for(j=4-i;ji;j+)/j控制列控制列 aij=k+;if(N%2=1)aN/2N/2=N*N;for(i=0;i5;i+)for(j=0;jcmw(前提:(前提:第一个矩阵的列数第一个矩阵的列数=第二个矩阵的行数)第二个矩阵的行数)【例【例6.19】有如下的两个矩】有如下的两个矩阵阵int a32和和int b23,两矩,两矩阵阵相乘后得到矩相乘后得到
25、矩阵阵c33,请编请编程程实现实现。矩矩阵阵相乘情况如相乘情况如图图6-2-7所示:所示:图图6-2-7 矩阵相乘图示矩阵相乘图示【分析】用二维数组【分析】用二维数组a32、b23、c33来表示矩阵来表示矩阵A、B、C,根据数学知识可知,根据数学知识可知,cij=ai0*b0j+ai1*b1j,所以用一个三重循环就可以求出数组所以用一个三重循环就可以求出数组c中全中全部元素。部元素。a32 b23 c33a32 b23 c331 2 1 2 3 9 12 151 2 1 2 3 9 12 152 4 4 5 6 19 26 332 4 4 5 6 19 26 335 6 29 40 51 29
26、 40 51图图6-2-7 矩阵相乘图示矩阵相乘图示a32 b23 c33a32 b23 c331 2 1 2 3 9 12 151 2 1 2 3 9 12 152 4 4 5 6 19 26 332 4 4 5 6 19 26 335 6 29 40 5129 40 51#include“stdio.h”main()int a32=,b23=,c33,i,j,k;for(i=0;i3;i+)for(j=0;j2;j+)printf(“%4d”,aij);printf(“n”);for(i=0;i2;i+)for(j=0;j3;j+)printf(“%4d”,bij);printf(“n”)
27、;for(i=0;i3;i+)for(j=0;j3;j+)cij=0;for(k=0;k2;k+)cij+=aik+bkj;程序代码如下:程序代码如下:4 4矩矩阵转阵转置置实质实质是将矩是将矩阵阵的行号和列号互的行号和列号互换换。如。如图图6-2-86-2-8所示:所示:源矩源矩阵阵 转转置矩置矩阵阵a00 a01 a02 a00 a10 a20 a30a00 a01 a02 a00 a10 a20 a30a10 a11 a12 a10 a11 a12 a01 a11 a21 a32a01 a11 a21 a32a20 a21 a22 a02 a12 a22 a32a20 a21 a22 a
28、02 a12 a22 a32a30 a31 a32a30 a31 a32 图图6-2-8 6-2-8 矩矩阵转阵转置置#include“stdio.h”#include“stdlib.h”#include“time.h”main()int a34,b43,i,j;srand(unsigned)time(NULL);printf(“原矩阵为原矩阵为:n”)for(i=0;i3;i+)for(j=0;j4;j+)aij=random(53)+18;printf(“%3d”,aij);bji=aij;printf(“n”);【例【例6.20】利用随机函数产生一个】利用随机函数产生一个3*4矩阵,要求
29、如下:矩阵,要求如下:(1)矩阵中各元素在)矩阵中各元素在1870之间;之间;(2)输出矩阵;)输出矩阵;(3)将转置后的矩阵输出。)将转置后的矩阵输出。请编程实现。请编程实现。/打印b数组 for(i=0;i4;i+)for(j=0;j3;j+)printf(“%3d”,bij);printf(“n”);#include“stdio.h”#include“stdlib.h”#include“time.h”main()int a34,b43,i,j;srand(unsigned)time(NULL);printf(“原矩阵为原矩阵为:n”)for(i=0;i3;i+)for(j=0;j4;j+
30、)aij=random(53)+18;printf(“%3d”,aij);bji=aij;printf(“n”);/打印b数组 for(i=0;i4;i+)for(j=0;j3;j+)printf(“%3d”,bij);printf(“n”);5.5.矩矩阵阵旋旋转转是指矩是指矩阵顺时针阵顺时针或逆或逆时针时针旋旋转转9090度度或或180180度。度。如图如图6-2-9演示了矩阵顺时针旋转演示了矩阵顺时针旋转90度的情况:度的情况:源矩源矩阵阵a a 顺时针顺时针旋旋转转9090度后的矩度后的矩阵阵b ba00 a01 a02 a30 a20 a10 a00a00 a01 a02 a30 a
31、20 a10 a00a10 a11 a12 a10 a11 a12 a31 a21 a11 a01a31 a21 a11 a01a20 a21 a22 a32 a22 a12 a02a20 a21 a22 a32 a22 a12 a02a30 a31 a32a30 a31 a32 图图6-2-9 6-2-9 矩矩阵阵旋旋转转(1)(1)将将amnamn顺时针顺时针旋旋转转9090度后得到矩度后得到矩阵阵bnm,bnm,两者关两者关系是:系是:bij=am-1-ji;bij=am-1-ji;或或bjm-1-i=aij;bjm-1-i=aij;(2)(2)将将amnamn逆逆时针时针旋旋转转909
32、0度后得到矩度后得到矩阵阵bnm,bnm,两者关两者关系是:系是:bn-1-ji=aij;bn-1-ji=aij;或或bij=ajn-1-i;bij=ajn-1-i;(3)(3)将将amnamn顺时针顺时针旋旋转转180180度和逆度和逆时针时针旋旋转转180180度后得到度后得到的都是矩的都是矩阵阵bmnbmn,两者关系是:,两者关系是:bij=am-1-in-1-j;bij=am-1-in-1-j;方方阵阵是一种特殊的矩是一种特殊的矩阵阵,其特点是行数和列数相等。其特点是行数和列数相等。本本节节主要知主要知识识点包括方点包括方阵阵的的顺时针顺时针旋旋转转9090度、逆度、逆时时针针旋旋转转
33、9090度、旋度、旋转转180180度和度和转转置。置。方方阵阵旋旋转转和和转转置示意置示意图图如如图图6-2-106-2-10所示:所示:6.2.6 二维数组的应用二维数组的应用方阵旋转与转置方阵旋转与转置#include”stdio.h”main()int a33,b33;for(i=0;i3;i+)for(j=0;j3;j+)aij=i*3+j+1;for(i=0;i3;i+)for(j=0;j3;j+)bij=aji;/转置转置 for(i=0;i3;i+)for(j=0;j3;j+)printf(“%3d”,bij);printf(“n”);【例【例6.21】编程实现将上图中的】编程
34、实现将上图中的int a33数组数组转置放入到转置放入到b数组中。数组中。6.2.7 二维数组的其它应用举例二维数组的其它应用举例【例【例6.23】随机产生互不相同的两位数存入二维数组】随机产生互不相同的两位数存入二维数组aNM中,中,根据二维数组中第一列的值的降序,重新调整各行的顺序。根据二维数组中第一列的值的降序,重新调整各行的顺序。【分析】本题分四个步骤完成:首先,产生互不相同的【分析】本题分四个步骤完成:首先,产生互不相同的两位数存入二维数组;然后,打印源数组;接着,根据两位数存入二维数组;然后,打印源数组;接着,根据第一列的降序调整各行的次序;最后,打印排序后的数第一列的降序调整各行
35、的次序;最后,打印排序后的数组。组。#inchude”stdio.h”main()int a33,b33;int i,j;for(i=0;i3;i+)for(j=0;j3;j+)aij=j*3+j+1;for(i=0;i3;i+)for(j=0;j3;j+)bij=aj2-i;for(i=0;i3;i+)for(j=0;j3;j+)printf(“%3d”,bij);printf(“n”);【例【例6.22】编程实现将上图中的】编程实现将上图中的int a33数数组逆时针旋转组逆时针旋转90度存入度存入b数组中。数组中。#include stdio.h#include stdlib.h#inc
36、lude#define N 5#define M 6main()int i,j,aNM,k,t;int bN*M;srand(unsigned)time(NULL);for(i=0;iN*M;i+)bi=rand()%90+10;for(j=0;ji;j+)if(bi=bj)i-;break;k=0;for(i=0;iN;i+)for(j=0;jM;j+)aij=bk+;程序代码如下:程序代码如下:printf(源数组为:源数组为:n);for(i=0;iN;i+)for(j=0;jM;j+)printf(%4d,aij);printf(n);/根据第一列的降序调整各行的次序根据第一列的降序调
37、整各行的次序 for(i=0;iN-1;i+)for(j=i+1;jN;j+)if(ai0aj0)/调整第调整第i行和第行和第j行的所有数据行的所有数据 for(k=0;kM;k+)t=aik;aik=ajk;ajk=t;printf(新数组为:新数组为:n);for(i=0;iN;i+)for(j=0;jM;j+)printf(%4d,aij);printf(n);#include stdio.h#include stdlib.h#include#define N 5#define M 6main()int i,j,aNM,k,t;int bN*M;srand(unsigned)time(N
38、ULL);for(i=0;iN*M;i+)bi=rand()%90+10;for(j=0;ji;j+)if(bi=bj)i-;break;k=0;for(i=0;iN;i+)for(j=0;jM;j+)aij=bk+;printf(源数组为:源数组为:n);for(i=0;iN;i+)for(j=0;jM;j+)printf(%4d,aij);printf(n);/根据第一列的降序调整各行的次序根据第一列的降序调整各行的次序 for(i=0;iN-1;i+)for(j=i+1;jN;j+)if(ai0aj0)/调整第调整第i行和第行和第j行的所有数据行的所有数据 for(k=0;kM;k+)t
39、=aik;aik=ajk;ajk=t;printf(新数组为:新数组为:n);for(i=0;iN;i+)for(j=0;jM;j+)printf(%4d,aij);printf(n);【分析】本题分四个步骤完成:首先,产生互不相同的两【分析】本题分四个步骤完成:首先,产生互不相同的两位数存入二维数组;然后,打印源数组;接着,求每行的位数存入二维数组;然后,打印源数组;接着,求每行的最大值最大值,将最大值移至主对角线,且保证各行数据的相对将最大值移至主对角线,且保证各行数据的相对位置不变;最后,打印输出移动后的数组。位置不变;最后,打印输出移动后的数组。【例【例6.24】将二维数组】将二维数组
40、a中每行的最大值移至主中每行的最大值移至主对角线,并且保证各行数据的相对位置不变。对角线,并且保证各行数据的相对位置不变。(二维数组的元素值是由随机函数产生的两位数)(二维数组的元素值是由随机函数产生的两位数)#include#include#include#define N 6void main()int aNN,i,j,max,maxl,k,t;srand(unsigned)time(NULL);for(i=0;iN;i+)for(j=0;jN;j+)aij=rand()%90+10;for(i=0;iN;i+)for(j=0;jN;j+)printf(%5d,aij);printf(n)
41、;程序代码如下:程序代码如下:/求每行的最大值求每行的最大值,将最大值移至主对角线将最大值移至主对角线 for(i=0;iN;i+)/*求每行的最大值求每行的最大值*/max=ai0;maxl=0;for(j=1;jmax)max=aij;maxl=j;/用右移法将最大值移至主对角线用右移法将最大值移至主对角线 while(maxl!=i)t=aiN-1;for(k=N-2;k=0;k-)aik+1=aik;ai0=t;maxl=(maxl+1)%N;#include#include#include#define N 6void main()int aNN,i,j,max,maxl,k,t;s
42、rand(unsigned)time(NULL);for(i=0;iN;i+)for(j=0;jN;j+)aij=rand()%90+10;for(i=0;iN;i+)for(j=0;jN;j+)printf(%5d,aij);printf(n);/求每行的最大值求每行的最大值,将最大值移至主对角线将最大值移至主对角线 for(i=0;iN;i+)/*求每行的最大值求每行的最大值*/max=ai0;maxl=0;for(j=1;jmax)max=aij;maxl=j;/用右移法将最大值移至主对角线用右移法将最大值移至主对角线 while(maxl!=i)t=aiN-1;for(k=N-2;k=0;k-)aik+1=aik;ai0=t;maxl=(maxl+1)%N;/用左移法将最大值移至主对角线用左移法将最大值移至主对角线 while(maxl!=i)t=ai0;for(k=1;kN;k+)aik-1=aik;aiN-1=t;maxl=(maxl-1+N)%N;printf(输出处理后的结果:输出处理后的结果:n);for(i=0;iN;i+)for(j=0;jN;j+)printf(%5d,aij);printf(n);