您好,欢迎访问三七文档
第6章数组2019/12/192内容提要数组类型;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;使用字符串处理函数处理字符串2019/12/193数组的用处保存大量同类型的相关数据–如矩阵运算,表格数据等2019/12/194数组(Array)inta[10];–定义一个有10个元素的数组,每个元素的类型均为int–使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素。它们与普通变量没有任何区别–系统会在内存分配连续的10个int空间给此数组–数组下标可以是整型表达式–直接对a的访问,就是访问此数组的首地址a数组首地址a[9]a[8]a[7]a[1]a[0]…2019/12/195一维数组的定义类型说明符数组名[常量表达式]intx[10];//定义的整型数组a含10个元素floatb[20];//定义的实型数组b含20个元素指明数组元素的数据类型指明数组所含的元素个数定义方式:不接受变量表达式!2019/12/196一维数组的初始化1.定义时初始化方法:将初值依此写在花括号{}内。如:inta[5]={2,4,6,8,10};存储形式:2019/12/197数组的初始化数组定义后的初值仍然是随机数,一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0,0,0,0,0};或inta[5]={0};inta[]={11,22,33,44,55};数组大小最好用宏来定义,以适应未来可能的变化–#defineSIZE10inta[SIZE];数组大小定义好后,将永远不变inta[5]={2,4};//只给前两个元素赋初值,后三个元素值为02019/12/198二维数组的定义格式:数据类型数组名[常量表达式][常量表达式]intb[2][3];b为2×3(2行3列)的数组,注意下标范围b[0]b[1]b----b[0][0]b[0][1]b[0][2]----b[1][0]b[1][1]b[1][2]2019/12/199二维数组的存储结构intb[2][3];b[0]b[1]b[1][0]b[1][1]b[1][2]b[0][0]b[0][1]b[0][2]存放顺序:按行存放,先顺序存放第一行的元素,再存放第二行的元素2019/12/1910二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)intb[2][3],i,j;输入方法:输入第i行第j列元素:scanf(“%d”,&a[i][j]);输入整个数组元素:for(i=0;i2;i++)for(j=0;j3;j++)scanf(“%d”,&a[i][j]);输出方法:输出第i行第j列元素:printf(“%d”,a[i][j]);输出整个数组元素:for(i=0;i2;i++)for(j=0;j3;j++)printf(“%d”,a[i][j]);2019/12/1911数组的使用数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i++)a[i]=2*i;下标越界是大忌!–使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小2019/12/1912只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf(%d,&a[i]);输入整个数组元素:for(i=0;i10;i++)scanf(%d,&a[i]);输出方法:输出第i个数组元素:printf(%d,a[i]);输出整个数组元素:for(i=0;i10;i++)printf(%d,a[i]);一维数组的输入和输出2019/12/1913例6.1兔子生崽问题Fibonacci数列–1,2,3,5,8,13,21,34,55,89,144,233,…)3()2(1)1(12121nnnnnnfffff2019/12/1914例6.1#includestdio.h#defineYEAR_MONTH12main(){intf[YEAR_MONTH+1]={0,1,2};intmonth;for(month=3;month=YEAR_MONTH;month++){f[month]=f[month-1]+f[month-2];}for(month=1;month=YEAR_MONTH;month++){printf(%d\t,f[month]);}printf(\nsum=%d\n,f[YEAR_MONTH]);}2019/12/1915一维数组程序举例例:用数组来处理Fibonacci数列问题。voidmain(){inti,f[20]={1,1};//数列的前两项赋初值for(i=2;i=19;i++)f[i]=f[i-1]+f[i-2];for(i=0;i=19;i++){if(i%5==0)printf(\n);//每行输出5个数printf(%7d,f[i]);}printf(\n);}2019/12/1916程序举例例读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)若maxx[i],令max=x[i]若minx[i],令min=x[i]3.输出:max和min#includestdio.h#defineSIZE10main(){intx[SIZE],i,max,min;printf(Enter10integers:\n);for(i=0;iSIZE;i++){printf(%d:,i+1);scanf(%d,&x[i]);}max=min=x[0];for(i=1;iSIZE;i++){if(x[i]max)max=x[i];if(x[i]min)min=x[i];}printf(Maximumvalueis%d\n,max);printf(Minimumvalueis%d\n,min);}2019/12/1917例6.2—打印出最高分及其学生序号从键盘输入学生人数n;从键盘输入所有学生的学号和成绩分别存入数组num和score假设其中的一个学生成绩为最高,同时记录其学号,即令maxScore=score[0]maxNum=num[0];对所有学生成绩进行比较,即for(i=0;in;i++){若score[i]maxScore,则修改maxScore值为score[i],并记录其学号maxNum=num[i];}打印最高分maxScore及其学号maxNum;2019/12/1918#includestdio.h#defineARR_SIZE40main(){floatscore[ARR_SIZE],maxScore;intn,i;longmaxNum,num[ARR_SIZE];printf(Pleaseentertotalnumber:);scanf(%d,&n);printf(Pleaseenterthenumberandscore:\n);for(i=0;in;i++){scanf(%ld%f,&num[i],&score[i]);}maxScore=score[0];maxNum=num[0];for(i=1;in;i++){if(score[i]maxScore){maxScore=score[i];maxNum=num[i];}}printf(maxScore=%.0f,maxNum=%ld\n,maxScore,maxNum);}2019/12/1919数组名作函数参数(地址传递)用数组名作参数,就是将数组的首地址传递给函数实参数组与形参数组占用同一段内存在函数中可对形参数组元素修改的结果,会影响结果主调函数中的实参数组2019/12/1920#includestdio.h#defineARR_SIZE40floatFindMax(floatarr[],intn);main(){floatscore[ARR_SIZE],maxScore;intn,i;printf(Pleaseentertotalnumber:);scanf(%d,&n);printf(Pleaseenterthescore:\n);for(i=0;in;i++){scanf(%f,&score[i]);}maxScore=FindMax(score,n);printf(maxScore=%.0f\n,maxScore);}floatFindMax(floatarr[],intn){floatmax;inti;max=arr[0];for(i=1;in;i++)if(arr[i]max)max=arr[i];returnmax;}2019/12/1921voidFindMax(floatarr[],intnum[],intn,int*maxi,float*max){inti;*maxi=num[0];*max=arr[0];for(i=1;in;i++){if(arr[i]*max){*max=arr[i];*maxi=num[i];}}}#includestdio.h#defineARR_SIZE40//floatFindMax(floatarr[],intn,*maxi,*maxScore);main(){floatscore[ARR_SIZE],maxScore;intn,i,num[ARR_SIZE],maxi;printf(Pleaseentertotalnumber:);scanf(%d,&n);printf(Pleaseenterthenumandscore:\n);for(i=0;in;i++){scanf(%d%f,&num[i],&score[i]);}FindMax(score,num,n,&maxi,&maxScore);printf(maxi=%d,maxScore=%.0f\n,maxi,maxScore);}2019/12/1922简单变量作函数参数实参实参实参主调函数被调函数形参形参形参调用时执行被调函数从被调函数返回变量值变量值变量值变量值变量值变量值修改未变化2019/12/1923数组作函数参数实参实参实参主调函数被调函数形参形参形参调用时执行被调函数从被调函数返回地址值地址值地址值地址值……地址值地址值…修改已改变数组2019/12/1924交换法排序交换法排序for(i=0;in-1;i++){for(j=i+1;jn;j++){if(score[j]score[i])交换成绩score[j]和score[i],交换学号num[j]和num[i];}}2019/12/1925交换法排序2019/12/1926交换法排序实例#includestdio.h#includestdlib.hmain(){inta[11],i,j,t;printf(Input10numbers:\n);for(i=1;i11;i++)a[i]=1+rand()%100;printf(\n);for(i=1;i=9;i++)for(j=i+1;j=10;j++)if(a[j]a[i]){t=a[i];a[i]=a[j];a[j]=t;}printf(Thesortednumbers:\n);for(i=1;i11;i++)printf(%d,a[i]);}2019/12/1927选择法排序选择法排序for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++){if(score[j]score[k])记录此轮比较中最高分
本文标题:第6章数组.
链接地址:https://www.777doc.com/doc-2111108 .html