哈工大c语言教学PPT8数组

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

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

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

资源描述

第8章数组2020/2/62/49本章学习内容对数组名特殊含义的理解数组类型,数组的定义和初始化向函数传递一维数组和二维数组排序、查找、求最大最小值等常用算法2020/2/63/49为什么使用数组(Array)?【例8.1】要读入10人的成绩,然后求平均成绩需定义10个不同名整型变量,需要使用多个scanf()intscore1,score2,…score10;scanf(%d,&score1);scanf(%d,&score2);......而用数组,可共用一个scanf()并利用循环语句读取intscore[10],i;for(i=0;i10;i++){scanf(%d,&score[i]);}保存大量同类型的相关数据2020/2/64/498.1一维数组的定义和初始化一维数组的定义存储类型数据类型数组名[整数1][整数2]……[整数n];a[9]a[8]a[7]a[1]a[0]…数组首地址inta[10];定义一个有10个int型元素的数组–系统在内存分配连续的10个int空间给此数组直接对a的访问,就是访问此数组的首地址基类型下标从0开始2020/2/65/498.1一维数组的定义和初始化a[9]a[8]a[7]a[1]a[0]…inta[10];数组大小必须是值为正的常量,不能为变量–一旦定义,不能改变大小数组大小最好用宏来定义,以适应未来可能的变化#defineSIZE10inta[SIZE];一维数组的定义存储类型数据类型数组名[整数1][整数2]……[整数n];2020/2/66/498.1一维数组的定义和初始化数组定义后的初值仍然是随机数一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};2020/2/67/498.1一维数组的定义和初始化数组的引用数组名[下标]数组下标(index)都是从0开始使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i]–可以像使用普通变量一样使用它们2020/2/68/49如何使两个数组的值相等?main(){inta[4]={1,2,3,4},b[4];b=a;}解决方法•方法1:逐个元素赋值b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];•方法2:通过循环赋值inti;for(i=0;i4;i++){b[i]=a[i];}原因:数组名表示数组的首地址,其值不可改变!2020/2/69/498.1一维数组的定义和初始化【例8.2】编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数2020/2/610/498.1一维数组的定义和初始化下标越界是大忌!–编译程序不检查是否越界–下标越界,将访问数组以外的空间–那里的数据是未知的,不受我们掌控,可能带来严重后果2020/2/611/49b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]ca【例8.3】当下标值小于0或超过数组长度时会出现什么情况?运行程序或单步执行观察变量变化情况可以看到,变量c和a的值因数组越界而被悄悄破坏了12345612078910114044484c5054585c6064686c2020/2/612/498.2二维数组的定义和初始化一维数组–用一个下标确定各元素在数组中的顺序–可用排列成一行的元素组来表示如inta[5];二维数组–用两个下标确定各元素在数组中的顺序–可用排列成i行,j列的元素组来表示如intb[2][3];n维数组–用n个下标来确定各元素在数组中的顺序如intc[3][2][4];–n≥3时,维数组无法在平面上表示其各元素的位置a[0]a[1]a[2]a[3]a[4]b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]2020/2/613/49【例】以下程序的运行结果是什么?intmain(){inta[][3]={{1,2,3},{4,5},{6},{0}};printf(%d,%d,%d\n,a[1][1],a[2][1],a[3][1]);return0;}123450600000结果:5,0,0【例】若inta[][3]={1,2,3,4,5,6,7},则a数组的第一维大小是多少?123456700二维数组的初始化2020/2/614/49数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相同长度的存储单元根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区用sizeof(a)来获得数组a所占字节数short2020/2/615/49shortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放先顺序存放第0行元素,再存放第1行元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]需知道数组每行列数才能从起始地址开始正确读出数组元素二维数组的存储结构2020/2/616/49二维数组实例【例8.4】从键盘输入某年某月(包括闰年),编程输出该年的该月拥有的天数2020/2/617/498.3向函数传递一维数组传递整个数组给另一个函数,可将数组的首地址作为参数传过去–用数组名作函数参数–只复制一个地址自然比复制全部数据效率高–由于首地址相同,故实参数组与形参数组占用同一段内存–在该函数内,不仅可以读这个数组的元素,还可以修改它们2020/2/618/49简单变量和数组作函数参数的区别2020/2/619/49【例8.5】计算平均分计数控制的循环2020/2/620/49【例8.5】计算平均分计数控制的循环2020/2/621/49【例8.6】计算平均分当输入负值时,表示输入结束标记控制的循环——负值作为输入结束标记2020/2/622/49【例8.6】计算平均分当输入负值时,表示输入结束标记控制的循环——负值作为输入结束标记2020/2/623/49【例8.7】计算最高分#includestdio.h#defineN40intReadScore(intscore[]);intFindMax(intscore[],intn);intmain(){intscore[N],max,n;n=ReadScore(score);printf(Totalstudentsare%d\n,n);max=FindMax(score,n);printf(Thehighestscoreis%d\n,max);return0;}2020/2/624/49max(i=0)max(i=2)max(i=3)计算最大值算法2020/2/625/49假设其中的一个学生成绩为最高maxScore=score[0];对所有学生成绩进行比较,即for(i=1;in;i++){若score[i]maxScore则修改maxScore值为score[i]}打印最高分maxScore【例8.7】计算最高分2020/2/626/49【例8.7】计算最高分2020/2/627/498.4排序和查找排序(Sorting)算法–交换法排序–选择法排序2020/2/628/49交换法排序2020/2/629/49交换法排序2020/2/630/49【例8.8】交换法从高到低排序交换法排序for(i=0;in-1;i++){for(j=i+1;jn;j++){if(score[j]score[i])交换成绩score[j]和score[i]}}2020/2/631/49如何实现两数交换?temp=score[j];score[j]=score[i];score[i]=temp;tempscore[j]score[i]?70507050702020/2/632/49【例8.8】交换法从高到低排序voidDataSort(intscore[],intn)/*交换法排序*/{inti,j,temp;for(i=0;in-1;i++){for(j=i+1;jn;j++){if(score[j]score[i])/*从高到低*/{temp=score[j];score[j]=score[i];score[i]=temp;}}}}2020/2/633/49选择法排序k=1k=2k=0k=12020/2/634/49选择法排序k=3k=4k=3k=42020/2/635/49选择法排序选择法排序for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(score[j]score[k])记录此轮比较中最高分的元素下标k=j;}若k中记录的最大数不在位置i,则交换成绩score[k]和score[i],交换学号num[k]和num[i];}2020/2/636/49voidDataSort(intscore[],longnum[],intn)/*选择法*/{inti,j,k,temp1;longtemp2;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(score[j]score[k]){k=j;/*记录最大数下标位置*/}}if(k!=i)/*若最大数不在下标位置i*/{temp1=score[k];score[k]=score[i];score[i]=temp1;temp2=num[k];num[k]=num[i];num[i]=temp2;}}}2020/2/637/49【例8.8】成绩从高到低顺序2020/2/638/498.4排序和查找查找(Searching)算法–顺序查找–折半查找2020/2/639/49【例8.10】顺序查找学号intLinSearch(longnum[],longx,intn){inti;for(i=0;in;i++){if(num[i]==x){return(i);}}return(-1);}哈,找到了!事先不必排序2020/2/640/49【例8.11】折半查找学号哈,找到了!按升序排序10122101241012610128101302020/2/641/49【例8.11】折半查找学号唉,没找到!10122101241012610128101302020/2/642/49intBinSearch(longnum[],longx,intn){intlow,high,mid;low=0;high=n-1;while(low=high){mid=(high+low)/2;if(xnum[mid]){low=mid+1;}elseif(xnum[mid]){high=mid-1;}else{return(mid);}}return(-1);}找到时返回下标位置找不到时返回-1若未按学号排序,则如何修改程序?2020/2/643/49voidDataSort(intscore[],longnum[],intn)/*选择法*/{inti,j,k,temp1;longtemp2;for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(num[j]num[k]){k=j;/*记录最大数下标位置*/}}if(k!=i)/*若最大数不在下标位置i*/{temp1=score[k];score[k]=score[i];score[i]=temp1;temp2=num[k];num[k]=num[i];num[i]=temp2;}}}按学号由小到大排序2020/2/644/498.5向函数传递二维数组a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]实际传送的是数组第一个元素的地址short

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

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

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

×
保存成功