成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

C語言----實(shí)現(xiàn)動(dòng)態(tài)通訊錄

whlong / 884人閱讀

摘要:文章目錄前言前言一建立文件二編寫函數(shù)三調(diào)試運(yùn)行四成果展示五代碼匯總總結(jié)前言通訊錄是我們?nèi)粘J謾C(jī)中常見的功能之一,綜合語言中結(jié)構(gòu)體,循環(huán),條件語句,動(dòng)態(tài)內(nèi)存分配等等知識點(diǎn),我們對手機(jī)通訊錄進(jìn)行一個(gè)簡單的實(shí)現(xiàn),下面我們開始講解準(zhǔn)備工作利用語


文章目錄

  • 前言
  • 一、建立文件
  • 二、編寫函數(shù)
  • 三、調(diào)試運(yùn)行
  • 四、成果展示
  • 五、代碼匯總
  • 總結(jié)


前言

通訊錄是我們?nèi)粘J謾C(jī)中常見的功能之一,綜合C語言中結(jié)構(gòu)體,循環(huán),條件語句,動(dòng)態(tài)內(nèi)存分配等等知識點(diǎn),我們對手機(jī)通訊錄進(jìn)行一個(gè)簡單的實(shí)現(xiàn),下面我們開始講解?。?!


準(zhǔn)備工作:(利用C語言實(shí)現(xiàn)動(dòng)態(tài)通訊錄)

所需知識:

①.函數(shù)調(diào)用,函數(shù)宏的定義及使用,庫函數(shù)對應(yīng)的頭文件,函數(shù)聲明

②.循環(huán)語句,選擇語句( switch 和 if 語句?)的使用

③.指針,自定義類型的使用(結(jié)構(gòu)體和枚舉類型)

④.qsort函數(shù)的使用

⑤.動(dòng)態(tài)內(nèi)存分配函數(shù)(malloc函數(shù)和realloc函數(shù))的使用

總結(jié):該程序所需的知識比較全面,可以借助本程序?qū)λ鶎W(xué)C語言的知識進(jìn)行一個(gè)較為全面的復(fù)習(xí)


在這里我們采用的是多文件的編寫方式,各個(gè)文件分工明確,代碼簡約可讀性高


一、創(chuàng)建文件

1.創(chuàng)建一個(gè)頭文件用來編寫函數(shù)聲明,庫函數(shù)的頭文件,定義define宏,定義結(jié)構(gòu)體的基本信息,我們把這些代碼都放在頭文件里面方便我們另外兩個(gè)文件調(diào)用,頭文件里面的代碼我們其他兩個(gè) .c 文件中都要用到,這樣的編寫方式使我們的代碼更加簡約,增加可讀性。

2.在contact.c文件中我們主要編寫的是通訊錄的功能函數(shù)

3.在test.c文件中我們編寫的通訊錄的基本樣式,以及通過test.c這個(gè)文件去串起來其他兩個(gè)文件,實(shí)現(xiàn)通訊錄的功能



提示為了方便解析代碼博主將代碼進(jìn)行了拆分,在文章的最后會給大家放上最終三個(gè)文件的完整代碼

二、需求分析+實(shí)際編寫

1.首先在我們的程序中先創(chuàng)建一個(gè)通訊錄,再利用它去實(shí)現(xiàn)功能

①.分析:我們知道通訊錄里面會存儲一個(gè)人的多個(gè)信息,比如:年齡,性別,電話等等,這些都是一個(gè)人的多個(gè)屬性,所以我們就可以把一個(gè)人的基本信息封裝到一個(gè)結(jié)構(gòu)體里

具體代碼如下:

struct PeoInfo//定義一個(gè)聯(lián)系人基本信息{	char name[namemax];	int age;	char sex[sexmax];	char tel[telemax];	char addr[addrmax];};

我們看到在結(jié)構(gòu)體里面存儲一個(gè)人的五項(xiàng)基本信息,由于兩個(gè) .c 文件都會用到此結(jié)構(gòu)體的成員信息,所以我們把這個(gè)結(jié)構(gòu)體放在文件中。我們注意到字符串?dāng)?shù)組括號里面沒有寫具體的數(shù)字,而是用宏進(jìn)行了代替,這樣的目的是方便以后對數(shù)據(jù)的修改,僅僅對宏修改即可,省去對程序的每一個(gè)涉及到該字符串的數(shù)據(jù)進(jìn)行修改。

該代碼塊涉及到的宏:

#define namemax 20#define sexmax 5#define telemax 12#define addrmax 30

我們看到如果需要修改字符串?dāng)?shù)組的容量,僅需要對宏后面的數(shù)據(jù)進(jìn)行修改即可。

②.分析:我們已經(jīng)定義了一個(gè)基本聯(lián)系人的信息,我們想一下,一個(gè)通訊錄是由多個(gè)聯(lián)系人的基本信息組成的,所以我們又可以把多個(gè)聯(lián)系人的信息(即結(jié)構(gòu)體數(shù)組),封裝到一個(gè)結(jié)構(gòu)體中,此結(jié)構(gòu)體代表的就是我們的所需要的通訊錄

具體代碼如下:

struct contact{	struct PeoInfo* data;	int sz ;//目前通訊錄有幾個(gè)	int capacity;//通訊錄的總?cè)萘縸;

我們在這里定義了一個(gè)結(jié)構(gòu)體用來存放多個(gè)聯(lián)系人的信息,在 contact 結(jié)構(gòu)體里我們存放了一個(gè)結(jié)構(gòu)體指針運(yùn)來存放 PeoInfo 結(jié)構(gòu)體數(shù)組的首地址,這里結(jié)構(gòu)體指針代表的就是多個(gè)通訊錄成員的信息,sz變量用來記錄通訊錄的人數(shù),capacity變量代表的是通訊錄的總?cè)萘俊?/p>

2.通訊錄已經(jīng)創(chuàng)建完成,接下來我們先編寫主函數(shù),再對通訊錄進(jìn)行初始化等一系列操作

我們先編寫一個(gè)菜單函數(shù),方便程序運(yùn)行后根據(jù)菜單選擇序號進(jìn)行功能的實(shí)現(xiàn)

具體代碼如下:

void menu(){	printf("**************************************/n");	printf("*  1.添加聯(lián)系人        2.刪除聯(lián)系人    */n");	printf("*  3.查找聯(lián)系人        4.修改聯(lián)系人    */n");	printf("*  5.展示通訊錄        6.按名字排序    */n");	printf("*               0.退出                */n");	printf("**************************************/n");}

菜單欄的樣式隨意設(shè)計(jì)即可。

接著我們定義一個(gè)枚舉類型,把我們功能的名稱都寫入枚舉類型中,注意這里寫入時(shí)要注意順序,和我們規(guī)定的菜單的功能編號一致,這樣可以保證輸入對應(yīng)的序號實(shí)現(xiàn)對應(yīng)的功能

enum Option{	EXIT,	ADD,	DEL,	SERCH,	MODIFY,	SHOW,	SORT};

這里的枚舉類型從頭開始默認(rèn)的初值是 0 每向下走一個(gè)類型遞增 1 ,數(shù)值順序?qū)?yīng)我們的功能序號即可

最后我們編寫我們的主函數(shù)作為調(diào)用通訊錄功能的函數(shù)

具體代碼如下:

#pragma warning(disable : 4996)#include "contact.h"void menu(){	printf("**************************************/n");	printf("*  1.添加聯(lián)系人        2.刪除聯(lián)系人  */n");	printf("*  3.查找聯(lián)系人        4.修改聯(lián)系人  */n");	printf("*  5.展示通訊錄        6.按名字排序  */n");	printf("*               0.退出               */n");	printf("**************************************/n");}enum OPTION{	EXIT,	ADD,	DEL,	SEARCH,	MODIFY,	SHOW,	SORT};int main(){	int input = 0;	struct contact con;//創(chuàng)建一個(gè)通訊錄con變量	initcontact(&con);//初始化通訊錄	do	{		menu();		printf("請選擇通訊錄功能>");		scanf("%d", &input);		switch (input)		{		case ADD:			addcontact(&con);			break;		case DEL:			delcontact(&con);			break;		case SEARCH:			searchcontact(&con);			break;		case MODIFY:			modifycontact(&con);			break;		case SHOW:			showcontact(&con);			break;		case SORT:			sortcontact(&con);			break;		case EXIT:			destorycontact(&con);			printf("退出通訊錄/n");			break;		}	} while (input);	return 0;}

我們在這里定義了一個(gè) input 輸入變量,根據(jù)用戶的輸入去實(shí)現(xiàn)不同的功能。創(chuàng)建了一個(gè)結(jié)構(gòu)體變量con,變量 con 代表的就是我們的剛剛設(shè)置好的通訊錄。定義一個(gè) initcontact 函數(shù)對我們的通訊錄進(jìn)行初始化(開辟空間)。進(jìn)入循環(huán),用戶輸入不同的數(shù)據(jù)實(shí)現(xiàn)不同的功能,case后面的枚舉類型代表的就是對應(yīng)的功能序號,在每一個(gè)功能下面都有一個(gè)功能函數(shù)去實(shí)現(xiàn)不同的功能,最后循環(huán)以輸入的input數(shù)值最后循環(huán)終止的條件,如果輸入的是 0 退出通訊錄,結(jié)束循環(huán)。

3.下面我們對通訊錄進(jìn)行初始化以及功能函數(shù)的編寫

①.我們先對通訊錄進(jìn)行初始化(即給通訊錄分配空間)

具體代碼如下:

void initcontact(struct contact* pc){	pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));//動(dòng)態(tài)分配給data一塊內(nèi)存	pc->sz = 0;//初始化時(shí)通訊錄沒人	pc->capacity = size;//假設(shè)一開始的通訊錄容量為3后面不夠用隨時(shí)增容}
#define size 3

我們看到這里的參數(shù)傳進(jìn)來的是我們通訊錄變量的地址,這里定義了一個(gè) pc 指針去接收。我們首先給結(jié)構(gòu)體中的date數(shù)據(jù)(date代表多組聯(lián)系人)進(jìn)行空間的開辟,我們假設(shè)通訊錄的通訊的總?cè)萘繛?3 先開辟 3 個(gè)空間,這三個(gè)空間的類型都是結(jié)構(gòu)體類型(struct PeoInfo類型),所以開辟空間的總大小,就是個(gè)數(shù) x 封裝成員基本信息的結(jié)構(gòu)體大小。然后利用malloc函數(shù)進(jìn)行空間 的開辟,因?yàn)閙alloc函數(shù)的返回值是void*類型(開辟空間的首地址),我們需要把開辟的這上空間強(qiáng)制轉(zhuǎn)換為我們所需要的結(jié)構(gòu)體指針類型,再賦值給我們 pc 指針指向的 data 空間,這樣就完成了空間的開辟。又因?yàn)殚_始沒有添加聯(lián)系人的時(shí)候,通訊錄是空的,所以這里的 pc 指向的 sz 先把它賦值成 0 ,這里 pc 指向的 capacity 代表通訊錄的總?cè)萘浚覀兿劝阉x值成 3 之后空間不夠,再進(jìn)行補(bǔ)充。

②.初始化完成后,我們開始實(shí)現(xiàn)我們的通訊錄的代號為 1 的功能即add(添加聯(lián)系人)函數(shù)的編寫

具體代碼如下:

void addcontact(struct contact* pc){	//如果通訊錄滿了	if (pc->sz == pc->capacity)	{		//增容		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));		if (ptr != NULL)		{			pc->data = ptr;			pc->capacity += 2;			printf("通訊錄增容成功/n");		}		else		{			return;		}	}	printf("請輸入新增聯(lián)系人的姓名>");	scanf("%s", pc->data[pc->sz].name);	printf("請輸入新增聯(lián)系人的年齡>");	scanf("%d", &pc->data[pc->sz].age);	printf("請輸入新增聯(lián)系人的性別>");	scanf("%s", pc->data[pc->sz].sex);	printf("請輸入新增聯(lián)系人的電話>");	scanf("%s", pc->data[pc->sz].tel);	printf("請輸入新增聯(lián)系人的地址>");	scanf("%s", pc->data[pc->sz].addr);	pc->sz++;}

代碼解析:我們看到這里的參數(shù)傳進(jìn)來的是我們通訊錄變量的地址,這里定義了一個(gè) pc 指針去接收。進(jìn)入函數(shù)先行判斷通訊錄滿沒滿,如果沒滿直接進(jìn)入到下面的 scanf 和 printf 語句中進(jìn)行成員基本信息的錄入,最后成員數(shù)sz+1。如果滿了判斷的條件就是目前通訊錄的 sz 個(gè)數(shù)等于我們的通訊錄的總?cè)萘繑?shù),這樣我們的通訊錄就已經(jīng)存滿了。進(jìn)入到 if 語句中對空間重新分配,這里用到了realloc函數(shù),在realloc函數(shù)中傳入兩個(gè)參數(shù),一個(gè)是需要進(jìn)行重新分配的空間,另一個(gè)是重新開辟的空間大小,這里的空間我們兩個(gè)兩個(gè)的給通訊錄增加(避免一次開辟過多對空間造成浪費(fèi)),我們看到這里的空間在原本的通訊錄容量上capacity+2就是給我們的通訊錄總?cè)萘吭匍_辟兩個(gè)空間,有了需要開辟的空間個(gè)數(shù),我們用個(gè)數(shù) x 封裝成員基本信息的結(jié)構(gòu)體大小得到的就是我們需要重新開辟的空間大小,.realloc函數(shù)開辟空間后返回的是void*(開辟空間的首地址),我們在這里把它強(qiáng)轉(zhuǎn)為我們需要的結(jié)構(gòu)體指針類型,賦值給我們的定義的結(jié)構(gòu)體指針,這里新創(chuàng)建一個(gè)指針,不直接賦值給 pc 就是為了防止開辟空間失敗,把pc指針置空了,導(dǎo)致pc指針中的數(shù)據(jù)就清空了,為了防止這樣的情況發(fā)生,我們先定義一個(gè)中間變量存放開辟的空間,然后進(jìn)入判斷如果這里返回的是空指針(NULL),證明空間開辟失敗了,直接返回空就可以了。如果開辟的不是空指針(NULL),就把這塊開辟的空間賦值給存儲多組成員信息的結(jié)構(gòu)體指針,然后對應(yīng)通訊錄的總?cè)萘?+ 2,并打印一下告知空間開辟成功。

③.功能2:通訊錄的刪除操作(這里用到了strcmp函數(shù))--->C語言相關(guān)字符串庫函數(shù)用法

具體代碼如下:

void delcontact(struct contact* pc){	if (pc->sz == 0)	{		printf("通訊錄為空無法刪除/n");		return;	}	char name[namemax] = { 0 };	printf("請您輸入想要?jiǎng)h除的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		int j = 0;		for (j = pos; j < pc->sz; j++)		{			pc->data[j] = pc->data[j + 1];//所有消息都進(jìn)行交換		}		pc->sz--;		printf("該聯(lián)系人刪除成功/n");	}}

因?yàn)槲覀冃枰檎业綄?yīng)的成員名字再進(jìn)行刪除

所以我們在這里還需要再編寫一個(gè)查找名字的函數(shù)(該函數(shù)在后面的查找聯(lián)系人,更改聯(lián)系人中都有用到,因?yàn)樗麄兌际峭ㄟ^名字去查找,再進(jìn)行操作)

int Findname(char* name, struct contact* pc){	int i = 0;	for (i = 0; i < pc->sz; i++)	{		if (strcmp(name, pc->data[i].name) == 0)		{			return i;		}	}	return -1;}

我們先看刪除函數(shù),我們先進(jìn)行判斷通訊錄是不是為空,如果sz為0的情況下,這時(shí)候通訊是無法進(jìn)行刪除操作(因?yàn)橥ㄓ嶄浿袥]有聯(lián)系人信息),如果為空就直接返回空。如果通訊錄有聯(lián)系人的信息,我們就定義一個(gè)由用戶輸入的名字,我們用這個(gè)名字去進(jìn)行查找,查找到了就進(jìn)行刪除操作,沒有這個(gè)名字就直接返回空(即刪除操作失敗了)。在查找的過程中我們就用到我們的查找函數(shù),我們看到查找函數(shù)中的參數(shù)一個(gè)是用戶輸入的名字,一個(gè)是通訊錄現(xiàn)有的成員信息,我們進(jìn)行循環(huán)判斷,這里用到了strcmp函數(shù)進(jìn)行字符串比較,如果相等就返回對應(yīng)這個(gè)名字在結(jié)構(gòu)體中的下標(biāo)位置,如果沒有查找到就返回-1。返回到刪除函數(shù)我們定義一個(gè)pos變量對返回值進(jìn)行接收,然后再進(jìn)行一次判斷,如果是-1代表沒有查找到函數(shù)返回空,如果不是 -1 證明查找到了該聯(lián)系人,即可以進(jìn)行刪除操作,從pos(需要進(jìn)行刪除操作的名字位置)位置開始依次把后面的結(jié)構(gòu)體成員信息向前一個(gè)賦值,把需要?jiǎng)h除的那個(gè)成員信息被后面的成員信息覆蓋掉即可,最后賦值操作完成后,目前得通訊錄人數(shù) -1即完成了我們的刪除操作。

④.功能三:通訊錄的查找操作

具體代碼如下:

void searchcontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要查找的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",			"姓名", "年齡", "性別", "電話", "地址");		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[pos].name			, pc->data[pos].age			, pc->data[pos].sex			, pc->data[pos].tel			, pc->data[pos].addr);	}}

查找函數(shù)依舊用到了我們的按名字查找函數(shù),在結(jié)構(gòu)體查找到用戶輸入的名字時(shí),返回對應(yīng)名字的成員下標(biāo),沒查找到就返回 -1,返回到查找函數(shù)中,進(jìn)行判斷 -1 就是沒找到,不是 -1,就證明查找到了該聯(lián)系人,打印出來對應(yīng)下標(biāo)pos的結(jié)構(gòu)體成員變量信息即可。

⑤.功能四:修改指定聯(lián)系人

具體代碼如下:

void modifycontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要修改的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		printf("請輸入修改聯(lián)系人的姓名>");		scanf("%s", pc->data[pos].name);		printf("請輸入修改聯(lián)系人的年齡>");		scanf("%d", &pc->data[pos].age);		printf("請輸入修改聯(lián)系人的性別>");		scanf("%s", pc->data[pos].sex);		printf("請輸入修改聯(lián)系人的電話>");		scanf("%s", pc->data[pos].tel);		printf("請輸入修改聯(lián)系人的地址>");		scanf("%s", pc->data[pos].addr);		printf("該聯(lián)系人信息修改成功!!!/n");	}}

在修改指定聯(lián)系人的代碼中我們可以看到,依舊使用到了查找函數(shù),我們使用查找名字函數(shù)進(jìn)行查找用戶輸入想要更改的聯(lián)系人是不是在通訊錄中,如果不在返回 -1 ,如果在通訊錄里面,返回該聯(lián)系人對應(yīng)的下標(biāo)。返回到更改函數(shù)中,進(jìn)行條件判斷,如果是 -1 返回空程序結(jié)束證明修改功能沒能實(shí)現(xiàn)。如果返回的不是 -1 就證明該聯(lián)系人在通訊錄里,將他對應(yīng)的下標(biāo)結(jié)構(gòu)體信息進(jìn)行重新的錄入即可。

⑤.功能五:展示聯(lián)系人

具體代碼如下:

void showcontact(struct contact* pc){	printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",		"姓名", "年齡", "性別", "電話", "地址");	int i = 0;	for (i = 0; i < pc->sz; i++)	{		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[i].name			, pc->data[i].age			, pc->data[i].sex			, pc->data[i].tel			, pc->data[i].addr);	}}

在打印信息的上面先定義一行標(biāo)題,再利用循環(huán),循環(huán)條件是小于目前通訊錄的人數(shù)(pc所指向的sz個(gè)數(shù)),循環(huán)打印出來所有的信息即可

⑥.功能六:按照名字對通訊錄進(jìn)行排序(這里用到了qsort函數(shù))-->?qsort函數(shù)的用法

具體代碼如下:

int cmp_byname(const void* e1, const void* e2){	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);}void sortcontact(struct contact* pc){	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_byname);	printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",		"姓名", "年齡", "性別", "電話", "地址");	int i = 0;	for (i = 0; i < pc->sz; i++)	{		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[i].name			, pc->data[i].age			, pc->data[i].sex			, pc->data[i].tel			, pc->data[i].addr);	}}

看到這里的 qsort 函數(shù)第一個(gè)參數(shù)是需要進(jìn)行排序的數(shù)組名,第二個(gè)參數(shù)是數(shù)組的容量,即我們數(shù)組中的人數(shù),第三個(gè)參數(shù)是數(shù)組元素的大小,pc->data代表整個(gè)數(shù)組,pc->data[0]代表的就是數(shù)組的第一個(gè)元素,利用 sizeof 即可計(jì)算出來數(shù)組元素的大小(單位:字節(jié)),最后一個(gè)參數(shù)是我們自定義比較函數(shù)的函數(shù)名。比較函數(shù)中,由于qsort函數(shù)對任意類型的元素都可以進(jìn)行排序,所以里面參數(shù)的類型采用的都是 void* 類型(void*類型可以接收任意類型的指針),在比較的時(shí)候強(qiáng)制轉(zhuǎn)換我們需要比較的數(shù)據(jù)類型即可,由于這里需要通過名字進(jìn)行比較,所以這里用到 strcmp 函數(shù)進(jìn)行比較,如果相等返回 0 ,相異返回 -1/1。排序后循環(huán)打印出來排序后的通訊錄即可。

⑦.功能零:退出通訊錄并銷毀通訊錄

void destorycontact(struct contact* pc){	free(pc->data);	pc->data = NULL;	pc->sz = 0;	pc->capacity = 0;}

這里把剛剛給 pc 所指向的data開辟的空間釋放掉這里用到了 free 函數(shù)即釋放我們剛剛動(dòng)態(tài)開辟的空間,然后把 pc->data 指針置空,最后清空通訊錄的人數(shù)和總?cè)萘考纯?,綜上就完成通訊錄的退出與銷毀。

四、成果展示

①.信息錄入 + 通訊錄增容

②.刪除聯(lián)系人 + 展示

③.查找指定聯(lián)系人

④.修改指定聯(lián)系人 + 展示

⑤.按名字排序(按照字符的assic碼值進(jìn)行比較的)

⑥.退出通訊錄



五、代碼匯總

①.contact.h(所需頭文件,函數(shù)聲明,宏的定義)

#pragma once#include #include #include #define namemax 20#define sexmax 5#define telemax 12#define addrmax 30#define size 3struct PeoInfo//定義一個(gè)聯(lián)系人基本信息{	char name[namemax];	int age;	char sex[sexmax];	char tel[telemax];	char addr[addrmax];};//這三個(gè)信息組成我們的通訊錄struct contact{	struct PeoInfo* data;	int sz ;//目前通訊錄有幾個(gè)	int capacity;//通訊錄的總?cè)萘縸;//函數(shù)聲明//初始化通訊錄void initcontact(struct contact* pc);//增加聯(lián)系人void addcontact(struct contact* pc);//展示通訊錄void showcontact(struct contact* pc);//刪除指定聯(lián)系人void delcontact(struct contact* pc);//查找指定聯(lián)系人void searchcontact(struct contact* pc);//修改指定聯(lián)系人void modifycontact(struct contact* pc);//按名字進(jìn)行排序void sortcontact(struct contact* pc);//銷毀通訊錄void destorycontact(struct contact* pc);

這里的是函數(shù)聲明:

②.test.c(測試函數(shù))

#pragma warning(disable : 4996)#include "contact.h"void menu(){	printf("**************************************/n");	printf("*  1.添加聯(lián)系人        2.刪除聯(lián)系人  */n");	printf("*  3.查找聯(lián)系人        4.修改聯(lián)系人  */n");	printf("*  5.展示通訊錄        6.按名字排序  */n");	printf("*               0.退出               */n");	printf("**************************************/n");}enum OPTION{	EXIT,	ADD,	DEL,	SEARCH,	MODIFY,	SHOW,	SORT};int main(){	int input = 0;	struct contact con;//創(chuàng)建一個(gè)通訊錄con變量	initcontact(&con);//初始化通訊錄	do	{		menu();		printf("請選擇通訊錄功能>");		scanf("%d", &input);		switch (input)		{		case ADD:			addcontact(&con);			break;		case DEL:			delcontact(&con);			break;		case SEARCH:			searchcontact(&con);			break;		case MODIFY:			modifycontact(&con);			break;		case SHOW:			showcontact(&con);			break;		case SORT:			sortcontact(&con);			break;		case EXIT:			destorycontact(&con);			printf("退出通訊錄/n");			break;		}	} while (input);	return 0;}

③.contact.c(功能函數(shù)的編寫)

#pragma warning(disable : 4996)#include "contact.h"void initcontact(struct contact* pc){	pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));//動(dòng)態(tài)分配給data一塊內(nèi)存	pc->sz = 0;//初始化時(shí)通訊錄沒人	pc->capacity = size;//假設(shè)一開始的通訊錄容量為3后面不夠用隨時(shí)增容}void addcontact(struct contact* pc){	//如果通訊錄滿了	if (pc->sz == pc->capacity)	{		//增容		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));		if (ptr != NULL)		{			pc->data = ptr;			pc->capacity += 2;			printf("通訊錄增容成功/n");		}		else		{			return;		}	}	printf("請輸入新增聯(lián)系人的姓名>");	scanf("%s", pc->data[pc->sz].name);	printf("請輸入新增聯(lián)系人的年齡>");	scanf("%d", &pc->data[pc->sz].age);	printf("請輸入新增聯(lián)系人的性別>");	scanf("%s", pc->data[pc->sz].sex);	printf("請輸入新增聯(lián)系人的電話>");	scanf("%s", pc->data[pc->sz].tel);	printf("請輸入新增聯(lián)系人的地址>");	scanf("%s", pc->data[pc->sz].addr);	pc->sz++;}void showcontact(struct contact* pc){	printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",		"姓名", "年齡", "性別", "電話", "地址");	int i = 0;	for (i = 0; i < pc->sz; i++)	{		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[i].name			, pc->data[i].age			, pc->data[i].sex			, pc->data[i].tel			, pc->data[i].addr);	}}int Findname(char* name, struct contact* pc){	int i = 0;	for (i = 0; i < pc->sz; i++)	{		if (strcmp(name, pc->data[i].name) == 0)		{			return i;		}	}	return -1;}void delcontact(struct contact* pc){	if (pc->sz == 0)	{		printf("通訊錄為空無法刪除/n");		return;	}	char name[namemax] = { 0 };	printf("請您輸入想要?jiǎng)h除的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		int j = 0;		for (j = pos; j < pc->sz; j++)		{			pc->data[j] = pc->data[j + 1];//所有消息都進(jìn)行交換		}		pc->sz--;		printf("該聯(lián)系人刪除成功/n");	}}void searchcontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要查找的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",			"姓名", "年齡", "性別", "電話", "地址");		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[pos].name			, pc->data[pos].age			, pc->data[pos].sex			, pc->data[pos].tel			, pc->data[pos].addr);	}}void modifycontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要修改的聯(lián)系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯(lián)系人/n");	}	else	{		printf("請輸入修改聯(lián)系人的姓名>");		scanf("%s", pc->data[pos].name);		printf("請輸入修改聯(lián)系人的年齡>");		scanf("%d", &pc->data[pos].age);		printf("請輸入修改聯(lián)系人的性別>");		scanf("%s", pc->data[pos].sex);		printf("請輸入修改聯(lián)系人的電話>");		scanf("%s", pc->data[pos].tel);		printf("請輸入修改聯(lián)系人的地址>");		scanf("%s", pc->data[pos].addr);		printf("該聯(lián)系人信息修改成功!!!/n");	}}int cmp_byname(const void* e1, const void* e2){	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);}void sortcontact(struct contact* pc){	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_byname);	printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n",		"姓名", "年齡", "性別", "電話", "地址");	int i = 0;	for (i = 0; i < pc->sz; i++)	{		printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n"			, pc->data[i].name			, pc->data[i].age			, pc->data[i].sex			, pc->data[i].tel			, pc->data[i].addr);	}}void destorycontact(struct contact* pc){	free(pc->data);	pc->data = NULL;	pc->sz = 0;	pc->capacity = 0;}

總結(jié)

這就是簡單通訊錄的實(shí)現(xiàn),對C語言很多的知識進(jìn)行了全面的應(yīng)用,后面還會對通訊錄實(shí)現(xiàn)文件的版本,還請持續(xù)關(guān)注,如果本篇文章存在問題請及時(shí)聯(lián)系博主,或者評論區(qū)下方留言,謝謝大家的支持??!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121278.html

相關(guān)文章

  • C語言進(jìn)階】C語言實(shí)現(xiàn)訊錄 升級版 { 含動(dòng)態(tài)擴(kuò)容/銷毀/信息保存功能 }(強(qiáng)烈建議收藏食用)

    摘要:之前的通訊錄在程序退出后內(nèi)部的數(shù)據(jù)就會消失,再次打開程序后只能重新輸入數(shù)據(jù),為此我們增加了一個(gè)保存功能來保存信息。 前言: 由于之前實(shí)現(xiàn)的通訊錄在存儲方面只能支持靜態(tài)的1000人的存儲量,但是如果聯(lián)系人較少,則會造成較大的內(nèi)存浪費(fèi)。而當(dāng)聯(lián)系人一旦超過1000時(shí),就不能再繼續(xù)存儲信息了。因...

    gxyz 評論0 收藏0
  • 動(dòng)態(tài)文件版訊錄C語言中的文件的讀寫操作

    摘要:那么我們首先來改造儲存空間也就是通訊錄結(jié)構(gòu)體靜態(tài)版本人信息存放在數(shù)組中統(tǒng)計(jì)存放的人數(shù)動(dòng)態(tài)版本統(tǒng)計(jì)存放的人數(shù)有效容量我們將原本的結(jié)構(gòu)體數(shù)組改為一個(gè)結(jié)構(gòu)體指針,以此來維護(hù)用以儲存?zhèn)€人信息的空間。 上一期我們編寫了一個(gè)C語言版本的簡易通訊錄,但是我們的之前的通訊錄是沒有記憶功能的,也就是說,一旦關(guān)...

    h9911 評論0 收藏0
  • C語言實(shí)現(xiàn)訊錄管理系統(tǒng)(結(jié)構(gòu)體+枚舉+動(dòng)態(tài)內(nèi)存開辟+文件操作+線性表存放數(shù)據(jù))

    摘要:本篇文章將用語言代碼實(shí)現(xiàn)一個(gè)通訊錄管理系統(tǒng),本片文章博主將會運(yùn)用到架構(gòu)提,枚舉,動(dòng)態(tài)內(nèi)存開辟和文件操作等。這里存放數(shù)據(jù)的結(jié)構(gòu)是線性表。這個(gè)指針就可以通過動(dòng)態(tài)開辟內(nèi)存來調(diào)整存放信息的大小。擴(kuò)容成功這樣就實(shí)現(xiàn)了檢查通訊錄是否需要擴(kuò)容的函數(shù)。 ...

    PingCAP 評論0 收藏0
  • C語言實(shí)現(xiàn)簡易動(dòng)態(tài)電話簿&amp;&amp;文末提供源代碼下載

    摘要:導(dǎo)航前言功能函數(shù)結(jié)構(gòu)設(shè)定菜單交互主函數(shù)通訊錄初始化新增聯(lián)系人查找聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查看所有聯(lián)系人清空所有聯(lián)系人以名字排序所有聯(lián)系人結(jié)尾語前言本文將實(shí)現(xiàn)一個(gè)簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。 ...

    蘇丹 評論0 收藏0
  • C語言實(shí)現(xiàn)訊錄

    摘要:通訊錄程序存放聯(lián)系人信息信息名字年齡性別電話住址增加聯(lián)系人刪除聯(lián)系人查找聯(lián)系人修改聯(lián)系人排序源文件代碼如下創(chuàng)建一個(gè)枚舉類型,分別對應(yīng)菜單選項(xiàng)創(chuàng)建一個(gè)通訊錄初始化通訊錄最多可以放個(gè)聯(lián)系 ...

    AaronYuan 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<