• 分支和循环语句


    一、什么是语句!

    在C语言中,由分号隔开的就是一个语句

    	;  //这是一条空语句
    	int a = 10;//这是一条语句
    	char arr[10] = {0};//这是一条语句
    	return 0;//这是一条语句
    
    • 1
    • 2
    • 3
    • 4

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

    如果你好好学习,校招时拿一个好offer,走上人生巅峰。
    如果你不学习,毕业等于失业,回家卖红薯。
    这就是选择!
    在这里插入图片描述

    2.1、选择语句(if else)

    if语句的语法结构是怎么样的??

    在这里插入图片描述
    当满足条件的时候就执行,不满足就不执行
    else与最近的if匹配

    if代码练习

    1、判断是否成年

    int main()
    {
    	int age = 0;
    	printf("请输入年龄:");
    	scanf("%d",&age);
    	if (age >= 18)
    		printf("成年");
    	printf("未成年");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    int main()
    {
    	int age = 0;
    	printf("请输入年龄:");
    	scanf("%d", &age);
    	if (age >= 18)
    		printf("成年\n");
    	else
    		printf("未成年\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    代码风格

    这里是引用
    在这里插入图片描述

    if(条件表达式)判断的是为真为假,0为假,非0为真

    这里是引用

    2.2、课堂练习

    2.2.1、判断一个数是否为奇数

    int main()
    {
    	//判断一个数是否为奇数
    	int a = 0;
    	printf("请输入一个整数:");
    	scanf("%d",&a);
    	if (a % 2 == 1)
    	{
    		printf("是奇数\n");
    
    	}
    	else
    	{
    		printf("不是奇数\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里是引用

    2.2.2、输出1-100里面的奇数

    写法1:

    int main()
    {
    	//输出1-100里面的奇数
    	int a = 1;
    	while (a <= 100)//首先要产生1-100这些数
    	{
    		if (a % 2 == 1)
    		{
    			printf("%d  ", a);
    			a++;
    		}
    		a++;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这里是引用

    写法2:

    int main()
    {
    	//输出1-100里面的奇数
    	int a = 1;
    	while (a <= 100)//首先要产生1-100这些数
    	{
    		printf("%d  ", a);
    		a = a + 2;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里是引用
    要达到某一种效果,实现的代码方式又不同的方法

    2.3、switch语句(多分支结构)

    switch语句也是一种分支语句。
    常常用于多分支的情况。
    比如:
    输入1,输出星期一
    输入2,输出星期二
    输入3,输出星期三
    输入4,输出星期四
    输入5,输出星期五
    输入6,输出星期六
    输入7,输出星期日

    这里是引用
    那就换一种方式写,满足哪个条件就执行哪个case语句

    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");
    	case 7:
    		printf("星期日\n");
    		break;
    	default:
    		break;
    	}
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2.3.1、语法格式

    在这里插入图片描述

    2.3.2、switch中的break

    在这里插入图片描述

    2.3.3、default子句

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

    2.3.4、课堂练习

    int main()
    {
    	int n = 1;
    	int m = 2;
    	switch (n)//1
    	{
    	case 1:
    		m++;  //m = 3
    	case 2:
    		n++;  //n = 2
    	case 3:
    		switch (n)  // 2
    		{//switch允许嵌套使用
    		case 1:
    			n++;
    		case 2:
    			m++;  //4
    			n++;  //3
    			break;
    		}
    	case 4:
    		m++;  //5
    		break;
    	default:
    		break;
    	}
    	printf("m = %d, n = %d\n", m, n);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    这个程序执行的结果????

    三、循环语句

    3.1、while循环

    但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
    那我们怎么做呢?
    C语言中给我们引入了:while语句,可以实现循环

    3.1.1、语法格式

    这里是引用
    比如我们实现: 在屏幕上打印1-10的数字
    在这里插入图片描述

    3.1.2、while语句中的break和continue

    break介绍
    在这里插入图片描述
    break在while循环中的作用:
    其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
    所以:while中的break是用于永久终止循环的

    continue介绍
    在这里插入图片描述
    continue在while循环中的作用就是:
    continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接
    跳转到while语句的判断部分。进行下一次循环的入口判断

    3.2、for循环

    3.2.1、语法格式

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

    实际的问题: 使用for循环 在屏幕上打印1-10的数字
    在这里插入图片描述
    在这里插入图片描述

    比较while和for循环

    这里是引用

    3.2.2、break和continue在for循环中

    break
    在这里插入图片描述

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

    3.2.3、for循环的变形

    1、死循环
    在这里插入图片描述
    2、
    在这里插入图片描述

    3.2.4、一道笔试题

    这里是引用

    3.3、do…while()循环

    3.3.1、语法结构

    这里是引用
    do语句的特点
    循环至少执行一次,使用的场景有限,所以不是经常使用
    在这里插入图片描述

    3.3.2、do while循环中的break和continue

    break
    在这里插入图片描述

    continue
    在这里插入图片描述

    3.4、练习

    3.4.1、 计算 n的阶乘

    //计算 n的阶乘
    int main()
    {
    	int n = 0;
    	int i = 1;
    	int sum = 1;
    	scanf("%d", &n);
    	for (i = 1; i <= n; i++)
    	{
    		sum = sum * i;
    	}
    	printf("sum = %d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    3.4.2、 计算 1!+2!+3!+……+10!

    //计算 1!+2!+3!+……+10!
    int main()
    {
    	int i = 1;
    	int sum = 1;
    	int ret = 0;
    	for (i = 1; i <= 10; i++)
    	{
    		sum = sum * i;
    		ret = ret + sum;
    	}
    	printf("ret = %d", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里是引用

    3.4.3、 在一个有序数组中查找具体的某个数字n

    int main()
    {
    	int a = 0;
    	int i = 0;
    	int flag = 0;
    	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };//定义一个有序数组
    	printf("请输入你要查找的数:");
    	scanf("%d",&a);
    	for (i = 0; i < 10; i++)
    	{
    		if (a == arr[i])
    		{
    			flag = 1;
    			break;
    		}
    		else
    		{
    			flag = 0;
    		}
    	}
    	if (1 == flag)
    	{
    		printf("这个数在数组里面,下标为:%d\n", i);
    	}
    	else
    	{
    		printf("这个数不在在数组里面\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    这里是引用

    3.4.4、二分查找

    //二分查找
    int main()
    {
    	int k = 18;//查找的元素
    	int flag = 0;
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int left = 0;
    	int right = sz - 1;
    	int mid = 0;
    	while (left <= right)
    	{
    		mid = (left + right) / 2;
    
    		if (arr[mid] < k)//说明此时要查找的数在右边
    		{
    			left = mid + 1;
    		}
    		else  if (arr[mid] > k)//说明此时要查找的数在左边
    		{
    			right = mid - 1;
    		}
    		else //中间元素==要查找的数arr[mid] == k
    		{
    			flag = 1;
    			break;
    		}
    	}
    	if (flag == 1)
    	{
    		printf("找到了,下标为: %d\n", mid);
    	}
    	else
    	{
    		printf("没找到\n");
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    二分查找只适用于有序的数组进行查找,无序的要先进行排序,利用下标进行查找
    在这里插入图片描述

    3.4.5、编写代码,演示多个字符从两端移动,向中间汇聚

    #include
    #include
    int main()
    {
    	char arr1[] = "helle worad !!!";
    	char arr2[] = "###############";
    	int left = 0;
    	int right = strlen(arr2) - 1;
    	while (left <= right)
    	{
    		arr2[left] = arr1[left];
    		arr2[right] = arr1[right];
    		left++;
    		right--;
    		printf("%s\n", arr2);
    		Sleep(1000);
    		//system("cls");
    	}
    	printf("%s\n", arr2);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    打印的就是这个效果
    在这里插入图片描述
    在这里插入图片描述

    3.4.6、编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序)

    int main()
    {
    	int i = 0;
    	char arr[20] = { 0 };
    	for (i = 0; i < 3; i++)
    	{
    		printf("请输入密码:");
    		scanf("%s",arr);
    		if (strcmp(arr,"123456") == 0)
    		{
    			break;
    		}
    	}
    	if (3 == i)
    	{
    		printf("密码错误,登录失败!\n");
    	}
    	else
    	{
    		printf("密码正确,登录成功!\n");
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    这里是引用

    3.5、go to 语句

    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
    从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
    但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
    程,例如一次跳出两层或多层循环。
    这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
    关于shutdown命令的扩展
    下面是使用goto语句的一个例子:

    int main()
    {
    	char input[10] = { 0 };
    	system("shutdown -s -t 60");
    again:
    	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    	scanf("%s", input);
    	if (0 == strcmp(input, "我是猪"))
    	{
    		system("shutdown -a");
    	}
    	else
    	{
    		goto again;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里是引用

  • 相关阅读:
    LeetCode刷题(python版)——Topic63. 不同路径 II
    搜索引擎之ElasticStack的学习
    java计算机毕业设计会员商城管理系统MyBatis+系统+LW文档+源码+调试部署
    高颜值markdown解析器:粘贴复制代码即可用(不用编译打包)
    最长递增子序列
    费曼学习法 用输出倒逼输入
    浏览器的选择建议,按照这些建议选,总能找到合适的
    YoloV5实时推理最短的代码
    【ubuntu云服务器部署公网Web抽奖工具】CSDN博客评论区用户抽奖
    AIGC之Stable Diffusion
  • 原文地址:https://blog.csdn.net/ryy1999/article/details/126755420