




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章数组的定义和引用6.1 一维数组 6.1.1 一维数组的定义 由一组类型相同的相关数据项构造而成的集合称为数组(Array),在内存中占据连续的存储空间。构成数组的数据项称为数组的元素(element of Array)。同一数组中的元素,具有相同的数据类型。 1 一维数组的定义格式: 存储类型 数据类型 数组名数组长度 2 说明: (1) 存储类型是auto类型或static类型,缺省时系统默认为auto类型。如果定义为auto类型,数组存放在动态存储区;如果定义为static类型,数组存放在静态数据区。 (2) 数据类型表示的是数组中各元素的数据类型,可以是任何基本类型和构造类型。但同一数组中的各元素必须属于同一数据类型。 (3) 数组名的命名应该符合C语言中标识符命名规则。 (4) 定义数组时,数组的长度是数组中元素的个数,只能用常量或符号常量表示,不能是变量或包含变量的表达式。 例:int a7; 表示定义了一个自动存储类型,数组名为a,数组长度为7的整型数组。它是一个变量的集合,a数组中共包含有7个元素。数组元素的下标从0开始,因此a数组中的元素依次为a0、al、a2、a3、a4、a5、a6。a数组在存储时,占用连续的存储单元,存储单元内的值是随机的。如图6-1所示。 数组元素: a0 a1 a2 a3 a4 a5 a6 存储单元: -23 5 -4 1324 6684 -9336 -545 图6-1 数组a的内存分配图 6.1.2 一维数组元素的引用 对数组元素的引用就是对数组元素的使用,数组定义之后就可以对数组元素引用和操作了。在C语言中,只能逐个引用数组元素,不能一次引用整个数组。一个数组元素就是一个变量,其使用规则与同类型的变量的使用是一样的。 数组元素的引用格式: 数组名下标 它表示数组中的某个元素。下标是数组元素在数组中的排列序号,可以是整型常量、变量或表达式。例如: a0=a1+3+a2*2+a9-3 例6-1一维数组的定义及引用。 程序清单: #include void main() int i,a10; /*定义一个整型的一维数组*/ for(i=0;i=0;i-) printf(a%d=%d,i,ai); /*逆向输出数组元素的值*/ 输出结果: a9=9 a8=8 a7=7 a6=6 a5=5 a4=4 a3=3 a2=2 a1=1 a0=0 6.1.3 一维数组的初始化 数组的初始化可以在定义时完成,也可以在数组定义之后对数组元素逐个赋值。 1 在定义时进行初始化的格式: 数据类型 数组名 数组长度=数据1,数据2,数据n; 例如: double b4=1.0,3.2,6,5.0; 在定义b数组的同时完成了初始化,数组中的每个元素按照先后次序得到相应的赋值,即:b0=1.0, b1=3.2, b2=6.0, b3=5.0。 2 说明: (1) 花括弧中的数据应与定义的类型一致,否则系统会进行自动类型转换。 (2) 可以只给数组的前面一部分元素赋值。例如: int a6=0,3,2; a数组的前3个元素依次得到相应的赋值,而后3个元素则由系统自动赋为0。 (3) 在对数组全部元素赋值时,可以省略数组的长度。例如: int a=0,3,2,6,-9,10,45,78; 系统会根据花括弧中初值的个数自动定义a数组的长度为8。 对于static类型的未赋初值的数组,系统会自动将数组的全部元素初始化为0;而对于auto类型的数组,C编译器不对其进行初始化,必须在程序中进行初始化。 6.1.4 一维数组的应用 例6-2输入10个数,输出其中的最大值和最小值。#include #define N 10 void main() int i; float aN,max,min; printf(input 10 numbers::n,N); for(i=0;i=N-1;i+) scanf(%f,&ai); max=min=a0; for(i=0;imax) max=ai; if (aia1,则交换它们的值,然后用a1与a2相比较,若a1a2,再交换它们的值,直到a8与a9比较处理完毕。经过第一轮9次比较之后,最大的数将“沉底”,小数将“上浮”;然后再对剩下的9个数进行第二轮比较,比较8次,直到最后一轮(第9轮)两个数比较,完成对所有数的排序。若对n个数排序,比较n-1轮,第一轮比较n-1次,第二轮比较n-2次,第i轮比较的次数是n-i。 6.2 二维数组 相对于一维数组而言,二维数组是较为复杂的数组形式,可以用来建立更加复杂的数据结构。二维数组的定义、初始化和引用与一维数组类似。二维数组可以看成是特殊形式的一维数组,它由多行数据排列组合在一起构成。 6.2.1 二维数组的定义 二维数组的定义格式: 存储类型 数据类型 数组名第一维长度第二维长度 第一维长度代表数组矩阵的行数,第二维长度代表数组矩阵的列数。例如: int a23; 表示定义了一个auto类型,数组名为a的2行3列(共有6个元素)的整型二维数组。它可以看成一个特殊的一维数组,该数组的元素组成如下: a00,a01,a02 a10,a11,a12 二维数组在内存中是按先行后列的顺序存放。即先存放第一行元素,然后依次存放第二行、第三行、。图6-4是数组a的内存分配图,各存储单元的值是随机值。 数组元素: a00 a01 a02 a10 a11 a12 存储单元: 384 500 -9 567 678 -783 图6-4 数组a的内存分配图 6.2.2 二维数组的引用 同一维数组一样,二维数组也是必须先定义后引用,二维数组的引用也是通过下标来实现。 格式为: 数组名行下标 列下标 其中,行下标和列下标表示数组元素所在的行和列,下标可以是常量,变量,或整数表达式。并且每个下标都必须用方括号括起来,行下标和列下标都不能超出定义范围。 例:int a34; a03表示二维数组a的第0行第3列的元素,aij表示a数组的第i行第j列的元素。对a数组中各元素引用时,行下标的范围为02,列下标的范围为03。 应该注意的是,在使用二维数组时只能引用数组元素,而不能整行或整列的引用数组。 例6-4二维数组的定义和引用 程序清单: #include void main() int i,j,a45; for (i=0;i4;i+) /*给每个数组元素赋值*/ for (j=0;j5;j+) aij=i*j; for (i=0;i4;i+) for (j=0;j5;j+) /*输出一行元素的值*/ printf(a%d%d=%2d ,i,j,aij); printf(n); /*每输出一行就回车换行*/ for (i=0;i4;i+) for (j=0;j5;j+) printf(%d ,aij); /*按矩阵格式输出*/ printf(n); 输出结果: a00= 0 a01= 0 a02= 0 a03= 0 a04= 0 a10= 0 a11= 1 a12= 2 a13= 3 a14= 4 a20= 0 a21= 2 a22= 4 a23= 6 a24= 8 a30= 0 a31= 3 a32= 6 a33= 9 a34=12 0 0 0 0 0 1 2 3 4 0 0 2 4 6 8 0 3 6 9 12 6.2.3 二维数组的初始化 二维数组初始化可以在定义时完成,也可以在程序当中逐个赋值。 1 在定义时初始化的一般格式为: 数据类型 数组名第一维长度第一维长度=数据行1,数据行2,数据行n 或者写为: 数据类型 数组名第一维长度第一维长度=数据1,数据2,数据n 数据行是指数组矩阵中某行数据按从左至右的次序排列起来的集合,数据行中的各数据项之间用逗号隔开。 例如: int a34=1,2,4,5,3,2,9,6,8,7,5,4; 数组a被初始化为: a00=1 a01=2 a02=4 a03=5 a10=3 a11=2 a12=9 a13=6 a20=8 a21=7 a22=5 a23=4 使用第二种形式进行初始化时,系统将按数组矩阵每个数据在内存中排列的顺序依次对数组元素赋值。上例可写成 int a34=1,2,4,5,3,2,9,6,8,7,5,4; 当二维数组的长度较小时,利用这种格式对数组进行初始化显得简洁方便。但当数组长度较大时,则容易引起混乱,而且不易修改,而利用第一种格式比较直观且方便修改。 2 说明: (1) 可以只给部分元素赋初值,此时系统将自动给剩余的元素赋0值。例如: int a34=1,2,3,2,6,8,5; 数组a被初始化为: a00=1 a01=2 a02=0 a03=0 a10=3 a11=2 a12=6 a13=0 a20=8 a21=5 a22=0 a23=0 如果只对第二行元素赋初值,则可以写成: int a34=0,1,5,3; 当位于数组后面大部分的元素值为0时,使用第二种格式给数组矩阵赋初值。例如: int a34=1,0,5,2,3; 数组a初始化为: a00=1 a01=0 a02=5 a03=2 a10=3 a11=0 a12=0 a13=0 a20=0 a21=0 a22=0 a23=0 (2) 给全部元素赋值时,可省略一维数组长度。当使用上述两种初始化格式对二维数组的全部元素都赋初值时,可以省略第一维长度,但不能省略第二维长度。例如: int a4=0,2,0,2,5,6; 也可写成: int a4=0,2,3,0,4,5,7,8,2,4,0,0; 例6-5二维数组的初始化及使用。 程序清单: #include void main() int a4=0,2,9,0,3,6,7,0,2,0,0; int i,j; for (i=0;i3;i+) for (j=0;j4;j+) printf(%d ,aij); printf(n ); 6.2.4 二维数组应用举例 例6-6 编写程序,求34矩阵中值最小的元素的值,及其所在的行号、列号。 分析:根据题目要求,可用一个二维数组存放矩阵,从二维数组所有元素中找出最小值,并记录其所在的行号,列号。算法如图6-5所示。 程序清单: #define ROW 3 #define COL 4 #include void main() int i,j,row,column,min; static int aROWCOL=1,22,13,43,345,3,-500,96,-103,10,3,20; min=a00; for(i=0;i3;i+) for(j=0;j4;j+) if (aijmin) min=aij; row=i; column=j; printf(最小值为:%d,位于第%d行,第%d列。n,min,row+1,column+1); 输出结果: 最小值为:-500,位于第2行,第3列。 例6-7 已知a为23的矩阵,b为34的矩阵。求c=ab。 分析:求两个矩阵的乘积,用a矩阵的某行与b矩阵的某列对应元素相乘,再相加,所得的结果为c矩阵的某行某列上的元素,使得c为24的矩阵。可以使用二维数组处理这个问题。算法如图6-6所示。 程序清单: #include void main() int a23=5,6,7,8,2,1,c24,i,j,k; int b34=2,5,1,3,3,5,0,2,6,4,2,7; for (i=0;i2;i+) for (j=0;j4;j+) cij=0; for (k=0;k3;k+) cij+=aik*bkj; printf(矩阵a与b的乘积矩阵c为:n); for (i=0;i2;i+) for (j=0;j字符串2,则函数值为1; 如果字符串1“Good”) 这种写法实错误的,正确的写法是: if (strcmp(chl, “Good”)0) 5 strcpy(字符数组,字符串) 功能:将字符串复制到字符数组中,函数返回字符数组的起始地址。 在C语言中,不能直接将字符串或字符数组用赋值号赋值给一个已定义过的字符数组。例如,要给已定义的字符数组str赋值,不能写成: str= “computer”; 只能使用strcpy函数来实现赋值,只能写为: strcpy(str, “computer”); 6 strlen(字符串) 功能:求字符串的长度,不包括0在内。当参数为字符数组时,要求参数必须使用字符数组名。函数返回值为字符串的长度。例如: char strl0= “computer”; int length; length=strlen(str); 则length的值为字符串的实际长度8。 7 strlwr(字符串) 功能:将字符串中的大写字母转换为小写字母。当参数为字符数组时,要求必须使用字符数组名。函数返回值为转换后的小写字符串。 8 strupr(字符串) 功能:将字符串中的小写字母转换为大写字母。当参数为字符数组时,要求参数必须使用字符数组名。函数返回值为转换后的大写字符串。 6.3.5 字符数组应用举例 例6-8 输入一行简单英文句子,统计其中单词的个数。 分析:统计一个句子中的单词数量,即统计保存该句子的字符数组中用空格隔开的单词个数。从第一个字符开始检查字符数组,如果遇到空格,则统计变量加l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB23-T2846-2021-电子政务云平台服务管理规范-黑龙江省
- 医院卫生安全管理制度
- 电梯井加装方案(3篇)
- 土地合同清查方案(3篇)
- 商场租户安全管理制度
- 家具出租定价方案(3篇)
- 合作项目公司管理制度
- 建筑单位节税方案(3篇)
- 兽药电销公司管理制度
- 海码头-拆除方案(3篇)
- 学生不爱写作业分析报告
- 楼宇电气系统安全检查表
- 钢支撑(钢管)强度及稳定性验算
- 口暴服务流程
- 带式输送机-毕业设计
- 视器说课课件
- GB/T 43232-2023紧固件轴向应力超声测量方法
- 产房医院感染控制风险评估表
- 武汉杨春湖实验学校小学六年级小升初期末语文试卷
- 电大《机电控制工程基础》期末复习资料及参考答案资料
- DL/T 5484-2013 电力电缆隧道设计规程
评论
0/150
提交评论