




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计与实践第5课控制流循环语句主讲人:杨峰0本课主要内容while语句do-while语句for语句综合实例 11 while语句一般形式while( expression )statement首先对expression求值,若值非0,则执行statement。然后再对expression求值,如此反复直至expression为0.expression可以是任何表达式 21 while语句while( -1 ).和while( 1 ).二者相同,都是死循环。因为-1和1都是非0。3int main()int alphaTotal = 0;int upperTotal = 0;int
2、 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,如果不初始化,变量中就是一个垃圾值,计算结果肯定不正确。 4if( 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()函数是标准库提供的字符类型判断函数。自己写也很简单,比如: 52 do-while语句一般形式dostatementwhil
4、e( expression );先执行statement,再对expression求值,若值非0,再执行statement ,如此反复直至expression为0.注意结尾的分号。因为整个do-while 是一个语句。6int 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 警告:0分,现在人数
5、 num 现在总分 sum endl;elseint score = atoi( input.c_str() );if( score = 0 )cout 输入数据格式错误!跳过 endl;else if( score 100 )cout 输入数据错误!跳过 endl;elsesum += score;+num;cout 输入正确,现在人数 num 现在总分 sum endl;while( quitFlag = false );输入分数的例子: 73 for语句一般形式for( expr1; expr2; expr3 )statement等价于expr1;while( expr2 )statem
6、entexpr3;83 for语句int sum = 0;for( int i=1; i=num; +i )sum += i;由于for循环和while循环完全等价,所以具体使用哪种形式完全按个人喜好而定。求for循环的3个表达式中的任一个都可以省略省略表达式1int i = 1;for( ; i num )break;sum += i;for( int i=1; i num )break;sum += i;+i;全部省略94 break和continuebreak用于跳出当前语句,即跳出switch或循环语句。continue则是结束本次循环,即跳过循环体下面尚未执行的语句,执行对判定表达式
7、的求值。只对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;或105 多重循环百钱百鸡问题 100元买了100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡3只一元,问100只鸡中有几只公鸡,几只母鸡,几只小鸡?用多重循环求解,实际上是个穷举法:公鸡数目从020循环,母鸡从033循环,小鸡等于100减去公鸡和母鸡数目,计算每种情况的价格,看哪组数目正好是100,遇到这个数就输出。由于问题可能有多个解,所以找到一个解后还要继续循环11#incl
8、ude using namespace std;const int COCKPRICE = 5;const int HENPRICE = 3;const int CHICKENPERYUAN = 3;/why not 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;
9、 +hen )int chicken = TOTALCHICK - cock - hen;if( chicken%CHICKENPERYUAN = 0 & cock*COCKPRICE + hen*HENPRICE + chicken/CHICKENPERYUAN = TOTALMONEY )cout cock = cock , hen = hen , chicken = chicken endl;return 0; 126 程序示例1、求 问题描述:目标:见输出输入:n输出:算法:用双重循环实现。外层循环i从1n循环求累加和,内层循环求 13int main()int num;cout nu
10、m;while( num 10 )cout num;int sum = 0;for( int i=1; i=num; +i )int factorial = 1;for( int j=1; j=i; +j )factorial *= j;sum += factorial;for( int i=1; i 1 )cout +;cout i !;cout = sum endl;注意累加和累乘的结果变量都必须先赋初值14这个代码可以正常工作,但有2个问题。1、阶乘的数值增长很快,int能表示的范围不太够用。而32位系统中long和int都是32位,所以sum和factorial应改为64位的long
11、long类型。2、可以对算法进行小小的改进以提高计算效率。比如求1!+2!+3!,那么外层循环执行3次,第一次时内层循环求1!,第2次时内层循环求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;156
12、程序示例2、猴子吃桃问题(第3章22题)问题描述:目标:见算法输入:无输出:见算法算法:即 输出 16int main()int n = 1;for( int i=1; i10; +i )n = 2 * (n + 1);cout n endl;注意的是表达式2应该用还是=。保险起见,假设只算3天,应该是10个桃子。用得到正确的结果,而用=得到是22,不正确。所以应该用用还是=,是个很重要的问题,很容易犯差1错误(off-by-one)。在拿不准的情况下,应该用较小的值进行测试和验算以确保采用正确的判断表达式。 176 程序示例3、判断一个数是否是素数问题描述:目标:判断一个正数是否是素数输入:
13、用户输入任一正整数n输出:如果该数是素数,显示“是素数”,否则显示“不是素数”算法:1、正数1和2一定是素数,直接输出结果。2、如果是大于2的数,因子变量从2到 循环3、若所有因子均不能整除n,则n为素数,否则不是素数18int main()int num;cout num;while( num = 0 )cout 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 )
14、cout num 不是素数,有一个因子 factor endl;return 0;cout num 是素数 endl;return 0; 注意循环判断表达式factor = (int)sqrt(double)num)很难看,为什么?如果写成C+要求的标准形式就更难看了:factor = static_cast( sqrt( static_cast(num) ) )19使用sqrt() 函数求平方根需要包含头文件。这个函数返回一个double型的变量,而循环变量factor是一个整型变量,因为不是赋值,而是关系比较运算,所以必须执行一个强制类型转换。sqrt()可以接收3种参数,可以接收一个lo
15、ng型变量,或者是一个float型变量,或者是一个double型变量现在num是一个整型变量,编译器不知道应该把num转换成double型还是long型,所以报一个编译错“sqrt函数调用有歧义” 。因此,需要加一个强制类型转换,比如转换成double。换个角度来考虑,把这个表达式写成:factor * factor = num; 206 程序示例4、求最大公约数和最小公倍数问题描述:目标:给定任2个正数,计算它们的最大公约数和最小公倍数输入:用户输入任意2个正数输出:它们的最大公约数和最小公倍数算法:求最大公约数GCD(设mn) 求最小公倍数LCM21int main()int m, n;c
16、out m n;while( m =0 | n = 0 )cout 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中,因此循环完成后,m和n的值都被修改了。由于求最小公倍数需要mn的值,所以必须在迭代前就把mn的值保存到product里面。另一个要注意的问题是:虽然迭代公式中假设mn,实际上第一次循环就交换了m和n的值。226 程序示例5、求阶梯型电阻电路的等值电阻假设有如下阶梯型电阻电路,共有n节,每节一个串联电阻,一个并联电阻,共2n个电阻,所有电阻阻值相等,求所有电阻的等效电阻。 236 程序示例5、求阶梯型电阻电路的等值电阻问题描述:目标:求如图阶梯型电阻电路等值电阻输入:电阻值R,电路节数n输出:等值电阻Req算法:1、计算最末端2个电阻的串联阻值;2、计算与前一节并联支路的并联值;3、串联前一节的串联支路;4、依次向前递推,直至第1节5、输出计算结果24int main()int n;double resist
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装箱运输合同样本
- 分包单位的合同范本
- 代理销售中介合同范本
- 农民集资建房合同范本
- 弘扬中华优良传统文化过中国人自己的传统节日单元整体教学设计
- 做好班主任 做一名有智慧的班主任 校园廉洁 14
- 2025家庭居室设计施工一体化合同
- 2025机电安装工程合同乙种本范本
- 2025YY年房屋租赁合同协议
- 语文核心素养的培育知到课后答案智慧树章节测试答案2025年春湖南师范大学
- 第四课 人民民主专政的社会主义国家 课件-高考政治一轮复习统编版必修三政治与法治
- 2025年郑州黄河护理职业学院单招职业适应性考试题库带答案
- (完整版)特殊教育与随班就读
- 旋流风口RA-N3选型计算表格
- 《VB程序结构基础》课件教程
- 个人房屋租赁合同标准版范本
- DBJ50-T-157-2022房屋建筑和市政基础设施工程施工现场从业人员配备标准
- 2024年中考模拟试卷地理(湖北卷)
- 沙塘湾二级渔港防波堤工程施工组织设计
- 大学生心理健康教育知到智慧树章节测试课后答案2024年秋长春医学高等专科学校
- 慢肾风中医辨证施护
评论
0/150
提交评论