Linux--C语言之分支结构

news2024/9/21 4:27:07

文章目录

  • 一、分支结构
    • (一)概念
    • (二)条件构建
      • 1.关系表达式:
      • 2.逻辑表达式:
      • 3.常量/变量:值是否非0,取值(0|1)
    • (三)选择结构的形式
      • 1.单分支
      • 2.双分支
        • (1)三目运算符
      • 3.多分支
      • 4.switch
      • 5.switch语句的case穿透:
  • 二、总结
  • 三、扩展
    • (一)条件表达式中的运算符优先级
    • (二)设置vim中tab字符数
      • 设置vim默认tab长度

一、分支结构

​ 分支结构:又被称之为选择结构

(一)概念

​ 选择结构:根据条件成立与否,选择相应的操作。

(二)条件构建

1.关系表达式:

​ 是指用关系运算符将两个表达式连接起来组成的有意义的式子,即含有关系运算符的表达式(>,<,>=,<=,!=,==)

2.逻辑表达式:

​ 用逻辑运算符将关系表达式或逻辑量连接起来构成的有意义的式子,即含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:

if(year % 100 == 0 && year % 4 !=0) // 这种既含有关系表达式,又含有逻辑表达式的条件叫做复合条件 

3.常量/变量:值是否非0,取值(0|1)

​ 注意:类似以下写法,是无效的,没有意义的。

if(x+y) // 编译通过,但是没有实际意义,不建议这样写
if(5*6)

(三)选择结构的形式

1.单分支

​ 语法:

if(条件表达式)
{
	语句1;
}

​ 说明: 条件表达式成立,执行语句1,否则跳过该分支结构。单分支条件不满足可以不执行。

​ 流程图:

在这里插入图片描述

​ 例子:

int a = 5;
if(a < 0)
{
	a = -a;
}
printf("a=%d\n",a);

​ 例子:

/**
* 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符
*/
#include <stdio.h>
int main()
{
	// 声明一个变量,存放从键盘录入的字符
	char c;
	printf("请输入一个英文字母:\n");
	scanf("%c",&c);
	// 判断
	if(c >= 'A' && c <= 'Z')
	{
		// c = c + 32;
		c += 32;
	}
	printf("输入的字符是:%c\n",c);
	return 0;
}

2.双分支

​ 语法:

if(条件表达式)
{
	语句1}
else
{
	语句2;
}

​ 说明: 条件表达式成立,执行语句1,否则执行语句2。双分支不管条件是否满足,都要执行。

​ 流程图:

在这里插入图片描述

​ 例子:

#include <stdio.h>
int main(void)
{
	// 声明三个变量来存放计算数
	double x,a,y;
	// 通过键盘录入x,a
	printf("请输入两个数值:\n");
	scanf("%lf,%lf",&x,&a);
	// 检验除数
	if(x != 0 && a != 0)
	{
		y = 1.0/x + 1.0/a;
	}
	else
	{
		y = 10000;
	}
	// 输出
	printf("y=%f\n",y);
	return 0;
}
(1)三目运算符

​ 语法:

表达式1 ? 表达式2 : 表达式3;

​ 说明:?: 条件运算符,主要可以简化双分支为同一变量赋值的操作。

​ 求值过程:先计算表达式1的值,非0,则将表达式2的结果作为条件运算符的最终结果;否则将表达式3的结果作为条件运算符最终结果

​ 案例1:

#include <stdio.h>
int main(void)
{
	// 需求:求a,b两个数中最大数
	// 写法1:正常写法
	int a = 5,b = 3;
	if(a > b)
	{
		printf("最大数是:%d\n",a);
	}
	else
	{
		printf("最大数是:%d\n",b);
	}
    
	// 写法2:省略{}
	int a1 = 5,b1 = 3;
	if(a1 > b1)
	printf("最大数是:%d\n",a1);
	else
	printf("最大数是:%d\n",b1);
    
	// 写法3:三目运算符
	int a2 = 5,b2 = 3;
	int ret = a2 > b2 ? a2 : b2;
	printf("最大数是:%d\n",ret);
    
	return 0;
}

​ 案例2:

#include <stdio.h>
int main(void)
{
	// 需求:输入两个实数,按代数值由 小到大的顺序输出这两个实数。
	// 声明变量,存储操作数
	int a,b;
	printf("请输入两个数值作为操作数:\n");
	scanf("%d,%d",&a,&b);
    
	// 校验
	// 方式1
	if(a > b)
	{
		printf("由小到大的顺序是:%d,%d\n",b,a);
	}
	else
	{
		printf("由小到达的顺序是:%d,%d\n",a,b);
	}
    
	// 方式2
	// 创建一个临时变量,用来存放交换信息
	int t = 0;
	if(a > b)
	{
		t = a;
		a = b;
		b = t;
	}
	printf("由小到大的顺序是:%d,%d\n",a,b);
    
    return 0;
}

​ 案例3:

#include <stdio.h>
int main(void)
{
	// 需求:输入3个数a,b,c,要求按由小到大的顺序输出这3个数
	// 声明变量,用来存放操作数
	int a,b,c,tmp;
	printf("请输入三个整数:\n");
	scanf("a=%d,b=%d,c=%d",&a,&b,&c);
    
	// 条件判断
	if(a > b)
	{
		tmp = a;
		a = b;
		b = tmp;
	}
	if(a > c)
	{
		tmp = a;
		a = c;
		c = tmp;
	}
	if(b > c)
	{
		tmp = b;
		b = c;
		c = tmp;
	}
	printf("a,b,c三个数按照由小到大的顺序是:%d,%d,%d\n",a,b,c);
	return 0;
}

3.多分支

​ 语法:

if(条件1)
{
	语句1;
} else if(条件2)
{
	语句2;
}
...
else 
{
	语句n+1;
}

​ 流程图:

在这里插入图片描述

​ 案例1:

#include <stdio.h>
int main(void)
{
	// 需求:编一程序,要求输入一个x值,输出y值
	// 方式1:嵌套的if..
	int x,y;
	printf("请输入一个整数:\n");
	scanf("%d",&x);
    
	// 条件判断
	if(x < 0)
	{
		y = -1;
	}
	else
	{
		// x >= 0
		if(x == 0)
		{
			y = 0;
		}
		else
		{
   			y = 1;
		}
	}
	printf("方式1:x=%d,y=%d\n",x,y);
    
	// 方式2:多分支if..else if....else..
	// 条件判断
	if(x < 0)
	{
		y = -1;
	}
	else if(x == 0)
	{
		y = 0;
	}
	else
	{
		y = 1;
	}
	printf("方式2:x=%d,y=%d\n",x,y);
    
    return 0}

​ 案例3:

#include <stdio.h>
/**
* 需求:高校要求粤嵌对实训学生根据实训成绩进行评级
  范围:0 <= score <= 100;
  评级:
		score >= 90 优秀
		score >= 80 良好
		score >= 70 中等
		score >= 60 及格
		score < 60 不及格
*/
int main(void)
{
	// 声明一个变量,存储成绩
	int score; 
	printf("请录入学生成绩:\n");
	scanf("%d",&score);
    
	// 对score进行合法校验
	if(score >= 0 && score <= 100)
	{
		// 对合法输入的成绩进行评级
		if(score >= 90)
		{
			printf("优秀\n");
		}
		else if(score >= 80)
		{
			printf("良好\n");
		}
		else if(score >= 70)
		{
			printf("中等\n");
		}
		else if(score >= 60)
		{
			printf("及格\n");
		}
		else
		{
			printf("不及格\n");
		}
	}
	else
	{
		printf("成绩录入不合法!\n");
	}
    return 0;
}

4.switch

​ 语法:

switch(表达式) // 不能是布尔型 和 浮点型
{
	case 常量表达式1:
		语句体1;
		break;
    case 常量表达式2:
		语句体2;
		break;
	...
	case 常量表达式n:
		语句体n;
		break;
	default:
		语句体n+1;
         break;// 可以省略
}

​ 流程图:

在这里插入图片描述

​ 说明:

​ ⑴ switch后括号内的表达式可以是任何类型的表达式;

​ ⑵ 若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行default后面 的语句;

​ ⑶ 每个case后面的常量表达式的值都必须不相同,否则出现矛盾;

​ ⑷ 各个case 和default出现的次序不影响执行结果;

​ ⑸ case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿透) ;

​ ⑹ 多个case可共用一组语句。

​ 注意:

​ (1)表达式一般写一个变量,变量的值是一个确定的常量。

​ (2)当遇到break或者switch语句的右大括号时,switch语句结束。

​ (3)表达式中的数据类型:char,short,int,long,long long,不能是浮点型。

​ 表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。

​ 案例1:

/*
需求:根据成绩进行评级
score <= 100;
评级:
	90 <= score < 100 优秀 90~99/10 == 9 && 100/10 ==10
	80 <= score < 90 良好 80~89/10 == 8
	70 <= score < 80 中等 70~79/10 == 7
	60 <= score < 70 及格 60~69/10 == 6
	score < 60 不及格
*/
#include <stdio.h>
int main(void)
{
	int score;// 成绩
	printf("请输入实训成绩:\n");
	scanf("%d",&score);
	if(score >= 0 && score <= 100)
	{
		// 对成绩进行加工
		int l = score / 10;
		switch(l)
		{
			case 10:// 100分
			case 9:// 90~99分
				printf("优秀\n"); // 这里:多个case共用一块代码
			break;
			case 8:
				printf("良好\n");
			break;
			case 7:
				printf("中等\n");
			break;
			case 6:
				printf("及格\n");
			break;
			default:
				printf("不及格\n");
		}
	}
	else
	{
		printf("成绩录入不合法!\n");
	}
    return 0;
}

​ 案例2:

/*
需求:实现一个简易计算器,要求实现+,-,×,/运算
*/
#include <stdio.h>
int main()
{
	printf("简易计算器 v1.0\n");
	printf("请输入两个操作数:\n");
    
	double x,y;// 存放计算数
	char ch;// 运算符
    
	scanf("%lf,%lf",&x,&y);
	scanf("%c",&ch);// 消除上面产生的最后一个回车符
	printf("请输入运算符:(+、-、.*、/)\n");
	scanf("%c",&ch);
    
	// 计算
	switch(ch)
	{
		case '+':
			printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
		break;
		case '-':
			printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
		break;
		case '.':
		case '*':
			printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
		break;
		case '/':
			if(y == 0)
			{
				printf("除数不能为0\n");
			}
			else
			{
				printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
			}
		break;
		default:
			printf("输入错误!");
		}
		return 0;
}

5.switch语句的case穿透:

​ (1)case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是否和它后面的case常量是否相同),这样的现象称之为case穿透。

​ (2)default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语句可以放在switch语句{}内的任意位置。

二、总结

​ 1.如果只需要一个判断结果,使用单分支

​ 2.如果需要两个判断结果,且只能有两个判断结果,使用双分支

​ 3.如果需要判断N个结果中的某几个,或者所有,使用多分支

三、扩展

(一)条件表达式中的运算符优先级

​ 逻辑非(!) > 算数运算符 (±*/%)>关系运算符(> < >= <= != == )> 逻辑运算符(&&、||)> 赋

值运算符(=、+=)

(二)设置vim中tab字符数

设置vim默认tab长度

  1. 打开终端;

  2. 输入 vim~/.vimrc命令,按回车键。这将创建一个名为.vimrc的文件(如果尚不存在)或打开现有文件夹;

  3. 在文件夹中添加以下内容来设置tab长度,例如设置为4个空格:

    set tabstop = 4
    set shiftwidth = 4
    set expandtab
    

​ set tabstop = 4 设置tab停止的长度为4个空格,set shiftwidth = 4设置自动缩进长度也是4个空格,set expandtab设置 使用空格而不是制表符进行缩进;

  1. 保存并关闭文件。在vim编辑器中,按下Esc键,然后在英文状态下输入“:wq”,最后按回车键;
  2. 重新启动终端或运行source ~/.vimrc 命令以应用更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT容器组

目录 容器组 Group BoX&#xff08;组&#xff09; Scroll Area&#xff08;组滑动&#xff09; Tool Box&#xff08;分页显示&#xff09; Tab Widget&#xff08;也是分页显示&#xff09; Stacked widget&#xff08;也是分页&#xff09; Frame&#xff08;就一个框…

无字母数字webshell之命令执行

文章目录 无字母数字的webshell构造技巧php7下简单解决问题php5下解决问题glob开始操作 无字母数字的webshell构造技巧 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$c…

应对FingerprintJS反爬:Selenium的破解策略与技术详解

目录 引言 FingerprintJS技术概述 技术原理 应用场景 应对策略 高级解决方案 代码实现与案例分析 去除webdriver特征 使用Undetected_chromedriver 案例分析&#xff1a;爬取目标网站数据 结论 引言 在现代互联网环境中&#xff0c;网站反爬技术日益成熟&#xff0…

分布式知识总结(基本概念)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本概念 吞吐量 指系统在单位时间能够处理多少个请求 QPS 每秒…

【mars3d】加载pbf矢量瓦片的最佳方案介绍

矢量瓦片的目前最佳方案&#xff1a; 目前示例中提供了不同的矢量瓦片的加载方案 但是加载矢量瓦片pbf的最佳方案&#xff1a; 使用 TileServer GL 开源地图服务工具&#xff1a;https://github.com/maptiler/tileserver-gl &#xff0c; 它利用 MapLibre GL Native 进行服务…

day34——TCP和UDP的基础通信

一、网络通信之套接字 1.1 套接字通信原理 1.2 socket函数介绍 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);功能&#xff1a;为通信创建一个端点&#xff0c;并返回该端点的文件描述…

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…

从AGV到立库,物流自动化的更迭与未来

AGV叉车 随着柔性制造系统的广泛应用&#xff0c;小批量、多批次的生产需求不断增强&#xff0c;“订单导向”生产已经成为趋势。这也让越来越多的企业认识到&#xff0c;产线的智能设备导入只是第一步&#xff0c;要想达到生产效率的最优解&#xff0c;物流系统的再优化必须提…

【redis的大key问题】

在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能会导致服务性能下降、用户体验变差&#xff0c;甚至引发大面积故障。 本文将介绍大Key产生的原因、其可能引发的问题及如何快速找出大Key并将其优…

Z 字形遍历二叉树

假设一个二叉树上各结点的权值互不相同。 我们就可以通过其后序遍历和中序遍历来确定唯一二叉树。 请你输出该二叉树的 ZZ 字形遍历序列----也就是说&#xff0c;从根结点开始&#xff0c;逐层遍历&#xff0c;第一层从右到左遍历&#xff0c;第二层从左到右遍历&#xff0c;…

Linux文本处理shell脚本

文本处理 在进行文本处理时&#xff0c;我们有一些常见的需求&#xff1a; 获取文本的行数、字数比较两段文本的不同之处查看文本的开头几行和最后几行在文本中查找字符串在文本中替换字符串 下面介绍如何在 shell 中做到这些事情。 文本统计&#xff1a;wc wc 是文本统计…

了解经典的 MPLS L3VPN 网络架构

1.多协议标签交换技术MPLS的概念 MPLS&#xff08;Multi-Protocol Label Switching&#xff0c;多协议标签交换技术&#xff09;,传统网络中就拥有了 3 种经典转发实现&#xff0c;它们分别是&#xff1a; L2 交换转发L2.5 标签转发L3 路由转发 MPLS 协议则作用于 L2.5 层&…

大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

布隆过滤器将应用Redis缓存使用量降低100倍

文章目录 背景布隆过滤器介绍定义工作原理数据结构&#xff1a; Redis布隆过滤器实战总结 背景 由于在业务中用到了Redis用于存储一些关系信息&#xff0c;且对应的请求量比较大&#xff0c;为了防止缓存击穿导致数据库压力过大&#xff0c;一般我们都会采用将不存在的内容存储…

头狼择校小程序

综述介绍 头狼择校&#xff0c;是头狼择™高校的简称&#xff0c;我们专注高校、大学的择校。倡导先嗅就业再择校&#xff0c;是预约工具和对话平台。帮您嗅招办、嗅教授、嗅学姐&#xff0c;预约择校有关的老师、顾问&#xff0c;助力考大学和考研的“双考”学生及家长了解就…

C# OnnxRuntime部署LivePortrait实现快速、高质量的人像驱动视频生成

目录 效果 说明 项目 模型信息 代码 下载 效果 LivePortrait实现快速、高质量的人像驱动视频生成 说明 官网地址&#xff1a;https://github.com/KwaiVGI/LivePortrait 代码实现参考&#xff1a;https://github.com/hpc203/liveportrait-onnxrun 模型下载&#xff1a;…

【健康革命】让AI成为你的私人健身教练!

本文由 ChatMoney团队出品 现在市面上有很多男生和女生为了保持身材都进行疯狂的减肥&#xff0c;有些是靠吃减肥药来保持身材&#xff0c;有些是晚上不吃饭要控制&#xff0c;还有些疯狂且漫无目的健身&#xff1b;但往往以上几种都很伤身体的&#xff0c;毕竟身体健康是革命的…

历史库,成本与性能如何兼得?| OceanBase应用实践

随着数据量的迅猛增长&#xff0c;企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升&#xff0c;以及数据运维复杂性的增加&#xff0c;这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战&#xff0c;对数据生命周期…

简单的docker学习 第13章 CI/CD与Jenkins(下)

第13章 CI/CD 与 Jenkins 13.13 自由风格的 CI 操作(最终架构) 前面的架构存在的问题是&#xff0c;若有多个目标服务器都需要使用该镜像&#xff0c;那么每个目标服务器都需要在本地构建镜像&#xff0c;形成系统资源浪费。若能够在 Jenkins 中将镜像相撞构建好并推送到 Har…

Java属性重写问题

目录 属性重写 案例演示 多态练习 练习1 练习2 属性重写 ​​​​​​​ 属性没有重写之说&#xff0c;属性的值看编译类型。 instanceOf 比较操作符&#xff0c;用于判断对象的运行类型是否为某类型或者某类型的子类。 案例演示 父类base&#xff0c;有一个count属…