第6章 数组 教学PPT_190816ppt课件.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第6章 数组 教学PPT_190816ppt课件.pptx》由会员分享,可在线阅读,更多相关《第6章 数组 教学PPT_190816ppt课件.pptx(147页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 数组 教学PPT_190816 第第6章章 数组数组 一维数组 数组三要素 数组内存 数组遍历 数组排序 二维数组 二维数组内存 变长数组与动态数组 数组和指针 6.1 一维数组的定义与初始化数组是一组具有相同数据类型的变量集合。数组中的每一项称为数组的元素,每个元素都有对应的下标(n),用于表示元素在数组中的位置序号,下标从0开始。 100206733988296680 0 1 2 3 4 5 6 7 8 9 上面数组中包含10个元素,这些元素按照下标的顺序进行排列。由于数组元素的下标从0开始,数组中的第n个元素为arrn-1。10个int类型的数据的集合,可以定义一个数组arr进行
2、存储。6.1 一维数组的定义与初始化 根据数据的复杂度,数组下标的个数是不确定的。数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。通常情况下,我们将三维及以上的数组称为多维数组。6.1 一维数组的定义与初始化 一维数组也称向量,指的是只有一个维数的数组,它用以组织具有一维顺序关系的同类型数据。在C语言中,一维数组的定义方式如下:类型说明符 数组名常量表达式;6.1 一维数组的定义与初始化 在上述语法格式中,类型说明符表示数组中所存元素的类型,常量表达式指的是数组的长度,也就是数组中最多可存放元素的个数。6.1 一维数组的定义与初始化int a
3、rr110;char arr26;float arr38; 数组初始化的常见的方式有3种:1、直接对数组中的所有元素赋值。int arr5=1,2,3,4,5; 2、只对数组中的一部分元素赋值。int arr5=1,2,3;3、对数组全部元素赋值,但不指定长度。int arr=1,2,3,4;数组初始化6.1 一维数组的定义与初始化 6.2 数组三要素 数组索引 数组类型 数组大小 6.2.1 数组索引数组中的元素都是有编号的,这个编号称为数组元素的索引,用于表示元素在数组中的位置。数组元素的索引从0开始,依次递增,直到标记最后一个元素。如果数组中有n个元素,则最后一个元素的索引是n-1。通过
4、索引访问数组元素的方式如下所示:数组名索引; 6.2.1 数组索引在上述方式中,索引指的是数组元素的位置,通过索引可以访问数组中任意位置的元素。int arr5 = 12,6,78,9,20 ;arr0/访问第1个元素12arr1/访问第2个元素6arr2/访问第3个元素78arr3/访问第4个元素9arr4/访问第5个元素20 6.2.1 数组索引通过对某个索引上的数据重新赋值可以更改数组元素的值,例如,将数组arr中的第3个元素78更改为100。/更改arr2的元素值为100arr2 = 100;/输出arr2,值为100printf(%d,arr2); 6.2.2 数组类型数组是一组相同
5、类型的数据的集合,数组类型就是所存储元素的类型。数组类型不仅可以是int、float、char等基本类型,也可以是指针以及后续章节将要介绍的结构体等任意类型。数组类型 6.2.2 数组类型一个指定数据类型的数组,只能存储本数据类型的数据。int arr15 = 1,2,3,4,5 ; /定义int类型数组,元素为1、2、3、4、5char arr25 = a,b ;/定义char类型数组,元素为a、bfloat arr35 = 1.2,3.6,9.9 ;/定义float类型的数组,元素为1.2、3.6、9.9 6.2.2 数组类型如果在数组中存储不同类型的数据,编译器并不会报错,它会将数据转换
6、为与数组类型相同的数据再存储到数组中。 6.2.2 数组类型例如,对于上述代码中定义的int类型数组arr1中的元素1更改为10.8,示例代码如下:arr10 = 10.8;/将arr10位置上的元素更改为10.810.8为浮点类型数据,将其存储在int类型的数组中,编译器会将10.8转换为int类型的10再存储到数组arr1中,当用户读取arr10位置的值时,其值为10。 6.2.2 数组类型对于char、float等其他类型的数组,当存储不同类型的数据时,编译器会根据编译规则进行适当转换,保证数组中存储的数据都是相同类型。如果不能完成转换,编译器就会报错,例如,向float类型数组中存储整
7、型数据,编译器会将数据转换为float类型再存储到数组中;如果向float类型数组中存储字符型数据,编译器会将字符对应的ASCII编码转换为float类型数据,再存储到数组中。 6.2.2 数组类型对于字符类型数组,如果向其中存储int类型数据,编译器会将其视为ASCII编码;如果存储float类型数据,编译器会将其转换为int类型数据,再将其视为ASCII编码。 6.2.2 数组类型如果存储的int类型数据或float类型数据超出了ASCII码表范围,编译器无法正确解读,用户在读取数组中元素时无法得到预期结果。 6.2.2 数组类型字符类型数组如果存储了字符串,编译器会将字符串拆解成单个字符
8、存储到字符数组中,且拆解字符串时最后会拆解出一个0字符。字符数组存储字符串 6.2.2 数组类型例如,有char类型的数组carr,定义如下:char carr5 = a,b,sf ;/char类型数组中存储了一个字符串在数组carr中,存储了两个字符和一个包含两个字符的字符串,在定义数组时,编译器会将字符串“sf”拆分成字符s、字符f和0存储在数组中,其形式如下图。 6.2.3 数组大小数组在定义时要指定大小,数组大小是指数组最多可存储的元素的个数。 6.2.3 数组大小例如,定义一个int类型数组arr:int arr5,该数组最多只能存储5个数据,如果存储数据大于5,则编译器会提示“初始
9、项值过多”的错误信息,示例代码如下:int arr15 = 11,46,9,200,87 ; /存储5个数据int arr25 = 2,349,28,34,99,120 ; /错误,存储数据个数超过了数组大小 6.2.3 数组大小char carr5 = a,b,sft ;上述代码中,carr包含了一个有三个字符的字符串,编译器在转换时,将sft字符串拆分为s、f、t、0这4个字符,此时数组中有6个字符,但数组大小为5,因此编译器会报“初始项值过多”的错误。 6.2.3 数组大小数组大小与数组元素个数是不相同的,数组大小是数组最多可存储的元素个数,但数组中存储的元素并不一定是最大数目。 6.2
10、.3 数组大小例如,有如下数组:int arr5 = 1,2,3 ;上述代码中,数组arr大小为5,但数组元素个数为3。数组元素个数可以是0和不超过数组大小的任意正整数。 6.2.3 数组大小数组所占内存的大小由数组类型和数组大小决定,与数组中存储的元素个数无关。对于一个大小为5的int类型数组而言,它所占的内存大小就是这5个元素所占的内存大小,每个数据占4个字节内存,5个数据所占内存大小为45=20个字节,数组所占内存大小也就为20个字节。 6.2.3 数组大小数组所占内存大小可以使用sizeof运算符计算。int arr15 = 11,46,9,200,87 ;/数组arr1存储5个数据f
11、loat arr25;/数组arr2未存储数据char arr35 = a,b,c ;/数组arr3存储3个数据printf(%dn, sizeof(arr1);/数组arr1占内存大小为20printf(%dn, sizeof(arr2);/数组arr2占内存大小为20printf(%dn, sizeof(arr3);/数组arr3占内存大小为5 6.3.1 数组的起始地址一个变量在内存中占据一块空间,这块空间的地址标识着该变量的存储位置。同样,数组在内存中也占据一块空间,这块空间是连续的多个数据单元块(每个数组元素所占内存)。数组内存空间有地址标识,数组中每个元素也都有地址标识。 6.3.
12、1 数组的起始地址char ch = a;int num = 100;int arr5 = 1,2,3,4,5 ;内存颁布 6.3.1 数组的起始地址上述代码中,变量ch在内存中占所1字节内存,内存地址为0039F833;变量num在内存中占据4字节内存,内存地址为0039F824;变量ch与num是连续定义的两个变量,但是它们在内存中的地址并不连续,这说明单个变量在内存中是零散存储的。数组arr在内存中占据5个连续的4字节大小的内存单元块,数组元素地址是连续由低到高增长的。 6.3.1 数组的起始地址在数组内存中,第一个元素的地址也是数组的起始地址,这个地址由数组名保存,输出数组名就是输出数
13、组的起始地址,对数组名执行取值运算,会输出第1个元素。printf(%pn, arr);/输出数组arr的首地址printf(%pn, &arr0);/输出第1个元素的地址,它与数组首地址相同printf(%dn, *arr);/对数组名执行取值运算,结果为第一个元素1printf(%dn, arr0);/输出第1个元素,值为1 6.3.2 数组的步长数组步长就是相邻数组元素之间的内存地址距离,由数组类型决定。char类型的数组,步长为1字节; int类型的数组,步长为4字节;double类型的数组,步长为8字节。 6.3.2 数组的步长定义一个数组,示例代码如下:int arr5 = 1,2
14、,3,4,5 ;通过索引访问数组元素时,由arr0到arr1,索引的值增加了1,但在内存中,由第1个元素到第2个元素,内存地址并不是增加了1个字节,而是跨越了4个字节。 6.3.2 数组的步长int arr5 = 1,2,3,4,5 ; /int类型的数组arr,其大小为5for (int i = 0; i 5; i+) /for循环打印各元素地址printf(arr%d:%pn, i, &arri); 小小提示提示:内存地址打印内存地址打印程序运行结束后其变量所占内存空间会被回收,下一次程序运行时,系统会重新随机分配内存,因此每次运行程序打印的地址一般不会相同。 6.3.3 数组边界如果一个
15、数组中有n个元素,数组索引就为0(n-1),在为数组赋值或访问数组元素时,不能超过这个范围边界。如果超出这个边界,编译器就会报错或得到无法预期的数据。 6.3.3 数组边界定义如下数组:int arr5 = 1,2,3,4,5 ;数组arr的索引范围为04,如果超过范围访问不存在的元素,如arr-1、arr6,就会得到一个无法预期的数据,即垃圾数据。在这个过程中,编译器虽然不会报错,但会出现警告。 6.3.3 数组边界C语言是不安全的编程语言,访问数组时不进行边界检查,当访问超出范围的数组元素时,虽然编译器会弹出警告,但并不会阻止程序运行,程序会按数组步长依次向后(向前)读取内存。 6.3.3
16、 数组边界在上图中,数组arr大小为5,编译器为数组分配5个连续的int类型数据存储单元,当超出范围访问arr5时,编译器会根据数组的规则,移动一个步长连续访问arr4后面的4个字节内存空间,但是这个内存空间并不是分配给数组arr的,访问该内存空间时,会获取未知数据,可能是其他程序遗留的数据。同理,当访问arr-1时,编译器会按数组规则向前读取一块内存空间。需要注意的是,如果超范围访问的空间正好在被其他程序使用,那么程序在访问时就会出错。 6.3.3 数组边界超出范围访问数组元素,编译器只会弹出警告,但是如果超出范围对元素赋值,程序会抛出异常。例如对arr5进行赋值,再访问,示例代码如下:ar
17、r5 = 6;/超出数组范围赋值printf(%dn, arr5);/访问执行上述代码,程序能够成功赋值且成功访问到arr5元素的值6,但执行过程中会抛出异常。 6.3.3 数组边界 6.4 数组遍历遍历数组使用循环语句实现,以数组的索引作为循环条件,只要数组索引有效就可以获取数组元素。 6.4 数组遍历int arr5 = 1,2,3,4,5 ;printf(for循环遍历数组:n);for (int i = 0; i 5; i+) printf(arr%d:%dn, i, arri);int arr5 = 1,2,3,4,5 ;printf(while循环遍历数组:n);int j = 0
18、;while (j 5) printf(arr%d:%dn, j, arrj); j+; 6.5.1 冒泡排序在冒泡排序的过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程和水中气泡上升的原理相似。 第1步:从第1个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前1个元素比后1个元素大,则交换它们的位置。整个过程完成后,数组中最后1个元素自然就是最大值,这样也就完成了第1轮的比较。6.5.1 冒泡排序 第2步:除了最后1个元素,将剩余的元素继续进行两两比较,过程与第1步相似,这样就可以将数组中第二大的数放在倒数第2个位置。第3步:依次类推,对剩
19、余元素重复以上步骤,直到没有任何一对元素需要比较为止。6.5.1 冒泡排序 6.5.1 冒泡排序 使用冒泡排序对数组9,8,3,5,2排序。6.5.1 冒泡排序 第1轮比较中,第1个元素9为最大值,因此它在每次比较时都会发生位置的交换,最终被放到最后1个位置。第2轮比较与第1轮过程相似,元素8被放到倒数第2个位置。第3轮比较中,第1次比较没有发生位置的交换,在第2次比较时才发生位置交换,元素5被放到倒数第3个位置。第4轮比较仅需比较最后两个值3和2,由于3比2大,3与2交换位置。6.5.1 冒泡排序 当在程序中进行元素交换时,会通过一个中间变量temp实现元素交换,首先使用temp记录arrj
20、,然后将arrj+1赋给arrj,最后再将temp赋给arrj+1。6.5.1 冒泡排序 例如,交换数组元素8和3,其交换过程如下图。6.5.1 冒泡排序 通过上面的分析可知,可以使用for循环遍历数组元素,因为每一轮数组元素都需要两两比较,所以需要嵌套for循环完成排序过程。其中,外层循环用来控制进行多少轮比较,每一轮比较都可以确定1个元素的位置;内层循环的循环变量用于控制每轮比较的次数,在每次比较时,如果前者小于后者,就交换两个元素的位置。需要注意的是,由于最后1个元素不需要进行比较,外层循环的次数为数组的长度-1。6.5.1 冒泡排序 for (i = 0; i 5 - 1; i+) /
21、外层循环控制比较的轮数 for (j = 0; j arrj+1) /如果前面的元素大于后面的元素temp = arrj; /就交换两个元素的位置arrj = arrj+1;arrj+1 = temp; 6.5.1 冒泡排序 选择排序的原理与冒泡排序不同,它是指通过每一趟排序过程中从待排序记录中选择出最大(小)的元素,将其依次放在数组的最前或最后端,来实现数组的排序。接下来,分步骤讲解冒泡排序的整个过程。6.5.2 选择排序 第1步:在数组中选择出最小的元素,将它与0下标元素交换,即放在开头第1位。第2步:除0下标元素外,在剩下的待排序元素中选择出最小的元素,将它与1下标元素交换,即放在第2位
22、。第3步:以此类推,直到完成最后两个元素的排序交换,就完成了升序排列。6.5.2 选择排序 6.5.2 选择排序 使用选择排序对数组9,8,3,5,2进行排序。6.5.2 选择排序 第1轮:循环找出最小值2,将它与第一个元素9进行交换。第2轮:循环找出剩下的4个元素中最小值3,将它与第二个元素8交换。第3轮:循环找出剩下的3个元素中最小值5,将它与第三个元素8交换。第4轮:对最后两个元素进行比较,比较后发现不需要交换,则排序完成。6.5.2 选择排序 for (i = 0; i 5 - 1; i+) /外层循环控制比较的轮数 min = i; /暂定i下标处的元素是最小的,用min记录其下标f
23、or (j = i + 1; j 5; j+) /内层循环在剩下的元素中找出最小的元素if (xj xmin)min = j;if (min != i) /交换两个元素的位置temp = xi;xi = xmin;xmin = temp;6.5.2 选择排序 所谓插入排序法,就是每一步将一个待排序元素插入到已经排序元素中的适当位置,直到全部插入完毕。插入排序针对的是有序序列,对于杂乱无序的数组来说,首先要构建一个有序序列,将未排序的元素插入到有序序列的特定位置,构成一个新的有序序列,再次将未排序的元素插入到有序序列的特定位置以此类推,直到所有元素都插入到有序的序列中,排序就完成了。6.5.3
24、插入排序 第1步:从第1个元素开始,将其视为已排序的元素。第2步:取下一个元素(待排序元素),与左边已排序的元素相比较,如果已排序元素大于待排序元素,则将已排序元素向后移动,将待排序元素插入到已排序元素的前面。6.5.3 插入排序 第3步:如果已有多个元素排序,则将待排序元素自右向左逐个与已排序元素进行比较,直到已排序元素小于待排序元素,然后将已排序元素向后移动,将待排序元素插入到小于它的元素后面。第4步:再取下一个待排序元素,重复上述步骤,直到所有元素都排序完。6.5.3 插入排序 6.5.3 插入排序 6.5.3 插入排序以数组9,8,3,5,2为例,使用插入排序调整数组顺序。 6.5.3
25、 插入排序在上述插入排序中,以数组的第1个元素9为基准,取下一个元素8与之比较,因为89,则将8插入到9的前面,即将9与8互换位置,这样,构建了一个新的有序序列。再取下一个元素3,与9比较,因为39,则将9向后移动,将9的位置空出来,然后再将3与8比较,因为38,则将8向后移动,将3插入到8所在的位置,这样前三个元素又构成一个新的有序序列。以此类推,直到整个序列排序完成。 6.5.3 插入排序当有元素向后移动时,只是有序元素向后移动,要插入的元素一直保存在临时变量中。 6.5.3 插入排序例如,将元素3插入到8、9构成的有序序列中,3与9比较之后,由于39,因此元素9向后移动,空出位置,此时3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 数组 教学PPT_190816ppt课件 教学 PPT_190816ppt 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内