第8章数组v3.ppt

上传人:本田雅阁 文档编号:2578723 上传时间:2019-04-11 格式:PPT 页数:41 大小:354.51KB
返回 下载 相关 举报
第8章数组v3.ppt_第1页
第1页 / 共41页
第8章数组v3.ppt_第2页
第2页 / 共41页
第8章数组v3.ppt_第3页
第3页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第8章数组v3.ppt》由会员分享,可在线阅读,更多相关《第8章数组v3.ppt(41页珍藏版)》请在三一文库上搜索。

1、1,1,第8章 数 组,2,学习目标,一维数组和二维数组的定义与使用 常用算法:查找、排序等,3,8.1 概述,数组的用途 保存大量同类型的相关数据 例如:矩阵运算,表格数据等 数组的特点 快速地随机访问 一旦定义,不能改变大小 数组可分为一维、二维、多维数组,4,8.2.1 一维数组的定义和引用,一维数组的定义 定义方式为: 类型说明符 数组名常量表达式; 例如:int a10;,说明: 构造数据类型 常量表达式用中括号括起来 下标从0开始,int a10 如: a0,a1,.a9 常量表达式必须是常量,不能是变量。,5,8.2.1 一维数组的定义和引用,数组是由若干相同类型 的相关数据 按

2、 一定顺序存储 在一起的 数据集合。 数组定义:数据类型 数组名常量表达式; 例如: int score50; /*数组*/,数组的 数据类型,数组名:数组地址,数组名 score=2000 地址的表示方法! 数组地址= 数组首地址=数组第一个元素的地址,数组元素个数,6,一维数组元素的引用 通过下标运算符 ,每次可引用一个数组元素,但不能引用整个数组。 一个数组元素就如同一个简单变量。 a0=a5+a7-a2*3 常量或表达式做下标 ai=ai+1; 变量做下标 aa0=a1 数组元素做下标 书上例8-1,说明了对一维数组的定义和引用的基本方法。,8.2.1 一维数组的定义和引用,7,8.2

3、.1 一维数组的定义和引用,一维数组的定义、赋值和引用。 【例8-1】 #include void main() int i, a10; /定义时下标中不能是变量 for(i=0;i=0;i-) printf(“%d ”, ai); /依次倒序输出各个元素 printf(“n”); 程序运行结果: 9 8 7 6 5 4 3 2 1 0,8,注意: 1)对数组定义时所声明的类型实际上是指数组元素的取值类型;对于同一个数组,其所有元素的数据类型必须是相同的。 2)数组名的命名应符合标识符的定义规则。 3)数组名不能与其它变量名相同。 4)数组定义时,方括号中的常量表达式说明了数组元素的个数,如a

4、5表示数组a有5个元素。但是其下标是从0开始编号的 。,8.2.1 一维数组的定义和引用,9,注意: 5)在定义时,不能在方括号中用变量来表示元素的个数,例: int ai不合法! 但可以是符号常量或常量表达式; 但是引用数组元素时, 下标可以是变量, 例:a5、ai、ai+j均合法。 6)允许在同一个类型说明语句中,同时说明多个数组和多个变量。例如: int a,b,c,d,k110,k220; 7)可以越界访问数组的元素,但这样做会导致不可预料的结果,甚至于造成系统的崩溃(执行写操作)。,8.2.1 一维数组的定义和引用,10,在实际的应用软件中,数组大小一般都用宏来定义,以适应未来可能的

5、变化。 #define SIZE 10 int aSIZE;,8.2.1 一维数组的定义和引用,11,8.2.2 一维数组的初始化,数组的初始化是指在定义数组时给数组”初值”。 1. 在定义数组时赋初值; 例: int a10=0,1,2,3,4,5,6,7,8,9; 2. 部分赋值,未明确写出的均初始化为0; 例: int a10=0,1,2,3,4; 3. 赋值时不指定数组长度。 例: int a=0,1,2,3,4; /*数组只有5个元素*/,12,8.3.1 二维数组的定义与引用,定义:类型说明符 常量表达式1常量表达式2 例如:float a34 a0 行 a00 a03 a1 行

6、a10 a13 a2 行 a20 a23,第一维下标长度(行),第二维下标长度(列),13,8.3.1 二维数组的定义与引用,二维数组的定义 数组由若干相同类型 的相关数据按 一定顺序存储 在一起的 数据集合 。 例如: int score1005;,数组的 数据类型,数组名:数组首址,行,访问数组元素:score00、score01、 score04 、score994 访问数组:score 系统在内存中分配连续100*5 个int数据类型的空间给数组。存放顺序:按行存放,先顺序存放第一行的元素,再存放第二行的元素,列,14,8.3.1 二维数组的定义与引用,引用 程序中引用的是数组中一个元

7、素,必须用下标来指定。如:数组名下标下标 float a44 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a31 a32 a33,15,8.3.1 二维数组的定义与引用,三维数组的定义与二维数组相同。 如:float a234 234共有24个元素。 float a100100100有1000000个元素,a010,a000,a999999,a100,16,8.3.1 二维数组的定义与引用,在程序中为数组赋值的方法 1. 用scanf语句由用户依次输入: for (i=1;i=3;i+) for (j=1;j=4;j+) scanf(

8、“%d”, 2. 由循环变量来循环赋值: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,for (i=0;i4;i+) (for j=0;j4;j+) aij = 4*i+j+1;,17,8.3.1 二维数组的定义与引用,二维数组程序举例: 将一个二维数组行和列元素互换,存到另一个数组中 1 4 a= 1 2 3 b= 2 5 4 5 6 3 6 分析:对数组a,列先于行变化,对于数组b,行先于列变化. for (i=0;i2;i+) for (j=0;j3;j+) bji=aij /先行后列的搬移.,for (i=0;i3;i+) for (j=0;j2;j+

9、) bij=aji /先列后行的搬移.,18,数组定义后,其元素值是随机数。 在定义数组的同时,为其元素赋值,称为赋初值。 int a5 = 12, 34, 56 ,78 ,9 ; int a22=1,2,3,4; int a22=0,2,1,3; int a5 = 0 ; int Arr23=0,1,2; int a = 11, 22, 33, 44, 55 ; int matrix4=1,2,3,4,1,对多维数组,可以且只可以省略最高维长度说明 切记切记!,/*数组赋初值,整体赋值 */,/*数组赋初值,所有未显式 指定值元素的赋值为”0” */,/*由计算机自动计算 数组大小 */,8

10、.3.2 二维数组的初始化,19,int matrix = 1,2,3,4,5,6,7,8,9,10,11,12; int matrix4=1,2,3,4,1; int matrix4 = 1,2,3,4,5,6,7,8,9; int matrix4 = 1,2,3,4,5,6,7,8,9,10;,编译通不过,34,34,34,8.3.2 二维数组的初始化,20,课堂练习,1.以下对一维数组a的正确说明是: A) char a(10) ; B) int a10 ; C) int k=5,ak; D) char a =a,b,c; 2.以下对二维数组a的正确说明是: A) char a105 ;

11、 B) int a23 ; C) int k=5,akk-2; D) char a43=“abc”,“bcd”,“cde”; E) int a34 = 1,5,9;,?,21,将数组中的元素颠倒顺序排放: 1 2 3 4 5 6 7 8 9 10 分析: 1) a0 与a9交换, a1 交换 a8,依此类推。 错误的写法 a0=9;a9=a0; 2) 如何控制循环, 只需循环到一半 k=n/2; for (i=1,j=n;i=k;i+,j-) t=ai-1;ai-1=aj-1;aj-1=t 还可以写成 for (i=1,j=n;ij;i+,j-),8.4 应用举例,22,输入100个050的整

12、数,统计每个数出现的次数【exp8_2】 分析: 1) 需要51个变量用于统计 int count51。 2) 每读一个字符,在相应的变量上加1,0,n0,n1,n50,.,.,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,8.4 应用举例,23,3) 如果用if 语句,需要判断多少次? if (n=0)

13、 count0+; if (n=1) count1+; 4)用switch(n) case 0:count0+;break; case 1:count1+;. 5)采用数组:读入的数字就是累加变量的下标索引 countk+; 6)需要循环多少次? 100次?,8.4 应用举例,24,程序: #include “stdio.h“ main() int count51; int i,n; for (i=0; i=50; i+) /循环赋值 counti=0; for (i=1; i=100; i+) /循环输入数据 scanf(“%d“, ,8.4 应用举例,25,求Fibnacci数列1,1,2

14、,3,5,8,13,21,.【exp8_3】 初值 f0=1, f1=1 循环体:fi=fi-2+fi-1 循环控制 (for i=2,i=20;i+) 完整程序:,main() int i,f21=1,1; /赋值 for (i=2;i=20;i+) /循环求值 fi=fi-2+fi-1; for (i=0;i=20;i+) /*控制每行输出 if (i%5=0) printf(“n”); 个数*/ printf(“%7d“,fi); ,8.4 应用举例,26,选择排序算法 【exp8_4】: int a10,第1次, 将最小数0和第一位的3交换,第2次,将次小数1和第2位的6交换,发现的规

15、律:,for(i=0;iN-1;i+) 将当前i元素的位置记入min; for(j=i+1;jN;j+) 如果j元素的值更小,记录到min 如果min和i不同,则交换两元素 ,8.4 应用举例,3 6 2 5 8 1 0 4 7 9 0 6 2 5 8 1 3 4 7 9 0 1 2 5 8 6 3 4 7 9 0 1 2 5 8 6 3 4 7 9 0 1 2 3 8 6 5 4 7 9 0 1 2 3 4 6 5 8 7 9 0 1 2 3 4 5 6 8 7 9 0 1 2 3 4 5 6 8 7 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9,27,

16、#include #define N 10 void main() int i,t,j,min,dataN=3,6,2,5,8,1,0,4,7,9; / 定义i,j for(i=0;iN-1;i+) / 有N个数,则需要查找从0N-2位置的数,最 /后一 个N-1为仅仅剩下的一个,就不需要查找比较 min=i; /认为当前i为最小的数的位置 for(j=i+1;jN;j+) /从第i个直至数组最后一个数 if(datajdatamin) min=j; /记录比当前min小的数的位置 ,8.4 应用举例,28,if(min!=i) /将找到的最小数datamin放到它对应的位置 去,如果假设为真

17、,即min就是i,则不用交换 t=datai; datai= data min; datamin=t; /交换数据 /对于当前位置i的数排序完 毕,还剩下i+1N-1下标的数 for(i=0;iN;i+) printf(“%d “,datai); /输出 ,8.4 应用举例,29,在数组中查找数据【exp8_5】 情况1:在无序数组中查找给定值首次出现的位置 如:10 1 20 39 9 4 12 43 33 4 19(找4的位置) 从第0个元素到最后一个元素依次与被找元素比较,相等则停止查找。 循环结束条件: (已经找到)|所有的数组都已经找遍,8.4 应用举例,30,main() int

18、a10,i,num; for (i=0;i10;i+) scanf(“%d”, ,8.4 应用举例,31,8.4 应用举例,考虑另外一种情况:在有序数组中插入一个数。首先需要确定该元素的位置。,从第0个元素开始比较,当6小于或等于某个数时停止,该数的位置即为所求。 i = 0; while (i =num) break; else i+; 如果没找到,i的值为10,32,8.4 应用举例,数组右移一位 从最后一个元素右移 for (i=6;i=1;i-) ai+1=ai; 不能写成a1=a0;a2=a1;,33,如果需要将给定的某个数插入到有序的数组中,可以使用如下的五个步骤: 建立数组 排序

19、 找出被插入值所在的位置 从该位置起到最后的所有元素右移一位 将待插入数值放入上一步空出的位置 参考【exp8_6】,8.4 应用举例,34,8.4 应用举例,#include “stdio.h“ main() int a21; int i,p,j,t,k,num,found; char c; printf(“输入20个整数n“); for (i=0;iaj+1) t=aj;aj=aj+1;aj+1=t; /*交换数据*/ for (i=0;i20;i+) printf(“%3d”,ai); /*输出排序结果*/ printf(“输入要被插入的数n”); scanf(“%d“,35,8.4 应

20、用举例,p=0; while (p=num) break; else p+; /*继续查找*/ for (k=19;k=p;k-) /*右移一位*/ ak+1=ak; ap=num; /*插入*/ for (i=0;i21;i+) printf(“%3d”,ai); /*输出结果*/ ,36,8.4 应用举例,小经验 当处理的数据很多,又希望用循环来控制时,就使用数组 当运算的中间结果需要保存时,使用数组 一维数组典型用法 排序 查找 插入 删除 分类统计,37,8.4 应用举例,例:求出3*4矩阵中的最大值及其所在的行列号。 1.设一个变量存放最大值max; 2 设两个变量存放最大值在数组中

21、的行列. 3.遍历数组中的每一个 元素,max=a00 for i=0 to 2,for j=0 to 3,aijmax,y,n,max=aij,row=i;.,输出max, row,colum,38,8.4 应用举例,程序【exp8_7】: #include “stdio.h” void main() int i,j,row,column,max,a34; max=a00; for (i=0;imax) max=aij; row=i+1;column=j+1; printf(“最大元素是%d,位于第%d行,第%d列n”, max,row,column); ,39,本章总结,一维数组和二维数组的定义、引用及初始化 常用的算法:在数组中查找、插入元素、排序等,40,课后作业,1、 编程实现从键盘输入20个整数,统计其中正数的个数,并计算输出所有正数之和。 2、8.9, 8.10,41,课堂作业讲解:,2、上三角形 1*1 1*2 1*3 1*4 1*5 1*9 2*2 2*3 2*4 2*5 2*9 3*3 3*4 3*5 3*9 : : 9*9,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1