c语言循环结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
do语句和while语句没有本质的区别。 唯一的不同在于do语句的循环体至少会被执行一次。
18
最好对所有的do语句都使用大括号包括循环体,因 为没有大括号的do语句很容易被误认为是while语句:
do
printf("T minus %d and counting\n", i--); while (i > 0);
31
C语言允许省略任意或全部的表达式。 如果省略第一个表达式,那么在执行循环前没有初始 化的操作:
i = 10; for (; i > 0; --i) printf("T minus %d and counting\n", i);
如果省略第三个表达式,那么循环体需确保第二个表 达式的值最终会变为假:
/* Prints a table of squares using a while statement */
#include <stdio.h>
int main(void) { int i, n;
printf("This program prints a table of squares.\n"); printf("Enter number of entries in table: "); scanf("%d", &n);
29
for语句对于“向上加”(变量自增)或“向下减” (变量自减)的循环来说是最好的选择。 对于向上加或向下减共有n次的情况,for语句经常 会采用下列形式中的一种。
for (i = 0; i < n; i++) …
for (i = 1; i <= n; i++) …
从0向上加到n–1:
从1向上加到n:
for (i = 10; i > 0;) printf("T minus %d and counting\n", i--);
32
当第一和第三表达式都省略时,for循环与while循 环没有任何区别:
for (; i > 0;) printf("T minus %d and counting\n", i--);
。
do语句的一般格式如下:
do 语句 while ( 表达式 ) ;
执行do语句时,先执行循环体,再计算控制表达式 的值。 如果表达式的值非零,那么再次执行循环体,然后 再次计算表达式的值。
17
使用do语句重写前面的“倒数计数”程序:
i = 10; do { printf("T minus %d and counting\n", i); --i; } while (i > 0);
5
while语句示例:计算大于或等于数n的最小的2次幂:
i = 1; while (i < n) i = i * 2;
设n为10时,下面跟踪显示了while语句执行情况:
i = 1; i < n成立吗? i = i * 2; i < n成立吗? i = i * 2; i < n成立吗? i = i * 2; i < n成立吗? i = i * 2; i < n成立吗? i现在值为1. 是,继续。 i现在为2.
方法是将将用户输入的整数反复除以10,直到 结果变为0,除的次数就是用户输入整数的位数。 do语句比while语句更适合,因为每个整数,即 便是0都至少有一位数字。
22
numdigits.c
/* Calculates the number of digits in an integer */
#include <stdio.h>
24
for语句的执行流程
for(表达式1;表达式2;表达式3) 语句;
25
for语句和while语句关系紧密。 除了极少数情况,for循环总可以等价替换为while循 环:
表达式1;
while ( 表达式2 ) {
语句 表达式3;
}
表达式1是在循环开始执行前,只执行一次的初始化
步骤。
26
for (;;) …
34
C99中,for语句的第一个表达式能被替换为一个声 明(定义)。 这个特性允许程序员在for循环中定义变量:
for (int i = 0; i < n; i++) …
10
程序square.c用一个while语句显示平方值表格。 用户指定平方值表格的行数:
This program prints a table of squares. Enter number of entries in table: 5 1 1 2 4 3 9 4 16 5 25
11
square.c
int main(void) { int digits = 0, n;
printf("Enter a nonnegative integer: "); scanf("%d", &n);
do { n /= 10; digits++; } while (n > 0); printf("The number has %d digit(s).\n", digits); return 0;
}
23
for语句适合应用在使用“计数”变量的循环中,然 而它也灵活用于许多其他类型的循环中。 for语句的一般格式如下:
for ( 表达式1; 表达式2; 表达式3 ) 语句
表达式1、表达式2和表达式3全都是表达式。 示例:
for (i = 10; i > 0; i--) printf("T minus %d and counting\n", i);
即使没有严格要求的时候,一些程序员始终使用大括 号括住循环体:
while (i < n) { i = i * 2; }
7
下面的语句显示一串“倒数计数”信息:
i = 10; while (i > 0) { printf("T minus %d and counting\n", i); i--; }
3
使用while语句是最简单、最基本的设置 循环方法。 While语句格式如下:
while ( 表达式) 语句
表达式即为控制表达式;语句则是循环体。
4
while语句示例:
while (i < n) i = i * 2; /* 控制表达式 */ /* 循环体 */
执行while语句时,首先计算控制表达式的值。 如果值不为零(真),那么执行循环体,接着再次 判定表达式。 这个过程持续进行直到最终控制表达式的值变为零。
while (i > 0) printf("T minus %d and counting\n", i--);
9
如果控制表达式的值始终是非零值的话,while语句 将无法终止。 C语句程序员有时故意用非零常量作为控制表达式来 构造无限循环:
while (1) …
除非循环体含有跳出循环控制的语句(break, goto, return)或调用了导致程序终止的函数,否则上述这 种形式的while语句将永远执行下去。
粗心的读者可能会把单词while误认为是while语句 的开始。
while(i<=100)
19
n
n 1
100
运行结果:5050
n
n 1
100
运行结果:5050
Fra Baidu bibliotek
程序numdigits.c 计算用户输入的整数的位数:
Enter a nonnegative integer: 60 The number has 2 digit(s).
scanf("%d", &n); while (n != 0) { sum += n; scanf("%d", &n); } printf("The sum is: %d\n", sum); return 0; }
14
n
n 1
100
运行结果:5050
n
n 1
100
运行结果:5050
说明:(1)循环体如果包含一个以上的语句, 应该用花括弧括起来,以复合语句形式 出现.(2)在循环体中应有使循环趋向于 结束的语句
i = 10; while (i > 0) { printf("T minus %d and counting\n", i); --i; }
28
由于for语句中的第一和第三表达式都是以语句的方 式执行的,所以它们的值互不相关——它们有用仅 仅是因为有副作用。 所以,这两个表达式常常是赋值表达式或自增/自减 表达式。
i = 1; while (i <= n) { printf("%10d%10d\n", i, i * i); i++; } return 0; }
12
程序sum.c 对用户输入的整数数列求和:
This program sums a series of integers. Enter integers (0 to terminate): 8 23 71 5 0 The sum is: 107
整个过程持续到显示信息为“T minus 1 and counting”。
8
关于while语句的一些讨论:
◦ 在while循环终止时,控制表达式的值为假。因此,当通过 表达式i > 0控制循环终止时,i必须是小于或等于0的。 ◦ 可能根本不执行while循环体。因为控制表达式是在循环体 执行之前进行判定。 ◦ while语句常常可以有多重写法。更加简明的递减计数循 环如下:
循环
1
C语言的重复语句用于设置循环。 循环是重复执行其他语句的一种语句,循 环中重复执行的语句就是循环体 C语句中,每个循环都有一个控制表达式。 每次执行循环体时都要对控制表达式进行 计算。
◦ 如果表达式为真,也就是不为零,那么继续执 行循环。
2
C
提供三种循环语句:
◦ while语句:用于判定控制表达式在循环 体执行之前的循环。 ◦ do语句:用于判定控制表达式在循环体执 行之后的循环。 ◦ for语句:对于自增或自减计数变量的循环 十分方便。
是,继续。 是,继续。 是,继续。
i现在为4。
i现在为8。
i现在为16。 不成立,退出循环。
6
虽然循环体必须是单独的一条语句,但这只是个技术 问题。 如果需要多条语句,那么只要用一对大括号构造成单 独一条复合语句就可以了:
while (i > 0) { printf("T minus %d and counting\n", i); i--; }
等价于
while (i > 0) printf("T minus %d and counting\n", i--);
while语句的形式更清楚,因此更可取。
33
如果省略第二个表达式,那么它默认为真,因此for 语句不会终止(除非以某种其他形式停止)。 例如:某些程序员用下列的for语句建立无限循环:
27
研究等价的while语句有助于更好地理解for语句。 例如,假设把先前for循环示例中的i--替换为--i:
for (i = 10; i > 0; --i) printf("T minus %d and counting\n", i);
等价的while循环显示上述的替换对循环没有任何影 响:
程序需要使用循环,循环采用scanf函数读取用户 输入数,然后再把这个数加到运算的总和中。
13
sum.c
/* Sums a series of numbers */
#include <stdio.h>
int main(void) { int n, sum = 0;
printf("This program sums a series of integers.\n"); printf("Enter integers (0 to terminate): ");
从n-1向下减到0:
从n向下减到1:
for (i = n - 1; i >= 0; i--) …
for (i = n; i > 0; i--) …
30
常见语句错误:
◦ 在控制表达式中用<(大于)代替> (反之亦然)。“向上 加”使用<或<=运算符;“向下减使用>或〉=运算符。 ◦ 在控制表达式中使用==代替<, <=, >, 或>=。 ◦ 编写的控制表达式用i<=n代替i<n,会产生“循环次数差一 次”错误。
表达式2控制用于控制循环的终止(循环持续执行,只
要表达式2的值非零)。 表达式3是在每次循环的最后被执行的一个操作。 按照这种模式,上面的for循环可以改写为如下的 while循环:
i = 10; while (i > 0) { printf("T minus %d and counting\n", i); i--; }