C语言基础08
内容提要
-
数组
-
排序算法:冒泡排序
-
二维数组
-
字符数组
-
数组
冒泡排序
-
排序思想(向前冒泡)
-
一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
-
每次排序假定第一个元素是最大或者最小,用第一个元素后面的元素一一与第一个元素比较,遇到较大或较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数
-
在余下的数中,再次应用第2步的操作,直到只剩下1个数
-
-
动图演示:
-
推理:
例如:将
5,4,3,2,1
冒泡排序为1,2,3,4,5
排序演示:
-
第0轮:5,4,3,2,1 → 4,3,2,1,5 比较4次 = 数组长度5 - 轮数0 - 1
-
第1轮:4,3,2,1,5 → 3,2,1,4,5 比较3次 = 数组长度5 - 轮数1 - 1
-
第2轮:3,2,1,4,5 → 2,1,3,4,5 比较2次 = 数组长度5 - 轮数2 - 1
-
第3轮:2,1,3,4,5 → 1,2,3,4,5 比较1次 = 数组长度5 - 轮数3 - 1
总结:
-
上面案例涉及到5个数的排序,排序了4轮,得到:轮数 = 元素个数(数组长度) - 1,我们可以通过一个外层for循环实现轮数的遍历
-
案例涉及的每一轮中数列的排序次数,计算规则:次数 = 元素个数 - 轮数 - 1,我们可以通过一个内层for循环实现每一轮次数的遍历
-
每一次比较过程中,两个数涉及到位置交换,比如a = 3, b = 4,交换ab的数据变为a = 4, b = 3,应该如何实现:
-
引入一个临时变量temp,将a的值赋值给temp,int temp = a;
-
将b的值赋值给a,a = b;
-
将temp的值赋值给a,a = temp;
-
-
-
代码:
// 创建一个数组,用来存放排序用的数列int arr[10];// 定义循环变量和临时变量int i,j,temp;printf("请输入10个整数:\n");// 计算数组的长度int len = sizeof(arr) / sizeof(arr[0]); // 等价于 sizeof(arr) / sizeof(int);// 通过循环录入for (i = 0; i < len; i++) scanf("%d",&arr[i]);printf("\n");// 冒泡排序// 外层循环:实现轮数的遍历,轮数 = 数组长度 - 1for (i = 0; i < len - 1; i++){// 内层循环:实现每一轮的比较次数,比较次数 = 数组长度 - 轮数 - 1for (j = 0; j < len - i - 1; j++){// 相邻两个数比较后交换位置// if (arr[j] < arr[j+1]) // 此时,实现降序排列:从大到小if (arr[j] > arr[j+1]) // 此时,实现升序排列:从小到大{temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}prinf("冒泡排序后的数列:\n");for (i = 0; i < len; i++) printf("%3d",arr[i]);printf("\n");
-
衍生:
冒泡排序 → 鸡尾酒排序 → 摇床排序
二维数组
定义
二维数组本质上是一个行列式的组合,也就是说二维数组由行和列两部分组成,属于多维数组。二维数组数据通过行列进行解读
二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个特殊的一维数组,只不过它的元素是一维数组。(数组的元素的类型可以是数组类型)
语法
数据类型 数组名[行数][列数]
行数:外层数组的数组容量
列数:内层数组的数组容量
说明
-
二维数组在初始化的时候可以省略行数,系统会通过初始化后的数据自动推断行数
-
二维数组和一维数组一样,也可以部分初始化,未初始化的数据默认用
0
或者\0(\0对应的ASCII是0)
补齐 -
二维数组在初始化的时候不能省略列数,否则编译报错
举例
int arr[3][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,等价于下面写法int arr[][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,二维数组初始化的时候可以省略行数int arr[3][3] = {{11,12},{21,22},{31}}; // 正确,等价于下面的写法int arr[3][3] = {{11,12,0},{21,22,0},{31,0,0}}; int arr[3][3] = {0}; // 正确,所有位置使用0补齐int arr[3][3] = {}; // 正确,所有位置使用0补齐int arr[3][3] = {11}; // 正确,除了第0行第0列使用11填充外,其他位置都使用0补齐int arr[][] = {{11,12,13},{21,22,23},{31,32,33}}; // 错误,这种写法,编译报错,不能省略列数int arr[3][] = {{11,12,13},{21,22,23},{31,32,33}}; // 错误,这种写法,编译报错,不能省略列数
注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的(行)下标变化慢,第二维的(列)下标变化快
内存存储
应用场合
主要是应用于对行列有要求的情况。比如我们现在要存储西安粤嵌所有在班学生的成绩
还有就是字符数组的应用,比如用数组存储学生的姓名
特殊写法
-
下标可以是整型表达式,如:
a[2-1][2*2-1] → a[1][3]
-
下标可以是已经有值的变量或数组元素,如:
a[2*x-1][b[3][1]]
-
数组元素可以出现在表达式中,如:
b[1][2] = a[2][3]/2
注意:使用数组元素的下标应在已定义数组的大小范围内;应注意区别定义数组大小和引用数组元素的区别
初始化
-
分行给二维数组赋初值
int arr[3][4] = {{11,12,13,14},{21,22,23,24},{31,32,33,34}};
-
可将所有数据写在一个花括号内,按照排列顺序对元素赋值
int arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
-
可对部分元素赋初值,其余未赋值部分自动填充
数值类型默认值-0 | 字符型默认值-\0
int arr[3][4] = {{11},{21,22},{31}};
-
若对全部元素赋初值,自定义数组时可以省略第1维数组的长度,第2维数组的长度必须指明
int a[][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
-
在分行赋初值时,也可以省略第1维的长度
int arr[][4] = {{11,12,13},{0},{0,10}};
案例
案例1:
-
需求:二维数组的遍历
-
分析:
-
二维数组的遍历需要使用到双层for循环,外层循环控制行,内层循环控制列
-
取数据:
arr[行号][列号]
-
-
代码:
// 创建一个二维数组 int arr[][3] = {{11},{21,22},{31,32,33}};// 获取行数组容量和列数组容量 int row = sizeof(arr) / sizeof(arr[0]); int col = sizeof(arr[0]) / sizeof(arr[0][0]);// 遍历数组 // 外层循环控制行 for (int i = 0; i < row; i++) {// 内层循环控制列(也可以在这里计算列的大小)// int col = sizeof(arr[i]) / sizeof(arr[i][0]);for (int j = 0; j < col; j++){// 输出元素printf("%-3d",arr[i][j]);} } printf("\n");
案例2:
-
需求:矩阵的转置
-
分析:
-
所谓的转置,就是原本的列变行,行变列
-
-
代码:
#define ROW 2 #define COL 2// 定义循环变量 int i,j;// 准备2个数组用来存放转置前后的数据 int arr_before[ROW][COL] = {{11,12,13},{21,22,23}}; int arr_after[COL][ROW] = {0};// 计算数组大小 int arr_before_row = sizeof(arr_before) / sizeof(arr_before[0]); int arr_before_col = sizeof(arr_before[0]) / sizeof(arr_before[0][0]);int arr_after_row = sizeof(arr_after) / sizeof(arr_after[0]); int arr_after_col = sizeof(arr_after[0]) / sizeof(arr_after[0][0]);// 通过循环实现数组转置 printf("转置前:\n"); for (i = 0; i < arr_before_row; i++) {for (j = 0; j < arr_before_col; j++){// 打印输出转置前的数据printf("%-4d",arr_before[i][j]);// 转置arr_after[j][i] = arr_before[i][j];}printf("\n"); } printf("\n");printf("转置后:\n"); for (i = 0; i < arr_after_row; i++) {for (j = 0; j < arr_after_col; j++){// 打印输出转置后的数据printf("%-4d",arr_after[i][j]);}printf("\n"); } printf("\n");
运行结果:
课堂练习
-
需求:求一个3行3列的矩阵对角线上的元素之和
-
分析:
-
总结:等行等列的矩阵,转置前后,对角线上的数据相等
字符数组
在C语言中,支持常量字符串,不支持变量字符串,如果想要实现类似的变量字符串,C语言中提供了两种实现方式
-
字符数组
char name[] = "哪吒";
-
字符指针
char *name = "哪吒";
概念
元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的.需要注意的是,我们C语言中的字符是字节字符
测试题:
char a = 'A'; // 正确 char b = '1'; // 正确 char c = 65; // 正确,这里的65是ASCII码,char的值有两种形式,一种是字符,一种是字符对应的ASCII码 char d = "A"; // 错误,char字符不能用双引号 char e = '王'; // 错误,因为一个中文汉字占两个字节 char f = "王"; // 正确,占三个字节,一个汉字+\n
语法:
// 一维数组 char 数组名[数组容量];// 二维数组 char 数组名[行容量][列容量];
字符数组的语法就是我们前面所学的一维数组和二维数组的语法,只不过数据类型是char而已
注意:
如果我们的char数组初始化的时候,没有完全初始化值的时候,使用'\0'进行填充。这里的'\0'只是起到一个占位或者标识的作用,我们是无法通过printf打印输出到控制台的
比如:
char c[8] = {'h','e','l','l','o'}; // 等价于下面写法 char c[8] = {'h','e','l','l','o','\0','\0','\0'};
案例
案例1:
-
需求:输出一个字符序列(I LOVE YOU)
-
代码:
// 创建一个数组,用来存储 I LOVE YOU,ASCII中对应空格为:' ',其对应的ASCII值为 32 char arr[] = {'I',' ','L','O','V','E',32,'Y','O','U'}; // 计算数组的长度 int len = sizeof(arr) / sizeof(arr[0]);// 通过for循环遍历数组 for (int i = 0; i < len; i++) printf("%c",arr[i]);printf("\n");
案例2:
-
需求:输出一个用字符*组成的空菱形图案
-
代码:
// 创建一个二维数组,存放空菱形 char arr[5][5] = {{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '} }; // 计算行数和列数 int row = sizeof(arr) / sizeof(arr[0]); int col = sizeof(arr[0]) / sizeof(arr[0][0]); // 遍历数组 for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++){printf("%c",arr[i][j]);}printf("\n"); // 当一行所有列数据输出完毕,需要换行 } printf("\n");
注意:
①如果定义时,不初始化,元素值不确定(针对定义在函数中的数组)
char arr1[2]; // 此时这个值是随机的,不固定的 char arr2[5] = {'a','b','c'}; // 此时处于不完全初始化,未初始化的元素使用\0进行填充②如果提供的字符个数大于数组长度,则按照语法错误处理(会报警告,但是能编译通过);如果字符个数小于数组长度,后面的元素自动补充\0
char arr1[2] = {'h','e','e'}; // 编译能通过,但是会报警告;不建议写 char arr2[3] = {'a'}; // 正确,未初始化的元素使用\0填充③如果提供的字符个数与数组长度相同,可以省略数组长度,系统会自动确定元素个数,适合字符较多时
char arr1[] == {'b','u'}; // 正确,根据初始化元素,由系统自动计算元素个数
字符串结束标志
说明
-
C语言规定,字符串以字符
\0
作为结束标志 -
编译系统对字符串常量自动加一个
\0
作为结束标志。比如"hello"
实际上的存储{'h','e','l','l','o','\0'}
-
程序中往往通过判断
\0
来检测字符串是否结束 -
\0
的ASCII码是0,不是一个可显示可输出的字符,是“空操作符”,它什么都不做,不会增加有效字符,仅仅用作一个工程判别的标志或者在字符数组中占位char a[] = {'h','i'}; // hi char a[] = {'h','i','\0'}; // hi char c[] = "hello"; // 实际的存储形式为 hello\0
字符数组的多样表示
我们的char数组可以以数组的形式一个一个输出每个字符;也可以以字符串的形式整体进行输出
案例:
// 字符串的第1种表示: char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'}; // 字符串的第2种表示: char s2[] = {"hello world"}; // ""包裹的字符串自带\0 // 字符串的第3种表示: char s3[] = "hello world";// 字符串输出第1种方式: // 计算数组的长度 int len = sizeof(s3) / sizeof(s3[0]);for (int i = 0; i < len; i++) {// 过滤\0if (s1[i] == '\0' || s2[i] == '\0' || s3[i] == '\0') continue;printf("%c,%c,%c\n",s1[i],s2[i],s3[i]); } printf("\n");// 字符串输出第2种方式: printf("%s,%s,%s\n",s1,s2,s3);printf("\n");
注意:
-
字符串的长度与字符数组的长度不一定相同
char c[] = {'h','\0','i','\0'}; // c作为数组,长度为:4 // c作为字符串,长度为:1
-
利用字符串常量可以对字符数组进行初始化,但不能用字符串常量对字符数组赋值
// 正确演示:利用字符串常量给字符数组初始化 char arr1[6] = "hello";// 错误演示:用字符串常量给字符数组赋值 char arr2[6]; arr2 = "hello";
字符串的基础操作
在用格式化说明符%s进行输入输出时,其输入输出项均为数组名,但在输入时,相邻两个字符串之间要用空格分隔,系统将自动在字符串后加上\0
,在输出时,遇到结束符\0
作为输出结束标志
对于字符串的操作,我们需要使用到一些系统提供的API函数
字符串输入
scanf
语法:
scanf("%s",数组名);
注意:数组名对应的数组只能是char类型
案例:
// 创建一个字符数组,用来存储姓名 char name[20];printf("请输入您的名字:\n"); scanf("%s",name); // 数组本身没有空间,它的内存空间其实就是其元素空间,C语言规定数组名指向的就是首地址 printf("您的姓名是%s\n",name);
注意:采用scanf进行字符串输入,要求字符串中不能有空格,否则字符串遇到空格就会结束
fgets
语法:
fgets(数组名,数组容量,stdin);
功能:
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一般用12位16进制数表示)
说明:
采用fgets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我们可能需要手动处理\n
案例:
// 创建一个字符数组,用来存储姓名 char name[20]; // 计算数组的大小 int len = sizeof(name) / sizeof(name[0]);printf("请输入您的名字:\n"); fgets(name,len,stdin); // 数组本身没有空间,它的内存空间其实就是其元素空间,C语言规定数组名指向的就是首地址printf("您的名字是%s\n",name);
注意:
①如果输入的字符串不包括空格或换行,可以使用scanf或者fgets
②如果输入的字符串包括空格或换行,只能使用fgets
gets 危险的
语法:
gets(数组名);
功能:
从键盘录入一个字符串常量到字符数组,返回字符数组的地址(首地址,默认返回的地址,一般用12位16进制数表示)
说明:
采用gets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我们可能需要手动处理\n
案例:
// 创建一个字符数组,用来存储姓名 char name[20]; // 计算数组的大小 int len = sizeof(name) / sizeof(name[0]);printf("请输入您的名字:\n"); gets(name); // 数组本身没有空间,它的内存空间其实就是其元素空间,C语言规定数组名指向的就是首地址printf("您的名字是%s\n",name);
字符串输出
printf
语法:
printf("%s",数组名);
案例:
// 创建一个字符数组,用来存储姓名 char name[20];printf("请输入您的名字:\n"); scanf("%s",name); // 数组本身没有空间,它的内存空间其实就是其元素空间,C语言规定数组名指向的就是首地址printf("您的名字是%s\n",name);
fputs
语法:
fputs(数组名,stdout);
功能:
输出一个字符串
说明:
字符串可以包含转义字符(可以识别转义字符)
案例:
char arr[] = "hi lucy\teat\n";// 第1种输出 printf("%s\n",arr);// 第2种输出 fputs(arr,stdout);
puts
语法:
puts(数组名);
功能:
输出一个字符串
说明:
字符串可以包含转义字符(可以识别转义字符)
案例:
char name[20];printf("请输入您的名字:\n");// gets、fgets和scanf只能多选一 gets(name);// 输出 puts(name); // 标准的输出
字符串转数值【扩展】
-
strtol
long strtol(const char *str, char **endptr, int base);
将字符串转换为长整型数
参数说明:
-
str
:指向要转换的字符串的指针 -
endptr
:一个指向字符指针的指针。如果提供了这个参数,并且转换成功,endptr
将被设置为指向第一个为转换字符的指针。如果endptr
是NULL
,则不使用它 -
base
:用于指定转换的基数。它可以是 2 到 36 之间的值,或者是特殊值 0。如果base
是 0,则函数会根据字符串的前缀(如 "0x" 或 "0X" 表示十六进制,"0" 表示八进制,否则默认为十进制)来自动确定基数。
-
-
strtoul
unsigned long strtoul(const char *str, char **endptr, int base);
将字符串转换为无符号长整型数
-
strtod
double strtod(const char *str, char **endptr);
将字符串转换为双精度浮点数
-
atol
long atol(const char *str);
将字符串转换为长整型数(不推荐使用,建议使用
strtol
) -
atof
double atof(const char *str);
将字符串转换为双精度浮点数(不推荐使用,建议使用
strtod
)
案例:
printf("%lo,%ld,%lx\n",strtol("12",NULL,8),strtol("12",NULL,10),strtol("12",NULL,16)); printf("%lo,%ld,%lx\n",strtol("012",NULL,0),strtol("12",NULL,10),strtol("0x12",NULL,0));int a = 10;printf("%p,%lx\n",&a,&a);main() {int a=2,b=-1,c=2;if(a<b)if(b<0) c=0;else c+=1;printf("%d\n",c); }
关于单字符的输入:
scanf("%c",.....);
getchar();
关于单字符的输出:
printf("%c",变量);
putchar();
相关文章:
C语言基础08
内容提要 数组 排序算法:冒泡排序 二维数组 字符数组 数组 冒泡排序 排序思想(向前冒泡) 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好 每次排序假定第一个元素是最大或者最小,用第一个…...
基于javaweb的SpringBoot儿童爱心管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)
原文链接:从零开始的DeepSeek微调训练实战(SFT) 微调参考示例:由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…...
JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础实战
学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源:在这位大佬的基础上添加了一些东西,欢迎大家支持原创,大佬太棒了:JavaScript |(五)DOM简介 | 尚硅谷JavaScript基础…...
模型整合-cherry studio+mysql_mcp_server服务配置
一、什么是MCP MCP(Model Context Protocol)是模型上下文协议,它允许大型语言模型(LLM)通过协议与外部工具或服务交互,动态获取实时数据或执行操作。简单来说,它让模型不再局限于静态知识库&…...
【QA】装饰模式在Qt中有哪些运用?
在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例: 一、QIODevice装饰体系(继承方式) 场景 …...
window 设置自动开启/关闭程序(分享)
打开计算机管理 winr 输入 compmgmt.msc 找到任务计划程序创建任务 设置开启任务 常规:添加名称与描述 触发器:新建触发时间与次数 操作:新建执行程序 添加任务对应的位置 以便修改 设置关闭任务 添加批处理文件,写完后吧 .…...
QT布局笔记
在 Qt 中,如果你希望将一个 QGroupBox 放置在水平布局(QHBoxLayout)的上方,可以通过将它们添加到一个垂直布局(QVBoxLayout)中来实现。垂直布局会将子布局或子控件按垂直顺序排列,因此 QGroupBo…...
【LLM大模型】LangChain学习
大模型对话 from langchain.chat_models import ChatOpenAI # 内置对话模型 from langchain.schema import HumanMessage, SystemMessage, AIMessage # 用户提示词,系统提示词, AI响应chat ChatOpenAI(temperature0.7, openai_api_keyxxxxxxxxxxxx) #…...
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
目录 一、OFD 简介 1.1 什么是 OFD?1.2 什么是 版式文档?1.3 为什么要用 OFD 而不是PDF? 二、ofdrw 简介 2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD(ofdrw-conterver) 3.1 介绍…...
SolidWorks使用显卡教程
操作步骤: 打开注册表编辑器 按下键盘上的 Win R 组合键,输入 regedit 并按回车键,打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径: plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…...
mysql 查询进程查看并释放
在MySQL中,查看和管理进程(例如查询、连接等)是数据库维护和性能调优的重要部分。以下是一些常用的方法来查看MySQL进程并释放它们。 1. 查看进程 你可以使用SHOW PROCESSLIST命令来查看当前MySQL服务器上的所有进程。这个命令会显示正在执…...
C++代码2-多目标算法求解车辆路径规划
为了解决车辆路径规划问题,我们需要在同一模型中同时考虑多个目标,其中一个目标是降低运营总成本,而另一个目标是降低总的碳排放量。使用组合算法,包括人工蜂群算法(Artificial Bee Colony, ABC)、模拟退火算法(Simulated Annealing, SA)、以及多目标优化算法MODAD(Mu…...
JAVA学习*接口
接口 在生活中我们常听说USB接口,那接口是什么呢? 在Java中,接口相当于多个类的一种公共规范,是一种引用数据类型。 定义接口 public interface IUSB {public static final String SIZE "small";public abstract vo…...
Matplotlib
一、Matplotlib快速入门 学习目标 了解什么是matplotlib 为什么要学习matplotlib matplotlib简单图形的绘制 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工…...
新版frp-0.61.0 实现泛解析域名穿透 以及 https启用
需要在公网服务器的域名解析平台 泛域名 *.aa.com 解析到frp 公网服务器的ip x.x.x.x 对于frpc.toml 文件的 serverAddr 绑定的ip 需要公网服务器放行 bindPort 对于的端口 frpc.toml serverPort 对于的的是 frps.toml bindPort 端口 frps.toml bindPort 7000 vhostHTTPP…...
HTTPS 加密过程详解
HTTPS 详解及其加密过程流程框架 HTTPS(Hypertext Transfer Protocol Secure)是一种基于 HTTP 协议的安全通信协议,通过 SSL/TLS 协议对传输数据进行加密和身份验证,解决了 HTTP 明文传输的安全隐患。以下是其核心原理和加密流程的…...
lua垃圾回收
lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空,会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…...
springboot继承使用mybatis-plus举例相关配置,包括分页插件以及封装分页类
以下是使用 MyBatis-Plus 分页插件的完整配置和封装步骤,包括日志输出、驼峰转下划线、逻辑删除以及分页属性类的封装。 1. 引入依赖 确保在 pom.xml 中已经引入 MyBatis-Plus 的依赖: <XML> <dependency><groupId>com.baomidou<…...
智能汽车以太网系统测试:聚焦ETH链路高负载性能表现
引言 在智能汽车高速发展的今天,车载以太网作为车辆信息交互的“神经网络”,承担着传输海量数据的关键使命。它不仅能够满足车辆对高带宽、低延迟和高可靠性的通信需求,还为自动驾驶、智能座舱等复杂功能提供了强大的技术支持。然而…...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.21)
10.7 案例-员工管理-分页查询-分析 形参的默认值可以使用注解来设置:RequestParam(default “1”) 10.8 案例-员工管理-分页查询-PageHelper插件 分页插件PageHelper帮助完成有关分页的所有操作,我们只要正常使用查询语句就可以了。插件会自动…...
计算机网络精讲day1——计算机网络的性能指标(上)
性能指标1:速率 概念1:比特 英文全称是binary digit,意思是一个二进制数字,因此一个比特就是二进制数字中的1或0,比特也是信息论中使用的信息量单位。 概念2:速率 网络中的速率指的是数据的传送速率&#…...
gin-路由handler封装思路
约束handler入参和返回为func(ctx, req) (resp, error)。通过反射,封装handler,在调用前后写入入参和返回的处理。 package testingimport ("context""fmt""reflect""strings""testing" )type ReqPa…...
【实战案例】用STAR+3W模型拆解电商支付系统设计文档
各位开发者朋友,上次分享了结构化写作的黄金公式后,很多同学反馈需要更具象的落地方法。今天通过真实电商支付系统案例,手把手教你用STAR3W模型写出可执行的设计文档! 结构化写作的「黄金公式」 STAR原则 3W模型 Situation&…...
计算机组成原理和计算机网络常见单位分类及换算
计算机组成原理(主要用于存储、内存、缓存等) 计算机网络(主要用于传输速率) 直观对比...
线性筛法求素数
时间复杂度 o(n) int cnt, primes[N];//cnt用来记录素数的下标 bool st[N];//用来标记合数 int minp[N];//最小质因数 void get_primes(int n) {for(int i 2;i < n;i )//从2开始找数 {if(!st[i])//如果这个数没有被筛出去过,说明是一…...
触动精灵对某东cookie读取并解密--记lua调用C语言
在Mac上构建Lua扩展模块:AES解密与Base64解码实战 今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…...
GEO:在AI时代抢占DeepSeekC位?
前言:当SEO遇见AGI——一场静默的流量革命 在生成式AI日均处理53亿次查询的今天,传统SEO的「关键词-排名-点击」逻辑正在崩塌。DeepSeek、ChatGPT、豆包等大模型用动态生成的答案,悄然截流了68%的搜索需求。更残酷的是:当用户问&q…...
【设计模式】策略模式
以下是格式优化后的Markdown文档,仅调整代码缩进,保持内容不变: 四、策略模式 策略(Strategy) 模式是一种行为型模式,其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…...
第J6周:ResNeXt-50实战解析
文章目录 一、前期准备1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据3.再次检查数据4.配置数据集 四、模型复现1. 分组卷积模块2. 定义残差模块3. 堆叠残差单元4. 搭建ResNext-50网络5. 查看模型摘要 五、训练模型六、结果可视化总结: &…...
调试 ResNet18 cpp实现中的段错误(SIGSEGV)问题
调试 ResNet18 cpp实现中的段错误(SIGSEGV)问题 问题分析 您的程序在运行时遇到了段错误(SIGSEGV),GDB显示错误发生在main()函数的第一行(resnet18_allo_test.cpp:33)。这种情况看起来很奇怪&…...
详细介绍IDI_APPLICATION和IDC_ARROW
书籍:《windows程序设计(第五版)》 环境:visual studio 2022 内容:HELLOWIN程序 说明:以下内容大部分来自腾讯元宝。 IDI_APPLICATION 与 IDC_ARROW 详解 1. IDC_ARROW(光标资源标识符) 定义与…...
curl库+openssl库windows编译
一、工具准备 Visual Studio 2008:确保安装了 C 开发工具。 Git:用于克隆 cURL 的源码。 Perl:可以从 ActiveState Perl 下载并安装。 NASM(可选):如果需要汇编优化,可以从NASM 官方网站 下载并…...
今日行情明日机会——20250321
后续投资机会分析 结合2025年3月21日盘面数据(涨停56家,跌停31家),市场呈现结构性分化行情,海洋经济成为绝对主线,机器人概念局部活跃,人工智能表现较弱。以下是具体方向与策略建议:…...
repo init 错误 Permission denied (publickey)
一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig (此步骤是公司要求,设置gerrit地址为一个别名之类的,有的公司不需要) 然后出现下面的错误,最后发现忘记设置git的用户名和邮箱 1. git config --globa…...
STM32 模拟SPI 模式0
SPI 模式 0 的时钟极性(CPOL)为 0,时钟相位(CPHA)为 0。CPOL 0 意味着时钟信号空闲时为低电平,CPHA 0 表示在时钟信号的第一个跳变沿(上升沿)进行数据采样。 #include "stm3…...
MySQL实现全量同步和增量同步到SQL Server或其他关系型库
在将MySQL中的两张表同步到SQL Server的过程中,全量同步和增量同步各有其优缺点。全量同步简单直接但可能耗时较长且资源消耗大,而增量同步则更加高效但需要额外的逻辑来处理数据的变更。以下是对这两种同步方式的详细解释及代码示例的完善。 完整代码示…...
详细解析GetOpenFileName()
书籍:《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.34】打开文件对话框和另存为。 说明:以下内容大部分来自腾讯元宝。 GetOpenFileName() 是 Windows API 中用于显示标准文件打开…...
FPGA----完美解决Windows下[XSIM 43-3409][XSIM 43-3915]错误
大家好久不见,今天开始又要重操旧业了!最近会更新很多关于petalinux的踩坑日记,敬请期待! 先更新一个常见问题,使用Vivado仿真时C编译器报错问题。如下所示 ERROR: [XSIM 43-3409] Failed to compile generated C fi…...
LeetCode Hot100 刷题路线(Python版)
目录 1. LeetCode Hot100 刷题笔记(1)—— 哈希、双指针、滑动窗口 2. LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵 3. LeetCode Hot100 刷题笔记(3)—— 链表 4. LeetCode Hot100 刷题笔记&…...
宇树科技纯技能要求总结
一、嵌入式开发与硬件设计 核心技能 嵌入式开发: 精通C/C,熟悉STM32、ARM开发熟悉Linux BSP开发及驱动框架(SPI/UART/USB/FLASH/Camera/GPS/LCD)掌握主流平台(英伟达、全志、瑞芯微等) 硬件设计:…...
Docker学习笔记(十)搭建Docker私有仓库
一、环境配置 1、宿主机系统:macOS Sequoia(版本15.2) 2、虚拟机VMware Fusion版本:专业版 13.6.2 (24409261) 3、虚拟机系统:AlmaLinux-9-latest-x86_64-boot.iso 二、安装Harbor开源企业级Docker镜像 Harbor 是一个开源的企业级 Docker…...
FastAPI WebSocket 无法获取真实 IP 错误记录
FastAPI WebSocket 无法获取真实 IP 错误记录 问题描述 在使用 FastAPI WebSocket 服务时,发现无法获取设备的真实 Remote IP,所有连接均显示为内网地址 10.x.x.1。以下是完整的排查过程及解决方案。 排查步骤 1. 基础信息检查 • 现象复现࿱…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例4,TableView15_04导出当前页数据示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例4,TableView15_04导出当…...
【Linux】快速上手Makeflie CMake
🦄个人主页:修修修也 🎏所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 📌快速上手Makefile 基本结构 变量 自动变量 常用目标 📌快速上手CMake CMake与Makefile的关系 CMake的使用步骤 常用命令…...
Python连接数据库进行增删改查
更多优质文章 _>_>_>_>_>✍✈✉戳我 目录 1.导入相关库 2.创建连接 3.插入数据 4.删除数据 5.修改数据 6.查询数据 7.更多干货 1.导入相关库 import pymysql -----pip install pymysql #下载库 2.创建连接 conn pymysql.connect(hostlocalho…...
数据库的两种模式
数据库的 严格模式(Strict Mode) 和 宽松模式(Non-Strict Mode) 是数据库管理系统(DBMS)中用于控制数据验证和处理方式的两种不同模式。它们的主要区别在于对数据完整性、一致性和错误处理的严格程度。 1. …...
【css酷炫效果】纯CSS实现立体旋转立方体
【css酷炫效果】纯CSS实现立体旋转立方体 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492014 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&am…...
Cursor与Coze结合开发电影推荐系统:一次高效的技术实践
1 项目背景 有个想法,和朋友打算一起看电影,但是不知道看什么(吃饭也是),于是在豆瓣高分电影榜单中选择出来一些感兴趣的电影,随机挑选一部“天意之选”。为此,我尝试结合Cursor(智…...
【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势
java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…...