ch04 循环控制_第1页
ch04 循环控制_第2页
ch04 循环控制_第3页
ch04 循环控制_第4页
ch04 循环控制_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、重复重复N次循环次循环while循环循环do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v某一组语句要重复执行某一组语句要重复执行N次次v“重复重复n n次次”循环通常用循环通常用 for for 语句实现,语句实现,如将如将1 1到到100100共一百个数相加可写为:共一百个数相加可写为: s=0;s=0; for (i=1; i=100; +i) s+=i; for (i=1; i=100; +i) s+=i; i 称为循环变量称为循环变量循环条件每次循环后循环变量的变化v 格式:格式:forfor(表达式(表达式1 1;表达式;表达式2 2;表达式;表达式3

2、3) 语句语句v执行过程:执行过程:1.1.执行表达式执行表达式1 12.2.执行表达式执行表达式2 23.3.如果表达式如果表达式2 2的结果为的结果为“truetrue”,则执行循环体,则执行循环体和表达式和表达式3 3,然后回到,然后回到2 2,否则,否则forfor语句执行结束语句执行结束循环体循环体循环控制行循环控制行v作为计数循环,可以理解为作为计数循环,可以理解为for(for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值) ) 符合循环条件时的执行语句符合循环条件时的执行语句v循环体所有语句的一次完全执行称为一个循循环体所有语句的一次完全执行称为

3、一个循环周期环周期v循环体可以是复合语句或空语句循环体可以是复合语句或空语句v单个分号组成的语句成为空语句单个分号组成的语句成为空语句v用用 括起来的一组语句称为复合语句。括起来的一组语句称为复合语句。在逻辑上看成一个语句。在逻辑上看成一个语句。v复合语句可以放在任何单语句出现的地复合语句可以放在任何单语句出现的地方方v在复合语句中可以定义变量(慎用)在复合语句中可以定义变量(慎用)v某班级有某班级有100个学生,设计一程序统计该班个学生,设计一程序统计该班级某门考试成绩中的最高分、最低分和平级某门考试成绩中的最高分、最低分和平均分。均分。 v方案一:先输入方案一:先输入100个整型数,保存在

4、各自个整型数,保存在各自的变量中。然后依次检查这的变量中。然后依次检查这100个数,找出个数,找出最大的和最小的。在找的过程中顺便可以最大的和最小的。在找的过程中顺便可以把所有的数都加起来。最后将总和除把所有的数都加起来。最后将总和除100就就得到了平均值。得到了平均值。 v需要定义需要定义100个变量个变量v需要输入需要输入100个变量的值个变量的值v从从100个变量中找出最大者,需要个变量中找出最大者,需要100个个if 语句语句v从从100个变量中找出最小者,需要个变量中找出最小者,需要100个个if 语句语句v将这将这100个变量加起来需要一个长长的个变量加起来需要一个长长的算术表达式

5、算术表达式v每个学生的分数在处理过后就没用了,每个学生的分数在处理过后就没用了,为此,可以用一个变量保存当前正在处为此,可以用一个变量保存当前正在处理的分数理的分数v每次输入分数的同时将它们加起来:每次输入分数的同时将它们加起来:70加加40等于等于110,110加加80等于等于190。并记住最低分的和最高分的值。上述过并记住最低分的和最高分的值。上述过程重复程重复100次。次。v定义:定义: int value, total,max, min; v当输入每个数值时必须执行下面的步骤,这当输入每个数值时必须执行下面的步骤,这可以用可以用for循环实现循环实现请求用户输入一个整数值,将它存储在变

6、量请求用户输入一个整数值,将它存储在变量value中。中。将将value加入到保存当前和的变量加入到保存当前和的变量total中。中。如果如果value大于大于max,将,将value存于存于max。如果如果value小于小于min,将,将value存于存于min。#includeusing namespace std;int main() int value, total, max, min, i; /value:当前输入数据,:当前输入数据,i为循环变量为循环变量 total = 0; max = 0; min = 100; /变量的初始化变量的初始化 for (i=1; i=100; +

7、i) cout n请输入第请输入第 i value; total += value; if (value max) max = value; if (value min) min = value; cout n最高分最高分: max endl; cout 最低分最低分: min endl; cout 平均分平均分: total / 100 endl; return 0;注意缩进注意缩进vfor循环的三个表达式可以是任意表达式循环的三个表达式可以是任意表达式v三个表达式都是可选的。三个表达式都是可选的。v如果循环不需要任何初始化工作,则表达如果循环不需要任何初始化工作,则表达式式1可以缺省。如循

8、环前需要做多个初始可以缺省。如循环前需要做多个初始化工作,可以将多个初始化工作组合成一化工作,可以将多个初始化工作组合成一个逗号表达式,作为表达式个逗号表达式,作为表达式1。v格式:表达式格式:表达式1,表达式,表达式2,,表达式表达式n v执行过程:先执行表达式执行过程:先执行表达式1,再执行表达式,再执行表达式2, ,再执行表达式,再执行表达式n,整个表达式的计算,整个表达式的计算结果为最后一个表达式的值结果为最后一个表达式的值v逗号运算符的优先级是所有运算符中最低的逗号运算符的优先级是所有运算符中最低的 如如a的初值为的初值为0,则表达式,则表达式 a += 1, a += 2, a +

9、= 3, a += 4, a += 5的结果为的结果为 15 v有了逗号表达式,从有了逗号表达式,从1加到加到100的问题就的问题就可以只用一个语句:可以只用一个语句:for (i=1, s=0; i=100; +i) s+=i; 或将所有的初始化都放在循环外,即或将所有的初始化都放在循环外,即i=1; s=0;for ( ; i=100; +i) s+=i;v建议还是用建议还是用 s=0;s=0; for (i=1; i=100; +i) s+=i; for (i=1; i=100; +i) s+=i;v表达式表达式2也不一定是关系表达式。它可以是逻辑也不一定是关系表达式。它可以是逻辑表达式

10、,甚至可以是算术表达式。当表达式表达式,甚至可以是算术表达式。当表达式2是是算术表达式时,只要表达式的值为非算术表达式时,只要表达式的值为非0,就执行,就执行循环体,表达式的值为循环体,表达式的值为0时退出循环。时退出循环。v如果表达式如果表达式2省略,即不判断循环条件,循环将省略,即不判断循环条件,循环将无终止地进行下去。无终止地进行下去。v无终止的循环称为无终止的循环称为“死循环死循环” v最简单的死循环是最简单的死循环是 for (;); v要结束一个无限循环,必须从键盘上输入特殊要结束一个无限循环,必须从键盘上输入特殊的命令以中断程序执行并强制退出的命令以中断程序执行并强制退出 v表达

11、式表达式3也可以是任何表达式,一般为赋值表也可以是任何表达式,一般为赋值表达式或逗号表达式。表达式达式或逗号表达式。表达式3是在每个循环周是在每个循环周期结束后对循环变量的修正。表达式期结束后对循环变量的修正。表达式3也可以也可以省略,此时做完循环体后直接执行表达式省略,此时做完循环体后直接执行表达式2。v如从如从1加到加到100,可以写为,可以写为 s=0; for (i=1; i=100; ) s+=i, i+; 或或 s=0; for (i=1; i=100; s+=i, i+) ;v将一个将一个for循环嵌入到另一个循环嵌入到另一个for循环中循环中 v内层的内层的for循环在外层循环

12、的每一个周期循环在外层循环的每一个周期中都将执行它的所有的周期中都将执行它的所有的周期 v每个每个for循环都要有一个自己的循环变量循环都要有一个自己的循环变量以避免循环变量间的互相干扰以避免循环变量间的互相干扰 #includeusing namespace std;void main() int i, j; for (i=1; i=9; +i) for (j=1; j=9; +j) cout i*j t; cout endl; 重复重复N次循环次循环while循环循环do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v如何对不同人数的班级完成分数统计任务如何对不同

13、人数的班级完成分数统计任务?v方法一:在程序的开始部分请求用户输入数方法一:在程序的开始部分请求用户输入数据个数,并将之存放在某个变量中,以此来据个数,并将之存放在某个变量中,以此来替换替换for语句控制行中使用的常量语句控制行中使用的常量100 v方法二:定义一个特殊的输入数据,用户可方法二:定义一个特殊的输入数据,用户可以通过输入该数据来标识输入序列的结束以通过输入该数据来标识输入序列的结束 v方法二需要另外一种的循环控制结构方法二需要另外一种的循环控制结构v格式:格式:while (表达式)(表达式) 语句语句v执行过程:先计算出条件表达式的值。如果执行过程:先计算出条件表达式的值。如果

14、是是false,循环终止,并接着执行在整个,循环终止,并接着执行在整个while循环之后的语句。如果是循环之后的语句。如果是true,整个循环体将,整个循环体将被执行,而后又回到被执行,而后又回到while语句的第一行,再语句的第一行,再次对条件进行检查。次对条件进行检查。 v用途:用于循环次数不定的循环。循环是否用途:用于循环次数不定的循环。循环是否结束取决于某一个条件是否成立结束取决于某一个条件是否成立v设计一个程序,统计某个班级某门考试设计一个程序,统计某个班级某门考试成绩中的最高分、最低分和平均分。当成绩中的最高分、最低分和平均分。当输入的分数为输入的分数为-1时,输入结束时,输入结束

15、 int main() int value, total, max, min, noOfInput; / total总分,总分, noOfInput人数人数 total = 0; max = 0; min = 100; noOfInput = 0;/置初值置初值 cout value; while (value != -1) +noOfInput; total += value; if (value max) max = value; if (value min) min = value; cout n请输入第请输入第 noOfInput + 1 value; cout n最高分:最高分: m

16、ax endl; cout 最低分:最低分: min endl; cout 平均分:平均分: total / noOfInput 0.000001) while (p0.000001) ex += p; ex += p; 计算新的计算新的p p; 问题:如何计算p?计算第i个p,需要两个i次的循环。第一个循环计算xi,第二个循环计算i!解决方案:从前一项计算后一项。如果p是第i项的值,则第 i+1 项的值为 p * x / ( i + 1) int main()int main()double ex, x, p;/exdouble ex, x, p;/ex存储存储e ex x的值,的值,p p

17、保存当前项的值保存当前项的值 int i;int i; cout cout x; cin x; ex=0; p=1; i=0; ex=0; p=1; i=0; while (p 1e-6) while (p 1e-6) ex += p; ex += p; +i; +i; p = p p = p * * x / i; x / i; cout e cout e的的 x x 次方等于次方等于: ex endl; ex endl; return 0;return 0;/ Capitalize lowercase lettersint main( ) char c; cout c; while(c !=

18、 .) if (z= c & c = a) cout c + A - a; else cout c; return 0; 重复重复N次循环次循环while循环循环do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v格式:格式: do do 语句语句 while (while (表达式表达式) ) v执行过程:先执行循环体,然后判断循环条件。如条执行过程:先执行循环体,然后判断循环条件。如条件成立,继续循环,直到条件为假件成立,继续循环,直到条件为假v如将若干个输入数相加,直到输入如将若干个输入数相加,直到输入0 0为止。为止。 total = 0;total

19、= 0; do do cout cout value ; cin value ; total += value; total += value; while (value != 0); while (value != 0);重复重复N次循环次循环while循环循环do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v考虑一个读入数据直到读到标志值的问题。考虑一个读入数据直到读到标志值的问题。如用自然语言描述,基于标志的循环的结构如用自然语言描述,基于标志的循环的结构由以下步骤组成:由以下步骤组成:读入一个值读入一个值如果读入值与标志值相等,则退出循环如果读入值与标志值相

20、等,则退出循环执行在读入那个特定值情况下需要执行的语句执行在读入那个特定值情况下需要执行的语句v当一个循环中有一些操作必须在条件测试之当一个循环中有一些操作必须在条件测试之前执行时,称为循环的中途退出问题。前执行时,称为循环的中途退出问题。 v由于循环语句是先判断条件再决定是否执行循环由于循环语句是先判断条件再决定是否执行循环体,循环的中途退出将使得循环体中的某些语句体,循环的中途退出将使得循环体中的某些语句必须重复出现。必须重复出现。v基于标志的循环结构被改为:基于标志的循环结构被改为:读入一个值读入一个值while (读入值与标志值不相等)(读入值与标志值不相等) 执行在读入那个特定值情况

21、下需要执行的语句执行在读入那个特定值情况下需要执行的语句 读入一个值读入一个值 vbreak语句:跳出循环语句:跳出循环v上述问题可以用下列方案解决:上述问题可以用下列方案解决:while (true) 提示用户并读入数据提示用户并读入数据 if (value=标志标志) break; 根据数据作出处理根据数据作出处理 vcontinue语句:跳出当前循环周期语句:跳出当前循环周期重复重复N次循环次循环while循环循环do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v对所有可能的情况一种一种去尝试,直对所有可能的情况一种一种去尝试,直到找到正确的答案。到找到正确的

22、答案。v枚举法的实现基础是循环。枚举法的实现基础是循环。v用用50元钱买了三种水果。各种水果加起来一共元钱买了三种水果。各种水果加起来一共100个。西个。西瓜瓜5元一个,苹果元一个,苹果1元一个,桔子元一个,桔子1元元3个,设计一程序输个,设计一程序输出每种水果各买了几个出每种水果各买了几个 v它有两个约束条件:它有两个约束条件:第一是三种水果一共第一是三种水果一共100个;个;第二是三种水果一共花了第二是三种水果一共花了50元元v可以按一个约束条件列出所有可行的情况,然后对每个可以按一个约束条件列出所有可行的情况,然后对每个可能解检查它是否满足第二个约束条件可能解检查它是否满足第二个约束条件

23、 。也可以用第二。也可以用第二个约束条件列出所有情况,然后对每个可能解检查它是个约束条件列出所有情况,然后对每个可能解检查它是否满足第一个约束条件否满足第一个约束条件 。#include using namespace std;int main() int mellon, apple, orange; /分别表示西瓜数、苹果数和桔子数分别表示西瓜数、苹果数和桔子数 for (mellon=1; mellon10; +mellon) / 对每种可能的西瓜数对每种可能的西瓜数 for ( apple=1; apple 50 - 5 * mellon; +apple) /当西瓜数给定后可能的苹果数当

24、西瓜数给定后可能的苹果数 orange = 3*(50-5*mellon-apple); / 剩下的钱全买了桔子剩下的钱全买了桔子 if (mellon+apple+orange = 100) / 三种水果数之和是否为三种水果数之和是否为100 cout mellon: mellon ; cout apple: apple ; cout orange: orange endl; return 0; Mellon:1 apple:18 orange:81Mellon:2 apple:11 orange:87Mellon:3 apple:4 orange:93上地理课时,四个学生回答我国四大湖的大

25、小时分别说:上地理课时,四个学生回答我国四大湖的大小时分别说: 甲:洞庭最大,洪泽最小,鄱阳第三甲:洞庭最大,洪泽最小,鄱阳第三 乙:洪泽最大,洞庭最小,鄱阳第二,太湖第三乙:洪泽最大,洞庭最小,鄱阳第二,太湖第三 丙:洪泽最小,洞庭第三丙:洪泽最小,洞庭第三 丁:鄱阳最大,太湖最小,洪泽第二,洞庭第三丁:鄱阳最大,太湖最小,洪泽第二,洞庭第三对于每个湖的大小,每个人仅答对一个,设计一程序让对于每个湖的大小,每个人仅答对一个,设计一程序让计算机通过这些信息去判别四个湖的大小。计算机通过这些信息去判别四个湖的大小。v如果如果用用a,b,c,d分别表示四个湖的排序。分别表示四个湖的排序。a表示洞庭

26、湖,表示洞庭湖,b表示洪泽湖,表示洪泽湖,c表示鄱阳湖,表示鄱阳湖,d表示太湖。我们可以表示太湖。我们可以假设:假设:洞庭最大,洪泽第二,鄱阳第三,太湖第四,洞庭最大,洪泽第二,鄱阳第三,太湖第四,然后检查每位同学是否都讲对了一个。如果不是,再然后检查每位同学是否都讲对了一个。如果不是,再尝试下一种情况:洞庭最大,洪泽第二,鄱阳第四,尝试下一种情况:洞庭最大,洪泽第二,鄱阳第四,太湖第三,再检查每位同学是否都讲对了一个。尝试太湖第三,再检查每位同学是否都讲对了一个。尝试所有可能的情况,直到满足每位同学都讲对一个为止。所有可能的情况,直到满足每位同学都讲对一个为止。v为了尝试所有情况,我们需要假

27、设洞庭为了尝试所有情况,我们需要假设洞庭湖可能是最大,也可能是第二、第三或湖可能是最大,也可能是第二、第三或第四。因此,第四。因此,a的值可能从的值可能从1变到变到4。同。同样,样,b, c ,d的值也都可能从的值也都可能从1变到变到4。为。为此,我们需要一个控制结构,使此,我们需要一个控制结构,使a, b, c, d的值能自动从的值能自动从1变到变到4。这种结构就是。这种结构就是循环结构。循环结构。main() int a, b, c, d; for (a=1; a=4; +a) for (b=1; b=4; +b) if ( a = b) continue; else for (c=1;

28、c=4; +c) if (c=a|c=b) continue; else d=10 a b - c; if (a=1)+(b=4)+(c=3)=1 &(b=1)+(a=4)+(c=2)+(d=3)=1 &(b=4)+(a=3)=1 &(c=1)+(d=4)+(b=2)+(a=3)=1) cout a b c d;问题:效率差解决方法:一旦找到答案就应该结束main() int a, b, c, d; bool flag = false; for (a=1; a=4; +a) for (b=1; b=4; +b) if ( a = b) continue; else fo

29、r (c=1; c=4; +c) if (c=a|c=b) continue; else d=10 a b - c; if (a=1)+(b=4)+(c=3)=1 &(b=1)+(a=4)+(c=2)+(d=3)=1 &(b=4)+(a=3)=1 &(c=1)+(d=4)+(b=2)+(a=3)=1) cout a b c d; flag = true; break; if (flag) break; if (flag) break;改进版1:程序不够简练main() int a, b, c, d; bool flag = false; for (a=1; a=4 &a

30、mp; !flag; +a) for (b=1; b=4 & !flag; +b) if ( a = b) continue; else for (c=1; c=4 ; +c) if (c=a|c=b) continue; else d=10 a b - c; if (a=1)+(b=4)+(c=3)=1 &(b=1)+(a=4)+(c=2)+(d=3)=1 &(b=4)+(a=3)=1 &(c=1)+(d=4)+(b=2)+(a=3)=1) cout a b c d; flag = true; break; 改进版2v解题思路:解题思路:让第一个位置的值从让第

31、一个位置的值从A依次变到依次变到C让第二个位置的值从让第二个位置的值从A依次变到依次变到C让第三个位置的值从让第三个位置的值从A依次变到依次变到C注意三个位置的值不能相同注意三个位置的值不能相同v可以用一个三层的嵌套循环实现,循环变量可以用一个三层的嵌套循环实现,循环变量是字符类型是字符类型int main() char c1, c2, c3; for (c1 = A; c1 = C; +c1) for (c2 = A; c2 = C; +c2) if (c1 = c2) continue; else for (c3 = A; c3 = C; +c3) if (c3 = c1 | c3 = c2) continue; else cout c1 c2 c3 endl;重复重复N次循环次循环While循环循环Do while循环循环循环的中途退出循环的中途退出枚举法枚举法贪婪法贪婪法v在求解过程的每一步都选取一个局部最优在求解过程的每一步都选取一个局部最优的策略,把问题规模缩小,最后把每一步的策略,把问题规模缩小,最后把每一步的结果合并起来形成一个全局解。的结果合并起来形成一个全局解。v基本步骤:基本步骤:从某个初始解出发从某个初始解出发采用迭代的过程,当可以向目标前进一步时,采用迭代的过程,当可以向目标前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论