目录
一、使用for语句实现循环结构
for语句是C语言提供的功能强大、使用广泛的一种循环结构,不仅可以解决循环次数未知的循环问题,特别适合解决循环次数已知的循环问题。
1、for语句的基本语法
for语句的一般形式:
for(表达式1;表达式2;表达式3)
循环体语句;
for语句的执行过程如下:
第①步:首先计算表达式1。
第②步:判断表达式2,若值为真(非0),则执行循环体语句,然后执行第③步;若为假(0),结束循环,跳到第⑤步。
第③步:计算表达式3。
第④步:返回第②步继续执行。
第⑤步:循环结束,继续执行for语句的下一条语句。
大部分情况下,循环体语句为一复合语句。
for语句的执行流程如图①所示。

图① for语句执行流程图
注意:表达式1只是在进入循环之前计算一次。表达式2、循环体语句和表达式3将重复执行。
根据for语句格式的特点,其实际应用可以有多种形式。
(1)可以应用于计数型的循环
格式如下:
for(循环变量赋初值;循环条件;循环变量增量)
循环体语句
【例1.1】输入一个正整数n,求 的值
分析:
本题是一个反复求和的过程,在数学上可以表示为sum=1+2+3+…+n。这种有规律的表达式,可以利用计数型循环解决,核心逻辑:
抽象重复执行部分:
sum = sum + i,sum存累加和(初值 0 )
计数型循环结构:
①循环变量赋初值:
i = 1②循环条件:
i <= n③循环变量增量:
i++④循环体语句:
sum = sum + i
#include <stdio.h>
int main()
{
int i, n, sum;
printf("请输入n的值:");
scanf("%d", &n); /* 调用 scanf 函数输入 n */
sum = 0; /* 置累加和 sum 的初值为 0 */
for (i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,累加 i 的值 */
printf("由1到%d的和是:%d\n", n, sum); /* 输出累加和 */
return 0;
}
运行结果:
请输入n的值:100
由1到100的和是:5050
【例1.2】输入一个正整数n,求 n! 。
分析:
本题目是一个连乘的重复过程,在数学上可以表示为n! = 1×2×3×…×n。这种有规律的表达方式,同样可以利用计数型循环得到解决。
首先抽象出需要反复执行的部分:
factorial = factorial * i
factorial用于保存累乘积,其初值为1(注意不能为0)。该语句重复n次,同时i从1变到n,就实现了从1累乘到n。
计数型循环的结构如下:
①循环变量赋初值:i = 1。
②循环条件:i <= n。
③循环变量增量:i++。
④循环体语句:factorial = factorial * i
#include <stdio.h>
int main(void)
{
int i, n;
double factorial; /* 变量 factorial 中存放阶乘的值 */
printf("输入 n 的值:"); /* 输入提示 */
scanf("%d", &n);
factorial = 1; /* 置阶乘 factorial 的初值为 1 */
for(i = 1; i <= n; i++) /* 循环执行 n 次,计算 n! */
factorial = factorial * i; /* 累乘器 */
printf("%d!=%.0f\n", n, factorial); /* .0f 指定输出时不要小数部分 */
return 0;
}
运行结果:
输入 n 的值:10
10!=3628800
(2)for 语句的一般形式中省略表达式 1
格式如下:
for(;表达式 2;表达式 3) 循环体语句;
说明:省略表达式 1 时,可以将循环变量赋初值放在 for 之前。注意,此时不能省略第一个“;”。
例如,【例 1.1】的循环语句:
for (i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,反复累加 i 的值 */
等价于:
i = 1;
for (; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,反复累加 i 的值 */
(3)for 语句的一般形式中省略表达式 2
格式如下:
for(表达式 1;;表达式 3)
循环体语句;
说明:省略表达式 2 时,表示不对循环进行控制,这时如果没有其他处理的话,会形成死循环。应避免这样使用 for 结构。
(4)for语句的一般形式中省略表达式 3
格式如下:
for(表达式1; 表达式2;)
循环体语句;
说明:省略表达式 3 时,需在循环体中手动修改循环变量(如 i++)。
例如,【例1.2】的循环语句:
for (i = 1; i <= n; i++) /* 循环执行 n 次,计算 n! */
factorial = factorial * i; /* 累乘器,计算 n! */
等价于:
for (i = 1; i <= n;)
{
factorial = factorial * i; /* 累乘器 */
i++; /* 手动更新循环变量 */
}
(5)for 语句的一般形式中表达式 1 和表达式 3 也可以是逗号表达式
例如,【例 1.1】的程序段:
sum = 0; /* 置累加和 sum 的初值为 0 */
for (i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,反复累加 i 的值 */
等价于:
for (sum = 0, i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,反复累加 i 的值 */
表达式sum = 0,i = 1 为逗号表达式。
(6)for 语句的一般形式中表达式 2 的值只要非 0,就执行循环体
例如:
for (;(ch=getchar())!='\n';)
printf("%c",ch);
(7)for 语句的一般形式中循环体语句可以省略
例如,【例 1.1】的循环语句:
for (i = 1; i <= n; i++) /* 循环执行 n 次 */
sum = sum + i; /* 累加器,反复累加 i 的值 */
等价于:
for (i = 1; i <= n; sum = sum + i, i++); /* 循环执行 n 次,并实现累加 */
循环体语句 sum = sum + i; 放到表达式 3 中,与 i++ 构成一个逗号表达式,此时循环体语句实际为一个空语句 ;(单独一个 ; 称为空语句)。
由以上 7 种应用可以看出,C 语言中的 for 循环控制结构功能强大,在解决实际问题中起着非常重要的作用。
2、for循环使用示例
【例1.3】编写程序,输出所有水仙花数。
分析:
水仙花数的定义:各位数字之和等于该数本身的三位整数。假定需要判断的三位整数为 number,其百位数为 a,十位数为 b,个位数为 c,则依次取出 number 的百位数 a、十位数 b 与个位数 c,若满足 number == a * a * a + b * b * b + c * c * c,则 number 就是水仙花数。
#include<stdio.h>
int main()
{
int number,a,b,c;
for(number=100;number<=999;number++)
{
a=number/100; /* 取得百位数 */
b=number%100/10; /* 取得十位数 */
c=number%10; /* 取得个位数 */
if(number==a*a*a+b*b*b+c*c*c)
printf("%5d",number);
}
return 0;
}
运行结果:
153 370 371 407
二、使用while语句实现循环结构
在C语言中,使用while语句完成不定次数循环。如果满足循环条件,则反复执行循环体语句,当循环条件不满足时退出循环。
1、 while语句的基本语法
while语句在使用时,总是先要判断一个条件,所以可以用while语句实现“当型”循环,while语句的一般形式如下:
while(表达式)
循环体;
while语句的执行流程如图②所示

图② while语句执行流程
第①步:计算表达式的值,若表达式的值为"真",则执行第②步;若表达式的值为"假",则转到第④步。
第②步:执行循环体语句。
第③步:返回第①步。
第④步:结束循环,执行while语句的下一条语句。
注意,while语句的特点是先判断循环条件,后执行循环体。
2、while 循环使用示例
【例 2.1】计算 sum = 的值
分析:
本例是求 1~100 的累加和,即求 sum = 1 + 2 + 3 +… + 100 。其中变量 sum 用于存放和,称作累加变量,其初值应设置为 0;变量 i 用于存放 1~100 的每一个自然数,初值取 1 。【例 1.1】中用 for 循环语句实现了本题目,这里采用 while 循环语句来实现。
#include<stdio.h>
int main()
{
int i,sum; /* 定义用到的变量 */
i=1;sum=0; /* 变量赋初值 */
while(i<=100) /* 循环入口,条件判断 */
{
sum=sum+i; /* 累加器,累加一个值 */
i=i+1; /* 累加项的增量 */
}
printf("sum=%d\n",sum); /* 输出累加和 */
return 0;
}
运行结果:
sum = 5050
【例 2.2】输入一个正整数n,求 n! 。
分析:
本例是求 fact = 1×2×3×…×n,即求 n 的阶乘。用变量 fact 存放累乘的结果,其初值设置为 1;变量 i 用于存放 1~n 的每一个自然数,初值取 1 。【例 1.2】中是用 for 循环语句实现本题目的,这里采用 while 循环语句实现。
#include<stdio.h>
int main()
{
int i; long n,fact; /* 定义用到的变量 */
i=2;fact=1; /* 变量赋初值 */
printf("请输入 n 的值:");
scanf("%ld", &n);
while(i <= n) /* 循环入口,条件判断 */
{
fact = fact * i; /* 累乘器,累乘一个值 */
i = i + 1; /* 累乘项的增量 */
}
printf("%ld! = %ld\n", n, fact); /* 输出阶乘值 */
return 0;
}
运算结果:
请输入 n 的值:10
10! = 3628800
三、使用 do-while 语句实现循环结构
在C语言中,do-while 语句也用于完成不定次数的循环控制。与while 语句不同的是,do-while 语句先执行一次循环体,然后判断循环条件,如果满足,则反复执行循环体语句;否则结束。
1、do-while 语句的基本用法
do-while 在使用时,首先执行循环体语句,然后再判断条件。所以可以用 do-while 语句实现“直到型”循环。do-while 语句的一般形式如下:
do
循环体
while(表达式);
do-while 语句的执行流程如图③所示

图③ do-while 语句的执行流程
第①步:执行循环体语句。
第②步:计算表达式的值,若表达式的值为"真",则执行第①步;若表达式的值为"假",则转到第③步。
第③步:循环结束,执行do-while 语句的下一条语句。
注意:do-while 语句的特点是先执行一次循环体,然后判断循环条件。因此,do-while 循环至少要执行一次循环体。
2、do-while 循环使用示例
【例 3.1】计算 sum = 的值
#include<stdio.h>
int main()
{
int i, sum; /* 定义用到的变量 */
i = 1; sum = 0; /* 变量赋初值 */
do
{
sum = sum + i; /* 累加器,累加一个值 */
i = i + 1; /* 累加项的增量 */
} while (i <= 100); /* 循环的条件 */
printf("sum=%d\n", sum);/* 输出累加和 */
return 0;
}
运行结果:
sum=5050
说明:在【例 1.1】、【例 2.1】 及本例中,分别使用 for 循环语句、while 循环语句及 do-while 循环语句求解了同一个问题,表明这 3 种循环结构具有通用性。遇到循环问题时,选择循环结构的建议:
①已知循环次数,首选 for 循环;
②循环次数不明确、靠条件控制,选 while 循环;
③需先执行语句、再判断是否继续,选 do-while 循环。
do-while 语句使用注意点:
①do 之后不能直接写分号 ;,语句未结束;
②while(表达式) 后必须有分号 ;,标记 do-while 结束;
③循环体必须有改变循环条件的语句,否则会出现死循环。
【例 3.2】求两个自然数的最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int a, b, r, n, m; /* 定义用到的变量 */
printf("请输入两个整数:");
scanf("%d%d", &a, &b); /* 输入两个整数 */
m = a, n = b; /* 保存两个整数 */
do /* 循环入口 */
{
r = a % b; /* 求余数 */
a = b;
b = r;
} while (r != 0);
printf("%d 和 %d 的最大公约数是:%d\n", m, n, a);
printf("最小公倍数是:%d", m * n / a); /* 输出最小公倍数 */
return 0;
}
运行结果:
请输入两个整数:14 26
14 和 26 的最大公约数是:2
最小公倍数是:182
四、改变循环结构的跳转语句
在前面介绍的3种循环语句种,即for循环语句、while循环语句及do-while 循环语句中,控制循环是通过循环达到设定的次数或循环的判断条件为“假”时结束循环,这种循环控制方式在实际的程序设计中是不够的。在许多时候当循环中出现多个循环条件时,要求当某个条件满足时会立即结束循环,或者循环结构中根据条件会跳出某些语句继续循环,这就要在循环结构中配合使用 break 语句和 continue 语句。
1、break语句
break 语句可用于循环语句和 switch 语句。在 switch 语句中的用法在分支结构程序设计中已介绍,这里介绍其在循环语句中的用法。分支结构程序设计
break 语句的一般形式:
break;
当break语句用于循环语句中时,可使程序终止循环而转去执行循环语句的后继句。通常 break 语句总是与if语句一起配合使用,即满足条件是便跳出循环。
【例 4.1】编写程序,由键盘输入一个正整数,判断其是否为素数
#include<stdio.h>
#include<math.h> /* 求平方根要引入 math.h */
int main()
{
int n, m, i; /* 定义用到的变量 */
printf("请输入一个正整数:"); /* 输入整数 */
scanf("%d", &n);
m = sqrt(n); /* 求其平方根 */
for (i = 2; i <= m; i++) /* 取 2~m 之间的每一个数 */
{
if (n % i == 0) /* 判断能否整除 n */
{
break; /* 非素数,跳出循环 */
}
}
if (i > m)
printf("%d 是素数!\n", n); /* 循环正常结束,是素数 */
else
printf("%d 不是素数!\n", n); /* 循环中途退出,不是素数 */
return 0;
}
运行结果1:
请输入一个正整数:11
11 是素数!
运行结果2:
请输入一个正整数:12
12 不是素数!
说明:
①程序中结束 for 循环的条件有两个:一是 i > m;二是 break 语句。
②若 i > m,说明 for 循环正常结束,则 n 一定是素数。
③若遇到 break 语句,说明循环中条件 n % i == 0 成立,n 能被某个 i 整除,执行 break 语句退出循环,此时 i <= m,n 一定不是素数。
2、continue 语句
continue 语句的作用是跳过循环体中 continue 后面的语句,继续下一次循环。continue 语句只能用在循环语句中,常与 if 语句一起使用。
continue 语句的一般形式如下:
continue;
【例 4.2】把 1~100 之间能被 7 整除的数,以每行 5 个的形式在屏幕上输出
#include<stdio.h>
int main()
{
int i, n = 1;
for(i = 1; i <= 100; i++)
{
if(i % 7 != 0)
continue; /* 若不能被 7 整除,继续下一次循环 */
printf("%4d", i);
if(n++ % 5 == 0)
printf("\n"); /* 控制每行输出 5 个 */
}
return 0;
}
运行结果:
7 14 21 28 35
42 49 56 63 70
77 84 91 98
说明:
①if(i%7!=0) continue; 的功能:
如果 i 不能被 7 整除,则结束本次循环,转而执行 i++,继续下一次循环。
②不使用 continue 的写法:
本例是 continue 语句的使用示例,也可改写循环体,不用 continue:
if(i%7==0)
printf("%4d",i);
③continue 与 break 的区别:
1)continue 只结束本次循环,继续下一次循环判断;
2)break 强制终止整个循环,不再执行后续循环。
3、goto 语句
除了前面介绍的 3 种循环控制语句,即 for 循环语句、while 循环语句及 do-while 循环语句之外,在 C 语言中,还有一种可以实现循环控制的语句,即 goto 语句。
goto 语句的一般形式如下:
goto 语句标号;
说明:语句标号是一个有效的标识符,使用时在语句标号的后面跟一个 : 出现在函数中某语句的前面。程序执行到 goto 语句时,会控制跳转到该语句标号处,达到控制循环的目的。
【例 4.3】使用 goto 语句计算 sum = 的值
#include<stdio.h>
int main()
{
int i, sum;
i = 1; sum = 0;
loop: if (i <= 100) /* loop 为 goto 跳转的语句标号 */
{
sum = sum + i;
i = i + 1;
goto loop; /* 跳转到语句标号 loop 处继续执行 */
}
printf("sum=%d\n", sum); /* 输出累加和 */
return 0;
}
运行结果:
sum=5050
注意:
语句标号必须与 goto 语句处于同一个函数中。通常 goto 语句与 if 语句连用实现循环控制。大型程序中由于 goto 语句可能存在的不合理的使用,会使程序结构变坏,所以结构化程序设计中,不建议使用 goto 语句。
1177

被折叠的 条评论
为什么被折叠?



