1、第第0404章控制程序流程章控制程序流程-2-本章内容安排本章内容安排&whilewhile循环循环&dowhiledowhile循环循环&forfor循环循环&高级循环高级循环&switchswitch-3-循循的概念的概念&计算机擅长的工作之一是重复做相同的事情。计算机擅长的工作之一是重复做相同的事情。&许多编程任务可以通过重复相同的操作来完成,许多编程任务可以通过重复相同的操作来完成,通过指定次数或设定条件来控制执行过程。多次重通过指定次数或设定条件来控制执行过程。多次重复执行的结构称为复执行的结构称为循环循环,每一次循环称为,每一次循环称为迭代迭代。&whilewhile、dowhil
2、edowhile、forfor-4-whilewhile循循&在指定条件为在指定条件为truetrue的情况下,程序重复执行,直的情况下,程序重复执行,直到指定条件变为到指定条件变为falsefalse。&条件放在条件放在whilewhile之后的()内,循环执行的语句放之后的()内,循环执行的语句放在一对内。在一对内。表达式表达式F F循环体语句循环体语句T Twhile(表达式) 循环体语句;-5-示示099099#include using namespace std;int main()int x=0;while( x100 )cout x ;x+;return 0;p假如循 句中没有
3、x+,while循 的条件永 真,致循一直行, 称无限循或死循。-6-示示099099,每行,每行5 5个个#include using namespace std;int main()int x=0;while( x100 )cout x ;x+;if(x%5=0) coutendl;return 0;p增x,每当x是5的倍数,出回。-7-示前示前2020个整除个整除1414的正整数的正整数#include using namespace std;int main()int x=0, count=0;while( true )x+;if(x%14=0) coutx19) break;retu
4、rn 0;p循中while的条件true,构 造1个无限循。p在循体内,用break句,可 立即停止循的行。p使用while( true )构,要确 保循能停止。-8-示前示前2020个整除个整除1414的正整数的正整数#include using namespace std;int main()int x=0, count=0;while( count19 )x+;if(x%15!=0) continue;coutx ;count+;return 0;p在循中遇到continue句,将 跳余下的句,行下一次 迭代。pbreak束当前循,而continue 束本次迭代。-9-示前示前2020个
5、整除个整除1414的正整数的正整数#include using namespace std;int main()int x=0, count=0;while( count19 )x+=14;coutx ;count+;return 0;p14倍数,从14开始,依次增14。-10-本章内容安排本章内容安排&whilewhile循环循环&dowhiledowhile循环循环&forfor循环循环&高级循环高级循环&switchswitch-11-dowhiledowhile循循&whilewhile在执行循环前检查条件,如果此时条件为在执行循环前检查条件,如果此时条件为falsefalse,则一次
6、循环也不执行。,则一次循环也不执行。&dowhiledowhile在循环之后检查条件,条件为在循环之后检查条件,条件为truetrue,继,继续循环,条件为续循环,条件为falsefalse结束循环。结束循环。do 循环体语句; while(表达式);表达式F循环体语句T-12-重复重复示示 指定次数指定次数#include using namespace std;int main() int badger;coutbadger;do cout0);coutn;return 0;p不要漏句最后的;号。p无条件如何置,dowhile循 至少行1次。pbreak和continue仍然有效。-13-
7、本章内容安排本章内容安排&whilewhile循环循环&dowhiledowhile循环循环&forfor循环循环&高级循环高级循环&switchswitch-14-forfor循循&forfor循环将设置计数变量初值、检查条件、修改计循环将设置计数变量初值、检查条件、修改计数变量合并到数变量合并到1 1条语句中。条语句中。for(表达式1; 表达式2;表达式3) 循环体;表达式表达式2 2F F表达式表达式3 3表达式表达式1 1循环体语句循环体语句T T算算11001100的和的和#include using namespace std;int main()int i,sum=0; for
8、(i=1;i=100;i+)sum+=i;cout“Sum: “sum“n”;return 0;p表达式1:完成数量初始化。p表达式2: 条件,确定是否 行循。p表达式3:修改数量的。p3个表达式之用分号分割。-15-16-本章内容安排本章内容安排&whilewhile循环循环&dowhiledowhile循环循环&forfor循环循环&高级循环高级循环&switchswitch1 1、forfor的的化形式化形式1 1#include using namespace std;int main() int i,sum; for( i=1, sum=0; i=100; i+) sum=sum+i
9、; cout“Sum: “sum“n”; return 0;p初始化多个量,用逗号行 分割。p仍然是3大部分,用;分割-17-forfor的的化形式化形式2 2#include using namespace std;int main() int i=1,sum=0; for( ; i=100; i+ ) sum=sum+i; cout“Sum: “sum“n”; return 0;p3个表达式中的任意1个可以空, 但 的分号不能省略。-18-forfor的的化形式化形式3 3#include using namespace std;int main() int i=1,sum=0; for(
10、 ; i=100; ) sum=sum+i; i+; cout“Sum: “sum“n”; return 0;p将表达式3移到循体内部,已 退化while循。-19-forfor的的化形式化形式4 4#include using namespace std;int main() int i=1,sum=0; for( ; ; ) sum = sum+i; if( i=100 )break; i+; cout“Sum: “sum“n”; return 0;p将3个表达式全部移出,退化 while(true)构。-20-forfor的的化形式化形式5 5#include using namespa
11、ce std;int main() int i=1, sum=0; for( i=1; i=100; sum=sum+i, i+ ) ; cout“Sum: “sum“n”; return 0;p将循体内的句移到某个表达式 中,不提倡种用法。p第3部分逗号表达式,序行-21-2 2、循、循的典型的典型#include using namespace std;int main()int i,sum=0; for( i=1; i=100; i+ ) ;sum+=i;cout“Sum: “sum“n”;return 0;p此的for循,行了100次空 句(;)。p真正的循体sum+=i没有行。-22
12、-循循的典型的典型#include using namespace std;int main() int i=1,sum=0; for( ; i=100; )sum=sum+i; i+; cout“Sum: “sum“n”; return 0;p循 行sum=sum+i,而不会行 i+,致死循。p养成将循 句放在 内作复 句的良好 ,不管是否只有 1条句。-23-循循的典型的典型#include using namespace std;int main() int i=1,sum=0; while(i=100) ; sum+=i;i+; cout“Sum: “sum“n”; return 0;
13、pwhile循后面不能加分号,否 while一直行空句,致i无 法增,死循。-24-循循的典型的典型#include using namespace std;int main() int i=1,sum=0; do sum+=i;i+; while(i=100) cout“Sum: “sum“n”; return 0;pdowhile循的束必有; 否无法通 。-25-26-3 3、循、循的嵌套的嵌套&在循环体内,可以包含另一个循环,从而构成循在循环体内,可以包含另一个循环,从而构成循环的嵌套。环的嵌套。&外部循环每次迭代时,内部循环都将完整循环外部循环每次迭代时,内部循环都将完整循环1 1次次
14、出字符矩形出字符矩形#include using namespace std;int main() int rows,columns;char character;coutrows;coutcolumns;coutcharacter;coutn;-27-出字符矩形出字符矩形#include using namespace std;int main()for( int i=0; irows; i+ )for( int j=0; jcolumns; j+) coutcharacter;coutn;return 0;-28-克思手稿中的数学克思手稿中的数学&共有共有3030个人,其中有男人、女人和小
15、孩,他们在个人,其中有男人、女人和小孩,他们在一家饭馆吃饭共花费了一家饭馆吃饭共花费了5050先令,其中每个男人花先令,其中每个男人花费费3 3先令,每个女人花费先令,每个女人花费2 2先令,每个小孩各花先令,每个小孩各花1 1先先令,问令,问3030个人中男人、女人和小孩各几人?个人中男人、女人和小孩各几人?&设男人、女人和小孩的人数各为设男人、女人和小孩的人数各为x x、y y、z z,则通过,则通过题意可以列出下面的方程。题意可以列出下面的方程。x+y+z=30 x+y+z=303x+2y+z=503x+2y+z=50-29- 法法&通过两个方程解通过两个方程解3 3个未知数,这是一个不
16、定方程,个未知数,这是一个不定方程,应该有多组解,用代数方法很难求解。应该有多组解,用代数方法很难求解。&利用计算机编写程序,通过利用计算机编写程序,通过“ “穷举法穷举法” ”可以可以列举出列举出所有可能的解所有可能的解。所谓。所谓“ “穷举法穷举法” ”,就是让计算机根据,就是让计算机根据所有可能的情况,逐一去验证,从而找出所有满足所有可能的情况,逐一去验证,从而找出所有满足要求的要求的“ “解解” ” 。&由于总人数为由于总人数为3030人,所以人,所以x x、y y和和z z的取值范围一定的取值范围一定为为030030并且为整数并且为整数,在编程时,我们可以让,在编程时,我们可以让x
17、x、y y和和z z都从都从0 0循环到循环到3030,然后验证看哪个组合能满足,然后验证看哪个组合能满足方程式。方程式。-30-三重循三重循求解求解int main()int x,y,z;coutMan t Women t Childrenn“;for(x=0;x=30;x+) for(y=0;y=30;y+) for(z=0;z=30;z+) if(x+y+z=30 & 3*x+2*y+z=50) coutx“t”y“t”z“n”; return 0;p“t”表示制表符。p分析:循体行313131,循 x、y 确定后,z就会确定,不需要再循。此外, 每种人的循范不一定都是30。-31-小小
18、 范范int main()int x,y,z;coutMan t Women t Childrenn“;for(x=0;x=16;x+) for(y=0;y=25;y+) for(z=0;z=30;z+) if(x+y+z=30 & 3*x+2*y+z=50) coutx“t”y“t”z“n”; return 0;-32-2 2重循重循int main()int x,y,z;coutMan t Women t Childrenn“;for(x=0;x=16;x+) for(y=0;y=25;y+) z = 30 x y; if( 3*x+2*y+z=50) coutx“t”y“t”z“n”;
19、return 0;p某一次循迭代中,x和y确定后,z便可以 算得出,减少了循的次数。-33-1 1重循重循的的&采用消元法,消去变量采用消元法,消去变量z z,得到新的方程式,得到新的方程式2x+y=202x+y=20&对于这一方程式,我们可以采用一重循环来穷举对于这一方程式,我们可以采用一重循环来穷举x x的所有可能,即的所有可能,即x x从从0 0变到变到1616,但只要,但只要x x确定下来,确定下来,y y便可以通过方程式来确定,便可以通过方程式来确定,x x和和y y确定下来,则确定下来,则z z可以由可以由x+y+z=30 x+y+z=30确定。确定。-34-1 1重循重循(小(小
20、BugBug)int main()int x,y,z;coutMan t Women t Childrenn“;for(x=0; x=16; x+) y = 20 - 2*x; z = 30 - x - y; if( 3*x+2*y+z=50) coutx“t”y“t”z“n”;return 0;-35-1 1重循重循int main()int x,y,z;coutMan t Women t Childrenn“;for(x=0; x=16; x+) y = 20 - 2*x; z = 30 - x - y;if(y0 | z0) continue; if( 3*x+2*y+z=50) cou
21、tx“t”y“t”z“n”;return 0;-36-37-本章内容安排本章内容安排&whilewhile循环循环&dowhiledowhile循环循环&forfor循环循环&高级循环高级循环&switchswitchswitchswitch的的机机&对同一个变量,若存在多个分支判断情况,使用对同一个变量,若存在多个分支判断情况,使用嵌套的嵌套的if if语句,将导致代码非常烦琐混乱,不易理语句,将导致代码非常烦琐混乱,不易理解且难以维护。解且难以维护。&switchswitch语句,检查表达式,根据结果匹配执行多语句,检查表达式,根据结果匹配执行多个代码块中的个代码块中的1 1个。个。-38
22、-switchswitch的基本的基本构构switch(switch(表达式表达式) ) case case 常量常量1:1:语句语句1; break;1; break;case case 常量常量2:2:语句语句2; break;2; break; case case 常量常量n: n: 语句语句n; break;n; break;default:default:语句语句n+1;n+1; pswitch的表达式必是一个整数。pcase分支后必 常量,不能是 量或者表达式,分支不允重复。pswitch句行,若匹配到某个 case,行后面的句;若没有匹 配的case,行default部分。p通常
23、每个case分支,都 有break 句,用于退出switch。若某个 case没有break,当前分支行完 后, 下一个case分支。p良好程 :保留default,理 特殊情况。-39-等等分分百分制百分制#include int main()char grade;int score;coutgrade;return 0;-40-等等分分百分制百分制switch( grade )case A: score = 95; break;case B: score = 85; break;case C: score = 75; break;case D: score =65; break;defau
24、lt: cout“Its not even a grade!n”;cout“Your score is: “score“n”;pcase之后必 整数或字符常量。-41-等等分分百分制:考百分制:考小写字母小写字母switch( grade )case A:case a: score = 95; break;case B:case b: score = 85; break;case C:case c: score = 75; break;case D:case d: score =65; break;default: cout“Its not even a grade!n”; -42-演讲完毕,谢谢观看!