C语言分支与循环


前言

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实
现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种
结构的组合。
我们可以使用 if switch 实现分支结构,使⽤ forwhiledo while 实现循环结构。

分支与循环的语句可以分为以下三类:

  • 条件判断语句(也叫分支语句):if语句、switch语句;
  • 循环执行语句:do while语句、while语句、for语句;
  • 转向语句:break语句、goto语句、continue语句、return语句。

一、分支结构

(一)、if语句

1. if语句和else语句

if语句的语法形式如下:

if ( 表达式 )
 语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。

	语法结构:
	if(表达式)
		语句;
		
	if(表达式)
		语句1;
	else
		语句2;
		
	//多分支
	if(表达式1)
		语句1;
	else if(表达式2)
		语句2;
	else
		语句3;

例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。

#include <stdio.h>

int main()
{
	 int num = 0;
	 scanf("%d", &num);
	 if(num % 2 == 1)
	 printf("%d 是奇数\n", num);
	 else
	 printf("%d 是偶数\n", num);
	 return 0;
}

默认在 ifelse 语句中默认都只控制⼀条语句。
例如:输入一个年龄,对年龄进行判断。
如果小于18岁,输出 未成年人,不能谈恋爱。
如果大于18岁,则输出 成年了,可以谈恋爱了。

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);

	if (age <= 18)
		printf("未成年人,不能谈恋爱。\n");
	else
		printf("成年了\n");
		printf("可以谈恋爱了。\n");
	
	return 0;
}

输入10
运行结果:
未成年人,不能谈恋爱。
可以谈恋爱了。

在这里插入图片描述
上面的代码,你会发现输入的值不管是>=18还是<18,"可以谈恋爱了"都会打印在屏幕上。
那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 {} 将代码括起来,
else后也可以跟上⼤括号。如下:

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);

	if (age <= 18)
	{
		printf("未成年人,不能谈恋爱。\n");
	}
	else
	{
		printf("成年了\n");
		printf("可以谈恋爱了。\n");
	}
	return 0;
}

输入10
运行结果:
未成年人,不能谈恋爱。

在这里插入图片描述

2. if和else的嵌套使用

例如:要求输入⼀个整数,判断输入的整数是0,还是正数或者负数。

#include <stdio.h>

int main()
{
	 int num = 0;
	 scanf("%d", &num);
	 if(num == 0)
	 printf("输⼊的数字是0\n");
	 else
	 {
	 if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构 
	 printf("输⼊的数字是正数\n");
	 else
	 printf("输⼊的数字是负数\n");
	 }
	 return 0;
}

改进一下就是:

#include <stdio.h>

int main()
{
	 int num = 0;
	 scanf("%d", &num);
	 if(num == 0)
	 printf("输⼊的数字是0\n");
	 else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构 
	 printf("输⼊的数字是正数\n");
 	 else
	 printf("输⼊的数字是负数\n");
	 
	 return 0;
}

这就是if和else的嵌套使用

3. 悬空else问题

如果有多个 ifelse ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
例如:

#include <stdio.h>

int main()
{
	 int a = 0;
	 int b = 2;
	 if(a == 1)
	 if(b == 2)
	 printf("hehe\n");
	 else
	 printf("haha\n");
	 
	 return 0;
}

运行结果:
在这里插入图片描述
我们会惊奇的发现,怎么什么都没有输出。
我们细细分析,将代码改写一下,就会有惊奇的发现:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}

	return 0;
}

注意⚠️点
else 总是跟最接近的 if 匹配。

(二)、switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分⽀结构。
switch 语句是⼀种特殊形式的if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
⚠️注:
switch 后的 n 必须是整型表达式
case 后的值,必须是整形常量表达式
如:输入任意⼀个整数值,计算除3之后的余数

#include <stdio.h>

int main()
{
	 int n = 0;
	 scanf("%d", &n);
	 switch(n%3)
	 {
		 case 0:
		 printf("整除,余数为0\n"); 
		 break;
		 case 1:
		 printf("余数是1\n"); 
		 break;
		 case 2:
		 printf("余数是2\n"); 
		 break;
	 }
	 return 0;
}

break是用来终止语句的,假如没有break语句,上面的代码将会变成这样:

#include <stdio.h>

int main()
{
	 int n = 0;
	 scanf("%d", &n);
	 switch(n%3)
	 {
		 case 0:
		 printf("整除,余数为0\n");
		 case 1:
		 printf("余数是1\n"); 
		 case 2:
		 printf("余数是2\n"); 
	 }
	 return 0;
}

在这里插入图片描述
没有break语句,代码将会一直执行下去,直到把所有代码都执行完。
当然了我们也可以利用没有break这一特性来解决题目:
如:输入⼀个1 ~ 7的数字,数字是1 ~ 5,输出的是“工作日”; 输⼊6~7,输出“休息日”。

#include <stdio.h>

int main()
{
	 int day = 0;
	 scanf("%d", &day);
	 
	 switch(day)
	 {
		 case 1case 2:
		 case 3:
		 case 4:
		 case 5:
		 printf("⼯作⽇\n");
		 break;
		 case 6:
		 case 7:
		 printf("休息⽇\n");
		 break;
	 }
 return 0;
}

switch语句中的default

在使用 switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。
如:输入⼀个1 ~ 7的数字,数字是1 ~ 5,输出的是“工作日”; 输⼊6~7,输出“休息日”。
输入1 ~ 7之外的数字,我们就输出“输入错误”;

#include <stdio.h>

int main()
{
	 int day = 0;
	 scanf("%d", &day);
	 
	 switch(day)
	 {
		 case 1case 2:
		 case 3:
		 case 4:
		 case 5:
		 printf("⼯作⽇\n");
		 break;
		 case 6:
		 case 7:
		 printf("休息⽇\n");
		 break;
		 default:
 		 printf("输⼊错误\n");
 		 break;
	 }
 return 0;
}

二、循环结构

(一)、while循环

1. 语法形式

while 语句的语法结构和 if 语句非常相似。

while(表达式)
       语句;//如果循环体想包含更多的语句,可以加上⼤括号

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

2. while循环的执行流程

在这里插入图片描述

3. while循环的实践

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

#include <stdio.h>

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

在这里插入图片描述

(二)、for循环

1. 语法形式

for(表达式1; 表达式2; 表达式3)
 语句;//如果循环体想包含更多的语句,可以加上⼤括号 

表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

2. for循环的执行流程

在这里插入图片描述

3. for循环的实践

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

#include <stdio.h>

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

在这里插入图片描述

while循环和for循环的对比
在这里插入图片描述
在这里插入图片描述
forwhile 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优⼀些。

(三)、do while循环

1. 语法形式

do
 语句;
while(表达式)

whilefor 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下⼀次,表达式为假,则不再继续循环。

2. do while循环的执行流程

在这里插入图片描述

3. do while循环的实践

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

#include <stdio.h>

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

在这里插入图片描述

(四)、break和continue语句

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 breakcontinue 两个关键字,就是应用到循环中的。

  • break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
  • continue 的作用是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

break举例:

#include <stdio.h>

int main()
{
   int i = 1;
   while (i <= 10)
   {
   	if (i == 5)
   		break;//当i等于5后,就执⾏break,循环就终止了 
   	printf("%d ", i);
   	i = i + 1;
   }
   return 0;
}

在这里插入图片描述
打印了1,2,3,4后,当i等于5的时候,循环在 break 的地方终止,不再打印,不再循环。

continue举例:

#include <stdio.h>

int main()
{
   int i = 1;
   while (i <= 10)
   {
   	if (i == 5)
   		continue;//当i等于5后,就执⾏continue,就跳过了后面语句的执行,开始执行下一个语句
   	printf("%d ", i);
   	i = i + 1;
   }
   return 0;
}

在这里插入图片描述
打印了1,2,3,4后,当i等于5的时候,循环在执行完 continue 后不在执行后面的语句,不在执行i = i + 1语句,程序陷入死循环。

for语句中的continue举例:

#include <stdio.h>

int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分 
		printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述
for循环中,continue只是跳过了后边的打印,程序依然会来到了i++的调整部分 ,所以程序不会陷入死循环。

(五)、循环的嵌套

例如:找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。

int main()
{
	int i = 0;
	//循环产⽣100~200的数字 
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数 
		//循环产⽣2~i-1之间的数字 
		int j = 0;
		int flag = 1;//假设i是素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag)
		{
			printf("%d ",i);
		}
	}
	return 0;
}

在这里插入图片描述

(六)、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 就非常的方便了。
例如:

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

本来 for 循环想提前退出得使用 break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使用3break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。


完结撒花🎉!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值