class05控制流循环语句.ppt

上传人:tia****nde 文档编号:12805410 上传时间:2020-05-25 格式:PPT 页数:27 大小:325.50KB
返回 下载 相关 举报
class05控制流循环语句.ppt_第1页
第1页 / 共27页
class05控制流循环语句.ppt_第2页
第2页 / 共27页
class05控制流循环语句.ppt_第3页
第3页 / 共27页
点击查看更多>>
资源描述
,面向对象程序设计与实践,第5课控制流循环语句,主讲人:杨峰,Page1,本课主要内容,while语句do-while语句for语句综合实例,Page2,1while语句,一般形式,while(expression)statement,首先对expression求值,若值非0,则执行statement。然后再对expression求值,如此反复直至expression为0.expression可以是任何表达式,Page3,1while语句,while(-1).和while(1).,二者相同,都是死循环。因为-1和1都是非0。,4,intmain()intalphaTotal=0;intupperTotal=0;intlowerTotal=0;intnumberTotal=0;intspaceTotal=0;intotherTotal=0;charch;while(ch=getchar()!=n)if(isalpha(ch)+alphaTotal;if(isupper(ch)+upperTotal;else+lowerTotal;elseif(isdigit(ch)+numberTotal;elseif(isspace(ch)+spaceTotal;else+otherTotal;,以统计输入字符个数为例,变量使用前必须初始化。编译器不会自动把变量设置为0,如果不初始化,变量中就是一个垃圾值,计算结果肯定不正确。,5,if(isalpha(ch)可以改为if(ch=A,先执行statement,再对expression求值,若值非0,再执行statement,如此反复直至expression为0.注意结尾的分号。因为整个do-while是一个语句。,7,intsum=0;intnum=0;stringinput;boolquitFlag=false;dogetline(cin,input);if(input=quit|input=exit)quitFlag=true;elseif(input=0)+num;/noneedtoaddsumcout100)cout输入数据错误!跳过endl;elsesum+=score;+num;cout输入正确,现在人数num现在总分sumendl;while(quitFlag=false);,输入分数的例子:,Page8,3for语句,一般形式,for(expr1;expr2;expr3)statement,等价于expr1;while(expr2)statementexpr3;,Page9,3for语句,intsum=0;for(inti=1;i=num;+i)sum+=i;,由于for循环和while循环完全等价,所以具体使用哪种形式完全按个人喜好而定。,求,for循环的3个表达式中的任一个都可以省略,省略表达式1inti=1;for(;inum)break;sum+=i;,for(inti=1;inum)break;sum+=i;+i;全部省略,Page10,4break和continue,break用于跳出当前语句,即跳出switch或循环语句。continue则是结束本次循环,即跳过循环体下面尚未执行的语句,执行对判定表达式的求值。,只对n以内的奇数求和:,for(inti=1;i=num;+i)if(i%2=0)continue;sum+=i;,for(inti=1;i=num;i+=2)sum+=i;,或,Page11,5多重循环,百钱百鸡问题,100元买了100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡3只一元,问100只鸡中有几只公鸡,几只母鸡,几只小鸡?用多重循环求解,实际上是个穷举法:公鸡数目从020循环,母鸡从033循环,小鸡等于100减去公鸡和母鸡数目,计算每种情况的价格,看哪组数目正好是100,遇到这个数就输出。由于问题可能有多个解,所以找到一个解后还要继续循环,12,#includeusingnamespacestd;constintCOCKPRICE=5;constintHENPRICE=3;constintCHICKENPERYUAN=3;/whynotconstdoubleCHICKPRICE=1.0/3;constintTOTALMONEY=100;constintTOTALCHICK=100;intmain()for(intcock=0;cocknum;intsum=0;for(inti=1;i1)cout+;couti!;cout=sumendl;,注意累加和累乘的结果变量都必须先赋初值,15,这个代码可以正常工作,但有2个问题。1、阶乘的数值增长很快,int能表示的范围不太够用。而32位系统中long和int都是32位,所以sum和factorial应改为64位的longlong类型。2、可以对算法进行小小的改进以提高计算效率。比如求1!+2!+3!,那么外层循环执行3次,第一次时内层循环求1!,第2次时内层循环求12,第3次时内层循环求123。这样12就被求了2次,如果n很大的话,多执行的乘法运算就会较大幅度的降低执行效率。针对这个问题,实际上,只要不每次循环时重新将factorial设置为初值1,就可以保留住上一次累乘的结果,并将2层循环简化为单层循环,,longlongsum=0;longlongfactorial=1;for(inti=1;i=num;+i)factorial*=i;sum+=factorial;,Page16,6程序示例,2、猴子吃桃问题(第3章22题),问题描述:目标:见算法输入:无输出:见算法算法:,即,输出,17,intmain()intn=1;for(inti=1;i10;+i)n=2*(n+1);coutnendl;,注意的是表达式2应该用还是=。保险起见,假设只算3天,应该是10个桃子。用得到正确的结果,而用=得到是22,不正确。所以应该用用num;if(num3)/1or2coutnum是素数endl;return0;intfactor;for(factor=2;factor=(int)sqrt(double)num);+factor)if(num%factor=0)coutnum不是素数,有一个因子factorendl;return0;coutnum是素数endl;return0;,注意循环判断表达式factor(sqrt(static_cast(num),20,使用sqrt()函数求平方根需要包含头文件。这个函数返回一个double型的变量,而循环变量factor是一个整型变量,因为不是赋值,而是关系比较运算,所以必须执行一个强制类型转换。sqrt()可以接收3种参数,可以接收一个long型变量,或者是一个float型变量,或者是一个double型变量现在num是一个整型变量,编译器不知道应该把num转换成double型还是long型,所以报一个编译错“sqrt函数调用有歧义”。因此,需要加一个强制类型转换,比如转换成double。换个角度来考虑,把这个表达式写成:,factor*factorn;while(mmn;intproduct=m*n;while(m!=0)intresidue=n%m;n=m;m=residue;cout最大公约数是nendl;cout最小公倍数是product/nresist;while(resist:epsilon()coutresist;doublereq=0;if(n0)req=2*resist;for(inti=n-1;i=1;-i)req=resist+1/(1/req+1/resist);cout等值电阻为req=1比i=1更保险一些。算法的描述有多种形式:步骤式的语言描述;流程图描述;数学描述。应根据具体的问题选择合适的算法描述方法。,Page26,TheEnd,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!