您好,欢迎访问三七文档
2020/9/201第4章数组2020年9月20日星期日2020/9/202•4.1一维数组•4.2二维数组•4.3字符数组2020/9/203前面讨论了C语言中的一些基本数据类型,如整型、实型、字符型等,在此基础上,本章将讨论C语言中构造类型数据中的一种:数组。数组是程序设计中一种普遍使用的数据结构,是数目固定、类型相同的数据的有序集合。2020/9/2044.1一维数组4.1.1一维数组的定义一维数组的定义形式为:类型说明符数组名[常量表达式]•类型说明符可以是任何一种基本数据类型或构造数据类型。数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。•数组名是用户定义的数组标识符,数组名的书写规则应符合标识符的书写规定。•常量表达式表示数组的固定长度,即数组中所包含元素的个数。2020/9/205例如:inta[5];定义数组a,有5个元素,每个元素为整型。floatb[10];定义实型数组b,有10个元素。charc[20];定义字符数组c,有20个元素。注意:数组在内存中占有连续的存储空间,并且一维数组是按下标递增的顺序连续存放的,所以数组a[5]在内存中的存储形式如下所示:a[0]a[1]a[2]a[3]a[4]2020/9/206对于数组的定义应注意以下几点:(1)数组名不能与其它变量名相同。例如:intmain(){inta;floata[10];……}是错误的。2020/9/207(2)不能在方括号中用变量来表示数组的长度,只能用符号常量或常量表达式;其中常量表达式必须是正的整型常量表达式。例如:#defineL5intmain(){inta[3+2],b[7+L];……}是合法的。但是下述说明方式是错误的。intmain(){intn=5;inta[n];……}2020/9/208(3)数组名后的常量表达式用方括号括起来,不能用圆括号或其它类型的括号。例如:inta(10);是错误的。(4)相同类型的数组、变量可以在一个类型说明符下一起说明,相互之间用逗号隔开。例如:inta,b,c,k1[10],k2[20];表示同时定义了整型变量a、b、c和整型数组k1、k2。2020/9/2094.1.2一维数组元素的引用数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。同时,C语言规定只能逐个引用数组元素而不能一次引用整个数组。2020/9/2010数组元素的引用方式为:数组名[下标]其中下标可以为整型常量或整型表达式。例如:a[2]a[i+j]a[j++]都是合法的数组元素引用。2020/9/2011可以使用循环语句逐个输出数组的各个元素(即下标变量):inta[10];for(i=0;i10;i++)printf(%d,a[i]);而不能用一个语句输出整个数组。下面的写法是错误的:printf(%d,a);2020/9/2012注意:①C语言中数组的下标是从0开始的,定义时如果数组的长度为n,则下标取值范围是0,1,……,n-1。例如,intarray[5];表示数组array有5个元素,分别为array[0],array[1],array[2],array[3],array[4]。②定义数组时数组长度只能用常量表达式,但是引用数组元素时下标可以是整型常量、整型变量或整型表达式。2020/9/2013【例4.1】按逆序输出数组元素的值。#includestdio.hintmain(){inti,aray[5];for(i=0;i=4;i++)array[i]=i;for(i=4;i=0;i--)printf(%d,array[i]);return0;}2020/9/2014【例4.2】将例4.1中数组元素的引用变换一种形式。#includestdio.hintmain(){inti,array[5];for(i=0;i5;)array[i++]=i;for(i=4;i=0;i--)printf(%d,array[i]);return0;}2020/9/20154.1.3一维数组的初始化在定义数组时给数组元素赋初值,称之为数组的初始化。数组初始化的一般形式为:类型说明符数组名[常量表达式]={值1,值2,……,值n};其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。2020/9/2016对数组的初始化可以有以下几种方法:(1)对所有元素赋初值。例如:inta[6]={0,1,2,3,4,5};将数组元素的初值依次放在一对花括号中。经过上面的定义和初始化后,使得a[0]的值为0、a[1]的值为1、a[2]的值为2、a[3]的值为3、a[4]的值为4、a[5]的值为5。2020/9/2017(2)可以只给一部分元素赋值。例如:inta[10]={0,1,2,3};定义a数组有10个元素,但花括号内只提供4个初值,这表示只给数组的前4个元素a[0]~a[3]赋初值,而后6个元素自动赋值为0。(3)如果想使一个数组中全部元素值相同,例如数组元素值都为1,只能写为:inta[5]={1,1,1,1,1};而不能写为:inta[5]={1};2020/9/2018(4)在对全部数组元素赋初值时,由于数据的个数已经确定,可以不指定数组长度。例如:inta[5]={1,2,3,4,5};可写为:inta[]={1,2,3,4,5};在第二种写法中,花括弧中有5个数,系统就会据此自动定义数组a的长度为5,但是当被定义的数组长度与提供初值的个数不相同时,不能省略数组长度。2020/9/20194.1.4一维数组程序举例【例4.3】任意输入10个元素,求这10个元素的和及最大值。#includestdio.hintmain(){inti,max,a[10],sum;printf(Pleaseinput10numbers:\n);for(i=0;i=9;i++)scanf(%d,&a[i]);max=a[0];sum=a[0];for(i=1;i10;i++){if(a[i]max)max=a[i];sum=sum+a[i];}printf(max=%d\nsum=%d,max,sum);return0;}2020/9/2020【例4.4】用数组来处理求fibonacci数列问题。#includestdio.hintmain(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%12d,f[i]);}return0;}2020/9/2021【例4.5】用冒泡排序的方法将数组元素升序排列。假定对下列数据进行升序排序:6,7,8,15,20,5,2,则冒泡排序过程如下所示。原始序列678152052第1趟678155220第2趟678521520第3趟675281520第4趟652781520第5趟526781520第6趟256781520n个元素只需进行n-1趟冒泡排序。2020/9/2022#includestdio.h#defineSIZE7voidBubbleSorter(intarray[],intn){inti,j;inttemp;for(i=0;in-1;i++)for(j=0;jn-1-i;j++){if(array[j]array[j+1]){temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}}intmain(){inti,array[SIZE];printf(输入待排序的整数:);for(i=0;iSIZE;i++)scanf(%d,&array[i]);BubbleSorter(array,SIZE);printf(排序后的序列为:\n);for(i=0;iSIZE;i++)printf(%4d,array[i]);return0;}2020/9/2023【例4.6】用选择排序的方法对下列数据进行升序排序:6,7,8,15,20,5,2。选择排序的思想是:①首先从下标为0到n-1的元素中找到值最小的元素,然后将该最小元素与第一个元素(即下标为0的元素)交换。②然后在剩余的元素(即下标从1到n-1的元素)中,找到值最小的元素,将该最小元素与第二个元素(即下标为1的元素)交换。③如此重复,直至所有元素已排好序。同冒泡排序一样,n个元素只需进行n-1趟选择排序。2020/9/2024原始序列678152052第1趟278152056第2趟258152076第3趟256152078第4趟256720158第5趟256781520第6趟2567815202020/9/2025#includestdio.h#defineSIZE7voidSelectSorter(intarray[],intn);intmain(){inti,array[SIZE];printf(输入待排序的整数:);for(i=0;iSIZE;i++)scanf(%d,&array[i]);SelectSorter(array,SIZE);printf(排序后的序列为:\n);for(i=0;iSIZE;i++)printf(%4d,array[i]);return0;}voidSelectSorter(intarray[],intn){inti,j;intmin_index;inttemp;for(i=0;in;i++){min_index=i;for(j=i+1;jn;j++){if(array[j]array[min_index])min_index=j;}temp=array[i];array[i]=array[min_index];array[min_index]=temp;}}2020/9/20264.2二维数组一维数组是线性的数组,它仅有一个下标。具有两个下标的数组称为二维数组。C语言允许定义和引用任意维数的数组,其使用方法与二维数组类似,但超过二维以上的数组在实际的程序设计中较少使用。2020/9/20274.2.1二维数组的定义二维数组定义的一般形式为:类型说明符数组名[常量表达式1][常量表达式2]其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。例如:inta[3][4];定义了一个3行4列的数组,数组名为a,其数组元素(即下标变量)的类型为整型。这3×4=12个数组元素分别为:a[0][0],a[0][1],a[0][2],a[0][3]a[1][0],a[1][1],a[1][2],a[1][3]a[2][0],a[2][1],a[2][2],a[2][3]2020/9/2028二维数组在逻辑上是二维的,但是,计算机中实际的物理存储器却是连续编址的,也就是说,内存单元是按一维线性排列的。如何在一维的存储空间中存放二维数组的元素?通常有两种解决方式:一种是按行序有序排列,即保存完一行之后顺序放入第二行;另一种是按列序有序排列,即保存完一列之后再顺序放入第二列。在C语言中,没有特殊说明情况下,二维数组是按行序有序排列的。对于二维数组a[3][4]是先依次存放第0行元素,再依次存放第1行元素,最后依次存放第2行元素。2020/9/20294.2.2二维数组元素的引用二维数组元素的表示形式为:数组名[下标][下标]同样,下标也应为整型常量或整型表达式。例如:a[2][3]表示数组a的第2行第3列的元素。注意,不要写成:a[2,3]2020/9/2030数组元素可以出现在表达式中,也可以被赋值,例如:b[1][2]=a[2][3]/2在使用数组元素时,应注意下标值应在已定义的数组大小的范围内,常出现的错误是:inta[3][2];a[3][2]=2;对于数组a,它可用的行下标最大值为2,列下标最大值为1。2020/9/2031【例4.7】一个小组有5个人,每个人有三门课的考试成绩。求全组
本文标题:第4章数组C编程
链接地址:https://www.777doc.com/doc-7028611 .html