C程序设计自学辅导.ppt_第1页
C程序设计自学辅导.ppt_第2页
C程序设计自学辅导.ppt_第3页
C程序设计自学辅导.ppt_第4页
C程序设计自学辅导.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1,第4章数组及其应用,4.1一维数组4.2一维数组应用实例4.3二维数组4.4二维数组应用实例,2,4.1一维数组-参看书p101的4.5.2小节,4.1.1一维数组的说明及一般使用4.1.2一维字符数组与字符串,3,4.1.1一维数组的说明及一般使用,数组是同类型元素(分量)的有序组合体。元素的类型可以是C+语言中允许使用的任何一种数据类型(包括任何用户自定义类型)。数组中的每个元素都有与其对应的下标以标明该元素在数组中的位置。对数组元素的访问通常借助于下标来进行,元素也被称为下标变量。每个数组元素(即下标变量)都可以当作单个变量来使用。具有一个下标的数组叫做一维数组,它是由n个同一类型数据组成的一维序列。按如下格式来说明一维数组。,4,说明一维数组,=其中的“”用于指出数组元素的类型,也称为数组类型。“”是一个标识符,是为数组起的名字,该名字还代表数组首元素的地址(指针概念,在以后介绍)。方括号中的“”用于指定数组的大小,它必须是一个整数或一个整型的常量表达式。“=”部分可有可无,若有的话,用于为数组元素置初值;其中的“”由一批以逗号分割的常量值所构成。,5,例如:inta10;,说明了一个一维数组,数组名为a,具有10个元素,元素类型为int。要访问a数组的各元素(分量),可通过使用下标变量a0,a1,a2,.,a9来实现(注意,规定下标总从0开始)。每一个下标变量ai的作用与一个int型简单变量所能起的作用相同。既是说,对int型简单变量可施加的运算与操作同样可施加到int型数组元素(分量)上。除整数外,下标处还可以使用一个整型表达式,表达式的值正是要指定的下标。如,a2*4+1,ai+1,aa1-3都是合法的下标变量。,6,对a数组元素(下标变量)进行使用:,inta10,i=1;a3=123;cina9;ai-1=a3+2*a2*4+1;couta9)couta9a9)”进行下标变量的比较运算等。,8,又如:,chararr120,arr280;floatfa115,fa26=1.2,35.6,-22,0.1,66,30;说明了两个char型一维数组arr1与arr2,大小分别为20和80;又说明两个float型一维数组fa1与fa2,大小分别为15和6,且为fa2数组赋了初值。,9,4.1.2一维字符数组与字符串,字符数组的元素为字符。除具有一般数组的特性外,它与字符串的使用有关联。字符串在内存中的存放形式是,按串中字符的排列顺序存放,每个字符占一个字节,并在末尾添加0作为结束标记。C+是靠一维字符数组来存放字符串的,一维字符数组在某些方面起到了字符串变量的作用。,10,但注意,一维字符数组与字符串还是有区别的。首先,字符串可以存放在字符数组中,但该字符数组中必须存储一个显式的0字符来作为字符串的结束标记。但反过来说,任一个字符数组不见得都是字符串,因为并不要求字符数组中必须存在0字符!,11,例如:,charcarr6=1,2,3,4,5;/carr为一般性字符数组charstr16=I,c,a,n;/str1为一般性字符数组charstr26=I,c,a,n,0;/使str2为字符串charstr36=Ican;/str3为字符串,12,coutcarr=;for(inti=0;i5;i+)/只输出数组前5个元素值coutcarri;coutendl;coutstr1=;for(i=0;i5;i+)/只输出数组前5个元素值coutstr1i;coutendl;coutstr2=str2endl;/对字符串直接输出coutstr3=str3”和“ai;cout=0;i-)/下标i从9起,递减变化到0coutai;coutendl;,17,4.2.2使用Eratosthenes筛法求1000以内的素数-参看书p112的4.6.4小节,先将11000放在一个数组sieve(看成是一个筛子)中;首先“留下”2(第一个素数),而后把2的倍数统统从数组sieve(筛子)中删去;再“留下”3(第二个素数),而后把3的倍数统统从数组sieve中删去;再往下是5,7,.。好象是一个筛子,把不需要的数逐步筛去,留下的正是所需要的各素数。所谓将某数从数组sieve(筛子)中删去,本程序实现时,是将数组中的该数“改写”为0。注意:具体实现与4.6.4小节的方法有所不同。,18,程序执行后的输出结果样式如下(每输出15个素数换一行):,2357111317192329313741434753596167717379838997101103107109113127131137139149151157163167173179181191193197877881883887907911919929937941947953967971977983991997,19,具体程序:,#includevoidmain()constintn=1000;intsieven+1;/筛子sievefor(intj=1;jn+1;j+)sievej=j;/放入数据inti=1,count=0;,20,while(in)i+;if(sievei!=0)/尚在筛中coutsetw(5)sievei;count+;if(count%15=0)coutendl;/每行15数for(intk=i;kn+1;k+=i)/消去倍数sievek=0;/if/whilecoutendl;/main,21,进一步改进,使用bool数组,#includevoidmain()constintn=1000;boolsieven+1;/筛子sievefor(intj=1;jn+1;j+)sievej=true;/放入数据/sievej为true意味着j在筛中inti=1,count=0;,22,while(in)i+;if(sievei)/i尚在筛中coutsetw(5)i;count+;if(count%15=0)coutendl;/每行15数for(intk=i;kn+1;k+=i)/消去倍数sievek=false;/if/whilecoutscorei;,26,floatsum=0;/放累加和的sum先置为0for(i=0;in;i+)sum+=scorei;/将n个学生的成绩累加到sum上cout.setf(ios:fixed);/设置以定点数格式输出数据cout.precision(1);/点后保留1位cout“Averagescore:”sum/nendl;/输出平均成绩cout.width(25);coutregister-numberscore;/输出“题头行”,27,/*通过“for(i=0;it;i+)”形式的循环,找出前t名最好成绩者,并输出其注册号及成绩。i=0的循环先使score0及index0处被交换成为第一名最好成绩者的成绩及注册号,而后输出;i=1的循环先使score1及index1处被交换成为第二名最好成绩者的成绩及注册号,而后输出;.,如此做法,直到找出前t名最好成绩者,并输出它们的相关信息。第i次的循环首先找出从scorei到数组末scoren-1中的最大者s,并记录其下标值到j1,而后将最大者scorej1掉换到scorei的位置上,当然还要将indexj1掉换到indexi的位置处,以使indexi总与scorei保持一一对应关系。*/,28,for(i=0;it;i+)/找出前t名最好者floats=scorei;/从i分量始score中的最大者sintj1=i;/j1中记录上述最大者的下标ifor(intj=i+1;jn;j+)/看还有否比s更大的if(si)/若scorei到scoren-1中的最大者/并非scorei时,要进行交换scorej1=scorei;scorei=s;/使scorei交换为最大inttmp=indexj1;/交换注册号indexj1=indexi;indexi=tmp;,30,cout.width(4);coutendli+1;/输出名次号(前t名的第i+1名)cout.width(11);coutindexi;/输出第i+1名学生的注册号cout.width(12);cout.precision(1);/点后保留1位coutscorei;/输出第i+1名学生的成绩/fori循环体结束couta01;a23=ai-1j-1+2*ai-1j;couta01)couta01endl;,35,说明了一个int型的二维数组a;向数组元素(下标变量)a00赋了值;通过cin输入下标变量a01的值;使用下标变量ai-1j-1及ai-1j参加运算,并将运算结果赋值给a23(下标可以是整型表达式);输出下标变量a23的值;下标变量还可进行比较运算。,36,又如:,floatfa11010,fa223=1.1,2.2,-3.3,4.4,-5.5,6.6;说明了两个float型二维数组fa1(10行10列)与fa2(2行3列),且为fa2数组赋了初值(使用给两个一维数组赋初值的形式)。也可使用如下的另一种格式为fa2数组赋初值“floatfa223=1.1,2.2,-3.3,4.4,-5.5,6.6;”。,37,chararr1320=12345,C+OK!,Icandoit!,arr21080;说明了两个char型二维数组arr1(3行20列)与arr2(10行80列),并给arr1数组赋了初值,从而使得arr10、arr11、arr12都成为具有了初值的字符串(注意字符串赋初值的方法)。for(inti=0;i3;i+)coutarr1iendl;/一次输出“一串”,38,上述for语句的执行将输出如下三行结果:12345C+OK!Icandoit!同理,具有三个下标的数组叫做三维数组,具有n个下标的数组叫做n维数组。通常,将二维以上的数组统称为多维数组。实际上,多维数组中最常用的只是二维数组。,39,4.4二维数组应用实例,4.4.1二维数组简单应用4.4.2二维字符数组4.4.3画一个四叶玫瑰线图形,40,4.4.1二维数组简单应用,设有4行4列的数组a,其元素aij=i+j。编程序,实现:1.求第二行4元素之和;2.求第三列4元素之平均值;3.求最大数,最小数及主对角线4元素的平方和。,41,使程序执行后的输出结果为:,0123123423453456-Theresult-sum_lin2=10ave_col3=3.5max_elem=6min_elem=0sum_diag=56,42,#includevoidmain()inta44,i,j;for(i=0;i4;i+)/为a数组赋值,并显示在屏幕上for(j=0;j4;j+)aij=i+j;coutaij;coutendl;/每4数占一行cout-Theresult-endl;,43,/1.求第二行4元素之和/(第二行元素为a1j(j=0,1,2,3))intsum_lin2=0;for(j=0;j4;j+)sum_lin2+=a1j;coutsum_lin2=sum_lin2endl;/2.求第三列4元素之平均值/(第三列元素为ai2(i=0,1,2,3))intsum_col3=0;for(i=0;i4;i+)sum_col3+=ai2;coutave_col3=sum_col3/4.0endl;,44,/3.求最大数,最小数及主对角线4元素的平方和intmax_elem=a00,min_elem=a00,sum_diag=0;/先认为a00为最大数max_elem、又为最小数min_elemfor(i=0;imax_elem)max_elem=aij;if(aijmin_elem)min_elem=aij;if(i=j)sum_diag+=aij*aij;/行列下标相等时,aij为主对角线元素coutmax_elem=max_elemendl;coutmin_elem=min_elemendl;coutsum_diag=sum_diagendl;,45,4.4.2二维字符数组,寻找若干行(字符串)中的最长行并进行某些统计:从键盘输入n个字符串(每串为一行,不超过80个字符,且输入时以回车结束每一行)先存放在一个二维字符数组中。而后统计出每一行中大写字母的出现次数,并找出这些行中的最长行。,46,程序执行后,屏幕显示结果可为:,-Input4strings-Hello!ABCabc.1234567890OK!OK!ookk!+*-/%abcdeWearestudents.NK2004.-Theresult-count0=4count1=4count2=0count3=3maxLenLine:1234567890OK!OK!ookk!,47,数据部分概要:,constintn=4;/定义常量n,共输入并处理n行字符charstrn81;/str为char型二维数组,用于盛放输入的n行字符/(每行最多放80字符另加一结束符)intcountn;/使用count数组元素记录各行大写字母的出现次数/对应关系为:counti记录第i行中的大写字母个数charmaxLenLine81=0;/盛放最长行,初始化为“空”,48,处理部分概述:,输入n行字符(每行以回车为结束),依次放于一维字符数组stri中(注意,stri为二维字符数组str的一行),并将记录每行大写字母出现次数的counti均置为0(作累加单元用)。编制循环,依次处理已放在str0、str1、.、strn-1中的那n行字符-某行长度超过当前maxLenLine之长度时更换maxLenLine,并从头到尾寻找各行的大写字母且将累加次数放于counti之中。输出统计出的各行大写字母个数,并输出最长行。,49,#include/use“setw”#include/use“gets”#include/use“strlen”voidmain()constintn=4;/共输入并处理n行charstrn81,ch;/str数组,盛放n行字符charmaxLenLine81=0;/盛放最长行,初始化为“空”intcountn,i,j;/counti记录第i行的大写字母个数for(i=0;in;i+)counti=0;/将count初始化(累加次数用)cout-Inputnstrings-endl;for(i=0;in;i+)/共输入n行gets(stri);/放于一维数组stri中,50,for(i=0;istrlen(maxLenLine)strcpy(maxLenLine,stri);/更新最长行for(j=0;j=A/输出最长行,51,4.4.3画一个四叶玫瑰线图形-参看书p109的4.6.3小节,实现概述:1.四叶玫瑰线图形的极坐标方程为:p=a*sin(2*angle)其中,angle为极角,变化范围从0度到360度;a为常数,表示所画四叶玫瑰线图形中,矩极点的最长距离;p为极径,与变化范围内的极角angle有上述极坐标方程的关系。,52,2.在“文本模式”的“字符屏幕”上“画图”的通常实现方法:,(1)将“字符屏幕”与程序中的一个二维字符数组建立对应关系。如,本程序的rose数组就对应于欲显示的“字符屏幕”,其中的rose00表示“字符屏幕”的左上角点,而roseyx则表示“字符屏幕”的第y+1行第x+1列的那一个点(y值即行号由上往下扩展,x值即列号由左往右扩展)。(2)将二维字符数组的各元素均置为“空”(对应于一个“空白字符屏幕”)。(3)按某种计算方法(或计算公式)算出应该在“字符屏幕”的哪些位置处“画点”(通过往对应字符数组的某些元素处置“*”符号来完成)。(4)将已准备好的当前字符数组显示到“字符屏幕”上(在“字符屏幕”上“画”出了所需图形)。,53,3.本例的具体实现方法:,把360度分为足够多的若干份(本例分为128份),在每个分定的角度angle处,按照上述的极坐标方程,计算出每一个对应的函数值p(即极径),从而得到平面上的一批点;将这批平面点对应到“字符屏幕”上(相应的rose数组中),并将每一个点用一个字符“*”来表示并显示到屏幕上(“字符屏幕”上的其他点均显示为“空”)。,54,#include#include/use“sin”、“cos”main()constintmaxY=22;/“字符屏幕”的最大行数(书中为25)constintmaxX=70;/“字符屏幕”的最大列数(书中为80)constfloatpai=3.14159,a=12.0;/a表示所画图形中,矩极点的最长距离(书中为16.0)constintaspect=2;/屏幕字符“高:宽”为2:1,生成曲线时,每点的x要乘以2,55,floatangle,p;/angle表示极角,p表示极径intx,y;/x,y用于表示屏幕坐标charrosemaxYmaxX;/roseyx表示“字符屏幕”y+1行x+1列的那一个点for(y=0;ymaxY;y+)/设置“空白字符屏幕”for(x=0;xmaxX;x+)roseyx=;/各数组元素字符均置为空格constintnn=128;/把360度分为nn份(所画图形由nn=128个点构成),56,for(inti=0;inn;i+)/计算nn=128个“屏幕点”a

温馨提示

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

评论

0/150

提交评论