《第3章程序的流程控制精选PPT.ppt》由会员分享,可在线阅读,更多相关《第3章程序的流程控制精选PPT.ppt(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章程序的流程控制第1页,本讲稿共65页本章内容n n流程控制概述n n顺序控制n n选择控制n n循环控制n n无条件转移控制n n程序设计风格第2页,本讲稿共65页流程控制概述n n表达式构成了数据处理的基本单位。n n当程序中有多个表达式时,就会面临:先计算哪一个表达式先计算哪一个表达式根据不同的情况计算不同的表达式根据不同的情况计算不同的表达式一个或几个表达式需要重复计算多次一个或几个表达式需要重复计算多次n n语句实现对程序执行流程的控制,包括:顺序控制:按书写次序执行。顺序控制:按书写次序执行。选择控制:根据条件选择执行。选择控制:根据条件选择执行。循环控制:重复执行。循环控制:
2、重复执行。第3页,本讲稿共65页C+语句的分类第4页,本讲稿共65页顺序控制n n按书写次序,从左到右、从上到下顺序执行。n n实现顺序控制的C+语句有:表达式语句表达式语句复合语句复合语句空语句空语句第5页,本讲稿共65页 表达式语句n n在在C+C+表表达达式式的的后后面面加加上上一一个个分分号号“;”就就可可以以构构成成表表达达式式语句,其格式为:语句,其格式为:;例如:例如:例如:例如:a+b*c;a+b*c;a b?a:b;a b?a:b;a+;a+;x=a|b&c;x=a|b&c;n n连续的多个表达式语句按它们的书写次序依次执行。连续的多个表达式语句按它们的书写次序依次执行。第6
3、页,本讲稿共65页较常使用的表达式语句 n n赋值n n自增/自减n n函数调用n n输入/输出例如x=a+b;/x=a+b;/赋值赋值x+;/x+;/自增自增f(a);/f(a);/函数调用函数调用cin a;/cin a;/输入输入cout b;/cout b;/输出输出 表达式语句程序例1表达式语句程序例2 2例1:编写一个程序,从键盘输入一个数,计算该数的平方、立方及平方根并输出 例2:编写一个程序计算a+2a+3a+的前n项的和第7页,本讲稿共65页复合语句n n复合语句是由一对花括号括起来的一条或多条语句,又称为块(block)。语法上,复合语句可看作是一个语句。其格式为:中的语句
4、可以是中的语句可以是任何任何的的C+C+语句,语句,其中包括其中包括数据定义数据定义和和声明语句声明语句。n n复合语句中的语句序列一般按照书写次序执行。n n复合语句一般作为函数体和结构语句的成分语句。第8页,本讲稿共65页复合语句举例 int a,b int a,b;cin a b;cin a b;int max;int max;if(a=b)/if(a=b)/选择语句选择语句选择语句选择语句max=a;max=a;else else max=b;max=b;cout max endl;cout max a b;cin a b;int max;int max;max=ab?a:b;max=
5、ab?a:b;cout max cout max endl;endl;将选择语句用一个语句完成将选择语句用一个语句完成第9页,本讲稿共65页空语句 n n根据程序设计的需要,在程序中的某些地方有时需要加上一些空操作,以方便其它流程控制的实现。n n空语句的格式为:;n n空语句不做任何事情,其作用是用于语法上需要一条语句的地方,而该地方又不需做任何事情。空语句常常作为结构语句的子句。第10页,本讲稿共65页n n例如:例如:.goto end;/.goto end;/转向下面由语句标号转向下面由语句标号endend标识的空语句标识的空语句.end:end:;/空语句空语句 其中,在其中,在“e
6、nd:;end:;”中,中,endend是一个语句标号,是一个语句标号,“;”是一个空语是一个空语句。句。n n再例如:再例如:int i,sum;int i,sum;for(sum=0,i=1;i=100;sum+=i,i+)for(sum=0,i=1;i=100;sum+=i,i+);其中,循环体为一条空语句其中,循环体为一条空语句第11页,本讲稿共65页选择控制n n在程序中,常常需要根据不同的情况来从一组语句中选择一个来执行(分支),这是通过选择语句来完成的。n n选择语句包括:ifif语句语句switchswitch语句语句第12页,本讲稿共65页 if 语句n nif语句(又称条件
7、语句)是根据一个条件满足与否来决定是否执行某个语句或从两个语句中选择一个语句执行。n nif语句有两种格式:if(if()if(if()else else 2其其中中的的、1、2必必须须是是一个一个语语句句!(复合!(复合语语句算一个句算一个语语句。)句。)第13页,本讲稿共65页 if语句的含义第一种格式第二种格式第14页,本讲稿共65页例3.3:从键盘输入三个整数,计算其中的最大值并将其输出#include#include using namespace std;using namespace std;int main()int main()int a,b,c,max;int a,b,c,
8、max;cout cout 请输入三个整数:请输入三个整数:请输入三个整数:请输入三个整数:endl;a b c;cin a b c;if(a b)if(a b)max=a;max=a;elseelsemax=b;max=b;if(c max)max=c;if(c max)max=c;cout cout 最大者为:最大者为:最大者为:最大者为:max endl;max b?a:b;max=ab?a:b;max=maxc?max:c;max=maxc?max:c;将选择语句其它语句替换将选择语句其它语句替换第15页,本讲稿共65页例3.4:求一元二次方程ax2+bx+c=0的实解分析分析:写程序
9、不等同于做数学题目,一定要考虑清楚各:写程序不等同于做数学题目,一定要考虑清楚各种可能的情况,这样才能保证程序的种可能的情况,这样才能保证程序的健壮性健壮性。在写该。在写该程序时,由于程序时,由于a a、b b、c c是由键盘输入,应该考虑情况有:是由键盘输入,应该考虑情况有:(1 1)a=0a=0,一元二次方程变成线性方程,一元二次方程变成线性方程(2 2)000,方程有两个实数解,方程有两个实数解具体程序如下:具体程序如下:程序一程序一求出方程所有解的程序如下:求出方程所有解的程序如下:程序二程序二第16页,本讲稿共65页if语句的锯齿格式n n为为了了提提高高程程序序的的易易读读性性,在
10、在写写ifif语语句句时时,最最好好采采用用“锯锯齿齿”格式。如格式。如格式一格式一n n如如果果ifif语语句句嵌嵌套套层层次次很很深深,“锯锯齿齿”格格式式将将会会使使得得程程序序正正文文严严重重偏偏向向右右边边,给给查查看看程程序序带带来来困困难难。可可以以把把ifif语语句句写写成成格格式二式二:格式二:格式二:格式二:格式二:if(.)if(.).else if(.)else if(.).else if(.)else if(.).elseelse .格式一:格式一:格式一:格式一:锯齿形锯齿形锯齿形锯齿形if(.)if(.).else else if(.)if(.).else els
11、e if(.)if(.).else else .n注意:Ifelse嵌套时,else与最近的if保持匹配第17页,本讲稿共65页例例5 5:从键盘输入一个三角形的三条边,判断其为何种三角形从键盘输入一个三角形的三条边,判断其为何种三角形#include#include using namespace std;using namespace std;int main()int main()int a,b,c;int a,b,c;cin a b c;cin a b c;if(a+b=c|b+c=a|c+a=b)if(a+b=c|b+c=a|c+a=b)cout cout 不是三角形不是三角形不是三
12、角形不是三角形;else if(a=b&b=c)else if(a=b&b=c)cout cout 等边三角形等边三角形等边三角形等边三角形;else if(a=b|b=c|c=a)else if(a=b|b=c|c=a)cout cout 等腰三角形等腰三角形等腰三角形等腰三角形;else if(a*a+b*b=c*c|b*b+c*c=a*a|c*c+a*a=b*b)else if(a*a+b*b=c*c|b*b+c*c=a*a|c*c+a*a=b*b)cout cout 直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰);elseelsecout cout 其
13、它三角形其它三角形其它三角形其它三角形;cout endl;cout endl;return 0;return 0;思考:思考:思考:思考:如何在程序中增加判断如何在程序中增加判断如何在程序中增加判断如何在程序中增加判断 等腰直角三角形的语句?等腰直角三角形的语句?等腰直角三角形的语句?等腰直角三角形的语句?第18页,本讲稿共65页方法一:方法一:else if(a*a+b*b=c*c|b*b+c*c=a*a|c*c+a*a=b*b)else if(a*a+b*b=c*c|b*b+c*c=a*a|c*c+a*a=b*b)if if(a=b|b=c|c=a a=b|b=c|c=a)cout co
14、ut 等腰直角三角形等腰直角三角形等腰直角三角形等腰直角三角形;else else cout cout 直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰);方法二:方法二:else if(a*a+b*b=c*c)&(a=b)|(b*b+c*c=a*a)&(b else if(a*a+b*b=c*c)&(a=b)|(b*b+c*c=a*a)&(b=c)|(c*c+a*a=b*b)&(c=a)=c)|(c*c+a*a=b*b)&(c=a)cout cout 等腰直角三角形等腰直角三角形等腰直角三角形等腰直角三角形;方法三:方法三:else if(a*a+b*b=c*c
15、|b*b+c*c=a*a|c*c+a*a else if(a*a+b*b=c*c|b*b+c*c=a*a|c*c+a*a=b*b)&=b*b)&(a=b|b=c|c=a)a=b|b=c|c=a)cout cout h2h1h2,时间,时间2 2在前;时在前;时h1h2,h1m2m1m2,时间,时间2 2在前;在前;m1m2m1s2s1s2,时间,时间2 2在前;在前;s1s2s1=90)if(score=90)cout cout=80&score=80&score 90)cout cout=70&score=70&score 80)cout cout=60&score=60&score 70)
16、cout cout 及格及格及格及格;if(score 60)if(score 60)cout cout=90)if(score=90)cout cout=80&score=80&score 90)cout cout=70&score=70&score 80)cout cout=60&score=60&score 70)cout cout 及格及格及格及格;elseelsecout cout 不及格不及格不及格不及格;说明:只会运行第一条说明:只会运行第一条if语句语句第21页,本讲稿共65页if 语句的歧义问题n nif(if()if()if()else else 2的含义的含义1.1.if
17、(if(表达式表达式1)1)if(if(表达式表达式2)2)else else 22.2.if(if(表达式表达式1)1)if(if(表达式表达式)1 else else 2n nC+C+规定:规定:elseelse子句与它前面最近的、没有子句与它前面最近的、没有elseelse子句的子句的if if配对。因此,上面的配对。因此,上面的if if语句解释为:语句解释为:if(if(表达式表达式1)1)if(if(表达式表达式2)2)else else 2 n n若要按若要按2 2来解释,则需要加上花括号(复合语句):来解释,则需要加上花括号(复合语句):if(if(表达式表达式1)if(1)i
18、f(表达式表达式2)2)else else 2第22页,本讲稿共65页switch 语句n n程序中有时需要从两个(组)以上的语句中选择一个(组)来执行。n nC+提供了一条多路选择语句:switch语句(又称开关语句),它能根据某个表达式的值在多组语句中选择一组它能根据某个表达式的值在多组语句中选择一组语句来执行。语句来执行。每一组语句的最后一个语句往往是每一组语句的最后一个语句往往是breakbreak语句。语句。第23页,本讲稿共65页例例7 7、从键盘输入一个星期的某一天(从键盘输入一个星期的某一天(0 0:星期天;:星期天;1 1:星期:星期一;一;.),输出对应的英语单词(),输出
19、对应的英语单词(if if语句实现)语句实现)采用采用if if语句实现:语句实现:程序程序缺陷:缺陷:多次对多次对dayday的值进行比较书写麻烦,可读性差的值进行比较书写麻烦,可读性差解决:解决:采用采用switchswitch语句实现,具体格式如下:语句实现,具体格式如下:switch(switch()case case:1 :case case:ndefault:default:n+1 注意:注意:switchswitch中的整型表达式可以是中的整型表达式可以是整型整型、字符型字符型和和枚举型,枚举型,casecase语句中的常量表达式也必须相语句中的常量表达式也必须相比配比配第24页
20、,本讲稿共65页例例8 8、从键盘输入一个星期的某一天(从键盘输入一个星期的某一天(0 0:星期天;:星期天;1 1:星期:星期一;一;.),然后输出其对应的英语单词),然后输出其对应的英语单词#include#include using namespace std;using namespace std;int main()int main()int day;int day;cin day;cin day;switch(day)switch(day)case 0:cout Sunday;break;case 0:cout Sunday;break;case 1:cout Monday;bre
21、ak;case 1:cout Monday;break;case 2:cout Tuesday;break;case 2:cout Tuesday;break;case 3:cout Wednesday;break;case 3:cout Wednesday;break;case 4:cout Thursday;break;case 4:cout Thursday;break;case 5:cout Friday;break;case 5:cout Friday;break;case 6:cout Saturday;break;case 6:cout Saturday;break;defaul
22、t:cout Input error;default:cout Input error;cout endl;cout endl;return 0;return 0;思考:思考:思考:思考:如何用字符串实现上述结果?如何用字符串实现上述结果?如何用字符串实现上述结果?如何用字符串实现上述结果?程序程序第25页,本讲稿共65页switch语句中使用break语句n n在执行switch语句的某个分支时,需要用break语句结束该分支的执行。n n在switch语句的一个分支的执行中,如果没有break语句(最后一个分支除外),则该分支执行完后,将继续执行紧接着的下一个分支中的语句序列。n nC+中
23、的switch语句比其它一些语言中的多路选择语句更具有灵活性。当若干个分支具有部分重复功能时,C+的switch语句可以节省代码量。第26页,本讲稿共65页switch(.)switch(.).case case 1:A Acase case 2:B Bcase case 3:C C;break;break;.n n上面的语句假设上面的语句假设A A、B B中没有中没有breakbreak语句,则语句,则分支分支1 1执行执行A A、B B和和C C;分支分支2 2执行执行B B和和C C;分支分支3 3执行执行C C。例例9 9:计算某年某月的天数计算某年某月的天数分析:分析:每年的每年的1
24、 1、3 3、5 5、7 7、8 8、1010、1212各有各有3131天,天,4 4、6 6、9 9、1111各有各有3030天,天,2 2月闰年月闰年2929天,其它年尾为天,其它年尾为2828天。天。闰年判断:年份能被闰年判断:年份能被4 4整除不能被整除不能被100100整除整除 程序程序第27页,本讲稿共65页循环控制 n n如何编程计算如何编程计算n!n!(n n是变量)?是变量)?n!=n*(n-1)*(n-2)*n!=n*(n-1)*(n-2)*.*2*1*2*1 表达式中不允许有表达式中不允许有“.”n n上面的问题需要用重复操作控制来解决:对相同的操作重复上面的问题需要用重
25、复操作控制来解决:对相同的操作重复执行多次,每一次操作的数据有所不同。执行多次,每一次操作的数据有所不同。f=1,f=1,对对i=2n,i=2n,重复执行:重复执行:f=f*i;f=f*i;n n循环循环语句为解决重复操作提供了一种途径。语句为解决重复操作提供了一种途径。n n循环一般由四个部分组成:循环一般由四个部分组成:循环初始化循环初始化 循环条件循环条件 循环体循环体 下一次循环准备。下一次循环准备。第28页,本讲稿共65页n nC+提供了三种实现重复操作的循环语句:whilewhile语句语句do-whiledo-while语句语句forfor语句语句第29页,本讲稿共65页whil
26、e 语句n nwhilewhile语句具有如下的格式:语句具有如下的格式:while(while()第30页,本讲稿共65页用while语句求n!#include#include using namespace std;using namespace std;int main()int main()int n;int n;cin n;cin n;int i=2,f=1;/int i=2,f=1;/循环初始化循环初始化循环初始化循环初始化while(i=n)/while(i=n)/循环条件循环条件循环条件循环条件 f*=i;f*=i;i+;/i+;/下一次循环准备下一次循环准备下一次循环准备下一
27、次循环准备 /循循循循环环环环体体体体cout factorial of n =f endl;cout factorial of n =f endl;return 0;return 0;第31页,本讲稿共65页do-while 语句do-whiledo-while语句的格式如下:语句的格式如下:do do while(while(););第32页,本讲稿共65页用do-while语句求n!#include#include using namespace std;using namespace std;int main()int main()int n;int n;cin n;cin n;int
28、 i=1,f=1;/int i=1,f=1;/循环初始化循环初始化循环初始化循环初始化do/do/循循循循环环环环体体体体 f*=i;f*=i;i+;/i+;/下一次循环的准备下一次循环的准备下一次循环的准备下一次循环的准备 while(i=n);/while(i=n);/循环条件循环条件循环条件循环条件cout factorial of n =f endl;cout factorial of n =f endl;return 0;return 0;第33页,本讲稿共65页for 语句forfor语句的格式如下:语句的格式如下:for(for(;)第34页,本讲稿共65页#include#in
29、clude using namespace std;using namespace std;int main()int main()int n,i,f;int n,i,f;cin n;cin n;for for(i=2,f=1 (i=2,f=1 /循环初始化循环初始化循环初始化循环初始化;i=n i=n /循环条件循环条件循环条件循环条件;i+)i+)/下一次循环准备下一次循环准备下一次循环准备下一次循环准备 f*=i;/f*=i;/循环体循环体循环体循环体cout factorial of n =f endl;cout factorial of n =f endl;return 0;retu
30、rn 0;用for语句求n!第35页,本讲稿共65页循环的种类n n计数控制的循环循环前就知道循环的次数,循环时重复执行循循环前就知道循环的次数,循环时重复执行循环体直到指定的次数环体直到指定的次数 n n事件控制的循环循环前不知道循环的次数,循环的终止是由循循环前不知道循环的次数,循环的终止是由循环体的某次执行导致循环的结束条件得到满足环体的某次执行导致循环的结束条件得到满足而引起的而引起的 第36页,本讲稿共65页三种循环语句的使用原则 n n三种循环语句在表达能力上是等价的,在解决某个具体问题时,用其中的一种可能会比其它两种更加自然。n n一般来说,计数控制的循环一般用计数控制的循环一般
31、用forfor语句;语句;事件控制的循环一般用事件控制的循环一般用whilewhile或或do-whiledo-while语句,语句,其中,如果循环体至少要执行一次,则用其中,如果循环体至少要执行一次,则用do-do-whilewhile语句。语句。由于由于forfor语句能清晰地表示语句能清晰地表示“循环初始化循环初始化”、“循环条件循环条件”以及以及“下一次循环准备下一次循环准备”,因此,一,因此,一些非计数控制的循环也用些非计数控制的循环也用forfor语句实现。语句实现。第37页,本讲稿共65页例例1313:计算从键盘输入的一系列整数的和,要求首先输入整:计算从键盘输入的一系列整数的和
32、,要求首先输入整数的个数。(计数控制的循环)数的个数。(计数控制的循环)#include#include using namespace std;using namespace std;int main()int main()int n;int n;cout cout n;cin n;cout cout 请输入请输入请输入请输入 n n 个整数:个整数:个整数:个整数:;int sum=0;int sum=0;for for(int i=1;i=n;i+)(int i=1;i a;cin a;sum+=a;sum+=a;cout cout 输入的输入的输入的输入的 n n 个整数的和是:个整数
33、的和是:个整数的和是:个整数的和是:sum sum endl;endl;return 0;return 0;i i的作用域的作用域的作用域的作用域第38页,本讲稿共65页例例1414:计算从键盘输入的一系列整数的和,要求输入以:计算从键盘输入的一系列整数的和,要求输入以-1-1结结束。束。(事件控制的循环(事件控制的循环 )#include#include using namespace std;using namespace std;int main()int main()int a,sum=0;int a,sum=0;cout cout a;cin a;while(a!=-1)while(
34、a!=-1)sum+=a;sum+=a;cin a;cin a;cout cout 输入的整数的和是:输入的整数的和是:输入的整数的和是:输入的整数的和是:sum endl;sum endl;return 0;return 0;思考:可以用思考:可以用思考:可以用思考:可以用forfor循循循循 环实现吗?环实现吗?环实现吗?环实现吗?第39页,本讲稿共65页思考:思考:forfor循环实现循环实现计算从键盘输入的一系列整数的和,计算从键盘输入的一系列整数的和,要求输入以要求输入以-1-1结束。结束。(事件控制的循环(事件控制的循环 )#include#include using namesp
35、ace std;using namespace std;int main()int main()int a,sum=0;int a,sum=0;cout cout a;a!=-1;cin a)for(cin a;a!=-1;cin a)sum+=a;sum+=a;cout cout 输入的整数的和是:输入的整数的和是:输入的整数的和是:输入的整数的和是:sum endl;sum endl;return 0;return 0;第40页,本讲稿共65页例例1515:从键盘接收字符,一直到输入了字符:从键盘接收字符,一直到输入了字符y(Y)y(Y)或或n(N)n(N)为为止。止。(事件控制的循环(事
36、件控制的循环 )#include#include#include#include using namespace std;using namespace std;int main()int main()char ch;char ch;cout cout ch;cin ch;ch=tolower(ch);ch=tolower(ch);while(ch!=y&ch!=n);while(ch!=y&ch!=n);if(ch=y)if(ch=y)cout Yes!n;cout Yes!n;elseelsecout No!n;cout No!n;return 0;return 0;第41页,本讲稿共65
37、页例16:判断键盘输入的数是否为素数方法一方法一:用键盘输入的数:用键盘输入的数n n分别除以分别除以2 2、3 3n-1n-1,有,有一个数能整除,则一个数能整除,则n n不是素数,否则不是素数,否则n n为素数。为素数。程序一程序一方法二方法二:用键盘输入的数:用键盘输入的数n n分别除以分别除以2 2、3 3sqrt(n)sqrt(n),有一个数能整除,则有一个数能整除,则n n不是素数,否则不是素数,否则n n为素数。为素数。程序二程序二方法三方法三:在方法二的基础上,被不能被:在方法二的基础上,被不能被2 2整除就不能整除就不能被被4 4、6 6、8 8等整除,减少除法计算次数。等整
38、除,减少除法计算次数。程序三程序三第42页,本讲稿共65页例17:求第n个费波那契(Fibonacci)数#include#include using namespace std;using namespace std;int main()int main()int n;int n;cin n;cin n;int fib_1=0;/int fib_1=0;/第一个第一个第一个第一个FibonacciFibonacci数数数数int fib_2=1;/int fib_2=1;/第二个第二个第二个第二个FibonacciFibonacci数数数数for(int i=3;i=n;i+)for(int
39、 i=3;i=n;i+)int temp=fib_1+fib_2;/int temp=fib_1+fib_2;/计算新的计算新的计算新的计算新的FibonacciFibonacci数数数数fib_1=fib_2;/fib_1=fib_2;/记住新的前一个记住新的前一个记住新的前一个记住新的前一个FibonacciFibonacci数数数数fib_2=temp;/fib_2=temp;/记住新的记住新的记住新的记住新的FibonacciFibonacci数数数数 cout cout 第第第第 n n 个费波那契数是:个费波那契数是:个费波那契数是:个费波那契数是:fib_2 endl;fib_2
40、 endl;return 0;return 0;第43页,本讲稿共65页循环优化问题n n算法的优化:减少循环次数n n避免在循环中重复计算不变的表达式第44页,本讲稿共65页#include#include using namespace std;using namespace std;int main()int main()int n;int n;cout cout n;cin n;/从键盘输入一个正整数从键盘输入一个正整数for(int i=2;in;i+)for(int i=2;in;i+)/循环:分别判断循环:分别判断2 2、3 3、.、n-1n-1是否为素数是否为素数 int j=
41、2;int j=2;while(j while(j i i&i%j!=0)&i%j!=0)/循环:分别判断循环:分别判断i i是否能被是否能被2 i-12 i-1整除整除 j+;j+;if(j=i)if(j=i)/i/i是素数是素数 cout i ;cout i ;cout endl;cout endl;return 0;return 0;注意:注意:注意:注意:1 1、上面的、上面的forfor循环中,偶数没有必要再判断它们是否为素数;循环中,偶数没有必要再判断它们是否为素数;2 2、上面的、上面的whilewhile循环没有必要到循环没有必要到i-1i-1,只需要到:,只需要到:sqrt(
42、i)sqrt(i)例19:编程求出小于n的所有素数(质数)第45页,本讲稿共65页#include#include#include#include using namespace std;using namespace std;int main()int main()int n;int n;cin n;cin n;/从键盘输入一个数从键盘输入一个数if(n 2)return-1;if(n 2)return-1;cout 2 ,;cout 2 ,;/输出第一个素数输出第一个素数for(int i=3;in;i+=2)for(int i=3;in;i+=2)/循环:分别判断循环:分别判断3 3、5
43、 5、.、是否为素数、是否为素数 int j=2;int j=2;while(j=while(j if(j sqrt(i)sqrt(i)/i/i是素数是素数 cout i ,;cout i ,;cout endl;cout endl;return 0;return 0;注意:注意:注意:注意:上面程序中的上面程序中的sqrt(i)sqrt(i)被重复计算!被重复计算!例19:编程求出小于:编程求出小于n的所有素数(质数)(续)的所有素数(质数)(续)第46页,本讲稿共65页.int j=2,k=sqrt(i);while(j k)/i是素数。.注意:对有些循环优化,编译器能实现!第47页,本讲
44、稿共65页转移控制 n n除了有条件的选择语句(if和switch)外,C+还提供了转移语句:breakbreakcontinue continue gotogotoreturnreturn:第48页,本讲稿共65页break语句 n nbreak语句的格式:break;break;n nbreak语句的含义有两个:结束结束switchswitch语句的某个分支的执行语句的某个分支的执行 退出包含它的最内层循环语句(由于循环可以嵌套)退出包含它的最内层循环语句(由于循环可以嵌套)n n在在循循环环体体中中只只要要执执行行了了breakbreak语语句句,就就立立即即跳跳出出(结结束束)循循环环
45、,循循环环体体中中跟跟在在breakbreak语语句句后后面面的的语语句句将将不不再再执执行行,程程序继续执行循环之后的语句。序继续执行循环之后的语句。n n在在循循环环体体中中,breakbreak语语句句一一般般作作为为某某个个ifif语语句句的的子子句句,用用于实现进一步的循环控制。于实现进一步的循环控制。第49页,本讲稿共65页n n例如,判断i是否为素数的循环也可写成:j=2;k=sqrt(i);while(j=k)if(i%j=0)break;/退出循环j+;或for(j=2,k=sqrt(i);j=k;j+)if(i%j=0)break;第50页,本讲稿共65页continue语
46、句 n ncontinue语句的格式如下:continue;n ncontinue语句用在循环语句的循环体中,作用是:立即结束当前循环,进入下轮循环。对对于于whilewhile和和do-whiledo-while语语句句,continuecontinue语语句句将将使使控控制转到循环条件的判断;制转到循环条件的判断;对对于于forfor语语句句,continuecontinue语语句句将将使使控控制制转转到到:先先计计算算 3,然然后后计计算算 2,并并根根据据 2的结果决定是进入下一次循环还是结束循环。的结果决定是进入下一次循环还是结束循环。第51页,本讲稿共65页例21:从键盘输入一些非
47、零整数,然后输出其中所有正数的平方根。#include#include#include#include using namespace std;using namespace std;int main()int main()int n;int n;double square_root;double square_root;cout cout n;n!=0;cinn)for(cinn;n!=0;cinn)if(n 0)if(n 0)continuecontinue;/;/准备进入下一次循环准备进入下一次循环准备进入下一次循环准备进入下一次循环square_root=sqrt(n);square_
48、root=sqrt(n);cout n cout n 的平方根是:的平方根是:的平方根是:的平方根是:square_root endl;square_root endl;return 0;return 0;continuecontinue语句结束本次循环语句结束本次循环breakbreak是结束整个循环是结束整个循环思考:思考:思考:思考:continuecontinue能否用能否用breakbreak替代替代第52页,本讲稿共65页goto语句语句n ngoto语句的格式如下:goto goto;为标识符,其定义格式为:为标识符,其定义格式为:n ngotogoto的含的含义义是:程序是:程
49、序转转移到移到带带有有的的语语句句第53页,本讲稿共65页用goto语句求n!#include#include using namespace std;using namespace std;int main()int main()int n;int n;cin n;cin n;int i=1,f=1;int i=1,f=1;loop:loop:f*=i;f*=i;i+;i+;if(i=n)goto loop;if(i=n)goto loop;cout factorial of n =f endl;cout factorial of n =f endl;return 0;return 0;第5
50、4页,本讲稿共65页n n在使用goto语句时,应该注意:不能用不能用gotogoto语句从一个函数外部转入该函数的语句从一个函数外部转入该函数的内部(函数体),也不能用内部(函数体),也不能用gotogoto语句从一个函语句从一个函数的内部转到该函数的外部。数的内部转到该函数的外部。允许用允许用gotogoto语句从内层复合语句转到外层复合语句从内层复合语句转到外层复合语句或从外层复合语句转入内层复合语句。语句或从外层复合语句转入内层复合语句。gotogoto语句不能掠过带有初始化的变量定义。语句不能掠过带有初始化的变量定义。第55页,本讲稿共65页void f()void f().goto