C 程序设计教程(16)—— 循环结构程序设计
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(16)—— 循环结构程序设计
- 一、while 循环
- 二、do - while 循环
- 三、for 循环
- 四、break 与 continue 语句
- 1、break 语句
- 2、continue 语句
- 五、循环的嵌套
循环结构是结构化程序中的三种基本结构之一,和顺序结构、选择结构共同作为这种复杂程序的基本构造单元。
一、while 循环
while 循环的语法格式如下:
while (表达式)
{循环体}
while 循环的执行过程如下:
(1)计算 while 后括号内的表达式的值,当它的值为非 0 时,执行步骤(2),否则退出循环。
(2)执行循环体。然后执行步骤(1)。
while 循环的特点是先计算表达式的值,然后根据表达式的决定是否执行循环体中的语句。如果表达式的值一开始就为 “假”,则循环一次也不执行。例如:
int i=3;
while (i<3){
printf("i=%d",i);
}
其中,printf 函数是while 循环的循环体,但是一次也不执行,因为循环一开始,while 后面的表达式就不成立。
例如:求 1+2+3+……+100 的结果
程序如下:
#include<stdio.h>
int main()
{
int i=1,sum=0;
while (i<=100){
sum+=i;
i++;
}
printf("sum=%d",sum);
return 0;
}
以上程序的执行结果为:
例如:用公式 π/4=1-1/3+1/5-1/7+1/9-……求 π 的值,直到最后一项的绝对值小于 10^(-4)为止。
程序如下:
#include<stdio.h>
#include<math.h>
int main()
{
int i=1;
float pi=0,t=1,s=1;
while (fabs(t)>1e-4){
pi+=t;
i+=2;
s=-s;
t=s/i;
}
pi=4*pi;
printf("pi=%f\n",pi);
return 0;
}
以上程序的执行结果为:
二、do - while 循环
do-while语句构成的循环称为 “直到型循环”,语法格式如下:
do
{
循环体
} while (表达式);
其中,“表达式” 称为循环条件。循环执行的过程如下:
(1)执行 do 后面的循环体。
(2)计算机 while 后面的表达式的值,如果为 “真” 则继续执行循环体,如果 “表达式” 的值为假,则退出循环结构。
例如:计算 1 + 1/2 + 1/3 + 1/4 +…… + 1/50。程序如下:
#include<stdio.h>
int main()
{
int i=2;
float sum=1;
do{
sum=sum+1.0/i;
i++;
} while (i<=50);
printf("sum=%f\n",sum);
return 0;
}
以上程序的执行结果为:
三、for 循环
for 循环的语法格式如下:
for(表达式1; 表达式2; 表达式3){
循环体;
}
for 循环的执行过程为:
(1)计算 “表达式1”。
(2)计算 “表达式2”,如果值为真(非0),执行循环体,否则退出循环。
(3)计算 “表达式3”,然后转向步骤(2)。
说明:
(1)for 循环的执行方式和 while 循环类似。for 循环与 while 循环相比,在格式上显得更紧凑。for 循环的形式可以改写为 while 循环的形式。
表达式1;
while (表达式2){
循环体;
表达式3;
}
(2)for 循环的【表达式1】可以写在 for 循环之前,此时,for 语句中有两个表达式,但【表达式2】之前的分号不能省略。即:
表达式1;
for(; 表达式2; 表达式3){
循环体;
}
例如:
#include<stdio.h>
int main()
{
int i,sum;
for(i=1,sum=0;i<=100;i++){
sum+=i;
}
printf("sum=%d\n",sum);
return 0;
}
以上程序可以写成如下格式:
#include<stdio.h>
int main()
{
int i=1,sum=0;
for(;i<=100;i++){
sum+=i;
}
printf("sum=%d\n",sum);
return 0;
}
(3)如果省略【表达式2】,即不在【表达式2】的位置判断循环条件,将形成死循环。此时,应该在循环体中设置退出循环的机制。例如:
#include<stdio.h>
int main()
{
int i,sum=0;
for(i=1;;i++){
if(i>100) break;
sum+=i;
}
printf("sum=%d\n",sum);
return 0;
}
(4) 如果省略【表达式3】,即不在此位置进行循环变量的修改,则应该在循环体中编写使循环趋向于结束的语句。例如:
#include<stdio.h>
int main()
{
int i,sum=0;
for(i=1;i<=100;){
sum+=i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
(5)可以省略【表达式1】和【表达式3】,仅有【表达式2】。例如:
#include<stdio.h>
int main()
{
int i=1,sum=0;
for(;i<=100;){
sum+=i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
(6)for 语句中的【表达式1】、【表达式2】或【表达式3】都可以省略,甚至三个表达式可以同时省略,但是分号不能省略。例如:
#include<stdio.h>
int main()
{
int i=1,sum=0;
for(;;){
if(i>100) break;
sum+=i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
(7)使用逗号表达式表示【表达式1】和【表达式3】可以使 for 语句更简洁。例如:
#include<stdio.h>
int main()
{
int i,sum;
for(i=1,sum=0;i<=100;sum+=i,i++);
printf("sum=%d\n",sum);
return 0;
}
(8)【表达式2】一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值为非 0,就执行循环体。例如:
#include<stdio.h>
int main()
{
char ch;
for(;ch=getchar()!='\n';);
printf("ch=%c\n",ch);
return 0;
}
例1:求斐波那契数列 1,1,2,3,5,8,…的前40项,公式如下:
fn=1 (n=1)
fn=1 (n=2)
fn=f(n-1)+f(n-2) (n>2)
程序如下:
#include<stdio.h>
int main()
{
long f1=1,f2=1,f;
int i;
printf("%12ld%12ld",f1,f2);
for(i=3;i<=40;i++){
f=f1+f2;
printf("%12ld",f);
if (i%4==0) printf("\n");
f1=f2;
f2=f;
}
return 0;
}
以上程序的执行结果为:
例2:任意输入一个正整数,判断是否为素数。
程序如下:
#include<stdio.h>
#include<math.h>
int main()
{
int x,i,w=1;
printf("请输入一个正整数:");
scanf("%d",&x);
if(x<1) printf("输入数据非法\n");
for (i=2;i<sqrt(x);i++)
if (x%i==0) w=0;
if(w!=0) printf("%d是素数\n",x);
else printf("%d不是素数\n",x);
return 0;
}
以上程序的执行结果为:
四、break 与 continue 语句
1、break 语句
在循环体中可以通过 break 语句立即终止循环的执行。
说明:
(1)break 语句只用于循环语句或 switch 语句。在循环语句中,break 常常和 if 语句一起使用,表示当条件满足时,立即终止循环。
(2)循环语句可以嵌套使用,break 语句只能终止其所在的循环。
例如:任意输入一个正整数,判断是否为素数。
#include<stdio.h>
#include<math.h>
int main()
{
int x,i;
printf("请输入一个正整数:");
scanf("%d",&x);
if(x<1) printf("输入数据非法\n");
for (i=2;i<sqrt(x);i++)
if (x%i==0) break;
if(i>=sqrt(x)) printf("%d是素数\n",x);
else printf("%d不是素数\n",x);
return 0;
}
以上程序的执行结果为:
例:从键盘上连续输入字符,并统计字母的个数,直到输入换行符(\n)时结束。
程序如下:
#include<stdio.h>
int main()
{
int sum=0;
char ch;
do {
ch=getchar();
if (ch>=65&&ch<=90||ch>=97&&ch<=122) sum++;
} while(ch!='\n');
printf("一共输入了%d个字母\n",sum);
return 0;
}
以上程序的执行结果为:
2、continue 语句
continue 语句的功能是结束本次循环。即:跳过本次循环中余下尚未执行的语句,接着再次进行循环条件的判定。
在 while 和 do-while 循环中,continue 语句使流程直接跳到循环控制条件的判断部分,以决定循环是否继续执行。
在 for 循环中,遇到 continue 语句后,跳过循环体中余下的语句,对【表达式3】求值,然后进行【表达式2】的判断,决定 for 循环继续执行。
例:输出 100~200 之间所有能被 3 整除的整数。
程序如下:
#include<stdio.h>
int main()
{
int i,n=0;
for(i=100;i<=200;i++){
if(i%3!=0) continue;
printf("%6d",i);
n++;
if(n%5==0) printf("\n");
}
return 0;
}
以上程序的执行结果为:
五、循环的嵌套
一个循环结构的循环体内又包含另一个循环结构,称为循环的嵌套。
利用循环嵌套可以解决复杂问题,一般把内嵌的循环称为内循环,外层的循环称为外循环。
例:求 1!+3!+5!+…+(2n-1)!
程序如下:
#include<stdio.h>
int main()
{
int i,j,n=5,p;
long sum=0;
for(i=1;i<=n;i++){
p=1;
for (j=1;j<=2*i-1;j++)
p=p*j;
sum+=p;
}
printf("%ld",sum);
return 0;
}
以上程序的执行结果为:
使用嵌套循环时,应注意以下几点:
(1)for 循环、while 循环和 do-while 循环可以相互嵌套,无论如何嵌套,都必须满足内层循环完整地包含在外层循环中,不能形成循环的交叉。
(2)嵌套循环的层数没有限制,但嵌套的层数太多,会消耗大量的内存,并且程序的可读性变差。
(3)内外层循环尽量不要使用相同的循环控制变量。