国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C語言----實現動態通訊錄

whlong / 862人閱讀

摘要:文章目錄前言前言一建立文件二編寫函數三調試運行四成果展示五代碼匯總總結前言通訊錄是我們日常手機中常見的功能之一,綜合語言中結構體,循環,條件語句,動態內存分配等等知識點,我們對手機通訊錄進行一個簡單的實現,下面我們開始講解準備工作利用語


文章目錄

  • 前言
  • 一、建立文件
  • 二、編寫函數
  • 三、調試運行
  • 四、成果展示
  • 五、代碼匯總
  • 總結


前言

通訊錄是我們日常手機中常見的功能之一,綜合C語言中結構體,循環,條件語句,動態內存分配等等知識點,我們對手機通訊錄進行一個簡單的實現,下面我們開始講解!!!


準備工作:(利用C語言實現動態通訊錄)

所需知識:

①.函數調用,函數宏的定義及使用,庫函數對應的頭文件,函數聲明

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

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

④.qsort函數的使用

⑤.動態內存分配函數(malloc函數和realloc函數)的使用

總結:該程序所需的知識比較全面,可以借助本程序對所學C語言的知識進行一個較為全面的復習


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


一、創建文件

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

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

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



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

二、需求分析+實際編寫

1.首先在我們的程序中先創建一個通訊錄,再利用它去實現功能

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

具體代碼如下:

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

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

該代碼塊涉及到的宏:

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

我們看到如果需要修改字符串數組的容量,僅需要對宏后面的數據進行修改即可。

②.分析:我們已經定義了一個基本聯系人的信息,我們想一下,一個通訊錄是由多個聯系人的基本信息組成的,所以我們又可以把多個聯系人的信息(即結構體數組),封裝到一個結構體中,此結構體代表的就是我們的所需要的通訊錄

具體代碼如下:

struct contact{	struct PeoInfo* data;	int sz ;//目前通訊錄有幾個	int capacity;//通訊錄的總容量};

我們在這里定義了一個結構體用來存放多個聯系人的信息,在 contact 結構體里我們存放了一個結構體指針運來存放 PeoInfo 結構體數組的首地址,這里結構體指針代表的就是多個通訊錄成員的信息,sz變量用來記錄通訊錄的人數,capacity變量代表的是通訊錄的總容量。

2.通訊錄已經創建完成,接下來我們先編寫主函數,再對通訊錄進行初始化等一系列操作

我們先編寫一個菜單函數,方便程序運行后根據菜單選擇序號進行功能的實現

具體代碼如下:

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

菜單欄的樣式隨意設計即可。

接著我們定義一個枚舉類型,把我們功能的名稱都寫入枚舉類型中,注意這里寫入時要注意順序,和我們規定的菜單的功能編號一致,這樣可以保證輸入對應的序號實現對應的功能

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

這里的枚舉類型從頭開始默認的初值是 0 每向下走一個類型遞增 1 ,數值順序對應我們的功能序號即可

最后我們編寫我們的主函數作為調用通訊錄功能的函數

具體代碼如下:

#pragma warning(disable : 4996)#include "contact.h"void menu(){	printf("**************************************/n");	printf("*  1.添加聯系人        2.刪除聯系人  */n");	printf("*  3.查找聯系人        4.修改聯系人  */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;//創建一個通訊錄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;}

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

3.下面我們對通訊錄進行初始化以及功能函數的編寫

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

具體代碼如下:

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

我們看到這里的參數傳進來的是我們通訊錄變量的地址,這里定義了一個 pc 指針去接收。我們首先給結構體中的date數據(date代表多組聯系人)進行空間的開辟,我們假設通訊錄的通訊的總容量為 3 先開辟 3 個空間,這三個空間的類型都是結構體類型(struct PeoInfo類型),所以開辟空間的總大小,就是個數 x 封裝成員基本信息的結構體大小。然后利用malloc函數進行空間 的開辟,因為malloc函數的返回值是void*類型(開辟空間的首地址),我們需要把開辟的這上空間強制轉換為我們所需要的結構體指針類型,再賦值給我們 pc 指針指向的 data 空間,這樣就完成了空間的開辟。又因為開始沒有添加聯系人的時候,通訊錄是空的,所以這里的 pc 指向的 sz 先把它賦值成 0 ,這里 pc 指向的 capacity 代表通訊錄的總容量,我們先把它賦值成 3 之后空間不夠,再進行補充。

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

具體代碼如下:

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("請輸入新增聯系人的姓名>");	scanf("%s", pc->data[pc->sz].name);	printf("請輸入新增聯系人的年齡>");	scanf("%d", &pc->data[pc->sz].age);	printf("請輸入新增聯系人的性別>");	scanf("%s", pc->data[pc->sz].sex);	printf("請輸入新增聯系人的電話>");	scanf("%s", pc->data[pc->sz].tel);	printf("請輸入新增聯系人的地址>");	scanf("%s", pc->data[pc->sz].addr);	pc->sz++;}

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

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

具體代碼如下:

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

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

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

具體代碼如下:

void searchcontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要查找的聯系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯系人/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);	}}

查找函數依舊用到了我們的按名字查找函數,在結構體查找到用戶輸入的名字時,返回對應名字的成員下標,沒查找到就返回 -1,返回到查找函數中,進行判斷 -1 就是沒找到,不是 -1,就證明查找到了該聯系人,打印出來對應下標pos的結構體成員變量信息即可。

⑤.功能四:修改指定聯系人

具體代碼如下:

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

在修改指定聯系人的代碼中我們可以看到,依舊使用到了查找函數,我們使用查找名字函數進行查找用戶輸入想要更改的聯系人是不是在通訊錄中,如果不在返回 -1 ,如果在通訊錄里面,返回該聯系人對應的下標。返回到更改函數中,進行條件判斷,如果是 -1 返回空程序結束證明修改功能沒能實現。如果返回的不是 -1 就證明該聯系人在通訊錄里,將他對應的下標結構體信息進行重新的錄入即可。

⑤.功能五:展示聯系人

具體代碼如下:

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);	}}

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

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

具體代碼如下:

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

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

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

這里把剛剛給 pc 所指向的data開辟的空間釋放掉這里用到了 free 函數即釋放我們剛剛動態開辟的空間,然后把 pc->data 指針置空,最后清空通訊錄的人數和總容量即可,綜上就完成通訊錄的退出與銷毀。

四、成果展示

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

②.刪除聯系人 + 展示

③.查找指定聯系人

④.修改指定聯系人 + 展示

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

⑥.退出通訊錄



五、代碼匯總

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

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

這里的是函數聲明:

②.test.c(測試函數)

#pragma warning(disable : 4996)#include "contact.h"void menu(){	printf("**************************************/n");	printf("*  1.添加聯系人        2.刪除聯系人  */n");	printf("*  3.查找聯系人        4.修改聯系人  */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;//創建一個通訊錄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(功能函數的編寫)

#pragma warning(disable : 4996)#include "contact.h"void initcontact(struct contact* pc){	pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));//動態分配給data一塊內存	pc->sz = 0;//初始化時通訊錄沒人	pc->capacity = size;//假設一開始的通訊錄容量為3后面不夠用隨時增容}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("請輸入新增聯系人的姓名>");	scanf("%s", pc->data[pc->sz].name);	printf("請輸入新增聯系人的年齡>");	scanf("%d", &pc->data[pc->sz].age);	printf("請輸入新增聯系人的性別>");	scanf("%s", pc->data[pc->sz].sex);	printf("請輸入新增聯系人的電話>");	scanf("%s", pc->data[pc->sz].tel);	printf("請輸入新增聯系人的地址>");	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("請您輸入想要刪除的聯系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯系人/n");	}	else	{		int j = 0;		for (j = pos; j < pc->sz; j++)		{			pc->data[j] = pc->data[j + 1];//所有消息都進行交換		}		pc->sz--;		printf("該聯系人刪除成功/n");	}}void searchcontact(struct contact* pc){	char name[namemax] = { 0 };	printf("請您輸入想要查找的聯系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯系人/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("請您輸入想要修改的聯系人姓名>");	scanf("%s", name);	int pos = Findname(name, pc);	if (pos == -1)	{		printf("沒找到此聯系人/n");	}	else	{		printf("請輸入修改聯系人的姓名>");		scanf("%s", pc->data[pos].name);		printf("請輸入修改聯系人的年齡>");		scanf("%d", &pc->data[pos].age);		printf("請輸入修改聯系人的性別>");		scanf("%s", pc->data[pos].sex);		printf("請輸入修改聯系人的電話>");		scanf("%s", pc->data[pos].tel);		printf("請輸入修改聯系人的地址>");		scanf("%s", pc->data[pos].addr);		printf("該聯系人信息修改成功!!!/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;}

總結

這就是簡單通訊錄的實現,對C語言很多的知識進行了全面的應用,后面還會對通訊錄實現文件的版本,還請持續關注,如果本篇文章存在問題請及時聯系博主,或者評論區下方留言,謝謝大家的支持!!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121278.html

相關文章

  • C語言進階】C語言實現訊錄 升級版 { 含動態擴容/銷毀/信息保存功能 }(強烈建議收藏食用)

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

    gxyz 評論0 收藏0
  • 動態文件版訊錄C語言中的文件的讀寫操作

    摘要:那么我們首先來改造儲存空間也就是通訊錄結構體靜態版本人信息存放在數組中統計存放的人數動態版本統計存放的人數有效容量我們將原本的結構體數組改為一個結構體指針,以此來維護用以儲存個人信息的空間。 上一期我們編寫了一個C語言版本的簡易通訊錄,但是我們的之前的通訊錄是沒有記憶功能的,也就是說,一旦關...

    h9911 評論0 收藏0
  • C語言實現訊錄管理系統(結構體+枚舉+動態內存開辟+文件操作+線性表存放數據)

    摘要:本篇文章將用語言代碼實現一個通訊錄管理系統,本片文章博主將會運用到架構提,枚舉,動態內存開辟和文件操作等。這里存放數據的結構是線性表。這個指針就可以通過動態開辟內存來調整存放信息的大小。擴容成功這樣就實現了檢查通訊錄是否需要擴容的函數。 ...

    PingCAP 評論0 收藏0
  • C語言實現簡易動態電話簿&amp;&amp;文末提供源代碼下載

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

    蘇丹 評論0 收藏0
  • C語言實現訊錄

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

    AaronYuan 評論0 收藏0

發表評論

0條評論

whlong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<