当前位置:首页 >> 其它课程 >>

C语言课件(循环结构)


循环结构
while语句 do-while语句 for语句 跳转语句
break语句 continue语句 goto语句

程序设计举例

循环结构

while循环
while循环
当某个条件一直为真时重复执行某个动作。 举例:购物
… while 购物单上还有商品



购买下一件商品,并且把它从清单上划掉
… ? 如果条件“购物单上还有商品”成立时,就执行动作“购买下一件 商品,并且把它从清单上划掉”; ? 如果该条件一直成立,这个动作就会重复执行; ? 最终(该买的商品都买到),即该条件不成立,循环过程就会终止, 程序将执行这个循环结构之后的第一条语句。

循环结构

While循环结构
while语句
while (<条件表达式>) <循环体>; C语言代码举例:
int product=2; while (product<=10) product=2*product;

可以是两种语句
单语句 复合语句

Y product<=10 N product=2*product

while 循环结构 是单入/单出结构

循环结构

计数器控制的循环
计数器控制的循环
循环重复执行,直到计数器达到一个特定的值。 确定循环,即循环执行的次数是确定的。

举例
问题
? 1个班有10个学生,参加了一次考试,成绩(0~100内的整数)已 知。计算这次考试的班级平均成绩。

分析与设计
? 输入每个学生的成绩,累计总成绩,计算平均分,显示结果。 ? 采用计数器控制的循环,重复执行操作:
– 输入一个学生的成绩。 – 就进行累加。

循环结构

计数器控制的循环
设计方法:自上而下,逐步求精
算法的顶部(描述程序整体功能)
计算本次考试的班级平均分

划分成一系列较小的任务
初始化变量 输入考试的分数,求分数总和,并计数(统计分数个数)

计算出最后结果并显示班级平均分

循环结构

计数器控制的循环
进一步细化算法
初始化
设置总分(total)为0 设置分数计数器(counter)为0

输入考试的分数,求分数总和,并计数
While 分数计数器 < 10 输入下一个分数(grade) 把该分数加到总分上 分数计数器增1

计算出最后结果并显示班级平均分
班级平均分(average)为总分除以10 显示班级平均分

循环结构

计数器控制的循环
源代码分析(cw0701.c)
#include <stdio.h> void main() { int counter, grade, total, average; total=0; counter=0; while (counter < 10) { printf("Enter grade:"); scanf("%d", &grade); total+=grade; counter++; } average=total/10; printf("Class average is %d\n", average); }

初始化
(initialization)

执行循环
(execute loop) 输入 累加

结束
(termination) 最后的计算

输出结果

循环结构

计数器控制的循环
运行(cw0701.c)
一次运行结果
Enter grade:60 Enter grade:70 Enter grade:65 Enter grade:76 Enter grade:73 Enter grade:56 Enter grade:78 Enter grade:64 Enter grade:89 Enter grade:76 Class average is 70

循环结构

标记控制的循环
举例
问题:编写一个班级平均分计算程序,每次执行该程序, 都能够处理任意数量的学生分数。 思考:学生人数未知,何时结束输入?

标记控制的循环
使用标记(flag)指定“数据输入的结束” 即当用户输入标记值时,循环结束
? 其他名称:信号值(signal value),哨兵(sentinel) ? 标记值不应与正常的用户输入混淆
– 本例可以采用 -1

? 但同时标记值也是合法的输入

不确定的循环,即循环次数未知。

循环结构

标记控制的循环
算法设计
算法的顶部
计算本次考试的班级平均分

细化
初始化变量 输入考试的分数,求分数总和,并计数(统计分数个数)

计算并显示班级平均分

循环结构

标记控制的循环
进一步细化
初始化变量
设置总分(total)为0 设置计数器(counter)(分数的个数)为0

输入考试的分数,求分数总和,并计数(计算分数个数)
输入第一个分数(grade)(可能是标记值)
While 输入的分数不是标记值 把当前分数加到总分中 计数器加1 输入下一个分数(可能是标记值)

循环结构

标记控制的循环
进一步细化(续)
计算并显示班级平均分
If 计数器不等于0 总分除以计数器的结果就是班级平均分 显示班级平均分 Else 显示“没有输入成绩”

被 0 除
“致命”错误 会导致程序“崩溃”

循环结构

标记控制的循环
源代码分析(cw0702.c)
#include <stdio.h> void main() { float average; int counter, grade, total; total = 0; counter = 0; printf("Enter grade, -1 to end:"); scanf("%d", &grade); while (grade != -1) { total += grade; counter++; printf("Enter grade, -1 to end:"); scanf("%d", &grade); }

初始化 处理
结束判断

循环结构

标记控制的循环
源代码分析(续)
if (counter != 0) { average = (float)total / counter; printf("Class average is %.2f\n", average); } else printf("No grades were entered\n");

结束

}

Enter grade, -1 to end:70 Enter grade, -1 to end:60 Enter grade, -1 to end:65 Enter grade, -1 to end:-1 Class average is 65.00

循环结构

嵌套的控制结构
举例
现有10个学生期末考试结果的清单。
? 用1表示通过,2表示没有通过。

编写一程序对结果进行统计分析。
? 如果有8个以上的学生通过,显示“优秀班级”。

分析
程序每次执行处理10个考试结果。
? 采用计数器控制的循环。

使用两个统计计数器。
? 一个统计通过的人数,另一个统计没通过的人数。

每一个考试结果要么是1,要么是2。
? 只对1进行精确测试,不是1的其他数就假定为2。

循环结构

嵌套的控制结构
设计
算法的顶部
? 分析考试结果,判断是否评为优秀班级

细化
? 初始化变量 ? 输入10个考试结果,并计算通过考试和未通过考试的学生数目 ? 显示考试结果的汇总,并判断是否应该评为优秀班级

进一步细化
? 初始化变量
通过数初始化为0 未通过数初始化为0 循环控制计数器初始化为0

循环结构

嵌套的控制结构
设计
进一步细化(续)
? 输入10个考试结果,并计算通过考试和未通过考试的学生数目
While 循环控制计数器的值 < 10 输入一个考试结果 if 考试结果为1 通过计数器加1 else 未通过计数器加1 循环控制计数器加1

循环结构

嵌套的控制结构
设计
进一步细化(续)
? 显示考试结果的汇总,并判断是否应该评为优秀班级
显示通过考试的学生数目 显示未通过考试的学生数目 If 通过考试的学生数目大于8 显示“优秀班级”

循环结构

嵌套的控制结构
源代码分析(cw0703.c)
#include <stdio.h> void main() { int passed=0, failed=0, counter=0, result;

while (counter<10) { printf("Enter result (1=pass, 2=fail):"); scanf("%d", &result);
if (result==1) passed++; else failed++; counter++; }

循环结构

嵌套的控制结构
源代码分析(续)
printf("Passed %d\n", passed); printf("Failed %d\n", failed); if (passed>8) printf("Excellent Class\n"); Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):2 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Enter result (1=pass, 2=fail):1 Passed 9 Failed 1 Excellent Class

}

循环结构

do-while循环结构
do-while 语句
do <循环体>; while (<条件表达式>);
先执行循环体语句,再 判断循环条件
<循环体>

Y <条件表达式> N

do-while 循环结构 是单入/单出结构

循环结构

do-while语句
举例(cw0704.c)
问题:计算1+2+…+100
#include <stdio.h> void main() { int s, i; s=0; i=1; 既是循环控制计数 器,也是加数

do { s = s + i; i++; } while (i<=100);
printf("1+2+...+100=%d\n", s); }

循环结构

do-while语句
比较do-while语句与while语句(cw0705.c)
main()
{ int s=0, n; scanf(“%d”, &n); while (n<=2) main() { int s=0, n; scanf(“%d”, &n); do { s += n; n++; } while (n<=2); printf(“s=%d,n=%d”, s, n); } 1

{ s += n; n++; }
printf(“s=%d,n=%d”, s, n); }

1

1 s=3,n=3 3 s=3,n=4 do-while的 循环体至少被 执行一次

s=3,n=3 3

2

s=0,n=3

循环结构

for循环结构
for语句
for (<表达式1>; <表达式2>; <表达式3>) <循环体>;
分号作为表达式的 分隔符

只计算一次
<表达式1>

Y <表达式2> <循环体> <表达式3>

N

循环结构

for语句
for语句能够自动处理计数器控制的循环的细节
举例:打印 1~10。(cw0706.c)
#include <stdio.h> void main() { int counter;

对控制变量进行初始化

for (counter = 1; counter <= 10; counter++)
printf("%d ", counter); }

循环条件
1 2 3 4 5 6 7 8 9 10

控制变量增1

循环结构

for语句
for 语句使用说明
for ([<表达式1>]; [<表达式2>]; [<表达式3>]) <循环体>;

说明:
? 三个表达式都是可选的(都可以为空),但分号不能少 ? 如果表达式2为空,那么就假定该循环条件为真
– 则创建一个无限循环 for (i=0;;i++)
printf(“%2d”,i);

=

for (i=0;1;i++)
printf(“%2d”,i);

< Ctrl + C > 强行终止无限循环,结束程序的执行

循环结构

for语句
for 语句使用说明
for ([<表达式1>]; [<表达式2>]; [<表达式3>]) <循环体>;

说明:
? 表达式1和表达式3可以是任何合法的表达式
– 常用逗号表达式 for (s=0,i=1;i<=100;i++) s+=i; for (s=0,i=1;i<=100;s+=i,i++);

对多个变量初始化

修改多个变量的值

循环结构

break语句
break语句
break; 当在while、do-while、for或switch结构中执行break语句 时,break语句会造成程序从该结构中退出,程序接着执 行该结构之后的第一条语句。 注意:
? 执行break语句后,for语句的表达式3不被执行

常规应用:
? 提前从循环结构中退出 ? 跳过switch结构的剩余部分

循环结构

break语句
举例(cw0707.c)
#include <stdio.h> void main() { int x;

for (x = 1; x <= 10; x++) { if (x == 5) break; printf("%d ", x); }
printf(“\n当 x == %d 时跳出循环。\n", x);

与if配合使用

}

1 2 3 4 当 x == 5 时跳出循环。

循环结构

break语句
在switch和for语句中的使用
for (i=1;i<=3;i++) { switch(i) { case 1: printf(“*\n”); break; case 2: printf(“**\n”); break; case 3: printf(“***\n”); break; } } * ** *** * } for (i=1;i<=3;i++) { if (i==1) {printf(“*\n”); break;} if (i==2) {printf(“**\n”); break;} if (i==3) {printf(“***\n”); break;}

循环结构

continue语句
continue 语句
continue; 当在while、do-while或for结构中执行continue语句时, continue语句能够跳过该结构中剩余语句,执行下一个循 环过程。 注意:
? 在while和do-while结构中
– continue语句被执行之后,立即进行循环条件的测试

? 在for结构中
– 表达式3被执行之后,然后进行循环条件的测试

循环结构

continue语句
continue 语句举例(cw0708.c)
#include <stdio.h> void main() { int x; #include <stdio.h> void main() { int x;

x = 1; while (x <= 10) { if (x == 5) continue; printf("%d ", x); x++; }
}
}

for (x = 1; x <= 10; x++) { if (x == 5) continue; printf("%d ", x); }

1 2 3 4 死循环

1 2 3 4 6 7 8 9 10

循环结构

goto语句
goto语句
goto <语句标号>;
语句标号

立即执行语句标号指向的语句。 合理的使用:
? 与if语句一起构成循环结构 ? 从循环体内跳到循环体外

是一个标识符 放在可执行语句前面

– 特别是从多层嵌套循环的内部跳到外层循环,或者直接跳出

结构化编程技术限制使用 goto 语句
滥用goto语句使得程序无结构可言,可读性差, 调试和维护困难。

循环结构

goto语句
goto语句举例(cw0709.c)
#include <stdio.h> void main() { int s=0, i=1;

语句标号

Loop: s = s + i; i++; if (i<=100) goto Loop;
printf("1+2+...+100=%d\n", s);

}

1+2+…+100=5050

循环结构

C语言的控制结构
C语言的控制结构(一)
if
T F

if-else
F T

switch
T
F break

T F

break

顺序结构
F

T

break

选择结构

循环结构

C语言的控制结构
C语言的控制结构(二)
while
T F

do-while

T

for
F

循环结构
T F

循环结构

结构化程序设计的规则
规则1和2
规则 1:从一个最简单 的流程图开始。

规则 2

规则 2

规则 2

规则 2:任何一个矩形框都可以被 两个顺序相连的矩形框替换。

循环结构

结构化程序设计的规则
规则3:任何一个矩形框都可以被任何控制结构替换。
Rule 3

Rule 3 Rule 3

循环结构

非结构化程序
非结构化的程序

satcking

nesting
goto overlaping

循环结构

结构化程序设计小结
任何程序都是由3种结构组成的。
三种结构:
? 顺序结构 ? 选择结构 ? 循环结构

两种组合方式:
? 堆叠 ? 嵌套

任何选择结构可以用if语句重写。 任何循环结构可以用while语句重写。

循环结构

程序设计举例
问题
求下面公式的前n项之和
1 1 1 1 ? ? ? ? ... 3 5 7

n

不确定量的数据来源: 输入获得 计算获得

分析
累加求和: s = s + ai 关键在于写出 ai 的表达式
ai ? (?1) i ?1 1 2i ? 1

初始化累加和变量 s 为0 初始化计数器变量 i 为1 输入要累加的项数,放入变量 n While i <= n 计算第i项的值,结果放入ai 累加:s = s + ai 修改计数器变量:i++ 输出结果 s

用计数器控制的循环实现

循环结构

程序设计举例
第一种实现的源代码分析(cw0710A.c)
#include <stdio.h>
#include <math.h> void main() { int i=1, n; float s=0, ai; scanf(“%d”, &n); }

while (i<=n)

{ ai=pow(-1,i-1)/(2*i-1);
s+=ai; i++; }
printf(“sum=%.3f\n”, s);

不划算

1 sum=1.000

2 sum=0.667

5 sum=0.835

0 sum=0.000

仔细设计测试数据,检验程序正确性

循环结构

程序设计举例
第二种实现的源代码分析(cw0710B.c)
#include <stdio.h> void main() { int i=1, n, sign=1; float s=0, ai;

while (i<=n) { ai=1.0/(2*i-1); s+=sign*ai; sign*=-1; i++; }
printf(“sum=%.3f\n”, s); } 5 sum=0.835

现在ai表示每 一项的绝对值

scanf(“%d”, &n);
1 sum=1.000 2 sum=0.667

0 sum=0.000

循环结构

程序设计举例
问题
用下面的公式求π的近似值(直到最后一项的绝对值小于10-6为 止):
π 1 1 1 ? 1 ? ? ? ? ... 4 3 5 7
初始化累加和变量 s 为0 初始化计数器变量 i 为1 第1项的值 ai = 1 While |ai| >= 10-6 累加:s = s + ai i增一 计算第i项(下一项)的值,结果放入ai 输出结果 π

分析

先计算等式右边的和 累加求和: s = s + ai 当|ai|<10-6时,停止累加 用标记控制的循环实现 计算π=s*4

循环结构

程序设计举例
第一种实现的源代码分析(cw0711A.c)
#include <stdio.h> void main() { int i=1, n, sign=1; double s=0, ai;

ai=1; while (!(ai<1e-6)) { s+=sign*ai; i++; sign*=-1; ai=1.0/(2*i-1); }
printf("pi=%.8lf\n", s*4); }

ai 保存的是第i 项的绝对值

pi=3.14153162

循环结构

程序设计举例
第二种实现的源代码分析(cw0711B.c)
#include <stdio.h> void main() { int i=1, n, sign=1; double s=0, an; pi=3.14153162

for (;;) { an=1.0/(2*i-1); if (an<1e-6) break; s+=sign*an; sign*=-1; i++; }
printf(“pi=%.8lf\n", s*4); }

使用 break 语句违背了 结构化程序设计的原则
continue语句也有类似 的问题
T F T

F

循环结构

程序设计举例
问题
任意输入10个数,找出最大数和最小数

分析
37
最大数 最小数

21

75

4

82

97

54

61

1

18

49 97 1

37 37

数的范围无法确定 把输入的第一个数作为最大数和最小数 将其余的数与最大数、最小数分别比较 每次根据比较的结果更新最大数和最小数 用计数器控制的循环实现

循环结构

程序设计举例
源代码分析(cw0712.c)
#include <stdio.h> void main() { int i, d, max, min;

printf("Input 10 integers:\n"); scanf("%d", &d); max=min=d;
for (i=2;i<=10;i++) { scanf("%d", &d); if (d>max) {max=d; continue;} if (d<min) min=d; } printf("max=%d\nmin=%d\n", max, min);

把输入的第一个数作 为最大数和最小数变 量的初值 根据比较的结果更新 最大数和最小数变量 的值

}

循环结构

程序设计举例
问题
判断整数 m 是否素数

源代码分析(cw0713.c)
#include <stdio.h> #include <math.h> void main() { int m, k, i; scanf("%d", &m); k = m-1; for (i=2;i<=k;i++) if (m%i==0) break; if (i>k) printf("%d is a prime number.\n", m); else printf("%d is not a prime number.\n", m);

如果break被执行 了,则该数不是素 数,那么i<=k

}

循环结构

程序设计举例
问题
找出1~100之间的全部素数

源代码分析(cw0714.c)
#include <stdio.h> #include <math.h> void main() { int m, k, i; for (m=1;m<=100;m++) { k = m-1; for (i=2;i<=k;i++) if (m%i==0) break; if (i>k) printf("%4d", m); } } for(m=1;m<=100;m++) m是否是素数

嵌套

循环结构

程序设计举例
问题
输出图形
* ** *** **** ***** ****** ******* ******** ********* **********

分析
共有10行 第n行有n个星号 用计数器控制的循环实现

循环结构

程序设计举例
源代码分析(cw0715.c)
#include <stdio.h> void main() { int m, n; for (n=1;n<=10;n++) { for (m=1;m<=n;m++) printf("*"); printf("\n"); } }

* ** *** **** ***** ****** ******* ******** ********* **********

循环结构

程序设计举例
问题
输出图形
********** ********* ******** ******* ****** ***** **** *** ** *

分析
共有10行 第n行先输出n-1个空格,再输出10-(n-1)个星号 用计数器控制的循环实现

循环结构

程序设计举例
源代码分析(cw0716.c)
#include <stdio.h> void main() { int m, n;

for (n=1;n<=10;n++) {
for (m=1;m<=n-1;m++) printf(" ");

for (;m<=10;m++) printf("*");
printf("\n"); }

}

********** ********* ******** ******* ****** ***** **** *** ** *

循环结构

程序设计举例
问题
输出下面的图形
* *** ***** ******* ********* ******* ***** *** *

* *** ***** ******* *********

图1

图2

循环结构

程序设计举例
源代码分析
图1 (cw0717.c)
#include <stdio.h> void main() { int m, n; for (n=1;n<=5;n++) { for (m=1;m<=5-n;m++) printf(" "); for (m=1;m<=2*n-1;m++) printf("*");

printf("\n");
} }

循环结构

程序设计举例
源代码分析
图2 (cw0718.c)
#include <stdio.h> void main() { int m, n; for (n=1;n<=5;n++) { for (m=1;m<=5-n;m++) printf(" "); for (m=1;m<=2*n-1;m++) printf("*"); printf("\n"); } } } for (n=4;n>=1;n--) { for (m=1;m<=5-n;m++) printf(" "); for (m=1;m<=2*n-1;m++) printf("*");

printf("\n");

循环结构

小结
建立循环时特别注意三个方面:
明确定义结束循环的条件 确保在循环判断中使用的值在第一次使用之前已经初始化 确保循环在每个周期中更新了判断值

构造循环结构的流程控制语句
while do-while for 其中,
? while和for提供入口条件循环 ? do-while提供退出条件循环

循环结构

小结
跳转语句
break语句 continue语句 goto语句

结构化程序设计的规则


相关文章:
C语言循环结构教学设计
洲际导弹自述课件 20页 免费 浅谈职场沟通能力的培养 2页 1下载券 洲际导弹自述...C 语言循环结构教学设计一. 教学设计(包括教学背景、教学目标) 1. 关于“C...
C语言循环结构练习题带答案
搜试试 7 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 资格考试/认证...C语言循环结构练习题带答案_IT认证_资格考试/认证_教育专区。C++ 循环结构 ...
C语言笔记(循环结构完整版)
搜 试试 帮助 全部 DOC PPT TXT PDF XLS 百度文库 专业资料 IT/计算机...C语言笔记(循环结构完整版) 笔记详细,彩色部分标注只要你学透了,循环结构你就不必...
4循环结构
4循环结构 c语言课件c语言课件隐藏>> 习题四 习题四一.单项选择题 1. 若 i,j 已定义为 int 型,则以下程序段中内循环体的执行次数是( )。 for(i=5;i;...
C程序设计__循环结构程序设计
C程序设计(第四版)课件 ... 82页 免费 C语言循环结构程序设计 62页 3下载...第6章 循环结构程序设计许多问题的求解归结为重复执行的操作,例如输入多个同学...
c语言循环结构上机习题
搜 试试 7 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 资格考试/...c语言循环结构上机习题_IT认证_资格考试/认证_教育专区。c语言循环结构上机习题1...
C语言循环结构l练习题
搜试试 7 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 高等教育 其它...C语言循环结构l练习题_其它_高等教育_教育专区。第5章 循环结构 考点 1 while...
C语言循环结构教学设计方案
C语言循环结构教学设计方案_工学_高等教育_教育专区。《C 语言循环结构》教学设计...(i<=100) PPT 教学课件 实验操作:Visual C++6.0 软件平台,PC 电脑,教学机房...
c语言课件3
c语言课件c语言课件隐藏>> 循环结构 结构( C 语言实验 3:循环结构(1) 一,实验目的语句实现循环的方法. (1)熟练掌握用 while 语句实现循环的方法. do语句实现...
c语言循环结构
C语言选择结构 46页 免费 C语言循环 40页 免费 第4章 C语言教学课件程序的... 65页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建...
更多相关标签:
c语言循环课件ppt | c语言循环结构 | c语言循环结构编程题 | 数据结构c语言版课件 | c语言中的循环结构 | c语言for循环结构 | c语言循环结构习题 | c语言的循环结构 |