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

Posted 爱生活爱编程a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不就是循环嘛,循环与分支知识点详解!!相关的知识,希望对你有一定的参考价值。

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;
}

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

以上是关于不就是循环嘛,循环与分支知识点详解!!的主要内容,如果未能解决你的问题,请参考以下文章

Python开发第4节Python分支结构与循环结构

python第二课--分支结构与循环结构

初识分支与循环

python 基础知识条件和循环

C#中的分支结构与循环

Python基础知识进阶(五---2)----程序基本结构简单分支异常处理三大实例分析基本循环结构通用循环构造方法死循环嵌套循环布尔表达式