第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环 5.4 多重循环 5.5 break语句和continue语句 5.6 goto语句和标号 5.7 程序举例
5.1 while循环语句 while循环的一般形式如下: while(表达式) 语句 图 5.1 while循环
while语句的执行过程是:先计算while后面圆括号内表达式的值,如果其值为“真”(非0),则执行语句部分(即循环体);然后再计算表达式的值,并重复上述过程,直到表达式的值为“假”(0)时,循环结束,程序控制转至循环结构的下一语句。 while循环中的表达式一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值非零, 就可执行循环体。
例 5.1 利用while语句实现:从键盘输入n(n>0)个数,求其和。
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 12 34 2 11 9 5 sum is: 73
例 5.2 从键盘连续输入字符,直到输入“回车”符为止, 统计输入的字符个数。 图 5.3 统计输入字符的个数
#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.
5.2 do-while循环语句 do-while循环的一般形式如下: do 语句 while (表达式);
图 5.4 do-while循环
do—while语句的执行过程是:先执行循环体中的语句, 然后计算表达式的值。若表达式的值为“真”(非0), 则再次执行循环体。如此重复,直至表达式的值为“假”(0)时, 结束循环。
例 5.3 利用do—while语句重做例5.1。 图 5.5 求n个数的和
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 12 3 7 11 23 34 sum is: 90
5.3 for循环语句 for循环语句的一般形式如下: for (表达式1; 表达式2; 表达式3) 语句
图 5.6 for循环
其执行过程是: (1) 首先求解表达式1。 (2) 求解表达式2, 若其值为“真”(非0), 则执行循环体中的语句, 然后执行第(3) 步。若为“假”(0), 则结束循环, 转至第(5)步。 (3) 求解表达式3。 (4) 转至第(2)步重复执行。 (5) 执行for循环语句的下一语句。
for语句的功能可用while语句描述如下: 表达式1; while (表达式2) { 语句; 表达式3; } for语句最简单的应用形式, 也是最容易理解的形式: for (循环变量赋初值; 循环条件; 循环变量增值) 语句 例如, for (i=1; i<=50; i++) sum=sum+i;
例 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 7 11 20 5 2 19 sum is: 64
例 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
5.4 多重循环 当一个循环体内又包含另一个完整的循环结构时,称为多重循环或循环嵌套,其循环结构可用上述三种循环语句的任意一种。 例如,下面是两种循环嵌套的示意图。 (1) while ( ) { while ( ) } … …
(2) for (; ; ) { do { } while( ); } … … …
例 5.6 输出九九表。
5.5 break语句和continue语句 5.5.1 break语句 其形式为 break;
使用break语句应注意如下几个问题: (1) break语句只能用于switch结构或循环结构, 如果在程序中有下列语句: if (…) break; 则此时的if语句一定位于循环体中或switch结构中, break语句跳出的也不是if语句,而是跳出包含此if语句的循环结构或switch结构。
(2) 在循环语句嵌套使用的情况下, break语句只能跳出(或终止)它所在的循环,而不能同时跳出(或终止)多层循环,如: for (…) { for (…) { … break; } … /* 注1 */ }
例 5.7 计算r=1到r=10时的圆面积,直到面积area大于100为止。 #define PI 3.1415926 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); }
运行结果: 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
5.5.2 continue语句 continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,直接进行下一次是否执行循环的判定。 continue语句的一般形式如下: continue; 其执行过程是:终止当前这一轮循环,即跳过循环体中位于continue后面的语句而立即开始下一轮循环;对于while和do-while来讲,这意味着立即执行条件测试部分,而对于for语句来讲,则意味着立即求解表达式3。
例 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"); } }
运行结果: 100 101 103 104 106 107 109 110 112 113 115 116 118 119 121 122 124 125 127 128 130 131 133 134 136 137 139 140 142 143 145 146 148 149
5.6 goto语句和标号 goto语句为无条件转向语句,程序中使用goto语句时要求和标号配合, 它们的一般形式为 … 标号: 语句;
C语言规定,goto语句的使用范围仅局限于函数内部, 不允许在一个函数中使用goto语句把程序控制转移到其它函数之内。 (1) 与if语句一起构成循环结构。 (2) 退出多重循环。
5.7 程 序 举 例 例 5.9 用 公式求出π的近似值, 直到最后一项的绝对值小于10-6为止。 具体程序如下: 5.7 程 序 举 例 例 5.9 用 公式求出π的近似值, 直到最后一项的绝对值小于10-6为止。 具体程序如下: #include <math.h> main() {int s; float n, t, pi;
例 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++)
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.
例 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
图 5.7 用牛顿迭代法求方程的根
具体程序如下: #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; }
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: 2.0000000
例 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。
具体程序如下: #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