【NOI】C++函数入门二(自定义函数)

文章目录

  • 前言
  • 一、概念
    • 1.导入
      • 1.1 首先什么是函数呢?
    • 2.函数分类
    • 3.为什么要定义函数呢?
    • 4.函数结构
    • 5.函数使用注意事项
  • 二、例题讲解
    • 问题:1137 - 纯粹素数
    • 问题:1258 - 求一个三位数
    • 问题:1140 - 亲密数对
    • 问题:1149 - 回文数个数
  • 三、总结
  • 四、感谢


前言

在这一章节中,我们将深入探讨C++中的函数概念,包括自定义函数的定义、用途以及如何编写和使用它们。通过一系列的实例练习,我们将掌握如何利用函数简化程序结构、提高代码重用性和可维护性。无论是初学者还是有一定基础的同学,都将从这些实践案例中学到实用的知识和技巧。

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲


一、概念

1.导入

在上一章节中,我们学习了sqrt函数。但是没有讲函数这个知识点,这就是我们今天的主要学习内容。

1.1 首先什么是函数呢?

函数:为了完成某个任务而组合在一起的一组语句。

在这里插入图片描述

比如说我们生活中,我们想要有“人”帮我们洗衣服,所以发明了洗衣机。而洗衣机就是了为了完成洗衣服这个任务,然后用电机,塑料,按钮等等组合在一起的工具。

假设把“洗衣服”这个问题放到计算机中,污渍用数字表示,数字越大则表示衣服就越脏。

在这里插入图片描述

那我们是否就可以通过循环减一的方式来模拟洗衣服呢?

然后把读取衣服数据和输出衣服数据的代码语句放在一起,此时是否就构成了我们代码版的“洗衣机”?

恭喜你,发明了”洗衣机“函数!
在这里插入图片描述

2.函数分类

函数可以大致分为两种,系统函数和自定义函数。

它们的区分很简单。

系统函数:系统定义好的,方便我们完成某个任务的一组语句。

自定义函数:需要我们根据实际需求自己进行编写的一组语句。

常见的系统函数,比如我们上一节中讲到的sqrt函数,还有常用的cin,cout,还有浮点数类型保留小数部分的fixed等等。

此时的你是否对#include有了更深的理解呢?其实就是在导入系统定义好的函数帮助我们解决问题。

3.为什么要定义函数呢?

那么问题来了,为什么要自定义函数呢?

在这里插入图片描述

我们还是可以用洗衣服这件事来说明,明明我们可以用手洗衣服为什么还要发明洗衣机呢?

一个字,懒!

在这里插入图片描述

一样的,将一堆代码定义成函数以后,我们可以实现代码的重复使用。

这能大大的简化我们的开发效率,提高我们做题的速度。

当然好处还不止这些!!!

比如方便程序的修改!

定义函数后,我们修改函数,所有函数调用的地方都得到了修改。

而如果你是使用ctrl c+ctrl v的方式,那么你就得对所有的代码都进行修改!

在这里插入图片描述

这么想想,懒其实挺好的。

  1. 重复使用代码: 通过定义函数,可以在不同的地方多次调用同一段代码。
  2. 模块化: 将程序分解为更小的部分使得更容易管理和维护。
  3. 易于调试: 单独测试和调试函数要比测试整个程序更容易。

4.函数结构

接下来,我们需要了解一下怎么去自定义函数。

我们可以通过main函数来了解,毕竟每个程序都有主函数。

int main(){
	return 0;
}

函数的基本结构:

返回值类型 函数名(输入参数){
	return 返回值://有返回值的函数,最后一句一定是return 返回值
}

5.函数使用注意事项

注意1:如果函数没有返回值,返回值类型就定义为void,并且通常不需要 return 语句。
注意2:函数可以没有输入参数,没有输入参数小括号为空;也可以包含多个参数,用逗号隔开。
注意3:什么时候需要输入参数?如果调用这个函数,需要给他若干数,这若干数就是输入参数:
注意4:函数体中可以包含任何合法的语句序列。
注意5:什么时候有返回值?如果一个函数,能够计算出一个值,我们都应该返回:(注意函数的返回值,最多只能有1个)

总结一句话:需要什么给什么,返回什么拿么!

二、例题讲解

问题:1137 - 纯粹素数

类型:自定义函数


题目描述:

纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。

求出所有小于 3000 的四位的纯粹素数。

输入:

输出:

按从小到大的顺序输出若干个纯粹素数,每行一个。

在这里插入图片描述


1.分析问题

  1. 已知:所有小于3000的四位数。
  2. 未知:求出所有小于 3000 的四位的纯粹素数。
  3. 关系: 纯粹素数:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。

2.定义变量

	//二、定义变量(已知、未知、关系) 
	int t;
	bool isFind;

3.输入数据

无。

4.数据计算

  • isPrime 函数:这个函数用于检测一个整数 p 是否为素数。
    • 首先处理特殊情况:小于等于3的数,其中1不是素数,2和3是素数。
    • 然后排除所有能被2或3整除的数。
    • 最后,从5开始,每次增加6,检查形如 6k ± 1 的数是否能整除 p。这是因为除了2和3外,所有素数都可以表示为 6k ± 1 的形式。
bool isPrime(int p){
	if(p<=3) return p>1;
	
	if(p%2==0 || p%3==0) return false;
	
	for(int i=5;i*i<=p;i+=6){
		if(p%i==0||p%(i+2)==0) return false;
	}
	
	return true;
}


  • reHigh 函数:这个函数用于去掉一个数的最高位。
    • 如果数小于等于9,则返回0(因为已经没有更高位可以去掉了)。
    • 使用模运算和除法来构建新的数,去掉最高位。
int reHigh(int r){	
	if(r<=9) return 0;
	int res=0,mul=1;
	while(r>9){
		res+=r%10*mul;
		r/=10;
		mul*=10;
	}
	return res;
}
  • 遍历从1001到2999之间的所有奇数(因为除了2以外的所有偶数都不是素数)。
    • 对于每个数,检查它及其去掉最高位后的数是否均为素数。
    • 如果是纯粹素数,则输出该数。
//四、根据关系计算
	for(int i=1001;i<3000;i+=2){
		t=i;
		isFind=true;
		while(t){
			if(!isPrime(t)){
				isFind=false;
				break;	
			}
			t=reHigh(t);
		}
		//五、输出未知 
		if(isFind) cout<<i<<endl;
	} 

完整代码如下:

#include<bits/stdc++.h>
using namespace std;

// 检测一个整数是否为素数
bool isPrime(int p){
    // 处理特殊情况:小于等于3的数
    if(p <= 3) return p > 1; // 1不是素数,2和3是素数
    
    // 排除能被2或3整除的数
    if(p % 2 == 0 || p % 3 == 0) return false;

    // 从5开始检查形如 6k ± 1 的数
    for(int i = 5; i * i <= p; i += 6){
        if(p % i == 0 || p % (i + 2) == 0) return false;
    }
    
    return true; // 如果没有找到因子,则p是素数
}

// 去掉一个数的最高位
int reHigh(int r){	
    if(r <= 9) return 0; // 如果只有一个数字,则返回0
    int res = 0, mul = 1;
    while(r > 9){
        res += r % 10 * mul; // 添加最低位数字到结果
        r /= 10; // 移除最低位
        mul *= 10; // 更新乘数
    }
    return res; // 返回去掉最高位后的数
}

int main(){
    // 主循环:遍历所有小于3000的四位数
    for(int i = 1001; i < 3000; i += 2){ // 从1001开始,每次增加2(跳过偶数)
        int t = i;
        bool isFind = true;
        
        // 检查当前数及其去掉最高位后的数是否均为素数
        while(t){
            if(!isPrime(t)){
                isFind = false;
                break; // 如果发现任何一个数不是素数,则退出循环
            }
            t = reHigh(t); // 去掉最高位
        }
        
        // 如果所有去掉最高位后的数均为素数,则输出原始数
        if(isFind) cout << i << endl;
    } 

    return 0; // 程序结束
}

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

问题:1258 - 求一个三位数

类型:自定义函数、简单循环


题目描述:

求这样一个三位数,该三位数等于其每位数字的阶乘之和, 即
abc=a!+b!+c!。n! 表示 n 的阶乘, n!=1×2×3×⋯×n,如:5!=1×2×3×4×5)

输入:

输出:

输出这个数。

在这里插入图片描述


1.分析问题

  1. 已知:所有的三位数。
  2. 未知:找出符合条件的数。
  3. 关系:该三位数等于其每位数字的阶乘之和。

2.定义变量

	//二、定义变量(已知、未知、关系) 
	int g,s,b;

3.输入数据

无。

4.数据计算

  • jc 函数:计算一个整数的阶乘。
    • 输入参数 t 表示要计算阶乘的数。
    • 使用一个循环来计算阶乘。
    • 返回阶乘的结果。
int jc(int t){
	int res=1;
	while(t>1){
		res*=t;
		--t;
	}
	return res;
}
  • 遍历从100到999的所有三位数。
    • 对于每个数 i,获取个位、十位和百位上的数字。
    • 计算每一位数字的阶乘。
    • 检查该数是否等于各位数字的阶乘之和。
    • 如果条件满足,则输出该数,并结束循环。
//四、根据关系计算
	for(int i=100;i<1000;++i){
		
		g=i%10;
		s=i/10%10;
		b=i/100;
		
		g=jc(g);
		s=jc(s);
		b=jc(b);
		
		//五、输出未知
		if(i==g+s+b){
			cout<<i;
			break;
		}
	} 

完整代码如下:

#include<bits/stdc++.h>
using namespace std;

// 计算阶乘的函数
int jc(int t){
    int res = 1;
    while (t > 1) {
        res *= t;
        --t;
    }
    return res;
}

int main(){
    // 一、分析问题
    // 已知:所有的三位数。
    // 未知:找出符合条件的数。
    // 关系: 该三位数等于其每位数字的阶乘之和。

    // 二、定义变量(已知、未知、关系)
    int g, s, b; // 个位、十位、百位上的数字

    // 三、输入已知
    // 四、根据关系计算
    for (int i = 100; i < 1000; ++i) { // 遍历所有的三位数
        g = i % 10; // 获取个位数字
        s = i / 10 % 10; // 获取十位数字
        b = i / 100; // 获取百位数字

        // 计算每一位数字的阶乘
        g = jc(g);
        s = jc(s);
        b = jc(b);

        // 五、输出未知
        if (i == g + s + b) { // 如果该数等于各位数字的阶乘之和
            cout << i; // 输出该数
            break; // 找到一个符合条件的数后,结束循环
        }
    }

    return 0; // 程序结束
}

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

问题:1140 - 亲密数对

类型:自定义函数


题目描述:

键盘输入 N ,N 在 2 至 2000 之间,求 2 至 N 中的亲密数对,就是 A 的因子和等于 B ,B 的因子和等于 A ,且 A≠B 。
如 48 和 75 是亲密数对。48 的因子和为 2+3+4+6+8+12+16+24=75 ,而 75 的因子和为 3+5+15+25=48 。

输入:

只有一行,为一个整数 N ( 2≤N≤2000 )

输出:

输出若干行,每行两个整数(用一个空格隔开)。

样例1:

输入:

200

输出:

48 75
75 48
140 195
195 140

样例2:

输入:

150

输出:

48 75
75 48

在这里插入图片描述


1.分析问题

  1. 已知:一个整数N ,N 在 2 至 2000 之间;
  2. 未知:求 2 至 N 中的亲密数对;
  3. 关系:A 的因子和等于 B ,B 的因子和等于 A ,且 A≠B 。

2.定义变量

  • n表示输入的最大值,t用于临时存储因子和。
	//二、定义变量(已知、未知、关系)
	int n,t; 

3.输入数据

  • 输入n的值
	//三、输入已知
	cin>>n;

4.数据计算

  • 定义了一个名为sumYz的函数,用来计算小于或等于s的所有真因子之和。
    • 函数内部使用一个循环来找到所有的因子,并累加它们的值。
    • 如果一个因子的平方等于s,说明这个因子被重复计算了两次,需要减去一次。
    • 返回所有因子的累加和。
int sumYz(int s){
	int res=0;
	
	for(int i=2;i*i<=s;++i){
		if(s%i==0) res+=i+s/i;
		if(i==s/i) res-=i;
	}
	
	
	return res;
}
  • 使用一个循环遍历从2到n的所有整数。
    • 对于每一个整数i,调用sumYz函数计算它的因子和t。
    • 检查t是否在2到n的范围内,同时检查i是否是t的因子和,并且i不等于t。
    • 如果满足条件,则输出这对亲和数。
	//四、根据关系计算
	for(int i=2;i<=n;++i){
		
		t=sumYz(i);
		//五、输出未知 
		if(t<=n&&sumYz(t)==i&&i!=t) cout<<i<<" "<<t<<endl;
		
	}

完整代码如下:

#include<bits/stdc++.h> // 包含所有标准C++库
using namespace std;

// 计算一个整数s的所有真因子之和
int sumYz(int s){
    int res = 0; // 初始化结果为0
    
    // 遍历所有可能的因子
    for(int i = 2; i * i <= s; ++i){
        if(s % i == 0){ // 如果i是s的一个因子
            res += i + s / i; // 将i及其对应的配对因子加入结果
        }
        if(i == s / i) // 如果i的配对因子与i相同(即s是完全平方数)
            res -= i; // 避免重复计数
    }
    
    return res; // 返回所有真因子之和
}

int main(){
    // 一、分析问题
    // 已知:一个整数N, N在2至2000之间;
    // 未知:求2至N中的亲和数对;
    // 关系: A的因子和等于B,B的因子和等于A,且A≠B。
    
    // 二、定义变量(已知、未知、关系)
    int n, t; // n表示输入的最大值,t用于临时存储因子和
    
    // 三、输入已知
    cin >> n; // 输入n的值
    
    // 四、根据关系计算
    for(int i = 2; i <= n; ++i){
        
        t = sumYz(i); // 计算i的所有真因子之和
        
        // 五、输出未知
        // 检查t是否也在2至n的范围内,并且i和t互为亲和数
        if(t <= n && sumYz(t) == i && i != t)
            cout << i << " " << t << endl; // 输出这对亲和数
    }
    
    return 0; // 主函数结束
}

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

问题:1149 - 回文数个数

类型:自定义函数、2015江苏省青少年信息学奥林匹克竞赛复赛


题目描述:

一个正整数,正读和反读都相同的数为回文数。

例如22 , 131 , 2442 , 37073 , 6 ,… 所有 1 位数都是回文数。

给出一个正整数 n ( 1≤n≤10000 ),求出 1,2,…,n 之中(包括 1 和 n )的回文数的个数。

输入:

任意给定一个正整数 n ( 0<n≤10000 )

输出:

一个正整数,表示[ 1,n ]之间的回文数的个数。

样例:

输入:

325

输出:

41

在这里插入图片描述


1.分析问题

  1. 已知:一个正整数 n ( 0<n≤10000 );
  2. 未知:求出 1,2,…,n 之中(包括 1 和 n )的回文数的个数;
  3. 关系:一个正整数,正读和反读都相同的数为回文数。

2.定义变量

  • 定义变量n用于存储用户输入的最大值,c用于计数回文数的数量。
	//二、定义变量(已知、未知、关系) 
	int n,c=0;

3.输入数据

  • 使用cin从用户获取输入值n。
	//三、输入已知
	cin>>n;

4.数据计算

  • 判断一个整数h是否为回文数。
    • 初始化t为h的副本,r为0。
    • 使用一个循环反转h的数字。
    • 如果反转后的数字等于原数字,则返回true。
bool isHw(int h){
	int t=h,r=0;
	while(t){
		r=r*10+t%10;
		t/=10;
	}
	
	if(h==r) return true;
	
	return false;
}
  • 使用一个循环从1到n遍历所有整数。
  • 对于每个整数i,如果isHw(i)返回true,则增加计数器c。
	//四、根据关系计算
	for(int i=1;i<=n;++i){
		if(isHw(i)) ++c;
	}

5.输出结果

  • 最后,使用cout输出回文数的总数c。
	//五、输出未知 
	cout<<c;

完整代码如下:

#include<bits/stdc++.h> // 包含所有标准C++库
using namespace std;

// 判断一个整数是否为回文数
bool isHw(int h){
    int t = h, r = 0; // 初始化反转后的数字r为0,t用于存储原始数字的副本
    
    // 反转数字
    while(t){
        r = r * 10 + t % 10; // 反转操作
        t /= 10; // 去除最低位
    }
    
    // 检查原数字和反转后的数字是否相等
    if(h == r) return true; // 如果相等,则是回文数
    
    return false; // 否则不是回文数
}

int main(){
    // 一、分析问题
    // 已知:一个正整数 n ( 0<n≤10000 );
    // 未知:求出 1,2,…,n 之中(包括 1 和 n )的回文数的个数;
    // 关系: 一个正整数,正读和反读都相同的数为回文数。
    
    // 二、定义变量(已知、未知、关系)
    int n, c = 0; // n表示输入的最大值,c用于计数回文数的数量
    
    // 三、输入已知
    cin >> n; // 输入n的值
    
    // 四、根据关系计算
    for(int i = 1; i <= n; ++i){
        if(isHw(i)) ++c; // 如果i是回文数,则增加计数器
    }
    
    // 五、输出未知
    cout << c; // 输出回文数的总个数
    
    return 0; // 主函数结束
}

三、总结

在本章中,我们学习了C++中的函数相关知识,包括函数的概念、分类、作用以及结构。我们了解到函数可以帮助我们组织代码,使程序更加模块化,便于维护和调试。同时,我们也通过几个具体的例题进行了实战演练,加深了对函数使用的理解。

四、感谢

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter仿京东商城APP实战 用户中心基础布局

用户中心界面 pages/tabs/user/user.dart import package:flutter/material.dart; import package:jdshop/utils/zdp_screen.dart; import package:provider/provider.dart;import ../../../store/counter_store.dart;class UserPage extends StatefulWidget {const UserPage…

如何在Node.js中执行解压缩文件操作

一、解压文件 1.安装依赖&#xff1a; 安装adm-zip依赖包&#xff1a;npm install adm-zip --save 安装iconv-lite依赖包&#xff1a;npm install iconv-lite --save 解压前的file文件夹结构&#xff1a; update-1.0.2.zip压缩包内容&#xff1a; 2.在depresssFile.js文件&…

Vue学习笔记(六)

模板引用(获取DOM 操作) 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层DOM元素。要实现这一点&#xff0c;我们可以使用特殊的refattribute。 挂载结束后引用都会被暴露在this.$refs之上。 <s…

华为原生鸿蒙操作系统:我国移动操作系统的新篇章

华为原生鸿蒙操作系统&#xff1a;我国移动操作系统的新篇章 引言 在移动操作系统领域&#xff0c;苹果iOS和安卓系统一直占据主导地位。然而&#xff0c;随着华为原生鸿蒙操作系统的正式发布&#xff0c;这一格局正在发生深刻变化。作为继苹果iOS和安卓系统后的全球第三大移动…

android studio编译错误提示无法下载仓库

一、调整方法之一 buildscript {repositories {google()jcenter()//maven { url https://maven.aliyun.com/repository/google }//maven { url https://maven.aliyun.com/repository/central }}dependencies {// classpath "com.android.tools.build:gradle:4.1.1"c…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

监控-08-skywalking监控告警

文章目录 前言一、准备二、配置skywalking2.1 修改alarm-settings.yml2.2 重启skywalking 三、收到告警邮件总结 前言 skywalking根据监控规则&#xff0c;通过webhook调后端微服务接口&#xff0c;从而发送告警邮件。 一、准备 根据上几章内容&#xff0c;保证skywalking能监…

Spring IoC DI

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1. 应用分层 1.1 如何分层: 1.2 MVC与三层架构区别联系 2. Spring 3.IoC & DI⼊⻔ 3.1 什么是IoC&#xff1f; 3.2 DI 介绍 …

CANFD SSP第二采样点引发的“风波”分析

案例背景&#xff1a; 近几年来&#xff0c;主机厂逐渐大范围使用CANFD通信。在CAN网络中&#xff0c;因SSP第二采样点引发的错误帧偶有发生&#xff0c;所以在主机厂的SPEC需求中&#xff0c;明确要求启用CAN控制器的TDC收发器延迟补偿&#xff0c; 目录 1 CANFD的SSP第二采…

【设计模式】《Java 设计模式魔法:解锁高效编程的秘密武器》

标题&#xff1a;《Java 设计模式奇幻之旅&#xff1a;解锁高效编程的魔法钥匙》 摘要&#xff1a; 本文将深入探讨 Java 中的十种设计模式&#xff0c;包括单例模式、工厂方法模式、抽象工厂模式…迭代器模式、组合模式、模板方法模式等。通过详细的解释、生动有趣的例子以及…

【skywalking 】选择Elasticsearch存储

介绍 skywalking支持 Elasticsearch 和 OpenSearch 作为存储。 OpenSearch 是 ElasticSearch 7.11 的一个分支&#xff0c;但在 Apache 2.0 中获得许可。 OpenSearch 存储与 ElasticSearch 共享相同的配置。为了激活 OpenSearch 作为存储&#xff0c;请将存储提供程序设置为e…

Python4

4. 更多控制流工具 除了刚介绍的 while 语句&#xff0c;Python 还用了一些别的。我们将在本章中遇到它们。 4.1. if 语句 if elif else if x<0: x 0 print(Negative changed to zero) elif x0: print( zero) else: print(More) 4.2. for 语句 Pyth…

Mybatis的关联关系-多对多

在进行数据库原理的时候&#xff0c;我们将E-R图的实体转化为我们的表时&#xff0c;有时要考虑到多对多的关系。比如下图&#xff1a; 我们可以转化为下面的表&#xff1a; 因为User和Orders是1:n的关系&#xff0c;所以Orders有一个外键。 t_orders表 idnumberuser_id(外键…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

Redis 事务 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 事务 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 事务 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 事务…

基础数据结构及算法——AVL树【自平衡二叉搜索树】解决失衡

历史 AVL 树是一种自平衡二叉搜索树&#xff0c;由托尔哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字&#xff1a;Adelson-Velsky 和 Landis&#xff0c;他们是苏联数学家&#xff0c;于 1962 年发表了一篇论文&#xff0c;详细介绍了 AVL 树的概念和…

VoLTE 微信令:SBC 功能篇之 超长呼叫释放信令流程

目录 1. SBC 的位置及超长呼叫释放功能简介 2. VoLTE 超长通话,SBC 释放呼叫流程 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都可以添加博主低价指导哈。 1. SBC 的位置及…

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup&#xff08;bs4&#xff09;解析复杂 HTML&#xff1a;详解与示例 在 Web 开发和数据分析中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML&#xff0c;其中最受欢迎的就…

华尚实业集团家居产业园总部中心项目奠基仪式成功举办

金秋风景如画&#xff0c;十月天高云淡。良辰阳光灿烂&#xff0c;吉时热闹非凡。2024年10月23日上午&#xff0c;华尚实业集团家居产业园总部中心项目奠基仪式在增城经济技术开发区宁西园区项目现场隆重举行&#xff0c;标志着华尚实业集团家居产业园总部中心建设正式拉开帷幕…