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

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将被设置为指向第一个为转换字符的指针。如果endptrNULL,则不使用它

    • 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

内容提要 数组 排序算法&#xff1a;冒泡排序 二维数组 字符数组 数组 冒泡排序 排序思想&#xff08;向前冒泡&#xff09; 一次只排好一个数&#xff0c;针对n个数&#xff0c;最差情况需要n-1次就可以排好 每次排序假定第一个元素是最大或者最小&#xff0c;用第一个…...

基于javaweb的SpringBoot儿童爱心管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由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基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源&#xff1a;在这位大佬的基础上添加了一些东西&#xff0c;欢迎大家支持原创&#xff0c;大佬太棒了&#xff1a;JavaScript |&#xff08;五&#xff09;DOM简介 | 尚硅谷JavaScript基础…...

模型整合-cherry studio+mysql_mcp_server服务配置

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是模型上下文协议&#xff0c;它允许大型语言模型&#xff08;LLM&#xff09;通过协议与外部工具或服务交互&#xff0c;动态获取实时数据或执行操作。简单来说&#xff0c;它让模型不再局限于静态知识库&…...

【QA】装饰模式在Qt中有哪些运用?

在Qt框架中&#xff0c;装饰模式&#xff08;Decorator Pattern&#xff09;主要通过继承或组合的方式实现&#xff0c;常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例&#xff1a; 一、QIODevice装饰体系&#xff08;继承方式&#xff09; 场景 …...

window 设置自动开启/关闭程序(分享)

打开计算机管理 winr 输入 compmgmt.msc 找到任务计划程序创建任务 设置开启任务 常规&#xff1a;添加名称与描述 触发器&#xff1a;新建触发时间与次数 操作&#xff1a;新建执行程序 添加任务对应的位置 以便修改 设置关闭任务 添加批处理文件&#xff0c;写完后吧 .…...

QT布局笔记

在 Qt 中&#xff0c;如果你希望将一个 QGroupBox 放置在水平布局&#xff08;QHBoxLayout&#xff09;的上方&#xff0c;可以通过将它们添加到一个垂直布局&#xff08;QVBoxLayout&#xff09;中来实现。垂直布局会将子布局或子控件按垂直顺序排列&#xff0c;因此 QGroupBo…...

【LLM大模型】LangChain学习

大模型对话 from langchain.chat_models import ChatOpenAI # 内置对话模型 from langchain.schema import HumanMessage, SystemMessage, AIMessage # 用户提示词&#xff0c;系统提示词&#xff0c; AI响应chat ChatOpenAI(temperature0.7, openai_api_keyxxxxxxxxxxxx) #…...

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介 1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介 2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09; 3.1 介绍&#xf…...

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…...

mysql 查询进程查看并释放

在MySQL中&#xff0c;查看和管理进程&#xff08;例如查询、连接等&#xff09;是数据库维护和性能调优的重要部分。以下是一些常用的方法来查看MySQL进程并释放它们。 1. 查看进程 你可以使用SHOW PROCESSLIST命令来查看当前MySQL服务器上的所有进程。这个命令会显示正在执…...

C++代码2-多目标算法求解车辆路径规划

为了解决车辆路径规划问题,我们需要在同一模型中同时考虑多个目标,其中一个目标是降低运营总成本,而另一个目标是降低总的碳排放量。使用组合算法,包括人工蜂群算法(Artificial Bee Colony, ABC)、模拟退火算法(Simulated Annealing, SA)、以及多目标优化算法MODAD(Mu…...

JAVA学习*接口

接口 在生活中我们常听说USB接口&#xff0c;那接口是什么呢&#xff1f; 在Java中&#xff0c;接口相当于多个类的一种公共规范&#xff0c;是一种引用数据类型。 定义接口 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&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于 HTTP 协议的安全通信协议&#xff0c;通过 SSL/TLS 协议对传输数据进行加密和身份验证&#xff0c;解决了 HTTP 明文传输的安全隐患。以下是其核心原理和加密流程的…...

lua垃圾回收

lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空&#xff0c;会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…...

springboot继承使用mybatis-plus举例相关配置,包括分页插件以及封装分页类

以下是使用 MyBatis-Plus 分页插件的完整配置和封装步骤&#xff0c;包括日志输出、驼峰转下划线、逻辑删除以及分页属性类的封装。 1. 引入依赖 确保在 pom.xml 中已经引入 MyBatis-Plus 的依赖&#xff1a; <XML> <dependency><groupId>com.baomidou<…...

智能汽车以太网系统测试:聚焦ETH链路高负载性能表现

引言 在智能汽车高速发展的今天&#xff0c;车载以太网作为车辆信息交互的“神经网络”&#xff0c;承担着传输海量数据的关键使命。它不仅能够满足车辆对高带宽、低延迟和高可靠性的通信需求&#xff0c;还为自动驾驶、智能座舱等复杂功能提供了强大的技术支持。然而&#xf…...

学习笔记:黑马程序员JavaWeb开发教程(2025.3.21)

10.7 案例-员工管理-分页查询-分析 形参的默认值可以使用注解来设置&#xff1a;RequestParam(default “1”) 10.8 案例-员工管理-分页查询-PageHelper插件 分页插件PageHelper帮助完成有关分页的所有操作&#xff0c;我们只要正常使用查询语句就可以了。插件会自动…...

计算机网络精讲day1——计算机网络的性能指标(上)

性能指标1&#xff1a;速率 概念1&#xff1a;比特 英文全称是binary digit&#xff0c;意思是一个二进制数字&#xff0c;因此一个比特就是二进制数字中的1或0&#xff0c;比特也是信息论中使用的信息量单位。 概念2&#xff1a;速率 网络中的速率指的是数据的传送速率&#…...

gin-路由handler封装思路

约束handler入参和返回为func(ctx, req) (resp, error)。通过反射&#xff0c;封装handler&#xff0c;在调用前后写入入参和返回的处理。 package testingimport ("context""fmt""reflect""strings""testing" )type ReqPa…...

【实战案例】用STAR+3W模型拆解电商支付系统设计文档

各位开发者朋友&#xff0c;上次分享了结构化写作的黄金公式后&#xff0c;很多同学反馈需要更具象的落地方法。今天通过真实电商支付系统案例&#xff0c;手把手教你用STAR3W模型写出可执行的设计文档&#xff01; 结构化写作的「黄金公式」 STAR原则 3W模型 Situation&…...

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比...

线性筛法求素数

时间复杂度 o&#xff08;n&#xff09; 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])//如果这个数没有被筛出去过&#xff0c;说明是一…...

触动精灵对某东cookie读取并解密--记lua调用C语言

在Mac上构建Lua扩展模块&#xff1a;AES解密与Base64解码实战 今天我要分享一个实用技术&#xff1a;如何在Mac系统上为Lua编写和编译C扩展模块&#xff0c;特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…...

GEO:在AI时代抢占DeepSeekC位?

前言&#xff1a;当SEO遇见AGI——一场静默的流量革命 在生成式AI日均处理53亿次查询的今天&#xff0c;传统SEO的「关键词-排名-点击」逻辑正在崩塌。DeepSeek、ChatGPT、豆包等大模型用动态生成的答案&#xff0c;悄然截流了68%的搜索需求。更残酷的是&#xff1a;当用户问&q…...

【设计模式】策略模式

以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…...

第J6周:ResNeXt-50实战解析

文章目录 一、前期准备1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据3.再次检查数据4.配置数据集 四、模型复现1. 分组卷积模块2. 定义残差模块3. 堆叠残差单元4. 搭建ResNext-50网络5. 查看模型摘要 五、训练模型六、结果可视化总结&#xff1a; &…...

调试 ResNet18 cpp实现中的段错误(SIGSEGV)问题

调试 ResNet18 cpp实现中的段错误&#xff08;SIGSEGV&#xff09;问题 问题分析 您的程序在运行时遇到了段错误&#xff08;SIGSEGV&#xff09;&#xff0c;GDB显示错误发生在main()函数的第一行&#xff08;resnet18_allo_test.cpp:33&#xff09;。这种情况看起来很奇怪&…...

详细介绍IDI_APPLICATION和IDC_ARROW

书籍&#xff1a;《windows程序设计(第五版)》 环境&#xff1a;visual studio 2022 内容&#xff1a;HELLOWIN程序 说明&#xff1a;以下内容大部分来自腾讯元宝。 ​IDI_APPLICATION 与 IDC_ARROW 详解 ​1. IDC_ARROW&#xff08;光标资源标识符&#xff09;​ ​定义与…...

curl库+openssl库windows编译

一、工具准备 Visual Studio 2008&#xff1a;确保安装了 C 开发工具。 Git&#xff1a;用于克隆 cURL 的源码。 Perl&#xff1a;可以从 ActiveState Perl 下载并安装。 NASM&#xff08;可选&#xff09;&#xff1a;如果需要汇编优化&#xff0c;可以从NASM 官方网站 下载并…...

今日行情明日机会——20250321

后续投资机会分析 结合2025年3月21日盘面数据&#xff08;涨停56家&#xff0c;跌停31家&#xff09;&#xff0c;市场呈现结构性分化行情&#xff0c;海洋经济成为绝对主线&#xff0c;机器人概念局部活跃&#xff0c;人工智能表现较弱。以下是具体方向与策略建议&#xff1a…...

repo init 错误 Permission denied (publickey)

一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig &#xff08;此步骤是公司要求&#xff0c;设置gerrit地址为一个别名之类的&#xff0c;有的公司不需要&#xff09; 然后出现下面的错误&#xff0c;最后发现忘记设置git的用户名和邮箱 1. git config --globa…...

STM32 模拟SPI 模式0

SPI 模式 0 的时钟极性&#xff08;CPOL&#xff09;为 0&#xff0c;时钟相位&#xff08;CPHA&#xff09;为 0。CPOL 0 意味着时钟信号空闲时为低电平&#xff0c;CPHA 0 表示在时钟信号的第一个跳变沿&#xff08;上升沿&#xff09;进行数据采样。 #include "stm3…...

MySQL实现全量同步和增量同步到SQL Server或其他关系型库

在将MySQL中的两张表同步到SQL Server的过程中&#xff0c;全量同步和增量同步各有其优缺点。全量同步简单直接但可能耗时较长且资源消耗大&#xff0c;而增量同步则更加高效但需要额外的逻辑来处理数据的变更。以下是对这两种同步方式的详细解释及代码示例的完善。 完整代码示…...

详细解析GetOpenFileName()

书籍&#xff1a;《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.34】打开文件对话框和另存为。 说明&#xff1a;以下内容大部分来自腾讯元宝。 GetOpenFileName() 是 Windows API 中用于显示标准文件打开…...

FPGA----完美解决Windows下[XSIM 43-3409][XSIM 43-3915]错误

大家好久不见&#xff0c;今天开始又要重操旧业了&#xff01;最近会更新很多关于petalinux的踩坑日记&#xff0c;敬请期待&#xff01; 先更新一个常见问题&#xff0c;使用Vivado仿真时C编译器报错问题。如下所示 ERROR: [XSIM 43-3409] Failed to compile generated C fi…...

LeetCode Hot100 刷题路线(Python版)

目录 1. LeetCode Hot100 刷题笔记&#xff08;1&#xff09;—— 哈希、双指针、滑动窗口 2. LeetCode Hot100 刷题笔记&#xff08;2&#xff09;—— 子串、普通数组、矩阵 3. LeetCode Hot100 刷题笔记&#xff08;3&#xff09;—— 链表 4. LeetCode Hot100 刷题笔记&…...

宇树科技纯技能要求总结

一、嵌入式开发与硬件设计 核心技能 嵌入式开发&#xff1a; 精通C/C&#xff0c;熟悉STM32、ARM开发熟悉Linux BSP开发及驱动框架&#xff08;SPI/UART/USB/FLASH/Camera/GPS/LCD&#xff09;掌握主流平台&#xff08;英伟达、全志、瑞芯微等&#xff09; 硬件设计&#xff1a…...

Docker学习笔记(十)搭建Docker私有仓库

一、环境配置 1、宿主机系统&#xff1a;macOS Sequoia(版本15.2) 2、虚拟机VMware Fusion版本&#xff1a;专业版 13.6.2 (24409261) 3、虚拟机系统&#xff1a;AlmaLinux-9-latest-x86_64-boot.iso 二、安装Harbor开源企业级Docker镜像 Harbor 是一个开源的企业级 Docker…...

FastAPI WebSocket 无法获取真实 IP 错误记录

FastAPI WebSocket 无法获取真实 IP 错误记录 问题描述 在使用 FastAPI WebSocket 服务时&#xff0c;发现无法获取设备的真实 Remote IP&#xff0c;所有连接均显示为内网地址 10.x.x.1。以下是完整的排查过程及解决方案。 排查步骤 1. 基础信息检查 • 现象复现&#xff1…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例4,TableView15_04导出当前页数据示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例4,TableView15_04导出当…...

【Linux】快速上手Makeflie CMake

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 &#x1f4cc;快速上手Makefile 基本结构 变量 自动变量 常用目标 &#x1f4cc;快速上手CMake CMake与Makefile的关系 CMake的使用步骤 常用命令…...

Python连接数据库进行增删改查

更多优质文章 _>_>_>_>_>✍✈✉戳我 目录 1.导入相关库 2.创建连接 3.插入数据 4.删除数据 5.修改数据 6.查询数据 7.更多干货 1.导入相关库 import pymysql -----pip install pymysql #下载库 2.创建连接 conn pymysql.connect(hostlocalho…...

数据库的两种模式

数据库的 严格模式&#xff08;Strict Mode&#xff09; 和 宽松模式&#xff08;Non-Strict Mode&#xff09; 是数据库管理系统&#xff08;DBMS&#xff09;中用于控制数据验证和处理方式的两种不同模式。它们的主要区别在于对数据完整性、一致性和错误处理的严格程度。 1. …...

【css酷炫效果】纯CSS实现立体旋转立方体

【css酷炫效果】纯CSS实现立体旋转立方体 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492014 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&am…...

Cursor与Coze结合开发电影推荐系统:一次高效的技术实践

1 项目背景 有个想法&#xff0c;和朋友打算一起看电影&#xff0c;但是不知道看什么&#xff08;吃饭也是&#xff09;&#xff0c;于是在豆瓣高分电影榜单中选择出来一些感兴趣的电影&#xff0c;随机挑选一部“天意之选”。为此&#xff0c;我尝试结合Cursor&#xff08;智…...

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…...