【C语言】循环语句

循环语句

使用循环之前我们要注意循环中的三个要素,即循环变量的初始化、判断循环结束的条件、循环变量的调整。

1、while循环

1.1.while的使用

当不知道循环次数的时候可以使用while循环

(1).语法结构:

while(表达式)
{
    语句;
}

(2).执行流程:

当代码执行到while语句首先会判断表达式是否为真,如果为真(即!=0),则会执行循环体中的内容,然后再次判断表达式,直到判断出表达式的值为0时,跳出循环。

 这里需要注意的是: 条件表达式的执行次数总是比循环体的执行次数多一次

(3).例子:

//计算数字1~100之和
#include<stdio.h>
int main()
{
	int i = 1;
	int sum = 0;
	while (i <= 100)//判断条件,大于100跳出循环
	{
		sum += i;//与sum = sum + i同义
		i++;//调整循环变量
	}
	    printf("%d", sum);
	return 0;
}

​

输出: 

sum = 5050

 1.2.死循环

当我们需要对一段代码实现无限循环可以用while(1)

#include<stdio.h>
int main()
{
	while(1)
	{
		printf("咦?真由氏的怀表停了\n");//表达式恒为真,死循环打印输出内容
	}
	return 0;
}

输出:

注:如果下列代码中没有(n++),也会导致死循环。

#include<stdio.h>
int main()
{
	int n = 1;
	while(n<=10)
	{
		printf("咦?真由氏的怀表停了\n");
		n++;//注意对循环变量的调整
	}
	return 0;
}

while循环的的结构不像for循环那样紧凑,所以使用while时要注意对循环变量的调整,不然就会造成死循环。

1.3.练习

给定两个数,求这两个数的最大公约数

例:输入:20 40

输出:20

#include<stdio.h>
int main()//辗转相除法
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d%d", &a, &b);
	while (c = a % b)//c为a对b求余
	{
		a = b;
		b = c;
	}
	printf("最大公约数为:%d\n", b);
	return 0;
}

题解:本题主要用辗转相除法解释。

1.a对b求的余数为c

2.如果c==0,说明b是最大公约数。

3.若c!=0,则把b的值赋给a,c的值赋给b,然后再重复1过程。

下面演示计算过程:

例如:输入 24 18

24 % 18 余6

18 % 6 余0

即6是最大公约数

2.do while循环

2.1.do while的使用

(1).语法结构:

do
{
   语句;
}while(表达式);//不要忘记加英分号;

(2). 执行流程:

do while循环与while循环的不同的是,它会先执行循环体,然后再判断表达式内容是否为真,如果为真,则继续循环。如果为假,则终止循环。所以循环体的内容至少执行一次。

(3).练习:

输⼊⼀个正整数,计算这个整数是几位数

例如: 输⼊:1234 输出:4

#include<stdio.h>
int main()
{
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	do
	{
		count++;
		a = a / 10;
	} while (a);
	printf("输入值是%d位数", count);

	return 0;
}

输出:

 

本题不是一定要使用do while语句,相比之下比while要简洁一些。本题比较契合do while,因为当输入0时,也需要统计1位数。

3.for循环

3.1.for循环的使用

(1).语法结构:

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

 (2).执行流程:

代码执行到for循环时 ,首先执行表达式1对循环变量初始化,接下来执行表达式2,如果表达式值为假,则结束循环;如果表达式值为真(!=0),则会执行循环体的内容,然后再来执行表达式3,对循环变量做出调整,之后就是重复执行表达式2、3的过程了,直到判断表达式2为假,才会结束循环。

根据上述我们不难看出在整个循环中表达式1只会被执行一次,之后就是重复执行表达式2->循环体->表达式3的过程。 

注 :对于表达式1来说,作用就是对循环变量的初始化,初始化操作不仅可以放到for循环语句的()中,还可以在循环之前和循环体中

(3).例子:

//计算1~100之和
#include<stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i++)
	{
		sum += i;
	}
	printf("%d", sum);
	return 0;
}

对比这三种循环语句,for、while比较常见,但do while也不是一无是处,每种循环语句都有其自己的特点,我们在使用时要充分考虑这些循环语句和问题的契合度,再利用其特点到达我们想要实现的效果。 

4.循环中的break

4.1.break的使用

我们在之前的学习中了解过break在switch语句中的作用是跳出语句。break在循环中的作用也是差不多的。break用于终止循环,一旦被执行就会跳出循环,不会执行break后面的内容,然后向下继续执行。不仅如此在循环中break与if基本上是形影不离的,用于满足条件跳出循环。

4.2.while和for循环中的break

(1). while & break

#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)//当i等于5时,终止循环
			break;
		printf("%d ", i);
		i += 1;
	}
	return 0;
}

输出:

 

(2).for & break 

#include<stdio.h>

int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}

输出:

 

对比之下for和while中的break作用是一样的,都用来终止循环

4.3.continue的使用

continue也很容易理解,在循环中执行continue后会跳过它后面的代码,直接跳到循环的判断部分,然后进行下一次循环。不过在for和while中continue的作用有所差异。

(1).while & continue

我们将上述代码换成continue观察变化


#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
		i += 1;
	}
	return 0;
}

输出:

 

打印1,2,3,4后,i的值到达了5,i等于5就执行continue,跳过后面的代码。然后死循环进行判断、跳过的操作。

(2).for & continue

我们把上面while换成for

#include<stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;//这里会直接跳到调整i的部分
		printf("%d ", i);
	}
	return 0;
}

 输出:1,2,3,4,6,7,8,9,10

可见在for循环中continue不会影响循环变量的调整

综合来看for循环形式上优于while,这也造就了for是三种循环中使用最多的语句

5.循环的嵌套

了解循环之后我们发现有些问题不是一层循环就能解决掉的,所以就有了循环的嵌套。

5.1.练习:

(1).求数字100~200之间的素数

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)//循环产生数字100~200
	{
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)//如果整除了说明不是素数
			{
				break;
			}
		}
		if (i == j)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

输出:

 

当代码运行到 if (i == j)判断条件之前时,说明 j 等于i-1,由于满足j<i所以还会自增1,这时就不满足条件j<i,故跳出for循环,这时我们可以认为当i==j时这个数就是素数。

(2).打印9*9乘法表

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 9; i++)//控制行
	{
		int j = 0;
		for (j = 1; j <= i; j++)//控制列
		{
			printf("%d*%d=%d\t", j, i, i * j);//使用%-2d也可对齐
		}
		printf("\n");
	}
	return 0;
}

输出:

 

6.goto语句

goto语句是一种转向语句,可在同一个函数内实现跳转。但是一般不推荐使用goto,它有致命的缺点,当使用不当时,在程序内乱跳会打乱代码的执行逻辑,最终导致程序崩溃。

6.1.goto语句的使用

当我们想结束多层嵌套循环时,显然使用break有些麻烦了,这时候goto就派上用场了


for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:

结语:以上就是本文的眼全部内容,通过本文相必大家对循环有了初步的认识。本文若有不当之处,欢迎指出错误。

 

 

 

       

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值