二、分支与循环


前言

本文主要学习分支语句与循环语句


一、什么是语句?

C语言可分为一下五类?

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句

后续主要介绍控制语句
控制语句主要用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。
C语言共有九种控制语句,可分为一下三类:

  • 条件判断语句 – 分支语句
    • if选择语句
    • switch选择语句
  • 循环执行语句
    • do while循环语句
    • while循环语句
    • for循环语句
  • 转向语句
    • break语句
    • goto语句
    • continue语句
    • return语句

二、分支语句(选择结构)

1)if语句

if语句流程图
在这里插入图片描述
if语句语法结构

#include <stdio.h>

int main()
{
	// 语法结构:
	if(表达式)
	{
		语句1;
		...
	}
	else if(表达式)
	{
		语句2;
		...
	}
	else
	{
		语句3;
		...
	}
	return 0;
}
#include <stdio.h>

int main()
{
    int a = 1;
    int b = 3;
    if(a == 1)
        if(b == 2)
            printf("a=1,b=2");
    else
        printf("a=1,b=3");
    return 0;
}
// 打印a=1,b=3

这里为什么会有打印结果呢??
解:因为这和else的匹配规则有关系,else的匹配规则和最近的if进行匹配,这里是与if(b==2)这条if语句进行匹配的

#include <stdio.h>
// 改进后的代码
int main()
{
    int a = 1;
    int b = 3;
    if(a == 1)
        if(b == 2)
        {
			printf("a=1,b=2");
		}
    else
    {
		printf("a!=1");
	}
    return 0;
}

编程好习惯

建议:在进行分支语句时,无论代码少与多都应写在一个代码块中`
好处是:代码可读性更强,逻辑更清晰

小结:

1、表达式结果为真,则语句执行
2、在C语言中0表示为假,非0表示为真
3、一对 { } 就是一个代码块,一个代码块中可以包含很多条代码
4、else的匹配:else是和它离的最近的if匹配的。

2)switch语句

switch语句也是一种分支语句,常常用于多分支的情况
switch流程图在这里插入图片描述
switch语法结构

#include <stdio.h>

int main()
{
	switch(表达式)
	{ 
	    case 常量表达式1:  语句1;
	    case 常量表达式2:  语句2;
	    …… 
	    case 常量表达式n:  语句n;
	    default:  语句n+1;
	}
	return 0;
}

switch语句规则

  • case标签必须是常量表达式,如18或者’18’等
  • case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值
  • case和default子句的先后顺序可以变动,而不会影响程序执行结果

switch语法解释

  • case语句 – 需要将当前的case的值和switch中表达式进行比较,是否匹配
  • break语句 – 表示结束,中断 switch语句
  • default – case后面都不匹配,执行default

需求:数字1-7,根据用户输入数字输出星期几

#include <stdio.h>

int main()
{
    int day = 0;
    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;
   }
    return 0;
}

巧用break语句
需求:用户输入1-5输出weekday,用户输入6-7输出weekend

#include <stdio.h>

int main()
{
    int day = 0;
    switch(day)
   {
        case 1case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

编程好习惯

在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break;


三、循环语句

1)while循环

while流程图
在这里插入图片描述
while语法结构

#include <stdio.h>

int main()
{
	while(表达式)
	{
		循环语句;
		...
	}
	return 0;
}
1.1)break与continue语句

break语句

#include <stdio.h>

int main()
{
	int i = 1;
 	while(i <= 10)
 	{
 		if(i == 5)
 		{
			break;
		}
		printf("%d ", i);
 		i++;
 	}
	return 0;
}
// 这段代码的输出结果是什么呢?
// 输出:1 2 3 4, 你是否答对了呢?

小结:

在循环中只要遇到break,就停止后面的所有的循环,直接跳出循环
所以:while中的break是用于永久终止循环的

continue语句

#include <stdio.h>

int main()
{
	int i = 1;
 	while(i <= 10)
 	{
 		i++;
 		if(i == 5)
 		{
			continue;
		}
		printf("%d ", i);
 		
 	}
	return 0;
}
// 这段代码的输出结果是什么呢?
// 输出:2 3 4 5 6 7 8 9 10 11  你是否答对了呢?

小结

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行
而是直接跳转到while语句的判断部分,进行下一次循环的入口判断

2)for循环

for循环流程图
在这里插入图片描述
for循环语法结构

#include <stdio.h>

int main()
{
	for(表达式1; 表达式2; 表达式3)
	{
		循环语句;
		...
	}
	return 0;
}
  • 表达式1为初始化部分,用于初始化循环变量的
  • 表达式2为条件判断部分,用于判断循环时候终止
  • 表达式3为调整部分,用于循环条件的调整

小结:

1、不可在for 循环体内修改循环变量,防止 for 循环失去控制
2、for循环中break和continue,他们的意义和在while循环中是一样的

3)do-while循环

do-while循环流程图
在这里插入图片描述
do-while循环语法结构

#include <stdio.h>

int main()
{
	do
	{
		循环语句;
		...
	} while(表达式)
	return 0;
}

小结

1、do-while循环语句的特点:循环至少执行一次,使用的场景有限,所以不是经常使用
2、do-while循环中break和continue,他们的意义和在while循环中是一样的

四、练习

1)九九乘法表

#include <stdio.h>

int main()
{
  int i, j;
  for (i = 1; i <= 9; i++)
  {
    for (j = 1; j <= i; j++)
    {
      printf("%d*%d=%-4d", i, j, i * j);
    }
    printf("\n");
  }
  return 0;
}

2)二分查找

int main()
{
 	int arr[] = {1,2,3,4,5,6,7,8,9,10};
 	int left = 0;
 	int right = sizeof(arr)/sizeof(arr[0])-1;
 	int key = 7;
 	int mid = 0;
 	while(left<=right)
 	{
 		mid = (left+right)/2;
 		if(arr[mid]>key)
 		{
 			right = mid-1;
 		}
 		else if(arr[mid] < key)
 		{
 			left = mid+1;
 		}
 		else
 		{
			break;
		}	
 	}
 	if(left <= right)
 	{
		printf("找到了,下标是%d\n", mid);
	}
 	else
 	{
		printf("找不到\n");
	}
}

总结:

本章到这里就结束啦!感谢各位的阅读。最后送几句话,对你,也对我:

1、读万卷书,行万里路
2、书是灵魂最好的医学专用剂
3、时间是脑力劳动者的资本

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值