C語言:構造類型學習

內容提要

  • 構造類型
    • 枚舉類型
    • 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 輸入…