内容提要

  • 构造类型
    • 枚举类型
    • typedef
  • 综合案例:斗地主

构造类型

枚举类型

建议:如果定义不相干的常理,使用宏定义(符号常量);如果需要定义一组相关联的常量,如月份0~11,星期0~6,方向0~3,男女0~1等,使用枚举,进行统一管理。以后正式开发中,switch的case后面访问的就是枚举中的常量。

定义

我们一般情况下,定义常量使用宏定义(#define 宏名称 宏值),宏定义非常适合没有关联关系的常量;但是有时候我们可能需要对一组拥有关联关系的量进行定义,如月份0~11,星期0~6,方向0~3等,那么使用宏定义,就不是很清晰,也不方便统一管理,同时还会增加代码量,这个时候就需要用到枚举。

枚举的存在就是将多个拥有关联关系的常量组合到一起,提高代码的可读性。

说明

枚举定义了一组常量,我们在开发中直接使用这些常量。(常用)

当然枚举类型也可以类似于结构体一样定义变量等操作。(不常用)

枚举常量有默认值,从0开始依次+1;我们可以在定义时指定它的默认值,如果个别没有赋值,可以根据赋值依次+1推导。

特点

定义了一组常量,类似于定义了多个符号常量(宏定义)

提高了代码的可读性

语法

① 定义枚举类型名以后,就可以定义该枚举类型的变量(先类型,后变量)。(注意:枚举的元素是符号常量)

enum 枚举类型名 变量列表;

② 在定义枚举类型的同时定义该枚举类型的变量(类型+变量

enum 枚举类型名{枚举元素列表} 变量列表;

③ 直接定义枚举变量(变量

enum {枚举元素列表} 变量列表;
案例
/*************************************************************************> File Name:   demo01.c > Author:       rch> Description:  > Created Time: 2025-08-04 09:53:05************************************************************************/
#include <stdio.h>void test1()
{// 定义一个枚举类型// 注意:枚举类型名一般首字母大写,主要是跟枚举元素名区分enum Week{// 定义枚举元素,元素本质上就是常量,在编译期,会被替换为字面量,枚举元素的命名和符号常量命名一致,都是大写+下换线// 多个枚举元素之间使用逗号分隔// SUN,MON,TUE,WED,THU,FRI,SAT   // 此时,这7个常量的值依次为:0~6SUN = 10,MON,TUE,WED,THU,FRI,SAT   // 此时,这7个常量的值依次为:10~16};// 1. 直接访问枚举元素,适合于switchprintf("%d,%d,%d\n", SUN, WED, SAT);   // 10,13,16// 2. 定义枚举类型的变量,适合于函数传参enum Week week;// 初始化week = TUE; // 不能随便赋值,赋值一定是这个枚举中定义的元素printf("%d\n", week); // 12// 3. 定义枚举类型变量的同时赋值enum Week week1 = THU;printf("%d\n", week1);// 14// 4. 可以定义多个枚举变量enum THU{A,B,C	} x, y;// 赋值x = B;y = C;printf("x=%d,y=%d\n", x, y);// 1,2
}void test2()
{// 定义枚举类型enum CaiQuan{SHI_TOU, JIAN_DAO, BU};printf("请输入0~2之间的整数:\n0-石头,1-剪刀,2-布\n");int choice;scanf("%d", &choice);switch (choice) {case SHI_TOU:printf("石头\n");break;case JIAN_DAO:printf("剪刀\n");break;case BU:printf("布\n");break;}
}int main(int argc, char *argv[])
{test1();test2();return 0;
}

typedef

  • **说明:**给类型重命名,不会影响到类型本身。

  • **作用:**给已有的类型起别名。

  • 格式:

    typedef 已有类型名 重命后的类型名;
    // typedef unsigned long size_t;
    
  • 使用:

    /*************************************************************************> File Name:    demo02.c> Author:       rch> Description:  > Created Time: 2025-08-04 10:57:55************************************************************************/
    #include <stdio.h>int main(int argc, char *argv[])
    {// 方式1:先定义数据类型,再重命名// 定义一个结构体struct Student{int id;char *name;char sex;int age;};// 类型重命名typedef struct Student Stu;   // 将	struct Student 重命名为Stu// 使用新类型名// 定义结构体实例Stu stu = {1,"张三",'w',21};printf("%d,%s,%c,%d\n",stu.id, stu.name, stu.sex, stu.age);Stu *p = &stu;printf("%d,%s,%c,%d\n",p->id, p->name, p->sex, p->age);// 方式2:定义数据类型的同时重命名typedef struct PersonInfo{int a;double b;} Per;// 定义变量Per per = {2,4.5};printf("%d,%.2f\n", per.a, per.b);// 定义指针Per *p1 = &per;printf("%d,%.2f\n", p1->a, p1->b);return 0;
    }
    
  • 应用场景

    • 数据类型复杂(结构体、共用体、枚举、结构体指针、无符号的长整型)时使用

    • 为了跨平台的兼容性,例如:

      1. size_t:类型重名后的数据类型:typedef unsigned long size_t;
      2. unit_16:类型重命名后的数据类型。
  • 案例:

    /*************************************************************************> File Name:    demo03.c> Author:       rch> Description:  > Created Time: 2025-08-04 11:14:55************************************************************************/
    #include <stdio.h>struct Student
    {int age;char *name;double scores[3];
    };typedef struct Student Stu_t; // 对类型重命名
    typedef Stu_t* pStu_t;        // 结构体指针重命名void test1()
    {Stu_t s1 = {21, "zhangsan",{99,98,97}};printf("%d,%s,%.2lf,%.2lf,%.2lf\n",s1.age,s1.name,s1.scores[0],s1.scores[1],s1.scores[2]);Stu_t *p;p = &s1;printf("%d,%s,%.2lf,%.2lf,%.2lf\n",(*p).age,p->name,p->scores[0],p->scores[1],p->scores[2]);
    }int main(int argc, char *argv[])
    {test1();return 0;
    }
    

章节作业

1. 学员信息结构体设计与平均分计算

设计一个结构体存储学员信息,并实现信息显示与平均分计算。

要求

  • 结构体包含学员姓名(字符数组)、学号(整数)、三门课程成绩(浮点数数组)。
  • 定义两个学员变量,输入成绩后计算并显示平均分。

提示

struct Student {char name[20];int id;float scores[3];
};
2. 商品信息结构体设计与显示

设计一个描述商品的结构体,并实现信息显示。

要求

  • 结构体包含商品名称(字符指针)、ID(整数)、价格(浮点数)、库存数量(短整型)。
  • 定义一个商品变量,初始化后显示所有信息。

提示

struct Product {char *name;int id;float price;short stock;
};
3. 商品信息管理系统(扩展作业 2)

在作业 2 基础上完成以下功能:

(1)存储与显示多个商品信息

  • 使用结构体数组存储 5 个商品信息,初始化后遍历显示。

(2)查询价格最高的商品

  • 遍历商品数组,找出价格最高的商品并显示其全部信息。

(3)静态与动态内存分配实现

  • 静态分配:使用结构体数组存储商品。
  • 动态分配:使用malloc申请内存存储商品,完成后用free释放。
4. 学生成绩管理系统(含枚举与共用体)

设计一个包含枚举和共用体的学生成绩管理系统。

功能要求:

  1. 数据结构设计

    • 用枚举定义成绩等级(enum Grade {A, B, C, D, E})。
    • 用共用体存储学生附加信息(如是否为班长is_monitor或奖学金等级scholarship)。
    enum Grade {A, B, C, D, E};
    union ExtraInfo {int is_monitor;  // 0/1enum Grade scholarship;  // 奖学金等级
    };
    struct Student {int id;char name[20];float scores[3];union ExtraInfo extra;
    };
    
  2. 核心功能

    • 添加学生:输入学号、姓名、三门课程成绩,以及附加信息(如是否为班长)。
    • 显示等级:根据平均分将成绩转换为枚举等级(如平均分≥90 为 A)。
    • 共用体应用:根据学生类型(普通生 / 奖学金获得者)存储不同附加信息。
5. 主机字节序检测(结合共用体)

设计程序检测电脑的字节序(大端 / 小端)。 要求

  • 使用共用体存储整数和字符数组,通过访问字符数组判断字节序。
  • 输出结果如:当前主机为小端序(低字节存低地址)

提示

union EndianCheck {int num;char bytes[4];
};

综合案例:斗地主

1. 程序概述

这是一个模拟斗地主游戏发牌过程的C语言程序,实现了扑克牌的初始化、洗牌和发牌功能。

2. 功能需求

2.1 扑克牌定义
  • 使用结构体Card表示一张牌,包含:
    • 花色属性suit(0-3表示普通花色♥♠♦♣,4表示小王,5表示大王)
    • 点数属性rank(0-12对应3-A,2,-1表示大小王)
2.2 主要功能
  1. 初始化牌组
    • 创建包含54张牌的牌组(52张普通牌+2张王牌)
    • 普通牌按花色(♠,♥,♣,♦)和点数(3-2)排列
  2. 洗牌功能
    • 使用随机数对牌组进行随机排序
    • 确保每次运行洗牌结果不同(基于时间种子)
  3. 发牌功能
    • 将洗好的牌发给3个玩家
    • 每个玩家17张牌
    • 剩余3张作为底牌
  4. 显示功能
    • 打印每个玩家的手牌
    • 打印底牌

3. 数据结构

  • suits[]: 存储4种花色符号的字符串数组
  • ranks[]: 存储13个点数等级的字符串数组
  • jokers[]: 存储大小王描述的字符串数组
  • Card结构体: 表示单张牌的数据结构
  • 牌组数组: deck[54]
  • 玩家手牌数组: player1[17], player2[17], player3[17]
  • 底牌数组: bottomCards[3]

4. 用户交互

程序运行后自动完成以下流程:

  1. 初始化牌组
  2. 洗牌
  3. 发牌
  4. 显示发牌结果(3个玩家的手牌和底牌)

5. 输出格式

  • 普通牌显示格式:花色+点数(如"♠ 3")
  • 王牌显示格式:“小王"或"大王”
  • 玩家手牌按顺序显示,每张牌用空格分隔
  • 底牌同样格式显示

6. 源码

/*************************************************************************> File Name:    斗地主> Author:       rch> Description:  > Created Time: 2025-08-04 19:26:06************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>#define LEN 54// 定义扑克牌的花色和点数
const char *suits[] = {"♥", "♠", "♦", "♣"}; // 花色
const char *ranks[] = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; // 点数
const char *jokers[] = {"小王","大王"}; // 大小王// 定义牌的结构体
typedef struct
{int suit;  // 花色下标(0~3:普通牌,4:小王,5:大王)int rank;  // 点数下标(0~12:普通牌,-1:大小王)
} Card;// 初始化一副牌
void initDeck(Card *deck);// 洗牌(打乱牌序)
void shuffeDeck(Card *deck);// 发牌(3个玩家各自17张牌,最后3张作为底牌)
void dealCards(Card *deck, Card *player1, Card *player2, Card *player3, Card *bottomCards);// 打印牌,根据数组中提供的花色和点数下标,获取对应字符串进行显示
void printCard(Card card);int main(int argc, char *argv[])
{// 创建一个数组,用来存放一副牌(54张,包含大小王)Card deck[LEN];// 创建三个数组,用来存放3个玩家Card player1[17], player2[17], player3[17]; // 创建一个数组,用来存放底牌Card bottomCards[3];// 初始化牌initDeck(deck);// 洗牌shuffeDeck(deck);// 发牌(3个玩家各自17张牌,最后3张作为底牌)dealCards(deck, player1, player2, player3, bottomCards);// 打印玩家手牌和底牌int i;printf("玩家1的手牌:");for (i = 0; i < 17; i++) printCard(player1[i]); printf("\n");printf("玩家2的手牌:");for (i = 0; i < 17; i++) printCard(player2[i]); printf("\n");printf("玩家3的手牌:");for (i = 0; i < 17; i++) printCard(player3[i]); printf("\n");printf("底牌:");for (i = 0; i < 3; i++) printCard(bottomCards[i]); printf("\n");return 0;
}/*** @brief 初始化一副牌* * @param deck 一副牌*/
void initDeck(Card *deck)
{// 定义一个下标(0~53)int index = 0;// 初始化52张普通牌for (int suit = 0; suit < 4; suit++) // 遍历花色{for (int rank = 0; rank < 13; rank++) // 遍历点数{// 记录每张牌花色和点数的下标deck[index].suit = suit;  // 花色下标deck[index].rank = rank;  // 点数下标index++;}}// 初始化大小王deck[index].suit = 4; // 小王deck[index].rank = -1;index++;deck[index].suit = 5;deck[index].rank = -1;
}/*** @brief 洗牌(打乱牌序)* * @param deck */
void shuffeDeck(Card *deck)
{// 设置随机种子srand((unsigned)time(NULL));// 洗牌// 遍历当前的有序牌for (int i = 0; i < LEN; i++){// 随机生成0~53之间的数,作为交换牌的下标int j = rand() % LEN; // 0~53// 交换当前遍历牌跟随机牌的位置Card temp = deck[i];deck[i] = deck[j];deck[j] = temp;    }
}/*** @brief 发牌(3个玩家各自17张牌,最后3张作为底牌)* * @param deck * @param player1 * @param player2 * @param player3 * @param bottomCards */
void dealCards(Card *deck, Card *player1, Card *player2, Card *player3, Card *bottomCards)
{// 动态下标int index = 0;// 给玩家发牌// for (int i = 0; i < LEN; i++)// {//		if (i % 3 == 0) // 玩家1//		else if(i % 3 == 1) // 玩家2//		else if(i % 3 == 2) // 玩家3// }for (int i = 0; i < 17; i++){player1[i] = deck[index++]; // 玩家1player2[i] = deck[index++]; // 玩家2player3[i] = deck[index++]; // 玩家3}// 最后三张作为底牌for (int i = 0; i < 3; i++){bottomCards[i] = deck[index++];}
}/*** @brief 打印牌,根据数组中提供的花色和点数下标,获取对应字符串进行显示* * @param card */
void printCard(Card card)
{if (card.suit == 4 || card.suit == 5){// 大小王printf("%s ",jokers[card.suit - 4]);}else{// 普通牌printf("%s %s ",suits[card.suit], ranks[card.rank]);}
}

预处理

C语言的编译步骤

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接

什么是预处理

预处理就是在源文件(.c文件)编译之前,所进行的一部分预备操作,这部分操是由预处理器(预处理程序)自动完成。当源文件在编译时,编译器会自动调用预处理程序来完成预处理执行的操作,预处理执行解析完成才能进入下一步的编译过程。

查看预处理结果:

 gcc 源文件 -E -o 程序名

预处理功能

宏定义
不带参数的定义
  • 语法:

     #define 宏名称 宏值(替换文本)
    
  • **预处理机制:**此时的预处理只做数据替换,不做类型检查

  • **注意:**宏定义不会占用内存空间,因为在编译前已经将宏名称替换成了宏值

  • **宏展开:**在预处理阶段将宏名称替换成宏值的过程称之为“宏展开”。

  • 案例:

     /*************************************************************************> File Name:    demo01.c> Author:       rch> Description:  > Created Time: ************************************************************************/#include <stdio.h>#define PI 3.1415926int main(int argc,char *argv[]){float l,s,r,v;printf("请输入圆的半径:\n");scanf("%f",&r);// 计算周长l = 2.0 * PI * r;// 计算面积s = PI * r * r;printf("l=%10.4f\ns=%10.4f\n",l,s);return 0;}
带参数的定义
  • 语法:

    #define 宏名(参数列表) 替换表达式
    
  • 面试题:

    #define MULTI(a,b) (a)*(b)
    #define MULTI(a,b) a * b
    

    实现:

    /*************************************************************************> File Name:    demo02.c> Author:       rch> Description:  > Created Time: ************************************************************************/#include <stdio.h>// 带参数的宏定义,宏名一般小写
    #define MULTI_1(a,b) (a) * (b)
    #define MULTI_2(a,b)  a  *  bint main(int argc,char *argv[])
    {int result1 = MULTI_1(7+2,3); // (7+2) * (3) = 27printf("%d\n",result1);int result2 = MULTI_2(7+2,3); // 7 + 2 * 3 = 13printf("%d\n",result2);return 0;
    }
    
宏定义的作用域
  • #define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。

  • 可以用#undef命令终止宏定义的作用域。

  • 案例:

    /*************************************************************************> File Name:    demo04.c> Author:       rch> Description:  > Created Time: 2025-08-04 17:34:58************************************************************************/
    #include <stdio.h>#define PI 3.14    // PI的有效范围:10~18行
    #define DAY 29void func1()
    {float r = 4;float s = PI * r * r; // 预处理后:float s = 3.14 * r * rint day = DAY;        // 预处理后:int day = 29;
    }#undef PI// 终止了 PI的范围#define PI 3.1415926void func2()
    {float r = 4;float s = PI * r * r; // 预处理后:float s = 3.1415926 * r * rint day = DAY;        // 预处理后:int day = 29;
    }int main(int argc, char *argv[])
    {return 0;
    }
    
在宏定义中引用已定义的宏名
  • 案例:

    /*************************************************************************> File Name:    demo04.c> Author:       rch> Description:  > Created Time: ************************************************************************/#include <stdio.h>#define R 3.0   // 半径
    #define PI 3.14
    #define L  2 * PI * R   // 周长 在宏定义的时候,引入已定义的宏名
    #define S  PI * R * R   // 面积#define P_WIDTH = 800
    #define P_HEIGHT = 480
    #define SIZE = P_WIDTH * P_HEIGHTint main(int argc,char *argv[])
    {printf("L=%f\nS=%f\n",L,S);// 预处理后:2 * 3.14 * 3.0, 3.14 * 3.0 * 3.0return 0;
    }
    

章节作业

1. 学员信息结构体设计与平均分计算

设计一个结构体存储学员信息,并实现信息显示与平均分计算。

要求

  • 结构体包含学员姓名(字符数组)、学号(整数)、三门课程成绩(浮点数数组)。
  • 定义两个学员变量,输入成绩后计算并显示平均分。

提示

struct Student {char name[20];int id;float scores[3];
};
2. 商品信息结构体设计与显示

设计一个描述商品的结构体,并实现信息显示。

要求

  • 结构体包含商品名称(字符指针)、ID(整数)、价格(浮点数)、库存数量(短整型)。
  • 定义一个商品变量,初始化后显示所有信息。

提示

struct Product {char *name;int id;float price;short stock;
};
3. 商品信息管理系统(扩展作业 2)

在作业 2 基础上完成以下功能:

(1)存储与显示多个商品信息

  • 使用结构体数组存储 5 个商品信息,初始化后遍历显示。

(2)查询价格最高的商品

  • 遍历商品数组,找出价格最高的商品并显示其全部信息。

(3)静态与动态内存分配实现

  • 静态分配:使用结构体数组存储商品。
  • 动态分配:使用malloc申请内存存储商品,完成后用free释放。
4. 学生成绩管理系统(含枚举与共用体)

设计一个包含枚举和共用体的学生成绩管理系统。

功能要求:

  1. 数据结构设计

    • 用枚举定义成绩等级(enum Grade {A, B, C, D, E})。
    • 用共用体存储学生附加信息(如是否为班长is_monitor或奖学金等级scholarship)。
    enum Grade {A, B, C, D, E};
    union ExtraInfo {int is_monitor;  // 0/1enum Grade scholarship;  // 奖学金等级
    };
    struct Student {int id;char name[20];float scores[3];union ExtraInfo extra;
    };
    
  2. 核心功能

    • 添加学生:输入学号、姓名、三门课程成绩,以及附加信息(如是否为班长)。
    • 显示等级:根据平均分将成绩转换为枚举等级(如平均分≥90 为 A)。
    • 共用体应用:根据学生类型(普通生 / 奖学金获得者)存储不同附加信息。
5. 主机字节序检测(结合共用体)

设计程序检测电脑的字节序(大端 / 小端)。 要求

  • 使用共用体存储整数和字符数组,通过访问字符数组判断字节序。
  • 输出结果如:当前主机为小端序(低字节存低地址)

提示

union EndianCheck {int num;char bytes[4];
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91845.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91845.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91845.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus-3--Prometheus是怎么抓取Java应用,Redis中间件,服务器环境的指标的?

1、Prometheus抓取Java应用的指标 1、数据来源&#xff1a;Java应用自身暴露的指标 Java应用的指标数据来源于应用代码中定义的指标对象&#xff08;如Counter、Gauge、Histogram等&#xff09;&#xff0c;通过Prometheus客户端库&#xff08;如io.prometheus:client_java&…

42.安卓逆向2-补环境-unidbg安装和简单使用

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

数据结构与算法:哈希函数的应用及一些工程算法

前言这篇里的东西可以说了解了解就行了。一、哈希函数均匀性展示原本让deepseek转了一下老师的java代码&#xff0c;但发现复刻起来太麻烦了。又因为这个理解就好&#xff0c;竞赛不会有&#xff0c;所以就直接贴老师的java代码了……import java.security.MessageDigest; impo…

交叉编译ARM环境

ARM交叉编译 可以采用交叉编译工具链&#xff1a; sudo apt-get install aarch64-linux-gnu-gcc sudo apt-get install aarch64-linux-gnu-g sudo apt-get install gcc-arm-linux-gnueabi sudo apt-get install g-arm-linux-gnueabi 上面两个是64位&#xff0c;下面两个是…

算法思想 之 拓扑排序问题

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想 之 拓扑排序问题 发布时间&#xff1a;2025.8.4 隶属专栏&#xff1a;算法 目录算法介绍核心原理适用场景实现步骤(Kahn 算法)例题课程表题目链接题目描述算法思路代码实现课程表 II题目链接题目描述算法思…

机器学习 入门——决策树分类

决策树是一种直观且强大的机器学习算法&#xff0c;适用于分类和回归任务。本文将全面介绍决策树分类的原理、实现、调优和实际应用。一、什么是决策树分类1.概念决策树分类是一种树形结构的分类模型&#xff0c;它通过递归地将数据集分割成更小的子集来构建决策规则。就像我们…

虚拟机中查看和修改文件权限

在虚拟机中管理文件权限是系统管理的重要部分&#xff0c;无论是在Linux还是Windows虚拟机中。下面我将详细介绍两种主要系统的权限管理方法。Linux虚拟机中的文件权限管理查看文件权限使用ls命令&#xff1a;ls -l 文件名输出示例&#xff1a;-rwxr-xr-- 1 user group 1024 Ju…

图像处理拉普拉斯算子

AI对话记录&#xff0c;还没有来得及仔细验证和推导&#xff0c;目前只是记录 当然可以&#xff01;我们来一步步推导拉普拉斯算子在旋转变换下保持不变的数学过程。这里以二维情况为例&#xff0c;最直观也最常见。&#x1f9ee; 拉普拉斯算子旋转不变性的推导&#xff08;二维…

React ahooks——副作用类hooks之useThrottleEffect

useThrottleEffect 是 ahooks 提供的节流版 useEffect&#xff0c;它在依赖项变化时执行副作用函数&#xff0c;但会限制执行频率。一、基本语法useThrottleEffect(effect: React.EffectCallback,deps?: React.DependencyList,options?: Options )二、参数详解2.1. effect (必…

【建模与仿真】融合画像约束和潜在特征的深度推荐算法

导读&#xff1a; 基于深度学习的推荐算法已成为推荐系统领域的研究趋势。然而&#xff0c;大多数现有工作仅考虑单一的用户与物品交互数据&#xff0c;限制了算法的预测性能。本文提出一种画像约束的编码方式&#xff0c;并融合隐因子模型中的潜在特征&#xff0c;丰富了推荐…

华为网路设备学习-26(BGP协议 二)路径属性

一、属性分类二、属性含义①公认必遵&#xff1a;所有BGP对等体 必须识别 且 在Update报文中携带1.Origin2.AS-Path3.Next hop②公认自决&#xff1a;所有BGP对等体 必须识别但可以不在Update报文中携带 1.Local-Preference2.ATOMIC_Aggregate③可选传递&#xff1a;所有BGP对…

从0搭建YOLO目标检测系统:实战项目+完整流程+界面开发(附源码)

文章目录一、前言二、专栏介绍三、已有系统介绍3.0 基于yolo通用目标检测系统&#xff08;手把手教你修改成为自己的检测系统&#xff09;3.1 基于yolov8柑橘检测系统3.2 基于yolov8舰船检测系统3.3 基于yolo11人脸检测系统3.4 基于yolov8无人机影像光伏板缺陷检测系统一、前言…

【测试】自动化测试工具基础知识及基本应用

下面详细介绍一些常用的自动化测试工具及其基本概念&#xff0c;并提供具体的示例代码&#xff0c;帮助你更好地理解和应用这些工具。1. 自动化测试的基本概念自动化测试是通过软件程序自动执行测试用例的过程。与手动测试相比&#xff0c;自动化测试能够提高测试效率、减少人为…

ArcGIS的字段计算器生成随机数

在ArcGIS的字段计算器中使用Python脚本生成0-100的随机数&#xff0c;可以按照以下步骤操作&#xff1a; 打开属性表&#xff0c;选择要计算的字段打开字段计算器选择"Python"解析器勾选"显示代码块"在"预逻辑脚本代码"中输入以下代码在下方表达…

【前端:Html】--1.1.基础语法

目录 1.HTML--简介 2.HTML--编译器 步骤一:启动记事本 步骤二:用记事本来编辑 HTML 步骤三:保存 HTML 步骤四:在浏览器中运行 HTML 3.HTML--基础 3.1.HTML声明--!DOCTYPE 3.2.HTML 标题--h1 3.3.HTML 段落--p 3.3.1. 水平线--hr 3.3.2.换行符--br 3.3.3.固定格式…

FreeSWITCH 简单图形化界面46 - 收集打包的一些ASR服务

FreeSWITCH 简单图形化界面46 - 收集打包的一些ASR服务 0、一个fs的web配置界面预览1、docker地址2、使用2.1 下载2.2 运行 3、例子3.1 下载3.2 启动3.3 编译mod_audio_fork或者mod_audio_stream模块使用3.4 编写呼叫路由和呼叫脚本呼叫路由呼叫脚本 3.5 esl捕获识别结果3.6 其…

20250805问答课题-实现TextRank + 问题分类

textRank的工具包实现其他可能的实现方法&#xff0c;对比结果查找分类的相关算法 目录 1. 关键词提取TF-IDF TextRank 1.1. TF-IDF算法 1.2. TextRank算法 1.3. 双算法提取关键词 2. 问题分类 2.1. 预处理 2.2. 获取BERT向量 2.3. 一级标签预测 2.4. 二级标签预测 3…

Memcached缓存与Redis缓存的区别、优缺点和适用场景

一、核心差异概述特性MemcachedRedis​数据结构​简单键值存储丰富数据结构&#xff08;String/Hash/List/Set等&#xff09;​持久化​不支持支持RDB和AOF两种方式​线程模型​多线程单线程&#xff08;6.0支持多线程I/O&#xff09;​内存管理​Slab分配LRU淘汰多种淘汰策略&…

Git简易教程

Git教程 VCS Version Control System版本控制系统 配置用户名邮箱 配置用户名和邮箱 git config --global user.name mihu git config --global user.email aaabbb.com初始化仓库 从项目仓库拉 git clone [项目地址]新建文件夹之后 git init提交操作 提交到仓库 git add . #把…

关于Web前端安全之XSS攻击防御增强方法

仅依赖前端验证是无法完全防止 XSS的&#xff0c;还需要增强后端验证&#xff0c;使用DOMPurify净化 HTML 时&#xff0c;还需要平衡安全性与业务需求。一、仅依赖前端验证无法完全防止 XSS 的原因及后端验证的重要性1. 前端验证的局限性前端验证&#xff08;如 JavaScript 输入…