通訊錄完善版本(詳細講解+源碼)

目錄

前言

一、使通訊可以動態更新內存

1、contact.h

2、contact.c

存信息:

刪除聯系人,并試一個不存在的人的信息,看看會不會把其他人刪了

?編輯

修改:

?編輯

排序:

?編輯

銷毀:

?編輯

?編輯

二、通訊錄的信息保存,加載

通訊錄的信息保存;

再增加一個保存信息的函數

Save_Contact:

再增加一個從文件中加載信息的函數

Load_Contact:

?編輯

?編輯

三、下面是完整的代碼:

test.c

castact.c

contact.h

總結


前言

? ? ?經過長達六個月的時間,年邁的博主終于想起來,通訊錄還需要完善,那么這篇文章就對我們的初代通訊錄(初代通訊錄(詳細講解+代碼)_化學系通訊錄最簡單三個步驟-CSDN博客)進行完善,增加動態更新內存的內容,以及建立一個文件,將通訊錄的信息保存下來;


一、使通訊可以動態更新內存

我們先看一下原通訊錄

1、contact.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<math.h>
#pragma once#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100//定義人的信息
typedef struct PeoInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;//定義通訊錄的信息
typedef struct Contact
{PeoInfo data[MAX];//存放人的信息int sz;//記錄目前通訊錄中存放的人的信息個數
}Contact;//初始化通訊錄
void Init_Contact(Contact* pc);
//增加聯系人
void Add_Contact(Contact* pc);
//刪除聯系人
void Del_Contact(Contact* pc);
查找聯系人
void Search_Contact(Contact* pc);
修改聯系人信息
void Modify_Contact(Contact* pc);
通訊錄信息查看
void Show_Contact(Contact* pc);
通訊錄信息排列
void Sort_Contact(Contact* pc);
2、contact.c
#include"contact.h"//初始化通訊錄
void Init_Contact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));}
//增加聯系人
void Add_Contact(Contact* pc)
{assert(pc);if (pc->sz == MAX){printf("通訊錄滿了,無法添加");return;}//添加一個聯系人的信息//printf("請輸入你要添加的聯系人的信息:");//scanf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n", pc->data[pc->sz].name, pc->data[pc->sz].sex, &(pc->data[pc->sz].age), pc->data[pc->sz].tele, pc->data[pc->sz].addr);printf("請輸入姓名:");scanf("%s", pc->data[pc->sz].name);printf("請輸入性別:");scanf("%s", pc->data[pc->sz].sex);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age)); printf("請輸入電話:");scanf("%s", pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;}
//刪除聯系人
void Del_Contact(Contact* pc)
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空,無法刪除");return;}//不為空,刪除printf("請輸入要刪除人的名字:");scanf("%s", name);int i = 0;int del = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){del = i;break;}}for (i = del; i < pc->sz-1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("已成功刪除該聯系人");}
//查找聯系人
void Search_Contact(Contact* pc)
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空");return;}printf("請輸入要查找的人的名字:");scanf("%s", name);int i = 0;int pos = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;			}}printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址");printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].sex,pc->data[pos].age,pc->data[pos].tele,pc->data[pos].addr);}
//修改聯系人信息
void Modify_Contact(Contact* pc) 
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空,無法修改");return;}printf("請輸入要修改的人的名字:");scanf("%s", name);int i = 0;int pos = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;}}printf("請輸入姓名:");scanf("%s", pc->data[pos].name);printf("請輸入性別:");scanf("%s", pc->data[pos].sex);printf("請輸入年齡:");scanf("%d", &(pc->data[pos].age));printf("請輸入電話:");scanf("%s", pc->data[pos].tele);printf("請輸入地址:");scanf("%s", pc->data[pos].addr);}
//通訊錄信息查看/打印通訊錄
void Show_Contact(Contact* pc)
{assert(pc);printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}}
int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}//通訊錄信息排列
void Sort_Contact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通訊錄為空,無法排序\n");return;}qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_name);printf("排序完成\n");}

可以看到原通訊錄是用100大小的靜態數組存儲信息的,現在我們將其改為動態的數組;

主要是初始化,增加聯系人,信息排列,銷毀通訊錄需要用到動態內存管理;

動態內存函數可以在這里看:動態內存函數_內存創建用什么函數-CSDN博客

我們先將定義進行更改,增加容量capacity,以及將存放信息的data數組不加限制;

然后在初始化Init_Contact這里進行修改,先設置初始容量capacity的值,然后再通過malloc設置初始內存,再用assert斷言確保內存設置好了,不為空;

然后就是增加聯系人這塊,當通訊錄滿了即pc->sz == pc->capacity的時候,將pc->capacity乘2,增加容量,當然了,想擴大多少倍看你自己喜歡,然后再對存放數據的data數組經行擴容,擴成修改后的capacity大小;最后加個assert斷言

然后是信息排列

最后是對動態數組的銷毀,先將內存釋放掉,然后置為空,再將capacitysz置為0;

將各個功能都試一下;

存信息:

刪除聯系人,并試一個不存在的人的信息,看看會不會把其他人刪了

修改:

排序:

銷毀:

ok,這邊的通訊錄動態數組已經沒問題,我們接著來看

二、通訊錄的信息保存,加載

通訊錄的信息保存,加載涉及文件的讀寫操作:c語言文件操作-CSDN博客

通訊錄的信息保存;

首先創建一個記事本文檔,再在代碼中定義上

然后完善增加兩個函數的目錄

#include"contact.h"
void menu()
{printf("**************************************\n");printf("****** 1.add     2.del     ***********\n");printf("****** 3.search  4.modify  ***********\n");printf("****** 5.show    6.sort    ***********\n");printf("****** 7.save    8.load    ***********\n");printf("****** 0.exit   9.destory  ***********\n");printf("**************************************\n");}
enum
{Exit,Add,Del,Search,Modify,Show,Sort,Save,Load,Destory
};//directory
int main()
{//創建通訊錄Contact con;Init_Contact(&con);int input = 0;do{menu();printf("請輸入:");scanf("%d", &input);switch (input){case Exit:printf("已退出通訊錄\n");break; case Add:Add_Contact(&con);break;case Del:Del_Contact(&con);break;case Search:Search_Contact(&con);break;case Modify:Modify_Contact(&con);break;case Show:Show_Contact(&con);break;case Sort:Sort_Contact(&con);break;case Save:Save_Contact(&con);break; case Load:Load_Contact(&con);break;case Destory:Destory_Contact(&con); break;default:printf("選擇錯誤,請重新選擇\n");break;}	} while (input);//Destory_Contact(&con);return 0;
}

再增加一個保存信息的函數

Save_Contact:

void Save_Contact(Contact* pc) {assert(pc);FILE* file = fopen(FILENAME, "w");if (!file) {printf("無法打開文件進行保存\n");return;}for (int i = 0; i < pc->sz; i++) {fprintf(file, "%s %s %d %s %s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}fclose(file);printf("聯系人信息已經保存到文件\n");
}

再增加一個從文件中加載信息的函數

1. **打開文件**:
? ?- 使用 `fopen` 函數以只讀模式打開指定的文件。如果文件打開失敗,程序會輸出錯誤信息并返回。

2. **動態擴展內存**:
? ?- 在讀取每個聯系人之前,檢查當前的聯系人數量 `sz` 是否達到了當前容量 `capacity`。如果達到了,就使用 `realloc` 擴展內存,以便可以存儲更多的聯系人信息。

3. **讀取數據**:
? ?- 使用 `fscanf` 從文件中讀取每個聯系人的信息。格式字符串 `"%s %s %d %s %s\n"` 指定了要讀取的數據類型:
? ? ?- `%s` 用于讀取字符串(姓名、性別、電話、地址)。
? ? ?- `%d` 用于讀取整數(年齡)。

4. **存儲數據**:
? ?- 將讀取到的數據存儲到 `PeoInfo` 結構體的相應字段中。

為什么 `age` 需要加引用

在 C 語言中,`fscanf` 函數的工作原理是通過指針來修改變量的值。具體來說:

引用的概念:
?在 C 語言中,變量的值是存儲在內存中的某個地址。當你想要修改一個變量的值時,你需要提供這個變量的地址。
? 使用 `&` 符號可以獲取變量的地址。例如,`&pc->data[pc->sz].age` 獲取 `age` 字段的地址。

fscanf?的參數:
? fscanf的參數需要是指向變量的指針,以便它可以直接在內存中修改該變量的值。
? 對于 age字段,fscanf需要知道它的地址,以便將讀取到的整數值存儲到這個地址中。因此,必須使用 `&` 符號。

?示例:

假設我們有以下代碼:

int age;
fscanf(file, "%d", &age);

`&age` 將 `age` 變量的地址傳遞給 `fscanf`,這樣 `fscanf` 就可以在該地址上寫入讀取到的整數值。
- 如果不使用 `&`,例如 `fscanf(file, "%d", age);`,編譯器會報錯,因為 `age` 是一個整數,而 `fscanf` 需要的是一個指向整數的指針。

Load_Contact:

void Load_Contact(Contact* pc) {assert(pc);FILE* file = fopen(FILENAME, "r");if (!file) {printf("無法打開文件進行加載\n");return;}while (!feof(file)) {if (pc->sz == pc->capacity) {pc->capacity *= 2;pc->data = (PeoInfo*)realloc(pc->data, pc->capacity * sizeof(PeoInfo));//重新分配assert(pc->data);//確保內存分配成功}fscanf(file, "%s %s %d %s %s\n",pc->data[pc->sz].name,pc->data[pc->sz].sex,&pc->data[pc->sz].age,pc->data[pc->sz].tele,pc->data[pc->sz].addr);pc->sz++;}fclose(file);printf("聯系人信息已經加載\n");
}

再來驗一下貨,看看我們的代碼靈不靈

應該是沒有問題

三、下面是完整的代碼:
test.c
#include"contact.h"
void menu()
{printf("**************************************\n");printf("****** 1.add     2.del     ***********\n");printf("****** 3.search  4.modify  ***********\n");printf("****** 5.show    6.sort    ***********\n");printf("****** 7.save    8.load    ***********\n");printf("****** 0.exit   9.destory  ***********\n");printf("**************************************\n");}
enum
{Exit,Add,Del,Search,Modify,Show,Sort,Save,Load,Destory
};//directory
int main()
{//創建通訊錄Contact con;Init_Contact(&con);int input = 0;do{menu();printf("請輸入:");scanf("%d", &input);switch (input){case Exit:printf("已退出通訊錄\n");break; case Add:Add_Contact(&con);break;case Del:Del_Contact(&con);break;case Search:Search_Contact(&con);break;case Modify:Modify_Contact(&con);break;case Show:Show_Contact(&con);break;case Sort:Sort_Contact(&con);break;case Save:Save_Contact(&con);break; case Load:Load_Contact(&con);break;case Destory:Destory_Contact(&con); break;default:printf("選擇錯誤,請重新選擇\n");break;}	} while (input);//Destory_Contact(&con);return 0;
}
castact.c
#include"contact.h"//初始化通訊錄
void Init_Contact(Contact* pc)
{assert(pc);pc->sz = 0;pc->capacity = 2;//設置初始容量pc->data = (PeoInfo*)malloc(pc->capacity * sizeof(PeoInfo));//初始內存assert(pc->data);//確保內存不為空}
//增加聯系人
void Add_Contact(Contact* pc)
{assert(pc);if (pc->sz == pc->capacity){//printf("通訊錄滿了,無法添加");//return;pc->capacity *= 2;pc->data = (PeoInfo*)realloc(pc->data,pc->capacity*sizeof(PeoInfo));assert(pc->data);//確保內存分配成功}//添加一個聯系人的信息//printf("請輸入你要添加的聯系人的信息:");//scanf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n", pc->data[pc->sz].name, pc->data[pc->sz].sex, &(pc->data[pc->sz].age), pc->data[pc->sz].tele, pc->data[pc->sz].addr);printf("請輸入姓名:");scanf("%s", pc->data[pc->sz].name);printf("請輸入性別:");scanf("%s", pc->data[pc->sz].sex);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age)); printf("請輸入電話:");scanf("%s", pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;}
//刪除聯系人
void Del_Contact(Contact* pc)
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空,無法刪除");return;}//不為空,刪除printf("請輸入要刪除人的名字:");scanf("%s", name);int i = 0;int del = -1;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){del = i;break;}}if (del == -1) {printf("未找到該聯系人");return;}for (i = del; i < pc->sz-1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("已成功刪除該聯系人");}
//查找聯系人
void Search_Contact(Contact* pc)
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空");return;}printf("請輸入要查找的人的名字:");scanf("%s", name);int i = 0;int pos = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址");printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].sex,pc->data[pos].age,pc->data[pos].tele,pc->data[pos].addr);return;}}printf("未找到該聯系人");}
//修改聯系人信息
void Modify_Contact(Contact* pc) 
{char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通訊錄為空,無法修改");return;}printf("請輸入要修改的人的名字:");scanf("%s", name);int i = 0;int pos = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){pos = i;printf("請輸入姓名:");scanf("%s", pc->data[pos].name);printf("請輸入性別:");scanf("%s", pc->data[pos].sex);printf("請輸入年齡:");scanf("%d", &(pc->data[pos].age));printf("請輸入電話:");scanf("%s", pc->data[pos].tele);printf("請輸入地址:");scanf("%s", pc->data[pos].addr);return;}}printf("未找到該聯系人");}
//通訊錄信息查看/打印通訊錄
void Show_Contact(Contact* pc)
{assert(pc);printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "名字", "性別", "年齡", "電話", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}}
int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}//通訊錄信息排列
void Sort_Contact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通訊錄為空,無法排序\n");return;}//qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_name);qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);printf("排序完成\n");}
void Destory_Contact(Contact* pc)
{assert(pc);free(pc->data);//釋放內存/*if (pc->sz == 0){printf("通訊錄為空\n");return;}for (int i =pc->sz; i >=0; i--){pc->sz--;pc->data[i] = pc->data[i + 1];}*/pc->data = NULL;//置空pc->sz = 0;pc->capacity = 0;printf("已全部刪除,通訊錄銷毀\n");}void Save_Contact(Contact* pc) {assert(pc);FILE* file = fopen(FILENAME, "w");if (!file) {printf("無法打開文件進行保存\n");return;}for (int i = 0; i < pc->sz; i++) {fprintf(file, "%s %s %d %s %s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}fclose(file);printf("聯系人信息已經保存到文件\n");
}void Load_Contact(Contact* pc) {assert(pc);FILE* file = fopen(FILENAME, "r");if (!file) {printf("無法打開文件進行加載\n");return;}while (!feof(file)) {if (pc->sz == pc->capacity) {pc->capacity *= 2;pc->data = (PeoInfo*)realloc(pc->data, pc->capacity * sizeof(PeoInfo));//重新分配assert(pc->data);//確保內存分配成功}fscanf(file, "%s %s %d %s %s\n",pc->data[pc->sz].name,pc->data[pc->sz].sex,&pc->data[pc->sz].age,pc->data[pc->sz].tele,pc->data[pc->sz].addr);pc->sz++;}fclose(file);printf("聯系人信息已經加載\n");
}
contact.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<math.h>
#pragma once
#define FILENAME "contacts.txt"//文件名#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
//#define MAX 1000//定義人的信息
typedef struct PeoInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;//定義通訊錄的信息
typedef struct Contact
{//PeoInfo data[MAX];//存放人的信息PeoInfo* data;//存放人的信息int sz;//記錄目前通訊錄中存放的人的信息個數int capacity;//記錄目前容量
}Contact;//初始化通訊錄
void Init_Contact(Contact* pc);
//增加聯系人
void Add_Contact(Contact* pc);
//刪除聯系人
void Del_Contact(Contact* pc);
查找聯系人
void Search_Contact(Contact* pc);
修改聯系人信息
void Modify_Contact(Contact* pc);
通訊錄信息查看
void Show_Contact(Contact* pc);
通訊錄信息排列
void Sort_Contact(Contact* pc);
//通訊錄刪除全部聯系人
void Destory_Contact(Contact* pc);void Save_Contact(Contact* pc); //保存void Load_Contact(Contact* pc);//加載


總結

首先非常感謝大家的觀看,這期對通訊錄進行了完善,增加了動態變化數組已經信息的保存與加載

修改了很多缺陷:

1.這個通訊錄能保存了,不會出現一旦退出就消失了

2.這個通訊錄沒有固定大小,減少了空間的浪費

本期內容到這里就結束了,有什么不足的地方可以提出來,我會虛心接受改進的,大家一起加油吧

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

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

相關文章

Linux操作系統復習

Linux操作系統復習 一. Linux的權限和shell原理1. Linux從廣義上講是什么 從狹義上講是什么&#xff1f;2. shell是什么&#xff1f;3. 為什么要設置一個shell外殼而不是直接和linux 內核溝通4. shell的原理是什么5. Linux中權限的概念6. 如何提升當前操作的權限7. 文件訪問者的…

Spring AI 快速入門:從環境搭建到核心組件集成

Spring AI 快速入門&#xff1a;從環境搭建到核心組件集成 一、前言&#xff1a;Java開發者的AI開發捷徑 對于Java生態的開發者來說&#xff0c;將人工智能技術融入企業級應用往往面臨技術棧割裂、依賴管理復雜、多模型適配困難等挑戰。Spring AI的出現徹底改變了這一局面——…

C++11介紹

目錄 一、C11的兩個小點 1.1、decltype 1.2、nullptr 二、列表初始化 2.1、C98傳統的{} 2.2、C11中的{} 2.3、C11中的std::initializer_list 三、右值引用和移動語義 3.1、左值和右值 3.2、左值引用和右值引用 3.3、引用延長生命周期 3.4、左值和右值的參數匹配 3…

基于機器學習的網絡釣魚郵件智能檢測與防護系統

phishingDP 介紹 phishingDP 是一個基于機器學習的網絡釣魚郵件智能檢測與防護系統&#xff0c;旨在通過深度學習技術識別潛在的釣魚郵件&#xff0c;保護用戶免受網絡詐騙威脅。該系統集成了數據預處理、模型訓練、實時預測和結果可視化功能&#xff0c;提供用戶友好的Web界…

OpenAI 推出「輕量級」Deep Research,免費用戶同享

剛剛&#xff0c;OpenAI 正式上線了面向所有用戶的「輕量級」Deep Research 版本&#xff0c;意味著即便沒有付費訂閱&#xff0c;也能體驗這一強大工具的核心功能。 核心差異&#xff1a;o4-mini vs. o3 模型迭代 傳統的深度研究功能基于更大規模的 o3 模型。輕量級版本則改以…

什么是優質的靜態IP?以及如何選擇優質的靜態IP?

在如今的大數據生態中&#xff0c;靜態IP的使用頻率和重要性不斷提升。但是&#xff0c;我們常聽到業界提到“優質的靜態IP”&#xff0c;那么什么樣的靜態IP能夠稱之為優質&#xff1f;如何判斷這些IP能否滿足我們的需求&#xff1f;今天這篇文章&#xff0c;將為您揭開優質靜…

Hadoop生態圈框架部署 - Windows上部署Hadoop

文章目錄 前言一、下載Hadoop安裝包及bin目錄1. 下載Hadoop安裝包2. 下載Hadoop的bin目錄 二、安裝Hadoop1. 解壓Hadoop安裝包2. 解壓Hadoop的Windows工具包 三、配置Hadoop1. 配置Hadoop環境變量1.1 打開系統屬性設置1.2 配置環境變量1.3 驗證環境變量是否配置成功 2. 修改Had…

搜廣推校招面經八十一

OPPO搜廣推一面面經 一、介紹一下PLE模型 在多任務學習&#xff08;Multi-Task Learning, MTL&#xff09;中&#xff0c;多個任務共享部分模型結構&#xff0c;以提升整體效果。然而&#xff0c;不同任務間存在 任務沖突&#xff08;Task Conflict&#xff09; 問題&#xf…

LangChain 中主流的 RAG 實現方式

文章目錄 **一、基礎流程實現**1. **全自動索引構建&#xff08;VectorstoreIndexCreator&#xff09;**2. **標準問答鏈&#xff08;RetrievalQA&#xff09;**3. **Document Chain 手動檢索**4. **load_qa_chain&#xff08;傳統方式&#xff09;** **二、高級定制化實現**1…

解決:springmvc工程 響應時,將實體類對象 轉換成json格式數據

問題&#xff1a;一直無法將user對象轉成json格式 按理來說&#xff0c;我在類上使用RestController注解&#xff0c;就可以實現將實體類對象寫入響應體中&#xff0c;并作為json格式傳遞到客戶端&#xff0c;但現實是沒有生效&#xff0c;并且出現404&#xff0c;406&#xf…

【踩坑記錄】stm32 jlink程序燒錄不進去

最近通過Jlink給STM32燒寫程序時一直報錯&#xff0c;但是換一個其他工程就可以燒錄&#xff0c;對比了一下jink配置&#xff0c;發現是速率選太高了“SW Device”&#xff0c;將燒錄速率調整到10MHz以下就可以了

運維打鐵:Mysql 分區監控以及管理

文章目錄 一、簡介二、設計邏輯1、配置文件檢查2、創建邏輯3、 刪除邏輯4、重建表分區邏輯5、recognize maxvalue分區表邏輯6、創建多個未來分區邏輯7、定時檢測分區是否創建成功&#xff0c;否則發送告警郵件。 三、解決的問題四、配置例子與介紹 一、簡介 操作數據庫&#xf…

Appium自動化開發環境搭建

自動化 文章目錄 自動化前言 前言 Appium是一款開源工具&#xff0c;用于自動化iOS、Android和Windows桌面平臺上的本地、移動web和混合應用程序。原生應用是指那些使用iOS、Android或Windows sdk編寫的應用。移動網頁應用是通過移動瀏覽器訪問的網頁應用(appum支持iOS和Chrom…

《R語言SCI期刊論文繪圖專題計劃》大綱

今天開始&#xff0c;我將和大家分享系統且詳細的《R語言SCI期刊繪圖專題教程》&#xff0c;內容會從基礎到高階應用&#xff0c;從配色美學到頂刊風格復現&#xff0c;確保大家可以學到高質量內容&#xff01;下面是大綱。 &#x1f4da;《R語言SCI期刊論文繪圖專題計劃》 第…

STUN協議 與 TURN協議

STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT會話穿越應用程序&#xff09;是一種網絡協議&#xff0c; STUN&#xff08;Simple Traversal of User Datagram Protocol through Network Address Translators (NATs)&#xff0c;NAT的UDP簡單穿越&#…

在vscode終端中運行npm命令報錯

解決方案 這個錯誤信息表明&#xff0c;你的系統&#xff08;可能是 Windows&#xff09;阻止了 PowerShell 執行腳本&#xff0c;這是由于 PowerShell 的執行策略導致的。PowerShell 的執行策略控制著在系統上運行哪些 PowerShell 腳本。默認情況下&#xff0c;Windows 可能…

手搓雷達圖(MATLAB)

看下別人做出來什么效果 話不多說&#xff0c;咱們直接開始 %% 可修改 labels {用戶等級, 發帖數, 發帖頻率, 點度中心度, 中介中心度, 帖子類型計分, 被列為提案數}; cluster_centers [0.8, 4.5, 3.2, 4.0, 3.8, 4.5, 4.2; % 核心用戶0.2, 0.5, 0.3, 0.2, 0.1, 0.0, 0.0;…

ViViT: 一種視頻視覺Transformer

摘要 我們提出了基于純transformer的視頻分類模型,借鑒了這種模型在圖像分類中的成功經驗。我們的模型從輸入視頻中提取時空token,然后通過一系列transformer層進行編碼。為了處理視頻中遇到的長序列token,我們提出了幾種高效的模型變種,這些變種將輸入的空間和時間維度進…

嵌入式鴻蒙系統環境搭建與配置要求實現01

各位開發者大家好,今天主要給大家分享一下,鴻蒙系統的環境配置實現。 第一:鴻蒙配置基本要求 對電腦的要求,虛擬機配置建議 200GB 硬盤大小,10GB 內存,4*2CPU。 安裝必要的依賴文件方法: sudo apt-get update && sudo apt-get install binutils git git-lfs g…

【多目標進化算法】常見多目標進化算法一覽

算法全稱核心特點備注NSGA-IINon-dominated Sorting Genetic Algorithm II非支配排序 擁擠度最經典&#xff0c;應用最廣NSGA-IIINon-dominated Sorting Genetic Algorithm III支撐向量引導&#xff0c;適合高維&#xff08;3目標以上&#xff09;NSGA-II 的高維擴展版MOEA/DM…