第5章C语言

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章数组C语言数据类型十分丰富,前几章已经遇到了整型、实型和字符型这些基本类型的数据。从本章开始讨论由多个数据成员构成的结构类型的数据。本章重点介绍数组类型的定义、初始化和引用。在程序设计中,经常会使用同一类的数据来处理问题。例如要存储一些学生的成绩,可以定义intgrade0,grade1,grade2;。然而,当成绩量很大时,需先用大量的标识符进行表示,而且每个变量名都要惟一,这样做是很麻烦的。C语言提供了能自动组织同一类数据的处理功能,即数组。所谓数组,是由同类型数据构成的有序集合。一个数组包含多个数据对象,这些对象称为数组元素。各元素的类型相同,它们在内存中占据的地址空间也是连续的,而且它们用统一的数组名称和下标来唯一确定。所谓下标,是指元素在数组中的位置,如数组a有5个元素,分别为a[0],a[1],a[2],a[3]及a[4]。方括号中的0,1,2,3,4为下标,表明各元素在数组中的位置。同基本变量一样,数组也是先定义,再引用。۝5.1一维数组5.1.1一维数组的定义一维数组定义的格式为:类型说明数组名[常量表达式]如floatsheep[10];和ints2007[100];,其中sheep为数组名,10表示此数组有10个元素,即sheep[0]…sheep[9],但是不存在sheep[10]这个数组元素;float表示这10个元素都是实型数。数组类型可以是任意数据类型,如char,int,float及long等。对一维数组的定义说明♣数组名的命名规则同与变量名相同,必须是合法的标识符。即第一个字符应为英文字母或下划线。♣用方括号将常量表达式括起来。常量表达式定义了数组元素的个数。即数组的长度。它只能是整型常量或符号常量。数组在定义之后,长度是不能改变的。♣在数组定义时,常量表达式中不允许包含变量,如下列左式。但在操作语句(即数组元素的引用)中,数组常量表达式中允许包含变量,如下列右式。后面多维数组相同。intn;inta[3];…n=5;ints,n=2;inta[n];//定义时变量下标非法s=a[n];//引用时变量下标合法♣数组下标从0开始。再如,inta[5];定义了数组a,有5个数组元素分别为a[0],a[1],a[2],a[3],a[4]。可以视为5个带下标的变量,这5个变量的类型都是整型的。其中5是数组长度,0~4是数组中各元素的下标。见图5.1-1所示。۝注意data1data2data3data4data5数组a数组a的下标01234图5.1-1数组a的下标♣各元素在内存中占据的地址空间是连续的。♣元素a[0]的地址是整个数组的首地址,紧接着是a[1]的地址,然后是a[2]的地址……依次排列。也可用数组名a表示数组的首地址,即a等价于&a[0];。在VC++6.0编译器中,一个int型的数据用4个字节存储。若a[0]存储在地址0012ff6c,那么其余的数组元素连续地存储在地址0012ff70、0012ff74、0012ff78、0012ff7c。如图5.1-2(a)(b)所示。图5.1-2(a)数组a的内存形式5.1.2一维数组的引用C语言不允许一次引用整个数组,只能逐个引用数组元素。定义了一个数组后,就可以用下面的格式引用数组中的每个元素。其一般格式为数组名[下标]数组的下标可以是整型常量或整型表达式,固定从0开始,最大的下标是数组元素的长12345数组a数组a的下标a[0]a[1]a[2]a[3]a[4]图5.1-2(b)数组元素的地址数组各元素地址12ff6c12ff7012ff7412ff7812ff7ca[0]a[1]a[2]a[3]a[4]度减1。例5.1-1从键盘输入6个数,将它们按反序输出。#includestdio.hvoidmain(){inti,n;intnum[6];for(i=0;i6;i++)scanf(“%d”,&num[i]);for(n=5;n=0;n--)/*反序输出*/printf(“%3d”,num[n]);printf(“\n”);}运行结果:456789↙987654۝注意♣C语言系统对下标不作语法检查。也就是说,在引用时若下标越界,系统不报编译错误,只报警告,可以继续执行语句,引用的结果为未知值。如inta[3]={1,2,3};ints;s=a[3];所以,对下标的控制须完全由程序设计者自己把握。5.1.3一维数组的初始化数组元素的初始化就是对所有元素赋初值。可以通过赋值语句来完成。如例5.1-1中的intnum[6];for(i=0;i6;i++)scanf(“%d”,&num[i]);就是通过执行for循环以及键盘的输入,对num数组赋值,这种方法是人机交互赋值。也可以采用在程序中数组定义的同时赋值。一般有2种方法。1.在数组定义的同时赋初值C语言规定,在定义数组时,可以直接对数组进行初始化。如inta[6]={2,3,4,5,6,7};,写成一般形式为类型说明数组名[常量表达式]={数值表};其中花括号中的值是初始值,也称为初始值表,各值之间用逗号隔开。在数组a中,由于数值表中6个数值已全部给出,可以省略方括号中的元素个数。即inta[]={2,3,4,5,6,7};۝注意♣由于数值表中包含的6个数据元素全部列出,a数组长度被隐含确定为6。若在数值表中没有列出所有元素的初值,则数组的长度不能省略。♣若对数组中的部分元素赋值,则对不赋值的元素,在花括号中缺省并视为0;但是逗号不能省略。如intb[6]={2,,4,,,7};,各数组元素的初值为b[0]=2,b[1]=0,b[2]=4,b[3]=0,b[4]=0,b[5]=7。♣若数组中的初值元素个数少于数组长度,则相当于只对数组前几个元素赋值,其余元素的初值,系统将自动置为0。如intb[6]={2,3,4};,各数组元素的初值为b[0]=2,b[1]=3,b[2]=4,b[3]=0,b[4]=0,b[5]=0。但是,如intb[6]={0};定义并赋值,则b[0]~b[5]初值均为0;而intb[6]={5};,则只有b[0]为5,其余b[1]~b[5]均为0。例5.1-2数组的初始化#includestdio.hvoidmain(){inti;inta[5]={5,6,7,8,9};for(i=0;i5;i++)printf(“a[%d]=%d\n”,i,a[i]);}运行结果:a[0]=5a[1]=6a[2]=7a[3]=8a[4]=92.在定义数组以后赋值对数组先定义,然后在程序中用赋值语句分别赋值,或采用人机交互对数组的每个元素分别赋值。如inta[5];a[0]=2;a[1]=10;a[2]=5;a[3]=7;a[4]=12;;也可通过for语句对数组赋值,如#includestdio.hvoidmian(){inta[5],i;for(i=0;i5;i++){printf(“Inputainteger:”);scanf(“%d”,&a[i]);}}运行结果:Inputainteger:5↙Inputainteger:6↙Inputainteger:7↙Inputainteger:8↙Inputainteger:9↙以上2种赋值方法运行效果是相同的,都会使数组a[5]中a[0]~a[4]的各值为5、6、7、8、9。5.1.4一维数组程序举例在实际数据处理时,常需要对数据进行排序。排序的方法有很多,如冒泡法、选择法等。下面通过实例来介绍冒泡法排序的思想和算法。例5.1-3用冒泡法对随机存储在数组中的10个数从小到大排序分析:冒泡法排序程序算法如下(假设一个最坏的极端数据安排,随机情况原理相同)①比较第一个数与第二个数,若为逆序(即a[0]a[1])则交换,否则不交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较完为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。如图5.1-3所示(图中举例为6个元素)。②对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。③重复上述过程。对有n个元素的数组,共要经过n-1趟冒泡排序后,排序结束。N-S图如图5.1-4所示。#includestdio.hvoidmain(){inta[11],i,j,t;printf(“Input10numbers:\n”);for(i=1;i11;i++)scanf(“%d”,&a[i]);printf(“\n”);for(j=1;j=9;j++)for(i=1;i=10-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(“Thesortednumbers:\n”);for(i=1;i11;i++)printf(“%d”,a[i]);printf(“\n”);}运行结果:Input10numbers:240-123816-767812-1↙Thesortednumbers:-123-76-10248121678程序说明♣数组a[11]定义长度为11,其中a[0]未用。目的是要让外层循环的控制变量j的变化参与到内层的控制变量i的变化中,使条件表达式不要过于复杂,如i=10-j。如果定义a[10],985420第1趟:第1次8954202次第3次8594208549204次854290854209结果第5次图5.1-3第一趟冒泡排序图示输入n个数给a[1]~a[n]forj=1ton-1fori=1ton-ja[i]a[i+1]真假a[i]与a[i+1]的值互换输出a[1]~a[n]图5.1-4冒泡法排序的N-S流程图请读者思考一下,程序中各表达式应做如何变动?۝5.2二维数组5.2.1二维数组的定义二维数组的定义格式为类型说明数组名[常量表达式1][常量表达式2];其中,类型说明是指出该二维数组各元素的数据类型;常量表达式1为行下标,常量表达式2为列下标。如inta[3][4];floatb[5][10];,定义了数组名为a的整型二维数组和数组名为b的实型二维数组。由于数组是一种构造类型的数据,所以二维数组可以看作是由一维数组的嵌套而构成的。即一维数组的每个元素又是一个一维数组,就组成了二维数组。C语言将这样的分解连续地在内存中存储。如上面定义的二维数组a[3][4],可看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2];而每个元素又是一个包含4个元素的一维数组。如图5.2-1。可以把a[0]、a[1]、a[2]看作是三个一维数组的名字。如一维数组a[0]中的元素分别为a[0][0],a[0][1],a[0][2],a[0][3]。为了便于理解,可将二维数组视为行列式或矩阵,第一个下标为行号,第二个下标为列号,行号和列号都从0开始。实际的内存存储器是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,并能快速定位查找,可有两种方式:一种是按行排列,即放完一行之后顺序放入第二行。另一种是按列排列,即放完一列之后再顺序放入第二列。在C语言中,二维数组是按行排列的。即:先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。这样以来,若要想快速地找到各行的首地址,就必须借助于a,a[0]、a[1]、a[2]作为各行的首地址。用指针的方式则更加方便(在指针章节中将介绍)。由于数组a说明为int类型,该类型占四个字节的内存空间,所以每个元素均占有四个字节。内存存储序列为2,4,5,6,1,0,12,7,9,1,1,5。图5.2-1二维数组a[3][4]的3×4=12个元素实际内存存储۝注意♣定义数组inta[3][4];是合法的,而inta[3,4];是非法的。C语言允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。如定义三维数组floata[2][3][2];,即定义了一个三维数组a,共有12个元素,它们的排列顺序为2456a,a[0]a[0][0]a[

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功