第4章a_基本控制结构和导出数据类型.ppt_第1页
第4章a_基本控制结构和导出数据类型.ppt_第2页
第4章a_基本控制结构和导出数据类型.ppt_第3页
第4章a_基本控制结构和导出数据类型.ppt_第4页
第4章a_基本控制结构和导出数据类型.ppt_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

1,第4章基本控制结构与导出数据类型,4.1控制语句、复合语句和空语句4.2分支语句4.3循环语句4.4转向语句。,2,4.1控制语句、复合语句和空语句,简单的计算器#includeiostream.hvoidmain()intx,y;cout“firstinteger:”;cinx;/输入一个整数coutendl“Secondinteger:”;ciny;/输入一个整数coutendlx+y=x+yb)coutb?a:b;注意,if句中所含的“”(或“”或“”)可以是任意语句,如,一个复合语句或者又是一个if语句等。,13,例3,若int型变量x的值小于y的值时,则将x与y的值互换;否则,将x与y的值各加上100。if后的“”为一个复合语句。复合语句以左花括号“”开始,以右花括号“”结束,花括号中为一个语句序列(或称语句组)。复合语句在逻辑上属于一个语句(参看书p86的4.1.3小节)。,14,if(xt;/温度值tcincorf;/摄氏或华氏的字母,22,if(corf=c|corf=C)tc=t;tf=t*fac+inc;elseif(corf=f|corf=F)tf=t;tc=(t-inc)/fac;else/字母输入有错!tc=tf=0;/将tc及tf均置为0coutThetemperatureis:;couttcC=tfFn;,23,思考题:,如下程序执行后的输出是“i!=5,OK!”呢?还是“i=5,jvoidmain()inti=66,j=99;if(i=5)couti=5,;elsecouti!=5,;if(j8);coutj8,;coutOK!endl;,24,注意,1比较相等的运算符“=”和进行赋值的运算符“=”的使用区别。2.if语句中,作为条件的表达式结果值非0时,意味着条件成立呢,还是不成立?3“空语句”的表现形式及使用含义。,25,2用于多分支的switch语句,switch语句又称开关选择语句或分情况语句,它是一种多分支选择语句。该语句的使用格式如下:switch()case:case:.case:default:,26,紧随switch后括号中的“”给出进行分支的条件,它必须是一个整型、字符型或枚举型的表达式。关键字case用于引出一个分支。case后的各“”均为switch后“”的一个可能值(两者的类型应该相同)。实际上,每个“case:”都只起一个语句标号的作用。,27,执行过程为:,若switch后“”的取值恰与某个“”的值相同,则直接跳转到“case:”后的那一分支的起始点处去执行(直到遇到break语句或者遇到了switch语句体的右花括号后结束本switch句)。若“”的值与任一个“”的值都不相同,那么:若有default分支,则跳转到“default:”后的那一分支的起始点处去执行,否则什么都不执行(而结束本switch句)。,28,例1.,若int型变量i=2,执行下述switch语句后,将输出“i=2”以及”i=2”两行;若i=5,则什么也不输出(而结束该switch句);若i=1时,要输出3行“i=1”。switch(i)case1:couti=iendl;case2:couti=iendl;case3:couti=iendl;,29,注意,执行switch时,要从分支起始点处开始执行,直到遇到break语句或者遇到了switch语句体的右花括号后才结束本switch语句。思考:若在上述三个“couti=iendl;”后各加一个“break;”语句的话,又将如何呢?,30,例2.,若int型变量score=86,执行下述switch语句后,将输出“grade=B”;若score处于90到100之间,将输出“grade=A”;.;若score/10不处于6到10之间(如,score为59,0,123,-12等),将输出“grade=E”。,31,switch(score/10)case10:/值为10与9的分支合为一体case9:coutgrade=Aendl;break;case8:coutgrade=Bendl;break;case7:coutgrade=Cendl;break;case6:coutgrade=Dendl;break;default:coutgrade=Eendl;,32,若将上述switch语句作为下述if语句之else后的一个分支句的话,则将只对0100间的数进行处理。if(score100)coutERROR!y;coutop;,37,switch(op)/根据运算符op的值来进行多分支处理case+:coutx+y=x+yendl;break;case-:coutx-y=x-yendl;break;case*:coutx*y=x*yendl;break;,38,case/:if(y=0)/分母为0时的处理coutoverflow!endl;elsecoutx/y=x/yendl;break;case%:if(y=0)/分母为0时的处理coutoverflow!endl;elsecoutx%y=x%yendl;break;default:coutWrong!1)/sum初值为0(“sum雪球”从0滚起)sum=sum+1;/在原sum值(0)的基础上加上1/(“sum雪球”滚了一圈,sum=0+1)sum=sum+2;/在原sum值(0+1)的基础上又加上2/(“sum雪球”又滚了一圈,sum=0+1+2)sum=sum+3;/继续滚“sum雪球”sum=sum+4;/“sum雪球”继续滚,sum=0+1+2+3+4sum=sum+5;/再滚一圈后,sum=0+1+2+3+4+5coutsum=sumendl;/显示出结果:sum=15,45,注意上述程序片段中间的5个语句,其一般形式为“sum=sum+i;”,只不过i的取值依次为1,2,3,4,5。这正是形成循环的基础,从1累加到100的循环实现思想也完全相同。主体程序部分如下:inti=1,sum=0;while(i=100)/当i值小于等于100,就继续循环sum=sum+i;i=i+1;/逐次使i增1,对能否继续循环有影响coutsum=sumxy;./对所输入的x与y进行处理coutcont;/不想再继续时,输入非“Y”字符,48,注意变量cont的作用:存放用户输入的是否要继续进行处理的“回答”字符,只要其值为大小写的“Y”字母时就继续循环。或者说,一旦用户不想再处理另外的数对x、y时,就为变量cont输入一个非大小写字母“Y”的其他任意字符。,49,简单的计算器程序_2,对“3.4简单的计算器程序_1”进行改进,使用户执行一次该程序,就可以进行任意多次所给两个数的指定运算。例如,可设计输入输出界面如下:Pleaseinput=xyop:22100+22+100=122Doyouwanttocontinue?(yorn)yPleaseinput=xyop:154/15/4=3Doyouwanttocontinue?(yorn)n,50,可循环进行处理:输入两个整数x、y,然后输入运算符op(+,-,*,/,%),程序负责计算出结果(通过switch根据输入的op值进行多分支处理)并显示;直到用户要求不再继续(而结束循环)。程序“构架”如下(其他缺省部分作为练习自己补充):#includevoidmain()intx,y;charop,cont=Y;,51,while(cont=Y|cont=y)coutxyop:;cinxyop;switch(op)case+:case-:coutcont;,52,2用于循环的do-while语句-,do-while语句是另一种形式的循环语句。它也可以使由该语句的循环体指定的那些操作重复执行若干次(甚至无限多次)。do-while语句的格式如下:dowhile();,53,do后的“”是要被重复执行的所谓循环体,它通常是一个复合语句。紧随while后括号中的“”给出循环是否要继续执行的条件,它通常是一个关系或逻辑表达式。do-while语句的执行过程:先执行一遍由“”所指定的循环体;而后计算while后“”的值,若为0(假)则退出循环(结束do-while语句),否则(条件为真时)返回do处继续循环。可以看出,do-while语句的循环体至少要被执行一遍(这一点与while语句不同)。,54,例.求sum=1+2+3+.+100的累加和。,主体程序部分如下:inti=1,sum=0;/循环变量i的初值为1,随循环而增值dosum=sum+i;i=i+1;while(i=100);/当i值小于等于100继续循环coutsum=sum100)break;”来实现,break强制中断当前的循环,而跳转到循环体的下一语句开头处去执行)。,78,形式五:,for(inti=1,sum=0;i”除实现sum累加外,还负责将循环变量i加1(注意“sum+=i+;”等价于“sum=sum+i,i=i+1;”的功能)。注:还可编写出其它的形式,如,只省略“”或只省“”等。,79,例2.读下述程序,注意其中的三个for循环语句以及所累加出的三个不同的sum结果。,#includevoidmain()inti,x,sum=0;for(i=1;i=10;i+)sum+=2;coutsum=sumendl;/输出:“sum=20”sum=0;for(i=1;i=10;i+)sum+=i;coutsum=sumx;sum+=x;coutsum=sum1;j-)/也可“for(j=2;j=i-1;j+)”if(i%j=0)/若i有因子jisprime=0;/断言i非素数break;/跳出循环结束for语句,84,if(isprime)coutiisaprime.endl;elsecoutiisnotaprime.max)max=x;/新输入的数比目前的max更大,更新maxif(xmin)min=x;/新输入的数比目前的min还小,更新min/foricoutmax=maxendl;coutmin=minendl;/main,89,实例3.输出三角函数表-,输出从0到90度之间每隔15度的正弦、余弦以及正切函数值。程序执行后的输出结果设计为:Anglexsin(x)cos(x)tan(x)00.00001.00000.0000150.25880.96590.2679300.50000.86600.5774450.70710.70711.0000600.86600.50001.7321750.96590.25883.7321901.0000-0.0000-,90,求解方法与注意点:,(1)使用如下形式的循环语句来实现问题求解for(intdoa=0;doa=90;doa+=inteval)其中,doa表示度数,从0开始,增量15,直到90。即,从0开始,每隔15度计算出正弦,余弦以及正切函数值并输出。(2)通过直接调用标准库函数sin、cos、tan来求各函数值,但要包含头文件“math.h”。(3)调用三角函数时,实参必须用弧度。程序中要首先将度数doa化为弧度arc:arc=pai*doa/180。(4)程序中靠“cout.setf(ios:fixed);”来设置以定点数格式输出数据,而使用“cout.precision(4);”可使小数点后保留4位数据。,91,#include#includevoidmain()constfloatpai=3.1416;/有名常量paiconstintinteval=15;/15度为计算间隔/下述8句用于输出标题行(第一行)cout.width(10);coutAnglex;cout.width(10);,92,coutsin(x);cout.width(10);coutcos(x);cout.width(10);couttan(x);floatarc;/弧度值arccout.setf(ios:fixed);/设置以定点数格式输出数据/cout.flags(ios:fixed);/与上一句的功能完全相同cout.precision(4);/小数点后保留4位,93,for(intdoa=0;doa=90;doa+=inteval)/度数从0开始,增量15,直到90arc=pai*doa/180;/化为弧度arccoutendl;cout.width(10);coutdoa;/输出当前度数doacout.width(10);coutsin(arc);cout.width(10);coutcos(arc);cout.width(10);if(doa=90)cout-;/90度正切值特殊elsecouttan(arc);/非90度时coutendl;,94,实例4.打印乘法九九表(二重循环的例子),使程序执行后的输出结果具有如下“式样”:1*1=11*2=21*3=31*8=81*9=92*1=22*2=42*3=62*8=162*9=183*1=33*2=63*3=93*8=243*9=278*1=88*2=168*3=248*8=648*9=79*1=99*2=189*3=279*8=729*9=81,95,#include/use“setw”voidmain()for(inti=1;i=9;i+)for(intj=1;j=9;j+)couti*j=setw(2)i*j;coutendl;,96,求解方法与注意点:,(1)“for(i=1;i=9;i+)”使i循环体(一个复合语句)共执行9次,每次负责印出一行(该行的被乘数均为i)。(2)i循环体的复合语句被执行9次,意味着它所包含的两个子语句被顺序执行9次(注意,子语句1为“forj.”,它的循环体是其后的那一个“cout”;而再下一个“cout”则是“forj.”的“兄弟”,即复合语句内的第二个子语句,它被执行9次,实现9次“换行”)。(3)执行一次“forj.”,又要使它的循环体“cout”被执行9次。所以,受二重循环“fori.,forj.”控制的那一个cout语句共执行了9乘9即81次,每次负责印出一个i乘j的乘法项之值。,97,实例5.求1000以内的所有素数-,判断整数i是否为素数的方法:用2,3,.sqrt(i)依次去除i,若每一个数都除不尽i的话,则i为素数。程序执行后的输出结果样式可设计为(每10数占一行):2357111317192329313741434753596167717379838997101103107109113877881883887907911919929937941947953967971977983991997,98,实现要点与方法:,(1)使用循环判断从2到1000的每一个i是否为素数for(i=2;i=1000;i+)判断整数i是否为素数(若是则屏幕显示出i);(2)而要“判断整数i是否为素数”,使用“实例1”的方法(一重循环)来解决(从而使整个程序变为二重循环程序)。,99,#include/use“sqrt”#include/use“setw”voidmain()constintm=1000;inti,j,isprime,count=0;/count记录素数个数for(i=2;i=m;i+)/求2到m间的所有素数isprime=1;/先认为i是素数for(j=2;jsqrt(i);j+)if(i%j=0)isprime=0;,100,if(isprime)count+;coutsetw(5)i;if(count%10=0)coutendl;/每输出10个素数换1行/if/foricoutendl;,101,实例6.打印图形,下述程序执行后,将显示出利用符号“*”构成的某种图形。请阅读,并给出运行结果。#includevoidmain()inti,j;for(i=1;i=5;i+)/共印5行for(j=1;j=i;j+)/第i行时,先连续印i个“*”cout*;coutendl;/而后换行,102,for(i=1;i=5;i+)/共印5行/第i行时,印“*”前先空5-i格for(j=1;j=5-i;j+)cout;/而后连印2*i-1个“*”for(j=1;j=2*i-1;j+)cout*;coutendl;/最后换行,103,for(i=1;i=5;i+)/共印5行/第i行时,印“*”前先空i-1格for(j=1;j=i-1;j+)cout;/连续印5个“*”并换行cout*endl;,104,程序执行后的输出结果为:,*,105,点评:,1对某些字符“图形”,若能找出其构成规律(如各显示行与那一行所要显示字符的多少以及那些字符在屏幕的显示位置等),则可设法形成一个相呼应的循环程序,负责显示出那一具有规律性的“图形”。2使用类似的方法可显示出使用全“*”构成的各种“图形”:“上三角”,“下三角”,“梯形”,“菱形”,“平行四边形”等等。当然,“上三角”与“下三角”还可根据组成角度分为等腰或直角三角等,对其它图形也可进行进一步的划分。,106,4.4转向语句break、continue、goto及return语句-,C+提供了四种用于实现跳转的语句,分别是:用于从循环体或switch句体跳出的break语句;用于立即结束本次循环而去继续下一次循环的continue语句;用于跳转到本函数内某一语句标号处(去继续执行)的goto语句;以及用于立即从被调函数中返回到主调函数处的return语句。,107,1.break语句,用于无条件地从某个循环体(指for循环体、while循环体、do-while循环体)或swi

温馨提示

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

评论

0/150

提交评论