主頁 > 軟體設計 > 我們天天在使用的通訊錄原來是這樣實作的呀!——C語言實作簡單靜態通訊錄和動態通訊錄(基于順序表)

我們天天在使用的通訊錄原來是這樣實作的呀!——C語言實作簡單靜態通訊錄和動態通訊錄(基于順序表)

2021-09-26 13:58:40 軟體設計

??前面的話??

大家好!在生活中大家一定離不開通訊錄或類似功能的聯系人串列,比如QQ好友串列,微信朋友串列,在這篇文章中我會詳細介紹如何使用C語言來搭建一個簡單的通訊錄,包括靜態通訊錄和動態通訊錄,

📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
📆首發時間:🌴2021年9月25日🌴
??堅持和努力一定能換來詩與遠方!
💭參考書籍:📚《明解C語言》,📚《C語言程式設計現代方法》,📚《C primer plus》
💬參考在線編程網站:🌐牛客網🌐力扣
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,


📌導航小助手📌

  • 🍸1.靜態通訊錄(基于靜態順序表)
    • 🍹1.1選單設計
      • 🍷1.1.1設計目的
      • 🍷1.1.2選單設計
      • 🍷1.1.3聯系人資訊設計
      • 🍷1.1.4各功能函式宣告
    • 🍹1.2基礎功能從理論到實踐
      • 🍷1.2.1初始化通訊錄
      • 🍷1.2.2新建聯系人
      • 🍷1.2.3洗掉聯系人
      • 🍷1.2.4修改聯系人
      • 🍷1.2.5顯示聯系人
      • 🍷1.2.6根據姓名排序聯系人
      • 🍷1.2.7基于姓名查找聯系人
    • 🍹1.3源代碼匯總
      • 🍷1.3.1頭檔案
      • 🍷1.3.2基礎功能實作檔案
      • 🍷1.3.3測驗檔案
  • 🍸2.動態通訊錄(基于動態順序表)
    • 🍹2.1選單設計
      • 🍷2.1.1設計目的
      • 🍷2.1.2選單設計
      • 🍷2.1.3聯系人結構及函式宣告
    • 🍹2.2基礎功能從理論到實踐
      • 🍷2.2.1初始化通訊錄
      • 🍷2.2.2新建聯系人
      • 🍷2.2.3洗掉聯系人
      • 🍷2.2.4修改聯系人
      • 🍷2.2.5顯示聯系人
      • 🍷2.2.6根據姓名排序聯系人
      • 🍷2.2.7基于姓名查找聯系人
      • 🍷2.2.8銷毀通訊錄
    • 🍹2.3源代碼匯總
      • 🍷2.3.1頭檔案
      • 🍷2.3.2基礎功能實作檔案
      • 🍷2.3.3測驗檔案
  • 🌼3.總結


11

🍸1.靜態通訊錄(基于靜態順序表)

🍹1.1選單設計

🍷1.1.1設計目的

基于靜態順序表實作的通訊錄需要一開始就開辟一塊較大的記憶體用于存盤聯系人的資料,且最大資料容量是固定的,沒有動態通訊錄那么靈活!在人數可知的情況下可以使用靜態通訊錄,這個與你在超市買的一本通訊錄非常相似,那一本通訊錄使用完之后只能在買一本新的儲存新的聯系人,對于該通訊錄,我希望能夠實作以下功能:

  • 能儲存聯系人的一些基本資訊,例如:姓名,性別,年齡,電話,地址,郵箱等,
  • 能夠對通訊錄進行添加,洗掉,修改,查找,排序,查看聯系人,
  • 擁有一個簡潔的聯系人資訊查看頁面,
  • 使用方便,簡單,

🍷1.1.2選單設計

對于選單,能夠直接的顯示該通訊錄各個功能,讓使用者能夠快速上手!
選單頁面

         歡迎使用通訊錄!
*******************************
*****    1 添加聯系人     *****
*****    2 洗掉聯系人     *****
*****    3 查找聯系人     *****
*****    4 修改聯系人資訊 *****
*****    5 排序聯系人資訊 *****
*****    6 顯示聯系人資訊 *****
*****    0 退出通訊錄     *****
*******************************
請輸入選單功能序號:
void menu()
{
	printf("         歡迎使用通訊錄!      \n");
	printf("*******************************\n");
	printf("*****    1 添加聯系人     *****\n");
	printf("*****    2 洗掉聯系人     *****\n");
	printf("*****    3 查找聯系人     *****\n");
	printf("*****    4 修改聯系人資訊 *****\n");
	printf("*****    5 排序聯系人資訊 *****\n");
	printf("*****    6 顯示聯系人資訊 *****\n");
	printf("*****    0 退出通訊錄     *****\n");
	printf("*******************************\n");
}

選單功能介面實作

enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};//使用列舉,將用戶輸入的數字與列舉對應,提高代碼可讀性

struct AddressBook student;//如果定義在main函式里,可能會因為資料過大,造成堆疊溢位,所以我們定義為全域變數,儲存在靜態區,

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("請輸入選單功能序號:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通訊錄成功!");
			break;
		default:
			printf("輸入字符非法!請重新輸入!\n");
			break;
		}
			
	}while(input);
	return 0;
}

用戶可以根據輸入序號來選擇不同的功能!

🍷1.1.3聯系人資訊設計

對于聯系人基礎資訊,如姓名,年齡,性別,電話,地址,郵箱等,我們可以放在一個結構體之中,然后使用該結構體型別根據需求創建一個陣列,這樣用于聯系人資訊儲存的空間就開辟好了!
聯系人的多少和聯系人基礎資訊多少我們可以使用宏來調整,這樣如果需要資料變動僅僅只需要修改宏就可以了!

#define MAX_NUM 1000
#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30

typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

typedef struct AddressBook
{
	struct Contact ListMan[MAX_NUM];//容量已經確定為MAX_NUM,不可變
	int number;//有效聯系人個數
}AdBook;

🍷1.1.4各功能函式宣告

函式實作所需引入的頭檔案如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

基礎功能函式宣告:

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index);
//聯系人輸入
void InputContact(Con* tmp);
//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name);

//聯系人初始化
void InitContact(AdBook* pAdBook);
//增加聯系人
void AddContact(AdBook* pAdBook);
//洗掉聯系人
void DelContact(AdBook* pAdBook);
//修改聯系人
void ModContact(AdBook* pAdBook);
//顯示聯系人
void ShowContact(AdBook* pAdBook);
//查找聯系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函式
int cmp(const void* e1, const void* e2);
//排序聯系人
void SotrContact(AdBook* pAdBook);

🍹1.2基礎功能從理論到實踐

🍷1.2.1初始化通訊錄

所謂初始化就是將存放資料的那個陣列所有的聯系人資訊都賦予一個無意義的值,比如0,我們可以使用庫函式memset函式將陣列所有元素都初始化為0,

//聯系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	memset(pAdBook->ListMan, 0, sizeof(pAdBook->ListMan));
	pAdBook->number = 0;
}

🍷1.2.2新建聯系人

需要新建一個聯系人,本質上就是在聯系人信息陣列中添加資料,我們之間訪問陣列并根據用戶輸入添加聯系人即可,聯系人資訊輸入我們可以把它封裝成一個函式單獨使用,當我們需要用戶輸入聯系人的時候,直接呼叫就行!

//聯系人輸入
void InputContact(Con* tmp)
{
	printf("請輸入聯系人姓名:");
	scanf("%s", tmp->name);
	printf("請輸入聯系人性別:");
	scanf("%s", tmp->sex);
	printf("請輸入聯系人年齡:");
	scanf("%d", &(tmp->age));
	printf("請輸入聯系人電話:");
	scanf("%s", tmp->tel);
	printf("請輸入聯系人地址:");
	scanf("%s", tmp->address);
	printf("請輸入聯系人郵箱:");
	scanf("%s", tmp->email);
}
//增加聯系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con tmp = { 0 };

	if (pAdBook->number >= MAX_ADDR)
	{
		printf("通訊錄已滿!\n");
	}
	else
	{
		InputContact(&tmp);

		pAdBook->ListMan[pAdBook->number] = tmp;
		//收集聯系人資訊完成
		pAdBook->number++;
		printf("聯系人資訊已經成功存入!\n");
	}

}

🍷1.2.3洗掉聯系人

洗掉聯系人其實和增加聯系人是一回事,都是訪問聯系人資訊陣列對聯系人資訊進行修改,但是有一點需要注意,我們需要將洗掉元素后的資訊前移,洗掉聯系人之前,我們需要找到那個需要洗掉的聯系人,所以需要先對聯系人資訊陣列進行搜索查找,該功能我們也可以將其封裝成為一個獨立的函式,

注意:對于本篇文章的查找與排序統一基于姓名為基礎實作!要基于其他資訊其實也很容易,將查找或排序的姓名資訊改為其他資訊即可!

//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);


	if (pAdBook->number == 0)
	{
		return -1;
		printf("該聯系人串列為空!\n");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pAdBook->number; i++)
		{
			if (strcmp(pAdBook->ListMan[i].name, name) == 0)
			{
				return i;
			}
		}
		return -1;//not find
	}
}
//洗掉聯系人
void DelContact(AdBook* pAdBook)
{
	assert(pAdBook);
	char name[MAX_NAME];
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法洗掉聯系人!\n");
	}
	else
	{
		printf("請輸入需要洗掉的聯系人名字:");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			int i = 0;
			for (i = ret; i < pAdBook->number - 1; i++)
			{
				pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
			}
			pAdBook->number--;
			printf("洗掉%s成功!\n", name);
		}
		else
		{
			printf("找不到該聯系人!\n");
		}
	}
}

🍷1.2.4修改聯系人

修改聯系人之前,我們先需要找到需要修改的那個聯系人,找到之后根據用戶輸入替換原始資訊即可!

//修改聯系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);

	char name[MAX_NAME];
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法修改聯系人!\n");
	}
	else
	{
		printf("請輸入需要修改的聯系人名字:");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			printf("請輸入新聯系人資訊!\n");
			InputContact(pAdBook->ListMan + ret);
			printf("修改聯系人成功!\n");
		}
		else
		{
			printf("找不到該聯系人!\n");
		}
	}
}

🍷1.2.5顯示聯系人

根據陣列中存放的有效資訊,設計一個簡單的表格將所有聯系人資訊顯示出來!

//顯示聯系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "聯系人", "性別", "年齡", "電話", "地址", "郵箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n", 
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex, 
			pAdBook->ListMan[i].age, 
			pAdBook->ListMan[i].tel, 
			pAdBook->ListMan[i].address, 
			pAdBook->ListMan[i].email);
	}
}

當然我們還可以設計一個更加精致的表格將一個聯系人的資訊顯示出來!

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   資訊如下         \n", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性別", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年齡", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "電話", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "郵箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");

}

🍷1.2.6根據姓名排序聯系人

對于聯系人排序,本質上就是對聯系人資訊結構體陣列中的姓名字串進行排序,我們只需對有效資訊排序就可以,不需要對整個陣列排序,
對于排序的方法,我們采用庫函式中的qsort函式進行排序,所以我們還需要準備一個cmp函式,

//qsort的cmp函式
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序聯系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通訊錄已經按姓名排序!\n");
	ShowContact(pAdBook);
}

🍷1.2.7基于姓名查找聯系人

根據用戶輸入,查找第一個出現的聯系人,并將資訊顯示給用戶!

//查找聯系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);

	char name[MAX_NAME];
	printf("請輸入聯系人名字:");
	scanf("%s", name);

	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("找到了!\n");
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查無此人!\n");
	}
}

🍹1.3源代碼匯總

🍷1.3.1頭檔案

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define MAX_NUM 1000
#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30

typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

typedef struct AddressBook
{
	struct Contact ListMan[MAX_NUM];
	int number;
}AdBook;

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index);
//聯系人輸入
void InputContact(Con* tmp);
//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name);

//聯系人初始化
void InitContact(AdBook* pAdBook);
//增加聯系人
void AddContact(AdBook* pAdBook);
//洗掉聯系人
void DelContact(AdBook* pAdBook);
//修改聯系人
void ModContact(AdBook* pAdBook);
//顯示聯系人
void ShowContact(AdBook* pAdBook);
//查找聯系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函式
int cmp(const void* e1, const void* e2);
//排序聯系人
void SotrContact(AdBook* pAdBook);

🍷1.3.2基礎功能實作檔案

#define _CRT_SECURE_NO_WARNINGS 1
#include "mailList.h"

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   資訊如下         \n", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性別", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年齡", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "電話", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "郵箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");

}

//聯系人輸入
void InputContact(Con* tmp)
{
	printf("請輸入聯系人姓名:");
	scanf("%s", tmp->name);
	printf("請輸入聯系人性別:");
	scanf("%s", tmp->sex);
	printf("請輸入聯系人年齡:");
	scanf("%d", &(tmp->age));
	printf("請輸入聯系人電話:");
	scanf("%s", tmp->tel);
	printf("請輸入聯系人地址:");
	scanf("%s", tmp->address);
	printf("請輸入聯系人郵箱:");
	scanf("%s", tmp->email);
}

//聯系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	memset(pAdBook->ListMan, 0, sizeof(pAdBook->ListMan));
	pAdBook->number = 0;
}


//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);


	if (pAdBook->number == 0)
	{
		return -1;
		printf("該聯系人串列為空!\n");
	}
	else
	{
		int i = 0;
		for (i = 0; i < pAdBook->number; i++)
		{
			if (strcmp(pAdBook->ListMan[i].name, name) == 0)
			{
				return i;
			}
		}
		return -1;//not find
	}
}
//增加聯系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con tmp = { 0 };

	if (pAdBook->number >= MAX_ADDR)
	{
		printf("通訊錄已滿!\n");
	}
	else
	{
		InputContact(&tmp);

		pAdBook->ListMan[pAdBook->number] = tmp;
		//收集聯系人資訊完成
		pAdBook->number++;
		printf("聯系人資訊已經成功存入!\n");
	}

}
//洗掉聯系人
void DelContact(AdBook* pAdBook)
{
	assert(pAdBook);
	char name[MAX_NAME];
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法洗掉聯系人!\n");
	}
	else
	{
		printf("請輸入需要洗掉的聯系人名字:");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			int i = 0;
			for (i = ret; i < pAdBook->number - 1; i++)
			{
				pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
			}
			pAdBook->number--;
			printf("洗掉%s成功!\n", name);
		}
		else
		{
			printf("找不到該聯系人!\n");
		}
	}
}
//修改聯系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);

	char name[MAX_NAME];
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法修改聯系人!\n");
	}
	else
	{
		printf("請輸入需要修改的聯系人名字:");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			printf("請輸入新聯系人資訊!\n");
			InputContact(pAdBook->ListMan + ret);
			printf("修改聯系人成功!\n");
		}
		else
		{
			printf("找不到該聯系人!\n");
		}
	}
}
//顯示聯系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "聯系人", "性別", "年齡", "電話", "地址", "郵箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n", 
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex, 
			pAdBook->ListMan[i].age, 
			pAdBook->ListMan[i].tel, 
			pAdBook->ListMan[i].address, 
			pAdBook->ListMan[i].email);
	}
}
//查找聯系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);

	char name[MAX_NAME];
	printf("請輸入聯系人名字:");
	scanf("%s", name);

	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("找到了!\n");
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查無此人!\n");
	}
}
//qsort的cmp函式
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序聯系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通訊錄已經按姓名排序!\n");
	ShowContact(pAdBook);
}

🍷1.3.3測驗檔案

#define _CRT_SECURE_NO_WARNINGS 1
#include "mailList.h"

void menu()
{
	printf("         歡迎使用通訊錄!      \n");
	printf("*******************************\n");
	printf("*****    1 添加聯系人     *****\n");
	printf("*****    2 洗掉聯系人     *****\n");
	printf("*****    3 查找聯系人     *****\n");
	printf("*****    4 修改聯系人資訊 *****\n");
	printf("*****    5 排序聯系人資訊 *****\n");
	printf("*****    6 顯示聯系人資訊 *****\n");
	printf("*****    0 退出通訊錄     *****\n");
	printf("*******************************\n");
}

enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};//使用列舉,將用戶輸入的數字與列舉對應,提高代碼可讀性

struct AddressBook student;//如果定義在main函式里,可能會因為資料過大,造成堆疊溢位,所以我們定義為全域變數,儲存在靜態區,

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("請輸入選單功能序號:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通訊錄成功!");
			break;
		default:
			printf("輸入字符非法!請重新輸入!\n");
			break;
		}
			
	}while(input);
	return 0;
}

🍸2.動態通訊錄(基于動態順序表)

🍹2.1選單設計

🍷2.1.1設計目的

上面介紹了靜態版的通訊錄,但是靜態版通訊錄的大小是不能被改變的,而且利用率可能也不夠高,為了解決靜態通訊錄的這個缺點,動態通訊錄就出現了,在能夠實作靜態版通訊錄的基礎上,能夠靈活調整通訊錄聯系人數量,

  • 能儲存聯系人的一些基本資訊,例如:姓名,性別,年齡,電話,地址,郵箱等,
  • 能夠對通訊錄進行添加,洗掉,修改,查找,排序,查看聯系人,
  • 擁有一個簡潔的聯系人資訊查看頁面,
  • 彌補靜態通訊錄在空間上的不足,能夠根據聯系人數量動態調整通訊錄大小,
  • 使用方便,簡單,

🍷2.1.2選單設計

動態版通訊錄選單設計和靜態版通訊錄是一模一樣的,
選單頁面及其介面

void menu()
{
	printf("*******************************\n");
	printf("*****    1 添加聯系人     *****\n");
	printf("*****    2 洗掉聯系人     *****\n");
	printf("*****    3 查找聯系人     *****\n");
	printf("*****    4 修改聯系人資訊 *****\n");
	printf("*****    5 排序聯系人資訊 *****\n");
	printf("*****    6 顯示聯系人資訊 *****\n");
	printf("*****    0 退出通訊錄     *****\n");
	printf("*******************************\n");
}

enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};

struct AddressBook student;

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("請輸入選單功能序號:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通訊錄成功!");
			break;
		default:
			printf("輸入字符非法!請重新輸入!\n");
			break;
		}

	} while (input);
	return 0;
}

🍷2.1.3聯系人結構及函式宣告

靜態通訊錄與動態通訊錄最大的不同就是在這里,靜態版是直接使用一個開辟好的陣列,而動態版是使用一個指標變數,用于指向使用動態記憶體申請函式malloc所開辟的空間,然后使用開辟的這塊空間進行聯系人資訊進行儲存,最大的優點可以使用realloc函式對其進行擴容,這樣就解決了靜態通訊錄在空間上的不足,

//動態版
typedef struct AddressBook
{
	struct Contact* ListMan;
	int number;//有效聯系人個數
	int capacity;//通訊錄容量,可變
}AdBook;
//靜態版
typedef struct AddressBook
{
	struct Contact ListMan[MAX_NUM];//容量已經確定為MAX_NUM,不可變
	int number;//有效聯系人個數
}AdBook;

而對于聯系人資訊結構以及庫的參考兩者是一模一樣的,

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5//初始化聯系人數量
#define ADD_CON 5//每次增加聯系人數量

//聯系人資訊結構
typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

對于函式宣告,動態版多了一個對通訊錄擴容函式和通訊錄銷毀,

//對通訊錄進行增容
void IncreaseContact(AdBook* pAdBook);

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index);
//聯系人輸入
void InputContact(Con* tmp);
//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name);

//聯系人初始化
void InitContact(AdBook* pAdBook);
//增加聯系人
void AddContact(AdBook* pAdBook);
//洗掉聯系人
void DelContact(AdBook* pAdBook);
//修改聯系人
void ModContact(AdBook* pAdBook);
//顯示聯系人
void ShowContact(AdBook* pAdBook);
//查找聯系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函式
int cmp(const void* e1, const void* e2);
//排序聯系人
void SotrContact(AdBook* pAdBook);

🍹2.2基礎功能從理論到實踐

🍷2.2.1初始化通訊錄

對于動態通訊錄初始化,就是申請一塊初始的空間,用來存放資訊,如果滿了在在此基礎上進行擴容,

//聯系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	pAdBook->capacity = INIT_CON;//初始通訊錄容量
	Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
	if (p == NULL)
	{
		printf("初始申請記憶體失敗!\n");
		exit(-1);//程式沒必要繼續下去,直接終止
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->number = 0;//有效個數為0
		p = NULL;
	}
}

🍷2.2.2新建聯系人

這個和靜態思路一樣哦!不國要注意通訊錄滿了需要擴容,對已經申請過的空間進行擴容,可以使用庫函式realloc實作,

//對通訊錄進行增容
void IncreaseContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
	if (p == NULL)
	{
		printf("通訊錄擴容失敗!\n");
		exit(-1);
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->capacity += ADD_CON;
		p = NULL;
	}
}
//聯系人輸入
void InputContact(Con* tmp)
{
	printf("請輸入聯系人姓名:");
	scanf("%s", tmp->name);
	printf("請輸入聯系人性別:");
	scanf("%s", tmp->sex);
	printf("請輸入聯系人年齡:");
	scanf("%d", &(tmp->age));
	printf("請輸入聯系人電話:");
	scanf("%s", tmp->tel);
	printf("請輸入聯系人地址:");
	scanf("%s", tmp->address);
	printf("請輸入聯系人郵箱:");
	scanf("%s", tmp->email);
}
//增加聯系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->capacity == pAdBook->number)
	{
		IncreaseContact(pAdBook);
	}
	Con tmp = { 0 };
	InputContact(&tmp);
	pAdBook->ListMan[pAdBook->number] = tmp;
	pAdBook->number++;
}

🍷2.2.3洗掉聯系人

與靜態版一模一樣,

//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
		return -1;
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		if (strcmp(pAdBook->ListMan[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//洗掉聯系人
void DelContact(AdBook* pAdBook)
{
	assert(pAdBook);

	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空!\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("請輸入需要洗掉聯系人的姓名->");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			int i = 0;
			for (i = ret; i < pAdBook->number - 1; i++)
			{
				pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
			}
			pAdBook->number--;
			printf("成功洗掉聯系人:%s!\n", name);
		}
		else
		{
			printf("查無此人\n");
		}
	}
}

🍷2.2.4修改聯系人

訪問物件都是陣列,動態靜態實作思路是一模一樣的,

//修改聯系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
	{
		printf("聯系人串列為空,請新建聯系人!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("請輸入需要修改聯系人的姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("請輸入新聯系人的資訊!\n");
		InputContact(pAdBook->ListMan + ret);
		printf("修改聯系人成功!\n");
	}
	else
	{
		printf("查無此人!無法修改!\n");
	}

}

🍷2.2.5顯示聯系人

同樣是訪問陣列,動態靜態實作一樣!
顯示全部聯系人:

}
//顯示全部聯系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "聯系人", "性別", "年齡", "電話", "地址", "郵箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);
	}
}

顯示單個聯系人:

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   資訊如下         \n", pAdBook->ListMan[index].name);
	int i = 0;
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性別", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年齡", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "電話", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "郵箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");
	//輸出函式中-表示左對齊
}

🍷2.2.6根據姓名排序聯系人

根據qsort函式實作,思路與靜態版一樣!

//qsort的cmp函式
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序聯系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通訊錄已經按姓名排序!\n");
	ShowContact(pAdBook);
}

🍷2.2.7基于姓名查找聯系人

訪問陣列,實作思路沒有改變!

//查找聯系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法進行查找!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("請輸入需要查找的聯系人姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查無此人!\n");
	}
}

🍷2.2.8銷毀通訊錄

使用動態記憶體開辟的空間是需要歸還的,當通訊錄使用完后使需要歸還記憶體的,也就是銷毀!

//銷毀通訊錄
void DestoryContact(AdBook* pAdBook)
{
	assert(pAdBook);

	free(pAdBook->ListMan);
	pAdBook->ListMan = NULL;
	pAdBook->capacity = 0;
	pAdBook->number = 0;
}

🍹2.3源代碼匯總

🍷2.3.1頭檔案

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5
#define ADD_CON 5

typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

typedef struct AddressBook
{
	struct Contact* ListMan;
	int number;
	int capacity;
}AdBook;

//對通訊錄進行增容
void IncreaseContact(AdBook* pAdBook);

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index);
//聯系人輸入
void InputContact(Con* tmp);
//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name);

//聯系人初始化
void InitContact(AdBook* pAdBook);
//增加聯系人
void AddContact(AdBook* pAdBook);
//洗掉聯系人
void DelContact(AdBook* pAdBook);
//修改聯系人
void ModContact(AdBook* pAdBook);
//顯示聯系人
void ShowContact(AdBook* pAdBook);
//查找聯系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函式
int cmp(const void* e1, const void* e2);
//排序聯系人
void SotrContact(AdBook* pAdBook);

🍷2.3.2基礎功能實作檔案

#define _CRT_SECURE_NO_WARNINGS 1
#include "dynaCon.h"

//對通訊錄進行增容
void IncreaseContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
	if (p == NULL)
	{
		printf("通訊錄擴容失敗!\n");
		exit(-1);
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->capacity += ADD_CON;
		p = NULL;
	}
}

//銷毀通訊錄
void DestoryContact(AdBook* pAdBook)
{
	assert(pAdBook);

	free(pAdBook->ListMan);
	pAdBook->ListMan = NULL;
	pAdBook->capacity = 0;
	pAdBook->number = 0;
}

//聯系人資訊列印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   資訊如下         \n", pAdBook->ListMan[index].name);
	int i = 0;
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性別", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年齡", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "電話", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "郵箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");

}

//聯系人輸入
void InputContact(Con* tmp)
{
	printf("請輸入聯系人姓名:");
	scanf("%s", tmp->name);
	printf("請輸入聯系人性別:");
	scanf("%s", tmp->sex);
	printf("請輸入聯系人年齡:");
	scanf("%d", &(tmp->age));
	printf("請輸入聯系人電話:");
	scanf("%s", tmp->tel);
	printf("請輸入聯系人地址:");
	scanf("%s", tmp->address);
	printf("請輸入聯系人郵箱:");
	scanf("%s", tmp->email);
}

//以姓名搜索聯系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
		return -1;
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		if (strcmp(pAdBook->ListMan[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//聯系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	pAdBook->capacity = INIT_CON;
	Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
	if (p == NULL)
	{
		printf("初始申請記憶體失敗!\n");
		exit(-1);//程式沒必要繼續下去,直接終止
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->number = 0;
		p = NULL;
	}
}
//增加聯系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->capacity == pAdBook->number)
	{
		IncreaseContact(pAdBook);
	}
	Con tmp = { 0 };
	InputContact(&tmp);
	pAdBook->ListMan[pAdBook->number] = tmp;
	pAdBook->number++;
	printf("新建聯系人成功!\n");
}
//洗掉聯系人
void DelContact(AdBook* pAdBook)
{
	assert(pAdBook);

	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空!\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("請輸入需要洗掉聯系人的姓名->");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			int i = 0;
			for (i = ret; i < pAdBook->number - 1; i++)
			{
				pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
			}
			pAdBook->number--;
			printf("成功洗掉聯系人:%s!\n", name);
		}
		else
		{
			printf("查無此人\n");
		}
	}
}
//修改聯系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
	{
		printf("聯系人串列為空,請新建聯系人!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("請輸入需要修改聯系人的姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("請輸入新聯系人的資訊!\n");
		InputContact(pAdBook->ListMan + ret);
		printf("修改聯系人成功!\n");
	}
	else
	{
		printf("查無此人!無法修改!\n");
	}

}
//顯示聯系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "聯系人", "性別", "年齡", "電話", "地址", "郵箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);
	}
}
//查找聯系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number == 0)
	{
		printf("聯系人串列為空,無法進行查找!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("請輸入需要查找的聯系人姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查無此人!\n");
	}
}
//qsort的cmp函式
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序聯系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通訊錄已經按姓名排序!\n");
	ShowContact(pAdBook);
}

🍷2.3.3測驗檔案

#define _CRT_SECURE_NO_WARNINGS 1

#include "dynaCon.h"

void menu()
{
	printf("*******************************\n");
	printf("*****    1 添加聯系人     *****\n");
	printf("*****    2 洗掉聯系人     *****\n");
	printf("*****    3 查找聯系人     *****\n");
	printf("*****    4 修改聯系人資訊 *****\n");
	printf("*****    5 排序聯系人資訊 *****\n");
	printf("*****    6 顯示聯系人資訊 *****\n");
	printf("*****    0 退出通訊錄     *****\n");
	printf("*******************************\n");
}

enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};

struct AddressBook student;

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("請輸入選單功能序號:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通訊錄成功!");
			break;
		default:
			printf("輸入字符非法!請重新輸入!\n");
			break;
		}

	} while (input);
	return 0;
}

🌼3.總結

動態通訊錄是在完美實作靜態通訊錄所有功能基礎上,可以對通訊錄大小進行靈活變化,再也不用擔心通訊錄滿了的問題,

覺得文章寫得不錯的老鐵們,點贊評論關注走一波!謝謝啦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303089.html

標籤:其他

上一篇:??《不知道密碼也能登錄Linux系統管理員賬號!!!》??——再也不用擔心忘記Linux系統密碼了, GRUB啟動作業系統教程!(建議收藏)

下一篇:【Linux】 ——gcc/g++的使用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more