c语言程序设计第8章.ppt_第1页
c语言程序设计第8章.ppt_第2页
c语言程序设计第8章.ppt_第3页
c语言程序设计第8章.ppt_第4页
c语言程序设计第8章.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章数组类型,8.1一维数组8.2二维数组与多维数组8.3字符数组与字符串8.4重命名类型8.5程序设计举例,8.1一维数组,8.1.1一维数组的定义形式:类型标识符数组名常量;类型标识符描述的是数组分量的类型,是定义数组类型的基类型,可以是任何类型。数组名代表数组所占存储空间的首地址。常量表示数组的长度,即数组中分量的个数。,例如,定义数组,描述下列数据:(1)100个整数:intnum100;(2)1000个学生C语言课程的成绩:floatccj1000;(3)一年中每月的天数:intmonth12;(4)100种商品的价格:floatprice100;(5)500个字符类型的数据:charch500;,说明:(1)数组名命名规则和变量名命名规则相同,都遵循标识符命名规则。(2)数组的长度可以用符号常量描述,但不能用变量,C语言不提供动态数组。(3)数组以线性方式将数组分量依次存储,所占空间等于各分量所占空间之和,即数组分量个数乘以基类型数据所占空间。,8.1.2一维数组的引用,数组元素称为下标变量,下标变量通过数组名、下标表达式和中括号运算来描述。下标变量的形式为:数组名下标表达式例如,对以上定义的num数组、ccj数组,num数组的100个分量为num0、num1、numi、num99,每个分量存放一个整数,numi相当于一个int型变量;ccj数组的1000个分量为ccj1、ccj2、ccji、ccj999,每个分量对应一个学生的成绩,ccji相当于一个float型变量。,说明:(1)下标的取值范围从0到数组长度减1。(2)下标变量相当于基类型变量。(3)下标往往对应于循环控制变量,通过循环、通过下标的变化完成数组所有元素的操作,即整个数组的操作。(4)下标往往隐含有特定的含义。(5)对于下标出界,C语言不进行语法检查。,如果希望下标为i的分量对应第i个数据,可将定义数组的大小增1,如:intnum101;floatccj1001;100个整数用num数组的分量num1、num2、num1、num100描述,numi对应于第i个整数。1000个学生的C语言成绩用ccj数组的分量ccj1、ccj2、ccji、ccj1000描述,ccji对应于第i个学生的成绩。,8.1.3一维数组的初始化,初始化形式:存储类别类型数组名常量=常量1,常量2,常量n;初始化数据用花括号括起。,例如:(1)staticintmonth12=31,29,31,30,31,30,31,31,30,31,30,31;month0=31,month1=29,month2=31,month3=30,month4=31,month5=30,month6=31,month7=31,month8=30,month9=31,month11=30,month12=31(2)staticcharch5=a,e,i,o,u;ch0=a,ch1=e,ch2=i,ch3=o,ch4=u,说明:(1)对静态存储数组和外部存储数组,默认初值为0。(2)可以只给一部分数组元素初始化。例如:staticinta50=70,75,60,80,90;相当于a0=70,a1=75,a2=60,a3=80,a4=90,后面没有给出的数组元素之值全部为0。,(3)对数组中全部元素给定初值,可以不给定数组长度,它的长度为后面给出的初值个数。例如:staticfloatx=1.5,2.5,3.5,4.5,5.5;数组x有5个数组元素x0、x1、x2、x3、x4,长度为5。(4)若仅给部分数组元素赋值,则不能省略数组长度。,例81求10个数的最大值与最小值,10个数用数组描述。,/*程序81求10个数的最大值与最小值*/main()floata10;inti;floatmax=-1e20,min=1e20;for(i=0;imax)max=ai;if(aimin)min=ai;printf(最大值=%f,最小值=%f,max,min);,例82求某班50个学生C语言课程的平均成绩及每个学生与平均成绩之差。,/*程序8-2求C语言课程的平均成绩及每个学生与平均成绩之差*/main()floatccj51;/*C语言成绩数组*/inti;floattcj=0.0;floatav,cav51;/*平均成绩av,与平均成绩之差数组cav*/for(i=1;i=50;i+)/*输入每个学生成绩*/,printf(请输入第%d个学生成绩:,i);scanf(“%f”,&ccji);for(i=1;i=50;i+)/*求平均成绩*/tcj+=ccji;av=tcj/50;for(i=1;i=50;i+)/*求与平均成绩之差*/cavi=ccji-av;printf(C语言课程的平均成绩=%5.2fn,av);/*输出*/for(i=1;i=50;i+)printf(第%d个学生与平均成绩之差=%5.2n,i,cavi);,例8-3用一维数组求Fibonacci数列前20项,要求每行输出5个数。,/*程序8-3,求Fibonacci数列前20项*/main()staticinta20=1,1;/*存放Fibonacci数列前20项的数组*/inti;for(i=2;i20;i+)fi=fi-1+fi-2;printf(Fibonacci数列前20项如下:n);for(i=2;i20;i+)printf(%8d,fi);if(i%5=0)printf(n);/*if语句用来控制换行*/,/*程序8-3,求Fibonacci数列前20项*/main()staticinta20=1,1;/*存放Fibonacci数列前20项的数组*/inti;for(i=2;i20;i+)fi=fi-1+fi-2;printf(Fibonacci数列前20项如下:n);for(i=2;i20;i+)printf(%8d,fi);if(i%5=0)printf(n);/*if语句用来控制换行*/,运行结果:Fibonacci数列前20项如下:11235813213455891442333776109871597258441816765,8.1.4一维数组作函数参数,例8-4将例8-2中求C语言课程平均成绩改用函数实现。函数如下:floatavf(xcj)/*求C语言课程平均成绩*/floatxcj51;inti;floatsum=0.0,tav;for(i=1;i=50;i+)sum+=xcji;tav=sum/50;return(tav);,主函数中调用函数avf()来求平均成绩:av=avf(ccj);此时,实参数组为ccj,对应的形参数组为xcj,调用时将实参数组ccj首地址传递给形参数组xcj。请注意本例中数组的第一个分量ccj0、xcj0无意义。对形参数组可以不指定数组大小,在定义数组时数组名后跟空的中括号。在函数中另设一个参数,传递数组元素的个数。如此在函数中实现变相动态数组。,例8-5将上例中函数延伸考虑为求n个学生C语言课程平均成绩。函数如下:floatavf(xcj,n)/*求n个学生C语言课程平均成绩*/floatxcj,n;inti;floatsum=0.0,tav;for(i=1;i=n;i+)sum+=xcji;tav=sum/n;return(tav);,8.2二维数组与多维数组,8.2.1二维数组的定义,形式:类型标识符数组名常量1常量2;n维数组的定义形式:类型标识符数组名常量1常量2常量n;类型标识符描述的同样是数组分量的类型,是定义数组类型的基类型,可以是任何类型。数组名代表数组所占存储空间的首地址。常量分别表示数组相应维的长度,数组长度以及数组中分量个数分别等于常量1、常量2、常量n。,(1)上述100个班,每班50个学生一门课程的成绩,定义如下二维数组描述:floatcj10050;/*第一维对应班级,第二维对应学生*/(2)1000个学生,30门课程的成绩,定义如下二维数组描述:floatacj100030;/*第一维对应学生,第二维对应课程*/(3)上述某高校社会实践调查数据,定义如下三维数组描述:intb323;/*第一维对应年级,第二维对应性别,第三维对应交通工具*/,8.2.2二维数组的引用,下标变量的形式为:数组名下标表达式1下标表达式2多维数组下标变量的形式为:数组名下标表达式1下标表达式2下标表达式n例如,对以上定义的acj数组3000个分量分别为:acj00、acj01、acj029、acj10、acj11、acj129、acj9990、acj9991、acj99929,左边下标变化最慢,右边下标变化最快,右边下标变化一遍,左边下标才变化一次。每个分量对应一个学生一门课程的成绩,acjij相当于一个float型变量。,说明:(1)每个下标的取值范围从0到数组长度减1,下标变量同样相当于基类型变量。(2)对于多维数组整体操作的完成需用多重循环,一个下标对应于一重循环控制变量。二维数组的整体操作用两重循环完成,外重循环对应下标1,内重循环对应下标2。(3)其它类似于一维数组处理。,8.2.3二维数组的初始化,初始化形式:存储类别类型数组名下标1下标2=常量1,常量2,常量n;例如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;a00=1,a01=2,a02=3,a03=4,a10=5,a11=6,a12=7,a13=8,a20=9,a21=10,a22=11,a23=12,说明:(1)二维数组的初始化可以分行进行。例如,上面的a数组初始化还可以表示为:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;而定义4行3列的b数组可以表示为:staticintb43=1,2,3,4,5,6,7,8,9,10,11,12;(2)可以只对数组中部分元素初始化。例如:a00=1,a01=2,a10=5,a20=9,其它分量初值取默认值,为0。,(3)如果对二维数组中全部元素初始化,则定义数组时第一维的长度可以省略,但第二维的长度不能省略。例如:staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成staticinta4=1,2,3,4,5,6,7,8,9,10,11,12;但不能写成staticinta=1,2,3,4,5,6,7,8,9,10,11,12;因为两个维数都省略时,可以理解为1*12、12*1、3*4、4*3、2*6、6*2等多种形式,会发生混淆,故只能省略第一个维数。,(4)如果对二维数组按行进行初始化,则定义数组时第一维的长度也可以省略。例如:staticinta4=1,2,5,9;对于二维数组与多维数组作函数参数跟一维数组作函数参数类同处理,但对形参数组,只有第一维的大小可以省略,第二维及其它高维的大小均不能省略。,例8-6从键盘输入50个学生8门课程成绩,求每个学生的总成绩与平均成绩。,/*程序8-6,求总成绩及平均成绩*/main()floatcj519;inti,j;floattcj51,acj51;voidtcjf();voidacjf();for(i=1;i=50;i+)/*输入成绩*/printf(请输入第%d个学生8门课程成绩:,i);for(j=1;j=8;j+)scanf(%f,&cjij);,tcjf(cj,tcj);/*调用函数tcjf()求总成绩*/acjf(tcj,acj);/*调用函数acjf()求平均成绩*/printf(所求学生总成绩与平均成绩如下:n);/*输出处理结果*/for(i=1;i=50;i+)printf(第%d个学生总成绩=%6.2f,平均成绩=%5.2fn,tcji,acji);voidtcjf(xcj,xtcj)/*求总成绩函数*/floatxcj519,xtcj51;inti,j;for(i=1;i=50;i+)for(xtcji=0.0,j=1;j=8;j+)xtcji+=xcjij;voidacjf(xtcj,xacj)/*求平均成绩*/floatxtcj51,xacj51;inti;for(i=1;i=50;i+)xacji=xtcji/8;,例8-7编写程序,求两个34的整数矩阵之和。,/*程序8-7,求两个34的矩阵之和*/main()inta34,b34;inti,j;intc34;for(i=0;i3;i+)/*输入矩阵a*/for(j=0;j4;j+)scanf(%d,&aij);for(i=0;i3;i+)/*输入矩阵b*/for(j=0;j4;j+)scanf(%d,&bij);for(i=0;i3;i+)/*计算矩阵c*/for(j=0;j4;j+),cij=aij+bij;printf(所求和矩阵如下:n);/*输出处理结果*/for(i=0;i3;i+)/*输出矩阵c*/for(j=0;j=0&linei=a&linei=A&linei=Z)num1+;elsenum2+;printf(数字字符数=%d字母字符数=%d其它字符数=%d,num0,num1,num2);,例8-10求80个字符串中的最大者。,main()charstr8020;/*假定字符串的最大长度不超过20个字符*/inti;charmstr20;for(i=0;i0)strcpy(mstr,stri);printf(字符串中的最大者=%s,mstr);,8.4重命名类型,8.4.1重命名类型方法,一般形式:typedef已有类型新类型名;如:,(1)typedefintinteger;/*重命名整型*/integeri,j;,(2)typedefintCOUNT;/*命名一计数类型COUNT*/COUNTn1,n2;(3)typedefintNUM100;/*命名一整型数组类型NUM*/NUMn;(4)typedefcharSTRING81;/*命名一字符串类型STRING*/STRINGstr1,str2;(5)typedefstructintday;intmonth;intyear;DATE;/*命名一结构体类型DATE*/DATEdate1,date2;,8.4.2重命名类型的作用,有利于加强数据描述的针对性,增加程序的可读性。(2)有利于程序的通用和移植。(3)有利于减少程序书写的工作量。,8.4.3几点说明(1)用typedef只能对已有类型增加一个名字,而不能自己去创造一个新的类型。(2)用typedef可以对各种已有类型增加新的类型名,但不能用来定义变量。(3)重命名类型,可以将数组类型与数组变量分离开来。(4)重命名类型与编译预处理不同,是在编译时处理,实际上也并不是作简单的字符串替换。(5)常将一些常用的重命名类型单独放一文件中,需要时用include指令将它们包含至程序中。,8.5程序设计举例,例8-11求n个实数的和、积、最大值、最小值。,/*程序8-11,求n个数的和、积、最大值、最小值*/defineN100main()floataN;intn;inti;floatsf();floatmf();floatmax();floatmin();scanf(%d,&n);for(i=1;i=n;i+)scanf(%f,&ai);,printf(和=%8.3fn,sf(a,n);printf(积=%8.3fn,mf(a,n);printf(最大值=%8.3fn,max(a,n);printf(最小值=%8.3fn,min(a,n);floatsf(xa,xn)/*求和*/floatxa;intxn;inti;floats=0;for(i=1;i=xn;i+)s+=xai;return(s);,floatmf(xa,xn)/*求积*/floatxa;intxn;inti;floatm=1;for(i=1;ixak)k=i;return(xak);,floatmin(xa,xn)/*求最小值*/floatxa;intxn;inti,k=1;/*k存放最小值下标*/for(i=1;i=xn;i+)if(xaixak)k=i;return(xak);,例8-12给定一43的整数矩阵,求矩阵中最小值及最小值所在行、列号。,/*程序8-12,求矩阵中最小值及位置*/main()inta43;/*存放矩阵*/inti,j;intmin,row,col;/*存放最小值及最小值所在行、列号*/for(i=0;i4;i+)/*输入矩阵*/for(j=0;j3;j+)scanf(%d,&aij);row=0;col=0;min=a00;/*初始化最小值及最小值所在行、列号*/for(i=0;i4;i+)/*求最小值及最小值所在行、列号*/for(j=0;j3;j+)if(aijmin)min=aij;row=i;col=j;printf(最小值为%d,处在%d行%d列,min,row,col);,例8-13将n个实数由大到小排序。,voidsort1(a,n)/*选择排序函数*/floata;intn;intk,i,j;/*k最大值下标,i,j循环控制变量*/floatt;/*中间变量,用于两个数的交换*/for(i=0;iak)k=j;t=ai;ai=ak;ak=t;/*进行交换*/,算法二:冒泡排序。,voidsort2(a,n)/*冒泡排序函数*/floata;intn;inti;/*一轮比较的循环控制变量*/intflag;/*标志变量,为1有交换,为0无交换*/floatt;/*中间变量,用于两个数的交换*/doflag=0;/*先假定无交换,已排好序*/for(i=0;iai)t=ai;ai=ai+1;ai+1=t;/*进行交换*/flag=1;/*有交换,标志变量的值改变为1*/while(flag=1);,例8-14筛法求21000之间的所有素数。,/*程序8-14,筛法求2至1000之间的所有素数*/main()inta1000;/*筛子数组*/inti;intminp,double;/*minp筛选种子,double倍数*/intn=0;/*素数个数,用于输出格式控制*/for(i=2;i1000;i+)/*建立筛子*/ai=1;minp=2;/*筛选种子初始化*/while(minp500)/*完成整个筛选*/double=2*minp;/*倍数初始化*/,while(double1000)/*完成一轮筛选*/adouble=0;/*筛去当前倍数*/double+=minp;/*计算下一个倍数*/do/*计算下一轮筛选种子*/minp+;while(aminp=0);printf(2至1000之间的所有素数如下:n);for(i=2;i1000;i+)if(ai=1)printf(%6d,i);n+;if(n%5=0)printf(n);/*5个素数输出在一行*/,例8-15求101000之间的回文数。,/*程序8-15,求101000之间的回文数*/main()inti,x;inta8,j;intb,e;intflag;for(i=10;i0)aj=x%10;x/=10;j+;,flag=1;/*先假定i为完数*/b=0;e=j-1;while(bx)e=d;elseb=d;while(be&!KG-*4flag);if(flag=0)k=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论