当前位置: 首页 > article >正文

9-函数的定义及用法

一.前言

      C 语⾔强调模块化编程,这⾥所说的模块就是函数,即把每⼀个独⽴的功能均抽象为⼀个函数来实现。从⼀定意义上讲,C 语⾔就是由⼀系列函数串组成的。 我们之前把所有代码都写在 main 函数中,这样虽然程序的功能正常实现,但显得杂乱⽆章,代码可读性、可维护性较差。学完本节之后,应把每个具体的独⽴功能单位均抽象为⼀个函数,在 main 函数中 调⽤各个函数。

    1.概念: 

     函数是⼀系列 C 语⾔语句的集合, 为了完成某个可能会重复使⽤的功能, ⽽封装起来的代码。 

     设计的好处: 实现模块化的编程思想,提⾼程序的可读性。

     函数设计要求: ⻅名知意。

示例代码:

   2.使用方法:

       方法1:先声明在定义

返回值类型 函数名(类型 参数1,类型 参数2….);    // 函数的声明int main(){函数名(参数1,参数2,参数3);                //  函数的调用return 0;}返回值类型 函数名(类型 参数1,类型 参数2….)     // 函数的定义
{C语⾔代码;return 数据;
}

示例代码:

#include<stdio.h>
void printf_star();
/// *
/// **
/// ***
int main()                        // 入口
{for(int k = 1; k <= 3; k++){printf_star();                 // 函数的调用}return 0; 
}   /// void表示返回空void printf_star()               // 函数的定义{for(int i = 1; i <= 3; i++)     // i代表行数{for(int j = 1;j <= i; j++)  //  每行输出的星星个数{printf("*");}printf("\n");}return 0;}

练习:

1. 设计⼀个 void do_sum() 函数,要求函数内部⽆参数和返回值,内部定义⼀个变量 int m, 要求⽤户从键盘输⼊⼀个数据赋值给 m 。

 判断 m 的值 , 若是 m 为奇数,输出 1 + 3 + 5 + 7 + 9 +...+m 的和 . 若是 m 为偶数,输出 0 + 2 + 4 + 6 + 8 +...+m 的和 . 

#include <stdio.h>void do_sum() {int m;printf("请输入一个整数:");scanf("%d", &m);int sum = 0;if (m % 2 != 0) {// 计算奇数和 1+3+5+...+mfor (int i = 1; i <= m; i += 2) {sum += i;}} else {// 计算偶数和 0+2+4+...+mfor (int i = 0; i <= m; i += 2) {sum += i;}}printf("计算结果为:%d\n", sum);
}int main() {do_sum();return 0;
}

2. 设计⼀个 void do_Result() 函数,要求函数内部定义 int a,b 两个变量,然后从键盘输⼊ 2 个整数赋值给 a,b ,并输出 (a + b) / 2 的值。

#include <stdio.h>void do_Result() {int a, b;printf("请输入两个整数(用空格分隔):");scanf("%d %d", &a, &b);int result = (a + b) / 2;printf("计算结果为:%d\n", result);
}int main() {do_Result();return 0;
}

二.全局 静态 局部变量

1.全局变量:

全局变量: 在函数外部定义的变量,我们叫做全局变量.特点:(1) 在本⽂件中的任何函数中都可以使⽤。   ----作⽤域(2) 在定义变量的时候,系统会申请内存空间,main()函数结束的时候,系统会回收全局变量对应的内存空间.   ----⽣命周期(3) 全局变量未初始化,值默认为0

2.局部变量:

局部变量: 在函数内部定义的变量,我们叫做局部变量。特点:(1) 只能在定义它的那个函数内部使⽤,其他位置不能使⽤。---作⽤域(2) 调⽤函数时,运⾏在定义变量代码的时候,系统会申请内存空间, 当定义该变量的函数调⽤结束后,系统会回收局部变量对应的内存空间. ----⽣命周期(3) 局部变量未初始化,值默认为随机值。

示例代码:

#include<stdio.h>int global = 20;void do_global(){global ++;printf("global = %d\n",global);}void do_local(){int t = 10;t++;printf("t = %d\n", t);return ;}int main()
{do_global();do_global();do_global();printf("======================\n");global++;printf("g = %d\n",global);do_local();do_local();do_local();return 0;
}

3.静态局部变量

静态局部变量格式: static  数据类型 变量名;static int c;特点:
(1)静态局部变量,可以改变原来变量的⽣命周期,当定义该变量的函数调⽤结束后,系统不会回收对应的内存空间,当main()函数结束后, 内存空间才会被回收.(2)只能在定义它的那个函数内部使⽤,其他位置不能使⽤。---作⽤域(3)静态局部变量未初始化,值默认为0

示例代码:

#include <stdio.h>void do_local(){static int t = 10;t++;printf("t = %d\n",t);}int main(){do_local();do_local();do_local();return 0;}

练习:

定义全局变量 global_data = 0; 设计⽆参数的函数 global_calc() ,在这个函数内部 要求⽤户从键盘输⼊⼀个数据赋值给 global_data, 然后要求 该函数输出,从 1~global_data 之间所有能被 7 整除的数据。 main 函数来调⽤以下 global_calc() 这个函数。

#include <stdio.h>int global_data = 0;  // 定义全局变量void global_calc() {printf("请输入一个正整数:");scanf("%d", &global_data);if(global_data < 7) {printf("没有符合条件的数字\n");return;}printf("能被7整除的数字:\n");for(int i = 7; i <= global_data; i++) {if(i % 7 == 0) {printf("%d ", i);}}printf("\n");
}int main() {global_calc();return 0;
}

三.函数传参之值传递

本质: 函数传参的本质, 变量之间的赋值操作。
功能 :在传递变量中保存的数据。核⼼思想是传递什么样⼦类型的变量。
在接收的位置,就定义什么样类型的变量来接受。

示例代码:

#include<stdio.h>int do_calc(const int x,const int y){int sum = 0;printf("x = %d y = %d\n", x,y);sum = x + y;return sum;}
int main()
{int a = 0,b = 0;int t = 0;printf("please input two data :");scanf("%d%d",&a,&b);t = do_calc(a,b);printf("a + b =%d\n", t);t = t*100-8;printf("expression result = %d\n",t);return 0;
}

运行结果:

四.函数传参之地址传递

功能:我们在使⽤函数传参的时候,除了传递普通的变量外,在某些时刻不得不传递变量的地址。
传递变量的地址,我们在使⽤的时候,就只能通过指针来接收了。好处:传递变量的地址,通过指针接收,可⽤通过指针修改原变量的值。

示例代码:

#include<stdio.h>void change_value(int *x, int*y)
{int t;t = *x;*x = *y;*y = t;return ;
}void do_calc(int x, int y,int *m,int *n)
{int sum1 = 0,sum2 = 0;sum1 = x+y;sum2 = x-y;*m = sum1;*n = sum2;return ;
}int main()
{int a = 0,b = 0;int ret1 = 0,ret2 = 0;int t = 0;printf("please input two data :");scanf("%d%d",&a,&b);do_calc(a,b,&ret1,&ret2);printf("a+b=%d\n",ret1);printf("a-b=%d\n",ret2);return 0;
}

练习:

1.main() 函数定义 4 个变量, int a,b,max_value,sum. 要求⽤户从键盘输⼊2 个数据赋值给 a和b 

2. 设计⼀个叫做 calc_data() 函数,⾃定义返回值和参数,要求该函数中 求出 a 和 b 中的最⼤值,函数调⽤结束后,要求给 main 函数 max_value 存储的 是两个数中较⼤的值。在求两个数的和,要求给 main 函数 sunm 存储的两个 数据的和。

3. 在 main 函数中打印 max_value 和 sum 的值。

#include <stdio.h>void calc_data(int x, int y, int *max_ptr, int *sum_ptr) {*max_ptr = (x > y) ? x : y;*sum_ptr = x + y;
}int main() {int a, b, max_value, sum;printf("请输入两个整数:");scanf("%d %d", &a, &b);calc_data(a, b, &max_value, &sum);printf("最大值:%d\n", max_value);printf("两数之和:%d\n", sum);return 0;
}

五.. 函数传参之数组

本质 :函数传参的本质是变量间的赋值操作,数组名本质是⾸元素的地址,传递数组的⾸地址,我 们定义指针来接收接⼝。

示例代码:

#include<stdio.h>void input_array(int *p,const int plen){int i = 0;printf("please input %d data:",plen);for(i = 0; i < plen; i++){scanf("%d",&p[i]);}}void output_array(int *p, const int plen){int i = 0;for(i = 0; i < plen; i++){printf("%d\n",&p[i]);}}int main()
{int a[5] = {0};int len = sizeof(a) / sizeof(a[0]);input_array(a,len);output_array(a,len);return 0;
}

六.字符串相关操作函数1

1.strcpy   ---- 字符串拷贝函数

头文件: #include <string.h>strcpy (char dest[], char src[])   ---------string copy功能:把src数组中'\0'之前的所有字符,连同'\0'一起拷贝到dest中。要求在定义dest时要足够大参数:dest--------目标数组src --------源数组---------[数组首地址或字符串]例如:char buf [20] = {0};strcpy(buf,"hello");printf("buf = %s\n", buf);

代码示例:

#include<stdio.h>
#include<string.h>int main()
{char buf[20] = {'h','e','l','l','o','\0'};int i = 0;strcpy(buf,"QQ");for(i = 0; i < 20; i++){printf("%c: %d\n",buf[i],buf[i]);}    printf("buf = %s\n",buf);return 0;
}

2.strcat

头⽂件: #include <string.h>strcat(char dest[], char src[]);功能:把src数组'\0'之前的字符串追加到dest字符串后,若是dest中有'\0',会把dest中的'\0'给覆盖掉,然后组成的dest字符串会重新添加'\0'参数:例如:@ dest      ⽬标数组@ src       源数组    [字符数组或字符串]char buf[] = "hello";strcat(buf," world"); 

代码示例:

#include<stdio.h>
#include<string.h>int main()
{char word[20];char explain[20];char sql[50];printf("please input you select word:");gets(word);printf("please input word explain:");gets(explain);strcpy(sql,word);strcat(sql,explain);printf("%s\n",sql);return 0;
}

七.字符串相关操作函数 2

   1.strlen字符串长度计算函数--------不算\0

   

头文件: #include <stdio.h>int strlen(const char s[]);功能:计算s数组中第一个'\0'前字符的个数,并返回参数:@  s 目标数组,存放字符串
返回值:返回计算的字符个数例如:char buf[] = "hello";int len = strlen(buf);printf("len = %d\n",len);

代码示例:

2.strcmp

 头文件:#include <string.h>int strcmp(char s1[], char s2[]);功能:  对s1和s2字符串中的每个字符逐个⽐较若是s1中某个字符>s2中的某个字符,则返回⼤于0的数。
若是s1中某个字符<s2中的某个字符,则返回⼩于0的数。若是当前s1和s2的字符相等,则⽐较后⼀个字符。若是完全相等,返回0参数:@ 待⽐较的数组s1   [字符串或字符数组]@ 待⽐较的数组s2   [字符串或字符数组]返回值:
在gcc的32bit编译器下,返回如下值:若是s1 > s2 ,返回1若是s1 == s2,返回0若是s1 < s2 ,返回-1char buf1[] = "hello";
char buf2[] = "heltt";
ret = strcmp(buf1,buf2);

示例代码:

#include <stdio.h>
#include <string.h>  
int main()
{char buf1[20];char buf2[20];int ret = 0;printf("please input string buf1 : ");gets(buf1);printf("please input string buf2 : ");gets(buf2);ret = strcmp(buf1,buf2);printf("ret = %d\n",ret);if(ret > 0){printf("buf1 > buf2");        }else if(ret == 0){printf("buf1 == buf2");        }else if(ret < 0){printf("buf1 < buf2");        }putchar('\n');return 0;
}

运行结果:

练习:

char buf[] = "I Love China";

(1) 设计⼀个 count_uppercase_character() 函数,⾃⼰定义参数和返回值,要求 统计上述数组中⼤写字符的个数。

(2) 调⽤⾃⼰设计的函数,并输出。

代码示例:

#include <stdio.h>
#include <ctype.h>// 统计大写字母数量的函数
int count_uppercase_character(const char *str) {int count = 0;while (*str) {if (isupper(*str)) {count++;}str++;}return count;
}int main() {char buf[] = "I Love China";int result = count_uppercase_character(buf);printf("大写字母数量:%d\n", result);  // 输出:3return 0;
}

八.指针函数

本质:是⼀个函数,只不过返回值是⼀个地址。思考:如何定义⼀个指针函数?返回值类型 * 函数名称 (类型 1 参数 1, 类型 2 参数 2 ,…);例如:
int * fun (int a, int b);(也就是说,指针函数其实和普通的函数⼀样的,只不过返回值是⼀个指针类型。
并且它必须⽤同类型的指针变量来接受)

练习:

(1) 要求⼤家是设计⼀个 design_arary() 函数 , ⾃⼰定义返回值和参数。 要求 design_array() 函数中定义⼀个 ,static char a[100] = {0};, 然后 把数组⾸地址和⻓度返回。

(2) 设计⼀个 input_array() 函数,⾃定义返回和参数,要求⽤户从键盘 输⼊任意的字符串,存放到 a 数组中

(3) 设计⼀个 output_array() 函数,要求输出 a 数组中的每个⼀字符, 以空格作为区分 . w u h a n s h a n g h a i

(4) 设计⼀个 cout_space() 函数,⾃定义返回和参数,要求⽤户统计数组 a 中⽤户 输⼊的空格个数,并返回值给 main 函数。

(5)main ()函数调⽤以上函数,并输出空格个数。

代码示例:

#include <stdio.h>
#include <string.h>// (1) 定义静态数组并返回信息
char* design_array(int *length) {static char a[100] = {0};*length = 100;return a;
}// (2) 输入字符串到数组
void input_array(char *arr) {printf("请输入字符串:");fgets(arr, 100, stdin);arr[strcspn(arr, "\n")] = '\0'; // 去除换行符
}// (3) 输出字符用空格分隔
void output_array(const char *arr) {for(int i = 0; arr[i] != '\0'; i++) {printf("%c ", arr[i]);}printf("\n");
}// (4) 统计空格数量
int cout_space(const char *arr) {int count = 0;for(int i = 0; arr[i] != '\0'; i++) {if(arr[i] == ' ') count++;}return count;
}int main() {int len;char *arr = design_array(&len);input_array(arr);printf("\n字符输出:");output_array(arr);int spaces = cout_space(arr);printf("空格数量:%d\n", spaces);return 0;
}

九.函数指针

1.方法1

函数指针:本质是⼀个指针,只不过使⽤来函数的地址的。 通过函数指针来调⽤,我们需要的函数。数据类型(*指针变量名)(类型1  参数1,类型2 参数2...);   注:(1)函数名代表函数的⾸地址(2)上述中的参数1,参数2.。。等可省略例如:
int (*funp)(int ,int) = add; add(10,20);  
funp(10,20);
#include<stdio.h>int add(int a,int b)
{return a + b;
}///  函数名就代表函数的地址
int sub(int a,int b)
{return a - b;
}int main(int argc,const char*argv[])
{int ret = 0;ret = add(10,20);printf("a+b=%d\n",ret);printf("add=%p\n",add);printf("=============\n");int(*funp)(int , int) = add;printf("funp = %p\n",funp);ret = funp(10,20);printf("a+b=%d\n",ret);funp = sub;printf("a-b=%d\n",ret);return 0;
}

2.方法2

概念:

    回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的地址作为参数传递给另⼀个函数,在另⼀个函数中通过指针来接收 , 通过指针来调⽤其函数,我们就说这是回调函数。

  

#include <stdio.h>int add(int a,int b){return a + b;}int sub(int a,int b){return a - b;}int calc(int a,int b,int (*pfun)(int,int)){int result;result = pfun(a,b);return result;}int main(){int result = 0;result = calc(20,10,add)printf("a + b = %d\n",result);result = calc(20,10,sub)printf("a - b = %d\n",result);return 0;}

相关文章:

9-函数的定义及用法

一.前言 C 语⾔强调模块化编程&#xff0c;这⾥所说的模块就是函数&#xff0c;即把每⼀个独⽴的功能均抽象为⼀个函数来实现。从⼀定意义上讲&#xff0c;C 语⾔就是由⼀系列函数串组成的。 我们之前把所有代码都写在 main 函数中&#xff0c;这样虽然程序的功能正常实现&…...

高清视频会议系统BeeWorks Meet,支持私有化部署

在数字化办公时代&#xff0c;视频会议已成为企业协作的关键工具。然而&#xff0c;随着信息安全意识的不断提高&#xff0c;传统的公有云视频会议软件已难以满足企业对数据安全和隐私保护的严格要求。BeeWorks Meet凭借其独特的私有化部署模式、强大的功能集成以及对国产化的适…...

用HTML和CSS绘制佩奇:我不是佩奇

在这篇博客中&#xff0c;我将解析一个完全使用HTML和CSS绘制的佩奇(Pig)形象。这个项目展示了CSS的强大能力&#xff0c;仅用样式就能创造出复杂的图形&#xff0c;而不需要任何图片或JavaScript。 项目概述 这个名为"我不是佩奇"的项目是一个纯CSS绘制的卡通猪形象…...

彩讯携Rich AICloud与一体机智算解决方案亮相中国移动云智算大会

2025年4月10日&#xff0c;2025中国移动云智算大会在苏州盛大开幕&#xff0c;本次大会以“由云向智 共绘算网新生态”为主题&#xff0c;与会嘉宾围绕算力展开重点探讨。 大会现场特设区域展出各参会单位的最新算力成果&#xff0c;作为中国移动重要合作伙伴&#xff0c;彩讯…...

BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调

本节代码将使用 transformers 库加载预训练的BERT模型和分词器&#xff08;Tokenizer&#xff09;&#xff0c;并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…...

安卓开发提示Android Gradle plugin错误

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle&#xff08;如果有独立配置&#xff09;&#xff1a;…...

声学测温度原理解释

已知声速&#xff0c;就可以得到温度。 不同温度下的胜诉不同。 25度的声速大约346m/s 绝对温度-273度 不同温度下的声速。 FPGA 通过测距雷达测温度&#xff0c;固定测量距离&#xff0c;或者可以测出当前距离。已知距离&#xff0c;然后雷达发出声波到接收到回波的时间&a…...

Cuto壁纸 2.6.9 | 解锁所有高清精选壁纸,无广告干扰

Cuto壁纸 App 提供丰富多样的壁纸选择&#xff0c;涵盖动物、风景、创意及游戏动漫等类型。支持分类查找与下载&#xff0c;用户可轻松将心仪壁纸设为手机背景&#xff0c;并享受软件内置的编辑功能调整尺寸。每天更新&#xff0c;确保用户总能找到新鲜、满意的壁纸。 大小&am…...

C语言 AI 通义灵码 VSCode插件安装与功能详解

在 C 语言开发领域&#xff0c;一款高效的编码助手能够显著提升开发效率和代码质量。 通义灵码&#xff0c;作为阿里云技术团队打造的智能编码助手&#xff0c;凭借其强大的功能&#xff0c;正逐渐成为 C 语言开发者的新宠。 本文将深入探讨通义灵码在 C 语言开发中的应用&am…...

二分查找5:852. 山脉数组的峰顶索引

链接&#xff1a;852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 事实证明&#xff0c;二分查找不局限于有序数组&#xff0c;非有序的数组也同样适用 二分查找主要思想在于二段性&#xff0c;即将数组分为两段。本体就可以将数组分为ar…...

1.2 测试设计阶段:打造高质量的测试用例

测试设计阶段&#xff1a;打造高质量的测试用例 摘要 本文详细介绍了软件测试流程中的测试设计阶段&#xff0c;包括测试用例设计、测试数据准备、测试环境搭建和测试方案设计等内容。通过本文&#xff0c;读者可以系统性地了解测试设计的方法和技巧&#xff0c;掌握如何高效…...

【模拟电路】稳压二极管/齐纳二极管

齐纳二极管也被称为稳压二极管,是一种特殊的二极管,其工作原理是利用PN结的反向击穿状态。在齐纳二极管中,当反向电压增加到一定程度,即达到齐纳二极管的击穿电压时,反向电流会急剧增加,但此时齐纳二极管的电压却基本保持不变。这种特性使得齐纳二极管可以作为稳压器或电…...

项目周期过长,如何拆分里程碑

应对项目周期过长&#xff0c;合理拆分里程碑需要做到&#xff1a;明确项目整体目标与阶段目标、合理进行任务细分与分组、设定阶段性里程碑节点、实施有效的进度跟踪与反馈机制、灵活进行里程碑调整。其中&#xff0c;明确项目整体目标与阶段目标尤为关键。这能够帮助团队在长…...

Java基础 - 泛型(常见用法)

文章目录 泛型类泛型方法泛型类派生子类示例 1&#xff1a;子类固定父类泛型类型&#xff08;StringBox 继承自 Box<String>&#xff09;示例 2&#xff1a;子类保留父类泛型类型&#xff08;AdvancedBox<T> 继承自 Box<T>)示例 3&#xff1a;添加子类自己的…...

蓝桥杯刷题总结 + 应赛技巧

当各位小伙伴们看到这篇文章的时候想必蓝桥杯也快开赛了&#xff0c;那么本篇文章博主就来总结一下一些蓝桥杯的应赛技巧&#xff0c;那么依旧先来走个流程 那么接下来我们分成几个板块进行总结 首先是一些基本语法 编程语言的基本语法 首先是数组&#xff0c;在存数据的时候…...

希哈表的学习

#include <stdio.h> #include <stdlib.h> #include "uthash.h"typedef struct {int id; // 学号&#xff0c;作为keychar name[20]; // 姓名&#xff0c;作为valueUT_hash_handle hh; // 必须有这个字段 } Student;Student* studen…...

Qt之OpenGL使用Qt封装好的着色器和编译器

代码 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…...

备赛蓝桥杯-Python-考前突击

额&#xff0c;&#xff0c;离蓝桥杯开赛还有十个小时&#xff0c;最近因为考研复习节奏的问题&#xff0c;把蓝桥杯的优先级后置了&#xff0c;突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了&#xff0c;再补充一些常用函数供明天考前再背背&#xff0c;算…...

零基础开始学习鸿蒙开发-智能家居APP离线版介绍

目录 1.我的小屋 2.查找设备 3.个人主页 前言 好久不发博文了&#xff0c;最近都忙于面试&#xff0c;忙于找工作&#xff0c;这段时间终于找到工作了。我对鸿蒙开发的激情依然没有减退&#xff0c;前几天做了一个鸿蒙的APP&#xff0c;现在给大家分享一下&#xff01; 具体…...

不再卡顿!如何根据使用需求挑选合适的电脑内存?

电脑运行内存多大合适&#xff1f;在选购或升级电脑时&#xff0c;除了关注处理器的速度、硬盘的容量之外&#xff0c;内存&#xff08;RAM&#xff09;的大小也是决定电脑性能的一个重要因素。但究竟电脑运行内存多大才合适呢&#xff1f;这篇文章将帮助你理解不同使用场景下适…...

华为云 云化数据中心 CloudDC | 架构分析与应用场景

云化数据中心 CloudDC 云化数据中心 (CloudDC)是一种满足传统DC客户云化转型诉求的产品&#xff0c;支持将客户持有服务器设备部署至华为云机房&#xff0c;通过外溢华为云的基础设施管理、云化网络、裸机纳管、确定性运维等能力&#xff0c;帮助客户DC快速云化转型。 云化数据…...

【射频仿真学习笔记】变压器参数的Mathematica计算以及ADS仿真建模

变压器模型理论分析 对于任意的无源电路或者等效电路&#xff0c;当画完原理图后&#xff0c;能否认为已经知道其中的两个节点&#xff1f;vin和vout之间的明确解析解 是否存在一个通用的算法&#xff0c;将这里的所有元素都变成了符号&#xff0c;使得这个算法本身就是一个函…...

Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程

&#xfeff;今天和大家分享一款在 G 站获得了 26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes 的中文版如何在 Linux 环境使用 docker 本地部署&#xff0c;并结合 cpolar 内网穿透工具配置公网地址&#xff0c;轻松实现远程在线协作的详细教程。 Trilium Notes 是…...

C++基础精讲-01

1C概述 1.1初识C 发展历程&#xff1a; C 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发&#xff0c;它在 C 语言的基础上增加了面向对象编程的特性&#xff0c;最初被称为 “C with Classes”&#xff0c;后来逐渐发展成为独立的 C 语言。 语言特点 &#xff08;1&#x…...

为什么Java不支持多继承?如何实现多继承?

一、前言 Java不支持多继承&#xff08;一个类继承多个父类&#xff09;主要出于文中设计考虑&#xff1b;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因&#xff1a;菱形继承/钻石继承问题&#xff08;Diamond Problem&#xff09; 假设存在如下继承关系&…...

E8流程多行明细行字符串用I分隔,赋值到主表

需求&#xff1a;明细行摘要字段赋值到主表隐藏字段&#xff0c;隐藏摘要字段在标题中显示 代码如下&#xff0c;代码中的获取字段名获取方式&#xff0c;自行转换成jQuery("#fieldid").val()替换。 //1:参数表单id 2:流程字段名 3:0代表主表&#xff0c;1代表明细…...

QML面试笔记--UI设计篇04交互控件

1. QML中常用交互控件 1.1. Button1.2. Slider1.3. ProgressBar1.4. TextField1.5. TextArea1.6. ComboBox1.7. CheckBox1.8. RadioButton1.9. Menu1.10. Dialog 1. QML中常用交互控件 在万物互联的智能时代&#xff0c;QML凭借其‌声明式语法‌和‌跨平台能力‌&#xff0c…...

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…...

【人工智能】AI大模型开发数学基础指南

目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习&#xff1f;****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1&#xff1a;夯实基础****阶段 2&…...

Express中间件(Middleware)详解:从零开始掌握(1)

1. 中间件是什么&#xff1f; 想象中间件就像一个"加工流水线"&#xff0c;请求(Request)从进入服务器到返回响应(Response)的过程中&#xff0c;会经过一个个"工作站"进行处理。 简单定义&#xff1a;中间件是能够访问请求对象(req)、响应对象(res)和下…...