1第4章数组青海大学计算机系程序设计基础I2020/1/302第4章数组本章重点介绍:4.1一维数组4.2二维数组4.3字符数组与字符串2020/1/303第4章数组一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score[0],score[1],…score[4]。下标变量也称为数组元素。2020/1/3044.1一维数组例如:inta[10];floatscore[5];“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。4.1.1一维数组的定义数据类型数组名[常量表达式];2020/1/305以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];doubleb['a'..'d'];charstr[];4.1.1一维数组的定义(续)2020/1/306数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组2020/1/3074.1.2数组元素的引用格式:例如:输入学生成绩for(i=0;i5;i++)scanf(%f,&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2020/1/3084.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10];scanf(%d,&a[10]);/*下标越界*/C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2020/1/3094.1.2数组元素的引用(续)②[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:(1)计算2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH218CHscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.02020/1/30104.1.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:inta[5]={0,1,2,3,4,5};2020/1/30114.1.4一维数组应用举例【例4.1】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;iN;i++)scanf(%f,&score[i]);for(i=N-1;i=0;i--)printf(%6.1f,score[i]);}运行情况如下:6774899234678395737878.073.095.083.067.034.092.089.074.067.02020/1/3012【例4.2】输入5个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。思路:求最大/小值采用打擂台的方法。定义一维数组a存放被比较的数。定义变量max:最大值,min:最小值,k:最大值下标,j:最小值下标。各数依次与擂主进行比较,若a[i]max则:max=a[i];k=i;否则判断:若a[i]min则:min=a[i];j=i;当所有的数都比较完之后,将a[j]=max;a[k]=min;输出a数组。2020/1/3013main(){inta[5],max,min,i,j,k;for(i=0;i5;i++)scanf(%d,&a[i]);min=a[0];max=a[0];j=k=0;for(i=1;i5;i++)if(a[i]min){min=a[i];j=i;}elseif(a[i]max){max=a[i];k=i;}a[j]=max;a[k]=min;for(i=0;i5;i++)printf(%5d,a[i]);printf(\n);}程序运行情况如下:57231512372020/1/3014【例4.4】冒泡法排序(从小到大)。以6个数:3、7、5、6、8、0为例。第一趟排序情况如下:375680第一次3和7比较,不交换375680第二次7和5比较,交换357680第三次7和6比较,交换356780第四次7和8比较,不交换356780第五次8和0比较,交换356708在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。2020/1/3015冒泡法排序(续)第二趟排序情况如下:356708第一次3和5比较,不交换356708第二次5和6比较,不交换356708第三次6和7比较,不交换356708第四次7和0比较,交换356078在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出35678最后还剩下1个数0,不需再比较,得到排序结果:0356782020/1/3016冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。冒泡法排序for(i=0;iN;i++)输入a[i]for(j=0;jN;j++)for(i=0;iN-j;i++)a[i]a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]2020/1/3017#defineN6main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);for(j=1;j=N-1;j++)/*控制比较的趟数*/for(i=0;iN-j;i++)/*两两比较的次数*/if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(Thesortednumbers:\n);……}程序运行情况如下:3756800356782020/1/3018以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例4.5】选择法排序(从小到大)。2020/1/3019【例4.5】选择法排序(续)图4.3选择法排序for(i=0;iN;i++)输入a[i]for(j=0;jN-1;j++)for(i=j+1;iN;i++)a[j]a[i]TFa[j]与a[i]交换输出a[0]~a[N-1]2020/1/3020#defineN5main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);printf(\n);for(j=0;jN-1;j++)/*确定基准位置*/for(i=j+1;iN;i++)if(a[j]a[i]){t=a[j];a[j]=a[i];a[i]=t;}printf(Thesortednumbers:\n);…}程序运行情况如下:9678658640Thesortednumbers:4065788696