不就是循环嘛,循环与分支知识点详解!!

1 什么是语句

C语言中由一个分号 ; 隔开的就是一条语句。
比如

printf(“hehe”);
1+2;

2 分支语句

分支语句也叫做选择语句,指的是一些能根据不同的输入执行不同的代码的语句

在这里插入图片描述

在框图里大学的选择就相当于是输入,你的选择决定了你毕业面临的挑战。真实警告哈哈

2.1 if语句

if语句语法结构

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

这里我们来举几个栗子来直观感受下:
💡例一

#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
}

在本例中我们首先输入一个age变量代表输入年龄,if就相当于如果,整个语句的意思就是当输入年龄小于18的时候就执行if后面大括号里面的语句块,否则就跳过从而执行后面的语句

💡例二

#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}

同样是输入年龄,这次if语句后面搭配上了else语句,即当输入小于18执行if后面的大括号的内容,否则执行else后面大括号的内容。

💡例三

#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}

这里面的elseif就是在不满足第一个条件下(即输入大于等于18)再次进行判断,这样既可以根据不同的输入进行不同的输出。
敲黑板!!!!上面一个{}就代表一个语句块,if()括号里面要为真(即非0)才会执行对应的语句块,否则就执行后面的语句或者else语句或者进行另一次判断(即else if)

2.2 switch语句

switch也是一种分支语句,它常常用于多分支的情况。

比如:

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
这个时候如果我们想用if … else if …那步骤过于繁琐,这个时候我们就可以用switch语句。

switch语句语法结构

switch(整型表达式)
{
case 整形常量表达式:
语句;
}

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支,因为在switch语句中只有遇到break语句才会跳出switch语句,这样才能实现我们想要的结果,不然程序会一直执行下去。
⭐️举个栗子

#include <stdio.h>
int main()
{
int day = 1;
switch(day)
{
case 1printf("星期一\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;
}
return 0;
}

输出结果:
在这里插入图片描述
若没有break的话输出结果:
在这里插入图片描述

这是因为在执行完case1里面的语句后没有遇到break语句程序继续执行的原因。
敲黑板:switch语句中case和default里面正常情况下一定要加beak!!

2.2.1 default子句

如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结果就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C中并不认为适合错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签
default:
写在任何一个case标签可以出现的位置。当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置。

3 循环语句

3.1 while循环

前面我们知道当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?C语言中给我们引入了:while语句,可以实现循环。
💡//while 语法结构:
while(表达式)
循环语句;

while语句执行的流程:
在这里插入图片描述
⭐️举个栗子:

#include <stdio.h>//打印1-10的数字
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}

在这个栗子中我们先判断i是否小于等于10,满足则执行打印语句然后i自加1再次判断,这样当i为11的时候不满足条件,跳出循环程序结束。

3.1.1 while语句中break和continue的作用

我们用栗子来看下break的作用

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

结果:
在这里插入图片描述

为什么会发生这种事情呢,这就是break在里面发挥了作用了,当i为5的时候程序遇到break语句就会直接跳出循环不在继续循环下去了。
总结:在循环中只要遇到break,就停止后期的所有的循环。

同样我们举个栗子看看continue的作用

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

结果:
在这里插入图片描述

我们可以看到程序死循环了,当i为5的时候continue语句执行,跳过本次循环!!,在下一次循环时i仍为5,所以继续跳过本次循环,这样不断循环往复程序就死循环了(程序走不出循环)
总结:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

3.2 for循环

结构:
for(表达式1;表达式2;表达式3)
循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

⭐️举个栗子:

#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}

在执行for语句时,首先执行i= 1,然后进行判断,若满足条件进入循环体,最后在执行i++语句。

while语句执行的流程:
在这里插入图片描述
下面我们做一个for循环和while循环的比较

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。for循环使用的频率也最高

3.2.1 for语句中break和continue的作用

在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。但是还是有些差异:

⭐️举个栗子:

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

运行结果:
在这里插入图片描述
在这里插入图片描述

💡我们可以发现,当for循环遇到break语句时和while循环一样都是直接跳出循环从而执行后面的语句,但是当遇到continue语句时,for循环不会死循环,这是因为for循环在执行完continue语句后还会执行表达式三,从而进行i的值的调节从而避免死循环,这也是for循环的优势所在

使用for语句建议

  • 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  • 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
    int i = 0;
    //前闭后开的写法
    for(i=0; i<10; i++)
    {}
    //两边都是闭区间
    for(i=0; i<=9; i++)
    {}

3.2.2 for循环的一些变种

#include <stdio.h>
int main()
{
//变种1
for(;;)//没有初始化语句,没有判断语句,没有调整语句,程序死循环
{
printf("hehe\n");
}
//变种2
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)//for循环里面初始化语句和调整语句可以是多个
{
printf("hehe\n");
}
return 0;
}

3.2.3 for循环面试题分析

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}

结果:
在这里插入图片描述

为啥程序直接退出了呢,因为在for循环的条件判断语句中是吧0赋值给k,从而整个表达式的值就为0,所以条件判断恒为假,不会执行for循环体的语句。
注意:=是赋值 ==才是判断是否相等

3.3 do-while语句

语法结构

do
循环语句;
while(表达式);

do-while语句执行的流程:
在这里插入图片描述
⭐️举个栗子

#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}

结果:
在这里插入图片描述

在do-while语句里面不管是否满足条件都先执行do后面的语句块,然后在进行判断,若为真则继续执行do后面的语句块,若为假则跳出循环。

3.3.1 do-while循环中的break和continue

//栗子1
#include <stdio.h>
int main()
{
int i = 5;
do
{
if(5 == i)
break;
printf("%d\n", i);
}while(i<10);
return 0;
}
//栗子2
#include <stdio.h>
int main()
{
	int i = 5;
	do
	{
		if (5 == i)
		{
			printf("%d\n", i);
			continue;
		}
	} while (i < 10);
	return 0;
}

在这里插入图片描述

栗子1遇到break会直接跳出循环,这里和for,while一样就不再展示结果。在栗子2中遇到continue语句时,会跳过后面while判断再次进入do语句块中,从而导致程序死循环。
注意:循环至少执行一次,使用的场景有限,所以不是经常使用,但是在要模拟小游戏时需要先执行某些功能在进行判断时可以用do-while语句来实现

4 小试牛刀

猜数字小游戏的实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**********************************\n");
printf("************* 1.play *************\n");
printf("************* 0.exit *************\n");
printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
int random_num = rand()%100+1;//生成随机数
int input = 0;
while(1)
{
printf("请输入猜的数字>:");
scanf("%d", &input);
if(input > random_num)
{
printf("猜大了\n");
}
else if(input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));//用来设置时间起点
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
}while(input);
return 0;
}

作者水平有限,欢迎各位大佬讨论交流!!如有错误欢迎私信我!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值