C语言学习笔记之循环控制结构

循环控制结构

在日常生活中经常会遇到需要重复处理的问题,这就需要用到循环控制结构,通过循环来重复一件事。
C语言中有三大循环:while循环、do while循环、for循环。

while循环

语法:

while(条件判断){
	……………………;
	……………………;
	……………………;
}

大括号内的叫做循环体,是代码重复的事件,while后面接的是条件语句用来判断是否进入循环体,用自然语言表示为当条件语句为真时重复循环体,不成立时跳出循环。这个条件判断语句和if的条件判断是一样的。
一个完整的循环要有入口和出口,入口就是条件判断语句成立的时候,出口是条件语句不成立的时候,如果只有入口没有出口就会变成死循环。比如:

int a = 1;
while(1){
	a++;
}

这就只有入口没有出口,while后面的1始终成立a++这句话就会一直运行。
解决办法是条件语句里的变量在循环体内要有变化,要么增大要么减小。
给个例子,求1-100的和。

#include
int main()
{
	int i = 1;//定义i的初始值
	int sum = 0;//定义sum的初值
	while(i<=100){//控制循环的出口,当i大于100时跳出循环
		sum += i;//求和
		i++;//每次循环使i加1,从而可以跳出循环,并且为下次循环做准备
	}
	printf("sum = %d",sum);
}

最后结果输出sum = 5050。
注意点:
1、当循环体大于一条语句时必须有大括号,否则循环只会执行到while后面第一个分号处。
2、对于i与sum必须要有初值,否则他们的值是不可预知的,不一定都是0。
3、必须要有i++,否则循环永远不会结束。

do while

语法:

do{
	//循环体;

}while(条件判断);

do while语句和while语句的道理其实是差不多的,都要有入口和出口,都要有变量的变化。但是do while要注意在写完while后要加分号,而while语句是不需要分号的。
do while在执行的时候先执行循环体再判断while后面的条件,而while语句是先判断条件再执行循环体。如果条件判断语句一开始为真并且循环体一样的话,两种循环的执行结果则一样,如果条件判断语句一开始为假,则两种循环的结果就不一样。
比如:
while循环

#include
int main()
{
	int i,sum = 0;
	scanf("%d",i);
	while(i<=100){
		sum+=i;
		i++;
	}
	printf("%d",sum);
}

do while循环

#include
int main()
{
	int i,sum = 0;
	scanf("%d",i);
	do{
		sum+=i;
		i++;
	}while(i<=100);
	printf("%d",sum);
}

对于这两段代码,如果都输入1,在一开始两个判断语句都为真,则输出结果都为5050,如果输入101,一开始的判断语句都为假,那么while语句的输出结果为0,do while的输出结果为101,因为while语句先判断101<=100为假则不会进入循环,直接输出sum为0的值,而do while先执行循环体,然后i变成了102,然后判断102<=100为假,再输出sum为101的值。

for循环

语法:

for(循环变量赋初值;循环条件判断;循环变量增值或减少){
	//循环体
}

for循环的语法与while循环的语法不一样,for循环循环变量的初值和变化是写在小括号里的,并且之间用分号隔开,必须用分号,如果循环体的语句大于一条要用大括号括起来,否则只会执行到for后面的第一个分号。
用for实现1-100的和

#include
int main()
{
	int i,sum = 0;
	for(i = 1;i <= 100;i++){
		sum += i;
	}
	printf("%d",sum);
}

这段代码的执行过程是,先给i赋初值,然后判断i是否小于等于100,然后执行循环体,然后再i++,第一次执行完毕,从第二次开始先判断i是否小于等于100,成立的话就执行循环体,然后i++,不成立就跳出循环,这和while循环有点类似,先判断再执行。
for循环里的三个条件并不是必要的,比如如果没有赋初值,for(;i<=100;i++),赋初值可以省略但是分号不可省略,这时候在for循环外面就需要将i的初值赋好。
int i = 1;
for(;i<=100;i++){
}
这和将赋初值放在小括号里是一个道理。
如果没有循环判断或者循环变量的变化,循环将进入死循环。需要在循环体内控制跳出循环的条件。
也可以三个都没有,for( ; ; ){} 这就是标准的死循环。

循环的嵌套

一个循环体内又包含另一个完整的循环体结构,成为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。但是每嵌套一层循环,程序的时间消耗就会成倍增加,所以在算法的设计是要尽量减少循环的嵌套。
三种循环可以互相嵌套,只要保证每个循环的语法正确,那嵌套后的语法也是正确的。

break

break语句用来提前跳出循环,当循环执行到某个特定条件时需要提前结束循环,就需要用if语句加break来实现。
例:在1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时的捐款人数,以及平均每人捐款数目。

#include
int main()
{
	float amount,aver,total = 0;
	int i;
	for(i = 1;i<=1000;i++{
		printf("please enter amount:");
		scanf("%d",&amount);
		total += amount;
		if(total >= 100000) break;
	}
	aver = total/i;
	printf("num=%d\naver=%.2f\n",i,aver);
	return 0;
}

这里的break的作用就是当total大于等于10万时跳出循环。要注意的是这个if语句后面只有一个break语句,所以if的条件只对break有效。

continue

continue用来提前提前结束本次循环,接着执行下一次循环。用了continue后,本次循环中continue下面的语句不再执行,直接进入下一次循环。
例:输出100-200不能被三整除的数。

#include
int main()
{
	int i = 100;
	for(i = 100;i<=200;i++){
		if(i%3 == 0) continue;
		printf("%d\t",i);
	}
	return 0;
}

这里当i能被3整除时直接执行下一个循环,不会输出i。

循环举例

求100-200内的全部素数。

#include
int main()
{
	int i;
	for(i = 100;i<=200;i++){
		int j;
		for(j = 2;j<=i;j++){
			if(i%j == 0) break;
		}
		if(j == i) printf("%d\t",i);
	}
	return 0;
} 

这个问题用了一个嵌套循环,外循环控制从100-200的数,内循环用来判断这个数是否为素数。内循环从2开始如果i%j为0表名j是i的一个因数,此时i便不是素数,一旦找到一个因数则不再继续执行循环直接跳出,如果内循环一直运行到最后才结束,说明这是个素数,那么判断j是否等于i如果等于就输出。

你可能感兴趣的:(C语言学习笔记之循环控制结构)