C语言第7章数组
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a[4]
(a)
a[4]
123
(b)
由于一维数组是顺序存储在内存中,数组名代表了数组在 内存的起始地址,而每个数组元素字节数相同,因此,根据数 组元素序号可以求得数组各元素在内存的地址,并实现对数组 元素进行随机存取。
2 一维数组的初始化
(1) 在定义数组时对所有数组元素赋初值。例如: static int a[5]={8,8,2,4,123}; (2) 给数组部分元素赋初值 static int a[5]={7,6}; 表明只给前2个元素赋初值,即a[0]=7,a[l]=6,其 他元素自动赋0值。 (3) 对全部元素赋初值时,可以不指定数组长度,C 编译 系统自动根据初值个数来决定数组长度。例如: static int a[]={l,3,5,7,9,11,13};
for(i=0; i<M; i++) for(k=0; k<N; k++) b[i][k]=a[k][i]; for(i=0; i<M; i++) { for(k=0; k<N; k++) printf( “%5d”, b[i][k]); printf(“ \n ”); }
} 输出结果为: l 5 9 13 2 6 10 14 3 7 l l 15 4 8 12 16
printf( "\n Output array a: \n“ ); for(j=0; j<2; j++) { for(k=0;k<3;k++) /*循环三次,输出一行共三个元素*/ printf(“%4d”,a[j][k]); printf(“\n”); /*输出一行后换行,再输出下一行*/ } }
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
例1 从键盘上输入16个整数,保存在4×4的二维数组中,输 出数组偶数行和偶数列中的所有元素。
程序如下:
#include <stdio.h> main( ) { int i, j ; int a[4][4]; for( i=0; i<4; i++ ) for(j=0; j<4; j++) scanf(“ %d ”, &a[i][j]);
在上面的for循环语句中max、min与所有元素一一比较,比 max大的元素值赋给max,比min小的赋给min,同时用变量j, k分别记录最大、最小元素的下标。 打印:格式字符串中第一个%d用输出项第一项变量 j 的值替换, 后面三个%d分别用max、k、min的值替换,其余字符原样输出。 printf(“max: a[%d]=%d, min: a[%d]=%d”,j,max,k,min); 详细源代码如下: #define N 5 #include <stdio.h> main( ) { int i, j, k, max, min; static int a[5]; for(i=0; i<5; i++) scanf(“ %d ”, &a[i]);
例: int a [20]; float x [100]; 1. 数组名的确定方法同变量名。
2. C语言用方括号[ ]表示数组元数个数。
3. 常量表达式为常量和符号常量。不允许有变量,其表 达式的值代表了元素的个数。 例: int a[20]; 表示有20个元素 且元素从0开始编排:a[0],a[1]…,a [19]
1200 3000 8000
可通过赋初值决定数组大小。如为二维,则只可省略 第一维的大小. static int a[ ][4]={1, 2, 3, …,12 }; 请看一下这个例子: static M[3][4]={ {1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 想一下这句语句的结果是什么。(假设数组的起始内存地 1230 址是:0100H) 则相当于
程序如下:
#define M 4 #define N 4 #include <stdio.h> main( ) { int i,k; int a[M][N]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {3, 14, 15, 16 }}; int b[M][N];
3
11
几点注意: (1) 将数组所有元素初始值按相应顺序写在一个花括号内, 各初值用逗号分隔,按数组元素排列顺序给各元素赋值。如: static int a[3][2]={0, l, 2, 3, 4, 5}; 这使得:a[0][0]=0,a[0][1]=1,a[1][0]=2,a[l][1]=3,a[2][0]=4, a[2][1]=5。应该注意的是初始值在花括号中的顺序与初值个数 不能错。 (2)根据二维数组的特点,分行给二维数组赋初值。如: static int a[3][2]={{0, 1}, {2, 3}, {4, 5}}; 赋初始值的结果与上面一种方法相同。 显然这种方式比上种方式更直观,符合二维数组的特点,初 始值与元素关系(行、列)清楚,不易出错。
若赋全部元素的初值,可省略常量表达式 …a [ ]={0,1,2,3}; 表示a[4],即只有4个元素。
7.1.2 一维数组的引用
1. 须象使用变量那样,先定义,后使用 2. 引用方式: 数组名[下标] 代表了一个元素,等价一个同类型的变量。 例: a [0]5+a[1] 6 为正确的算术表达式 3. 一般地,一维数组各元素分配在连续地内存单元之中。
7.2.3 二维数组的存储结构和初始化 1 二维数组的存储结构
系统为数组在内存中分配一片连续的内存空间,将二维 数组诸元素按行的顺序存储在所分配的内存区域。 如有以下定义: static int a[2][3]; 对 数 组 a , 先 存 储 第 一 行 元 素 : a[0][0] , a[0][1] , a[0][2],再存第二行元素:a[l][0],a[1][1],a[1][2]。 下图表示出了数组a元素顺序与存储结构。 第一行 第二行
4560 7890
现在, 我们再来看一个使用第二种初始化方法的例子。 static int M[3][4]= {1, 2, 3, 4, 5, 6, 7, 8, 9} ;请想一下它的结果。 请注意这两个例子间的差别。 则相当于 1234
5678 9000
7.2.2 二维数组元素的引用 形式: 数组名[下标][下标]
5 6 7 8 9 10 11 12 13 14 15 16 转置 成 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
思路:
转置矩阵是将原矩阵的元素按行列互换所形成的矩阵, 使用二维数组来处理矩阵问题是很方便的,而二维数组常 常用二重循环来实现,内循环处理列,外循环处理行。
Baidu Nhomakorabea
例1:从键盘上输入5个数,输出最大、最小元素的值以及 它们的下标。 (在书上)
下面是找出最大与最小数的代码: for(i=0;i<5;i++) { if(max<a[i]) { max=a[i]; /*把当前最大值送 max,下标送j*/ j=i; } else if(min>a[i]) { min=a[i]; /*把当前最小值送min,下标送k*/ k=i; } }
其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类型的简单变量。 看下面的例子: 例7.4 二维数组的输入输出。 #include <stdio.h> main( ) { int a[2][3], j, k; printf( “\n Input array a: ” ); for(j=0; j<2; j++) for(k=0; k<3; k++) scanf(“ %d ”, &a[j][k]);
§7.2 二维数组
7.2.1 二维数组的定义
形式 类型说明符 数组名[常量表达式] [常量表达式] 例: int a[4] [10]; float x[8] [20]; 1. 不可将定义写为int a[4,10]。 2. 可将二维数组的元素看成为若干个特殊的一维数组。 如: int b[3] [4]; 则: 有三个特殊的一维数组b[0],b[1], b[2],每一个又有四个元素: b[0][0], b[0][1], b[0][2], b[0][3], b[1][0], b[1][1], b[1][2], b[1][3], b[2][0], b[2][1], b[2][2], b[2][3], b[3][0], b[3][1], b[3][2], b[3][3],
max=min=a[0]; /*假定第一个元素既是最大的,也是最小的*/ j=k=0; /*对分别记录最大,最小元素下标的变量j,k初始化*/ for(i=0; i<5; i++) { if( max<a[i] ) { max=a[i]; /* 把当前最大值送max,下标送j */ j=i; } else if ( min>a[i] ) { min=a[i]; /* 把当前最小值送min,下标送k */ k=i; } } printf(“max: a[%d]=%d, min: a[%d]=%d”, j,max,k,min); }
7.1.3 一维数组的存储结构和初始化 1 一维数组的存储结构
C编译系统为所定义的数组变量在内存中分配一片连续的 存储单元,诸元素按数组下标从小到大连续排列,每个元素 占用相同的字节数。 例如,定义数组a如下: static int a[5]; 数组a的存储示意图如下图所示:
a[0] a[1] a[2] a[3] 1006 1000 a[0] a[1] a[2] a[3] 8 8 2 4
4. 可在定义时对静态数组和外部存储(全局)数组赋初值, 方 法如下: 对全部元素赋初值 static int a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19,}
静态
对部分元素赋初值 static int a[10]={0,1,2,3,4}; 如此,只有前5个元素初值确定,后5个元素由系统设置 (一般缺省初始化为0)。 如对数组元素赋同一初值,必须一一写出: static int a[10]={0,0,0,0,0,0,0,0,0,0}; 不可写成: static int a[{10*0}];
3. 二维数组的存放方式为: 按行存放。由此可推广 至三维、 n维数组的定义和存放。 即: 最右边的下标变化最快。 4. 初始化: 按行给二维数组赋初值: static int a[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; 可以去掉其中的{ }。 可以对部分元素赋初值,但需表达清楚。如: static int a[3][4]={{1,2},{3},{8}}。 则相当于
第七章
数组
前面所用到的数据均为基本类型(整、实、字
符),为了丰富数据类型 ,须提供强有力的数据表
达方式。C语言提供了一种构造类型数据–––由基
本类型按某一规则组合在一起。 其中数组:同一种(基本)类型按一定顺序组 合在一起的数据类型。
§7.1 一维数组
7.1.1 一维数组的定义 形式: 类型说明符 数组名[常量表达式];
(3)给全部元素赋初值时,可以不指定第一维大小,但是第 二维大小必须指定。如: static int a[][2]={0, 1, 2, 3, 4, 5}; 定义了一个3×2(三行两列)数组a。 static int a[][2]={{l, 2}, { }, {0, 5}}; 定义了一个3×2的数组a。 例2.用如下的4×4矩阵初始化数组a[4][4],求其转置矩阵并 输出之。 1 2 3 4
for( i=0; i<4; i++ ) { for( j=0; j<4; j++ ) if (i%2==0 || j%2==0) printf( “%-4d”, a[i][j]); printf(“ \n ”); } } 如果输入为: 0 1 2 3↙ 4 5 6 7↙ 8 9 10 11↙ 12 13 14 15↙ 输出结果如下: 0 l 2 4 6 8 9 10 12 14