在通常情况下,我们所写的程序,往往是重复的,我们可以重复写相同的程序段来实现要求,但显然是不现实的,工作量大,代码冗长且重复,对于阅读和维护都是困难的,因此高级语言提供了循环语句,来处理需要重复进行的操作。

一、while语句循环

1.1一般形式

while(表达式){
	语句;
}

表达式的成立,则执行循环体语句,不成立就不执行循环体语句。
语句可以是一个语句,也可以是复合语句,语句块。
注意:while循环的特点是先判断条件表达式,后执行循环体语句。

1.2累加求和

例如:
求1+2+3+4+5…+100

思路:

  1. 累加100次,每次加一个数。
  2. 每次加的数是有规律的,后一个数是前一个数加一,所以不用scanf一个个的从键盘输入数字,而是在加完上一个数i后,使i加一就可以得到下一个数字

流程图:

在这里插入图片描述
代码:

#include <stdio.h>
int main()
{	
	int i = 1;//定义初始变量 
	int sum = 0;
	while(i<=100){//当i>100时,判断条件为假,跳出循环 
		sum = sum + i;//第一次累加后sum的值为1 
		i++;//加完后,i的值加一,为下一次的累加做准备 
	} 
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

注意:
这里不能忽视i和sum的初始值,不然结果是不正确的
在这里插入图片描述

二、do…while语句循环

2.1do…while语句一般形式

do
	语句
while(语句)

2.2do…while语句特点

先无条件的执行循环体,然后判断条件是否成立。
先执行一次指定的循环体语句,然后判断表达式,当判断表达式的值为真时,返回重新执行循环体语句,如此反复,直到表达式的值为假为止,此时循环结束。

例:求1+2+3…+100的和

#include <stdio.h>
int main()
{	
	int i = 1;//定义初始变量 
	int sum = 0;
	do{
		sum = sum + i;//第一次累加后sum的值为1 
		i++;//加完后,i的值加一,为下一次的累加做准备 
	}while(i<=100)
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

不难看出,do…while和while处理同一问题的时候,若二者的循环体部分一样,那么结果也是一样的。

三、for语句循环

for循环语句可以用来代替while语句,for语句,可以

3.1for语句的一般形式

for(表达式1;表达式2;表达式3)
{
	循环语句;
}

表达式1执行一次,一般为初始条件;
表达式2是循环结束的条件,如果成立,则执行循环语句;
表达式3是循环变量增值的语句,在执行完循环语句后才进行。

等价于while循环语句:

表达式1while(表达式2)
{
	语句;
	表达式3}

也可以写成一下形式:

for(循环变量赋初值;循环条件;循环变量增值)
{
	语句;
}

例如:

for(i = 1;i<100;i++)
{
	sum = sum + i;
}

依然是求1+2+…+100的和

#include <stdio.h>
int main()
{	
	int i ;//定义初始变量 
	int sum = 0;
	for(i = 1;i<=100;i++)
	{
		sum = sum + i;
	}
	printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 
	return 0;
}

执行顺序如下:

  1. 求解表达式1,i赋值为1.
  2. 然后执行表达式2,判断i小于等于100吗?显然i是小于100的,逻辑成立。
  3. 则执行循环语句sum = sum + i;sum的值为1;
  4. 执行表达式3,i++;此时i的值变成了2;
  5. 转到步骤2继续判断。如果i++后的值为101则结束循环.
  6. 就直接跳到for语句下面的一条语句输出sum的值。

3.2for语句的细节问题处理

  1. 表达式1的语句是可以省略的,但是分号不可以省略。由于省略了表达式1,应该记得给表达式1赋初值
int i = 1//提前赋初值
for( ;i <= 100;i++)//没有表达式1
sum  = sum +i;
  1. 表达式2也是可以省略的,就默认表达式2的值为真,一直循环
for(i = 1; ;i++)
sum = sum + i;

等价于:

int i  = 0;
while(1)
{	
	sum = sum + i;
	i++;
}
  1. 表达式3也是可以省略的,但是必须保证循环可以结束
for(i = 1;i <= 100;)
{
	sum = sum + i;
	i++;//可以在循环体中是变量的值增加
}
  1. 也可以省略三个表达式,就没有什么实用价值了。
for(;;) printf("%d\n",i);

等价于:

while(1) printf("%d\n",i);
  1. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式,表达式3也可以是其他表达式。表达式1和表达式3也可以是逗号表达式。只要可以是for循环正常执行就可以
for(sum = 0;i <= 100;i++) sum  = sum + i;//表达式1设置其他的表达式
for(sum = 0,i= 1;i <= 100;i++)//表达式1也可以是一个逗号表达式
for(i=0,j=100;i<=j;i++,j--)//表达式3也可以是一个逗号表达式
  1. 表达式2一般是关系表达式,也可以是逻辑表达式,也可以是数值表达式,字符表达式,只要其值不为0即可。
for(i = 0;(c=getchar())!='\n';i+=c)

这个循环语句的意思是:从键盘输入一个字符,赋给C,只要c不等于’\n’就执行循环体,然后在i+=c;
作用:从键盘输入字符,对输入的字符的ASCII码进行累加,直到’\n’为止。

注意:
以上for循环为空语句,把循环体的内容放在了表达式3中。
也可以改为:

#include<stdio.h>
int main()
{
	int i= 0;
	int c;
	for(;(c=getchar())!='\n';)
	printf("%c",c);
 } 

运行结果:

在这里插入图片描述

四、三种循环的嵌套使用

一个循环体中又包含另外一个完整的循环结构,称为循环的嵌套。

  1. 例如:while…while的嵌套
while()
{
	...
	while()//内层循环
	{
		...
	}
}
  1. do…while的嵌套循环
do
{
	...
	do//内层循环
	{
		...
	}while();
	
}while();
  1. for循环的嵌套(经常使用)
for(;;)
{
	for(; ;)//内层循环
	{
		...
	}
}
  1. while和do…while循环
while()
{
	'''
	do
	{
		...
	}while();
}
  1. for和while的循环
for(; ;)
{
	...
	while()
	{
		...
	}
}
  1. do…while和for循环
do
{
	for(;;)
	{
		...
	}
}while();

五、break和continue

5.1break提前终止循环

break只能用于循环语句和switch语句中,而不能单独使用

break是跳出循环结构,结束循环。
如果是双重循环,内循环有break语句,是提前结束内循环。

例如:

有1000人进行募捐,当总数达到10万元的时候就结束,统计此时捐款的人数以及平均每人捐款的数目。

思路:

  1. 首先是循环的次数不能确定,可以设置为最大值,1000.
  2. 在循环体中统计募捐的总数,并且用if语句判断募捐总数是否大于10万元。如果大于10万元就结束循环,否则继续执行循环体。
#include<stdio.h>
int main()
{
	int i ;//定义循环变量 ,计算统计人数 
	float sum;//捐款数
	float aver;//用来计算平均值
	float total = 0;//存放累加后的捐款总数,这里要定义初值,否则初始值是随机的 
	for(i = 1;i<=1000;i++){
		printf("please enter sum:");
		scanf("%f",&sum);
		total = total + sum; 
		if(total >= 100000){
			break;
		} 
	}
	aver = total / i;
	printf("捐款人数=%d,平均捐款数=%f",i,aver);
	return 0; 
	 
	
 } 

在这里插入图片描述

5.2continue语句是提前结束本次循环

continue是结束本次循环,在continue下面的语句是不能执行的,并不是终止循环,而是执行下一次的循环

如果是双重循环,内循环有continue语句,是跳转到内循环体之外,执行内循环体下面的语句(即外循环的语句)

要求输出100~200不能被3整除的数。
思路:

  1. 首先是要用循环,因为每一个数都要去除以3.
  2. 如果可以被3整除,则输出。
  3. 如果不能被3整除,则执行下次循环,不输出。

代码1:

#include<stdio.h>
int main()
{
	int i;
	for(i = 100;i<=200;i++){
		if(i%3 ==0 )//对3取余,如果余数为0,表达式为真 
		    continue;//执行continue语句,此时就不执行printf,而是i++ 
		printf("%d ",i);	//对3取余如果不等于0,则执行打印输出 
	}
	printf("\n");
	return 0; 
 } 

也可以不用continue语句
代码2:

#include<stdio.h>
int main()
{
	int i;
	for(i = 100;i<=200;i++){
		if(i%3 !=0 )	//对3取余如果不等于0,则执行打印输出 
		printf("%d ",i);	
	}
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

输出一下4*5的矩阵
1 2 3 4 5
2 4 6 8 1 0
3 6 9 12 15
4 8 12 16 20

思路:

  1. 首选这个得用循环来处理
  2. 定义两个变量,一个输出行i,一个输出列j。
  3. 在格式上,每行输出的是5个数据,输出5个数据就要换行
#include<stdio.h>
int main()
{
	int i;//定义行
	int j;//定义列
	int n = 0;//用来累计输出数据的个数 
	for(i = 1;i <= 4;i++){//当i为第1行的时候,先把第1行的元素打印完后在i++ 
		for(j = 1;j <= 5;j++)//输出每一行的元素 
		{
			if(n%5 == 0){
				printf("\n"); 
			}
			n++; 
			printf("%d\t",i*j);//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 
		}
	} 
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

如果在内循环体中加一句
if(i == 3 && j ==i) break;

#include<stdio.h>
int main()
{
	int i;//定义行
	int j;//定义列
	int n = 0;//用来累计输出数据的个数 
	for(i = 1;i <= 4;i++){
		for(j = 1;j <= 5;j++)//输出每一行的元素 
		{
			if(n%5 == 0){
				printf("\n"); 
			}
			n++; 
			if(i == 3 && j ==1) break;
			//遇到地3行第1列就跳出内循环
			//进入下一次的外循环,即第四次外循环
			printf("%d\t",i*j);
			//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 
		}
	} 
	printf("\n");
	return 0; 
 } 

在这里插入图片描述

那如果改为continue结果会是怎么样的呢?

在这里插入图片描述

Logo

更多推荐