计算机精品课件:第5章-数组.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机精品课件:第5章-数组.ppt》由用户(金钥匙文档)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 精品 课件 数组
- 资源描述:
-
1、1,第5章 数组,5.1 一维数组 5.2 二维数组 5.3 字符数组,2,变量只有保存单一数据项的能力。 (如保存一个整数或一个实数) 程序设计中多采用数组来处理批量数据。,3,由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数据的集合,称为数组。 通常,用一个统一的名字标识这组数据,这个名字称为数组名。 构成数组的每个数据项称为数组的元素。,数组,4,例:有1000名学生,每个学生有一个成绩, 求这1000名学生的平均成绩。 用s1,s2,s3,s1000表示每个学生的成绩,下标体现内在联系。 C语言用方括号中的数字表示下标, 例: s15,5,数组是一组有序数据的集合。数组
2、中各数据的排列是有一定规律的,下标代表数据在数组中的序号 用一个数组名和下标惟一确定数组中的元素 数组中的每一个元素都属于同一个数据类型,6,5.1.1 一维数组的定义,一维数组是数组中最简单的 它的元素只需要用数组名加一个下标,就能惟一确定 要使用数组,须在程序中先定义数组,然后才能使用数组。,5.1 一维数组,7,定义一维数组的一般形式为: 类型符 数组名整形常量表达式;,数组名的命名规则和变量名相同 如: int a10;,表示有10个元素,数组长度,8,9,说明: (1)数组名命名规则与变量名相同,遵循标识符命名规则; (2)数组名后的常量表达式必须用方括号; (3)常量表达式表示元素
3、的个数,即数组的长度; 例如:a10表示名字为a 的数组有10个元素, 下标从0开始。,10,(4)常量表达式中可以包含常量和符号常量,但不能包含变量。 即C语言不允许对数组的大小做动态定义。 (即存储单元是在编译时分配的) 换言之,即C程序中,数组的大小不依赖程序运行过程中变量的值。,例如:下面的程序是错误的。 int n=5; scanf(“%d”,&n); int an;,int a4+6; 合法,11,5.1.2 一维数组元素的引用,1)只能逐个引用数组元素,而不能一次引用整个数组 2)数组元素的表示形式为: 数组名下标 3)下标可以是整型常量或整型常量表达式。 例如: a0=a5+a
4、7-a2*3,12,int main() int i,a10; for(i=0;i=0;i-) printf(“%d”,ai); return 0; ,例5.1 :数组元素的引用,定义数组时不能动态定义数组的大小,在引用数组元素时可以使用变量。是变址运算符,使a0a9的值为09,13,对数组元素的初始化可有4种方法实现: (1)在定义数组时对数组元素赋初值。,把数组元素的初值依次放在一对花括号内,经过上述定义和初始化后,各元素的值为:a0=0,a1=1,a9=9。注意没有元素a10。,5.1.3 一维数组的初始化,例如: int a10= 0,1,2,3,4,5,6,7,8,9 ;,14,(2
5、)可以只给一部分元素赋初值。 例如: int a10=0,1,2,3,4;,定义a数组有10个元素,但在花括号内只提供5个初值,表示只给前5个元素赋初值。,后5个元素的值为0。,15,(3)如果想使整个数组中全部元素的值都为0,可写成: int a10=0,0,0,0,0,0,0,0,0,0; 不能写成 int a10=0; 也不能写成 int a10=0*10;,即不能给数组整体赋初值。 一般情况下,C语言是用循环来给数组赋初值的。,16,(4)在定义数组的同时对全部数组元素赋初值,可以不指定数组长度。例如: int a5=1,2,3,4,5; 可以写成: int a =1,2,3,4,5;
6、,系统自动定义a数组有5个元素的长度。 若被定义的数组长度与初值个数不同,则数组长度不能被省略。 如想定义数组长度为10,而只能提供5个初值时,就必须写成: int a10=0,1,2,3,4;,17,例如: void main() int i,a10; a0=0; a1=1; for(i=0;i=9;i+) printf(“%dn”,ai);,说明: 在定义了一个数组后,在没有赋给各元素初值时,数组各个元素的值是不确定的。,输出结果为: 0 1 24 ,注意: 这不是初始化!,18,再例如: void main() int i,a10=0,1,2; for(i=0;i=9;i+) print
7、f(“%dn”,ai); ,19,5.1.4 一维数组程序举例,例5.2 用数组处理求Fibonacci数列问题 解题思路:,算法为: F1=1 F2=1 Fn=Fn-1+Fn-2,20,在循环结构的例题中,有两个变量f1和f2。 int main() long int f1,f2;int i; f1=1;f2=1; for(i=1;i=20;i+) printf(“%12Ld %12Ld”,f1,f2); if(i%2=0) printf(“n”); f1=f1+f2; f2=f2+f1; ,21,int main() int i,f20=1,1; for(i=2;i20;i+) fi=fi
8、-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n”); printf(“%12d”,fi); ,利用循环为数组赋初值,22,例5.3 求最大值元素和下标,并与最后一个元素交换。,算法为: 逐个与标杆max比较。,23, int i,max,p=0; int a10=0,1,2,3,4,9,6,7,8,5; max=a0; for(i=0;i10;i+) if(maxai) max=ai; p=i; ap=ai-1; ai-1=max; ,24,例5.4 用选择法对n个数由小到大排序。,算法为: 每次从待排序数据序列中选择出最小元素并定位到无序序列最前面形
9、成有序序列,25,#define N 6 int i,j,k; int aN,t; for(i=0;iaj) k=j; if(k!=i) t=ak;ak=ai;ai=t; ,用k记住较小数的下标,26,例: 用起泡法对6个数由小到大排序。,算法为: 对相邻两个数进行比较,并把小的放在前面。,第 1 轮交换过程,第 1 轮交换结果,代表比较, 若满足条件,则对换,否则不对换。不对换时也必须进行比较。,27,进行第2轮比较。,由于在第1轮处理后已在最下面,因此本轮不处理。,28,由此可知,对6个数要进行5轮比较,才能使6个数按从小到大的顺序排列。 在第 1 轮中,对每两个数之间的比较要进行 5 次
10、; 在第 2 轮中,对每两个数之间的比较要进行 4 次; 在第 5 轮中,对每两个数之间的比较要进行 1 次。,29,结论: 如果有n个数,则要进行n-1轮的比较。并且: 在第1轮中,对每两个数之间的比较要进行n-1次; 在第2轮中,对每两个数之间的比较要进行n-2次; 在第i轮中,对每两个数之间的比较要进行n-i次。,30,根据以上分析画出NS图,如图,说明: i 为比较的轮次; j 为每轮的比较次数 即形成了嵌套形式: j 为内层循环, i 为外层循环。,31,void main() int a10;int i,j,t; printf(“input :n”); for(i=0;iaj+1)
11、 t=aj;aj=aj+1; aj+1=t;,用循环为数组赋初值,外层循环次数:轮次=个数-1,内层循环次数: 个数轮次,比较两个数的大小。,利用临时单元进行对换,32,printf(“the sorted numbers:n”); for(i=0;i10;i+) printf(“%d”,ai); ,33,定义: 二维数组定义的一般形式为: 类型说明符 数组名常量表达式常量表达式,例如: float a34,b510; 定义: a 为3X4 (3行4列) 的数组; b 为5X10(5行10列)的数组。,5.2.1 二维数组的定义,5.2 二维数组,34,二维数组中元素在内存中的排列顺序是“按行
12、存放”,35,可以把二维数组看成是一种特殊的一维数组。,例如把二维数组 a 看成是有3个元素的一个一维数组,每个元素分别为: a0 a1 a2,36,37,即: float a34; 可以理解为:定义了3个一维数组, 每个一维数组有4个元素。 相当于: float a04,a14,a24;,由于: 每个一维的数组元素a0又是一个包含了 4个元素的一维数组。 因此: 将a0、a1、a2看成是3个一维数组的名字。,38,C语言允许使用多维数组。 例如:定义三维数组的方法是: float a234; 同理,可推出定义 n 维数组的定义形式。,数组的元素可以是任意数据类型, 包括可以是数组类型。,39
13、,多维数组元素在内存中的排列顺序: 第一维的下标变化最慢,最右边的下标变化最快。 例如,三维数组元素的排列顺序为:,40,二维数组元素的表示形式为: 数组名下标下标 例如: a23,对数组元素的引用即: 各种表达式中可以引用数组元素。 表达式中的数组元素也可被赋值。 例如: b12=a23/2,下标可以是整型表达式。 例如: a2-12*2-1,5.2.2 二维数组元素的引用,41,使用下标一定要限制在已定义的数组大小范围内。 例如: int a34; a34=3; 这是错误的引用 定义了a为3X4数组,但它可使用的最大下标值: 行为2,列为3。,一定要区分开: 定义数组时用的 a34 和 引
14、用数组时用的 a34 的区别。 前者是定义数组维数的大小, 后者是元素的下标值。,42,例5.5 输入输出, int i,j,a53; for(i=0;i5;i+) for(j=0;j3;j+) scanf(“%d”, ,外层行 内层列,43,可以修改为:, int i,j,a53; for(i=0;i5;i+) for(j=0;j3;j+) scanf(“%d”, ,44,5.2.3 二维数组的初始化 有4种方法对二维数组进行初始化。,(2)按排列顺序对各元素赋初值,如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,(1)分行给二维数组赋初值,如: int a34
15、=1,2,3,4,5,6,7,8,9,10,11,12;,45,只对前两个元素赋初值,后面10个元素为“0”。相当于按排列顺序赋值。,只对各行第0列元素赋初值,其余自动为“0”。赋值后数组形式为: 1 0 0 0 5 0 0 0 9 0 0 0,(3)对部分元素赋初值。 例:int a34=1,2;,例:int a34=1,5,9;,46,例:int a34=1,0,6,0,0,11;,对各行中的某一元素赋初值。其余部分自动为“0”。部分需赋给“0”,初始化后数组形式为: 1 0 0 0 0 6 0 0 0 0 11 0,47,例: int a34=1,5,6;,对某几行中的部分元素赋初值。初
16、始化后数组形式为: 1 0 0 0 5 6 0 0 0 0 0 0,int a34=1, ,5,6; 也是不允许的。,不能象 for 语句那样写成: int a34=1,5,6; 1 0 0 0 0 0 0 0 5 6 0 0,48,(4)定义数组时,可以省略数组的第一维长度,但不能省略第二维的长度。(有2种方法),对全部元素都赋初值 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以写成: int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,分行赋初值 例如:int a 4=0,0,3,0,0,10; 用数组的行定义第一维的长度。,49,
17、5.2.4 二维数组程序举例 例5.6 与例5.3类似(略),50,例: 把一个二维数组的行和列互换,保存到另一个数组中。即把数组 a 变换成数组 b 。,程序要点: 1)如何定义数组,并区分定义数组和引用数组元素(关键看下标的使用)。 2)利用循环,对数组的操作大多使用循环。 3)充分理解内层循环和外层循环。,51,void main() int a23= 1,2,3,4,5,6 ; int b32;int i,j; for( i=0;i=1;i+) for( j=0;j=2;j+) printf(“%5d”,aij); bji=aij; printf(“n”); ,先从内层循环开始。 内层
18、循环一般是处理数组的高维。,52,printf(“array b:n”); for( i=0;i=2;i+) for( j=0;j=1;j+) printf(“%5d”,bij); printf(“n”); ,53,例: 有一个3X4的矩阵,要求出其中值最大的那个元素的值,并指出其所在的行号和列号。,程序要点: 1)定义一个3X4数组,并可用多种方法赋初值。 2)区分内外层循环。 3)确定下标范围。,关于数组,54,4)确定算法。 以第一个元素为标杆 把后面的元素与标杆进行比较 满足条件则替换,关于算法,关于量,5)确定变量 存放最大数 存放最大数所在行、列号 内外层循环变量,55,56,vo
19、id main() int i,j,row=0,colum=0,max; int a34= 1,2,3,4,9,8,7,6, -10,10,-5,2 ; max=a00; 把元素的值赋给max变量做为标杆 for( i=0;i max ) max=a i j ;row=i;colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum);,57,5.3.1 字符数组的定义,用来存放字符数据的数组是字符数组。 字符数组中的一个元素只能存放一个字符。,定义形式为: 类型说明符 数组名 常量表达式 ,5.3 字符数组,58,例如:char c10 ;
20、定义 c 为字符数组名,有10个元素。赋值后: c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p;c9=y;,也可用整型数组存放字符型数据, 例如:int c10=A; 但每个整型数占4个字节。,数组在内存中的存放形式如图所示。,59,5.3.2 字符数组的初始化 几个约定: 1)必须逐个字符赋给数组中的各个元素; 如: char c10=I, ,a,m, ,h,a,p,p,y;,2)若初值个数(即字符个数)大于数组长度,则语法错。,把10个字符分别赋给c0c9这10个元素。,60,3)若初值个数小于数组长度,则只把这些字符赋给数组中前面相对应数目的元素
展开阅读全文