750 likes | 872 Views
第三章 最后一部分 —— 循环控制. while 循环语句 do-while 循环语句 for 循环语句 多重循环嵌套 break 语句和 continue 语句 goto 语句和标号 程序举例. 三个基本 循环结构. 在现实问题中 , 通常需要处理一些有规律的问题 , 一般形式是 在 给定条件 成立时, 反复执行某程序段 ,直到条件不成立为止。 例如: 1: 在 10000 名学生中找到学号 SNO 为 A0004 的学生 当 SNO == A0004 或者 找完 10000 个学生记录,反复执行的动作就是比较 2: 将销售金额按照降序排列
E N D
第三章 最后一部分——循环控制 while循环语句 do-while循环语句 for循环语句 多重循环嵌套 break语句和continue语句 goto语句和标号 程序举例 三个基本 循环结构
在现实问题中, 通常需要处理一些有规律的问题, 一般形式是在给定条件成立时,反复执行某程序段,直到条件不成立为止。 例如:1: 在10000名学生中找到学号SNO为A0004的学生 当SNO==A0004 或者 找完10000个学生记录,反复执行的动作就是比较 2: 将销售金额按照降序排列 所有销售额都从大到小排列,反复执行的动作 比较并换位 3: 输入10000条商品信息 商品信息是否少于10000条, 反复执行的动作 输入商品信息 4: 筛选出所有重量小于500克的苹果 判断是否筛选完所有苹果,反复执行的动作 判断苹果重量是否小于500克 都要反复执行某段程序, 也有一定的判断条件。反复执行的某程序段 可以被看成 循环体 ,而判断条件 可以被看作循环条件,因此 循环体 和 循环条件 是构成循环结构的要素。
循环可以被看成 在满足一定条件时 重复执行一段程序 循环条件 循环体 循环条件 循环体 循环条件在前 循环体在后 当循环 while 循环体在前 循环条件在后 直到循环 do while 循环变量相关的循环体和循环条件 组合在的循环 for
【问题】如何计算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;/* 计算下次投贝数 */
s=0; /* 盒子开始为空*/ i=1; /* 第1次投贝 */ while(i<=100) /* 100次投贝 */ { s=s+i; /* 投入i 枚硬贝到s中*/ i=i+1; /* 计算下次投贝数 */ }
分析一个循环问题时,通常需要分析出 1:循环体 2:循环条件 3:控制循环的循环变量 4:循环的初始状态和结束状态 5:循环的次数
循环体 当表达式为真 满足 表达式 循环体 不满足 ( a ) ( b ) while循环语句 当 表达式A为真 执行 语句A,然后再看 表达式A是否还为真,如果为真执行语句A,如此重复。当表达式A为假时,才退出循环。 while循环的一般形式如下: while(表达式A) 语句A 例如:while(a<b) a++ ;
while语句的执行过程是:先计算while后面圆括号内表达式的值,如果其值为“真”(非0),则执行语句部分(即循环体);然后再计算表达式的值,并重复上述过程,直到表达式的值为“假”(0)时,循环结束,程序控制转至循环结构的下一语句。 while循环中的表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值非零, 就可执行循环体。 while 是“当循环” 总是, 非常谨慎 走一步看一步
#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 要被加一次
打印出循环的每一步变化 #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
start i=1;sum=0; 读入n N i≤n Y 读入k sum=sum+k; i++; 输出sum stop 利用while语句实现:从键盘输入n(n>0)个数,求其和。 分析出:循环变量 、循环体、循环变量
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
start len=0; N Cin>>a; if(a!=‘0’) Y len++ 输出len stop 从键盘连续输入字符,直到输入‘0’符为止, 统计输入的字符个数。 分析出:循环变量 、循环体、循环变量
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
注意 (1) 循环体包括一条或多条语句,多条语句必须用一对花括号括起来,构成复合语句。 (2) 合理的循环是有限次循环。避免死循环。 发生死循环 ——循环条件始终为真 ,主要有两种情况: 1 循环条件自身的问题 A ”=“ ”==“ ,”&&“和”||“ 混用,关系符号写反 “<=100” “>=1” 2 循环体中,没有让循环条件 发生变化,最后能结束 (3) 注意控制循环次数的因素,即循环条件和控制循环的主要变量 —— 例如:求和程序中的 i,其初值和终值
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都跳不出循环
请分析出 【循环条件 和 循环体】,使用的循环变量和 循环次数等信息: 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
不可漏 循环体 循环体 满足 表达式 直到表达式为假 不满足 ( a ) ( b ) do-while循环语句 执行 语句A,然后再看 表达式A是否为真,为真 执行 语句A。如此重复.当表达式A为假时,才推出循环。 do-while循环的一般形式如下: do 语句A while (表达式A) ; 例如:do a++ ; while(a<b);
do—while语句的执行过程是:先执行循环体中的语句,然后计算表达式的值。若表达式的值为“真”(非0),则再次执行循环体。如此重复,直至表达式的值为“假”(0)时,结束循环。 注意do-while(表达式) 后的 ‘;’ 容易忘写 do while 直到型 是先斩后奏型的, 循环体最少执行一次
分析:1. 累加项t= 2. 循环条件为: t≥10 -3 1 i×(i+1) 计算表达式 1 1 1 1 + + + …..+ +….. 1×2 2×33×4n×(n+1) 的值,直到某一项的值小于10-3次方为止。 分析出: 循环体、循环变量
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
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个数的和
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的对比
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
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; }
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; }
求解表达式1 不满足 表达式2 满足 求解表达式1 循环体 当表达式2为真 循环体 求解表达式3 求解表达式3 ( a ) ( b ) for 循环语句 例如: for (i=1;i<=100;i++) s=s+i; for循环语句的一般形式如下: for (表达式1; 表达式2; 表达式3) 语句A
例如: for (i=1;i<=100;i++) s=s+i; for语句的功能可用while语句描述如下: 表达式1; while (表达式2) { 语句; 表达式3; } i=1; While(i<=100) { s=s+i; i++; }
必做的一步, 通常用来初始化循环条件 通常用来改变循环变量的值, 促使循环条件表达式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语句就可以看出结束的条件和循环的次数
循环的初始化 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; }
求 所有 偶数和奇数和方法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<<…….. }
求 所有 偶数和奇数和方法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<<…….. }
求 所有 偶数和奇数和方法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<<…….. }
修改程序:纵向打印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
例 利用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
for循环可以用以下while循环代替: • (2) 表达式① ③可以是多个表达式构成的逗号表达式 例如:for(i=1,s=0;i<=100;s=s+i,i++); • (3) ①、②、③构成循环的控制部分,三个表达式之间用分号;分隔; • (4) for(①; ②; ③) 几个表达式都可以省略,有下面几种形式: ①; while (②) { ④; ③; } ①; do { ④; ③; }while (②); for(①; ②; ③) ④; 注意
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( ①;; ③ ) .. ② .. ④;
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 (;;); 这将构成一个死循环。
多重循环嵌套 当一个循环体内又包含另一个完整的循环结构时,称为多重循环或循环嵌套,其循环结构可用上述三种循环语句的任意一种。 (1) while (表达式 ) { …… while ( 表达式) { …… } …….. } (2) for (表达式1;表达式2;表达式3 ) { …… for (表达式21;表达式22;表达式23 ) { …… } …….. }
(3) for (表达式1;表达式2;表达式3 ) { …. do { …… } while( ); ….. } 不同类型 循环嵌套 (4) for (表达式1;表达式2;表达式3 ) { …… for (表达式21;表达式22;表达式23 ) { …… for (表达式31;表达式32;表达式33 ) { ……. } …… } …….. } 多层次嵌套
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
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; }
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; }
打印出一个棋盘,棋盘横向10格,纵向10格,黑白相间打印出一个棋盘,棋盘横向10格,纵向10格,黑白相间 提示,用空格可以表示 黑色格,用*表示白色格。 循环条件,就是判断是否打印完10格和是否打印完10行
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
输出九九表。 横向第一行为1 2 3 4…. 9的数字, 纵向第一列为 1 2 3 4…. 9的数字,交叉处为 i×j的值
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
* 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
for (…) { for (…) { … break; } … } … break语句、continue语句 break语句 break; (1) break语句只能和switch语句或循环结构语句搭配: if (…) break; 该if语句一定位于循环体中或switch结构中, break语句跳出的也不是if语句,而是对应的循环结构或switch结构。 (2)嵌套循环结构中, break语句只能跳出它所在的循环,而不能同时跳出多层循环,如:
计算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