順序表應用——通訊錄

在本篇之前的順序表專題我們已經學習的順序表的實現,了解了如何實現順序表的插入和刪除等功能,那么在本篇當中就要學習基于順序表來實現通訊錄,在通訊錄當中能實現聯系人的增、刪、查改等功能,接下來就讓我們一起來實現通訊錄吧!
?


?1.實現通訊錄前的分析

在實現通訊錄的代碼前我們要先思考在通訊錄項目中能實現什么樣的功能
(1)至少能夠存儲100個人的通訊信息
(2)能夠保存用戶信息:名字、性別、年齡、電話、地址等
(3)增加聯系人信息
(4)刪除指定聯系人
(5)查找制定聯系人
(6)修改指定聯系人
(7)顯示聯系人信息

同時由于在之前的順序表中使用的是動態順序表,所以在實現通訊錄項目中也基于的是動態順序表

以下是該通訊錄項目的程序文件設置以及各文件中所實現的內容

?

2.通訊錄的實現?

2.1 聯系人信息的設置以及順序表內要做出的更改

?由于順序表的底層就是數組,所以我們就是要利用數組來實現如以下所示的結構

在通訊錄中由于我們要存儲的是多個聯系人的信息,因此要定義一個結構體來存儲聯系人的信息
以下定義結構體struct PersonIfon來存儲聯系人的信息,并且使用typedef將該結構體重命名為Persondef
并且在PersonIfon中的每個數組的大小用#define來定義

#define MAX_NAME 20
#define MAX_GENDER 10
#define MAX_TELE 20
#define MAX_ADRESS 50typedef struct PersonIfon//聯系人信息
{char name[MAX_NAME];//姓名char Gender[MAX_GENDER];//性別int age;//年齡char Tele[MAX_TELE];//電話char Adress[MAX_ADRESS];//地址}PersonIfon;

同時由于要通訊錄所以之前順序表的Sqelist.h的數組類型也要更改,由用來的整型改變為PersonIfon,要實現該改變就需要在Seqlist.h內代碼的頭加上#define“contact.h”

這時Seqlist.h就變為以下形式

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>typedef struct PersonIfon SLDataType;
typedef struct Seqlist
{SLDataType* arr;int size;//有效的數據個數int capacity;//空間大小}SL;//將struct Seqlist重命名為SL

在之前的順序表的結構體struct Seqlist被重命名為SL,但現在我們要實現的是通訊錄這時這個名字就不太合適與直觀,那該如何來在contact.h文件內對struct Seqlist進行重命名呢?
這時你可能想到是在contact.h內加上預處理指令#define“Seqlist.h”,
但這樣就存在問題了,在之前的操作中我們已經在Seqlaist.h文件內包含了contact.h,如果在這再在contact.h內包含Seqlist.h就會存在頭文件相互包含的問題,這時程序就會崩潰

所以正確的解決方法是什么呢?
其實這時只需要在contact.h中先聲明以下struct Seqlist就可以對該結構體進行重命名了

struct Seqlist;
typedef struct Seqlist contact;

2.2? 通訊錄的初始化以及銷毀


在以上完成聯系人結構體的定義以及對順序表內數組類型的更改,接下來就可以來實現通訊錄初始化和銷毀的函數了

在此先在contact.h內聲明初始化函數以及銷毀函數,由于在此要對通訊錄內容進行更改,所以要進行傳址調用,兩個函數的參數都是結構體指針

void ContactInit(contact* con);//初始化通訊錄
void ContactDestory(contact* con);//銷毀通訊錄

聲明完之后就是在contact.c內實現以上兩個函數,在此通訊錄的初始化以及銷毀內就可以直接調用之前順序表的初始化以及銷毀函數了

void ContactInit(contact* con)//通訊錄初始化
{SLInit(con);
}
void ContactDestory(contact* con)//銷毀通訊錄
{SLDestory(con);
}

2.3通訊錄的展示?

通訊錄的展示就是將通訊錄的信息都打印出來,實質就是要遍歷一般數組
在此在printf中在占位符中的%后加入的最小寬度限制來讓打印出的通訊錄更有順序

void ContactShow(contact* con)//展示通訊錄
{printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性別", "年齡", "電話", "地址");for (int i = 0; i < con->size; i++){printf("%-10s %-4s %-4d %15s %-20s\n",con->arr[i].name,con->arr[i].Gender,con->arr[i].age,con->arr[i].Tele,con->arr[i].Adress);}
}

2.4通訊錄各功能實現

在以上完成了通訊錄的初始化和銷毀接下來我們就來實現通訊錄增、刪、查、改的功能了

2.4.1 通訊錄內添加聯系人?

在此要實現通訊錄中聯系人的增加先在contact.h內對增加聯系人函數進行聲明,由于在此要對通訊錄內容進行更改,所以要進行傳址調用,函數的參數是結構體指針

void ContactAdd(contact* con);//通訊錄內添加聯系人

接下來就是在contact.c內完成添加聯系人的函數
在此先創建一個結構體PersonIfon ifon,并且使用scanf來讀取用戶輸入的此聯系人的各信息存儲在結構體ifon內,再調用順序表中的插入函數將該結構體ifon插入到數組內,在此使用的是尾插函數,也可以使用其他插入方法

void ContactAdd(contact* con)//在通訊錄內添加聯系人
{PersonIfon ifon;printf("請輸入聯系人姓名:\n");scanf("%s", &ifon.name);printf("請輸入聯系人性別:\n");scanf("%s", &ifon.Gender);printf("請輸入聯系人年齡:\n");scanf("%d", &ifon.age);printf("請輸入聯系人電話:\n");scanf("%s", &ifon.Tele);printf("請輸入聯系人地址:\n");scanf("%s", &ifon.Adress);SLPushBack(con, ifon);
}

2.4.2 通訊錄內刪除聯系人

在此要實現通訊錄中聯系人的刪除先在contact.h內對刪除聯系人函數進行聲明,由于在此要對通訊錄內容進行更改,所以要進行傳址調用,函數的參數是結構體指針

void ContactDel(contact* con);//通訊錄內刪除聯系人

在聲明完函數之后就是對該函數的實現,但在刪除通訊錄內的聯系人要通訊錄中存在要刪除的聯系人才能刪除,所以在函數內還要先判斷,但之后通訊錄的其他功能可能還要用到查找聯系人是否存在

所以可以直接在創建一個判斷相關聯系人是否存在的函數,在此根據的是名字來查找聯系人

存在該聯系人就返回相應的數組下標,不存在就返回-1

int FindbyName(contact* con, char* name)
{for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name)==0){return i;}}return -1;
}

接下來就是在contact.c內完成刪除聯系人的函數
在此函數內先定義一個char類型的數組name,大小為MAX_NAME。用scanf將用戶輸入的聯系人姓名存放在該數組內,之后再將指針con與name作為FindbyName的參數,通過FindbyName函數的返回值來得到要刪除的聯系人是否存在。若返回值小于0則說明該聯系人不存在,之后就直接退出函數ContactDel,否則就調用順序表中的任意位置的刪除函數SLErase,這時tmp就是要刪除的數組下標

void ContactDel(contact* con)//通訊錄內刪除聯系人
{char name[MAX_NAME];printf("請輸入要刪除的聯系人的姓名\n");scanf("%s", name);int tmp = FindbyName(con, name);if (tmp < 0){printf("該聯系人不存在,刪除失敗\n");return;}SLErase(con, tmp);printf("刪除成功\n");}

?2.4.3 通訊錄內修改聯系人

在此要實現通訊錄中聯系人的修改先在contact.h內對修改聯系人函數進行聲明,由于在此要對通訊錄內容進行更改,所以要進行傳址調用,函數的參數是結構體指針

void ContactModify(contact* con);//通訊錄內修改聯系人

?接下來就是在contact.c內完成修改聯系人的函數
在該函數內和刪除聯系人函數一樣也是先在此函數內先定義一個char類型的數組name,大小為MAX_NAME。用scanf將用戶輸入的聯系人姓名存放在該數組內,之后再將指針con與name作為FindbyName的參數,通過FindbyName函數的返回值來得到要修改的聯系人是否存在。若返回值小于0則說明該聯系人不存在,之后就直接退出函數ContactDel。否則就使用scanf將用戶輸入的信息存放到原來聯系人的數組位置

void ContactModify(contact* con)//修改聯系人信息
{char name[MAX_NAME];printf("請輸入要修改的聯系人的姓名\n");scanf("%s", name);int tmp = FindbyName(con, name);if (tmp < 0){printf("該聯系人不存在,修改失敗\n");return;}//直接修改printf("請輸入新的聯系人姓名:\n");scanf("%s", con->arr[tmp].name);printf("請輸入新的聯系人性別:\n");scanf("%s", con->arr[tmp].Gender);printf("請輸入新的聯系人年齡:\n");scanf("%d", &con->arr[tmp].age);printf("請輸入新的聯系人電話:\n");scanf("%s", con->arr[tmp].Tele);printf("請輸入新的聯系人地址:\n");scanf("%s", con->arr[tmp].Adress);printf("修改成功!\n");}

?2.4.4 通訊錄內查找聯系人

?在此要實現通訊錄中聯系人的修改先在contact.h內對修改聯系人函數進行聲明,在此雖然查找聯系人未對通訊錄內數據進行修改,但在此還是將結構體作為函數的參數,原因通訊錄其他函數都是傳地址在此也保持一致性

void ContactFind(contact* con);//在通訊錄內查找聯系人

??接下來就是在contact.c內完成查找聯系人的函數

在該函數內也是先定義一個char類型的數組name,再通過scanf函數將用戶輸入的字符串存儲到數組內,在此并定義一個變量flag=-1再通過for循環遍歷數組中的各個元素中的name是否和數組name相同相同就將flag賦值為1,相同就打印該元素的聯系人信息,當遍歷完時flag如果等于-1就打印查找不到聯系人

void ContactFind(contact* con)//查找聯系人
{char name[MAX_NAME];printf("請輸入要查找的聯系人的姓名\n");scanf("%s", name);int flag = -1;for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){flag = 1;printf("查找成功!\n");printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性別", "年齡", "電話", "地址");printf("%-10s %-4s %-4d %15s %-20s\n",con->arr[i].name,con->arr[i].Gender,con->arr[i].age,con->arr[i].Tele,con->arr[i].Adress);}}if (flag == -1){printf("你所要查找的聯系人不存在!\n");}}

?

3.通訊錄test.c文件

在以上我們已經實現了通訊錄各種功能,現在就需要在test.c內將這些設計好的功能給拼裝起來,讓程序能在運行窗口通過輸入不同的數就可以實現通訊錄的各功能
?

注:在test.c的開頭要加上#include"SeqList.h"和#include"contact.h"

先在test.c內先創建main函數,同時要實現對通訊錄的多次操作就需要用到循環,在此用的是do...while循環,在循環內在創建一個switch語句來實現用戶輸入不同的信息就進入不同的函功能。在switch語句內的case后的常量都使用枚舉所定義的,這樣會使得代碼的可讀性更高、同時shitch語句的case語句排序也可以是不按順序來的。在不同的case語句內就調用不同的通訊錄功能函數
?

在進入循環先初始化順序表,退出循環就銷毀順序表?

#include"SeqList.h"
#include"contact.h"void menu()
{printf("**************************************\n");printf("******1.添加聯系人  2.刪除聯系人******\n");printf("******3.查找聯系人  4.修改聯系人******\n");printf("******5.展示通訊錄  0.退出程序  ******\n");printf("**************************************\n");}enum option
{ADD=1,DEL=2,FIND=3,MODIFY=4,SHOW=5};int main()
{int input = 0;contact con;ContactInit(&con);do{menu();printf("請選擇操作\n");scanf("%d", &input);switch (input){case ADD:ContactAdd(&con);break;case DEL:ContactDel(&con);break;case FIND:ContactFind(&con);break;case MODIFY:ContactModify(&con);break;case SHOW:ContactShow(&con);break;default:printf("選擇操作錯誤,請輸入1~5內的數\n");break;}} while(input);//當輸入的值為0時,input值也就也0,在此判斷部分input就為假就會退出循環ContactDestory(&con);return 0;
}

?

4.?通訊錄讀取歷史數據和保存數據

在之前已經實現了通訊錄的各功能的數據只能在程序運行窗口打開的時候進行通訊錄的增、刪、查、改等功能。在關閉窗口后對通訊錄進行的各項操作都不會保存,那么要怎么樣才能讓我們設計的通訊錄在每次開始之前都讀取之前的信息,在結束后都保存通訊錄的信息呢?

在之前文件操作章節中講解了如何將程序數據輸出到文件中,將文件數據輸入到程序當中,所以在通訊錄中我們就可以用到文件操作的相關函數來實現通訊錄數據的保存與讀取。

?

4.1讀取歷史數據

要讀取歷史數據就要在通訊錄每次初始化之后就輸入文件的信息到所創建的通訊錄中,也就是將輸入到數組當中。

在此先在我們創建的程序的文件夾中創建一個con.txt文本,再使用fopen以讀的方式打開文件,再創建一個PersonIfon ifon的變量,之后在使用到fread以二進制的形式輸入文件的信息到創建的ifon中,再將ifon尾插到數組當中。

void ContactRead(contact* con)//從文件中讀取歷史數據
{FILE* pf = fopen("con.txt", "rb");if (pf == NULL){perror("fopen");return;}PersonIfon ifon;while (fread(&ifon, sizeof(PersonIfon), 1, pf)){SLPushBack(con, ifon);}printf("成功讀取歷史數據到通訊錄中\n");
}

?

在通訊錄初始化函數中調用SLInit函數后調用COntactRead就可以實現歷史數據的讀取

void ContactInit(contact* con)//通訊錄初始化
{SLInit(con);ContactRead(con);
}

?

4.2 保存數據

要實現通訊錄每次在退出程序后都能將數據保留,這就需要在每次銷毀通訊錄前將通訊錄內的數據,也就是數組的所有元素都輸出到con.txt文件內。

要把數組的所有元素都輸出到con.txt文件內就需要先以寫的方式打開文件,后在循環的使用fwrite將數組的數據以二進制的形式輸出到文件當中

void ContactWrite(contact* con)//將通訊錄數據讀入文件中
{FILE* pf = fopen("con.txt", "wb");if (pf == NULL){perror("fopen\n");return;}for (int i = 0; i < con->size; i++){fwrite(con->arr+i, sizeof(PersonIfon), 1, pf);}printf("通訊錄數據保存成功\n");
}

?

在通訊錄銷毀函數中調用SLDestory函數前調用COntactWrite就可以實現數據輸出到文件當中,也就將數據保留了下來

void ContactDestory(contact* con)//銷毀通訊錄
{ContactWrite(con);SLDestory(con);
}

?


通訊錄完整代碼?
?

注:在Seqlist.h和Seqlist.c內的查找和打印順序表與以上代碼不兼容,運行時會使得程序崩潰,所以將這些部分注釋掉?

contact.h?

#pragma once
#define MAX_NAME 20
#define MAX_GENDER 10
#define MAX_TELE 20
#define MAX_ADRESS 50typedef struct PersonIfon//聯系人信息
{char name[MAX_NAME];//姓名char Gender[MAX_GENDER];//性別int age;//年齡char Tele[MAX_TELE];//電話char Adress[MAX_ADRESS];//地址}PersonIfon;struct Seqlist;
typedef struct Seqlist contact;void ContactInit(contact* con);//初始化通訊錄
void ContactDestory(contact* con);//銷毀通訊錄
void ContactAdd(contact* con);//通訊錄內添加聯系人
void ContactDel(contact* con);//通訊錄內刪除聯系人
void ContactModify(contact* con);//通訊錄內修改聯系人
void ContactFind(contact* con);//在通訊錄內查找聯系人
void ContactShow(contact* con);//展示通訊錄void ContactRead(contact* con);//從文件中讀取歷史數據
void ContactWrite(contact* con);//將通訊錄數據讀入文件中

?

Seqlist.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>typedef struct PersonIfon SLDataType;
typedef struct Seqlist
{SLDataType* arr;int size;//有效的數據個數int capacity;//空間大小}SL;//將struct Seqlist重命名為SLvoid SLInit(SL* ps);//初始化
void SLDestory(SL* ps);//銷毀void SLCheckCapacity(SL* ps);//檢查空間是否足夠
//void SLPrint(SL ps);//打印順序表void SLPushBack(SL* ps, SLDataType x);//尾插
void SLPushPront(SL* ps, SLDataType x);//頭插void SLPopBack(SL* ps);//尾刪
void SLPopPront(SL* ps);//頭刪void SLInsert(SL* ps, int pos, SLDataType x);//任意位置插入
void SLErase(SL* ps, int pos);//任意位置刪除//int SLFind(SL* ps, SLDataType x);//查找

?

?

Seqlist.c?

#include"SeqList.h"void SLInit(SL* ps)//順序表初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLDestory(SL* ps)//順序表銷毀
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}void SLCheckCapacity(SL* ps)//檢查空間是否足夠,不足時增大空間大小
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}//void SLPrint(SL ps)//打印
//{
//	int i = 0;
//	for (i; i < ps.size; i++)
//	{
//		printf("%d ", ps.arr[i]);
//	}
//	printf("\n");
//}void SLPushBack(SL* ps, SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}void SLPushPront(SL* ps, SLDataType x)//頭插
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];   //pa->arr[1]=pa->arr[0]}ps->arr[0] = x;ps->size++;
}void SLPopBack(SL* ps)//尾刪
{assert(ps);assert(ps->size);ps->size--;
}void SLPopPront(SL* ps)//頭刪
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}void SLInsert(SL* ps, int pos, SLDataType x)//任意位置插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//結束條件ps->arr[pos+1] = ps->arr[pos]}ps->arr[pos] = x;ps->size++;}void SLErase(SL* ps, int pos)//任意位置刪除
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i <= ps->size - 2; i++){ps->arr[i] = ps->arr[i + 1];//結束條件ps->arr[ps->size-2] = ps->arr[ps->size-1]}--ps->size;
}//int SLFind(SL* ps, SLDataType x)//查找
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//
//}

?

contact.c?

#pragma once
#include "contact.h"
#include"SeqList.h"void ContactRead(contact* con)//從文件中讀取歷史數據
{FILE* pf = fopen("con.txt", "rb");if (pf == NULL){perror("fopen");return;}PersonIfon ifon;while (fread(&ifon, sizeof(PersonIfon), 1, pf)){SLPushBack(con, ifon);}printf("成功讀取歷史數據到通訊錄中\n");
}void ContactInit(contact* con)//通訊錄初始化
{SLInit(con);ContactRead(con);}void ContactWrite(contact* con)//將通訊錄數據讀入文件中
{FILE* pf = fopen("con.txt", "wb");if (pf == NULL){perror("fopen\n");return;}for (int i = 0; i < con->size; i++){fwrite(con->arr+i, sizeof(PersonIfon), 1, pf);}printf("通訊錄數據保存成功\n");
}void ContactDestory(contact* con)//銷毀通訊錄
{ContactWrite(con);SLDestory(con);}void ContactAdd(contact* con)//在通訊錄內添加聯系人
{PersonIfon ifon;printf("請輸入聯系人姓名:\n");scanf("%s", &ifon.name);printf("請輸入聯系人性別:\n");scanf("%s", &ifon.Gender);printf("請輸入聯系人年齡:\n");scanf("%d", &ifon.age);printf("請輸入聯系人電話:\n");scanf("%s", &ifon.Tele);printf("請輸入聯系人地址:\n");scanf("%s", &ifon.Adress);SLPushBack(con, ifon);}int FindbyName(contact* con, char* name)
{for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name)==0){return i;}}return -1;
}void ContactDel(contact* con)//通訊錄內刪除聯系人
{char name[MAX_NAME];printf("請輸入要刪除的聯系人的姓名\n");scanf("%s", name);int tmp = FindbyName(con, name);if (tmp < 0){printf("該聯系人不存在,刪除失敗\n");return;}SLErase(con, tmp);printf("刪除成功\n");}void ContactModify(contact* con)//修改聯系人信息
{char name[MAX_NAME];printf("請輸入要修改的聯系人的姓名\n");scanf("%s", name);int tmp = FindbyName(con, name);if (tmp < 0){printf("該聯系人不存在,修改失敗\n");return;}printf("請輸入新的聯系人姓名:\n");scanf("%s", con->arr[tmp].name);printf("請輸入新的聯系人性別:\n");scanf("%s", con->arr[tmp].Gender);printf("請輸入新的聯系人年齡:\n");scanf("%d", &con->arr[tmp].age);printf("請輸入新的聯系人電話:\n");scanf("%s", con->arr[tmp].Tele);printf("請輸入新的聯系人地址:\n");scanf("%s", con->arr[tmp].Adress);printf("修改成功!\n");}void ContactFind(contact* con)//查找聯系人
{char name[MAX_NAME];printf("請輸入要查找的聯系人的姓名\n");scanf("%s", name);int flag = -1;for (int i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){flag = 1;printf("查找成功!\n");printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性別", "年齡", "電話", "地址");printf("%-10s %-4s %-4d %15s %-20s\n",con->arr[i].name,con->arr[i].Gender,con->arr[i].age,con->arr[i].Tele,con->arr[i].Adress);}}if (flag == -1){printf("你所要查找的聯系人不存在!\n");}}void ContactShow(contact* con)//展示通訊錄
{printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性別", "年齡", "電話", "地址");for (int i = 0; i < con->size; i++){printf("%-10s %-4s %-4d %15s %-20s\n",con->arr[i].name,con->arr[i].Gender,con->arr[i].age,con->arr[i].Tele,con->arr[i].Adress);}
}

?

?test.c

#include"SeqList.h"
#include"contact.h"void menu()
{printf("**************************************\n");printf("******1.添加聯系人  2.刪除聯系人******\n");printf("******3.查找聯系人  4.修改聯系人******\n");printf("******5.展示通訊錄  0.退出程序  ******\n");printf("**************************************\n");}enum option
{ADD=1,DEL=2,FIND=3,MODIFY=4,SHOW=5};int main()
{int input = 0;contact con;ContactInit(&con);do{menu();printf("請選擇操作\n");scanf("%d", &input);switch (input){case ADD:ContactAdd(&con);break;case DEL:ContactDel(&con);break;case FIND:ContactFind(&con);break;case MODIFY:ContactModify(&con);break;case SHOW:ContactShow(&con);break;default:printf("選擇操作錯誤,請輸入1~5內的數\n");break;}} while(input);ContactDestory(&con);return 0;
}

通訊錄實現效果?
?

基于順序表實現通訊錄

?

以上就是本篇的所有內容了,希望能得到你的點贊與收藏,感謝支持!!!

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

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

相關文章

grpc學習golang版( 五、多proto文件示例 )

系列文章目錄 第一章 grpc基本概念與安裝 第二章 grpc入門示例 第三章 proto文件數據類型 第四章 多服務示例 第五章 多proto文件示例 第六章 服務器流式傳輸 第七章 客戶端流式傳輸 第八章 雙向流示例 文章目錄 一、前言二、定義proto文件2.1 公共proto文件2.2 語音喚醒proto文…

解決Vue3項目中跨域問題的步驟

決Vue3項目中跨域問題的步驟可以按照以下方式清晰地分點表示和歸納&#xff1a; 1. 使用代理服務器&#xff08;Proxy&#xff09; 步驟&#xff1a; 在Vue項目的根目錄下找到或創建vue.config.js文件。在vue.config.js中配置devServer的proxy選項。設定需要代理的接口前綴&a…

基于局域網下的服務器連接、文件傳輸以及內網穿透教程 | 服務器連接ssh | 服務器文件傳輸scp | 內網穿透frp | 研究生入學必備 | 深度學習必備

&#x1f64b;大家好&#xff01;我是毛毛張! &#x1f308;個人首頁&#xff1a; 神馬都會億點點的毛毛張 &#x1f4cc;本篇博客分享的是基于局域網下的服務器連接&#x1f517;、文件傳輸以及內網穿透教程&#xff0c;內容非常完備?&#xff0c;涵蓋了在服務器上做深度學…

樹莓派3B讀寫EEPROM芯片AT24C256

AT24C256是一個Atmel公司的EEPROM存儲芯片&#xff0c;容量是256K個bit&#xff08;也就是32K字節&#xff09;&#xff0c;I2C接口&#xff0c;而樹莓派正好有I2C接口&#xff0c;如下圖藍框中的4個IO口&#xff0c; 把AT24C256和這4個口接在一起&#xff0c;這樣硬件就準備好…

Django 頁面展示模型創建表的數據

1&#xff0c;添加視圖函數 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 獲取其他字段的值# 創建用戶實例…

【Python學習篇】Python實驗小練習——異常處理(十三)

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

【教程】5分鐘直接了解隨機森林模型

本文來自《老餅講解-BP神經網絡》https://www.bbbdata.com/ 目錄 一、什么是隨機森林模型1.1.隨機森林模型介紹1.2.為什么隨機森林要用多棵決策樹 二、怎么訓練一個隨機森林模型2.1.訓練一個隨機森林模型 隨機森林模型是機器學習中常用的模型之一&#xff0c;它是決策樹模型的一…

Node.js全棧指南:靜態資源服務器

上一章【認識 MIME 和 HTTP】。 我們認識和了解了 MIME 的概念和作用&#xff0c;也簡單地學習了通過瀏覽器控制臺查看請求和返回的用法。 通過對不同的 HTML、CSS、JS 文件進行判斷&#xff0c;設置不同的 MIME 值&#xff0c;得以讓我們的瀏覽器正正確地接收和顯示不同的文…

八爪魚現金流-031,寬帶到期記一筆負債

到期了&#xff0c;新弄的網絡&#xff0c;記錄一下負債包。 八爪魚現金流 八爪魚

英英詞典(匯編實驗)

功能要求&#xff1a; 1.單詞及其英文解釋的錄入、修改和刪除 (1 ) 錄入新單詞&#xff0c;把它插入到相應的位置(按詞典順序)&#xff0c;其后跟英文解釋、同義詞、反義詞&#xff1b;&#xff08;此功能要求在文件中完成&#xff0c;其它功能可以將單詞放在數據段中&#xf…

數據庫原理之數據庫基本概念

目錄 前言 基本概念 數據庫完整性 前言 今天我們來看看數據庫的基本概念&#xff0c;幫助大家對數據庫有一點點最基本的了解 基本概念 4個基本概念 數據data&#xff1a;描述事物的符號&#xff0c;數據庫中存儲的基本對象。 數據庫Database&#xff1a;長期存儲在計算機…

山東大學多核并行2024年回憶版

2024.6.13回憶版 矩陣向量乘不可整除代碼 集合通信與點對點通信的區別 塊劃分、循環劃分、循環塊劃分&#xff08;14個向量&#xff0c;4個進程&#xff09; 按行訪問還是按列訪問快 SISD系統問題 循環依賴問題 問題&#xff1a;為什么不能對這個循環并行化&#xff0…

Python邏輯控制語句 之 綜合案例

需求&#xff1a; 1. 提示?戶輸?登錄系統的?戶名和密碼 2. 校驗?戶名和密碼是否正確(正確的?戶名:admin、密碼:123456) 3. 如果?戶名和密碼都正確&#xff0c;打印“登錄成功!”&#xff0c;并結束程序 4. 如果?戶名或密碼錯誤&#xff0c;打印“?戶名或密碼錯誤!”…

Django 對模型創建的兩表插入數據

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存儲密碼first_name …

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組]

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組] **一、300.最長遞增子序列 ** 鏈接: 代碼隨想錄. 思路&#xff1a;dp[i] 以nums[i]為結尾的遞增子序列最大長度&#xff0c;下標為i的數&#xff0c;需要和下標為0開始一直到下標為…

DM 的斷點續傳測試

作者&#xff1a; 大魚海棠 原文來源&#xff1a; https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三種數據遷移同步方式&#xff08;task-mode&#xff09;&#xff0c;在all同步模式下&#xff0c;因一些特殊情況&#xff0c;需要變更上游MySQL的數…

LDO產品的基礎知識解析

低壓降穩壓器 (LDO)是一種用于調節較高電壓輸入產生的輸出電壓的簡單方法。在大多數情況下&#xff0c;低壓降穩壓器都易于設計和使用。然而&#xff0c;如今的現代應用都包括各種各樣的模擬和數字系統&#xff0c;而有些系統和工作條件將決定哪種LDO最適合相關電路&#xff0c…

鄧普頓的五大投資原則

在《逆向投資 鄧普頓的長贏投資法》的推薦序《“逆向投資大神”鄧普頓五大投資原則》中&#xff0c;劉建位總結了鄧普頓的五大投資原則&#xff0c;分別是“以逆向投資為中心”“以價值投資為選股根本”“以分散投資為組合穩定器”“以全球投資來擴大機會池”“以極度悲觀點投資…

rust單元測試順序執行

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 存在的問題 有時候&#xff0c;不同單元測試之間可能會競爭相同的資源&#xff0c;比如讀寫相同的文件。在這種情況下&#xff0c;如果…