C语言数组课件讲解.ppt
《C语言数组课件讲解.ppt》由会员分享,可在线阅读,更多相关《C语言数组课件讲解.ppt(87页珍藏版)》请在三一办公上搜索。
1、/17,例 求一个班100个学生的平均成绩,然后统计高于平均分的人数。使用简单变量和循环结构相结合的方法求平均成绩:aver=0;for(i=1;i=100;i+)scanf(“f”,,/17,若要统计高于平均分的人数,则无法实现。mark是一个简单变量,存放的是最后一个学生的成绩。,用已有知识解决方法:1.再重复输入成绩,带来两个问题:(1)输入数据的工作量成倍增加;(2)若本次输入的成绩与上次不同,则统计的结果不正确。,2.使用100个变量mark1,mark2,mark99,mark100。,/17,分析:1.此100个变量均为学生成绩,表示同一类对象。2.数据类型相同。3.可以用序号区
2、分不同的变量。,解决此问题的根本方法,引入数组,始终保持输入的数据,一次输入,多次使用。,除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满足不同应用的需要。构造数据类型是由基本数据类型按一定规则组成的,也称作“导出类型”。构造数据类型包括数组、结构体、共用体。数组(array)能将具有相同类型的数据组合在一起,通常是用于处理批量数据。An array is a data type that uses subscripted variables and makes possible the representation of a large number of
3、homogeneous values.,第4章 数组和指针,数组的维数,数组中能唯一确定数组元素的下标的个数称为数组的维数一维数组:只用一个下标就能区分数组中的不同元素的二维数组:要用两个下标才能区分数组中的不同元素,16 一维数组 34 二维数组 234 三维数组 int a6;int b34;int c234;,/17,4.1 一维数组一维数组的定义与初始化,1.一维数组定义 类型定义符 数组名整型常量表达式;【例如】int a6;,数组名表示内存首地址,是地址常量,编译时系统分配连续内存内存字节数=数组维数*sizeof(元素数据类型),数组a在内存占24字节(6*4字节),A one-
4、dimensional array declaration is a type followed by an identifier with a bracketed constant integral expression.The value of the expression,which must be positive,is the size of the array.It specifies the number of elements in the array.The array subscripts can range from 0 to size-1.The lower bound
5、 of the array subscripts is 0 and the upper bound is size-1.,/17,一维数组的定义与初始化,【例如】float score50;char name20;注意:不能用变量定义数组的长度。float scoren;当定义数组语句中不同时给变量赋值时,方括号内不得为空。int a;数组一旦定义,数组的大小就不能再改变。常用的办法是用符号常量来指定元素个数。#define size 50 float scoresize;,/17,4.1.1 一维数组的定义与初始化,2.一维数组初始化类型定义符 数组名常量=值1,值2,值n;例如:int a
6、6=1,2,3,4,5,6;int a=1,2,3,4,5,6;两者等价于:a0=1;a1=2;a2=3;a3=4;a4=5;a5=6;例如:int a6=1,2;等价于:a0=1;a1=2;a2=0;a3=0;a4=0;a5=6;int c10=0;/将0赋给c0c9int a=1,2;/等价于:a0=1;a1=2;,/17,4.1.2 一维数组元素的引用与操作,1.数组元素的引用 数组名下标注意:(1)数组元素的下标从0开始(2)引用数组元素时,只能单个引用,不能一次引用整个数组 int a6;a=3,4,5,6,7;a6=3,4,5,6,7;(3)下标不要超出数组的范围,否则导致错误的程
7、序结果。,2.数组的赋值可以在定义数组时对数组中的全部变量或部分变量赋值(即数组的初始化)。可以在语句中为变量赋值。利用循环依次为每个数组元素赋值或输入值。,4.1.2 一维数组元素的引用与操作,main()int i,a5;for(i=0;i5;i+)ai=i;/用循环结构直接对数组赋初值 for(i=0;i5;i+)printf(%d,ai);printf(n);,运行结果为:0,1,2,3,4,用交互的循环结构对数组赋初值,main()int i,a5;for(i=0;i5;i+)printf(a%d=,i),scanf(%d,例:定义长度为10的整型类型一维数组并完成以下功能:从键盘输
8、入10个整数,分别存放在10个数组元素中;输出数组中的各元素值;按逆序输出数组中的各元素值。,main()int i,a10;for(i=0;i=0;i-)printf(%4d,ai);printf(n);,应用举例,下标越界:差一错误 off-by-one error,在C语言中,有N个元素的数组其元素下标的允许取值范围为0到N-1,不存在下标为N的元素。例如这段代码本意是要设置数组a中的10个元素均为0。但通常编译器按内存递减方式分配内存,使得内存中a9之后的4个字节分配给i。本来计数器i的值为10,循环体内将并不存在的a10设为0,实际是将i值设为0,就陷入死循环!,main()int
9、i,a10;for(i=1;i=10;i+)ai=0;printf(%d,ai);,4.1.3 数组应用1.比较法排序,由键盘输入10个数,按由小到大排序输出解题方法:将10个数存入数组a将a(0)与a(1)、a(2)a(9)依次比较,哪个元素的值比a(0)小,就将它与a(0)的值交换,这样就将最小的数送到了a(0)中。再将a(1)与a(2)、a(3)a(9)依次比较,哪个元素的值比a(1)小,就将它与a(1)的值交换,这样就将最小的数送到了a(1)中。重复以上步骤。对于n个数,比较排序法的总运行次数为:(n-1)+(n-2)+3+2+1=n*(n-1)/2.,/17,1.比较法排序,1.比较
10、法排序,#include main()int i,j,a10;srand(time(0);for(i=0;iaj)ai=aj=ai=aj;for(i=0;i10;i+)printf(%4d,ai);,/17,2.冒泡法排序,是一种交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。首先将a0与a1、a1与a2、a2与a3、an-2与an-1相邻两个数进行比较,若为逆序(比如a0a1)则两者交换,这样就将将最大的数放在an-1中;再将a0、a1、an-2这n-1个数进行同样的相邻两数比较,若为逆序则两者交换,这样就将这n-1个数中最大的数被放在an-2中;重复以上步骤,经过n-1趟比
11、较交换完成冒泡法排序。,/17,用冒泡法排序将10个整数按从小到大的次序排列出来。,2.冒泡法排序,/17,#include#define N 10/数据的个数 main()int aN=5,12,29,47,9,18,13,50,38,2;int i,j,k,t;for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;printf(n最后的排序结果:n);for(i=0;iN;i+)printf(%5d,ai);,2.冒泡法排序,数组应用II-插入,向一个有序数组中插入一个数字,插入后不改变原有顺序,插入数字前,插入数字后,/17,方法1:找到插入点后再移位。从前向后循环,从第1
12、个元素开始依次将数组元素与要插入的数x比较,当x=i;j-)aj+1=aj;ai=x;/插入数据后退出整个循环 break;,数组应用II-插入,/17,方法2:边找插入点边移位。从后向前循环,直接从最后1个元素开始,将其与要插入的数x比较,如果xx,因此x要赋值给ai+1。,/从最后1个元素开始,依次将要插入的数与每个元素比较for(i=8;i=0;i-)/如果要插入的数比元素值小,则该元素直接向后移位 if(xai)ai+1=ai;else break;/表示找到插入点,退出循环ai+1=x;/插入数据,数组应用II-插入,数组应用III:不改变顺序,删除指定的数字,main()int i
13、,j,del=0,int a10=1,2,3,4,5,6,7,8,9,10,x=5;for(i=0;i10;i+)printf(%4d,ai);putch(n);for(i=0;i10-del;i+)/删除后数组的容量减小一if(x=ai)for(j=i;j10;j+)aj=aj+1;i-;/还原到删除位置,以处理连续删除 del+;for(i=0;i10-del;i+)printf(%4d,ai);,删除前:1 2 3 4 5 5 7 8 9 10删除后:1 2 3 4 7 8 9 10,二分法检索(在序列x中检索y的位置)前提:有序数列(以递增序为例)原理:等分区间;若y小于中间数,则取左
14、半边,否则取右半边。再等分,再比较 例:对于区间a,b 等分为若 y=xk 则位置为k若yxk 则取新区间 k+1,b(即a=k+1),数组应用IV二分查找(检索),二分法查找递增序列,main()int x10=34,56,78,87,88,90,101,112,520,888;int y,i,k,a=0,b=9;for(i=0;ib)printf(ERROR);else printf(nx%d=%dn,k,xk);getch();,/17,4.2 二维数组 二维数组的定义和初始化,1.定义需要两个下标才能标识数组中某个元素的位置,也称为矩阵。Use a two-dimensional ar
15、ray if two other identifiers are needed to determine the value of interest.定义格式为:类型定义符 数组名常量表达式1 常量表达式2,列数,行数,int a23;,逻辑结构,存储结构,/17,二维数组的定义和初始化,2.二维数组的初始化和引用两种初始化方式:按行初始化:每一对花括号对应一行的元素。按存放顺序初始化:按内存中的存放顺序将初始值分别赋值给对应的元素。,int a23=1,2,3,4,5,6;int a23=1,2,3,4,5,6;int a3=1,2,3,4,5,6;,/17,二维数组的定义和初始化,int
16、d34=1,2,3,4,5,6;int d4=1,2,3,4,5,6;int d34=1,0,0,0,2,3,0,0,4,5,6;int d4=1,0,0,0,2,3,0,0,4,5,6;,int e34=0,0,0,1,0,0,2,3,0,4,5,6;int e4=0,0,0,1,0,0,2,3,0,4,5,6;int e34=0,0,0,1,0,0,2,3,0,4,5,6;,/17,二维数组的定义和初始化,3.二维数组在内存中的存放M行N列的二维数组a,aij 的位置公式为:i*N+j+1数组元素aij存储映射关系为:aija0N*i+j,Real computer memory has
17、only one dimension,i.e.each location is identified with only one component of address.因此,二维数组元素可用它相对数组首元素00位置的偏移量来表示(称为存储映射关系storage mapping)。对二维数组元素的操作除了用二重循环外,还可以用一重循环实现。In C,or any other language supporting arrays with dimension sizes greater than one,two-dimensional arrays simulate the effect of
18、 using two components of address.To do this,the array is mapped into consecutive memory with row 0s values first,then row ones values,etc.You can think of this as a set of one dimensional arrays holding the column values as a single value in the rows values.,/17,二维数组元素的引用,对二维数组int a34中各元素的输出操作for(i=
19、0;i3;i+)for(j=0;j4;j+)printf(%4d,aij);for(i=0;i3;i+)for(j=0;j4;j+)/用相对a00位置的偏移量来表示 printf(%4d,a04*i+j);for(i=0;i12;i+)/用相对a00位置的偏移量 printf(%4d,a0i);,求矩阵 特征值之和,#define N 3main()int i,j,s=0,aNN=1,1,1,2,1,1,2,2,1;/显示矩阵 a33printf(对于矩阵 a%d%dn,N,N);for(i=0;iN;i+)for(j=0;jN;j+)printf(%4d,aij);putch(n);/主对角
20、线元素之和for(i=0;iN;i+)s+=aii;printf(n主对角线元素之和 s=%dnn,s);,二维数组的应用举例矩阵,/副对角线元素之和s=0;for(i=0;iN;i+)s+=aiN-1-i;printf(副对角线元素之和 s=%dnn,s);/上元素之和s=0;for(i=0;iN;i+)for(j=i;jN;j+)s+=aij;printf(“上元素之和 s=%dnn,s);,二维数组的应用举例矩阵(续1),/下元素之和s=0;for(i=0;iN;i+)for(j=0;j=i;j+)s+=aij;printf(下元素之和 s=%dnn,s);/周边元素之和s=0;for(
21、i=0;iN;i+)for(j=0;jN;j+)if(i=0|i=N-1|j=0|j=N-1)s+=aij;printf(周边元素之和 s=%dnn,s);getch();,二维数组的应用举例矩阵(续2),Tips:对于int型一维数组a和二维数组b用 sizeof(a)/sizeof(int)得到数组a的大小;用 sizeof(b)/sizeof(b0)二维数组b的行数 sizeof(b0)/sizeof(int)二维数组b的列数,【例】显示二维数组b的各元素#include main()int b4=0,1,0,0,1,0,0,0,2,6,4,i,j;for(i=0;isizeof(b)/
22、sizeof(b0);i+)for(j=0;jsizeof(b0)/sizeof(int);j+)printf(%5d,bij);printf(n);,二维数组的应用举例sizeof的使用,main()int x43=1,2,3,2,3,4,3,4,5,0,0,1;int i,j,k,row=0,column=0,min,m=4,n=3;for(i=0;imax)max=xij,row=i,column=j;for(k=0;k-1,应用举例:求二维数组的鞍点saddle point,即该位置上的元素是该行上的最大值,是该列上的最小值。鞍点可能不存在,main()int a53=1,2,3,2,
23、3,4,3,4,5,4,5,6,5,6,7;int i,j,max5,min3;/先把每行第1个数当最大值每列第1个数当最小值 for(i=0;imaxi)maxi=aij;if(aijminj)minj=aij;/如最大值最小值是同1个数,找到鞍点for(i=0;i5;i+)for(j=0;j3;j+)if(maxi=minj)printf(a%d%d=%d是鞍点n,i,j,aij);,寻找鞍点方法二:直接找出所有行的最大值所有列的最小值。一比对,若该行的最大值与该列的最小值相等,该位置的数就是鞍点。,4.2.3 多维数组,当需要用多个下标来确定数组元素时,数组称为多维数组。There is
24、 no limit in the language as to the number of dimensions that an array may be given.Each dimension requires a size specifier within a pair of brackets.1.多维数组的定义类型 数组名常量表达式1常量表达式2常量表达式n;【例如】定义一个整型三维数组:int b234;,以下标 0、1为变量 i,下标0、1、2为变量j,下标0、1、2、3为变量k,就可以用三重循环结构对数组的每一个元素进行处理了。,多维数组初始化,对于三维数组,可将其看作多个二维表
25、格,即可以把它看成是由多个二维数组构成的。依此类推,一个n维数组可以看成是由多个n-1维数组构成的。前面数组b有24个元素,它们在内存中排列顺序跟二维数组类似:先变化第三个下标,然后变化第二个下标,最后变化第一个下标。【例如】以三维数组初始化为例:int b234=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24;由第一维为2,可认为b数组由两个二维数组组成,每个二维数组为3行4列。初始化时,对每个二维数组以按行初始化的方法,分别用花括号把各行元素值括起来,并且将三行的初值再用花括号括起来。,多维数组的一维表示,多维数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 数组 课件 讲解
链接地址:https://www.31ppt.com/p-5574584.html