C语言——分支与循环(2)

        循环语句中有三种:for循环,while循环,do-while循环。while语句的语法结构和if语句的非常相似。

1.1 if和while的对比

if (表达式)
    语句;
while(表达式)
    语句;

        下来我们写两个代码,观察以下这两个相似的语句。

 

        可以看到,if语句是正常打印出来的,whlie语句进入了死循环。这是因为,if语句只进行判断,1是非0就打印了,而while语句是循环的,1是非0可以一直进入语句,打印出来的也就是死循环了。

        注:while语句也是只能写一条语句,如果要多写,要加上大括号。

1.1while 循环的执行流程

        ⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。

1.3 while循环的实践

练习:在屏幕上打印1-10的值

int main()
{
	int i = 0;
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}

        为了让整个循环发生变化,需要i++,比如 i=1;1<=10是成立,进入语句,打印 i=1,再执行下一句 i++,i变成2,再进行判断,i=2 ,是小于等于10的,再继续,知道i=10,循环结束,屏幕上打印出了1-10.

练习:输入一个正的整数,逆序打印这个整数的每一位。

例如:

输入:1234;打印出 :4 3 2 1

int main()
{
	int i = 0;
	scanf("%d", &i);
	while (i)
	{
		printf("%d ", i%10);
		i = i / 10;
	}
	return 0;
}

  2.for循环

2.1 语法形式

for 循环是三种循环中使用最多的,形式如下:

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

表达式1 用于循环变量的初始化

表达式2 用于循环结束的判断

表达式3 用于循环变量的调整

这同while语句是非常相似的,while语句中

        ⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式 3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继 续。 整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。

2.3 for循环的实践

练习:在屏幕上打印1~10的值

int main()
{
	int i = 0;
	for (i = 1//初始化; i <= 10//判断; i++//调整)
	{
		printf("%d ", i);//打印
	}
	return 0;
}

        for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形 式上 for 循环要更优⼀些。

练习:计算1-100之间3的倍数的数字之和。

        首先,我们来分析,第一个条件是1~100的数字,可以使用 for循环或者 while循环,第二个条件是3的倍数,可以使用 i %3==0来实现,第三个条件是求和,把3的倍数找出来之后再加起来就可以了。

int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 3 == 0)
		{
			sum = sum + i;
		}
	}
	printf("%d\n",sum);
	return 0;
}

可以再优化一下,再调整阶段产生的就是散倍数,将初始化的变为3,每次加3.

//}
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 3; i <= 100; i+=3)
	{
		if (i % 3 == 0)
		{
			sum = sum + i;
		}
	}
	printf("%d\n", sum);
	return 0;
}

3.do-while 循环

3.1 语法形式

在循环语句中 do-while语句使用的最少,它的语法如下:

do
 语句;
while(表达式);

        while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;

         ⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表 达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。

        do while 循环的特点就是至少被执行一次。

3.2 do while 循环的执行流程

        在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的 结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。 所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅

3.3 do while循环的实例

在屏幕上打印1~10的值

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

练习:输入一个正整数,计算这个整数是几位数?

一个数字至少要是一位,所以在加位数时,先加。

int main()
{
	int i = 0;
	int sum = 0;
	scanf("%d", &i);
	do 
	{
		sum++;
		i = i / 10;
	} while (i);
		printf("%d", sum);
		return 0;
}

        这⾥并⾮必须使⽤ do while 语句,但是这个代码就⽐较适合使⽤ do while 循环,因为n即使是 0,也是1位数,要统计位数的。

4. break和 continue 语句

        在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 break 和 continue 两个关键字,就是应⽤到循环中的。

• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。

• continue 的作⽤是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有 所差异的。

4.1 while循环中的 break和 continue

        我们可以看看我们上面写的代码,来观察break 和 continue。

        我们可以清楚的观察到,使用break语句后,4以后的数字就没有再打印了。当i等于5后,就执⾏break,循环就终⽌了。

        打印了1,2,3,4后,当i等于5的时候,循环在 break 的地⽅终⽌,不再打印,不再循环。 所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。 那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。

那么当我们把break 换成continue 结果会发生什么变化呢?

结果是死循环了,因为continue可以帮助我们跳过这次循环continue后面的代码,但是在该代码中,while循环的调整 i++在continue的后边,随着continue执行,代码不执行i++语句,所以 i一直在这个循环中跳出,就成了死循环。

        到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接 到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。

让我们把调整部分放在前面,把代码进行优化,看看最后打印出的结果是什么。

        因为进入while循环后,直接i++所以,先打印出的就是2。就可以观察,代码结果跳过了5。

4.2 for 循环中的break 和 continue 

        其实和 while 循环中的 break ⼀样, for 循环中的 break 也是⽤于终⽌循环的,不管循环还需 要循环多少次,只要执⾏到了 break ,循环就彻底终⽌。

我们还是使用上面写过的代码:

       break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以 使⽤ break 来完成。

接下来,看看变为continue是什么样的结果。

        所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。

        大家可以自己去总结一下在for循环中使用 break 和 continue 的区别

4.3 do while循环中的break和continue

        do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,⼤家下来可以 ⾃⾏测试并体会。

可以观察出 break在do while循环中没有什么特别的,只打印了1 2 3 4.

可以看到continue循环的结果是死循环,调整在continue后,就死循环了。

5.练习

找出100~200之间的素数,并打印在屏幕上。

注:素数⼜称质数,只能被1和本⾝整除的数字。

分析:

1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。

 2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤ 循环解决。

3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int flag = 1;//假设i是素数。
		//每次循环产生一个i
		//判断i是否是素数
		//使用循环产生2~i-1之间的数字
		int j = 0;
		for (j = 2; j <= i - 1; j++)
		{
			if (j % i == 0)//如果等于说明i不是素数,所以要让flag等于0,因为我们前面假设的是flag是素数的情况。
			{
				int flag = 0;//改成了假
				break;//判断玩不是素数,直接跳出循环,因为后面的没有必要再判断了,跳出循环。
			}
		}
		if (flag == 1)//这个就是上面没有一个i可以把j整除了,也不会进入循环把flag改为0,所以flag还是真,就是素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

可以看看,我在代码中写的写的注释,可以帮助大家理解。

大家可以思考一下,偶数可不可能是素数?

答案是不可能,因为一定会被2整除,所以我们可以进行优化:

for (i = 101; i <= 200; i+=2)

将i初始化为101,每次加2,这样代码的效率会提高很多。

6. goto语句

        C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。

例子:

#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}

        goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值