资源预览内容
第1页 / 共70页
第2页 / 共70页
第3页 / 共70页
第4页 / 共70页
第5页 / 共70页
第6页 / 共70页
第7页 / 共70页
第8页 / 共70页
第9页 / 共70页
第10页 / 共70页
亲,该文档总共70页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 数组,前面各章所使用的数据都属于基本数据类型(整型、实型、字符型),C语言除了提供基本数据类型外,还提供了构造类型的数据,它们是数组类型、结构体类型、共同体类型等。构造数据类型是由基本数据类型的数据按照一定的规则组成,所以也称为“导出类型”。,下面简单介绍一下数组概念: 1、数组:一组具有相同数据类型的数据的有序的集合。 2、数组元素:数组中的元素。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用。在定义一个数组后,在内存中使用一片连续的空间依次存放数组的各个元素。 3、数组的下标:是数组元素的位置的一个索引或指示。 4、数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维数组。,7.1一维数组的定义和使用,7.1.1 一维数组的定义(先定义后使用) 定义方式: 类型说明符 数组名整型常量表达式 例、 int a10; 定义一个数组,数组名a,有10个元素,每个元素的类型均为int。 这10个元素分别是:a0、a1、a2、a3、a4、a8、a9。 注意: (1)C语言中,数组下标从0开始.,(2)C语言不允许对数组的大小做动态定义,如: int n; scanf(“%d“, 因为在编译时,C编译器根据已知数组大小分配内存空间。 说明: (1)数组名:按标识符规则。本例a就是数组名。,(2)整型常量表达式:表示数组元素个数(数组的长度)。可以是整型常量或符号常量,不允许用变量。整型常量表达式在说明数组元素个数的同时也确定了数组元素下标的范围,下标从0开始整型常量表达式-1(注意不是1整型常量表达式)。C语言不检查数组下标越界,但是使用时,一般不能越界使用,否则结果难以预料。本例数组元素个数是10个,下标从0-9。,(3)类型说明:指的是数据元素的类型。类型说明确定了每个数据占用的内存字节数。比如整型2字节,实型4字节,双精度8字节,字符1字节。 本例数组元素是整型,每个元素占2个字节,因为有10个数组元素,所以占用20字节。 (4)C编译程序为数组分配了一片连续的空间。 (5)C语言还规定,数组名是数组的首地址。即a=&a0,数组必须先定义后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式:数组名下标表达式下标可以是整型常量或整型表达式。如:a0=a5+a7-a2*31个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。,7.1.2 一维数组元素的 引用,例 使数组元素a0a9的值为09,然后逆序输出。 main() int i,a10; for (i=0;i=0; i-) printf(“%d “,ai); 运行输出: 9 8 7 6 5 4 3 2 1 0,初始化格式:数据类型 数组名常量表达式初值表 初始化:在定义时指定初始值,编译器把初值赋给数组变量。 赋值:使用赋值语句,在程序运行时把值赋给数组变量,如a0 = 2。 1、一般初始化,例: int a10= 0,1,2,3,4,5,6,7,8,9 int array10 = 1,2,3,4,5,6,7,8,9,10;,7.1.3 一维数组的初始化,2、部分元素初始化,其余元素均为零。 例 :int a10 = 0,1,2,3,4; 仅前5个元素赋初值,后5个元素未指定初值。 3、全部元素均初始化为0,不允许简写。 int a10 = 0,0,0,0,0,0,0,0,0,0;或:int a10=0; 不能简写为: int a10 = 0*10; 4、如果全部元素均指定初值,定义中可以省略元素的个数,例、 int a5 = 1,2,3,4,5; 可以写为: int a = 1,2,3,4,5;,例 输入10个数,用“冒泡法”对10个数排序(由小到大)。 冒泡法的基本思想:通过相邻两个数之间的比较和交换,使(数值)较小的数逐渐从底部移向顶部,较大的数逐渐从顶部移向底部。就像水底的气泡一样逐渐向上冒,故而得名。 “冒泡法”算法:以六个数9、8、5、4、2、0为例。,7.1.4 一维数组程序举例,第1趟比较(下图1) 第2趟比较(下图2),第1趟比较后,剩5个数未排好序;两两比较5次 第2趟比较后,剩4个数未排好序;两两比较4次 第3趟比较后,剩3个数未排好序;两两比较3次 第4趟比较后,剩2个数未排好序;两两比较2次 第5趟比较后,全部排好序;两两比较1次 算法结论:对于n个数的排序,需进行n-1趟比较,第j趟比较需进行n-j次两两比较。 程序流程图:(用两层嵌套循环实现),程序:设需排序的数有10个,定义数组大小为11,使用 a1a10存放10个数,a0不用。 main() int a11; /* 用a1a10, a0不用*/ int i,j,t; /* i,j作循环控制变量,t作中间变量*/ printf(“input 10 numbers:n“); for(i=1;i ai+1) /* 交换大小 */ t = ai;ai = ai+1; ai+1 = t; printf(“the sorted numbers:n“); for(i=1;i11;i+) printf(“%d“,ai); ,二维数组:数组元素是双下标变量的数组。 二维数组的数组元素可以看作是排列为行列的形式(矩阵)。二维数组也用统一的数组名来标识,第一个下标表示行,第二个下标表示列。行列下标从0开始。 7.2.1 二维数组的定义 类型说明符 数组名行常量表达式列常量表达式 例 :float a34; a为34(3行4列)的数组float b510;b为510(5行10列)的数组,7.2 二维数组的定义和引用,二维数组的理解: 二维数组a34理解为: 有三个元素a0、a1、a2,每一个元素是一个包含4个元素的数组。,二维数组的元素在内存中的存放顺序: 按行存放,即:先顺序存放第一行的元素,再存放第二行的元素。(最右边的下标变化最快,第一维的下标变化最慢)。,强调: (1)二维数组中的每个数组元素都有两个下标,且必须分别放在单独的“ ”内。如:a3,4 (2)二维数组定义中的第1个下标表示该数组具有的行数,第2个下标表示该数组具有的列数,两个下标之积是该数组具有的数组元素的个数。 (3)二维数组中的每个数组元素的数据类型均相同。二维数组的存放规律是“按行排列”。 (4)二维数组可以看作是数组元素为一维数组的数组。,二维数组元素的表示形式: 数组名下标表达式下标表达式 数组元素可以出现在表达式中,也可以被赋值。例如:b12=a23/2 注意引用数组元素的下标范围,不能越界使用。,7.2.2 二维数组的引用,1、分行赋值,如:int a34= 1,2,3,4,5,6,7,8,9,10,11,12; 2、全部数据写在一个大括号内赋值,如:int a34= 1,2,3,4,5,6,7,8,9,10,11,12; 3、部分元素赋值,如:int a34 = 1,5,9;仅对a00、a10、a20赋值,其余元素未赋值(编译器自动为未赋值元素指定初值0) 4、如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。例、int a34=1,2,3,4,5,6,7,8,9,10,11,12;,7.2.3 二维数组的初始化,二维数组的遍历访问(扫描),一般都采用双重循环处理(行循环,列循环)。 例 将一个二维数组行和列交换,存到另一个二维数组中。例如:,7.2.4 二维数组应用举例,算法: bji = aij 程序: main() int a23 = 1,2,3,4,5,6;int b32, i,j;printf(“array a:n“);for(i=0;i=1;i+) /* 01行 */ for(j=0;j=2;j+) /* 02列 */ printf(“%5d“,aij);bji = aij; /* 行、列交换 */ printf(“n“);/*输出一行后换行 */,printf(“array b:n“); for(i=0;i=2;i+)for(j=0;jmax,把aij作为新的临时最大值,并记录下其下标i和j。当全部元素比较完后,max是整个矩阵全部元素的最大值。,流程:,main() int i,j,row=0,colum=0,max;int 34=1,2,3,4,9,8,7,6,-10,10,-5,2; max = a00; for(i=0;i max ) max = aij;row = i;colum = j; printf(“max=%d, row=%d, colum=%dn“,max,row,colum); ,程序:,当数组元素的下标在2个或2个以上时,该数组称为多维数组。其中以2维数组最常用。定义多维数组:类型说明 数组名整型常数1 整型常数2 整型常数k;例如:int a233; 定义了一个三维数组a,其中每个数组元素为整型。总共有2x3x3=18个元素。,7.2.5 多维数组,说明: (1) 对于三维数组,整型常数1,整型常数2,整型常数3可以分别看作“深”维(或:“页”维)、“行”维、“列”维。可以将三维数组看作一个元素为二维数组的一维数组。三维数组在内存中先按页、再按行、最后按列存放。 (2) 多维数组在三维空间中不能用形象的图形表示。多维数组在内存中排列顺序的规律是:第一维的下标变化最慢,最右边的下标变化最快。 (3) 多维数组的数组元素的引用:数组名下标1 下标2 下标k。多维数组的数组元素可以在任何相同类型变量可以使用的位置引用。只是同样要注意不要越界。,7.3 字符数组,字符数组:存放字符数据的数组,每一个元素存放一个字符。 7.3.1 程序中定义字符数组 char c10; /* 定义c为字符数组,包含10个元素*/ c0=I; c1= ; c2=a; c3=m; c4= ; c5=h; c6=a; c7=p; c8=p; c9=y;字符型与整型可以通用,但有区别: char c10; /* 在内存中占10字节 */ int c10; /* 在内存中占20字节 */,1.逐个元素初始化char c10 = I, ,a,m, ,h,a,p,p,y 2、初始化数据少于数组长度,多余元素自动为“空”(0,二进制0)。char c10 =c,p,r,o,g,r,a,m;/*9*/,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号