安庆师范学院计算机与信息学院16.1一维数组6.2二维数组6.3字符数组与字符串6.4程序举例第6章数组安庆师范学院计算机与信息学院2【本章导读】前几章我们已经学习了C语言的一些基本数据类型,如整型、字符型和实型等。但是仅有这些基本类型很难满足较复杂情况下的编程需要。在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类型数据元素的集合称为数组。数组属于构造数据类型。一个数组可以包含多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构体数组等各种类型。第6章数组安庆师范学院计算机与信息学院3【本章导读】通过本章学习,要求达到以下目标:掌握一维数组、二维数组的定义、初始化和数组元素的引用;掌握字符数组的定义、初始化和数组元素的引用;掌握字符串的存储方法和应用;掌握有关处理字符串的系统函数的使用方法。第6章数组安庆师范学院计算机与信息学院4【分析】从键盘接收10个数,求平均数很简单,可以采用边接收边求和的方法,最后求平均数;但是输出小于平均数的数就比较麻烦了,因为从键盘接收的10个数在求和以后没有保存起来,等再比较比平均数小的数就无法实现。要解决此问题,必须使用数组。先将10个数保存到数组中去,等求过平均数后再从数组里取出10个数进行比较。【问题】从键盘接收10个数,求平均数并输出小于平均数的数安庆师范学院计算机与信息学院56.1一维数组6.1.1一维数组的定义一维数组的定义形式为:数据类型数组名[元素个数];例如:inta[5];定义了一个一维整型数组,数组名为a,有5个数组元素。这5个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]。安庆师范学院计算机与信息学院66.1.1一维数组的定义【注意】(1)数组名用合法的标识符命名,与变量的命名方法相同。(2)方括号中的数组元素的个数又叫数组的长度。(3)数组元素的序号(下标)是从0开始。如数组定义a[5]中的5表示数组a有5个元素,下标从0开始。注意下标不能越界,即不能使用数组元素a[5]或更大下标的元素。若使用的下标越界,系统虽然不提示错误,但可能会出现意想不到的结果,甚至可使系统出现问题。安庆师范学院计算机与信息学院7(4)C语言不允许对数组长度作动态定义,即定义中的数组元素个数可以包括常量和符号常量,但不能包括变量。例如:下面的定义是错误的。intn=10;inta[n];/*因为n为变量*/而下面的定义是正确的。#defineN10main(){inta[N];/*N为符号常量*/…}安庆师范学院计算机与信息学院8(5)数组元素具有定义语句中指定的数据类型。它可以是任一种基本数据类型或构造数据类型。同一数组中所有元素的数据类型都是相同的。下面是常见的一维数组的定义:inta[10];/*定义整型数组a,它有10个元素*/charstr[20];/*定义字符型数组str,它有20个元素*/floatb[5],c[10];/*定义实型数组b和c,b有5个元素,c有10个元素*/安庆师范学院计算机与信息学院96.1.2一维数组元素的引用数组在定义之后即可引用其中的数组元素,其引用形式为:数组名[下标]下标只能为整型常量或整型表达式。如果为小数,C语言编译时将自动取整。C语言中只能逐个引用数组元素,而不能一次引用整个数组。安庆师范学院计算机与信息学院10【例6.1】将数字09装入一个整型数组a中,并输出。/*EX6-1.C*/#includestdio.hmain(){inta[10];inti;for(i=0;i10;i++){a[i]=i;printf(%d,a[i]);}printf(\n);}安庆师范学院计算机与信息学院116.1.3一维数组的存储和初始化1.一维数组的存储:系统为数组按照其类型和元素个数开辟一组连续的存储单元,每个存储单元存放一个数组元素,该连续存储单元的首地址由数组名表示。2.有两种方式对数组元素赋值:(1)数组定义时给数组元素赋以初值,这两种方式称为数组的初始化;(2)在程序执行部分用赋值语句或输入语句给数组元素赋值。安庆师范学院计算机与信息学院123.对一维数组的初始化通常可以采用以下方式进行:(1)对数组的全部元素赋初值,例如:intnum[5]={1,2,3,4,5};经过上述定义及初始化之后,num[0]=1,num[1]=2,num[2]=3,num[3]=4,num[4]=5。(2)对数组的部分元素赋初值其余元素的值为0(对实数是0.0,对字符型是‘\0’),例如:intnum[5]={1,2,3};只给前3个元素赋初值,其余2个元素的值为0。注意:定义普通数组时没有初始化赋值,所有元素的值都是随机的。6.1.3一维数组的存储和初始化安庆师范学院计算机与信息学院13(3)对全部数组元素赋初值时,可以不指定数组的长度(元素个数),例如:intnum[]={1,2,3,4,5};(4)当定义的数组元素个数小于初值的个数时,作语法错误处理,例如:intnum[4]={1,2,3,4,5};是不合法的,因为num数组只能有4个元素。6.1.3一维数组的存储和初始化安庆师范学院计算机与信息学院146.1.4一维数组的应用【例6.2】用数组求Fibonacci数列的前20项。【分析】Fibonacci数列可按下式计算:fi=fi-1+fi-2初值f0=1,f1=1。安庆师范学院计算机与信息学院15#includestdio.hmain(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){printf(%6d,f[i]);if((i+1)%5==0)printf(\n);}}【例6.2】/*EX6-2.C*/安庆师范学院计算机与信息学院16【例6.3】从键盘输入10个数,求平均数并输出所有大于平均数的数。main(){inti,n=0;floata[10],ave=0;printf(请输入10个数:\n);for(i=0;i10;i++){scanf(%f,&a[i]);ave+=a[i];}ave=ave/10;printf(平均数为:%f\n,ave);for(i=0;i10;i++){if(a[i]ave){printf(%f,a[i]);n++;}if(n%4==0)printf(\n);}printf(\n“);}安庆师范学院计算机与信息学院17安庆师范学院计算机与信息学院18/*EX6-4.C比较排序*/main(){inta[10]={8,15,14,12,9,3,11,0,28,6};inti,j,temp;for(i=0;i9;i++)for(j=i+1;j10;j++)if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}for(i=0;i10;i++)printf(%3d,a[i]);printf(\n);}【例6.4】将10个整数从大到小排序安庆师范学院计算机与信息学院19/*EX6-4.C选择排序*/main(){int[10]={8,15,14,12,9,3,11,0,28,6},i,j,t,p;for(i=0;i9;i++){p=i;for(j=i+1;j10;j++)if(a[p]a[j])p=j;if(p!=i){t=a[i];a[i]=a[p];a[p]=t;}}for(i=0;i10;i++)printf(%3d,a[i]);printf(\n);}【例6.4】将10个整数从大到小排序安庆师范学院计算机与信息学院20【分析】可先定义一个一维数组,将n个数存入该数组中,然后输入要查找的数x,再利用循环顺序查找,当找到该数就打印该数并停止循环。停止循环可用break语句,也可以用一个标志变量,程序如下:【例6.5,顺序查找算法】在n个数中查找一个数x安庆师范学院计算机与信息学院21/*EX6-5.C*/#defineN15main(){inta[N],x,i,find;for(i=0;iN;i++)scanf(“%d”,&a[i]);scanf(“%d”,&x);find=0;for(i=0;iN&&!find;i++)if(x==a[i]){printf(找到:%d,它是a[%d].\n,x,i);find=1;}if(find==0)printf%d:没找到.\n,x);}【顺序查找算法】在n个数中查找一个数x安庆师范学院计算机与信息学院22运行结果如图所示:安庆师范学院计算机与信息学院23顺序查找需要查找的次数比较多,设有n个数,平均需要查找n/2次,用折半查找就快得多。(1)指导思想:先将中间的数与待查的数比较,如果找到就结束查找,否则,若待查数小于中间数,应在前半部分继续查找;若待查数大于中间数,应在后半部分继续查找。在一半范围内查找还是用中间数与待查数比较,直到待查范围缩小到没有数为止。理论上,折半查找平均查找次数为log2n(2)具体方法:设三个变量mid、top和bot,分别表示查找范围的中间、最小和最大下标,查找中如果没有找到,则不断迭代这些变量,直到找到或查找范围缩小到没有数为止。程序如下:【折半查找算法】对排好序(如从小到大)的数进行查找安庆师范学院计算机与信息学院24/*EX6-6.C*/#defineN15main(){inta[N],x,i,mid,top,bot,find;for(i=0;iN;i++)scanf(“%d”,&a[i]);scanf(“%d”,&x);top=0;bot=N-1;find=0;do{mid=(top+bot)/2;if(x==a[mid]){printf(找到:%d,它是a[%d].\n,x,i);find=1;}elseif(xa[mid])bot=mid-1;elsetop=mid+1;}while(top=bot&&!find);if(find==0)printf%d:没找到.\n,x);}【折半查找算法】对(从小到大)排好序的数进行查找安庆师范学院计算机与信息学院25运行结果如图所示:安庆师范学院计算机与信息学院266.2二维数组6.2.1二维数组的定义二维数组定义的一般形式为:数据类型数组名[行数][列数];例如:inta[2][3];/*定义a为2行3列的整型数组*/charc[3][5];/*定义c为3行5列的字符型数组*/floatd[4][5];/*定义d为4行5列的实型数组*/安庆师范学院计算机与信息学院276.2.2二维数组元素的引用数组名[行下标][列下标]如:s[2][4],这里下标用来标识数组元素在数组中的位置。下标可以是整型常量或整型表达式,如:a[2][3],a[i][j],s[k-1][i+3]等。但不能写成s[2,1+3],a[i,j]的形式。请注意区分数组的定义和数组元素的引用。两者从形式上看有些相似,但含义却完全不同。6.2二维数组安庆师范学院计算机与信息学院28/*EX6-7.C*/main(){inti,j,a[3][4];for(i=0;i3;i++)/*变量i控制数组的行下标*/{for(j=0;j4;j++)/*变量j控制数组的列下标*/{scanf(%d,&a[i][j]);printf(a[%d][%d]=%d\t,i,j,a[i][j]);}printf(\n);/*每行输出结束时换行*/}}【例6.7】二维数组的输入与输出安庆师范学院计算机与信息学院296.2.3二维数组的存储和初始化1、二维数组的存储:按行存储,即一行接一行存储。例如整型数组a[3][4]共有12个存储单元,每个存储单元4个字节。存放的顺序是按行存放:a[0][0],a[0][1],a[0][2],a[0]