《C语言新教材PPT课堂课件-5-数组》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-5-数组(59页珍藏版)》请在金锄头文库上搜索。
1、1第五章第五章 数组数组主要内容:主要内容:5.1 5.1 一维数组一维数组5.2 5.2 二维数组二维数组5.3 5.3 数组与循环计算数组与循环计算2用基本数据类型可以解决所有问题吗?用基本数据类型可以解决所有问题吗?例如:输入某班例如:输入某班50名学生某课程的成绩,统计平名学生某课程的成绩,统计平均成绩及高于平均成绩的人数。均成绩及高于平均成绩的人数。 定义定义50个独立变量接收个独立变量接收50个成绩?个成绩?用用1个变量依次接收各人成绩,与此同时累个变量依次接收各人成绩,与此同时累计总成绩,进而求出平均成绩?计总成绩,进而求出平均成绩? 数组的引入数组的引入当统计高于平均成绩的人数
2、时,需要再次输当统计高于平均成绩的人数时,需要再次输入入50个成绩吗?个成绩吗?-不妥!不妥!-可以!可以!-需要!需要! -不妥!不妥!解决方法:用数组!解决方法:用数组!3数组数组是具有一定是具有一定顺序关系顺序关系的若干的若干相同相同类型变量的集合体类型变量的集合体,组成数组的变量称为,组成数组的变量称为数组元素数组元素。数组属于构造类型。数组属于构造类型。数组的概念数组的概念45.1 5.1 一维数组一维数组l使用一个下标标识数组元素的数组叫作一维使用一个下标标识数组元素的数组叫作一维数组。数组。 如:每个班的学生排成一队,只需要指出如:每个班的学生排成一队,只需要指出某个学生在队列中
3、的编号,就可以确定这某个学生在队列中的编号,就可以确定这个学生。个学生。5一、一维数组的定义一、一维数组的定义l格式格式: : 类型名类型名 数组名数组名 常量表达式常量表达式 ; ;int a 10 ; 定义定义a a为一维为一维数组,由数组,由1010个元素个元素组组成,可独立存放成,可独立存放 1010个整型数据。个整型数据。TCTC系统为数组系统为数组a a分配分配1010个个intint型存储型存储单元,共单元,共2*10=202*10=20个字节,且这些个字节,且这些存储单元是连续的。存储单元是连续的。 数组名数组名常量表达式,数常量表达式,数组大小组大小a100010021004
4、1006100810101012101410161018 地址地址6二、一维数组元素的引用二、一维数组元素的引用下标法下标法格式格式: : 数组名数组名 下标下标 如有定义:如有定义:int a 10 ;a0a1a2a3a4a5a6a7a8a9注意:注意:数组元素的下标从数组元素的下标从0开始;开始;数组元素下标的最大值等于数组元素下标的最大值等于数组的大小减数组的大小减1。 常量常量/变量变量/表达式表达式 如,如,a0,a1, am,an,am*n ( int m=3,n=2;) : : 下标运算符,优先级下标运算符,优先级1 17三、一维数组的初始化三、一维数组的初始化l格式格式: 类型
5、名类型名 数组名数组名 常量表达式常量表达式 = 数据表列数据表列 ; 例如:例如: int a 10 = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ;全部元素赋初值全部元素赋初值将花括号中的常量依次赋给将花括号中的常量依次赋给a0a0、a1a1、a9 a9 只能为常量只能为常量例如:例如: int a 10 = 2 , 3 ;部分元素赋初值部分元素赋初值将花括号中的常量依次赋给将花括号中的常量依次赋给a0a0、a1a1,其它各数组元素的值均为,其它各数组元素的值均为0 0。 8一维数组的初始化一维数组的初始化 例如:例如: int a = 1 , 2 ,
6、3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ;注意:注意:intint a ; a ; 是不允许的!是不允许的!对全部元素赋初值时对全部元素赋初值时,可以不指定数可以不指定数组长度组长度,系统自动按初值个数取长度系统自动按初值个数取长度为为10注意:若要使数组注意:若要使数组1010个元素具有相同的初值个元素具有相同的初值5, 5, intint a =10*5; a =10*5;或或intint a =5*10; a =5*10; 都是不允都是不允许的!许的!9四、一维数组元素的输入和输出四、一维数组元素的输入和输出#include void main( ) int a10
7、,i; for ( i=0; i10; i+) scanf(%d, &ai); printf(n); for ( i=0; i10; i+) printf(%3d,ai); printf(n); /* 变量变量i作下标,取值作下标,取值09 */10举例:一维数组元素的逆序(倒序)输出举例:一维数组元素的逆序(倒序)输出例例5.3#include void main( ) int a10,i; printf(Please input array a :); for(i=0 ; i=0 ; i- ) printf(%3d,a i ); printf(n);问题:如何将数组元素逆序重新存放?(问题
8、:如何将数组元素逆序重新存放?(例例5.10)115.3(1) 一维数组与循环计算一维数组与循环计算l数组元素逆序重排数组元素逆序重排l数据查找:顺序查找法,折半查找法数据查找:顺序查找法,折半查找法l删除删除/ /插入数组元素插入数组元素l数组元素循环移位数组元素循环移位l求数组中最小元素求数组中最小元素l求数组中最小元素及其下标求数组中最小元素及其下标l排序算法:选择排序法,直接交换排序法,排序算法:选择排序法,直接交换排序法,冒泡排序法,改进的冒泡排序法,插入排序冒泡排序法,改进的冒泡排序法,插入排序法,归并排序法法,归并排序法12#include void main( ) int a7
9、=1, 2, 3, 4, 11, 12, 13; int i,temp; for(i=0;i7/2;i+) temp=ai; ai=a6-i; a6-i=temp; for(i=0;i7;i+) printf(%4d,ai); 举例:数组元素逆序重排举例:数组元素逆序重排P138P138例例5.105.10 将存放在数组中的一组数据按逆序重排。将存放在数组中的一组数据按逆序重排。 解解1)首尾对调)首尾对调 i 6-i 13#include void main( ) int a7=1, 2, 3, 4, 11, 12, 13; int i,j,temp; for(i=0,j=6;ij;i+,j
10、-) temp=ai; ai=aj; aj=temp; for(i=0;i7;i+) printf(%4d,ai); 数组元素逆序重排数组元素逆序重排 例例5.105.10解解1) 首尾对调程序首尾对调程序2 i j 14#include void main( ) int a7=1, 2, 3, 4, 11, 12, 13,b7; int i,j,temp; for (i=0;i7;i+) bi=ai; for (i=0;i7;i+) ai=b6-i; for(i=0;i7;i+) printf(%4d,ai); 数组元素逆序重排数组元素逆序重排 例例5.105.10解解2) 使用辅助数组使用
11、辅助数组是否还有其它解法?是否还有其它解法? -有!例如有!例如最佳解法是最佳解法是“首尾对调首尾对调”!15程序程序1:#include void main( )int a15=21, 13, 52, 0, -25, 6, 18, 1, 36, 2, -20, 17, 9, 33, 8; int i, x; scanf(%d, &x); for(i=0;i15;i+) if (ai= =x) break; if (i15) printf(%4d is found, its at %4d.n, x, i); else printf(Not exist!n); 查找举例查找举例1:顺序查找法:顺
12、序查找法P133例例5.6 在一组无序且不重复的数据中查找一个数,若有则显在一组无序且不重复的数据中查找一个数,若有则显示该数所在位置,否则输出提示示该数所在位置,否则输出提示“Not Exist!”。 16#include void main( )int a15=21, 13, 52, 0, -25, 6, 18, 1, 36, 2, -20, 17, 9, 33, 8; int i, x, f_at, flag=0; /*flag初值为初值为0,表示未找到;,表示未找到;f_at记录找到数所在位置记录找到数所在位置*/ scanf(%d, &x); for(i=0;i15;i+) if (
13、ai= =x) flag=1; f_at=i; break; if (flag= =1) printf(%4d is found, its at %4d.n, x, f_at); else printf(Not exist!n); 顺序查找法顺序查找法程序程序2 2: 引入一标识变量引入一标识变量flag,用,用1标识找到,标识找到,0标识未找到标识未找到17查找举例查找举例2:折半查找法(二分查找法):折半查找法(二分查找法) 折半查找法只能对有序数列进行查找折半查找法只能对有序数列进行查找,方法如下:,方法如下: 假假设设n个个数数按按由由小小到到大大的的顺顺序序存存放放在在数数组组a中中
14、,top、bot分分别别表表示示查查找找区区间间顶顶部部元元素素和和底底部部元元素素的的下下标标(初初值值为为0和和n-1)。取取查查找找区区间间的的中中间间位位置置mid=(top+bot)/2,将将待待查查找找的数的数x与与amid进行比较,分以下三种情况分别处理:进行比较,分以下三种情况分别处理: x=amid:已找到,退出查找;:已找到,退出查找; xamid:x只只可可能能落落在在amid+1和和abot之之间间,改改置置top=mid+1。 、两两种种情情况况将将查查找找区区间间缩缩小小了了一一半半,然然后后重重复复以以上上比比较较,直直到到找找到到或或者者topbot(表表示示查
15、查找找区区间间已已缩缩小小到到零零),退出循环。退出循环。例例5.718折半查找过程示例折半查找过程示例19#include void main( ) int a10=7, 9, 12, 18, 21, 25, 33, 39, 45, 60; int x, top=0, mid, bot=9, flag=0; /*标识是否找到标识是否找到,0表示未找到表示未找到*/ scanf(%d, &x); if(x=atop & x=abot) /* 若若x位于查找区间则开始查找位于查找区间则开始查找 */ while( !flag & topamid) top=mid+1; else bot=mid-
16、1; if (flag=1) printf(%4d is found, its at %4d.n, x, mid); else printf(Not exist!n); 折半查找法程序折半查找法程序例例5.720举例:删除数列中指定位置上的数举例:删除数列中指定位置上的数例例5.8 在一组不重复数据中,删除指定位置的数。在一组不重复数据中,删除指定位置的数。 分分析析: 欲欲删删除除数数组组a中中指指定定位位置置为为del_at的的元元素素,只只需需将将del-at位位置置元元素素之之后后的的所所有有元元素素依依次次向向前前移移动动一一个个位位置,然后将数组元素实际个数减置,然后将数组元素实际
17、个数减1。21删除数列中指定位置上的数程序删除数列中指定位置上的数程序例例5.8#include void main( ) int a12=1, 3, 5, 0, -3, 6, 9, 15, 7, 2, -8, 10; int i, del_at; scanf(%d, &del_at); /*待删位置起,各元素值依次被后续元素值替代待删位置起,各元素值依次被后续元素值替代 */ for(i=del_at;i11;i+) ai=ai+1; /* 输出数组时不包括最后一个元素输出数组时不包括最后一个元素 */ for(i=0;i11;i+) printf(%4d, ai); printf(n);
18、22举例:插入数到已排序数列中使仍然有序举例:插入数到已排序数列中使仍然有序习题习题5.3假假设设n个个由由小小到到大大排排列列的的数数存存放放在在数数组组a中中,待待插插入入数数存存放在放在x中。中。解解决决方方法法之之一一:首首先先在在数数组组a中中查查找找插插入入x的的位位置置;找找到到插插入入位位置置p后后,将将ap到到an-1中中的的数数往往后后顺顺移移一一个个位位置置以以腾出腾出ap放入放入x值。值。该该如如何何查查找找插插入入的的位位置置p呢呢?方方法法之之一一:顺顺序序查查找找法法,即即从从首首元元素素开开始始往往后后逐逐一一查查找找,直直到到遇遇到到一一个个元元素素大大于于等
19、等于于x。注注意意:插插入入数数的的位位置置有有三三种种情情况况:有有序序数数列列之之中中的的某某个个位位置置、第第1个个数数之之前前和和最最后后一一个个数数之之后后, 算算法法应应覆覆盖盖各各情情况。况。 23插入数到有序数列中示例插入数到有序数列中示例24#include void main( ) int a9=1, 2, 3, 4, 5, 6, 7, 8, 9; int i, j, n, temp; printf(Please input times: ); scanf(%d, &n); for(i=1;i=n;i+) temp=a0; for(j=0;j=7;j+) aj=aj+1;
20、/* 各元素值依次被后续元素值替代各元素值依次被后续元素值替代 */ a8=temp; for(i=0;i9;i+) printf(%4d, ai); 举例:数组元素循环移位举例:数组元素循环移位例例5.9 将一维数组中元素向左循环移位,移位次数由键盘输入。将一维数组中元素向左循环移位,移位次数由键盘输入。 25举例:求举例:求出一维出一维数组数组a中的最小元素中的最小元素#include void main ( ) int a10, i ; int amin; for ( i=0 ; i 10 ; i+ ) scanf(%d,&a i ); /* 定义数组定义数组a存放若干个数据存放若干个数
21、据 */amin = a 0 ;/* a 0 作为最小值的初值作为最小值的初值 */* 输入数组输入数组a的值的值 */for( i=1 ; i 10 ; i+ ) if (a i amin) amin = a i ; printf(最小元素为最小元素为 %d n, amin );/* 定义定义amin存放最小值存放最小值 */ /* 记下记下新的最小值新的最小值*/26举例:求举例:求出一维出一维数组数组a中的最小元素及其下标中的最小元素及其下标#include void main ( ) int a10, i ; int amin ; for ( i=0 ; i 10 ; i+ ) sca
22、nf(%d,&a i ); amin = a 0 ;min_at=0 ;/* a 0 作为最小值的初值作为最小值的初值 */for( i=1 ; i 10 ; i+ ) if (a i amin) amin = a i ; /* 记下记下当前最小值的下标当前最小值的下标 */ /* 记下记下新的最小值和下标新的最小值和下标 */printf(最小元素下标是最小元素下标是%dn, min_at );/*定义定义amin存放最小值存放最小值, min_at 存放其下标存放其下标 */, min_at min_at = i ; printf(最小元素为最小元素为 %d n, amin );27求出一
23、维求出一维数组数组a中的最小元素及其下标中的最小元素及其下标#include void main ( ) int a10, i ; int min_at ; for ( i=0 ; i 10 ; i+ ) scanf(%d,&a i ); min_at=0 ;/* a 0作为最小值初值,记下其下标作为最小值初值,记下其下标 */for( i=1 ; i 10 ; i+ ) if (a i a min_at) min_at = i ; /* 记下记下新的最小值的下标新的最小值的下标 */printf(最小元素为最小元素为 %d , 下标是下标是%dn, amin_at, min_at );/*
24、定义定义min存放最小值的下标存放最小值的下标 */ 另解:另解:28排序举例排序举例1:选择排序法:选择排序法基于选最小基于选最小( (大大) )的排序算法。的排序算法。 假设对假设对5 5个数(个数(a0a4)从小到大排序从小到大排序类类例例5.12共共4趟趟“0”“1”“2”“3”29选择排序法(升序)思路选择排序法(升序)思路对对1010个数个数(a0a9)从小到大排序从小到大排序的思路是:的思路是:第第0趟趟定定a0:从从a0a9中中找找最最小小数数的的位位置置min_at,将将amin_at与与a0交换,于是交换,于是数组数组a的最小数交换到了的最小数交换到了a0;第第1趟趟定定a
25、1:从从未未排排的的a1a9中中找找最最小小数数的的位位置置min_at,将将amin_at与与a1交换,于是交换,于是a1a9中最小数交换到了中最小数交换到了a1;第第i趟趟定定ai:从从未未排排的的aia9中中找找最最小小数数的的位位置置min_at,将将amin_at与与ai交换,于是交换,于是aia9中最小数交换到了中最小数交换到了ai;第第8趟趟定定a8与与a9:从从未未排排的的a8、a9中中找找最最小小数数的的位位置置min_at,将将amin_at与与a8交交换换,于于是是a8、a9中中小小数数交交换换到到a8,大数交换到大数交换到a9 。共经过了共经过了9 趟,完成了趟,完成了
26、10个数的递增排序。个数的递增排序。30for( i=0 ; i9 ; i+ ) min_at=i ; for( j=i+1 ; j10 ; j+ ) if (ajamin_at) min_at=j ; if (min_at != i) temp=amin_at; amin_at=ai; ai=temp ; /* min_at记下记下aia9中最小元素的中最小元素的下标(初值为下标(初值为i ) */外循环控制趟数,共外循环控制趟数,共9趟趟第第 i 趟目标:定趟目标:定ai (此时此时a0ai-1已定)已定)第第 i 趟目标的实现:找出趟目标的实现:找出aia9中最小数所在位中最小数所在位置
27、置min_at,将,将amin_at与与ai交换交换/* 若若aia9中的最小元素中的最小元素amin_at不是不是ai,则与则与ai交换交换 */选择排序法(升序)的核心程序段选择排序法(升序)的核心程序段要求:对要求:对10个数个数(a0a9)从小到大排序从小到大排序31选择排序法(升序)程序选择排序法(升序)程序#include void main( ) int a10; int i,j,temp,min_at;printf(Input 10 numbers :n);for(i=0;i10;i+) scanf(%d,&ai);for( i=0 ; i9 ; i+ ) min_at=i ;
28、 for( j=i+1 ; j10 ; j+ ) if(ajamin_at) min_at=j ; if (min_at!=i) temp=amin_at;amin_at=ai;ai=temp; printf(the sorted numbers : n);for(i=0;i10;i+) printf(%d ,ai); /*输入各数组元素的值输入各数组元素的值*/*选择排序(升序)选择排序(升序)*/*输出排序后的数组输出排序后的数组*/*定义数组定义数组a存放存放10个数据个数据 */32对对1010个数(个数(a0a9)从小到大从小到大直接交换法排序的思路是:直接交换法排序的思路是:第第0
29、趟趟定定a0:依依次次将将a0与与a1a9 9中中的的各各元元素素比比较较,并并交交换换不满足顺序要求的各对元素,于是不满足顺序要求的各对元素,于是数组数组a的最小数交换到的最小数交换到a0;第第1趟趟定定a1:依依次次将将a1与与a2a9 9中中的的各各元元素素比比较较,并并交交换换不不满满足足顺顺序序要要求求的的各各对对元元素素,于于是是a1a9 9中中最最小小数数交交换换到到a1;第第i趟趟定定ai:依依次次将将ai与与ai+1a9 9中中的的各各元元素素比比较较,并并交交换换不不满满足足顺顺序序要要求求的的各各对对元元素素,于于是是aia9 9中中最最小小数数交交换换到到ai;第第8趟
30、趟定定a8与与a9:将将a8、a9进进行行比比较较,使使两两数数中中的的小小数数在在a8 、大数在大数在a9,于是于是排定数组排定数组a的最后两个数。的最后两个数。共经过了共经过了9趟,完成了趟,完成了10个数的递增排序。个数的递增排序。排序举例排序举例2:直接交换排序法:直接交换排序法补充补充33直接交换排序法(升序)程序直接交换排序法(升序)程序#include void main( ) int a10; int i,j,temp;printf(Input 10 numbers :n);for(i=0;i10;i+) scanf(%d,&ai);for( i=0 ; i9 ; i+ ) f
31、or( j=i+1 ; jaj) temp=aj; aj=ai; ai=temp ; printf(the sorted numbers : n);for(i=0;i=1;i-) for(j=0;jaj+1) temp=aj;aj=aj+1;aj+1=temp;10个数要个数要9趟比较,故外循环趟比较,故外循环9次:次:for(i=9;i=1;i-)第第 i 趟目标:定趟目标:定ai第第 i 趟目标的实现:趟目标的实现:a0ai中每对中每对相邻数相邻数aj与与aj+1进行比较及交换进行比较及交换 第一对相邻数:第一对相邻数:a0与与a1 最后一对最后一对相邻数:相邻数:ai-1与与ai 内循环
32、内循环for (j=0;j=i-1;j+) 10个数据存放在个数据存放在a0a9 38冒泡排序法(升序)程序冒泡排序法(升序)程序#include void main( ) int a10; int i,j,temp;printf(Input 10 numbers :n);for(i=0;i=1;i-) for(j=0;jaj+1) temp=aj;aj=aj+1;aj+1=temp;printf(the sorted numbers : n);for(i=0;i=1;i-) swap=0; /*swap为为0表示本趟尚无相邻元素交换表示本趟尚无相邻元素交换*/ for(j=0;jaj+1)
33、temp=aj;aj=aj+1;aj+1=temp; swap=1; /*swap为为1表示本趟已有相邻元素交换表示本趟已有相邻元素交换*/ if(swap=0) break; 注:注:10个数据存放在个数据存放在a0a9 冒泡排序法(升序)改进算法的核心程序段冒泡排序法(升序)改进算法的核心程序段41直接插入排序法的基本思想是:直接插入排序法的基本思想是:每次将一个待排序数,插入到前面已排好序的子序每次将一个待排序数,插入到前面已排好序的子序列中的适当位置,直到全部数插入完成为止。列中的适当位置,直到全部数插入完成为止。排序举例排序举例5:插入排序法:插入排序法补充补充6 6个个数数共共需需
34、5 5趟趟42首先各取数组首先各取数组a和和b的第的第1个元素进行比较,将较小个元素进行比较,将较小元素存为数组元素存为数组c的第的第1个元素;个元素;接着取刚才比较中较小元素所在数组的下一个元素,接着取刚才比较中较小元素所在数组的下一个元素,与另一数组中刚才比较中的较大元素进行比较,将与另一数组中刚才比较中的较大元素进行比较,将本次的较小元素存为数组本次的较小元素存为数组c的第的第2个元素个元素;重复上述比较过程,直到某一个数组先比较完;重复上述比较过程,直到某一个数组先比较完;最后将另一个数组中未比完的元素依次存入最后将另一个数组中未比完的元素依次存入C数组数组的后续元素中,即完成有序数组
35、的合并。的后续元素中,即完成有序数组的合并。 排序举例排序举例6:合并排序法:合并排序法例例5.13 将两个已排序(升序)的数组将两个已排序(升序)的数组a、b,合并后存,合并后存放在另一个数组放在另一个数组c中,且合并后的数组也是有序排列中,且合并后的数组也是有序排列(要求不能合并后再排序)。(要求不能合并后再排序)。 43 0 1 2 3 449136597a:70 1 2 476780b:30 1 2 3 4 5 6 7 8 c:49136597767807有序(升序)数组合并有序(升序)数组合并3ijjiijiijjikkkkkkkkkki、j分别为待合并数组分别为待合并数组a,b的元
36、素下标,的元素下标,k为合并为合并后数组后数组c的元素下标,初值均为首元素下标的元素下标,初值均为首元素下标044i=j=k=0;while(i=4 & j=6) if(ai=bj) ck=ai; i+; k+; else ck=bj; j+; k+; if(i=4) /* 判断哪个数组先比较完判断哪个数组先比较完 */ for(m=i;m=4;m+) ck=am; k+; else for(m=j;m=6;m+) ck=bm; k+; 有序(升序)数组合并的核心程序段有序(升序)数组合并的核心程序段假设数组假设数组a有有5个元素,数组个元素,数组b有有7个元素个元素455.2 5.2 二维数
37、组二维数组l使用两个下标标识数组元素的数组叫作二维使用两个下标标识数组元素的数组叫作二维数组。数组。 如:学生坐在教室中,需要指定一个行号同如:学生坐在教室中,需要指定一个行号同时还需要指定一个列号,才可以确定某个学时还需要指定一个列号,才可以确定某个学生。生。46一、二维数组的定义一、二维数组的定义l格式格式: : 类型名类型名 数组名数组名 常量表达式常量表达式1 1常量表达式常量表达式2 2;int a 3 4 ; 定义定义a a为为二维数组,可独立存放二维数组,可独立存放 3*4=123*4=12个整型数个整型数据,系统要为数组据,系统要为数组a a分配分配2*12=242*12=24
38、个字节的个字节的intint型存型存储单元,这些存储单元是连续的,且储单元,这些存储单元是连续的,且按行排列按行排列。 类型名类型名数组名数组名常量常量1,第一维的大小,第一维的大小常量常量2,第二维的大小,第二维的大小47二、二维数组元素的引用二、二维数组元素的引用下标可以为常量、变量、表下标可以为常量、变量、表达式达式 如有定义:如有定义:int a 34,m=3,n=2;a00=10 ;a0n=30 ;a0m-n=20 ;a00a01a02a03a10a11a12a13a20a21a22a23第第0行行第第1行行第第2行行a格式格式: 数组名数组名下标下标1 下标下标210203048三
39、、二维数组的初始化三、二维数组的初始化1l格式格式1: 类型名类型名 数组名数组名 常量常量1常量常量2 = 数据表列数据表列 ;例如:例如: int a34 = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12 ;将花括号中的常量依次赋给各个数组元素,即将花括号中的常量依次赋给各个数组元素,即123456789101112行行012列列 0 1 2 3 49二维数组的初始化二维数组的初始化1例如:例如: int a 4 = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ;可以不指定第一维大小,此时系统自可以不指定第一
40、维大小,此时系统自动根据初值个数定第一维大小动根据初值个数定第一维大小注意:注意: 第二维大小不能省略!第二维大小不能省略!例如:例如: int a34 = 2 , 3 ;部分元素赋初值部分元素赋初值230000000000行行012列列 0 1 2 3 1234567891000行行012列列 0 1 2 3 50二维数组的初始化二维数组的初始化2l格式格式2: 类型名类型名 数组名数组名 常量常量1常量常量2 = 数据表列数据表列1 , 数据表列数据表列2 , 数据表列数据表列n ;例如:例如: int a34 = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1
41、0,11,12 ;将将第一个花括号中的常量依次赋给第一行的各个元素,第一个花括号中的常量依次赋给第一行的各个元素,将第二个花括号中的常量依次赋给第二行的各个元素,将第二个花括号中的常量依次赋给第二行的各个元素,即即123456789101112行行012列列 0 1 2 3 51二维数组的初始化二维数组的初始化2例如:例如:int a34 = 1 , 2 , 3 , 4 , 5 , 6 ;对对全部行赋初值时,可以省略第一维大小,但全部行赋初值时,可以省略第一维大小,但第二维大小不能省略。第二维大小不能省略。例如:例如:int a 4 = 1 , 2 , 3 , 4 , 5 , 6 ;12003
42、4005600行行012列列 0 1 2 3 52#include void main( ) int a34, i , j ; for(i=0;i3;i+) /*外层循环控制元素行下标外层循环控制元素行下标*/ for(j=0;j4;j+) /*内层循环控制元素列下标内层循环控制元素列下标*/ scanf(%d, &a i j ); printf(n Array a is:n); for( i=0 ; i3 ; i+ ) for( j=0 ; j4 ; j+ ) printf(%3d,a i j ); printf(n); /*每行元素后输出一个换行符每行元素后输出一个换行符*/ 例例5.4四
43、、二维数组数组元素的输入和输出四、二维数组数组元素的输入和输出53#include void main( ) int a35, i , j ; for(i=0;i3;i+) for(j=0;j5;j+) a i j =5*i+j+1 ; printf(n Array a is:n); for( i=0 ; i3 ; i+ ) for( j=0 ; j5 ; j+ ) printf(%3d,a i j ); printf(n); 例例5.5 构造如下矩阵构造如下矩阵 1 2 3 4 5 6 7 8 9 1011 12 13 14 15举例:特殊矩阵构造举例:特殊矩阵构造545.3(2) 二维数组
44、与循环计算二维数组与循环计算l矩阵转置矩阵转置l判对称矩阵判对称矩阵55举例:矩阵转置举例:矩阵转置l所谓矩阵的转置就是将矩阵的行和列互换。所谓矩阵的转置就是将矩阵的行和列互换。例例5.15主对角线以下元素主对角线以下元素a i j 与以上对应与以上对应元素元素a j i 互换互换56 a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24 a30 a31 a32 a33 a34 a40 a41 a42 a43 a44主对角线元素主对角线元素j=i 数组元素数组元素aij的下标特点的下标特点主对角线以下元素主对角线以下元素ji57
45、实现矩阵转置的核心程序段实现矩阵转置的核心程序段for(i=0;i5;i+ ) for(j=0; ji; j+) temp=aij; aij=aji; aji=temp; 例例5.15 设矩阵为设矩阵为55矩阵矩阵 方法方法1)将主对角线以)将主对角线以下元素下元素a i j (ji)与以上对应元素与以上对应元素a j i 互换互换此可用此可用1代替代替for(i=0;i5;i+ ) for(j=i+1; ji)与以下对应元素与以下对应元素a j i 互换互换此可用此可用4代替代替58举例:判对称矩阵举例:判对称矩阵l若二维数组所有第若二维数组所有第i i行行j j列的元素值均等于第列的元素值
46、均等于第j j行行i i列元素的值即为对称矩阵列元素的值即为对称矩阵 。例例5.14主对角线以下元素主对角线以下元素a i j 与以上对应与以上对应元素元素a j i 比较比较对称矩阵对称矩阵非对称矩阵非对称矩阵59判对称矩阵的核心程序段判对称矩阵的核心程序段例例5.14 设矩阵为设矩阵为44矩阵矩阵 int flag=1; /*flag用以标识是否对称用以标识是否对称, 1表示对称表示对称*/ for(i=0; i=4或flag=0退出退出for(i)循环循环*/ for(j=0; ji; j+) if (aij != aji) flag=0; break; /*break退出退出for(j)循环循环*/ if (flag) printf(Array a is yes!n); else printf(Array a is no!n); 将主对角线以下元素将主对角线以下元素a i j (ji)与以上对应)与以上对应元素元素a j i 比较比较