《控制程序流程.ppt》由会员分享,可在线阅读,更多相关《控制程序流程.ppt(40页珍藏版)》请在三一文库上搜索。
1、第04章控制程序流程,-2-,本章内容安排,while循环 dowhile循环 for循环 高级循环 switch,-3-,循环的概念,计算机擅长的工作之一是重复做相同的事情。 许多编程任务可以通过重复相同的操作来完成,通过指定次数或设定条件来控制执行过程。多次重复执行的结构称为循环,每一次循环称为迭代。 while、dowhile、for,-4-,while循环,在指定条件为true的情况下,程序重复执行,直到指定条件变为false。 条件放在while之后的()内,循环执行的语句放在一对内。,while(表达式) 循环体语句; ,-5-,显示099,#include int main()
2、int x=0; while( x100 ) std:cout x “ ”; x+; return 0; ,假如循环语句中没有x+,则while循环 的条件永远为真,导致循环一直执行, 称为无限循环或死循环。,-6-,显示500以内13的倍数,#include int main() int counter=0; while( counter500 ) counter+; if(counter%13=0) std:coutcounter“ “; return 0; ,-7-,显示前20个整除14的正整数,#include int main() int counter=0, multiples=0
3、; while( true ) counter+; if(counter%14=0) std:cout19) break; return 0; ,循环中让while的条件为true,构 造1个无限循环。 在循环体内,调用break语句,可 立即停止循环的执行。 使用while( true )结构时,要确 保循环能够停止。,-8-,显示前20个整除15的正整数,#include int main() int counter=0, multiples=0; while( multiples19 ) counter+; if(counter%15!=0) continue; std:coutcoun
4、ter“ “; multiples+; return 0; ,在循环中遇到continue语句,将 跳过余下的语句,执行下一次 迭代。 break结束当前循环,而continue 结束本次迭代。,-9-,本章内容安排,while循环 dowhile循环 for循环 高级循环 switch,-10-,dowhile循环,while在执行循环前检查条件,如果此时条件为false,则一次循环也不执行。 dowhile在循环之后检查条件,条件为true,继续循环,条件为false结束循环。,do 循环体语句; while(表达式);,-11-,重复显示单词指定次数,#include int main(
5、) int badger; std:coutbadger; do std:cout0); std:cout“n“; return 0; ,不要遗漏语句最后的;号。 无论条件如何设置,dowhile循 至少执行1次。 break和continue仍然有效。,-12-,本章内容安排,while循环 dowhile循环 for循环 高级循环 switch,-13-,for循环,for循环将设置计数变量初值、检查条件、修改计数变量合并到1条语句中。,for(表达式1; 表达式2;表达式3) 循环体; ,计算1100的和,#include int main() int i,sum=0; for(i=1;
6、i=100;i+) sum+=i; std:cout“Sum: “sum“n”; return 0; ,表达式1:完成计数变量初始化。 表达式2:检查条件,确定是否 继续执行循环。 表达式3:修改计数变量的值。 3个表达式之间用分号分割。,-15-,本章内容安排,while循环 dowhile循环 for循环 高级循环 switch,1、for的变化形式1,#include int main() int i,sum; for( i=1, sum=0; i=100; i+) sum=sum+i; std:cout“Sum: “sum“n”; return 0; ,初始化多个变量时,用逗号进行 分
7、割。,for的变化形式2,#include int main() int i=1,sum=0; for( ; i=100; i+ ) sum=sum+i; std:cout“Sum: “sum“n”; return 0; ,3个表达式中的任意1个可以为空, 但对应的分号不能省略。,for的变化形式3,#include int main() int i=1,sum=0; for( ; i=100; ) sum=sum+i; i+; std:cout“Sum: “sum“n”; return 0; ,将表达式3转移到循环体内部,已 经退化为while循环。,for的变化形式4,#include i
8、nt main() int i=1,sum=0; for( ; ; ) sum = sum+i; if( i=100 ) break; i+; std:cout“Sum: “sum“n”; return 0; ,将3个表达式全部移出,退化为 while(true)结构。,for的变化形式5,#include int main() int i=1, sum=0; for( i=1; i=100; sum=sum+i, i+ ) ; std:cout“Sum: “sum“n”; return 0; ,将循环体内的语句转移到某个表达式中, 不提倡这种用法。,2、循环的典型问题,#include in
9、t main() int i,sum=0; for( i=1; i=100; i+ ) ; sum+=i; std:cout“Sum: “sum“n”; return 0; ,此时的for循环,执行了100次空 语句(;)。,循环的典型错误,#include int main() int i=1,sum=0; for( ; i=100; ) sum=sum+i; i+; std:cout“Sum: “sum“n”; return 0; ,循环执行sum=sum+i,而不会执行 i+,导致死循环。 养成将循环语句放在 内作为复 语句的良好习惯,不管是否只有 1条语句。,循环的典型错误,#incl
10、ude int main() int i=1,sum=0; while(i=100) ; sum+=i; i+; std:cout“Sum: “sum“n”; return 0; ,while循环后面不能加分号,否则 while一直执行空语句,导致i无 法递增,死循环。,-24-,3、循环的嵌套,在循环体内,可以包含另一个循环,从而构成循环的嵌套。 外部循环每次迭代时,内部循环都将完整循环1次,输出字符矩形,#include int main() int rows,columns; char character; std:coutrows; std:coutcolumns; std:coutc
11、haracter; std:cout“n“; ,输出字符矩形,#include int main() for( int i=0; irows; i+ ) for( int j=0; jcolumns; j+) std:coutcharacter; std:cout“n“; return 0; ,马克思手稿中的数学问题,共有30个人,其中有男人、女人和小孩,他们在一家饭馆吃饭共花费了50先令,其中每个男人花费3先令,每个女人花费2先令,每个小孩各花1先令,问30个人中男人、女人和小孩各几人? 设男人、女人和小孩的人数各为x、y、z,则通过题意可以列出下面的方程。 x+y+z=30 3x+2y+z
12、=50,穷举法,通过两个方程解3个未知数,这是一个不定方程,应该有多组解,用代数方法很难求解。 利用计算机编写程序,通过“穷举法”可以列举出所有可能的解。所谓“穷举法”,就是让计算机根据所有可能的情况,逐一去验证,从而找出所有满足要求的“解” 。 由于总人数为30人,所以x、y和z的取值范围一定为030并且为整数,在编程时,我们可以让x、y和z都从0循环到30,然后验证看哪个组合能满足方程式。,三重循环求解,int main() int x,y,z; std:cout“Man t Women t Childrenn“; for(x=0;x=30;x+) for(y=0;y=30;y+) for
13、(z=0;z=30;z+) if(x+y+z=30 ,“t”表示制表符。 分析:循环体执行313131,循环时x、y 确定后,z就会确定,不需要再循环。此外, 每种人的循环范围不一定都是30。,缩小穷举范围,int main() int x,y,z; std:cout“Man 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 ,2重循环,int main() int x,y,z; std:cout“Man t Women t Childrenn“; for(x=0;x=16;
14、x+) for(y=0;y=25;y+) z = 30 x y; if( 3*x+2*y+z=50) std:coutx“t”y“t”z“n”; return 0; ,某一次循环迭代中,x和y确定后,z便可以 计算得出,渐少了循环的次数。,1重循环的尝试,采用消元法,消去变量z,得到新的方程式 2x+y=20 对于这一方程式,我们可以采用一重循环来穷举x的所有可能,即x从0变到16,但只要x确定下来,y便可以通过方程式来确定,x和y确定下来,则z可以由x+y+z=30确定。,1重循环(小Bug),int main() int x,y,z; std:cout“Man t Women t Chil
15、drenn“; for(x=0; x=16; x+) y = 20 - 2*x; z = 30 - x - y; if( 3*x+2*y+z=50) std:coutx“t”y“t”z“n”; return 0; ,1重循环,int main() int x,y,z; std:cout=0 ,-35-,本章内容安排,while循环 dowhile循环 for循环 高级循环 switch,switch的动机,对同一个变量,若存在多个分支判断情况,使用嵌套的if语句,将导致代码非常烦琐混乱,不易理解且难以维护。 switch语句,检查表达式,根据结果匹配执行多个代码块中的1个。,switch的基本
16、结构,switch(表达式) case 常量1: 语句1; break; case 常量2: 语句2; break; case 常量n: 语句n; break; default: 语句n+1; ,switch的表达式必须是一个整数值。 case分支后必须为常量,不能是变 量或者表达式,分支间不允许重复。 switch语句执行时,若匹配到某个 case,执行后面的语句;若没有匹 配的case,执行default部分。,通常每个case分支,都应该有break 语句,用于退出switch。若某个 case没有break,当前分支执行完 后,继续下一个case分支。 良好编程习惯:保留default
17、,处理 特殊情况。,等级分转百分制,#include int main() char grade; int score; std:coutgrade; return 0; ,等级分转百分制,switch( grade ) case A: score = 95; break; case B: score = 85; break; case C: score = 75; break; case D: score =65; break; default: std:cout“Its not even a grade!n”; std:cout“Your score is: “score“n”;,case之后必须为整数或字符常量。,等级分转百分制:考虑小写字母,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: std:cout“Its not even a grade!n”; ,
链接地址:https://www.31doc.com/p-2602160.html