循环结构程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行结 main( ) 果 { int sum=0,i; 1↙ scanf(“%d”,&i); sum=55 while(i<=10) 12↙ { sum=sum+i; sum=0 i++; } printf(“sum=%d”,sum); } 运行结 main( ) 果 { int sum=0,i; 1↙ scanf(“%d”,&i); sum=55 do { sum=sum+i; 12↙ sum=12 i++; } while (i<=10); printf(“sum=%d”,sum); }
注意:结构化程序设计方法,主张限制使用goto语句。因为滥用
goto语句,将会导致程序结构无规律、可读性差。 另外,从功能上说,for语句可完全代替当型循环语句while,所以 该语句也不是必需的。
3
while语句
–格式:while (表达式)循环体; –使用说明:
• 先判断表达式,后执行循环体
• 条件为非0 时循环,为0 时退出循环
假 sum<=10 真 sum=sum+1/n; n++; 出口
17
–求自然对数底的近似值,其公式为
e=1+1/1!+1/2!+……+1/n!;当1/n!=10 时,把等式右端的和作为e的近似值
• 分析: –公式中有累乘,n!;u=u/n; –公式中有累加,e=e+u; • 部分流程图 u>=10-7 真 u=u/n; e=e+u; n++;
如 for(I=0,J=0; I〈J;I++,J++) 22
e1:赋初值 e2
真
假
循环 出口
循环体
e3
23
for的多种形式
• for(i=1;i<=6;i=i+1) printf(―%d‖, i);
– <==> for(i=1;i<=6;) printf(―%d‖, i++);
• for(;i<=10;) {sum=sum+1; i++}
do-while 循环示例
• 反复求两个正整数的最小公倍数,直到输入的 两个数均为1时结束
#include <stdio.h> int main(){ int m, n, result; do{ printf(‚Input two positive integers m, n:‚); scanf(‚%d,%d‚, &m, &n); if(m > 0 && n > 0){ result = m < n ? n : m; while(result%m != 0 || result%n != 0) result++; printf(‚The least common multiple of m and n is %d.\n‚, result); } else printf(‚the number m or n is not a positive integer.\n‚); }while(m != 1 || n != 1); return 0; }
–累乘:s=s*i; –累除:s=s/i;
10
while循环流程图
main函数 变量初始化 假
i<=100
真 sum=sum+i; i++; 打印sum的值
结束
11
do-while循环流程图
main函数 变量初始化
sum=sum+i; i++;
假
i<=100
真 打印sum的值 结束
12
• 分析两个程序的运行结果
• 循环体由一条语句构成,若为多条语句则必
须用{ }括起来构成一条复合语句
• 流程图如图所示:
4
while语句执行过程:
表达式 非0 循环体语句
0
循环 出口
5
–while语句中表达式的多种形式
• 分析下列程序段退出循环时x的值 -; x为非0时,x!=0为真,执行x• 程序1:
x为0 时,x!=0为假,退出循环
Biblioteka Baidu
x=10;
while (x- -) ;
6
while语句中表达式的多种形式
• while (x !=0) 等价于 while (x) • while (x==0) 等价于 while (!x)
7
二、do- while 语句 • 格式: do {语句;} while (表达式); • 使用说明:
–先执行一次语句,再进行表达式判断 –表达式为非0 时循环,为0 时退出循环 –流程图如图所示:
18
-7
假
–编写程序,计算并显示一个整数各位数字 之和。例如:1024各位数字之和为 1+0+2+4=7
• 分析:不清楚整数位数,但可以每次取出个位数 字进行相加,再将原数整除10后的结果赋给原来 的变量,实现循环累除和循环累加
• 流程图: a 真 s=s+a%10; a=a/10; 假
19
• 练习:
循环结构程序设计
1
循环语句类型
在C语言中,可用以下语句实现循环: (1)用for语句。 (2)用do-while语句。 (3)用while语句。 (4)用goto语句和if语句构成循环。使用goto语 句实现求解1~100累计和的程序可以如下:
2
main() { int n=1, sum=0; loop: sum += n; n++; if (n<=100) goto loop; printf(―sum=%d\n‖, sum); } 其中“loop:‖为语句标号(格式:标号: 语句行),其命名遵循标识 符命名规则。 goto语句格式:goto 标号, 功能为:使系统转向标号所在的语句行执行。
13
while 循环示例
• 使用 while 循环求两个正整数的最小公倍数
#include <stdio.h> int main() { int m, n, result; printf(‚Input two positive integers m, n:‚); scanf(‚%d,%d‚, &m, &n); if(m > 0 && n > 0) { result = m < n ? n : m; while(result % m != 0 || result % n != 0) result++; printf(‚The least common multiple of m and n is %d.\n‚, result); } else printf(‚the number m or n is not a positive integer.\n‚); return 0; 14 }
–若k为整型,则while循环: k=0; while (k=0) k=k-1; A.执行10次 B.无限循环 C.一次也不执行 D.执行一次
分析:因为条件判断表达式k=0是赋值语句,
该表达式的结果为0,条件始终为假。 C为正确答案。
20
–若k为整型,则do-while循环 k=0; do { k- -; } while (k= =0);
A.执行无限次 C.执行1次
B.执行0次 D.执行2次
C,执行第一次 后,K=-1,不等 于0,跳出循环
21
四、for 语句 for ( ; ; )等价于while (1) • 格式:for(e1;e2;e3) 循环体;
–说明:
• e1:赋初值,只执行一次;e2:循环条件; e3:使e2有可能不满足的表达式 • e1、e2、e3、循环体都可能为空,但不能省 略“;”,若省去e2,则是无限循环;若省去 e1、e3,即仅有条件判断,则完全等同于 while语句 • e1、e3可以是逗号表达式 • for语句的流程图:
15
• 程序设计
– 求2
n
n
• 分析:2 =2*2*……*2; • 部分流程图如图所示 输入n 的值 i<=n 真 p=p*2; i++; 假
退出循环, 打印p 的值
16
–计算调和级数1+1/2+1/3+…+1/n的部分和, 当和大于10时,停止计算,输出调和级数的 项数。
• 分析:s=s+1/n;(n=1,2,……) • 部分流程图:
28
for 循环示例
• 打印九九乘法表
#include <stdio.h> int main(){ 三种循环都可以嵌套,但嵌套时内外 int i, j, k; 层循环不能发生交叉 for( i = 1; i <= 9; i++ ){ for( j = i; j <= 9; j++ ){ 发生嵌套时,内层循环经常需要使用 k = i * j; 外层循环的某些值作为控制条件 printf(‚%d×%d = %d\t‚, i, j, k); } printf(‚\n‚) ; } return 0; }
for 循环示例
• 程序读入一个字符串,然后反向打印输出
#include <stdio.h> #include <string.h> int main( ) { char s[50], c; int i, j; printf(‚Input a string: ‚); scanf(‚%s‚, s); for( i = 0, j = strlen(s) – 1; i < j; i++, j– –){ c = s[i]; s[i] = s[j]; s[j] = c; } printf(‚%s\n‚, s); return 0; }
25
k2 • 计算
k 1
100
for 循环示例
#include <stdio.h> int main() { int result, k; result = 0; // 累加器变量,设置初始值(本例设为0) for( k = 1; k <= 100; k++ ) // 循环计算 result += k * k; // 累加 printf(‚The result: %d\n‚, result); return 0; }
29
如果一个循环体内包含另一个循环则 称循环嵌套或多重循环
循环的嵌套
– 定义:循环体语句由一条循环语句来充当 – 程序设计
• • 输出九九乘法表 算法分析:
i=1; j:1~9;求出1乘1~9的值
i=2; j:1~9;求出2乘1~9的值 ……
i=9;j:1~9;求出9乘1~9的值
由此可见:i
每取一个值,j都要从1~9;所以
在i 循环中要嵌套一个j 循环
30
break语句与continue语句
为了使循环控制更加灵活,C语言提供了break语句和 continue语句。 1.一般格式: break; continue; 2.功能 (1)break:强行结束循环,转向执行循环语句的下一 条语句。 (2)continue:对于for循环,跳过循环体其余语句, 转向循环变量增量表达式的计算;对于while和do-while循 环,跳过循环体其余语句,但转向循环继续条件的判定。
26
三种循环结构的比较
• 三种循环结构可以互换使用 • for 循环与 while 循环常见,do-while 循环少见 • while 循环常用于不需要或很少需要初始化的 场合 • for 循环常用于需要简单初始化和通过递增递 减运算控制循环体执行的场合 • for 循环将所有循环控制因素都放在循环头部, 循环结构最清晰 • 通过省略循环头部的一个或多个表达式,for 27 循环也可能非常复杂
x=10;
• 程序2:
while (x!=0) x- -; x为非0 时,执行x- -;
x为0 时,条件为假,退出循环 表达式x- -,- -后置,取出x 的值 进行条件判断后,x自减。当x为0时, x=10;u while (x) x- -; 取出x的值0,条件为假,退出循环, x再自减,x的值为-1 • 程序3:
– <==>while (;i<=10;) {sum=sum+1; i++}
• for(;(c=getchar())!=‗\n‘; printf(―%c‖,c), printf(―\n‖)) ;
空循 环体 任意 表达式
24
• 程序设计
–设计初步
• 用for语句实现1~100的累加
main( ) { int i,sum; for(i=1,sum=0;i<=100;i++) sum=sum+i; printf(“sum=%d\n”,sum); }
8
do-while语句执行情况:
循环体至少执行一次 循环体语句 0 循环 出口
表达式 非0
9
三、循环结构的程序设计 • 设计初步
–用两种循环语句求1~100的和 –分析:
• 通过循环累加实现1~100的求和运算,循环100次, 每次加一个数据
• 由此可以得出以下经验:
–累加:sum=sum+i;
注意:结构化程序设计方法,主张限制使用goto语句。因为滥用
goto语句,将会导致程序结构无规律、可读性差。 另外,从功能上说,for语句可完全代替当型循环语句while,所以 该语句也不是必需的。
3
while语句
–格式:while (表达式)循环体; –使用说明:
• 先判断表达式,后执行循环体
• 条件为非0 时循环,为0 时退出循环
假 sum<=10 真 sum=sum+1/n; n++; 出口
17
–求自然对数底的近似值,其公式为
e=1+1/1!+1/2!+……+1/n!;当1/n!=10 时,把等式右端的和作为e的近似值
• 分析: –公式中有累乘,n!;u=u/n; –公式中有累加,e=e+u; • 部分流程图 u>=10-7 真 u=u/n; e=e+u; n++;
如 for(I=0,J=0; I〈J;I++,J++) 22
e1:赋初值 e2
真
假
循环 出口
循环体
e3
23
for的多种形式
• for(i=1;i<=6;i=i+1) printf(―%d‖, i);
– <==> for(i=1;i<=6;) printf(―%d‖, i++);
• for(;i<=10;) {sum=sum+1; i++}
do-while 循环示例
• 反复求两个正整数的最小公倍数,直到输入的 两个数均为1时结束
#include <stdio.h> int main(){ int m, n, result; do{ printf(‚Input two positive integers m, n:‚); scanf(‚%d,%d‚, &m, &n); if(m > 0 && n > 0){ result = m < n ? n : m; while(result%m != 0 || result%n != 0) result++; printf(‚The least common multiple of m and n is %d.\n‚, result); } else printf(‚the number m or n is not a positive integer.\n‚); }while(m != 1 || n != 1); return 0; }
–累乘:s=s*i; –累除:s=s/i;
10
while循环流程图
main函数 变量初始化 假
i<=100
真 sum=sum+i; i++; 打印sum的值
结束
11
do-while循环流程图
main函数 变量初始化
sum=sum+i; i++;
假
i<=100
真 打印sum的值 结束
12
• 分析两个程序的运行结果
• 循环体由一条语句构成,若为多条语句则必
须用{ }括起来构成一条复合语句
• 流程图如图所示:
4
while语句执行过程:
表达式 非0 循环体语句
0
循环 出口
5
–while语句中表达式的多种形式
• 分析下列程序段退出循环时x的值 -; x为非0时,x!=0为真,执行x• 程序1:
x为0 时,x!=0为假,退出循环
Biblioteka Baidu
x=10;
while (x- -) ;
6
while语句中表达式的多种形式
• while (x !=0) 等价于 while (x) • while (x==0) 等价于 while (!x)
7
二、do- while 语句 • 格式: do {语句;} while (表达式); • 使用说明:
–先执行一次语句,再进行表达式判断 –表达式为非0 时循环,为0 时退出循环 –流程图如图所示:
18
-7
假
–编写程序,计算并显示一个整数各位数字 之和。例如:1024各位数字之和为 1+0+2+4=7
• 分析:不清楚整数位数,但可以每次取出个位数 字进行相加,再将原数整除10后的结果赋给原来 的变量,实现循环累除和循环累加
• 流程图: a 真 s=s+a%10; a=a/10; 假
19
• 练习:
循环结构程序设计
1
循环语句类型
在C语言中,可用以下语句实现循环: (1)用for语句。 (2)用do-while语句。 (3)用while语句。 (4)用goto语句和if语句构成循环。使用goto语 句实现求解1~100累计和的程序可以如下:
2
main() { int n=1, sum=0; loop: sum += n; n++; if (n<=100) goto loop; printf(―sum=%d\n‖, sum); } 其中“loop:‖为语句标号(格式:标号: 语句行),其命名遵循标识 符命名规则。 goto语句格式:goto 标号, 功能为:使系统转向标号所在的语句行执行。
13
while 循环示例
• 使用 while 循环求两个正整数的最小公倍数
#include <stdio.h> int main() { int m, n, result; printf(‚Input two positive integers m, n:‚); scanf(‚%d,%d‚, &m, &n); if(m > 0 && n > 0) { result = m < n ? n : m; while(result % m != 0 || result % n != 0) result++; printf(‚The least common multiple of m and n is %d.\n‚, result); } else printf(‚the number m or n is not a positive integer.\n‚); return 0; 14 }
–若k为整型,则while循环: k=0; while (k=0) k=k-1; A.执行10次 B.无限循环 C.一次也不执行 D.执行一次
分析:因为条件判断表达式k=0是赋值语句,
该表达式的结果为0,条件始终为假。 C为正确答案。
20
–若k为整型,则do-while循环 k=0; do { k- -; } while (k= =0);
A.执行无限次 C.执行1次
B.执行0次 D.执行2次
C,执行第一次 后,K=-1,不等 于0,跳出循环
21
四、for 语句 for ( ; ; )等价于while (1) • 格式:for(e1;e2;e3) 循环体;
–说明:
• e1:赋初值,只执行一次;e2:循环条件; e3:使e2有可能不满足的表达式 • e1、e2、e3、循环体都可能为空,但不能省 略“;”,若省去e2,则是无限循环;若省去 e1、e3,即仅有条件判断,则完全等同于 while语句 • e1、e3可以是逗号表达式 • for语句的流程图:
15
• 程序设计
– 求2
n
n
• 分析:2 =2*2*……*2; • 部分流程图如图所示 输入n 的值 i<=n 真 p=p*2; i++; 假
退出循环, 打印p 的值
16
–计算调和级数1+1/2+1/3+…+1/n的部分和, 当和大于10时,停止计算,输出调和级数的 项数。
• 分析:s=s+1/n;(n=1,2,……) • 部分流程图:
28
for 循环示例
• 打印九九乘法表
#include <stdio.h> int main(){ 三种循环都可以嵌套,但嵌套时内外 int i, j, k; 层循环不能发生交叉 for( i = 1; i <= 9; i++ ){ for( j = i; j <= 9; j++ ){ 发生嵌套时,内层循环经常需要使用 k = i * j; 外层循环的某些值作为控制条件 printf(‚%d×%d = %d\t‚, i, j, k); } printf(‚\n‚) ; } return 0; }
for 循环示例
• 程序读入一个字符串,然后反向打印输出
#include <stdio.h> #include <string.h> int main( ) { char s[50], c; int i, j; printf(‚Input a string: ‚); scanf(‚%s‚, s); for( i = 0, j = strlen(s) – 1; i < j; i++, j– –){ c = s[i]; s[i] = s[j]; s[j] = c; } printf(‚%s\n‚, s); return 0; }
25
k2 • 计算
k 1
100
for 循环示例
#include <stdio.h> int main() { int result, k; result = 0; // 累加器变量,设置初始值(本例设为0) for( k = 1; k <= 100; k++ ) // 循环计算 result += k * k; // 累加 printf(‚The result: %d\n‚, result); return 0; }
29
如果一个循环体内包含另一个循环则 称循环嵌套或多重循环
循环的嵌套
– 定义:循环体语句由一条循环语句来充当 – 程序设计
• • 输出九九乘法表 算法分析:
i=1; j:1~9;求出1乘1~9的值
i=2; j:1~9;求出2乘1~9的值 ……
i=9;j:1~9;求出9乘1~9的值
由此可见:i
每取一个值,j都要从1~9;所以
在i 循环中要嵌套一个j 循环
30
break语句与continue语句
为了使循环控制更加灵活,C语言提供了break语句和 continue语句。 1.一般格式: break; continue; 2.功能 (1)break:强行结束循环,转向执行循环语句的下一 条语句。 (2)continue:对于for循环,跳过循环体其余语句, 转向循环变量增量表达式的计算;对于while和do-while循 环,跳过循环体其余语句,但转向循环继续条件的判定。
26
三种循环结构的比较
• 三种循环结构可以互换使用 • for 循环与 while 循环常见,do-while 循环少见 • while 循环常用于不需要或很少需要初始化的 场合 • for 循环常用于需要简单初始化和通过递增递 减运算控制循环体执行的场合 • for 循环将所有循环控制因素都放在循环头部, 循环结构最清晰 • 通过省略循环头部的一个或多个表达式,for 27 循环也可能非常复杂
x=10;
• 程序2:
while (x!=0) x- -; x为非0 时,执行x- -;
x为0 时,条件为假,退出循环 表达式x- -,- -后置,取出x 的值 进行条件判断后,x自减。当x为0时, x=10;u while (x) x- -; 取出x的值0,条件为假,退出循环, x再自减,x的值为-1 • 程序3:
– <==>while (;i<=10;) {sum=sum+1; i++}
• for(;(c=getchar())!=‗\n‘; printf(―%c‖,c), printf(―\n‖)) ;
空循 环体 任意 表达式
24
• 程序设计
–设计初步
• 用for语句实现1~100的累加
main( ) { int i,sum; for(i=1,sum=0;i<=100;i++) sum=sum+i; printf(“sum=%d\n”,sum); }
8
do-while语句执行情况:
循环体至少执行一次 循环体语句 0 循环 出口
表达式 非0
9
三、循环结构的程序设计 • 设计初步
–用两种循环语句求1~100的和 –分析:
• 通过循环累加实现1~100的求和运算,循环100次, 每次加一个数据
• 由此可以得出以下经验:
–累加:sum=sum+i;