上次作业 、P14144.17 #define low(x)(x)+32 2、P1414.18 #define swap(x, y) int t; t=x; x=y;y=t; 3 本次课内容:一维数组 教学目的:掌握一维数组的定义、初始化,数组的引用、数组作 为函数参数及数据排序、査找等处理方法。 重点:一维数组的定义、初始化及数组的引用。 难点:利用数组的数据处理(排序、査找等问题处理),地址传 递
上次作业: 1、P1414_4.17 #define low(x) (x)+32 2、P141_4.18 #define swap(x,y) {int t ;t=x;x=y;y=t;} 本次课内容:一维数组 教学目的:掌握一维数组的定义、初始化,数组的引用、数组作 为函数参数及数据排序、查找等处理方法。 重点:一维数组的定义、初始化及数组的引用。 难点:利用数组的数据处理(排序、查找等问题处理),地址传 递
维数组的定义 般形式:类型标识符数组名[元素个数; 如:inta5; 说明:(1)元素序号从0起始。 (2)元素个数也称数组长度。 (3)定义了n个连续的存储单元(每个单元字节数由数据类型 决定)。 (4)数组名是第一个单元的地址。 元素地址 内存空间元素占字节 0}1010 2字节 101 a{1}1012 1013 2字节 813 2字节 a{3}1016 1017 2字节 {4}1018 字节 1019
一、一维数组的定义 一般形式: 类型标识符 数组名 [ 元素个数 ]; 如:int a[5]; 说明: (1)元素序号从0起始。 (2)元素个数也称数组长度。 (3)定义了n个连续的存储单元(每个单元字节数由数据类型 决定)。 (4)数组名是第一个单元的地址。 2字节 2字节 2字节 2字节 2字节 a{0} a{1} a{2} a{3} a{4} 内存空间 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 元素 地址 元素占字节 a
在数组定义时指定元素的初始值,称初始化。 s: static int a[5]=(1, 2, 3, 4, 5); static char ch2|={a,”b”} 说明:(1)元素定义的初值个数不足时,用零补齐。 tn static int a[ 5]=1, 2, 3; 等价于: static a5 1,2,3,0,0}; ints8]={0}; s|0~S7中的值均为零。 (2)元素定义时赋初值,可以不指定数组个数; tn static int a[ 1= 1, 2, 3, 4, 5 ] 此时将以初值个数决定数组长度 像为(静态和外部存储类型的数组不进行初始化,隐含的初 j零或空字符,自动类型数组未初始化,其值不确定。 static char chl5;/ch1|0J~ch14中的值为空,即 6,k static int m5l;/m0~m4中的值为零 float p5;/“p|0~p4中的值不确定*
二、一维数组的初始化 在数组定义时指定元素的初始值,称初始化。 如: static int a[5]={1,2,3,4,5}; static char ch[2]={‘a’,’b’}; 说明: (1) 元素定义的初值个数不足时,用零补齐。 如 static int a[ 5]={1,2,3}; 等价于: static a[5]={1,2,3,0,0}; int s[8]={0}; s[0] ~ s[7]中的值均为零。 (2)元素定义时赋初值,可以不指定数组个数; 如 static int a[ ]={1,2,3,4,5]; 此时将以初值个数决定数组长度。 (3)静态和外部存储类型的数组不进行初始化,隐含的初 值为零或空字符,自动类型数组未初始化,其值不确定。 static char ch1[5]; /*ch1[0]~ch1[4]中的值为空,即 ‘’*/ static int m[5]; /*m[0]~m[4]中的值为零*/ float p[5]; /*p[0]~ p[4]中的值不确定*/
、数组元素的引用 数组定义后即可以引用。 如:a[1l3;a2|=a[1]+1 注:C编译不检查下标“出界”,若引用出界下标,将引用数组 以外的(下面存储单元内容)数据引用,造成错误。 数组元素引用,一般采用循环结构。 如:for(i=1;i<5;i++)a[i]=i; 四、数组作为函数参数 数组数据传送到函数的两种方法: 1、数组元素作为参数(值传递) 如: are=fun (a[0k a[1l, a 2 float fun(float a, float b, float c)
三、数组元素的引用 数组定义后即可以引用。 如: a[1]=3 ; a[2]=a[1]+1; 注:C编译不检查下标“出界”,若引用出界下标,将引用数组 以外的(下面存储单元内容)数据引用,造成错误。 数组元素引用,一般采用循环结构。 如:for ( i=1 ; i<5 ; i++ ) a [ i ] = i ; 四、数组作为函数参数 数组数据传送到函数的两种方法: 1、数组元素作为参数(值传递) 如: : are=fun(a[0],a[1],a[2]); : float fun(float a,float b,float c) { : }
2、数组名作为函数参数(地址传递) int fun(int x3D inta|3={12,34,54,}; int ave, ave=fun(a) 1210 12 1212 int fun(int xsD) 34 X 214 0I2 int sum; aol X sum=x[0+x1+x2] return(sum); 特点:实参和形参共占同一段内存单元,形参变化,实参 也随之变化。 例:P145交换
2、数组名作为函数参数(地址传递) : int fun(int x[3]); int a[3]={12,34,54,}; int ave; ave=fun(a); : } int fun(int x[3]) { int sum; sum=x[0]+x[1]+x[2]; return (sum); } 特点:实参和形参共占同一段内存单元,形参变化,实参 也随之变化。 例:P145_交换 12 34 54 a[0] a[1] a[0] x[0] x[1] x[2] 1212 1214 1210
五、应用举例 l、P146例51数据处理问题 分析:(1)数组定义(主函数中) (2)建立数组(定义一个函数,向数组元素中输入数据 (3)数组处理(定义一个函数,求元素中的平均值) (4)数组输出(定义一个函数,输出低于平均分的值) (5)主函数调用上述各函数。 2、P147例52排序问题 方法:比较交换法、选择法、起泡法、插入法等。 起泡法基本思想: 将相邻两数a0与a1比较,将两数排好序,再将a1与a[2 比较,依此处理,直到将最后两个数比较并处理完毕。此时将最 大数换到最后。 a[o al a2 a3 a 4 105 7 10 7 5 103 6666 5 10 5 3
五、应用举例 1、P146_例5.1 数据处理问题 分析:(1)数组定义(主函数中) (2)建立数组(定义一个函数,向数组元素中输入数据) (3)数组处理(定义一个函数,求元素中的平均值) (4)数组输出(定义一个函数,输出低于平均分的值) (5)主函数调用上述各函数。 2、P147_例5.2 排序问题 方法:比较交换法、选择法、起泡法、插入法等。 起泡法基本思想: 将相邻两数a[0]与a[1]比较,将两数排好序,再将a[1]与a[2] 比较,依此处理,直到将最后两个数比较并处理完毕。此时将最 大数换到最后。 a[0] a[1] a[2] a[3] a[4] 10 5 7 3 6 5 10 7 3 6 5 7 10 3 6 5 7 3 10 6 5 7 3 6 10
数据处理函数 void bubble (int al ,int n) int i,j,t trmp; for(i=1;iaj+1(前项 temp=a; 大于后项),将aj和 a[jl=aj+1; a+1交换 a[j+1=temp; return
数据处理函数: void bubble(int a[ ],int n ) { int i,j,t trmp; for ( i=1 ; ia[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } return; } 如果a[j]>a[j+1](前项 大于后项),将a[j]和 a[j+1]交换 /*外循环:共循环n-1次,为内循环 提供循环终值(t=n-i)*/ /*内循:负责找出最大数送至最后*/
3、P151例53 查找问题 查找有多种算法,如顺序查找、索引查找和折半査找等。 折半査找效率髙,速度快。但前提是数据已按一定顺序排列好。 基本思路是:先检索当中的一个数据,看它是否为所需用的数 据,如果不是,则判断要找的数据是在当中数的哪一边,下次就在 这个范围内查找 设:top=0,b0t=9,a[9,x(要查找的值) mid=(top+ bot)/2 a0 a[l a[2 a3 a[4 a5 a6 a7 a[8 8 1321283541526371 (1) top ml bot (2) top bot ifa|mid|>x成立,则查找的数据在md的左侧。因此,bot=mid 重新计算md:mid=(op+bot/2 查找成功:amid|=x 查找失败:top>bot
3、P151_例5.3 查找问题 查找有多种算法,如顺序查找、索引查找和折半查找等。 折半查找效率高,速度快。但前提是数据已按一定顺序排列好。 基本思路是:先检索当中的一个数据,看它是否为所需用的数 据,如果不是,则判断要找的数据是在当中数的哪一边,下次就在 这个范围内查找。 设:top=0,bot=9 ,a[9] ,x (要查找的值) mid =(top+bot)/2 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7 a[8] 8 13 21 28 35 41 52 63 71 (1) top mid bot (2) top mid bot if a[mid]>x 成立,则查找的数据在mid的左侧。因此,bot=mid 重新计算mid : mid =(top+bot)/2 查找成功:a[mid]=x 查找失败:top>bot
小结: 1、数组定义 2、数组初始化 3、数组引用 4、数组名或元素作为函数实参 5、数组应用:数据处理、数据排序、数据查找。 作业:P1755.3
小结: 1、数组定义 2、数组初始化 3、数组引用 4、数组名或元素作为函数实参 5、数组应用:数据处理、数据排序、数据查找。 作业:P175_5. 3