《控制程序流程》PPT课件.ppt
第04章控制程序流程,-2-,本章内容安排,while循环dowhile循环for循环高级循环switch,-3-,循环的概念,计算机擅长的工作之一是重复做相同的事情。许多编程任务可以通过重复相同的操作来完成,通过指定次数或设定条件来控制执行过程。多次重复执行的结构称为循环,每一次循环称为迭代。while、dowhile、for,-4-,while循环,在指定条件为true的情况下,程序重复执行,直到指定条件变为false。条件放在while之后的()内,循环执行的语句放在一对内。,while(表达式)循环体语句;,-5-,显示099,#include int main()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;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:coutcounter;multiples+;return 0;,在循环中遇到continue语句,将 跳过余下的语句,执行下一次 迭代。break结束当前循环,而continue 结束本次迭代。,-9-,本章内容安排,while循环dowhile循环for循环高级循环switch,-10-,dowhile循环,while在执行循环前检查条件,如果此时条件为false,则一次循环也不执行。dowhile在循环之后检查条件,条件为true,继续循环,条件为false结束循环。,do 循环体语句;while(表达式);,-11-,重复显示单词指定次数,#include int main()int badger;std:coutbadger;do std:cout0);std:coutn;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;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;,初始化多个变量时,用逗号进行 分割。,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 int 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 int 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条语句。,循环的典型错误,#include 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:coutcharacter;std:coutn;,输出字符矩形,#include int main()for(int i=0;irows;i+)for(int j=0;jcolumns;j+)std:coutcharacter;std:coutn;return 0;,马克思手稿中的数学问题,共有30个人,其中有男人、女人和小孩,他们在一家饭馆吃饭共花费了50先令,其中每个男人花费3先令,每个女人花费2先令,每个小孩各花1先令,问30个人中男人、女人和小孩各几人?设男人、女人和小孩的人数各为x、y、z,则通过题意可以列出下面的方程。x+y+z=303x+2y+z=50,穷举法,通过两个方程解3个未知数,这是一个不定方程,应该有多组解,用代数方法很难求解。利用计算机编写程序,通过“穷举法”可以列举出所有可能的解。所谓“穷举法”,就是让计算机根据所有可能的情况,逐一去验证,从而找出所有满足要求的“解”。由于总人数为30人,所以x、y和z的取值范围一定为030并且为整数,在编程时,我们可以让x、y和z都从0循环到30,然后验证看哪个组合能满足方程式。,三重循环求解,int main()int x,y,z;std: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,“t”表示制表符。分析:循环体执行313131,循环时x、y 确定后,z就会确定,不需要再循环。此外,每种人的循环范围不一定都是30。,缩小穷举范围,int main()int x,y,z;std: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,2重循环,int main()int x,y,z;std: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)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: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)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的基本结构,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,处理 特殊情况。,等级分转百分制,#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”;,