分支和循环

分支和循环,第1张

一、分支 1.if—else语句

if和else语句都属于控制语句,均只能控制一条语句,当控制多条语句时,需要将多条语句写成代码块,也就是用{}括起来。

单分支语句

所谓分支语句就是只有一个if,没有else
例如下面的代码:

#include

int main()
{
	int a = 10;
	if (10 == a)//为了容易发现将==写成=的错误,将常量放在左边较好
	{
		printf("hehe\n");
		printf("haha\n");
	}
	return 0;
}

只有一个分支,仅有执行和不执行两种情况,符合条件就执行,不符合就不执行。

多分支语句

由多个if和else组成的多分支语句,又分为两种情况。

只有if的情况

当有多个if时,每个if都会进行判断是否符合条件
例如以下代码:

#include

int main()
{
	int bird = 10;
	char life = 0;
	char disable = 0;
	printf("树上有10只鸟,一只喵跳上去吃了一只还有多少只?\n");
	printf("是否有一只鸟是假的?(Y/N)\n");
	scanf("%c", &life);
	getchar();
	printf("鸟是不是残疾不会飞?(Y/N)\n");
	scanf("%c", &disable);
	if ('N' == disable)//如果是都会飞,则一只都没有了
		bird = 0;
	if ('Y' == life)//如果有只假的,那这只肯定不会飞走,假设喵咪吃的不是假的
		bird = 1;
	printf("还剩%d只鸟\n", bird);
	return 0;
}

两条if语句按顺序都执行。

if和else都有

此时如果if的条件成立,就执行if控制的语句,else包括其控制的语句将不再执行。
例如以下代码:

#include

int mian()
{
	int age = 0;
	printf("请输入年龄:>\n");
	scanf("%d", &age);
	//只会执行符合条件的语句,其他语句不会执行和判断
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 35)
		printf("青年\n");
	else if (age >= 35 && age < 60)
		printf("壮年\n");
	else if (age >= 60 && age < 90)
		printf("老年\n");
	else
		printf("老寿星\n");
	return 0;
}

只会执行符合年龄条件的那条语句,其他语句包括其他判断都不会执行,提高了效率。

注意:悬空else的问题

当代码的格式比较乱时,会出现悬空else的问题,只要记住,else和与它相离最近的if配对(在没有{}的情况时)。
例如以下代码:

#include 
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配对的,这个if—else语句是一条语句,都由第一个if控制,因为a=0,不符合第一个if的条件,所以后面的if—else语句就不会执行,所以也不会打印出内容
规范写法:

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

	}
	return 0;
}

这下看明白了吧,由此可见,规范的代码书写是多么重要。

2.switch语句

格式:

switch(整型变量或者整型变量表达式)
{
case (整型常量或者整型常量表达式1)
			语句1breakcase (整型常量或者整型常量表达式2)
			语句2break;
······
default:
			语句3break

以上代码是为了说明格式的,无法运行。
每个case都是一个入口,当进入switch语句后,会从符合的入口进入,然后顺序往下执行,直到遇到break时才会跳出switch语句。
当所有情况都不符合时会从default处进入。
例如以下程序:

#include

int main()
{
	int day = 0;
	printf("请输入星期几:>");
	scanf("%d", &day);
	switch (day)//括号内必须是变量,或者是变量表达式,如a+b
	{
	case 1:
		printf("星期一\n");
	case 2:
		printf("星期二\n");
	case 3:
		printf("星期三\n");
	case 4:
		printf("星期四\n");
	case 5:
		printf("星期五\n");
	case 6:
		printf("星期六\n");
	case 7:
		printf("星期日\n");
	default:
		printf("输入错误\n");
	}
	return 0;
}

运行结果:

程序从case 1进去后按顺序往下执行,没有遇到break,所以执行到了整个switch语句结束才停止。
加上break后:

#include

int main()
{
	int day = 0;
	printf("请输入星期几:>");
	scanf("%d", &day);
	switch (day)//括号内必须是变量,或者是变量表达式,如a+b
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

运行结果:

有了beak后,程序从入口进入,从break处跳出switch语句。
default处的break是为了后续在switch语句中再增加情况方便而加的,是一个良好的编程习惯。
break的特性,在以下场景中有应用:
代码如下:

int main()
{
	int day = 0;
	printf("请输入星期几:>");
	scanf("%d", &day);
	switch (day)//括号内必须是变量,或者是变量表达式,如a+b
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

运行结果:

当输入星期1-5时,无论从哪个入口进入,都在case 5处结束,6和7是同样的到理。

注意:switch语句中的case和default放置的位置没有要求,可按任意顺序书写。 二、循环及break和continue的作用 1.while循环

流程图:

打印1-100代码如下:

#include

int main()
{
	int i = 1;//初始化
	while (i <= 100)//控制语句
	{
		printf("%d ", i);
		i++;//控制调整
	}
	return 0;
}

运行结果:

break的作用是终止循环

如以下代码:

#include

int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (50 == i)
			break;//当i等于50时,跳出循环
		printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果:

此时只打印1-49,因为当i等于50的时候执行了break语句,之间跳出了while循环,后面的数字便不再打印。

continue的作用是跳过当次循环continue后面的语句

如以下代码:

#include

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)//当i等于5时,会执行continue语句,跳过了后面的语句
			continue;
		printf("%d ", i);
		i++;//因为调整语句在continue之后,i等于5后便永不会执行该语句
	}
	return 0;
}

运行结果:

该结果是1 2 3 4 死循环,因为i等于5后便执行了continue语句,跳过了后面的语句,i得不到调整,就成了i等于5不停的判断是否小于等于10,每次都为真,但每次又执行不到打印语句,所以成了死循环。
如果写成下述这样:

#include

int main()
{
	int i = 0;
	while (i <= 10)
	{
		i++;//调整语句在continue之前,会得到调整
		if (5 == i)//当i等于5时,会执行continue语句,跳过了后面的语句
			continue;
		printf("%d ", i);
	}
	return 0;
}

运行结果:

结果是1-11没有5,当i等于5时执行了continue语句,跳过了后面的语句,所以5不会被打印,但是i又可以得到调整,当调整后i不等于5时,又正常打印并循环。

2.for循环及break和continue的作用

流程图:

由流程图可以看出,for循环的调整语句是独立于整个循环之外的。
求1!+2!+3!+…+n!的代码如下:

  1. 使用双层嵌套循环
#include 

int main()
{
	int i = 0;
	int j = 0;
	int n = 0;
	int ret = 1;//储存每个数的阶乘
	int sum = 0;
	scanf("%d", &n);

	for (i = 1; i <= n; i++)
	{
		ret = 1;//防止累计,每次内循环结束后都需要直1,这样再次循环才是单纯的求阶乘
		for (j = 1; j <= i; j++)
		{
			ret = ret * j;//求阶乘
		}
		sum = sum + ret;//结果相加
	}
	printf("%d\n", sum);
	return 0;
}
  1. 使用一个for循环
#include 
int main()
{
	int i = 0;
	int ret = 1;//储存阶乘
	int sum = 0;
	int n = 0;
	scanf("%d", &n);

	for (i = 1; i <= n; i++)
	{
		ret = ret * i;//不用置1,求下一个数的阶乘时,在上一个数的基础上乘下一个数就可以
		sum = sum + ret;//累加
	}
	printf("%d\n", sum);
	return 0;
}

运行结果:

for循环是使用最多的循环,它相比while循环的优势就是初始化和控制条件以及调整写在了一起,在while循环中,当循环体和初始化等内容太长时,需要修改这些参数,因为它们不能在当前程序页面中一起显示,还需要寻找,有时会出现找错改错等情况。总之一句话来讲,就是for循环更加简洁。

break的作用也是终止当前循环

当循环是嵌套的双循环或者多循环时,break的作用是跳出当前的这一个循环,即break在哪个for循环中就跳出哪个循环。
正常的9*9乘法表:

#include

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%2d ", i, j, i * j);//%2d是指域宽是两位,右对齐的方式
		}
		printf("\n");
	}
	return 0;
}

运行结果:

加上break后的程序及结果:

#include

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			if (5 == j)
				break;//当i是5的时候跳出内循环
			printf("%d*%d=%2d ", i, j, i * j);//%2d是指域宽是两位,右对齐的方式
		}
		printf("\n");
	}
	return 0;
}

运行结果:

可以看出,当打印完4j以后,每一行都只有四项,因为当打印第五项时就会跳出内循环,导致ij(j>=5)以后的内容都没有。

continue的作用也是跳过之后的语句

continue的在for循环中的作用和在while循环中的作用相同,也是跳过continue之后的语句,之间进行调整并判断。
如以下代码:

#include

int main()
{
	int i = 0;

	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
			continue;//当i是5的时候跳过后面的语句,也就是不打印5
		printf("%d ", i);
	}
	return 0;
}

运行结果:

可以看到,本来是打印1-10的,加了continue后,打印的结果是1-10没有5。
如果将contnue换成break会发生什么呢?

#include

int main()
{
	int i = 0;

	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
			break;//当i是5的时候跳过后面的语句,也就是不打印5
		printf("%d ", i);
	}
	return 0;
}

运行结果:

可以看到,当打印5时就之间跳出了循环,整个循环就结束了。

3.do—while循环及break和continue的作用

流程图:

do—while循环的结构

do
{
	语句
}
while;//注意这里必须有分号。

do-while循环的特点是最少都要执行一次。
如以下代码:

#include 
//打印1-10
int main()
{
	int i = 0;

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

运行结果:

将控制条件改成恒为假后:

#include 

int main()
{
	int i = 0;

	do
	{
		i++;
		printf("%d ",i);
	} while (0);//0就是恒为假,不再执行
	return 0;
}

运行结果:

可以看到结果是1,说明了do—while循环一上来就干,至少会执行一次。

do—while循环的主要应用场景

当写一个游戏菜单时,代码如下:

#include

void menu()
{
	printf("*****************************\n");
	printf("******    小游戏     ********\n");
	printf("*******    1.paly    ********\n");
	printf("*******     0.exit   ********\n");
	printf("*****************************\n");

}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);//用户输入
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);//intput的结果充当了控制条件
	return 0;
}

运行结果:

在这里使用do—while循环就完美的解决了可以多次循环玩游戏这样问题。

beak的作用也是跳出当前循环

如以下代码:

#include 

int main()
{
	int i = 0;

	do
	{
		i++;
		if (5 == i)
			break;
		printf("%d ",i);
	} while (i<=10);
	return 0;
}

运行结果:

可以看到,当打印5的时候,便跳出了循环。

continue的作用也是跳过后面的语句

如以下代码:

#include 

int main()
{
	int i = 0;

	do
	{
		i++;
		if (5 == i)
			continue;
		printf("%d ",i);
	} while (i<=10);
	return 0;
}

运行结果:

可以看到,当打印5时就跳过了,所以打印结果中没有5。

注意一个错误问题

将判断条件里的==写成=会发生什么?
代码如下:

#include

int main()
{
	int i = 0;

	do
	{
		scanf("%d", &i);
		if (i == 10)
		{
			printf("hehe\n");
			break;
		}
	} while (i);
	return 0;
}

运行结果:

可以看到,只有输入的是10的时候才会打印出hehe。
将==写成=后:

#include

int main()
{
	int i = 0;

	do
	{
		scanf("%d", &i);
		if (i = 10)
		{
			printf("hehe\n");
			break;
		}
	} while (i);
	return 0;
}

运行结果:

可以看到,无论输入一个什么都会打印hehe,此时的if判断条件失效了。原因是,将==写成=后便成立赋值语句,不是判断语句了,C语言中,把凡是不等于0的数都看作是真(true),所以此时就将一个真赋值给了i,条件永远成立。

结语

break和continue语句的作用在三种循环中的作用是一样的,for循环特殊的一点就是调整语句在循环体外,continue是跳不过调整语句的。写判断条件是注意不要将==写成=号,为了避免这种错误,可以将常量写在判断式的左边。
文章如果对您有帮助,麻烦帮本喵点个赞哦~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/787568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存