Download presentation
Presentation is loading. Please wait.
Published byΕυάγγελος Μαυρίδης Modified 5年之前
1
第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环
5.4 多重循环 5.5 break语句和continue语句 5.6 goto语句和标号 5.7 程序举例
2
5.1 while循环语句 while循环的一般形式如下: while(表达式) 语句 图 5.1 while循环
3
while语句的执行过程是:先计算while后面圆括号内表达式的值,如果其值为“真”(非0),则执行语句部分(即循环体);然后再计算表达式的值,并重复上述过程,直到表达式的值为“假”(0)时,循环结束,程序控制转至循环结构的下一语句。 while循环中的表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值非零, 就可执行循环体。
4
例 5.1 利用while语句实现:从键盘输入n(n>0)个数,求其和。
5
main() { int i, n, k, sum; i=1; sum=0; printf("Input n: "); scanf("%d", &n); while(i<=n) { scanf("%d", &k); sum=sum+k; i++; } printf("\nsum is: %d\n", sum); } 运行结果: Input n: 6 sum is: 73
6
例 5.2 从键盘连续输入字符,直到输入“回车”符为止, 统计输入的字符个数。
图 5.3 统计输入字符的个数
7
#include <stdio.h>
main() { char ch; int len=0; puts("Type in a sentence, then press <Enter>\n"); while ((ch=getch())!=′\r′) { putchar(ch); len++; } printf("\nSentence is %d characters long.\n", len); 运行结果: Type in a sentence, then press <Enter> this is a sentence. Sentence is 19 characters long.
8
5.2 do-while循环语句 do-while循环的一般形式如下: do 语句 while (表达式);
9
图 5.4 do-while循环
10
do—while语句的执行过程是:先执行循环体中的语句, 然后计算表达式的值。若表达式的值为“真”(非0), 则再次执行循环体。如此重复,直至表达式的值为“假”(0)时, 结束循环。
11
例 5.3 利用do—while语句重做例5.1。 图 5.5 求n个数的和
12
main() { int i, n, k, sum; i=1; sum=0; printf("Input n: "); scanf("%d", &n); do { scanf("%d", &k); sum=sum+k; i++; } while(i<=n); printf("sum is: %d\n", sum); } 运行结果: Input n: 6 sum is: 90
13
5.3 for循环语句 for循环语句的一般形式如下: for (表达式1; 表达式2; 表达式3) 语句
14
图 5.6 for循环
15
其执行过程是: (1) 首先求解表达式1。 (2) 求解表达式2, 若其值为“真”(非0), 则执行循环体中的语句, 然后执行第(3) 步。若为“假”(0), 则结束循环, 转至第(5)步。 (3) 求解表达式3。 (4) 转至第(2)步重复执行。 (5) 执行for循环语句的下一语句。
16
for语句的功能可用while语句描述如下:
表达式1; while (表达式2) { 语句; 表达式3; } for语句最简单的应用形式, 也是最容易理解的形式: for (循环变量赋初值; 循环条件; 循环变量增值) 语句 例如, for (i=1; i<=50; i++) sum=sum+i;
17
例 5.4 利用for语句重做例5.1。 main() { int i, n, k, sum=0;
printf("Input n: "); scanf("%d", &n); for (i=1; i<=n; i++) { scanf("%d", &k); sum=sum+k; } printf("sum is: %d\n", sum); 运行结果: Input n: 6 sum is: 64
18
例 5.5 计算1至50中是7的倍数的数值之和。 运行结果: sum=196 main() { int i, sum=0;
例 5.5 计算1至50中是7的倍数的数值之和。 main() { int i, sum=0; for (i=1; i<=50; i++) if (i%7==0) sum+=i; printf("sum=%d\n", sum); } 运行结果: sum=196
19
5.4 多重循环 当一个循环体内又包含另一个完整的循环结构时,称为多重循环或循环嵌套,其循环结构可用上述三种循环语句的任意一种。 例如,下面是两种循环嵌套的示意图。 (1) while ( ) { while ( ) } … …
20
(2) for (; ; ) { do { } while( ); } … … …
21
例 5.6 输出九九表。
23
5.5 break语句和continue语句 break语句 其形式为 break;
24
使用break语句应注意如下几个问题:
(1) break语句只能用于switch结构或循环结构, 如果在程序中有下列语句: if (…) break; 则此时的if语句一定位于循环体中或switch结构中, break语句跳出的也不是if语句,而是跳出包含此if语句的循环结构或switch结构。
25
(2) 在循环语句嵌套使用的情况下, break语句只能跳出(或终止)它所在的循环,而不能同时跳出(或终止)多层循环,如:
for (…) { for (…) { … break; } … /* 注1 */ }
26
例 5.7 计算r=1到r=10时的圆面积,直到面积area大于100为止。
#define PI main() { int r; float area; for (r=1; r<=10; r++) { area=PI*r*r; if (area>100) break; printf("r: %d area is: %f\n", r, area); }
27
运行结果: r: 1 area is: r: 2 area is: r: 3 area is: r: 4 area is: r: 5 area is:
28
continue语句 continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,直接进行下一次是否执行循环的判定。 continue语句的一般形式如下: continue; 其执行过程是:终止当前这一轮循环,即跳过循环体中位于continue后面的语句而立即开始下一轮循环;对于while和do-while来讲,这意味着立即执行条件测试部分,而对于for语句来讲,则意味着立即求解表达式3。
29
例 5.8 把100到150之间的不能被3整除的数输出,要求一行输出10 个数。
例 5.8 把100到150之间的不能被3整除的数输出,要求一行输出10 个数。 main() { int n, i=0; for (n=100; n<=150; n++) { if (n%3==0) continue; printf("%4d", n); i++; if (i%10==0) printf ("\n"); } }
30
运行结果:
31
5.6 goto语句和标号 goto语句为无条件转向语句,程序中使用goto语句时要求和标号配合, 它们的一般形式为
… 标号: 语句;
32
C语言规定,goto语句的使用范围仅局限于函数内部, 不允许在一个函数中使用goto语句把程序控制转移到其它函数之内。
(1) 与if语句一起构成循环结构。 (2) 退出多重循环。
33
5.7 程 序 举 例 例 5.9 用 公式求出π的近似值, 直到最后一项的绝对值小于10-6为止。 具体程序如下:
5.7 程 序 举 例 例 用 公式求出π的近似值, 直到最后一项的绝对值小于10-6为止。 具体程序如下: #include <math.h> main() {int s; float n, t, pi;
35
例 5.10 从键盘输入一个大于2的整数n,判断n是不是素数。
具体程序如下: #include <stdio.h> #include <math.h> main() {int n, k, i, flag; do { printf("Input a number: "); scanf("%d", &n); } while(n<=2); k=sqrt((double)n); flag=1; for (i=2; i<=k; i++)
36
if (n%i==0) {flag=0; break; /* 有一数能整除就不是素数, 不再循环 */ } if (flag) printf("%d is a prime number.\n", n); else printf("%d is not a prime number.\n", n); } 运行结果: Input a number: 35 35 is not a prime number.
37
例 5.11 用牛顿迭代法求方程2x3-4x2+3x-6=0的根,要求误差小于10-5。
从图5.7可以看出: 因此, 令f(x)=2x3-4x2+3x-6 可写成以下形式: f(x)=((2x-4)x+3)x-6
38
图 5.7 用牛顿迭代法求方程的根
39
具体程序如下: #include <stdio.h> #include <math.h> main()
{float x, x0, f, f1; printf("Enter the first approch x: "); scanf("%f", &x); do {x0=x; f=((2*x0-4)*x0+3)*x0-6; /* 求f(x0) */ f1=(6*x0-8)*x0+3; /* 求f′(x0) */ x=x0-f/f1; }
40
while(fabs(x-x0)>=1e-5);
printf("The root of equation is: %10.7f\n", x); } 运行结果: Enter the first approch x: 1.5 The root of equation is:
41
例 5.12 从键盘输入4个9以内的数字字符,将其转换为4位十进制数后显示出来。
分析: (1) 将每个数字字符c变成对应的数字,即将以ASCII码表示的数字字符变成一位十进制数,方法为:c-′0′,如c=′8′时,c-′0′=8。转换中若遇非′0′~′9′字符则结束转换。 (2) 将每次变换的一位十进制数,从高位开始,按位加权, 变成多位的十进制数,放在变量data中。如输入1,2,3,4, 则 结果应是按%d格式显示的1234。
42
具体程序如下: #include <stdio.h> main() {char c; int i, data=0;
printf("Input char : "); for (i=0; i<4; i++) {c=getchar(); /* 输入一数字字符 */ if (c<′0′ ||c>′9′) /* 判断输入字符是否在′0′~′9′范围内 */ break; data=data*10+c-′0′; /* 计算当前data值 */ } printf("data=%d\n", data); } 运行结果: Input char: 1463 data=1463
Similar presentations