C 语言学习笔记(函数2)
内容提要
- 函数
- 函数的调用
- 函数的声明
- 函数的嵌套关系
- 函数的递归调用
- 数组做函数参数
函数
函数的调用
调用方式
①函数语句:
test (); //对于无返回值的函数,直接调用
int res = max(2,4); //对于有返回值的函数,一般需要在主调函数中接受被调函数的返回值
②函数表达式:
4 + max(2,4);
scanf("%d", &num) != 1
(c = getchar()) != '\0'
③函数参数:
printf("%d",(int)fabs(num)); //函数作为实参
注意:函数可以作为函数的实参,如果要作为形参,必须使用函数指针。
在一个函数中调用另一个函数具备以下条件:
- 被调用的函数必须是已定义的函数。
- 若是用库函数,应在本文件开头用
#include
包含其对应的头文件。 - 若使用自定义函数,自定义函数又在主调函数的后面,则应在主调函数中对被调函数进行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便于在遇到函数时,编译系统能正确识别函数,并检查函数调用的合法性。
函数的声明
函数调用时,往往要遵循先定义后使用,但如果我们对函数的调用操作出现在函数定义之前,则需要对函数进行声明。
定义
完整的函数使用分三部分:
-
[函数声明]
int max(int x, int y, double z); //函数声明只保留函数头 int max(int, int, double); //s省略参数名称
函数声明如果是在同一个文件,一定要定义在文件中所有的函数定义的最前面。如果有对应的
.h
文件,可以将函数的声明抽取的.h中。 -
函数定义
int max(int x, int y, double z) //函数定义时不能省略参数的名称 {return x > y ? x : y > z ? y : (int)z; }
函数定义的时候,不能省略参数的数据类型,参数个数,参数名称,位置要和函数声明完全一 致。
-
函数调用
int main() {printf("%d\n",max(4,5,6)); }
作用
C语言的函数声明是为了提前告诉编译器函数的名称、返回类型和参数,这样在函数实际定义之前就能安全调用它,避免编译错误,同时检査参数和返回值是否正确。相当于给编译器一个“预告",确保代码正确编译和运行。
使用
错误实例:被调函数写在主调函数之后
//主调函数
int main()
{printf("%d\n", add(12, 13)); //此时编译会报错,因为函数没有经过声明,编译系统无法检查函数调用的合法性
}//被调函数
int add(int x, int y)
{return x + y;
}
正确演示:被调函数写在了主调函数之前
//被调函数
int add(int x, int y)
{return x + y;
}//主调函数
int main()
{printf("%d\n", add(12, 13));
}
注意:如果函数的调用比较简单,如果a函数调用b函数,b函数定义在a函数之前,此时是可以省略函数声明的。
正确演示:被调函数和主调函数无法区分前后,需要增加被调函数的函数声明
//函数声明
int add(int, int);//主调函数
int main()
{printf("%d\n", add(12, 13));
}//被调函数
int add(int x, int y)
{return x + y;
}
注意:如果设计函数的复杂调用,如果a函数调用b函数,b函数调用a函数,无法区分前后,此时需添加函数声明。
声明的方式:
- 函数头加上分号
int add(int a, int b);
- 函数头加上分号,可省略形参名称,但不能省略参数类型
int add(int, int);
函数的嵌套调用
函数不允许嵌套定义,但允许嵌套调用
-
正确示例:函数嵌套调用
void a() {..}void b() {a(); }int main() {printf(..) }
-
错误示例:函数嵌套定义
void a() {void b(){...} }
**嵌套调用:**在被调用函数内又主动去调用其他函数,这样的函数调用形式,称之为嵌套调用。
案例
案例1
-
需求:编写一个函数,判断给定的3~100的正整数是否是素数,若是返回1,否则返回0
-
分析:
- 素数:素数是大于1的自然数,除了1和它本身外,不能被其他整除。
-
代码:
/** * 定义一个函数,求素数 * @param n:需要校验素数的整数 *@return 返回flag 1-素数,0-非素数 */ int is_prime(int n){//默认是素数int flag = 1;//循环变量int i;// 生成2 ~ n/2for (i = 2; i <= n / 2; i++){// 判断是否出现整除的情况if (n % i == 0) {flag = 0; //非素数break;}}return flag; }int main() {for (int i = 3; i <= 100; i++){if(is_prime(i)) printf("%-4d",i);}printf("\n");return 0; }
案例2
-
需求:输入四个整数,找到其中最大的数,用函数嵌套来实现,要求每次只能两个数比较。
-
代码:
//函数声明 int max_2(int, int); int max_4(int, int, int, int);/** * 2个整数求最大值 */ int max_2(int a, int b) {return a > b ? a : b;}/*** 4个整数求最大值*/ int max_4(int a, int b, int c, int d){// 写法1// int max;// max = max_2(a,b);// max = max_2(max,c);// max = max_2(max,d);// 写法2return max_2(a,b) > max_2(c,d) ? max_2(a,b) : max_2(c,d);}int main(int argc,char *argv[]){int a,b,c,d;printf("从控制台录入4个整数:\n");scanf("%d%d%d%d",&a,&b,&c,&d);// 接收最大值int max = max_4(a,b,c,d);printf("%d,%d,%d,%d中的最大值是%d\n",a,b,c,d,max)return 0;}
函数的递归调用
定义
**递归调用的含义:**在一个函数中,直接或间接调用了函数本身,就称之为函数的递归调用
//直接调用 推荐
a() → a();//间接调用
a() → b() → a();
a() → b() →.. → a();
递归调用的本质
递归调用是一种循环结构,它不同于我们之前学的while、for、do.while这样的循环结构,这些循环结构是借助于循环变量;而递归调用时利用函数自身实现虚幻结构,如果不加以控制,很容易产生死循环。
注意事项
①递归调用必须要有出口,一定要想办法终止递归(否则产生死循环)
②对终止条件的判断一定要放在函数递归之前。(先判断,再执行)
③进行函数的递归调用。
④函数递归的同时一定要将函数调用像出口逼近。
案例
案例1
-
需求:
递归案例-
有5个人坐在一起,
问第5个人多少岁?他说比第4个人大2岁。
问第4个人岁数,他说比第3个人大2岁。
问第3个人,又说比第2个人大2岁。
问第2个人,说比第1个人大2岁。
最后问第1个人,他说是10岁。
请问第5个人多大。
-
分析:
-
代码:
/*** 定义一个函数,求年龄 * @param n:第n个人 * @return 第n个人的年龄 */ int get_age(int n) {//创建一个变量,存储函数返回值,返回的是地n个人的年龄int age;//出口设置if (n == 1) //第一个人{age = 10;}else if (n > 1) //第2,3,4,5个人{age = age(n-1) + 2; //当前第n个人的年龄 = 第n - 1个人的年龄 + 2 }int main() {printf("%d\n",get_age(5));return 0; }
案例2
-
需求:求n的阶乘
-
分析:
-
代码
/** * 定义一个函数,求n的阶乘值 * @param n 上限 * @return 阶乘运算结果 */ size_t fac(int n) // size_t 就是unsigned long int的别名,这个是等价的 {// 定义一个变量,用作阶乘结果的接收size_t res;// 出口校验if(n < 0){printf("n的范围不能是0以下的数字\n");return -1;}else if(n == 0 || n == 1){res = 1; // 出口设置}else // n > 1{res = fac(n - 1) * n;}return res; }int main() {size_t n;printf("请输入一个整数:\n");scanf("%lu", &n);printf("%lu的阶乘结果是%lu\n", n, fac(n));return 0; }
排序算法:快速排序
快速排序是一种高效的分治(Divide and Conquer)排序算法,它的核心思想是通过选取一个基准值(pivot),将数组分为两个子数值:一个子数组的所有元素比基准值小,另一个子数组的所有元素比基准值大,然后递归地对子数维进行排序。
快速排序的基本步骤
1.选择基准值 :
- 从数组中选择一个元素作为基准值(pivot)。常见的选择方式包括:
- 第一个获最后一个元素(简单但可能效率不高,尤其是在已排序接近排序的数组中)。
- 随机选择一个元素(减少最坏情况概率)。
- 三数取中法(如第一个、中间、最后一个元素的中位数,提高分区均衡性)。
2.分区( Partition ) :
- 数组重新排列,使得
- 比基准值小的元素都在其左侧。
- 比基准值大的元素都在其右侧。
- 分区完成后,基准值的位置即为最终排序后的位置。
- (注:分区是快速排序的关键步骤,常见的实现有Lomuto分区和Hoare分区方案。)
3.递归排序(Recursion) :
- 对基准值左侧的子数组和右侧的子数组递归地应用快速排序。
- 递归的终止条件是子数组的长度为0或1(已有序)。
4.合并结果(Combine):
- 由于每次分区后基准值已位于正确位置,且左右子数组通过递归排序完成,因此无需显式合并操作,整个数组自然有序。
总结
快速排序,实际上就是通过一个基准值不断的拆分数组,一直到拆无可拆为止(就是拆成一个个的 数据元素)
代码
/**
* 定义一个函数,实现快速排序
* @param arr:待排序数组
* @param n: 数组长度
*/
void QSort(int arr[], int n) //函数传参,如果传递的是数组,形式参数收到的不是数组,而是数组的首地址(数组降级为指针)
{//出口限制:子数组长度小于等于1if (n < = 1) return;int i = 0, j = n - 1;// 定义的两个指针,i是从左往右,j是从右往左int pivot = arr[(n-1)/2]; // 选择中间元素元素作为基准值(可优化为随机或三位取中)//分区过程while(i < j) {// 从右向左找第一个小于等于基准值的元素(比基准值小的数)while(arr[j] > pivot && i < j) j--;// 从左向右找第一个大于基准值的元素(比基准值大的数)while(arr[i] <= pivot && i < j) i++;// 交换找到的两个元素if (i < j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 将基准值放到正确位置 (i = = j)arr[0] = arr[i];arr[i] = pivot;// 递归排序左半部分(<=基准)QSort(arr,i);// 递归排序右半部分 (>基准) QSort(arr+i+1, n - 1 - i);
}int main()
{int arr[] = {23,45,56,24,14,78,22,19};int n = sizeof(arr) / sizeof(arr[0]);QSort(arr, n);//打印排序结果for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){printf("%-4d",arr[i]);}printf("\n");return 0;
}
数组做函数参数
定义
当使用数组作为函数的实参时,形参应该使用数组形式或者指针变量来接收。需要注意的是:
1.这种传递方式并不是传递数组中的所有元素数据,而是传递数组首地址,此时数组降级为指针。
2.形参接收到这个地址后,形参和实参指向同一块内存空间。
3.因此,通过形参对数组元素的修改会直接影响到实参。
这种传递方式称为“地址传递”(或“指针传递”),它与“值传递”的不同:
- 值传递:传递数据的副本,修改形参不影响实参
- 地址传递:
- 地址传递:传递数据的地址,通过形参可以修改实参。“地址传递"是逻辑上的说法,强调传递的是地址,而不是数据本身。数据本质上还是值传递。
当使用数组作为函数的形参时,通常需要额外传递一个参数表示数组的元素个数。这是因为:
1.数组形参退化为指针 在函数参数传递时,数组名会退化为指向其首元素的指针(即 int arr[]
等价于 int *arr
),因此函数内部无法直接获取数组的实际长度。
2.防止越界访问 由于形参仅知道数组的首地址,而不知道数组的实际大小,如果不传递元素个数,函数内部可能因错误计算或循环导致 数组下标越界(访问非法内存),引发未定义行为(如程序崩溃、数据损坏)。
3.通用性 即使实参数组的声明长度固定(如 int a[10]
),函数仍应接收元素个数参数,因为函数可能需要处理不同长度的数组(例如动态数组或部分填充的数组)。
范例:
#include <stdio.h>// 定义一个函数,将数组作为参数
void fun(int arr[], int len) // 数组传参,形参只能接收到实参数组的首地址,并不是完整的数组
{for(inti=0;i< len; i++){printf("%-4d",arr[i]);}printf("\n");
}void main()
{int arr[]={11,22,33,44,55};int len=sizeof(arr)/sizeof(arr[0]);fun(arr, len);
}
但有一个例外,如果是用字符数组做形参,且实参数组中存放的是字符串数据(形参是字符数组,实参是字符串常量)。则不用表示数组个数的形参,原因是字符串本身会添加自动结束标志\0
,举例:
#include <sidio.h>//定义一个函数,传递一个字符串
void fun(char arr[])
{char c;int i = 0;while(c = arr[i] ! = '\0'){printf("%c",c);i++;}
}void main()
{fun("hello");
}
为什么 sizeof
不能用于形参数组?在函数内部, sizeof(arr)
返回的是指针大小(如4/8字节),而非数组总字节数。例如:
void printsize(int arr[]){printf("%zu\n",sizeof(arr)); // 输出指针大小(如 8),而非数组大小!
}
案例
案例1
-
需求
有两个数组a和b,各有5个元素,将它们对应元素逐个地相比(即a[0]与b[0]比,a[1] 与b[1]比……)。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大 于a数组中相应元素的数目(例如,a[i]>b]i]6次,b[i]>a[i] 3次,其中i每次为不同的值),则 认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的个数。
int a[10] = {12,12,10,18,5}; int b[10] = {111,112,110,8,5};
-
代码:
#include <stdio.h>#define LEN 5/** * 定义一个函数,实现两个数字的比较 * @param x,y 参与比较的两个数字 * @return x>y --> 1, x < y --> -1, x == y --> 0 */ int get_large(int x, int y) {int flag = 0;if(x > y) flag = 1;else if(x < y) flag = -1;return flag; }int main() {//定义啊a,b两个测试数组int a[LEN] = {12,12,10,18,5};int b[LEN] = {111,112,110,8,5};int i, max = 0, min = 0, k = 0;// 遍历数组,进行比较for (i = 0; i < LEN; i++){//同一位置两个数比较int res = get_large(a[i],b[i]);if(res == 1) max++;else if (res == -1) min++;else k++;}printf("max=%d,min=%d,k=%d\n",max,min,k);return 0; }
案例2:
-
需求:编写一个函数,用来分别求数组score-1(有5个元素)和数组score_2(有10个元素)各元素的平均值。
-
代码:
/** * 定义一个函数,求数组中元素的平均值 * @param scores 成绩数组 * @param len 数组大小 * @return 平均值 */ float get_avg(float scores[],int len) {int i;float aver,sum = scores[0]; // 平均分,总分// 遍历数组for(i = 1; i < len; i++){sum += scores[i];}//求平均分aver = sum / len;return aver; }int main() {//测试数组float scores1[] = {66,78,86,56,46};float scores2[] = {77,88,98,87,67,65,55,45,67,78};printf("%6.2f,%6.2f\n",get_avg(scores1,sizeof(scores1)/sizeof(scores1[0])),get_avg(scores2,sizeof(scores2)/sizeof(scores2[0])));return 0; }
相关文章:
C 语言学习笔记(函数2)
内容提要 函数 函数的调用函数的声明函数的嵌套关系函数的递归调用数组做函数参数 函数 函数的调用 调用方式 ①函数语句: test (); //对于无返回值的函数,直接调用 int res max(2,4); //对于有返回值的函数,一般需要在主调函…...
Spring的后置处理器是干什么用的?扩展点又是什么?
Spring 的后置处理器和扩展点是其框架设计的核心机制,它们为开发者提供了灵活的扩展能力,允许在 Bean 的生命周期和容器初始化过程中注入自定义逻辑。 1. 后置处理器(Post Processors) 后置处理器是 Spring 中用于干预 Bean 生命…...
Java大数据机器学习模型在金融衍生品风险建模中的创新实践
摘要 本文深入探讨Java技术栈在大数据与机器学习领域的独特优势,及其在金融衍生品风险建模中的突破性应用。通过分析分布式计算框架与机器学习库的整合方案,揭示Java在构建复杂金融风险模型时的技术可行性。结合信用违约互换(CDS)…...
leetcode3403. 从盒子中找出字典序最大的字符串 I-medium
1 题目:从盒子中找出字典序最大的字符串 I 官方标定难度: 给你一个字符串 word 和一个整数 numFriends。 Alice 正在为她的 numFriends 位朋友组织一个游戏。游戏分为多个回合,在每一回合中: word 被分割成 numFriends 个 非空…...
Effective C++阅读笔记(item 1-4)
文章目录 理解模板类型推导理解auto类型推导理解decltype学会查看类型推导结果 理解模板类型推导 c的auto特性是建立在模板类型推到的基础上。坏消息是当模板类型推导规则应用于auto环境时,有时不如应用于template时那么直观。我们可能很自然的期望T和传递进函数的…...
python自学笔记4 控制结构
条件语句 略 循环语句 略 range函数 enumerate() 函数 可以将一个可迭代对象转换为一个由索引和元素组成的枚举对象。 索引的起始编号是0,也可以传入第二参数来指定其起始编号 zip函数 打包范围以两者最短的长度为准 以两者较长的长度为准的函数为itertool…...
VTK|显示三维图像的二维切片
参考: VTK显示三维图像的二维切片 文章目录 实现类头文件实现类源文件如何调用项目git链接 以中心点坐标横切面 实现类头文件 /*** file MeshSliceController.h* brief 该头文件定义了 MeshSliceController 类,用于显示切面图。* details 该类负责处理与…...
day 30
模块和库的导入 导入官方库 标准导入:导入整个库 直接使用import语句 # 方式1:导入整个模块 import mathprint("方式1:使用 import math") print(f"圆周率π的值:{math.pi}") print(f"2的平方根…...
Linux云计算训练营笔记day11【Linux CentOS7(cat、less、head、tail、lscpu、lsblk、hostname、vim、which、mount、alias)】
Linux云计算 云计算是一种服务,是通过互联网按需提供计算资源的服务模式 程序员写代码的,部署上线项目 买服务器(一台24小时不关机的电脑,为客户端提供服务) 20万 买更多的服务器 Linux(命令) windows(图形化) 就业岗位: 云计算工程师 li…...
使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战
使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战 前言项目概述技术栈代码分析1. 导入必要的库2. 初始化FastAPI应用3. 定义请求模型4. 核心爬虫功能4.1 URL验证和准备4.2 设置HTTP请求4.3 发送请求和解析HTML4.4 提取文章内容4.5 保存结果和返回数据 5. AP…...
光纤克尔非线性效应及其在光通信系统中的补偿教程-3.2 克尔效应
需要结合上一期的文章,光纤克尔非线性效应及其在光通信系统中的补偿教程-3.1 非线性极化性 光纤中的非线性效应源于三阶感性 χ ( 3 ) \chi^{(3)} χ(3)。 光纤中非线性效应的主要来源之一是由 χ ( 3 ) \chi^{(3)} χ(3)引起的非线性折射,即克尔效应&a…...
【Tools】VMware Workstation 17.6 Pro安装教程
00. 目录 文章目录 00. 目录01. VMware Workstation 17.6简介02. VMware Workstation 17.6新功能03. VMware Workstation 17.6特性04. VMware Workstation 17.6下载05. VMware Workstation 17.6安装06. VMware Fusion 和 Workstation免费07. 附录 01. VMware Workstation 17.6简…...
Unity10分钟回顾指南
🎮 Unity10分钟回顾指南 欢迎踏上Unity场景创作之旅!本教程将带你从零开始,循序渐进地掌握Unity场景制作的全部技能。无论你是游戏开发爱好者还是专业开发者,这份指南都将成为你的得力助手。 第一章:Unity基础认知 1.…...
SeleniumBase - 多合一浏览器自动化框架
手动编写Selenium脚本,繁琐且常遇“掉坑”?SeleniumBase来救场!这款基于Selenium的Python框架集测试、爬虫、RPA于一体,支持多浏览器、并行测试、CAPTCHA绕过和智能等待,堪称Web自动化的“瑞士军刀”。不少行业大佬盛赞…...
【人工智能导论】第2.3章知识表示、确定性推理
1、李明的父亲是教师,用谓词逻辑可以表示为Teacher(father(Liming))这里father(Liming)是( ) A、常量 LIMING B、变元 X未知的可取多个值的对象 C、函数 X的父亲 D、一元…...
【QT】一个界面中嵌入其它界面(一)
在 Qt 中嵌入其他界面通常可以通过以下几种方式实现。以下是详细的步骤说明和示例代码: 方法 1:直接通过布局嵌入子部件 如果目标界面是 QWidget 的子类,可以直接将其添加到父窗口的布局中。 步骤: 创建子界面类: //…...
[学习]POSIX消息队列的原理与案例分析(完整示例代码)
POSIX消息队列的原理与案例分析 文章目录 POSIX消息队列的原理与案例分析摘要关键词一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究内容与方法 二、POSIX消息队列的基本原理2.1 消息队列概述2.2 POSIX消息队列的特性2.2 POSIX消息队列的特性2.3 POSIX消息队列的内部机制…...
IDC数据中心动力环境监控系统解决方案
文档围绕 IDC 数据中心动力环境监控系统解决方案展开,先介绍数据中心分级,包括国家规范的 A/B/C 级和美国 TIA-942 标准的 Tier1-Tier4 级,强调动环监控对数据中心的重要性。接着阐述系统架构,涵盖底端设备层、采集层、接入层、服务层、应用层,具备数据采集、分析、可视化…...
WebSphere Application Server(WAS)8.5.5教程第五讲
续前篇! 一、Web 应用部署与类加载策略 Web 应用部署与类加载策略是 WebSphere Application Server(WAS)日常管理的核心部分,尤其对运行大型企业级 Java 应用(如 BAW)非常关键。本讲将分两部分讲解&#…...
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
在runtime中有runtime.LockOSThread 和 runtime.UnlockOSThread 两个函数,这两个函数有什么作用呢?我们看一下标准库中对它们的解释。 runtime.LockOSThread // LockOSThread wires the calling goroutine to its current operating system thread. // T…...
计算圆周率 (python)
使用模特卡罗方法(模拟法),模拟撒点100000次,计算圆周率π 输入格式: 一个整数,表示随机数种子 输出格式: 计算的π值,结果小数点后保留5位数字 输入样例: 在这里给出一组输入。例如: 10…...
机器学习EM算法原理及推导
在机器学习与统计推断中,我们经常会遇到“缺失数据”或“潜在变量”(latent variables)的情形:样本并非完全可观测,而部分信息被隐藏或丢失。这种情况下,直接对观测数据做极大似然估计(Maximum …...
Linux项目部署全攻略:从环境搭建到前后端部署实战
Linux项目部署全攻略:从环境搭建到前后端部署实战 注:根据黑马程序员javawebAI视频课程总结: 视频地址 详细讲义地址 一、Linux基础入门:为什么选择Linux? 要成为一名Java开发工程师,掌握Linux是企业级…...
人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
人工智能正在以前所未有的速度改变着医疗健康领域,从影像诊断到药物研发,从医院管理到远程医疗,AI 技术已渗透到医疗服务的各个环节。本文将深入探讨人工智能如何赋能医疗健康产业,分析其在医学影像、临床决策、药物研发、个性化医…...
ubuntu系统 | dify+ollama+deepseek搭建本地应用
1、安装 Ollama 下载并安装 Ollama (llm) wangqiangwangqiang:~$ curl -fsSL https://ollama.ai/install.sh | bash >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle0.3% curl -fsSL https://ollama.ai/install.sh (下…...
NHANES最新指标推荐:C-DII
文章题目:Non-linear relationship between the childrens dietary inflammatory index and asthma risk: identifying a critical inflection point in US children and adolescents DOI:10.3389/fnut.2025.1538378 中文标题:儿童饮食炎症指…...
【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
一、源码 该代码定义了一个类型系统中的零类型Z0,并为其实现了基本的算术运算(加法、减法、乘法、除法)。这是一个典型的类型级编程示例,使用Rust的类型系统在编译期进行数学运算。 //! 零类型(Z0)及其算术运算实现 //! //! 本…...
【大模型面试每日一题】Day 23:如何设计一个支持多模态(文本+图像)的大模型架构?
【大模型面试每日一题】Day 23:如何设计一个支持多模态(文本图像)的大模型架构? 📌 题目重现 🌟🌟🌟 面试官:我们需要构建一个同时处理文本和图像的多模态大模型&#…...
BUUCTF PWN刷题笔记(持续更新!!)
ciscn_2019_c_1 64位,没有开启保护。点进去没发现明显的漏洞函数,考虑泄露libc基地址的rop构造。先看看有多少gadget 估计也够用了。puts函数只接受一个参数,观看汇编看看用的哪个寄存器传输的参数。 用的是edi。但是我们怎么找到so的版本呢…...
Tare使用MCP|Win11安装UV
servers/src/git at main modelcontextprotocol/servers GitHub 进入Installation | uv 打开powershell 运行 (如果要删除 文章中也有删除的链接) powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" …...
小白的进阶之路-人工智能从初步到精通pytorch的基本流程详解-1
Pytorch大致流程一览表: 主题内容1 准备数据数据几乎可以是任何东西,但在开始之前,我们将创建一条简单的直线2 建立模型在这里,我们将创建一个模型来学习数据中的模式,我们还将选择损失函数,优化器并构建一个训练循环。3 拟合模型我们已经有了数据和模型,现在让模型尝试…...
linux kernel 编译
1. 获取内核源码 从官方仓库获取: 访问kernel.org下载所需版本的Linux内核源码压缩包(如linux-x.y.z.tar.xz)。或者使用Git克隆特定版本: bash git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitcd linux-stablegit checkout vX.Y.Z # 切…...
【氮化镓】偏置对GaN HEMT 单粒子效应的影响
2025年5月19日,西安电子科技大学的Ling Lv等人在《IEEE Transactions on Electron Devices》期刊发表了题为《Single-Event Effects of AlGaN/GaN HEMTs Under Different Biases》的文章,基于实验和TCAD仿真模拟方法,研究了单粒子效应对关断状态、半开启状态和开启状态下AlG…...
Assistants API
一、前言 0.1、从轰动一时的 OpenAI DevDay 说起 2023 年 11 月 6 日,OpenAI DevDay 发表了一系列新能力,其中包括:GPT Store 和 Assistants API 这一波操作一度被认为是创业公司终结者 0.2、GPTs 和 Assistants API 本质是降低开发门槛 可操控性和易用性之间的权衡与折中…...
AcWing 223. 阿九大战朱最学——扩展欧几里得算法
题目来源 223. 阿九大战朱最学 - AcWing题库 题目描述 自从朱最学搞定了 QQ 农场以后,就开始捉摸去 QQ 牧场干些事业,不仅在自己的牧场养牛,还到阿九的牧场放牛! 阿九很生气,有一次朱最学想知道阿九牧场奶牛的数量…...
开发指南116-font-size: 0的使用
平台前台的css样式里有几个地方用到了font-size: 0,这是个使用小技巧。原理说明:font-size 属性用于定义元素中文本的大小。当设置 font-size: 0 时,意味着该元素内的文本将不占据空间。当元素的 font-size 设置为零时,该元素内的…...
算法-数对的使用
1、数对可用于数组排序中,并且可记忆化排序前的元素下标 #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10; pair<int, int> a[N]; void solve() {ll n;cin …...
EmoBox:我与 CodeBuddy 共创的 Emoji 表情分类小工具
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近我萌生了一个想法,想做一个小而美的工具——一个叫「EmoBox」的 emoji 表情分类应用࿰…...
力扣HOT100之二叉树:199. 二叉树的右视图
这道题没啥好说的,首先定义一个向量来保存每一层的最后一个元素,直接用层序遍历(广度优先搜索)遍历二叉树,然后将每一层的最后一个元素加入到这个向量中即可。属于是二叉树层序遍历的模板题。 /*** Definition for a …...
力扣992做题笔记
左神做法的理论依据 我们可以通过 集合的包含关系 和 具体示例枚举 来直观理解这一推导过程。以下结合题目示例 1 进行详细说明: 示例 1 分析 输入:nums [1,2,1,2,3], k 2 目标:计算恰好包含 2 种不同整数 的子数组个数。 步骤一集合 A…...
特征值与特征向量的计算——PCA的数学基础
特征值与特征向量 定义 令 A {\bm A} A为 n n n \times n nn矩阵,如果存在非零向量 x {\bm x} x使得 A x λ x (1) {\bm A}{\bm x} \lambda {\bm x}\tag{1} Axλx(1) 成立,则称数 λ \lambda λ是矩阵 A {\bm A} A的特征值,称非零向量 x…...
vue2.0 的计算属性
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
【数根】2022-1-24
缘由程序设计 -- 数根(2)-编程语言-CSDN问答 void 数根() {//缘由https://ask.csdn.net/questions/7635593?spm1005.2025.3001.5141std::string n;int m 0, a 0;std::cin >> n;while (n[a] ! \0)m n[a] - 0;a 0;while (m)a m - m / 10 * 10…...
【Android】一键创建Keystore + Keystore 参数说明 + 查询SHA256(JDK Keytool Keystore)
一键创建 Android Keystore 的实用方法与参数详解 在 Android 应用开发与发布中,**Keystore(签名文件)**扮演着至关重要的角色。本文将介绍如何通过 .bat 脚本一键创建 Keystore 文件,并详细讲解每一个参数的含义,帮助…...
laravel 通过Validator::make验证后,如何拿到验证后的值
在 Laravel 中,通过 Validator::make 创建的验证器实例验证数据后,可以通过以下方式获取验证后的值: 使用 validate() 方法 调用验证器实例的 validate() 方法,会返回经过验证的数据数组。如果验证失败,该方法会抛出 V…...
centos把jar包配置成服务并设置开机自启
1.准备好jar包,启动路径,日志路径 2.编写启动脚步 vim /etc/systemd/system/test.service [Unit] Descriptionlapis Requiresnetwork.target remote-fs.target ##启动优先级,在下面的服务之后启动 Afterkafka.service zookeeper.service n…...
CentOS相关操作hub(更新中)
CentOS介绍: CentOS(Community Enterprise Operating System)是基于 Red Hat Enterprise Linux(RHEL)源代码编译的开源企业级操作系统,提供与 RHEL 二进制兼容的功能 完全兼容 RHEL,可直接使用…...
数据库(一):分布式数据库
定义 分布式数据库(Distributed Database) 是指: 数据分布在多个物理位置,但对用户透明,表现为一个统一逻辑数据库的系统。 结构模式(三层模式扩展) 层次作用对应实体用户层提供统一视图&…...
人工智能(AI)与BIM:建筑业创新实践的深度融合
一、BIM在建筑领域的发展现状与挑战 作为建筑数字化的核心技术,BIM通过三维模型集成建筑全生命周期信息,已成为工程设计、施工及运维的标准工作流程。当前,BIM在碰撞检测、施工模拟、成本管控等场景的应用已较为成熟,但行业仍面临…...
FIR数字滤波器设计与实现
低通滤波器的设计与实现 打开Matlab ,运行命令filterDesigner,选择FIR 最小二乘或者其它,设置采样频率,和低通滤波器截止频率。点击设计滤波器,如图1: 点击目标生成.C头文件,滤波器系数如下: …...