好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第3章程序的流程控制.ppt

65页
  • 卖家[上传人]:新**
  • 文档编号:584422790
  • 上传时间:2024-08-31
  • 文档格式:PPT
  • 文档大小:508.54KB
  • / 65 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第三章 程序的流程控制 —— 语句主讲人:侯海良通信与控制工程系 本章内容n n流程控制概述n n顺序控制n n选择控制n n循环控制n n无条件转移控制n n程序设计风格 流程控制概述n n表达式构成了数据处理的基本单位n n当程序中有多个表达式时,就会面临: •先计算哪一个表达式先计算哪一个表达式•根据不同的情况计算不同的表达式根据不同的情况计算不同的表达式•一个或几个表达式需要重复计算多次一个或几个表达式需要重复计算多次n n语句实现对程序执行流程的控制,包括:•顺序控制:按书写次序执行顺序控制:按书写次序执行•选择控制:根据条件选择执行选择控制:根据条件选择执行•循环控制:重复执行循环控制:重复执行 C++语句的分类 顺序控制n n按书写次序,从左到右、从上到下顺序执行n n实现顺序控制的C++语句有: •表达式语句表达式语句•复合语句复合语句•空语句空语句 表达式语句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连续的多个表达式语句按它们的书写次序依次执行。

      连续的多个表达式语句按它们的书写次序依次执行 较常使用的表达式语句 n n赋值n n自增/自减n n函数调用n n输入/输出例如•x = x = a+ba+b; //; //赋值赋值•x++; //x++; //自增自增•f(af(a); //); //函数调用函数调用•cincin >> a; // >> a; //输入输入•coutcout << b; // << b; //输出输出 •表达式语句程序例1•表达式语句程序例2例1:编写一个程序,从键盘输入一个数,计算该数的平方、立方及平方根并输出 例2:编写一个程序计算a+2a+3a+…的前n项的和 复合语句n n复合语句是由一对花括号括起来的一条或多条语句,又称为块(block)语法上,复合语句可看作是一个语句其格式为: { <语句序列语句序列> }•<<语句序列语句序列>>中的语句可以是中的语句可以是任何任何的的C++C++语句,语句,其中包括其中包括数据定义数据定义和和声明语句声明语句n n复合语句中的语句序列一般按照书写次序执行 n n复合语句一般作为函数体和结构语句的成分语句 复合语句举例{ { intint a,ba,b;;;;cincin >> a >> b; >> a >> b;intint max; max;if (a >= b) //if (a >= b) //选择语句选择语句选择语句选择语句max = a; max = a; else else max = b;max = b;coutcout << max << << max << endlendl; ;} }{ { intint a,ba,b;;;; cincin >> a >> b; >> a >> b; intint max; max; max=a> max=a>b?a:bb?a:b; ; coutcout << max << max << << endlendl; ;} }将选择语句用一个语句完成将选择语句用一个语句完成 空语句 n n根据程序设计的需要,在程序中的某些地方有时需要加上一些空操作,以方便其它流程控制的实现。

      n n空语句的格式为:;n n空语句不做任何事情,其作用是用于语法上需要一条语句的地方,而该地方又不需做任何事情空语句常常作为结构语句的子句   n n例如:例如:{ { ............... ... gotogoto end; // end; //转向下面由语句标号转向下面由语句标号endend标识的空语句标识的空语句............end: end: ; ; // //空语句空语句} }• •其中,在其中,在“ “end: ;”end: ;”中,中,endend是一个语句标号,是一个语句标号,“ “;”;”是一是一个空语句个空语句n n再例如:再例如:intint i,sumi,sum; ;for (sum=0, i=1; i<=100; sum+=for (sum=0, i=1; i<=100; sum+=i,ii,i++) ++) ; ; • •其中,循环体为一条空语句其中,循环体为一条空语句 选择控制n n在程序中,常常需要根据不同的情况来从一组语句中选择一个来执行(分支),这是通过选择语句来完成的n n选择语句包括:•ifif语句语句•switchswitch语句语句 if 语句n nif语句(又称条件语句)是根据一个条件满足与否来决定是否执行某个语句或从两个语句中选择一个语句执行。

      n nif语句有两种格式:•if () <>) <语句语句>>•if () <>) <语句语句1> else <1> else <语句语句2>2>•其其中中的的<<语语句句>>、、<<语语句句1>1>、、<<语语句句2>2>必必须须是是一个一个语语句句!(复合!(复合语语句算一个句算一个语语句 if语句的含义第一种格式第二种格式 例3.3:从键盘输入三个整数,计算其中的最大值并将其输出#include <#include >using namespace std;using namespace std;intint main() main(){ { intint a,b,c,max; a,b,c,max;coutcout << " << "请输入三个整数:请输入三个整数:请输入三个整数:请输入三个整数:" << " << endlendl; ;cincin >> a >> b >> c; >> 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;coutcout << " << "最大者为:最大者为:最大者为:最大者为:" << max << " << max << endlendl; ;return 0;return 0;} } max=a>max=a>b?a:bb?a:b; ; max= max=maxmax>>c?max:cc?max:c; ;将选择语句其它语句替换将选择语句其它语句替换 例3.4:求一元二次方程ax2+bx+c=0的实解分析分析:写程序不等同于做数学题目,一定要考虑清:写程序不等同于做数学题目,一定要考虑清楚各种可能的情况,这样才能保证程序的楚各种可能的情况,这样才能保证程序的健壮性健壮性。

      在写该程序时,由于在写该程序时,由于a a、、b b、、c c是由键盘输入,应该是由键盘输入,应该考虑情况有:考虑情况有:((1 1)) a=0a=0,一元二次方程变成线性方程,一元二次方程变成线性方程((2 2))▽▽<0<0,方程无实数解,方程无实数解((3 3))▽▽=0=0,方程只有一个实数解,方程只有一个实数解((4 4))▽▽>0>0,方程有两个实数解,方程有两个实数解具体程序如下:具体程序如下:程序一程序一求出方程所有解的程序如下:求出方程所有解的程序如下:程序二程序二 if语句的锯齿格式n n为为了了提提高高程程序序的的易易读读性性,,在在写写ifif语语句句时时,,最最好好采采用用“ “锯齿锯齿” ”格式如格式一格式一n n如如果果ifif语语句句嵌嵌套套层层次次很很深深,,“ “锯锯齿齿” ”格格式式将将会会使使得得程程序序正正文文严严重重偏偏向向右右边边,,给给查查看看程程序序带带来来困困难难可可以把以把ifif语句写成语句写成格式二格式二:: 格式二:格式二:格式二:格式二:if (...)if (...) ... ...else if (...)else if (...) ... ...else if (...)else if (...) ... ...elseelse ... ...格式一:格式一:格式一:格式一:锯齿形锯齿形锯齿形锯齿形if (...)if (...) ... ...else else if (...) if (...) ... ... else else if (...) if (...) ... ... else else ... ...•注意: If…else嵌套时,else与最近的if保持匹配 例例5 5::从键盘输入一个三角形的三条边,判断其为何种三角形从键盘输入一个三角形的三条边,判断其为何种三角形 #include <#include >using namespace std;using namespace std;intint main() main(){ { intint a,b,c; a,b,c;cincin >> a >> b >> c; >> a >> b >> c;if (a+b <= c || b+c <= a || c+a <= b)if (a+b <= c || b+c <= a || c+a <= b)coutcout << " << "不是三角形不是三角形不是三角形不是三角形";";else if (a == b && b == c)else if (a == b && b == c)coutcout << " << "等边三角形等边三角形等边三角形等边三角形";";else if (a == b || b == c || c == a)else if (a == b || b == c || c == a)coutcout << " << "等腰三角形等腰三角形等腰三角形等腰三角形";";else if (a*else if (a*a+ba+b*b==c**b==c*c||bc||b* *b+cb+c*c == a*a || c*c+a*a == *c == a*a || c*c+a*a == b*b)b*b)coutcout << " << "直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)";";elseelsecoutcout << " << "其它三角形其它三角形其它三角形其它三角形";";coutcout << << endlendl; ;return 0;return 0;} }•思考:思考:思考:思考:如何在程序中增加判如何在程序中增加判如何在程序中增加判如何在程序中增加判断断断断 等腰直角三角形的语句?等腰直角三角形的语句?等腰直角三角形的语句?等腰直角三角形的语句? 方法一:方法一: else if (a*else if (a*a+ba+b*b == c*c || b**b == c*c || b*b+cb+c*c == a*a || c**c == a*a || c*c+ac+a*a == b*b )*a == b*b ){ if{ if(((( a == b || b == c || c == a a == b || b == c || c == a )))) coutcout << " << "等腰直角三角形等腰直角三角形等腰直角三角形等腰直角三角形";"; else else coutcout << " << "直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)直角三角形(非等腰)";";} }方法二:方法二:else else if(((aif(((a* *a+ba+b*b==c**b==c*c)&&(ac)&&(a====b))||((bb))||((b* *b+cb+c*c== *c== a*a*a)&&(ba)&&(b == ==c))||((cc))||((c* *c+ac+a*a == b**a == b*b)&&(cb)&&(c==a)))==a))) coutcout << " << "等腰直角三角形等腰直角三角形等腰直角三角形等腰直角三角形";";方法三:方法三:else if ((a*else if ((a*a+ba+b*b==c**b==c*c||bc||b* *b+cb+c*c == a*a || *c == a*a || c*c*c+ac+a*a == b*b)&&*a == b*b)&&((((a==a==b||bb||b====c||cc||c==a))==a))coutcout << " << "等腰直角三角形等腰直角三角形等腰直角三角形等腰直角三角形";"; 例例6 6::从键盘输入两个表示时间的数据(时、分、秒)从键盘输入两个表示时间的数据(时、分、秒),比较两个时间的先后次序。

      比较两个时间的先后次序 时间比较存在以下可能:((1 1)) h1>h2h1>h2,时间,时间2 2在前;时在前;时h1m2m1>m2,时间,时间2 2在前;在前;m1s2s1>s2,时间,时间2 2在前;在前;s1= 90)if (score >= 90)coutcout << " << "优优优优";";if (score >= 80 && score < 90)if (score >= 80 && score < 90)coutcout << " << "良良良良";";if (score >= 70 && score < 80)if (score >= 70 && score < 80)coutcout << " << "中中中中"; "; if (score >= 60 && score < 70)if (score >= 60 && score < 70)coutcout << " << "及格及格及格及格"; "; if (score < 60)if (score < 60)coutcout << " << "不及格不及格不及格不及格";";说明:每条语句都会运行说明:每条语句都会运行说明:每条语句都会运行说明:每条语句都会运行if (score >= 90)if (score >= 90)coutcout << " << "优优优优";";else if (score >= 80 && score < 90)else if (score >= 80 && score < 90)coutcout << " << "良良良良";";else if (score >= 70 && score < 80)else if (score >= 70 && score < 80)coutcout << " << "中中中中"; "; else if (score >= 60 && score < 70)else if (score >= 60 && score < 70)coutcout << " << "及格及格及格及格"; "; elseelsecoutcout << " << "不及格不及格不及格不及格";";说明:只会运行第一条说明:只会运行第一条if语句语句 if 语句的歧义问题n nif () if (<1>) if (<表达式表达式2>) <2>) <语句语句1> else <1> else <语句语句2>2>的含义的含义1.1. if (if (表达式表达式1) 1) if (if (表达式表达式2) <2) <语句语句1> else <1> else <语句语句2>2>2.2. if (if (表达式表达式1) 1) if (if (表达式表达式>) <>) <语句语句1>1> else <语句2>n nC++C++规定:规定:elseelse子句与它前面最近的、没有子句与它前面最近的、没有elseelse子子句的句的if if配对。

      因此,上面的配对因此,上面的if if语句解释为:语句解释为: • •if (if (表达式表达式1) 1) if (if (表达式表达式2) <2) <语句语句1> else <1> else <语句语句2>2> n n若要按若要按2 2来解释,则需要加上花括号(复合语句):来解释,则需要加上花括号(复合语句):• •if (if (表达式表达式1) { if (1) { if (表达式表达式2) <2) <语句语句1> } else <1> } else <语句语句2>2> switch 语句n n程序中有时需要从两个(组)以上的语句中选择一个(组)来执行n nC++提供了一条多路选择语句:switch语句(又称开关语句),•它能根据某个表达式的值在多组语句中选择一组它能根据某个表达式的值在多组语句中选择一组语句来执行语句来执行 •每一组语句的最后一个语句往往是每一组语句的最后一个语句往往是breakbreak语句 例例7 7、、从键盘输入一个星期的某一天(从键盘输入一个星期的某一天(0 0:星期天;:星期天;1 1::星期一;星期一;......),输出对应的英语单词(),输出对应的英语单词(if if语句实现)语句实现)采用采用if if语句实现:语句实现:程序程序缺陷:缺陷:多次对多次对dayday的值进行比较书写麻烦,可读性差的值进行比较书写麻烦,可读性差解决:解决:采用采用switchswitch语句实现,具体格式如下:语句实现,具体格式如下:switch ()>){ { case : <1>: <语句序列语句序列1>1> : :case : : <语句序列语句序列n>n>[default: <[default: <语句序列语句序列n+1>]n+1>]} }•注意:注意:switchswitch中的整型表达式可以是中的整型表达式可以是整型整型、、字符型字符型和和枚举型,枚举型,casecase语句中的常量表达式也必须相语句中的常量表达式也必须相比配比配 例例8 8、、从键盘输入一个星期的某一天(从键盘输入一个星期的某一天(0 0:星期天;:星期天;1 1::星期一;星期一;......),然后输出其对应的英语单词),然后输出其对应的英语单词#include <#include >using namespace std;using namespace std;intint main() main(){ { intint day; day;cincin >> day; >> day;switch (day)switch (day){ { case 0: case 0: coutcout << "Sunday"; break; << "Sunday"; break;case 1: case 1: coutcout << "Monday"; break; << "Monday"; break;case 2: case 2: coutcout << "Tuesday"; break; << "Tuesday"; break;case 3: case 3: coutcout << "Wednesday"; break; << "Wednesday"; break;case 4: case 4: coutcout << "Thursday"; break; << "Thursday"; break;case 5: case 5: coutcout << "Friday"; break; << "Friday"; break;case 6: case 6: coutcout << "Saturday"; break; << "Saturday"; break;default: default: coutcout << "Input error"; << "Input error";} }coutcout << << endlendl; ;return 0;return 0;} }•思考:思考:思考:思考:如何用字符串实现上述结果如何用字符串实现上述结果如何用字符串实现上述结果如何用字符串实现上述结果????•程序程序 switch语句中使用break语句n n在执行switch语句的某个分支时,需要用break语句结束该分支的执行。

      n n在switch语句的一个分支的执行中,如果没有break语句(最后一个分支除外),则该分支执行完后,将继续执行紧接着的下一个分支中的语句序列n nC++中的switch语句比其它一些语言中的多路选择语句更具有灵活性当若干个分支具有部分重复功能时,C++的switch语句可以节省代码量 switch (...)switch (...){ {... ...case 1>:::: A Acase 2>:::: B Bcase 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 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整除整除 •程序程序 循环控制 n n如何编程计算如何编程计算n!n!((n n是变量)?是变量)?• •n!=n*(n-1)*(n-2)*n!=n*(n-1)*(n-2)*......*2*1*2*1• •表达式中不允许有表达式中不允许有“ “...”...”n n上面的问题需要用重复操作控制来解决:对相同的操上面的问题需要用重复操作控制来解决:对相同的操作重复执行多次,每一次操作的数据有所不同作重复执行多次,每一次操作的数据有所不同• •f=1,f=1,对对i=2~n,i=2~n,重复执行:重复执行:f=f*i;f=f*i;n n循环循环语句为解决重复操作提供了一种途径语句为解决重复操作提供了一种途径n n循环一般由四个部分组成:循环一般由四个部分组成:• •循环初始化循环初始化• •循环条件循环条件• •循环体循环体• •下一次循环准备下一次循环准备 n nC++提供了三种实现重复操作的循环语句:•whilewhile语句语句•do-whiledo-while语句语句•forfor语句语句 while 语句n nwhilewhile语句具有如下的格式:语句具有如下的格式:while () <>) <语句语句> > 用while语句求n!#include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;cincin >> n; >> n;intint i=2, f=1; // i=2, f=1; //循环初始化循环初始化循环初始化循环初始化while (i <= n) //while (i <= n) //循环条件循环条件循环条件循环条件{ {f *= i;f *= i;i++; //i++; //下一次循环准备下一次循环准备下一次循环准备下一次循环准备} //} //循循循循环环环环体体体体coutcout << "factorial of " << n << " = " << f << << "factorial of " << n << " = " << f << endlendl; ;return 0;return 0;} } do-while 语句do-whiledo-while语句的格式如下:语句的格式如下:do while (<> while (<表达式表达式表达式表达式>);>); 用do-while语句求n!#include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;cincin >> n; >> n;intint i=1,f=1; // i=1,f=1; //循环初始化循环初始化循环初始化循环初始化do //do //循循循循环环环环体体体体{ {f *= i;f *= i;i++; //i++; //下一次循环的准备下一次循环的准备下一次循环的准备下一次循环的准备} while (i <= n); //} while (i <= n); //循环条件循环条件循环条件循环条件coutcout << "factorial of " << n << " = " << f << << "factorial of " << n << " = " << f << endlendl; ;return 0;return 0;} } for 语句forfor语句的格式如下:语句的格式如下: for (;<1>;<表达式表达式表达式表达式2>;<2>;<表达式表达式表达式表达式3>) <3>) <语句语句语句语句>> #include <#include >using namespace std;using namespace std;intint main() main(){ { intint n,i,fn,i,f; ;cincin >> n; >> n;for for (i=2,f=1 (i=2,f=1 // //循环初始化循环初始化循环初始化循环初始化; ; i<=n i<=n // //循环条件循环条件循环条件循环条件; ;i++) i++) // //下一次循环准备下一次循环准备下一次循环准备下一次循环准备 f *= i; //f *= i; //循环体循环体循环体循环体coutcout << "factorial of " << n << " = " << f << << "factorial of " << n << " = " << f << endlendl; ;return 0;return 0;} }用for语句求n! 循环的种类n n计数控制的循环•循环前就知道循环的次数,循环时重复执行循循环前就知道循环的次数,循环时重复执行循环体直到指定的次数环体直到指定的次数 n n事件控制的循环•循环前不知道循环的次数,循环的终止是由循循环前不知道循环的次数,循环的终止是由循环体的某次执行导致循环的结束条件得到满足环体的某次执行导致循环的结束条件得到满足而引起的而引起的 三种循环语句的使用原则 n n三种循环语句在表达能力上是等价的,在解决某个具体问题时,用其中的一种可能会比其它两种更加自然。

      n n一般来说,•计数控制的循环一般用计数控制的循环一般用forfor语句;语句;•事件控制的循环一般用事件控制的循环一般用whilewhile或或do-whiledo-while语句,语句,其中,如果循环体至少要执行一次,则用其中,如果循环体至少要执行一次,则用do-do-whilewhile语句•由于由于forfor语句能清晰地表示语句能清晰地表示“ “循环初始化循环初始化” ”、、“ “循环条件循环条件” ”以及以及“ “下一次循环准备下一次循环准备” ”,因此,一,因此,一些非计数控制的循环也用些非计数控制的循环也用forfor语句实现语句实现 例例1313::计算从键盘输入的一系列整数的和,要求首先计算从键盘输入的一系列整数的和,要求首先输入整数的个数计数控制的循环)输入整数的个数计数控制的循环) #include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;coutcout << " << "请输入整数的个数:请输入整数的个数:请输入整数的个数:请输入整数的个数:";";cincin >> n; >> n;coutcout << " << "请输入请输入请输入请输入" << n << "" << n << "个整数:个整数:个整数:个整数:";";intint sum=0; sum=0;for for ( (intint i=1; i<=n; i++) i=1; i<=n; i++){ {intint a; a; cincin >> a; >> a;sum += a; sum += a; } }coutcout << " << "输入的输入的输入的输入的" << n << "" << n << "个整数的和是:个整数的和是:个整数的和是:个整数的和是:" << sum " << sum << << endlendl; ;return 0;return 0;} }•i i的作用的作用的作用的作用域域域域 例例1414:计算从键盘输入的一系列整数的和,要求输入:计算从键盘输入的一系列整数的和,要求输入以以-1-1结束。

      结束事件控制的循环事件控制的循环 ))#include <#include >using namespace std;using namespace std;intint main() main(){ { intint a,suma,sum=0;=0;coutcout << " << "请输入若干个整数(以请输入若干个整数(以请输入若干个整数(以请输入若干个整数(以-1-1结束):结束):结束):结束):";";cincin >> a; >> a;while (a != -1)while (a != -1){ {sum += a; sum += a; cincin >> a; >> a;} }coutcout << " << "输入的整数的和是:输入的整数的和是:输入的整数的和是:输入的整数的和是:" << sum << " << sum << endlendl; ;return 0;return 0;} }•思考:可以用思考:可以用思考:可以用思考:可以用forfor循循循循 环实现吗?环实现吗?环实现吗?环实现吗? 思考:思考:forfor循环实现循环实现计算从键盘输入的一系列整数的和,计算从键盘输入的一系列整数的和,要求输入以要求输入以-1-1结束。

      结束事件控制的循环事件控制的循环 ))#include <#include >using namespace std;using namespace std;intint main() main(){ { intint a,suma,sum=0;=0;coutcout << " << "请输入若干个整数(以请输入若干个整数(以请输入若干个整数(以请输入若干个整数(以-1-1结束):结束):结束):结束):";";for ( for ( cincin >> a; a != -1; >> a; a != -1; cincin >> a) >> a) sum+ = a;sum+ = a;coutcout << " << "输入的整数的和是:输入的整数的和是:输入的整数的和是:输入的整数的和是:" << sum << " << sum << endlendl; ;return 0;return 0;} } 例例1515:从键盘接收字符,一直到输入了字符:从键盘接收字符,一直到输入了字符y(Yy(Y) )或或n(Nn(N) )为止。

      为止 (事件控制的循环(事件控制的循环 ))#include <#include >#include <#include >using namespace std;using namespace std;intint main() main(){ { char char chch; ; coutcout << " << "请输入字符:请输入字符:请输入字符:请输入字符:";";dodo{ {cincin >> >> chch; ;chch = = tolower(chtolower(ch); );} while (} while (chch != 'y' && != 'y' && chch != 'n'); != 'n');if (if (chch == 'y') == 'y')coutcout << "Yes!\n"; << "Yes!\n";elseelsecoutcout << "No!\n"; << "No!\n";return 0;return 0;} } 例16:判断键盘输入的数是否为素数方法一方法一:用键盘输入的数:用键盘输入的数n n分别除以分别除以2 2、、3…n-13…n-1,有,有一个数能整除,则一个数能整除,则n n不是素数,否则不是素数,否则n n为素数。

      为素数 程序一程序一方法二方法二:用键盘输入的数:用键盘输入的数n n分别除以分别除以2 2、、3…3…sqrt(nsqrt(n) ),,有一个数能整除,则有一个数能整除,则n n不是素数,否则不是素数,否则n n为素数 程序二程序二方法三方法三:在方法二的基础上,被不能被:在方法二的基础上,被不能被2 2整除就不能整除就不能被被4 4、、 6 6、、8…8…等整除,减少除法计算次数等整除,减少除法计算次数 程序三程序三 例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 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 << fib_2 << endl;endl;return 0;return 0;} } 循环优化问题n n算法的优化:减少循环次数n n避免在循环中重复计算不变的表达式 #include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;coutcout << " << "请输入一个正整数:请输入一个正整数:" "cincin >> n; >> n; ////从键盘输入一个正整数从键盘输入一个正整数for (for (intint i=2; i>#include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;cincin >> n; >> n; ////从键盘输入一个数从键盘输入一个数if (n < 2) return -1;if (n < 2) return -1;coutcout << 2 << ","; << 2 << ","; ////输出第一个素数输出第一个素数for (for (intint i=3; i if (j > sqrt(isqrt(i) )) ) //i//i是素数是素数 coutcout << i << ","; << i << ",";} }coutcout << << endlendl; ;return 0;return 0;} }注意:注意:注意:注意:上面程序中的上面程序中的sqrt(isqrt(i) )被重复计算!被重复计算!例19:编程求出小于n的所有素数(质数)(续) ......int j = 2,k=sqrt(i);while ( j <= k && i%j != 0)j++;if (j > k) //i是素数。

      注意:对有些循环优化,编译器能实现! 转移控制 n n除了有条件的选择语句(if和switch)外,C++还提供了转移语句:•breakbreak•continue continue •gotogoto•returnreturn:: break语句 n nbreak语句的格式:break; break; n nbreak语句的含义有两个:• •结束结束switchswitch语句的某个分支的执行语句的某个分支的执行• •退出包含它的最内层循环语句(由于循环可以嵌套)退出包含它的最内层循环语句(由于循环可以嵌套) n n在在循循环环体体中中只只要要执执行行了了breakbreak语语句句,,就就立立即即跳跳出出((结结束束))循循环环,,循循环环体体中中跟跟在在breakbreak语语句句后后面面的的语语句句将将不不再执行,程序继续执行循环之后的语句再执行,程序继续执行循环之后的语句n n在在循循环环体体中中,,breakbreak语语句句一一般般作作为为某某个个ifif语语句句的的子子句句,,用于实现进一步的循环控制用于实现进一步的循环控制 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; continue语句 n ncontinue语句的格式如下: continue;n ncontinue语句用在循环语句的循环体中,作用是:立即结束当前循环,进入下轮循环。

      •对对于于whilewhile和和do-whiledo-while语语句句,,continuecontinue语语句句将将使使控控制转到循环条件的判断;制转到循环条件的判断;•对对于于forfor语语句句,,continuecontinue语语句句将将使使控控制制转转到到::先先计计算算< <表表达达式式3>3>,,然然后后计计算算< <表表达达式式2>2>,,并并根根据据< <表表达达式式2>2>的结果决定是进入下一次循环还是结束循环的结果决定是进入下一次循环还是结束循环 例21:从键盘输入一些非零整数,然后输出其中所有正数的平方根 #include <#include >#include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;double double square_rootsquare_root; ;coutcout << " << "请输入若干整数(以请输入若干整数(以请输入若干整数(以请输入若干整数(以0 0结束):结束):结束):结束):";";for (for (cincin>>n; n!=0; >>n; n!=0; cincin>>n)>>n){ {if (n < 0) if (n < 0) continuecontinue; //; //准备进入下一次循环准备进入下一次循环准备进入下一次循环准备进入下一次循环square_rootsquare_root = = sqrt(nsqrt(n); );coutcout << n << " << n << "的平方根是的平方根是的平方根是的平方根是::::" << " << square_rootsquare_root << << endlendl; ;} }return 0;return 0;} }•continuecontinue语句结束本次循环语句结束本次循环•breakbreak是结束整个循环是结束整个循环•思考:思考:思考:思考:continuecontinue能否用能否用breakbreak替代替代 goto语句语句n ngoto语句的格式如下:gotogoto < <语句标号语句标号>>;;•<<语句标号语句标号>>为标识符,其定义格式为:为标识符,其定义格式为:<<语句标号语句标号>>::<<语句语句>>n ngotogoto的含的含义义是:程序是:程序转转移到移到带带有有<<语语句句标标号号>>的的语语句句 用goto语句求n! #include <#include >using namespace std;using namespace std;intint main() main(){ { intint n; n;cincin >> n; >> n;intint i=1,f=1; i=1,f=1;loop: loop: f *= i;f *= i;i++;i++;if (i <= n) if (i <= n) gotogoto loop; loop;coutcout << "factorial of " << n << "=" << f << << "factorial of " << n << "=" << f << endlendl; ;return 0;return 0;} } n n在使用goto语句时,应该注意:•不能用不能用gotogoto语句从一个函数外部转入该函数的语句从一个函数外部转入该函数的内部(函数体),也不能用内部(函数体),也不能用gotogoto语句从一个函语句从一个函数的内部转到该函数的外部。

      数的内部转到该函数的外部•允许用允许用gotogoto语句从内层复合语句转到外层复合语句从内层复合语句转到外层复合语句或从外层复合语句转入内层复合语句语句或从外层复合语句转入内层复合语句•gotogoto语句不能掠过带有初始化的变量定义语句不能掠过带有初始化的变量定义 void f()void f(){ { ............goto L1; goto L1; //Error//Error............while (...)while (...){ { intint x=0; x=0;L1: ...L1: ...............gotogoto L2; L2; //Error//Error............} }..........intint y=10; y=10;L2: ......L2: ..................} } 用goto语句实现break语句的功能while (...)while (...){ { ............... break; ... break; ............} }上述程序等价于:上述程序等价于:while (...)while (...){ { ............... ... gotogoto L; L; ............} }L: ...L: ... 空语句while (...)while (...){ { ............... continue; ... continue; ............} }n n格式:格式: ;;n n作用作用:程序中需要一条不做任何事情的语句。

      程序中需要一条不做任何事情的语句n n例:例: intint I,sumI,sum; ; for (sum=0,i=1;i<=100; sum+= for (sum=0,i=1;i<=100; sum+=i,ii,i++) ++) ; ;n n用空语句和用空语句和gotogoto语句实现语句实现continuecontinue语句的功能语句的功能while (...)while (...){ {............... ... gotogoto end; end; ............end:;end:;} } Return语句 作用:退出当前运行的函数例:时间比较程序说明:程序遇到return语句,无论以后的语句有多少,都不再运行,直接退出该程序 程序设计风格 n n程序设计风格通常是指对程序进行静态分析所能确认的程序特性,它涉及程序的易读性 •采用一致采用一致/ /有意义的标识符为程序实体(如:变量、有意义的标识符为程序实体(如:变量、函数等)命名函数等)命名•使用符号常量使用符号常量•为程序书写注释为程序书写注释•采用代码的缩进格式,等采用代码的缩进格式,等n n除此之外,结构化程序设计就是一种良好程序设计风格的典范。

      结构化程序设计 n n结构化程序设计结构化程序设计((Structured ProgrammingStructured Programming,,简简称称SPSP)是指)是指“ “按照一组能够提高程序易读性与易维按照一组能够提高程序易读性与易维护性的规则进行程序设计的方法护性的规则进行程序设计的方法” ”n nSPSP不仅要求所编出的不仅要求所编出的程序结构良好程序结构良好,而且还要求,而且还要求程程序设计过程序设计过程也是结构良好的,后者是前者的基础也是结构良好的,后者是前者的基础n n对程序设计过程而言,对程序设计过程而言,“ “结构良好结构良好” ”是指是指• •采用分解和抽象的方法来完成程序设计任务,采用分解和抽象的方法来完成程序设计任务,• •具体体现为:具体体现为:“ “自顶向下、逐步精化自顶向下、逐步精化” ”的程序设计过程的程序设计过程 n n对程序而言,对程序而言,“ “结构良好结构良好” ”是指:是指:• •每个程序单位应具有每个程序单位应具有单入口、单出口单入口、单出口的性质• •不包含不会停止执行的语句,程序在有限时间内结束不包含不会停止执行的语句,程序在有限时间内结束。

      • •程序中没有无用语句,程序中所有语句都有被执行的机会程序中没有无用语句,程序中所有语句都有被执行的机会 结构化程序设计(续) n n结构化程序设计通常可用三种基本结构来实现(顺序)(顺序)(选择)(选择)(循环)(循环)n n上面三种结构都具有单入口、单出口的性质 关于goto语句 n ngotogoto语句会使得程序的静态结构和动态结构不一语句会使得程序的静态结构和动态结构不一致,导致程序难以理解、可靠性下降和不容易维致,导致程序难以理解、可靠性下降和不容易维护有时会导致程序效率的下降有时会导致程序效率的下降 n n从结构化程序设计的角度讲,从结构化程序设计的角度讲, gotogoto语句会破坏程语句会破坏程序中的每一个结构所具有的单入口序中的每一个结构所具有的单入口/ /单出口的性质单出口的性质n n实际上,实际上,gotogoto语句的使用可以分成两类:语句的使用可以分成两类:• •向下的转移(向下的转移(forwardforward)(可用分支结构实现))(可用分支结构实现)• •往回的转移(往回的转移(backwardbackward)(可用循环结构实现))(可用循环结构实现)n n尽量不要使用尽量不要使用gotogoto语句。

      语句 作业一n n思考教材后面的习题n n上交的作业((1 1))分别采用分别采用if if语句和语句和swichswich语句实现将语句实现将100100分制分分制分数按下列要求转化(数据从键盘输入):数按下列要求转化(数据从键盘输入): 90~100 => 90~100 => 优秀优秀 80~89 => 80~89 => 良好良好 70~79 => 70~79 => 中等中等 60~69 => 60~69 => 及格及格 60 60分以下分以下 => => 不及格不及格 ((2 2))用循环语句打印如下图形用循环语句打印如下图形 # %# % ## %%## %% ### %%% ### %%% #### %%%% #### %%%% ##### %%%%% ##### %%%%% ###### %%%%%% ###### %%%%%%((3 3))采用循环语句编程输出下列矩阵形式采用循环语句编程输出下列矩阵形式 1 0 1 2 3 4 5 61 0 1 2 3 4 5 6 2 1 2 3 4 5 6 0 2 1 2 3 4 5 6 0 3 2 3 4 5 6 0 1 3 2 3 4 5 6 0 1 4 3 4 5 6 0 1 2 4 3 4 5 6 0 1 2 5 4 5 6 0 1 2 3 5 4 5 6 0 1 2 3 6 5 6 0 1 2 3 4 6 5 6 0 1 2 3 4 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.