190 likes | 340 Views
第 3 章 迭代计算. --- 循环结构. 主要内容. while 循环控制 do-while 循环控制 for 循环控制 循环结构中的跳转语句 循环的嵌套 循环结构程序设计举例. 3 .1 while 循环控制. 语句一般格式 while ( 表达式 ) 语句 ;. 一般为 关系 表达式或 逻辑 表达式,也可以是 C 语言其他类型的合法表达式 用来控制循环体是否执行. 称为 内嵌语句 ,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分. 功能:. 流程图. N-S 结构图. 表达式非0?. N.
E N D
第3章 迭代计算 ---循环结构
主要内容 • while循环控制 • do-while循环控制 • for循环控制 • 循环结构中的跳转语句 • 循环的嵌套 • 循环结构程序设计举例
3.1 while循环控制 • 语句一般格式 while (表达式)语句 ; • 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 • 用来控制循环体是否执行 • 称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 • 是循环重复执行的部分
功能: 流程图 N-S结构图 表达式非0? N Y 语句 当表达式为真 语句 • 计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。 循环控制条件 循环体
【例】编写程序,求100个自然数的和 即:s=1+2+3+ … +100 思路:寻找加数与求和的规律 加数i——从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和——设变量sum 存放和,循环求sum=sum+i,直至i超过100。
算法和程序: i=1,sum=0 当i <= 100 sum=sum+i i++ 输出sum #include <stdio.h> void main( ) { int i,sum; while (i<=100) sum=sum+i; i++; printf("sum=%d\n",sum); } i=1; sum=0; { } i: 循环控制变量 sum: 累加器 程序输出结果: sum=5050
注意: • 如果while的 (表达式) 值为0,则循环体一次也不执行(例如当i的初值=101) 。 • 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 • 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。 思考程序段的输出? …… while (i<=100) { i++; sum=sum+i; }
注意(续): • 为了保证循环正常运行,应该特别注意: • 循环控制条件的描述 • 控制条件的初始状态(初始值) • 循环体内部对控制条件的影响
3.2 do-while语句 • 语句一般格式 do 语句 while (表达式); • 功能: • 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。
do-while循环的算法 流程图 循环体 N Y 表达式非0? { int i=1,sum=0; do { sum=sum+i; i++; } while (i<=100); } 用do-while语句 求100个自然数的和
说明: • while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构 • 区别: • do- while 语句先执行循环体再判断条件,循环体至少执行一次; • while 语句先判断条件再执行循环体,循环体有可能一次也不执行 • do—while循环体中一定要有能使表达式值趋于0的操作(如i++),否则会出现死循环。
比较下面2个程序的输出结果 #include <stdio.h> void main() { int a=0; while (a<0) a++; printf("%d",a); } #include <stdio.h> void main() { int a=0; do { a++; } while (a<0) ; printf("%d",a); }
do-while语句的简单应用 定义m、n、r m<n T F m和n交换 r=m%n m=n n=r 当r != 0时 输出最大公约数m 【例】用辗转相除法求m和n的最大公约数
算法和程序: #include <stdio.h> void main( ) { int m,n,r; scanf("%d, %d",&m,&n); if (m<n) { r=m; m=n; n=r; } do { r=m%n; m=n; n=r; }while(r!=0); printf("%d\n",m); }
3.3 for语句 • 语句一般格式 for (表达式1;表达式2;表达式3) 语句; 循环控制条件 循环体 循环初始条件 • 功能: • 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。
for语句的算法 流程图 N-S结构图 计算表达式1 for (表达式1;表达式2;表达式3) 语句 表达式2 为真? N Y 语句 计算表达式3 例如: { int i,sum; sum=0; for ( i=1; i<=100; i++) sum=sum+i; printf("sum=%d\n",sum); } 可部分或全部省略,但“;”不可省略
省略for语句的表达式 ⑴ 表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环) ⑵ 省略表达式1和表达式3,即: • for(;表达式2;) • 就等同于:while(表达式2 ) ⑶ 省略表达式2,即: • for(表达式1; ;表达式3) • 就等同于:表达式1; while(1){…表达式3;} 注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行
例如: ⑴ i=1; for ( ; i<=100; i++) sum+=i; ⑵ for (i=1; ; i++) { … if(i>100)… …} ⑶ for (i=1; i<=100; ) {…i++; … } ⑷ i=1; for ( ; ; ) { … if(i>100) … i++; … }
说明: • 所有用 while语句实现的循环都可以用for语句实现。 • for(表达式1;表达式2 ;表达式3) 语句; 等价于: 表达式1; while (表达式2) {语句; 表达式3; }