CProgrammingLanguage数组C语言程序设计Lecture6CProgrammingLanguage2数组(array)是多个同类型数据对象的组合。构造数据类型之一一个数组汇集了多个数据——数组元素。可从数组出发处理各元素,或以统一方式处理一批元素(所有元素)。数据对象的组合:数组CProgrammingLanguage3数组机制要解决:1)数组描述,数组变量定义;2)数组使用,包括通过数组的下标变量使用其元素;3)数组实现,数组的存储方式。CProgrammingLanguage4数组元素在C语言中可以有单下标数组元素、双下标数组元素和多下标数组元素。下标要用方括号括起来,下标可以是常量、变量和表达式,计算机自动取整。如:a[5]、b[2][3]、abc1[1][5][7]等。元素:属同一数据类型,用数组名和下标确定CProgrammingLanguage5一维数组字符数组二维数组程序举例CProgrammingLanguage6一、一维数组的定义只有一个下标的数组。类型标识符数组名[元素个数];例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量CProgrammingLanguage7说明:1、类型标识符:数组元素的类型2、数组名的命名规则与标识符的命名规则要同。3、数组“元素个数”即数组长度,只能是一个整型常量或整型符号常量。4、下标是数组元素在数组中的顺序号,从0开始。5、下标只能是有序类型的数据(常量和常量表达式)。6、每个元素都可作为一个变量来使用;如:a[0]=5;a[1]=4;例:试判断下列数组定义是否合法:#defineSTU35floatno_student[STU];intscore_student[STU*3];intperson(10);intn=10,a[n];CProgrammingLanguage8数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组引用方法:数组名[下标]其中:下标可以是常量或整型表达式如:a[0]=a[5]+a[7]-a[2*3]/*常量和表达式做下标*/a[i]=a[i]+1;/*变量做下标*/a[a[0]]=a[1]/*数组元素做下标*/二、一维数组的引用例inta[10];printf(“%d”,a);()必须for(j=0;j10;j++)printf(“%d\t”,a[j]);()CProgrammingLanguage9main(){inti,a[15];for(i=0;i15;i++)scanf(“%d”,&a[i]);for(i=14;i=0;i--)printf(“%4d”,a[i]);}注意:1、循环控制变量的初值、终值及控制条件。2、不能整体输出数组[例]从键盘输15个整数,然后反序输出。输入:123456789101112131415输出:151413121110987654321例:printf(“%d”,a);是错误的。CProgrammingLanguage10例inta[5];a[0]a[1]a[2]a[3]a[4]01234初始化a[0]a[1]a[2]a[3]a[4]内存a相当于5个变量,a[0]~a[4]可看作变量名。三、一维数组的存储结构数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。CProgrammingLanguage11只给部分数组元素赋初值当全部数组元素赋初值时,可不指定数组长度staticinta[5];等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;如inta[5]={6,2,3};等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()四、一维数组的初始化初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数CProgrammingLanguage12[例]#includestdio.hmain(){inti,a[5]={3,4,5},b[5];printf(“\narrayais:”);for(i=0;i5;i++)printf(“%6d”,a[i]);printf(“\narraybis:”);for(i=0;i5;i++)printf(“%d,”,b[i]);}运行结果:arrayais:34500arraybis:-32,1398,40,1170,454,/*随机数*/CProgrammingLanguage13Tip:操作数组的多个或全部元素常用for语句和一个循环变量。令变量遍历数组全部下标:for(n=0;n数组长度;n++)...?问题:假设程序里写:inta[30];…for(n=2;n=30;n++)…循环中试图访问a[30],实际无此元素。用超数组范围下标值访问元素:越界访问。是数组使用中最常见的语义错误。CProgrammingLanguage14[例]给数组赋值。main(){inti,a[10];for(i=0;i=9;i++)scanf(“%d”,&a[i]);}程序举例CProgrammingLanguage15[例]main(){intarr[10],i,k=0;for(i=0;i10;i++)arr[i]=i;for(i=0;i4;i++)k+=arr[i]+i;printf(“%d\n”,k);}程序举例CProgrammingLanguage16main(){intk,t=1,a[3]={1,2,3};for(k=0;k3;k++)a[k]+=a[k]-t;for(k=0;k3;k++)printf(“%4d”,a[k]);}[例]程序举例CProgrammingLanguage17[例]main(){inta[]={2,3,4,5,6,7,8,9};inti,r=1,n=3;for(i=0;i=n;i++)r=r*b[i];printf(“%d\n”,r);}程序举例CProgrammingLanguage18[例]定义长度为10的整型类型一维数组,从键盘输入10个整数,分别存放在10个数组元素中,然后将数组中的元素按逆序存放后输出其值。程序举例01234567899876543210分析:1.a[0]与a[9]交换,a[1]交换a[8],依此类推。错误的写法a[0]=a[9];a[9]=a[0];2.如何控制循环,只需循环到一半k=(n-1)/2;for(i=0,j=n-1;i=k;i++;j--){t=a[i];a[i]=a[j];a[j]=t}还可以写成for(i=0,j=n-1;ij;i++;j--)CProgrammingLanguage19main(){inti,j,t,a[10];for(i=0;i10;i++)scanf(%d,&a[i]);for(i=0;i10;i++)printf(%4d,a[i]);printf(\n);for(i=0,j=9;ij;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i10;i++)printf(%4d,a[i]);printf(\n);}程序举例CProgrammingLanguage20[例]读10个整数存入数组,输出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=a[0](b)依次用a[i]和max,min比较(循环)若maxa[i],令max=a[i]若mina[i],令min=a[i]3.输出:max和min#includestdio.hmain(){inta[10],i,max,min;printf(Enter10integers:\n);for(i=0;i10;i++){printf(%d:,i+1);scanf(%d,&a[i]);}max=min=a[0];for(i=1;i10;i++){if(maxa[i])max=a[i];if(mina[i])min=a[i];}printf(Maximumvalueis%d\n,max);printf(Minimumvalueis%d\n,min);}程序举例CProgrammingLanguage21[例]将数组中数值最小的元素排在第一位main(){inti,t,a[10];for(i=0;i10;i++)scanf(%d,a[i]);printf(\n);for(i=1;i10;i++)if(a[i]a[0]){t=a[0];a[0]=a[i];a[i]=t;}for(i=0;i10;i++)printf(%4d,a[i]);printf(\n);}程序举例输入10个数给a[0]到a[9]fori=1to9a[i]a[0]真假a[i]a[0]输出a[0]到a[9]CProgrammingLanguage22[例]从键盘上输入10个整数,用选择法将其按由小到大的顺序排列并输出。基本思想:(1)从第0个位置到第9个位置中选择出最小的一个与第0个位置的数交换。(2)从第1个位置到第9个位置中选择出最小的一个与第1个位置的数交换。…(9)从第8个位置到第9个位置中选择出最小的一个与第8个位置的数交换。例:513393222812321排序过程如下:程序举例CProgrammingLanguage23513393222812321①113393222852321②131393222852321③135932228132321④135832229132321⑤135892232132321⑥135891332222321⑦135891321222332⑧135891321222332⑨135891321222332程序举例CProgrammingLanguage24#includestdio.hmain(){inti,j,t,a[10];for(i=0;i10;i++)scanf(“%d”,&a[i]);for(i=0;i9;i++)for(j=i+1;j10;j++)if(a[i]a[j]){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i10;i++)printf(“%6d”,a[i]);}内循环:在(i,9)内选择最小数外循环:控制选择的次数程序举例CProgrammingLanguage25分析:从程序可知:1、程序使用两重循环来实现排序。2、其中,外循环控制排序趟数。若数组有N个元素,则共进行N-1趟排序。第一趟,i=0;第二趟,i=1,···3、其中,内循环完成在[i,9]的区间内选择最小数。比较次数随趟数增大而减少。4、在每一趟选择中,当后面元素较小时,马上进行交换。而这种交换是不必要的。事实上,只要记住较小元素的位置,即下标,在内循结束后做一次交换即可,这样可大大节省程序运行时间。改进程序如下:程序举例CProgrammingLanguage26#includestdio.hmain(){inti,j,k,a[10];for(i=0;i10;i++)scanf(“%d”,&a[i]);for(i=0;i9;i++){k=i;for(j=i+1;j10;j++)if(a[k]a[j])k=j;if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}}for(i=0;i10;i++)printf(“%6d”,a[i]);}内循环外循环程序举例CP