【落羽的落羽 C语言篇】C语言的结构——分支和循环

文章目录

  • 一、概览
  • 二、分支结构
    • 1. if语句
      • 1.1 if
      • 1.2 else与else if
      • 1.3 嵌套if
    • 2. switch语句
  • 三、循环结构
    • 1. while循环
    • 2. for循环
    • 3. do while循环
  • 四、break,continue和goto语句
    • 1. break语句
    • 2. continue语句
      • 2.1 while循环中的continue
      • 2.2 for循环中的continue
    • 3. 循环的嵌套
    • 4. goto语句

一、概览

C语言是一种结构化的程序设计语言,包括三种结构:顺序结构、分支结构、循环结构。

其中,顺序结构是最简单的一种,即按照代码语句的上下顺序依次执行。今天着重介绍另外两种。

二、分支结构

分支结构,也可以叫做选择结构,分为if语句和switch语句两种

1. if语句

1.1 if

if语句的语法形式为`

if(表达式)
  {
  语句
  语句
  ......
  }
  //tip:如果不加{},只会执行if下的第一条语句。所以有多条语句的话,一定记得加上{}哦。下同
  

若表达式为真(非0),则执行下列语句
为假(0),则不执行

1.2 else与else if

if(表达式)
  {
  语句
  语句
  ......
  }
else
  {
  语句
  语句
  ......
  }
  //tip:如果有多个if和else,else总是和最近的if匹配

当if后的表达式为假不执行语句时,便跳过if,来到else执行它这里的语句
很好理解吧( •̀ .̫ •́ )✧
而如果你有更多情况需要分类,就可以加上else if

if(表达式1{
语句
......
}
else if(表达式2{
语句
......
}
else if(表达式3{
语句
......
}
else
{
语句
......
}

运行时,会自上而下依次检测。
表达式1为真,执行其下面的语句。为假,则检测表达式2;
表达式2为真,执行其下面的语句。为假,则检测表达式3;
表达式3为真,执行其下面的语句。为假,则执行else下的语句;

知道为什么叫“选择”结构了吧(乐)

举个栗子

#include<stdio.h>
int main()
{
int a;
printf("中野家的五姐妹你喜欢谁?\n");
scanf("%d",&a);
if(a==1)
   printf("中野一花\n")else if(a==2)
   printf("中野二乃\n")else if(a==3)
   printf("中野三玖\n")else if(a==4)
   printf("中野四叶\n")else if(a==5)
   printf("中野五月\n")else  //如果用户输入的不是1-5的情况
   printf("查无此人()\n");

return 0}


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

1.3 嵌套if

有了上面的知识,我们还可以进一步尝试嵌套if,构成多重判断

举个栗子:输入一个整数,判断是整数,负数,还是0。再判断是奇数还是偶数

#include<stdio.h>
int main()
{
	int a=0;
again:
    printf("请输入一个整数:");
	scanf("%d", &a);
	
	if (a > 0)                            //判断a是不是正数 
	{
	    if (a % 2 == 0)                   //判断a是不是偶数
			printf("%d是正数而且是偶数\n\n", a);
		else                              //不是偶数那肯定是奇数了
			printf("%d是正数而且是奇数\n\n", a);
	}
	else if (a < 0)
	{
		if (a % 2 == 0)
			printf("%d是负数而且是偶数\n\n", a);
		else
			printf("%d是负数而且是奇数\n\n", a);
	}
	else  //a既不是正数也不是负数,那就是0了
		printf("%d是偶数\n\n", a);
	
goto again;
	
	return 0;
}

这里的goto语句后面会讲到,先不用理解,我只是为了方便将几种情况放到一起展示
结果:
在这里插入图片描述灰常简单

不过,如果要嵌套更多的if语句,就需要梳理好逻辑关系,不然就可能会把结果弄错

2. switch语句

switch语句是if…else语句的一种特殊形式,对于有多种判断条件的情况,它可以把else if改成更简洁的形式
执行方式是:根据表达式不同的值,执行相应的case的分支。如果没有相应的case,就执行default分支

switch(表达式)  
{
   case 结果1:
       语句1
       break;
   case 结果2:
       语句2
       break;
   ......
   default:   
       语句3
   //tip:其实case和default没有严格的顺序要求,满足需求即可,不过一般习惯把default放在最后 
}

注意:
1. switch后的表达式必须是整型表达式
2. case后的值,必须是整型常量表达式

3. break的作用是执行完一个case下的语句后可以跳出switch。没有break的话,比如算出结果1,执行完语句1,会继续向下执行语句2,直到语句3结束,这可能就不是我们要的结果了。

再来个栗子: 输入1-7的一个数字,判断对应的星期几是工作日还是休息日

如果你没有加break:

#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch(day)
{
  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;
}

结果就不对

在这里插入图片描述
所以一定要记得break啊!!

#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch(day)
{
  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;  //其实这个break加不加无所谓,因为它在最后面
}
return 0;
}

这样结果就没问题了

在这里插入图片描述在这里插入图片描述

当然,刚才说到,没有break的话它会自上而下运行,所以其实可以把代码简化成这样:

#include <stdio.h>
int main()
{
int day;
scanf("%d",&day);
switch(day)
{
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
  printf("工作日\n");
  break;
  case 6:
  case 7:
  printf("休息日\n");
  break;
  default
  printf("错误\n");
}
return 0;
}

结果也是没问题的,就不再演示了o( ̄▽ ̄)d

三、循环结构

循环语句有三种:while,for,do while

1. while循环

while的语法形式为:

while(表达式)
{
语句
.......
}

若表达式为真,则执行下列语句,执行完再判断表达式真假,为真再执行…如此循环。
若表达式为假,则结束while语句。

举个栗子:打印1~666的所有整数

#include <stdio.h>
int main()
{
int i=1;

while(i<=666)
{
printf("%d ",i);
i++;
}

return 0;
}

在这里插入图片描述
很顺利

2. for循环

for循环是用的最多的,语法形式如下:

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

表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整

流程:首先执行表达式1,初始化变量。接下来判断表达式2的真假,为真则执行下列语句,为假则结束循环。语句执行完后,再执行表达式3,调整变量,再去判断表达式2的真假…如此循环。能看出来,表达式1只被执行了一次,剩下的全是“表达式2——语句——表达式3”的循环。

还是这个栗子:打印1~666的所有整数

#include <stdio.h>
int main()
{
int i=0;

for( i=1 ; i<=666 ; i++ )
{
printf("%d ",i);
}

return 0;
}

来看看结果:
在这里插入图片描述下次还填非常简单( ゜▽ ゜)つロ

3. do while循环

do while循环的语法形式:

do
{
语句
......
}
while(表达式)

它的运行流程有些不一样:
前面的while和if语句,都是先判断表达式的真假,再执行语句。
而do while循环中,首先执行语句,再去判断表达式的真假,为真则继续执行语句,为假则结束循环。
所以在do while语句中,循环体是至少执行一次的,某些场景下可能会用到这个特性。

再来:打印1~666的所有整数

#include <stdio.h>
int main()
{
int i=1;

do
{
printf("%d ",i);
i++;
}
while(i<=666);

return 0;
}

在这里插入图片描述没毛病

四、break,continue和goto语句

1. break语句

在循环执行的过程中,如果遇到某些情况需要终止循环,就可以用到break语句。
只要break被执行,就会直接跳出其所处的循环,继续往后执行。

我们以for循环举例,看懂后另外两种循环就是照猫画虎
在之前的栗子中,我们做一些修改

#include <stdio.h>
int main()
{
int i=0;

for( i=1 ; i<=666 ; i++ )
{
if(i==67)   //新加
break;       //新加
printf("%d ",i);
}

return 0;
}

显然,这样的话结果只会打印到66
在这里插入图片描述

2. continue语句

continue可以跳过本次循环中它后面的代码,而直接进行下一次循环的判断
但在while语句和for语句中,效果有所不同~
(do while语句和while语句中continue效果类似)

2.1 while循环中的continue

我们还是改一下上面的栗子

#include <stdio.h>
int main()
{
int i=1;

while(i<=666)
{
printf("%d ",i);
continue;
i++;
}

return 0;
}

在这里插入图片描述结果是死循环打印1
这是因为每次循环中 i++ 都被跳过了,i 一直是1,i <= 666恒成立,就导致了死循环

2.2 for循环中的continue

#include <stdio.h>
int main()
{
int i=0;

for( i=1 ; i<=666 ; i++ )
{
if(i==10)
continue;
printf("%d ",i);
}

return 0;
}

在这里插入图片描述
10被跳过了,但后面的数正常打印
这是因为continue跳过了后面的 printf,来到 i++,i 变成了11,不满足 if 的条件,continue不再执行了

ok很好理解ヾ(◍°∇°◍)ノ゙

3. 循环的嵌套

有了上面的知识,我们就可以来试试用嵌套循环语句来实现复杂的要求了

栗子:打印1~200之间所有的素数

解析:
1.找出1~200间所有的数
2.对于每一个数 i ,如果在2~ i-1间存在一个整数 j 能整除 i ,那么 i 就不是素数

展示:

#include <stdio.h>
int main()
{
int i = 0;
for(i=1 ; i<=200; i++)//循环产⽣1~200的数字
{
    int j = 0;
    int flag = 1;//假设i是素数
    for(j=2; j<=i-1 ; j++)//循环产⽣2~i-1之间的数字
    {
        if(i % j == 0)
            {
            flag = 0;//i不是素数
            break;
            }
    }
if(flag == 1)
printf("%d ", i);
}
return 0;
}

在这里插入图片描述

4. goto语句

最后我们来介绍下之前提过的goto语句
goto语句可以实现在同一个函数内跳转到设置好的标号处,就像山里灵活的狗一样。
再来个栗子:

#include<stdio.h>
int main()
{
落羽:
printf("乐")goto 落羽;
printf("喜")return 0;
}

在这里插入图片描述这样,每次运行到“goto 落羽”,都会回到最上面“落羽:”,如此死循环打印“乐”,而不会打印“喜”

但如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用。
但是 goto 语句也不是一无是处,在多层循环的代码中,写一次break只能跳出一层循环。如果想快速跳出,使用goto就非常的方便了。

for(...)
{
  for(...)
  {
    for(...)
    {
     if(...)
     goto name;
    }
  }
}
name:
//name是可以任起的,只是一个对应关系

本篇完~~谢谢阅读
请大家看可爱流萤
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值