1 / 75

第三章 最后一部分 —— 循环控制

第三章 最后一部分 —— 循环控制. while 循环语句 do-while 循环语句 for 循环语句 多重循环嵌套 break 语句和 continue 语句 goto 语句和标号 程序举例. 三个基本 循环结构. 在现实问题中 , 通常需要处理一些有规律的问题 , 一般形式是 在 给定条件 成立时, 反复执行某程序段 ,直到条件不成立为止。 例如: 1: 在 10000 名学生中找到学号 SNO 为 A0004 的学生 当 SNO == A0004 或者 找完 10000 个学生记录,反复执行的动作就是比较 2: 将销售金额按照降序排列

Télécharger la présentation

第三章 最后一部分 —— 循环控制

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 最后一部分——循环控制 while循环语句 do-while循环语句 for循环语句 多重循环嵌套 break语句和continue语句 goto语句和标号 程序举例 三个基本 循环结构

  2. 在现实问题中, 通常需要处理一些有规律的问题, 一般形式是在给定条件成立时,反复执行某程序段,直到条件不成立为止。 例如:1: 在10000名学生中找到学号SNO为A0004的学生 当SNO==A0004 或者 找完10000个学生记录,反复执行的动作就是比较 2: 将销售金额按照降序排列 所有销售额都从大到小排列,反复执行的动作 比较并换位 3: 输入10000条商品信息 商品信息是否少于10000条, 反复执行的动作 输入商品信息 4: 筛选出所有重量小于500克的苹果 判断是否筛选完所有苹果,反复执行的动作 判断苹果重量是否小于500克 都要反复执行某段程序, 也有一定的判断条件。反复执行的某程序段 可以被看成 循环体 ,而判断条件 可以被看作循环条件,因此 循环体 和 循环条件 是构成循环结构的要素。

  3. 循环可以被看成 在满足一定条件时 重复执行一段程序 循环条件 循环体 循环条件 循环体 循环条件在前 循环体在后 当循环 while 循环体在前 循环条件在后 直到循环 do while 循环变量相关的循环体和循环条件 组合在的循环 for

  4. 【问题】如何计算1+2+3+4+…+100 …… 100 2 3 i 1 1+2+3 1+2+3+…+100 s 1 1+2 s = s + i; /* 投入i 枚硬贝到s中*/ i = i + 1;/* 计算下次投贝数 */

  5. s=0; /* 盒子开始为空*/ i=1; /* 第1次投贝 */ while(i<=100) /* 100次投贝 */ { s=s+i; /* 投入i 枚硬贝到s中*/ i=i+1; /* 计算下次投贝数 */ }

  6. 分析一个循环问题时,通常需要分析出 1:循环体 2:循环条件 3:控制循环的循环变量 4:循环的初始状态和结束状态 5:循环的次数

  7. 循环体 当表达式为真 满足 表达式 循环体 不满足 ( a ) ( b ) while循环语句 当 表达式A为真 执行 语句A,然后再看 表达式A是否还为真,如果为真执行语句A,如此重复。当表达式A为假时,才退出循环。 while循环的一般形式如下:  while(表达式A) 语句A 例如:while(a<b) a++ ;

  8. while语句的执行过程是:先计算while后面圆括号内表达式的值,如果其值为“真”(非0),则执行语句部分(即循环体);然后再计算表达式的值,并重复上述过程,直到表达式的值为“假”(0)时,循环结束,程序控制转至循环结构的下一语句。 while循环中的表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值非零, 就可执行循环体。 while 是“当循环” 总是, 非常谨慎 走一步看一步

  9. #include <iostream> #include <cstring> Using namespace std; main() { int i,s; i=100,s=0; while(i>=1) { s=s+i; i=i-1; } Cout<<“s=”<<s<<endl; } 发生什么变化 i=i+1; s=s+i; i 初值为1,0,100的解释 根据具体例子[1~100和]来说明:while 循环是如何执行的。 #include <iostream> #include <cstring> Using namespace std; Void main() { int i,s; i=1;s=0; while(i<=100) /* 循环控制 */ { s=s+i; i=i+1; } Cout<<“s=”<<s<<endl; } 1:i将变成2后,开始累加 2:101 要被加一次

  10. 打印出循环的每一步变化 #include <iostream> #include <cstring> Using namespace std; main() { int i,s; i=1;s=0; Cout<<endl<<"Initial value:s=“<<s<<endl<<“i=”<<i<<endl; cout<<"Begin do circle“<<endl; while(i<=10) { s=s+i; cout<<“step:”<<i<<“s=s+i”<<s; i=i+1; cout<<“i=i+1”<<i<<endl; } Cout<<"End do circle“<<endl; Cout<<“s=“<<s<<endl; } Begin do circle step:1 s=s+i:s=1 i=i+1:i=2 step:2 s=s+i:s=3 i=i+1:i=3 step:3 s=s+i:s=6 i=i+1:i=4 step:4 s=s+i:s=10 i=i+1:i=5 step:5 s=s+i:s=15 i=i+1:i=6 step:6 s=s+i:s=21 i=i+1:i=7 step:7 s=s+i:s=28 i=i+1:i=8 step:8 s=s+i:s=36 i=i+1:i=9 step:9 s=s+i:s=45 i=i+1:i=10 step:10 s=s+i:s=55 i=i+1:i=11 s=55 End do circle 修改程序为连乘! 修改为连乘时 注意整数的溢出 Example

  11. start i=1;sum=0; 读入n N i≤n Y 读入k sum=sum+k; i++; 输出sum stop 利用while语句实现:从键盘输入n(n>0)个数,求其和。 分析出:循环变量 、循环体、循环变量

  12. void main() { int i, n, k, sum; i=1; sum=0; cout<<"Input n: “<<endl; cin>>n; while(i<=n) { cin>>k; sum=sum+k; i++; } cout<<“sum is:”<<sum<<endl; } 运行结果: Input n: 6 12 34 2 11 9 5 sum is: 73 Example

  13. start len=0; N Cin>>a; if(a!=‘0’) Y len++ 输出len stop 从键盘连续输入字符,直到输入‘0’符为止, 统计输入的字符个数。 分析出:循环变量 、循环体、循环变量

  14. Void main() { char ch; int len=0; cout<<"Type in a sentence, then press <0>“<<endl; cin>>ch; while (ch!=′0′) { len++; cin>>ch; } cout<<"Sentence is “<<len<<“ characters long."; } 运行结果: Type in a sentence, then press <0> this is a sentence.0 Sentence is 19 characters long. Example

  15. 注意 (1) 循环体包括一条或多条语句,多条语句必须用一对花括号括起来,构成复合语句。 (2) 合理的循环是有限次循环。避免死循环。 发生死循环 ——循环条件始终为真 ,主要有两种情况: 1 循环条件自身的问题 A ”=“ ”==“ ,”&&“和”||“ 混用,关系符号写反 “<=100” “>=1” 2 循环体中,没有让循环条件 发生变化,最后能结束 (3) 注意控制循环次数的因素,即循环条件和控制循环的主要变量 —— 例如:求和程序中的 i,其初值和终值

  16. void main(){int i=0;char c;while(1){c='\0';while(c!=13&&c!=27){cin>>c;cout<<c<<endl; }if(c==27) break;i++;cout<<“the no.is”<<i<<endl; }cout<<"The end!";} 运行后,输入了字母,然后在按ESC键和输入13和27都跳不出循环

  17. 请分析出 【循环条件 和 循环体】,使用的循环变量和 循环次数等信息: 1:区分出1~100之间的所有的偶数和奇数 2:输入一个整数n,输出其所有能被整除的除数 。例如 输入6 则 6,3,2,1 3:输入45个学生的名单,打印出45名学生中的女生 4:从输入两个数a,b(例如:1234~4567)中找出第一个(最后一个)可以整除13的数 1: 循环条件 – 被判断的数是否小于等于100 循环体 – 判断是否为奇数或偶数 循环次数 - 100次 控制循环的循环变量 - 计数器 变量 初始和结束值 1~100 2:解决方法是 一个数一个数的试,如果可以输出 循环条件 – 被判断的数是否小于等于n 循环体 – 判断是否为n%x==0 循环次数 - n次 控制循环的循环变量 - 计数器 变量 初始和结束值 1~n 3: 循环条件 – 被判断是否输入完45个学生 循环体 – 判断是否为女生,如果是就打印出来 循环次数 - 45次 控制循环的循环变量 - 计数器 变量 初始和结束值 1~45 4: 循环条件 – 是否能被13整除,是否小于等于b 循环体 – 看看是否可以整除13 循环次数 - 无法确定 控制循环的循环变量 - 计数器 变量 初始和结束值 a~? 5: 循环条件 – 是否能被13整除,是否小于等于b 循环体 – 看看是否可以整除13 循环次数 - b-a+1 控制循环的循环变量 - 计数器 变量 初始和结束值 a~ b

  18. 不可漏 循环体 循环体 满足 表达式 直到表达式为假 不满足 ( a ) ( b ) do-while循环语句 执行 语句A,然后再看 表达式A是否为真,为真 执行 语句A。如此重复.当表达式A为假时,才推出循环。 do-while循环的一般形式如下: do 语句A while (表达式A) ; 例如:do a++ ; while(a<b);

  19. do—while语句的执行过程是:先执行循环体中的语句,然后计算表达式的值。若表达式的值为“真”(非0),则再次执行循环体。如此重复,直至表达式的值为“假”(0)时,结束循环。 注意do-while(表达式) 后的 ‘;’ 容易忘写 do while 直到型 是先斩后奏型的, 循环体最少执行一次

  20. 分析:1. 累加项t= 2. 循环条件为: t≥10 -3 1 i×(i+1) 计算表达式 1 1 1 1 + + + …..+ +….. 1×2 2×33×4n×(n+1) 的值,直到某一项的值小于10-3次方为止。 分析出: 循环体、循环变量

  21. void main( ) {float sum=0,t; int i=1; do {t=1.0/(i*(i+1)); sum=sum+t; i++; } while (t>=1e-3); cout<<"sum=“<<sum; } 循环条件 Example

  22. start i=1;sum=0; 读入n 读入k sum=sum+k; i++; Y i≤n N 输出sum stop 利用do—while语句重做。 从键盘输入n(n>0)个数,求其和。 图 5.5 求n个数的和

  23. start i=1;sum=0; start i=1;sum=0; 读入n 读入n 读入k N i≤n Y sum=sum+k; 读入k i++; sum=sum+k; Y i≤n i++; N 输出sum 输出sum stop stop While和do while的对比

  24. void main() { int i, n, k, sum; i=1; sum=0; cout<<"Input n: “<<endl; cin>>n; do { cin>>k; sum=sum+k; i++; } while(i<=n); cout<<"sum is: “<< sum; } 运行结果: Input n: 6 12 3 7 11 23 34 sum is: 90

  25. while循环与do_while循环小结: 1. 循环体内必须有使循环趋于终止的条件 while (i<=100) { sum=sum+i; i++; } do { sum=sum+i; i++; } while (i<=100) 2. 注意循环初值与循环条件的关系 i=1; while (i<=100) { sum=sum+i; i++; } i=0; while (i<100) { i++; sum=sum+i; }

  26. do_while 的循环体至少执行一 次,while的循环体可能一次也不执行。(n=0) • 在循环体至少执行一次的前提下,do_while 与 while 循环等价。(n>0) 求 n! while 和 do while void main( ) { int i=1,n; double m=1; cin>>n;//n=1;n=0 while(i<=n) { m=m*i; i++; } cout<<m<<endl; } main( ) { int i=1,n; double m=1; cin>>n do { m=m*i; i++; }while(i<=n); cout<<m<<endl; }

  27. 求解表达式1 不满足 表达式2 满足 求解表达式1 循环体 当表达式2为真 循环体 求解表达式3 求解表达式3 ( a ) ( b ) for 循环语句 例如: for (i=1;i<=100;i++) s=s+i; for循环语句的一般形式如下: for (表达式1; 表达式2; 表达式3) 语句A

  28. 例如: for (i=1;i<=100;i++) s=s+i; for语句的功能可用while语句描述如下: 表达式1; while (表达式2) { 语句; 表达式3; } i=1; While(i<=100) { s=s+i; i++; }

  29. 必做的一步, 通常用来初始化循环条件 通常用来改变循环变量的值, 促使循环条件表达式2可能结束 其执行过程是: (1) 首先求解表达式1。 (2) 求解表达式2, 若其值为“真”(非0), 则执行循环体中的语句, 然后执行第(3) 步。若为“假”(0), 则结束循环, 转至第(5)步。 (3) 求解表达式3。 (4) 转至第(2)步重复执行。 (5) 执行for循环语句的下一语句。 for标准形式: for (循环变量赋值; 循环条件; 循环变量增值) 例如, for (i=1; i<=100; i++) sum=sum+i; for 是胸有成竹型的, 一般情况下,从for语句就可以看出结束的条件和循环的次数

  30. 循环的初始化 i=1,s=0 循环的 条件分析 循环变量 的控制 当 写i- - 修改: 求 所有 偶数和奇数和 方法1 用if 方法2 赋初值和步长的方法 考虑如何 用 for 循环 写出 1~100的和 #include <stdio.h> main( ) { int i,s; s=0 for(i=1;i<=100;i++) s = s + i; printf("s=%d\n",s); } for语句的功能可用while语句描述如下: 表达式1; while (表达式2) { 语句; 表达式3; }

  31. 求 所有 偶数和奇数和方法1 用while+if Void main() {int i=1,sum1=0,sum2=0; while(i<=100) {If(i%2!=0) sum1=sum1+i; else sum2=sum2+I; i++ } Cout<<…….. }

  32. 求 所有 偶数和奇数和方法2 用for+if Void main() {int sum1=0,sum2=0; for(i=1;i<=100;i++) {If(i%2!=0) sum1=sum1+i; else sum2=sum2+I; } Cout<<…….. }

  33. 求 所有 偶数和奇数和方法3 用for步长 Void main() {int sum1=0,sum2=0; for(i=1;i<=100;i=i+2) sum1=sum1+i; for(i=2;i<=100;i=i+2) sum2=sum2+I; Cout<<…….. }

  34. 修改程序:纵向打印40个*号 请你在屏幕上连续打印出 40个“ * ”; main(){ int i; for(i=1;i<=40;i++) cout<<‘*’; cout<<endl; } 计算1至50中是7的倍数的数值之和。 main() { int i, sum=0; for (i=1; i<=50; i++) if (i%7==0) sum+=i; cout<<“sum=”<<sum<<endl; } 运行结果:sum=196

  35. 例 利用for语句 从键盘输入n(n>0)个数,求其和。 void main() { int i, n, k, sum=0; cout<<“input n”<<endl; cin>>n; for (i=1; i<=n; i++) { cin>>k; sum=sum+k; } cout<<“sum is:”<<sum<<endl; } 运行结果: Input n: 6 7 11 20 5 2 19 sum is: 64

  36. for循环可以用以下while循环代替: • (2) 表达式① ③可以是多个表达式构成的逗号表达式 例如:for(i=1,s=0;i<=100;s=s+i,i++); • (3) ①、②、③构成循环的控制部分,三个表达式之间用分号;分隔; • (4) for(①; ②; ③) 几个表达式都可以省略,有下面几种形式: ①; while (②) { ④; ③; } ①; do { ④; ③; }while (②); for(①; ②; ③) ④; 注意

  37. A 表达式①可以放在for循环的前面,但后面的分号不能少 ①;for(;②; ③) ④; s=0;i=1;for(;i<=100;i++) s=s+i; B 表达式③也可以省略,但作为循环变量的调整功能不能缺少,可以在循环体中完成 for( ①;②; ) ④; ③; s=0; for(i=1;i<=100; ) s=s+i; i++; C 表达式②也可以省略,相当于②始终为真值,从而构成无条件循环,循环将不能终止,需要采取其他措施; s=0; for(i=1;; i++) s=s+i; if(i<=100) break; for( ①;; ③ ) .. ② .. ④;

  38. D 如果表达式①和③都省略的话,相当于while循环 ①;for(;②; ){ ④; ③;} i=1;s=0; for (;i<=100;) {s = s + i; i++;} E ①、②、③均省略,即: 循环的所有控制和计算功能都必须在循环体④中完成 ①;for(;; ){ … ②….; ④; ③;} i=1;s=0; for (;;) {if(i<=100) break;s = s + i; i++;} F 表达式④也可以省略,但必须至少保留一个分号,即:for (①;②;③) ; 一个分号即是一条空语句。 G 如果①、②、③、④均省略,即如以下形式:for (;;); 这将构成一个死循环。

  39. 多重循环嵌套 当一个循环体内又包含另一个完整的循环结构时,称为多重循环或循环嵌套,其循环结构可用上述三种循环语句的任意一种。 (1) while (表达式 ) { …… while ( 表达式) { …… } …….. } (2) for (表达式1;表达式2;表达式3 ) { …… for (表达式21;表达式22;表达式23 ) { …… } …….. }

  40. (3) for (表达式1;表达式2;表达式3 ) { …. do { …… } while( ); ….. } 不同类型 循环嵌套 (4) for (表达式1;表达式2;表达式3 ) { …… for (表达式21;表达式22;表达式23 ) { …… for (表达式31;表达式32;表达式33 ) { ……. } …… } …….. } 多层次嵌套

  41. j=1 u=0 j<=i u=u+j 计算s=1+(1+2)+(1+2+3)+…+(1+2+3+4+…10).. 加到1~10的和 分析1:不仅整个式子都是有规律的,而且式子中的每个元素也是有规律。 先不管每个元素是什么,a1+a2+a3……..a10 i=1 s=0 ai 是一个1~i所有元素的和 i<=10 s=s+ai 未知 循环的结果 u就是ai

  42. Void main() { int i,j,s; s=0; for(i=1;i<=10;i++) s = s+ai; Cout<<“s=”<<s<<endl; } 第一层 第二层 Void main() { int i,j,s,u; s=0; for(i=1;i<=10;i++){ u=0; for(j=1;j<=i;j++) u=u+j; s = s+u; } Cout<<“s=”<<s<<endl; }

  43. i=1,s=0 i<=10 退出时s将 所有的元素 都相加了 j<=i s=s+j 计算s=1+(1+2)+(1+2+3)+…+(1+2+3+4+…10).. 加到1~10的和 将该过程直接理解为 按照一定规律连加的过程 Void main() { int i,j,s; s=0; for(i=1;i<=10;i++) for(j=1;j<=i;j++) s=s+j; Cout<<“s=”<<s<<endl; }

  44. 打印出一个棋盘,棋盘横向10格,纵向10格,黑白相间打印出一个棋盘,棋盘横向10格,纵向10格,黑白相间 提示,用空格可以表示 黑色格,用*表示白色格。 循环条件,就是判断是否打印完10格和是否打印完10行

  45. Void main() { int i,j; Char c=‘*’; for(i=1;i<=10;i++) { for(j=1;j<=10;j++) if((i+j)%2==0) cout<<c; else printf(" "); printf("\n"); } } Example

  46. 输出九九表。 横向第一行为1 2 3 4…. 9的数字, 纵向第一列为 1 2 3 4…. 9的数字,交叉处为 i×j的值

  47. Void main() { int i,j; for(i=1;i<=9;i++) cout<<right<<i; /* Print First Line 1~9 */ cout<<endl; for(i=1;i<=9;i++) { for(j=1;j<=9;j++) cout<<right<<i*j; cout<<endl; } /* Print 9~9 multiplication table*/ } Example

  48. * 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 9 12 15 18 21 24 27 4 16 20 24 28 32 36 5 25 30 35 40 45 6 36 42 48 54 7 49 56 63 8 64 72 9 81 * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81 运行结果: * 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81 作业5

  49. for (…) { for (…) { … break; } … } … break语句、continue语句 break语句 break; (1) break语句只能和switch语句或循环结构语句搭配: if (…) break; 该if语句一定位于循环体中或switch结构中, break语句跳出的也不是if语句,而是对应的循环结构或switch结构。 (2)嵌套循环结构中, break语句只能跳出它所在的循环,而不能同时跳出多层循环,如: 

  50. 计算r=1到r=10时的圆面积,直到面积area大于100为止。计算r=1到r=10时的圆面积,直到面积area大于100为止。 #define PI 3.1415926 void main() { int r; float area; for (r=1; r<=10; r++) { area=PI*r*r; if (area>100) break; cout<<“area is:”<<area<<endl; } } 运行结果: r: 1 area is: 3.1415930 r: 2 area is: 12.566370 r: 3 area is: 28.274334 r: 4 area is: 50.265480 r: 5 area is: 78.539818 题目改为:计算r=10到r=1时的圆面积, 直到面积area小于30为止。 Example

More Related