C语言数组讲解.pptx
《C语言数组讲解.pptx》由会员分享,可在线阅读,更多相关《C语言数组讲解.pptx(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、/17 v 若要统计高于平均分的人数,则无法实现。若要统计高于平均分的人数,则无法实现。markmark是一个简单变量,存放的是最后一个学生是一个简单变量,存放的是最后一个学生的成绩。的成绩。用已有知识解决方法:用已有知识解决方法:1.1.再重复输入成绩,带来两个问题:再重复输入成绩,带来两个问题:(1 1)输入数据的工作量成倍增加;)输入数据的工作量成倍增加;(2 2)若本次输入的成绩与上次不同,则统计的)若本次输入的成绩与上次不同,则统计的结果不正确。结果不正确。2.2.使用使用100100个变量个变量mark1mark1,mark2,mark99,mark2,mark99,mark100
2、mark100。第1页/共87页/17分析:分析:1.1.1.1.此此100100100100个变量均为学生成绩,表示同一类对象。个变量均为学生成绩,表示同一类对象。2.2.2.2.数据类型相同。数据类型相同。3.3.3.3.可以用序号区分不同的变量。可以用序号区分不同的变量。vv 解解解决决决此此此问问问题题题的的的根根根本本本方方方法法法,引引引入入入数数数组组组,始始始终终终保保保持输入的数据,一次输入,多次使用。持输入的数据,一次输入,多次使用。持输入的数据,一次输入,多次使用。第2页/共87页n除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满足不同应
3、用的需要。n构造数据类型是由基本数据类型按一定规则组成的,也称作“导出类型”。n构造数据类型包括数组、结构体、共用体。n数组(array)能将具有相同类型的数据组合在一起,通常是用于处理批量数据。nAn array is a data type that uses subscripted variables and makes possible the representation of a large number of homogeneous values.第第4章章 数组和指针数组和指针第3页/共87页数组的维数数组中能唯一确定数组元素的下标的个数称为数组的维数一维数组:只用一个下标就能
4、区分数组中的不同元素的二维数组:要用两个下标才能区分数组中的不同元素16一维数组34二维数组234三维数组inta6;intb34;intc234;第4页/共87页/174.1 4.1 一维数组一维数组的定义与初始化 1 1.一维数组定义 类型定义符 数组名整型常量表达式;【例如】inta6;a00145a1a2a3a4a523a数组名表示内存首地址,是地址常量编译时系统分配连续内存内存字节数内存字节数=数组维数数组维数*sizeof(元素数据类型元素数据类型)数组a在内存占24字节(6*4字节)第5页/共87页A one-dimensional array declaration is a
5、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 of the array subscripts is 0 and t
6、he upper bound is size-1.第6页/共87页/17一维数组的定义与初始化【例如】float score50;char name20;注意:不能用变量定义数组的长度。float scoren;当定义数组语句中不同时给变量赋值时,方括号内不得为空。int a;数组一旦定义,数组的大小就不能再改变。常用的办法是用符号常量来指定元素个数。#define size 50 float scoresize;第7页/共87页/174.1.1 4.1.1 一维数组的定义与初始化2.一维数组初始化类型定义符 数组名常量=值1,值2,值n;例如:inta6=1,2,3,4,5,6;inta=1
7、,2,3,4,5,6;两者等价于:a0=1;a1=2;a2=3;a3=4;a4=5;a5=6;例如:inta6=1,2;等价于:a0=1;a1=2;a2=0;a3=0;a4=0;a5=6;intc10=0;/将0赋给c0c9inta=1,2;/等价于:a0=1;a1=2;第8页/共87页/174.1.2 4.1.2 一维数组元素的引用与操作1.数组元素的引用 数组名下标注意:(1)数组元素的下标从0开始(2)引用数组元素时,只能单个引用,不能一次引用整个数组inta6;a=3,4,5,6,7;a6=3,4,5,6,7;(3)下标不要超出数组的范围,否则导致错误的程序结果。第9页/共87页2.2
8、.数组的赋值可以在定义数组时对数组中的全部变量或部分变量赋值(即数组的初始化)。可以在语句中为变量赋值。利用循环依次为每个数组元素赋值或输入值。4.1.2 4.1.2 一维数组元素的引用一维数组元素的引用与操作与操作main()inti,a5;for(i=0;i5;i+)ai=i;/用循环结构直接对数组赋初值用循环结构直接对数组赋初值for(i=0;i5;i+)printf(%d,ai);printf(n);运行结果为:0,1,2,3,4,第10页/共87页用交互的循环结构对数组赋初值main()inti,a5;for(i=0;i5;i+)printf(a%d=,i),scanf(%d,&ai
9、);for(i=0;i5;i+)printf(%d,ai);printf(n);第11页/共87页例:定义长度为1010的整型类型一维数组并完成以下功能:从键盘输入1010个整数,分别存放在1010个数组元素中;输出数组中的各元素值;按逆序输出数组中的各元素值。main()inti,a10;for(i=0;i10;i+)printf(第第%d个数据个数据:,i+1),scanf(%d,&ai);for(i=0;i=0;i-)printf(%4d,ai);printf(n);应用举例第12页/共87页下标越界:差一错误 off-by-one erroroff-by-one errorl在C语言中
10、,有N个元素的数组其元素下标的允许取值范围为0到N-1,不存在下标为N的元素。例如这段代码本意是要设置数组a中的10个元素均为0。但通常编译器按内存递减方式分配内存,使得内存中a9a9之后的4个字节分配给i i。本来计数器i i的值为10,循环体内将并不存在的a10a10设为0,实际是将i i值设为0,就陷入死循环!main()inti,a10;for(i=1;i=10;i+)ai=0;printf(%d,ai);第13页/共87页4.1.3 4.1.3 数组应用1.1.比较法排序由键盘输入10个数,按由小到大排序输出解题方法:将1010个数存入数组a a将a(0)a(0)与a(1)a(1)、
11、a(2)a(9)a(2)a(9)依次比较,哪个元素的值比a(0)a(0)小,就将它与a(0)a(0)的值交换,这样就将最小的数送到了a(0)a(0)中。再将a(1)a(1)与a(2)a(2)、a(3)a(9)a(3)a(9)依次比较,哪个元素的值比a(1)a(1)小,就将它与a(1)a(1)的值交换,这样就将最小的数送到了a(1)a(1)中。重复以上步骤。对于n n个数,比较排序法的总运行次数为:(n-1)+(n-2)+3+2+1=n*(n-1)/2.(n-1)+(n-2)+3+2+1=n*(n-1)/2.第14页/共87页/171.1.比较法排序比较法排序第15页/共87页1.1.比较法排序
12、#includemain()inti,j,a10;srand(time(0);for(i=0;i10;i+)ai=rand()%101;printf(%4d,ai);putch(n);forfor(i=0;i9;i+)(i=0;i9;i+)forfor(j=i+1;j10;j+)(j=i+1;jaj)ai=aj=ai=aj;for(i=0;ia1)则两者交换,这样就将将最大的数放在an-1中;再将a0、a1、an-2这n-1个数进行同样的相邻两数比较,若为逆序则两者交换,这样就将这n-1个数中最大的数被放在an-2中;重复以上步骤,经过n-1趟比较交换完成冒泡法排序。第17页/共87页/17用
13、冒泡法排序将10个整数按从小到大的次序排列出来。2.2.冒泡法排序冒泡法排序第18页/共87页/17#include#defineN10/数据的个数数据的个数main()intaN=5,12,29,47,9,18,13,50,38,2;inti,j,k,t;for(i=0;iN-1;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;printf(n最后的排序结果最后的排序结果:n);for(i=0;iN;i+)printf(%5d,ai);2.2.冒泡法排序冒泡法排序第19页/共87页数组应用II-II-插入向一个有序数组中插入一个数字,插入后不改变原有顺序向一个有序数
14、组中插入一个数字,插入后不改变原有顺序a01a12a23a34a46a57a68a79a810a90a01a12a23a34a45a56a67a78a89a910插入数字前插入数字后第20页/共87页/17方法1:找到插入点后再移位。从前向后循环,从第1个元素开始依次将数组元素与要插入的数x比较,当xai时,将aia8依次向后移动,这时ai就可以存放x了。for(i=0;i9;i+)/将要插入的数与每个元素比较,找插入的位置将要插入的数与每个元素比较,找插入的位置if(x=i;j-)aj+1=aj;ai=x;/插入数据后退出整个循环插入数据后退出整个循环break;数组应用II-插入第21页/
15、共87页/17方法2:边找插入点边移位。从后向前循环,直接从最后1个元素开始,将其与要插入的数x比较,如果xx,因此x要赋值给ai+1。/从最后从最后1个元素开始,依次将要插入的数与每个元素比较个元素开始,依次将要插入的数与每个元素比较for(i=8;i=0;i-)/如果要插入的数比元素值小,则该元素直接向后移位如果要插入的数比元素值小,则该元素直接向后移位if(xai)ai+1=ai;elsebreak;/表示找到插入点,退出循环表示找到插入点,退出循环ai+1=x;/插入数据插入数据数组应用数组应用II-II-插入插入第22页/共87页数组应用III:III:不改变顺序,删除指定的数字ma
16、in()inti,j,del=0,inta10=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 101 2 3 4 5 5 7 8 9 10删除后:删除后:1 2 3 4 7
17、8 9 101 2 3 4 7 8 9 10第23页/共87页二分法检索(在序列x中检索y的位置)前提:有序数列(以递增序为例)原理:等分区间;若y小于中间数,则取左半边,否则取右半边。再等分,再比较 例:对于区间a,b 等分为若 y=xk 则位置为k若yxk 则取新区间 k+1,b (即a=k+1)数组应用数组应用IVIV二分查找二分查找(检索检索)第24页/共87页二分法查找递增序列main()intx10=34,56,78,87,88,90,101,112,520,888;inty,i,k,a=0,b=9;for(i=0;i10;i+)printf(%d,xi);scanf(%d,&y)
18、;while(a=b)/二分法查找k=(b+a)/2;printf(x%d=%dn,k,xk);if(y=xk)break;if(yb)printf(ERROR);elseprintf(nx%d=%dn,k,xk);getch();第25页/共87页/174.2 4.2 二维数组 二维数组的定义和初始化1.定义需要两个下标才能标识数组中某个元素的位置,也称为矩阵。Use a two-dimensional array if two other identifiers are needed to determine the value of interest.定义格式为:类型定义符 数组名常量表
19、达式1 常量表达式2列数行数inta23;逻辑结构存储结构第26页/共87页/17 二维数组的定义和初始化2.二维数组的初始化和引用两种初始化方式:按行初始化:每一对花括号对应一行的元素。按存放顺序初始化:按内存中的存放顺序将初始值分别赋值给对应的元素。inta23=1,2,3,4,5,6;inta23=1,2,3,4,5,6;inta3=1,2,3,4,5,6;第27页/共87页/17 二维数组的定义和初始化intd34=1,2,3,4,5,6;intd4=1,2,3,4,5,6;intd34=1,0,0,0,2,3,0,0,4,5,6;intd4=1,0,0,0,2,3,0,0,4,5,6
20、;inte34=0,0,0,1,0,0,2,3,0,4,5,6;inte4=0,0,0,1,0,0,2,3,0,4,5,6;inte34=0,0,0,1,0,0,2,3,0,4,5,6;第28页/共87页/17 二维数组的定义和初始化3.二维数组在内存中的存放M行N列的二维数组a,aij的位置公式为:i*N+j+1数组元素aij存储映射关系为:aija0N*i+jnReal computer memory has only one dimension,i.e.each location is identified with only one component of address.n因此,二
21、维数组元素可用它相对数组首元素00位置的偏移量来表示(称为存储映射关系storage mapping)。对二维数组元素的操作除了用二重循环外,还可以用一重循环实现。nIn C,or any other language supporting arrays with dimension sizes greater than one,two-dimensional arrays simulate the effect of using two components of address.To do this,the array is mapped into consecutive memory w
22、ith row 0s values first,then row ones values,etc.nYou can think of this as a set of one dimensional arrays holding the column values as a single value in the rows values.第29页/共87页/17二维数组元素的引用对二维数组int a34中各元素的输出操作for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,aij);for(i=0;i3;i+)for(j=0;j4;j+)/用相对a00位置的偏移量来表示
23、 printf(%4d,a04*i+j);for(i=0;i12;i+)/用相对a00位置的偏移量 printf(%4d,a0i);第30页/共87页求矩阵 特征值之和#defineN3main()inti,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);/主对角线元素之和for(i=0;iN;i+)s+=aii;printf(n主对角线元素之和s=%dnn,s);二维数组的应用举例二维数组的应用举例矩阵矩阵第31页/共
24、87页/副对角线元素之和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)第32页/共87页/下 元素之和s=0;for(i=0;iN;i+)for(j=0;j=i;j+)s+=aij;printf(下 元素之和s=%dnn,s);/周边元素之和s=0;for(i=0;iN;i+)for(j=0;jN;j+)if(i=0|i=N-1|j=0|j
25、=N-1)s+=aij;printf(周边元素之和s=%dnn,s);getch();二维数组的应用举例二维数组的应用举例矩阵(续矩阵(续2)第33页/共87页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)/sizeof(b0);i+)for(j=0;jsi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 数组 讲解
限制150内