class05控制流循环语句.ppt

上传人:小飞机 文档编号:6503118 上传时间:2023-11-07 格式:PPT 页数:27 大小:288KB
返回 下载 相关 举报
class05控制流循环语句.ppt_第1页
第1页 / 共27页
class05控制流循环语句.ppt_第2页
第2页 / 共27页
class05控制流循环语句.ppt_第3页
第3页 / 共27页
class05控制流循环语句.ppt_第4页
第4页 / 共27页
class05控制流循环语句.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《class05控制流循环语句.ppt》由会员分享,可在线阅读,更多相关《class05控制流循环语句.ppt(27页珍藏版)》请在三一办公上搜索。

1、,面向对象程序设计与实践,第5课控制流循环语句,主讲人:杨峰,Page 1,本课主要内容,while语句do-while语句for语句综合实例,Page 2,1 while语句,一般形式,while(expression)statement,首先对expression求值,若值非0,则执行statement。然后再对expression求值,如此反复直至expression为0.expression可以是任何表达式,Page 3,1 while语句,while(-1).和while(1).,二者相同,都是死循环。因为-1和1都是非0。,4,int main()int alphaTotal=0;

2、int upperTotal=0;int lowerTotal=0;int numberTotal=0;int spaceTotal=0;int otherTotal=0;char ch;while(ch=getchar()!=n)if(isalpha(ch)+alphaTotal;if(isupper(ch)+upperTotal;else+lowerTotal;else if(isdigit(ch)+numberTotal;else if(isspace(ch)+spaceTotal;else+otherTotal;,以 统计输入字符个数为例,变量使用前必须初始化。编译器不会自动把变量设置

3、为0,如果不初始化,变量中就是一个垃圾值,计算结果肯定不正确。,5,if(isalpha(ch)可以改为if(ch=A&ch=a&ch=A&ch=a&ch=0&ch=9)if(isspace(ch)可以改为if(ch=)或 if(ch=0 x20)注意循环判断表达式,因为赋值运算符的优先级低,所以必须加括号。,isalpha()、isupper()、isdigit()、isspace()函数是标准库提供的字符类型判断函数。自己写也很简单,比如:,Page 6,2 do-while语句,一般形式,dostatementwhile(expression);,先执行statement,再对expre

4、ssion求值,若值非0,再执行statement,如此反复直至expression为0.注意结尾的分号。因为整个do-while 是一个语句。,7,int sum=0;int num=0;string input;bool quitFlag=false;dogetline(cin,input);if(input=quit|input=exit)quitFlag=true;elseif(input=0)+num;/no need to add sumcout 100)cout 输入数据错误!跳过 endl;elsesum+=score;+num;cout 输入正确,现在人数 num 现在总分

5、sum endl;while(quitFlag=false);,输入分数的例子:,Page 8,3 for语句,一般形式,for(expr1;expr2;expr3)statement,等价于expr1;while(expr2)statementexpr3;,Page 9,3 for语句,int sum=0;for(int i=1;i=num;+i)sum+=i;,由于for循环和while循环完全等价,所以具体使用哪种形式完全按个人喜好而定。,求,for循环的3个表达式中的任一个都可以省略,省略表达式1int i=1;for(;i=num;+i)sum+=i;,省略表达式2for(int i

6、=1;+i)if(i num)break;sum+=i;,for(int i=1;i=num;)sum+=i;+i;省略表达式3,int i=1;for(;)if(i num)break;sum+=i;+i;全部省略,Page 10,4 break和continue,break用于跳出当前语句,即跳出switch或循环语句。continue则是结束本次循环,即跳过循环体下面尚未执行的语句,执行对判定表达式的求值。,只对n以内的奇数求和:,for(int i=1;i=num;+i)if(i%2=0)continue;sum+=i;,for(int i=1;i=num;i+=2)sum+=i;,或

7、,Page 11,5 多重循环,百钱百鸡问题,100元买了100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡3只一元,问100只鸡中有几只公鸡,几只母鸡,几只小鸡?用多重循环求解,实际上是个穷举法:公鸡数目从020循环,母鸡从033循环,小鸡等于100减去公鸡和母鸡数目,计算每种情况的价格,看哪组数目正好是100,遇到这个数就输出。由于问题可能有多个解,所以找到一个解后还要继续循环,12,#include using namespace std;const int COCKPRICE=5;const int HENPRICE=3;const int CHICKENPERYUAN=3;/why n

8、ot const double CHICKPRICE=1.0/3;const int TOTALMONEY=100;const int TOTALCHICK=100;int main()for(int cock=0;cock=TOTALMONEY/COCKPRICE;+cock)for(int hen=0;hen=TOTALMONEY/HENPRICE;+hen)int chicken=TOTALCHICK-cock-hen;if(chicken%CHICKENPERYUAN=0,Page 13,6 程序示例,1、求,问题描述:目标:见输出输入:n输出:算法:用双重循环实现。外层循环i从1n循

9、环求累加和,内层循环求,14,int main()int num;cout num;while(num 10)cout num;int sum=0;for(int i=1;i 1)cout+;cout i!;cout=sum endl;,注意累加和累乘的结果变量都必须先赋初值,15,这个代码可以正常工作,但有2个问题。1、阶乘的数值增长很快,int能表示的范围不太够用。而32位系统中long和int都是32位,所以sum和factorial应改为64位的long long类型。2、可以对算法进行小小的改进以提高计算效率。比如求1!+2!+3!,那么外层循环执行3次,第一次时内层循环求1!,第2

10、次时内层循环求12,第3次时内层循环求123。这样12就被求了2次,如果n很大的话,多执行的乘法运算就会较大幅度的降低执行效率。针对这个问题,实际上,只要不每次循环时重新将factorial设置为初值1,就可以保留住上一次累乘的结果,并将2层循环简化为单层循环,,long long sum=0;long long factorial=1;for(int i=1;i=num;+i)factorial*=i;sum+=factorial;,Page 16,6 程序示例,2、猴子吃桃问题(第3章22题),问题描述:目标:见算法输入:无输出:见算法算法:,即,输出,17,int main()int n

11、=1;for(int i=1;i10;+i)n=2*(n+1);cout n endl;,注意的是表达式2应该用还是=。保险起见,假设只算3天,应该是10个桃子。用得到正确的结果,而用=得到是22,不正确。所以应该用用还是=,是个很重要的问题,很容易犯差1错误(off-by-one)。在拿不准的情况下,应该用较小的值进行测试和验算以确保采用正确的判断表达式。,Page 18,6 程序示例,3、判断一个数是否是素数,问题描述:目标:判断一个正数是否是素数输入:用户输入任一正整数n输出:如果该数是素数,显示“是素数”,否则显示“不是素数”算法:1、正数1和2一定是素数,直接输出结果。2、如果是大于

12、2的数,因子变量从2到 循环3、若所有因子均不能整除n,则n为素数,否则不是素数,19,int main()int num;cout num;while(num num;if(num 3)/1 or 2cout num 是素数 endl;return 0;int factor;for(factor=2;factor=(int)sqrt(double)num);+factor)if(num%factor=0)cout num 不是素数,有一个因子 factor endl;return 0;cout num 是素数 endl;return 0;,注意循环判断表达式factor(sqrt(stati

13、c_cast(num),20,使用sqrt()函数求平方根需要包含头文件。这个函数返回一个double型的变量,而循环变量factor是一个整型变量,因为不是赋值,而是关系比较运算,所以必须执行一个强制类型转换。sqrt()可以接收3种参数,可以接收一个long型变量,或者是一个float型变量,或者是一个double型变量现在num是一个整型变量,编译器不知道应该把num转换成double型还是long型,所以报一个编译错“sqrt函数调用有歧义”。因此,需要加一个强制类型转换,比如转换成double。换个角度来考虑,把这个表达式写成:,factor*factor=num;,Page 21,

14、6 程序示例,4、求最大公约数和最小公倍数,问题描述:目标:给定任2个正数,计算它们的最大公约数和最小公倍数输入:用户输入任意2个正数输出:它们的最大公约数和最小公倍数算法:求最大公约数GCD(设mn),求最小公倍数LCM,22,int main()int m,n;cout m n;while(m m n;int product=m*n;while(m!=0)int residue=n%m;n=m;m=residue;cout 最大公约数是 n endl;cout 最小公倍数是 product/n endl;,按照迭代公式,上一次的循环的m存放到变量n中,上一次循环得到的余数存放到变量m中,因

15、此循环完成后,m和n的值都被修改了。由于求最小公倍数需要mn的值,所以必须在迭代前就把mn的值保存到product里面。另一个要注意的问题是:虽然迭代公式中假设mn,实际上第一次循环就交换了m和n的值。,Page 23,6 程序示例,5、求阶梯型电阻电路的等值电阻,假设有如下阶梯型电阻电路,共有n节,每节一个串联电阻,一个并联电阻,共2n个电阻,所有电阻阻值相等,求所有电阻的等效电阻。,Page 24,6 程序示例,5、求阶梯型电阻电路的等值电阻,问题描述:目标:求如图阶梯型电阻电路等值电阻输入:电阻值R,电路节数n输出:等值电阻Req算法:1、计算最末端2个电阻的串联阻值;2、计算与前一节并

16、联支路的并联值;3、串联前一节的串联支路;4、依次向前递推,直至第1节5、输出计算结果,25,int main()int n;double resist;cout n;cout resist;while(resist:epsilon()cout resist;double req=0;if(n 0)req=2*resist;for(int i=n-1;i=1;-i)req=resist+1/(1/req+1/resist);cout 等值电阻为 req endl;,电阻值输入时要求用户输入正确的值;而n没有判断用户输入,而是在后面的计算前加了一个n是否有效的判断。for循环中的判断表达式用 i=1 比 i=1 更保险一些。算法的描述有多种形式:步骤式的语言描述;流程图描述;数学描述。应根据具体的问题选择合适的算法描述方法。,Page 26,The End,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号