數據結構順序表實現通訊錄

目錄

1. 前言:

2.通訊錄項目的創建

3. 通訊錄的實現

3.1 通訊錄的初始化

3.2 通訊錄的銷毀

3.3 通訊錄添加數據

3.4 通訊錄查找數據

3.5 通訊錄展示數據?

?3.6 通訊錄刪除數據

?3.7 通訊錄修改數據

?4. 通訊錄完整代碼

4.1 test.c

4.2 SeqList.h

4.3 SeqList.c

?4.4 Contact.h

4.5 Contact.c


1. 前言:

想必大家也都用過手機上面的通訊錄吧,手機上面的通訊錄有著許多的功能,可以新建聯系人,刪除聯系人,查找聯系人,修改聯系人等等一系列的功能,我們其實也可以使用數據結構中的順序表來模擬實現一下這樣功能。

本章主要講述利用順序表來實現一個簡單的通訊錄項目

2.通訊錄項目的創建

通訊錄項目在以順序表的結構上面會多增加兩個文件

通訊錄頭文件Contact.h和通訊錄源文件Contact.h

我們之前使用順序表數據是用的整型,但是我們想要實現一個通訊錄,那么單單一個整型的數據肯定是不能完成的,通訊錄里面的數據要有聯系人姓名,聯系人性別,聯系人年齡,聯系人電話,聯系人住址,一想到需要這么多數據,我們不免就會用到結構體了。

Contact.h 創建結構體

//這里我們用#define來定義大小,方便后續修改
#define NAME_MAX  20
#define GENDER_MAX   20
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct SeqList son;//這里我們把順序表重新命名為son//創建一個存放聯系人數據的結構體
typedef struct personinfo
{char name[NAME_MAX];//姓名char gender[GENDER_MAX];//性別int age;//年齡char tel[TEL_MAX];//電話char addr[ADDR_MAX];//住址
}person;

我們在SeqList.h里面包含通訊錄頭文件,并把int類型修改為struct類型

這里我們的test.c里面也包含通訊錄頭文件

?這里我們把int類型修改成struct類型之后,在SeqList.c里面我們的查找方法和打印方法就會報錯,這時我們只需要注釋掉這兩個方法就好了。

最后在Contact.c里面包含通訊錄頭文件和順序表頭文件

3. 通訊錄的實現

3.1 通訊錄的初始化

思路:

我們在之前寫順序表的時候,寫過初始化的方法,我們可以直接調用這個方法為我們的通訊錄進行初始化

Contact.c

void ConInit(son* con)
{assert(con);//判斷con是否為空指針//這里我們在順序表里面就寫過初始化的方法,我們直接調用,這個就是初始化方法的復用SLInit(con);
}

通訊錄初始化的測試

3.2 通訊錄的銷毀

思路:

我們寫順序表時也寫過銷毀方法,我們這里直接調用方法就可以了

?Contact.c

void ConDestroy(son* con)
{assert(con);//判斷con是否為空指針SLDestroy(con);//順序表銷毀方法復用
}

通訊錄的銷毀測試

3.3 通訊錄添加數據

思路:

在我們對通訊錄添加數據之前,我們需要檢查一下空間大小是否足夠,不夠申請空間,調用我們之前順序表的空間檢查,增容函數,然后,我們創建一個結構體,把我們想要添加的聯系人數據都寫上,最后我們在寫順序表時有三種插入方法,我們這里選擇尾插,調用尾插方法,將創建的結構體變量傳過去,這樣通訊錄添加數據就完成了

Contact.h

void ConAdd(son* con)
{assert(con);//判斷con是否為空指針//在我們添加聯系人數據之前,我們需要檢查空間大小SLCheckCapacity(con);//這里我們創建一個結構體變量person p;//我們在這里將我們添加聯系人的數據寫入到p結構體里面//這里姓名,性別,電話,住址都是數組,數組名是首元素的地址,所以不需要取地址符號printf("請輸入你要添加聯系人的姓名\n");scanf("%s", p.name);printf("請輸入你要添加聯系人的性別\n");scanf("%s", p.gender);printf("請輸入你要添加聯系人的年齡\n");scanf("%d", &(p.age));//age是整型,需要取地址printf("請輸入你要添加聯系人的電話\n");scanf("%s", p.tel);printf("請輸入你要添加聯系人的住址\n");scanf("%s", p.addr);//在這里我們寫了3中插入數據的方法,隨便調用一種即可,我們選擇尾插printf("聯系人新建成功!\n");SLPushBack(con, p);//我們將p結構體尾插進去
}

通訊錄添加數據測試

3.4 通訊錄查找數據

思路:

我們一般想要在通訊錄里面查找聯系人一般直接就是查找聯系人的姓名,這里我們也是這樣思考的,我們直接創建一個字符數組來接收要查找的聯系人姓名,然后再通訊錄里面利用循環的方法進行查找,然后找到聯系人了,我們就把它的數據都打印出來,這樣通訊錄查找數據就完成了。

Contact.c

int Confind(son* con,char name[])
{int i = 0;//循環查找for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name,name) == 0){return i;}}return -1;
}
void ConFind(son* con)
{assert(con);//判斷con是否為空指針//在這里我們創建一個字符數組用來接收輸入要查找的聯系人姓名char name[NAME_MAX];printf("請輸入你要查找的聯系人姓名\n");scanf("%s",name);//寫一個查找函數,在通訊錄里面循環查找int find =Confind(con,name);//查找到了返回下標,如果沒有查找到返回不是下標的數if (find < 0){printf("你要查找的聯系人不存在!\n");}else{   //當我們查找到了,就把它打印出來printf("姓名 性別 年齡 電話 住址\n");printf("%4s %4s %4d %4s %4s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);}
}

?通訊錄查找數據測試:

3.5 通訊錄展示數據?

思路:

我們直接利用循環來打印通訊里里面的所有聯系人數據

Contact.c

void ConShow(son* con)
{assert(con);//判斷con是否為空指針printf("姓名 性別 年齡 電話 住址\n");int i = 0;for (i = 0; i < con->size; i++){printf("%4s %4s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}

通訊錄展示數據測試

?3.6 通訊錄刪除數據

思路:

這個刪除數據,首先我們肯定要考慮到通過聯系人姓名進行刪除聯系人數據,我們要先創建一個字符數據來接收我們要刪除的聯系人姓名,然后利用前面寫過的查找函數,來判斷聯系人是否在通訊錄里面,最后,我們利用在前面順序表里面寫過的指定位置刪除的方法進行刪除,這樣通訊錄刪除數據就完成了

Contact.c

void ConDel(son* con)
{assert(con);//判斷con是否為空指針char name[NAME_MAX];//創建變量來接收要刪除的聯系人姓名printf("請輸入你要刪除的聯系人姓名\n");scanf("%s", name);//這里先調用一下查找函數,看看聯系人是否存在int find = Confind(con,name);if (find < 0){printf("你要刪除的聯系人不存在\n");}else{printf("聯系人刪除成功!\n");//這里我們在前面順序表里面寫過在指定位置刪除,進行復用SLEarse(con,find);}
}

通訊錄刪除數據測試

?

?3.7 通訊錄修改數據

思路:

這里,我們是要對在通訊錄里面的聯系人數據進行修改,那我們肯定先查找要修改的聯系人姓名在不在通訊錄里面,利用查找函數,如果存在,直接進行修改

Contact.

void ConModify(son* con)
{assert(con);//判斷con是否為空指針char name[NAME_MAX];//創建變量來接收要修改的聯系人姓名printf("請輸入你要修改的聯系人姓名\n");scanf("%s",name);//這里先調用一下查找函數,看看聯系人是否存在int find = Confind(con, name);if (find < 0){printf("你要修改的聯系人不存在\n");}else{   //我們直接在這里進行修改printf("請輸入你要新建聯系人的姓名\n");scanf("%s", con->arr[find].name);printf("請輸入你要新建聯系人的性別\n");scanf("%s", con->arr[find].gender);printf("請輸入你要新建聯系人的年齡\n");scanf("%d", &(con->arr[find].age));//age是整型,需要取地址printf("請輸入你要新建聯系人的電話\n");scanf("%s", con->arr[find].tel);printf("請輸入你要新建聯系人的住址\n");scanf("%s", con->arr[find].addr);}printf("聯系人修改成功!\n");
}

通訊錄修改數據測試

?

?4. 通訊錄完整代碼

4.1 test.c

#include"SeqList.h"//包含順序表頭文件
#include"Contact.h"//包含通訊錄頭文件void menu()
{printf("----------通訊錄----------\n");printf("-------1.新建聯系人-------\n");printf("-------2.刪除聯系人-------\n");printf("-------3.展示聯系人-------\n");printf("-------4.查找聯系人-------\n");printf("-------5.修改聯系人-------\n");printf("-------0.退出通訊錄-------\n");}
int main()
{int input = 0;son con;ConInit(&con);do{menu();printf("請選擇你的操作!\n");scanf("%d", &input);switch (input){case 1:ConAdd(&con);break;case 2:ConDel(&con);break;case 3:ConShow(&con);break;case 4:ConFind(&con);break;case 5:ConModify(&con);break;default:printf("選擇錯誤,請重新選擇!\n");break;}} while (input);return 0;
}

4.2 SeqList.h

#include"Contact.h"//下面是需要使用到的庫函數的頭文件
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>//typedef int SLData;//類型重命名,為了方便后續替換類型
//我們把int類型替換成strcut 類型
typedef person SLData;typedef struct SeqList //類型重命名
{SLData *arr;//定長數組int size;//順序表當前有效的數據個數int capacity;//容量大小
}sl;//順序表增容
void SLCheckCapacity(sl* ps);
//順序表初始化
void SLInit(sl* ps);
//順序表打印
void SLPaint(sl* ps);
//順序表尾插
void SLPushBack(sl* ps, SLData x);
//順序表頭插
void SLPushFront(sl* ps, SLData x);
//順序表尾刪
void SLPopBack(sl* ps);
//順序表頭刪
void SLPopFront(sl* ps);
//順序表指定位置之前插入
void SLInsert(sl* ps, int pos, SLData x);
//順序表指定位置刪除
void SLEarse(sl* ps, int pos);
//順序表修改指定位置數據
void SLModify(sl* ps,int pos, SLData x);
//順序表數據查找
int SLFind(sl* ps, SLData x);
//順序表銷毀
void SLDestroy(sl* ps);

4.3 SeqList.c

#include"SeqList.h"//包含順序表的頭文件void SLInit(sl* ps)
{assert(ps);//判斷ps是否為空指針//這里我們不知道這個順序表需求的大小ps->arr = NULL;//我們就先把指針置為空ps->size = ps->capacity = 0;//這里有效數據個數和可存儲數據個數都置為0;
}void SLDestroy(sl* ps)
{assert(ps);//判斷ps是否為空指針free(ps->arr);//釋放動態內存開辟的空間ps->arr = NULL;//防止ps->arr變成野指針ps->size = ps->capacity = 0;//將有效數據和空間大小置0
}void SLCheckCapacity(sl* ps)
{assert(ps);//判斷ps是否為空指針if (ps->size == ps->capacity)//判斷有效數據個數和可存儲數據個數,這里如果有效數據個數==可存儲數據個數,說明空間不夠了,需要增容{//這里利用三目操作符,判斷可用數據個數的大小,并創建相同變量來接收int tmp = ps->capacity == 0 ? 4 : 2 * ps->capacity;//這里我們用于同類型指針來接收realloc開辟空間返回的地址SLData* ptr = (SLData*)realloc(ps->arr, tmp * sizeof(SLData));//判斷是否開辟成功if (ptr == NULL){//開辟失敗,報錯perror("realloc");exit(1);//退出程序}//開辟成功,接收ps->arr = ptr;ps->capacity = tmp;//接收可用空間數據}
}void SLPushBack(sl* ps, SLData x)
{assert(ps);//斷言ps是否為空指針//檢查空間大小,不夠進行增容SLCheckCapacity(ps);//這里我們在size位置進行尾插,之后讓size++(后置++,先使用在++),用來記錄順序表中有效數據的個數ps->arr[ps->size++] = x;
}//void SLPaint(sl* ps)
//{
//	assert(ps);//判斷ps是否為空指針
//	int i = 0;
//	//循環打印
//	for (i = 0; i < ps->size; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	//換行
//	printf("\n");
//}void SLPushFront(sl* ps, SLData x)
{assert(ps);//判斷ps是否為空指針//判斷空間大小SLCheckCapacity(ps);int i = 0;//循環移動數據for (i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//將前面的數據復制到后一位}//這里i == 0,跳出循環ps->arr[i] = x;//讓順序表有效數據個數++ps->size++;
}void SLPopBack(sl* ps)
{assert(ps);//判斷ps是否為空指針assert(ps->size);//判斷順序表里面的有效數據個數ps->size--;
}void SLPopFront(sl* ps)
{assert(ps);//判斷ps是否為空指針assert(ps->size);//判斷順序表里面的有效數據個數int i = 0;//循環移動for (i = 0; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];//將后面值賦值給前一位}ps->size--;
}void SLInsert(sl* ps, int pos, SLData x)
{assert(ps);//判斷ps是否為空指針assert(pos >= 0 && pos < ps->size);//判斷刪除數據的范圍SLCheckCapacity(ps);//判斷空間大小int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//將數據整體往后移動一位}//i == pos 跳出循環ps->arr[i] = x;ps->size++;
}void SLEarse(sl* ps, int pos)
{assert(ps);//判斷ps是否為空指針assert(pos >= 0 && pos < ps->size);//判斷指定位置的范圍int i = 0;for (i = pos; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];//將指定位置之后的數據整體往前移動一位}ps->size--;
}void SLModify(sl* ps, int pos, SLData x)
{assert(ps);//判斷ps是否為空指針assert(pos >= 0 && pos < ps->size);//判斷指定位置是否合法ps->arr[pos] = x;
}

?4.4 Contact.h

//這里我們用#define來定義大小,方便后續修改
#define NAME_MAX  20
#define GENDER_MAX   20
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct SeqList son;//這里我們把順序表重新命名為son//創建一個存放聯系人數據的結構體
typedef struct personinfo
{char name[NAME_MAX];//姓名char gender[GENDER_MAX];//性別int age;//年齡char tel[TEL_MAX];//電話char addr[ADDR_MAX];//住址
}person;//通訊錄初始化
void ConInit(son* con);
//通訊錄銷毀
void ConDestroy(son* con);
//通訊錄添加數據
void ConAdd(son* con);
//通訊錄查找數據
void ConFind(son* con);
//通訊錄展示數據
void ConShow(son* con);
//通訊錄刪除數據
void ConDel(son* con);
//通訊錄修改數據
void ConModify(son* con);

4.5 Contact.c

#include"Contact.h"
#include"SeqList.h"void ConInit(son* con)
{assert(con);//判斷con是否為空指針//這里我們在順序表里面就寫過初始化的方法,我們直接調用,這個就是初始化方法的復用SLInit(con);
}void ConDestroy(son* con)
{assert(con);//判斷con是否為空指針SLDestroy(con);//順序表銷毀方法復用
}void ConAdd(son* con)
{assert(con);//判斷con是否為空指針//在我們添加聯系人數據之前,我們需要檢查空間大小SLCheckCapacity(con);//這里我們創建一個結構體變量person p;//我們在這里將我們添加聯系人的數據寫入到p結構體里面//這里姓名,性別,電話,住址都是數組,數組名是首元素的地址,所以不需要取地址符號printf("請輸入你要添加聯系人的姓名\n");scanf("%s", p.name);printf("請輸入你要添加聯系人的性別\n");scanf("%s", p.gender);printf("請輸入你要添加聯系人的年齡\n");scanf("%d", &(p.age));//age是整型,需要取地址printf("請輸入你要添加聯系人的電話\n");scanf("%s", p.tel);printf("請輸入你要添加聯系人的住址\n");scanf("%s", p.addr);printf("聯系人新建成功!\n");printf("--------------------------\n");//在這里我們寫了3中插入數據的方法,隨便調用一種即可,我們選擇尾插SLPushBack(con, p);//我們將p結構體尾插進去
}int Confind(son* con,char name[])
{int i = 0;//循環查找for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name,name) == 0){return i;}}return -1;
}
void ConFind(son* con)
{assert(con);//判斷con是否為空指針//在這里我們創建一個字符數組用來接收輸入要查找的聯系人姓名char name[NAME_MAX];printf("請輸入你要查找的聯系人姓名\n");scanf("%s",name);//寫一個查找函數,在通訊錄里面循環查找int find =Confind(con,name);//查找到了返回下標,如果沒有查找到返回不是下標的數if (find < 0){printf("你要查找的聯系人不存在!\n");return;//提前返回}else{   //當我們查找到了,就把它打印出來printf("姓名 性別 年齡 電話 住址\n");printf("%4s %4s %4d %4s %4s\n",con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);}
}void ConShow(son* con)
{assert(con);//判斷con是否為空指針printf("姓名 性別 年齡 電話 住址\n");int i = 0;for (i = 0; i < con->size; i++){printf("%4s %4s %4d %4s %4s\n",con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}void ConDel(son* con)
{assert(con);//判斷con是否為空指針char name[NAME_MAX];//創建變量來接收要刪除的聯系人姓名printf("請輸入你要刪除的聯系人姓名\n");scanf("%s", name);//這里先調用一下查找函數,看看聯系人是否存在int find = Confind(con,name);if (find < 0){printf("你要刪除的聯系人不存在\n");return;//提前返回}else{//這里我們在前面順序表里面寫過在指定位置刪除,進行復用printf("聯系人刪除成功!\n");SLEarse(con,find);}
}void ConModify(son* con)
{assert(con);//判斷con是否為空指針char name[NAME_MAX];//創建變量來接收要修改的聯系人姓名printf("請輸入你要修改的聯系人姓名\n");scanf("%s",name);//這里先調用一下查找函數,看看聯系人是否存在int find = Confind(con, name);if (find < 0){printf("你要修改的聯系人不存在\n");}else{   //我們直接在這里進行修改printf("請輸入你要新建聯系人的姓名\n");scanf("%s", con->arr[find].name);printf("請輸入你要新建聯系人的性別\n");scanf("%s", con->arr[find].gender);printf("請輸入你要新建聯系人的年齡\n");scanf("%d", &(con->arr[find].age));//age是整型,需要取地址printf("請輸入你要新建聯系人的電話\n");scanf("%s", con->arr[find].tel);printf("請輸入你要新建聯系人的住址\n");scanf("%s", con->arr[find].addr);}printf("聯系人修改成功!\n");
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14526.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL學習筆記

PostgreSQL 基本概念和架構 PostgreSQL 是一個功能強大的開源對象關系數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;其設計目標是遵循 SQL 標準&#xff0c;并提供豐富的功能&#xff0c;如復雜查詢、外鍵、觸發器、視圖和事務處理。以下是 PostgreSQL 的基本概念…

數據結構(Java實現):ArrayList

目錄 1.ArrayList簡介2.ArrayList構造方法分析3.ArrayList的add方法以及擴容機制4.ArrayList常用方法5.ArrayList遍歷6.ArrayList的缺陷 1.ArrayList簡介 在集合框架中&#xff0c;ArrayList是一個普通的類&#xff0c;實現了List接口&#xff0c;具體框架圖如下&#xff1a; …

編寫一個llvm編譯器插件,完成在store匯編指令前對內存合法性的check。

dds(iceoryx、fastdds等)中間件采用了共享內存&#xff0c;如果app內存越界將共享內存踩踏壞了&#xff0c;將會形成災難。本插件可以檢測到app是否在寫共享內存&#xff0c;如果是&#xff0c;我們可以讓app assert。從而提高dds的穩定性 插件效果&#xff1a; 插件源碼&…

話題:如何讓大模型變得更聰明?

隨著人工智能&#xff08;AI&#xff09;技術的迅速發展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然語言處理、圖像識別和語音識別等領域取得了顯著成果。然而&#xff0c;如何讓大模型變得更聰明&#xff0c;進一步提升其性能和應用效果&a…

Netty: Netty中的組件

文章目錄 一、EventLoop1、EventLoop2、EventLoopGroup&#xff08;1&#xff09;處理普通時間和定時任務&#xff08;2&#xff09;處理IO任務 二、Channel三、Future&Promise四、Handler&Pipeline五、ByteBuf 一、EventLoop 1、EventLoop EventLoop本質是一個單線程…

Jetbrain | IDEA的啟動logo替換成可愛的vtuber-logo

看了這個&#xff0c;好可愛 【上Github熱榜了&#xff01;當編程語言的Logo變得可愛起來~】 又看了這個 光速整活&#xff0c;強啊 看到很多人整IDEA的logo包括我自己&#xff0c;都不是特別方便的搞&#xff0c;我就直接把文件放在綁定資源里直接下吧 然后直接找到本體的安…

ios swift5 codable字典轉模型,第三方庫SmartCodable

文章目錄 1.用第三方庫SmartCodable, github地址2.使用示例 1.用第三方庫SmartCodable, github地址 SmartCodable - github 2.使用示例 import Foundation import SmartCodablestruct CommonModel: SmartCodable {var message: String ""var success: Bool fals…

【深度學習】與【PyTorch實戰】

目錄 一、深度學習基礎 1.1 神經網絡簡介 1.2 激活函數 1.3 損失函數 1.4 優化算法 二、PyTorch基礎 2.1 PyTorch簡介 2.2 張量操作 2.3 構建神經網絡 2.4訓練模型 2.5 模型評估 三、PyTorch實戰 3.1 數據加載與預處理 3.2 模型定義與訓練 3.3 模型評估與調優 3…

成都青年AI人才嶄露頭角,知了匯智科技助力孵化營大放異彩

5月18日-19日&#xff0c;為期兩天的成都國際商貿城青年&#xff08;大學生&#xff09;AI應用孵化營活動在熱烈的氛圍中圓滿落幕。本次活動由成都國際商貿城、成都成商數字科技有限公司、成都知了匯智科技有限公司及成都電商職教集團聯合舉辦&#xff0c;旨在為青年&#xff0…

丟失api-ms-win-crt-runtime-l1-1-0.dll的多種解決方法分析,教你簡單的一鍵修復

在使用Windows操作系統時&#xff0c;用戶可能會遇到一個涉及丟失 ?api-ms-win-crt-runtime-l1-1-0.dll文件的警告&#xff0c;這可能導致某些程序無法正常運行。該DLL文件屬于Microsoft Visual C Redistributable軟件包的一部分&#xff0c;這個軟件包為多個應用提供運行時支…

Mybatis-plus的兩種分頁方案

Mybatis-plus的兩種分頁方案 底層的邏輯是寫出最終執行的sql或者selectPage方法等&#xff0c;中間需要配置相應的page攔截器。 注意&#xff1a;如沒有配置攔截器&#xff0c;直接執行就會存在total的值為0&#xff0c;此方法無效。 1. 基于MP的IPage接口實現 使用步驟&am…

深度學習-Softmax回歸+損失函數+圖像分類數據集

目錄 Softmax回歸回歸 VS 分類Kaggle上的分類問題 從回歸到多類分類回歸分類從回歸到多類分類-均方損失從回歸到多類分類-無校驗比例從回歸到多類分類-校驗比例 Softmax和交叉熵損失總結損失函數均方損失絕對值損失函數魯棒損失 圖像分類數據集通過框架中內置函數將FashionMNIS…

RabbitMQ---交換機-Fanout-Direct

Publisher&#xff1a;生產者&#xff0c;不再發送消息到隊列中&#xff0c;而是發給交換機Exchange&#xff1a;交換機&#xff0c;一方面&#xff0c;接收生產者發送的消息。另一方面&#xff0c;知道如何處理消息&#xff0c;例如遞交給某個特別隊列、遞交給所有隊列、或是將…

刪除實例分割中的特定標簽

用labelme軟件對圖像進行實例分割或語義分割標注后會得到json文件&#xff0c;如果想要刪除某個特定標簽&#xff0c;可以使用如下代碼&#xff0c;完整代碼下載地址&#xff1a;代碼地址 import json import os# 要處理的json文件夾路徑 folder_path H:/json # 需要刪除的標…

如何一鍵生成多個文本二維碼?excel表格批量生碼的方法

現在很多人會將文本信息做成二維碼來展示&#xff0c;當有同類型內容生成大量二維碼時&#xff0c;可以使用將文本導入excel表格的方式&#xff0c;將表格中的每條數據批量生成二維碼&#xff0c;可以有效提升二維碼制作的速度和效率。下面就讓小編來將具體的操作步驟分享給大家…

LangChain API 2.0

轉載整理自&#xff1a;https://api.python.langchain.com/en/latest/langchain_api_reference.html 文章目錄 1、langchain.agentsClassesFunctions 2、langchain.callbacksClasses 3、langchain.chainsClassesFunctions 4、langchain.embeddingsClasses 5、langchain.evaluat…

二叉樹順序結構及鏈式結構

一.二叉樹的順序結構 1.定義&#xff1a;使用數組存儲數據&#xff0c;一般使用數組只適合表示完全二叉樹&#xff0c;此時不會有空間的浪費 注&#xff1a;二叉樹的順序存儲在邏輯上是一顆二叉樹&#xff0c;但是在物理上是一個數組&#xff0c;此時需要程序員自己想清楚調整…

http流式返回

HTTP流式返回&#xff08;Stream&#xff09;是一種服務器向客戶端傳輸數據的方式允許數據分塊發送而不是一次性發送完畢。 這樣客戶端可以在接收到第一部分數據時就開始處理&#xff0c;而不必等待整個響應完成。 應用場景&#xff1a; 2.1 業務場景&#xff1a;圖表的監聽&a…

手動安裝maven依賴到本地倉庫

使用mvn install命令安裝jar包到指定的倉庫。 命令如下&#xff1a; mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解釋…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的監控解決方案

業內比較著名的監控解決方案&#xff0c;據筆者所知&#xff0c;大概是三套&#xff1a; 一個是zabbix的解決方案&#xff0c;一個是prometheusgrafana&#xff0c;一個是ELK zabbix比較重&#xff0c;而且原生支持監控SNMP&#xff0c;自帶一個儀表盤&#xff0c;不需要額外…