C 程序设计教程(16)—— 循环结构程序设计

C 程序设计教程(16)—— 循环结构程序设计

在这里插入图片描述

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

循环结构是结构化程序中的三种基本结构之一,和顺序结构、选择结构共同作为这种复杂程序的基本构造单元。

一、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)内外层循环尽量不要使用相同的循环控制变量。

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/128651733
今日推荐