最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)通訊錄的八種功能(添加、刪除、查找、修改、顯示、排序、退出、清空)

 更新時間:2023年09月26日 11:02:25   作者:Chris·Bosh  
本文主要介紹了C語言實現(xiàn)通訊錄的八種功能,主要包括添加、刪除、查找、修改、顯示、排序、退出、清空,感興趣的可以了解一下

通訊錄功能概要及前提說明

此通訊錄利用C語言完成,可以實現(xiàn)八種功能的通訊錄(添加、刪除、查找、修改、顯示、排序、退出、清空)

在這里插入圖片描述

代碼由三部分組成,為什么要寫成三部分而不寫成一部分可以參考我以前的博客,如下:鏈接: link

1.通信錄具體功能

通訊錄可以用來存儲100個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址

提供方法:
1.添加聯(lián)系人信息
2.刪除指定聯(lián)系人信息
3.查找指定聯(lián)系人信息
4.修改指定聯(lián)系人信息
5.顯示所有聯(lián)系人信息
6.清空所有聯(lián)系人
7.以名字/年齡/地址排序所有聯(lián)系人

2.初始化菜單

void  menu()
{
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********1.添加           2.刪除*************\n");
	printf("*********3.查找           4.修改*************\n");
	printf("*********5.顯示           6.排序*************\n");
	printf("*********7.退出           8.清空*************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
}

3.通訊錄存儲的信息

使用 typedef 將 struct peoinfo 類型自定義成 peoinfo 更加方邊后續(xù)使用。
利用宏定義設定各個參數(shù)的值,后續(xù)不需要再重新定義。

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100//最大人數(shù)
typedef struct peoinfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}peoinfo;
typedef struct contact
{
	peoinfo data[MAX];
	int sz;//記錄當前人的信息個數(shù)
}contact;

其中,創(chuàng)建存放聯(lián)系人的通訊錄Contact,存放MAX個聯(lián)系人對應的信息。sz用于記錄當前儲存聯(lián)系人的數(shù)量。

4.通訊錄基本框架

enum option
{
	add=1, 
	del=2,
	search=3,
	modify,
	show,
	sort,
	run,
	clc	
};
int main()
{
	int input = 0;
	contact 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 run:
			printf("退出通訊錄\n");
			break;
		case clc:
			clccontact(&con);
			break;
		default:
			printf("輸入非法,請重新輸入!\n");
			break;
		}
	} while (input != 7);
	return 0;
}

我們知道case后只能加整數(shù),為了更加直觀的看到每一種功能,我們可以創(chuàng)建枚舉類型替換這些整數(shù),枚舉類型成員的值從0開始遞增1,適用于代替case后的整數(shù),因為我么的菜單選項是從1到8,所以這里我們定義枚舉的第一個值為1,這樣后面就會默認排序到8。

通訊錄運行通過do-while實現(xiàn),內(nèi)部調(diào)用menu函數(shù)打印開始菜單,然后提示用戶選擇功能。

5.各個部分功能模塊聲明

void initcontact(contact* pc);
void addcontact(contact* pc);
void showcontact(contact* pc);
void delcontact(contact* pc);
void searchcontact(contact* pc);
void modifycontact(contact* pc);
void sortcontact(contact* pc);
void clccontact(contact* pc);

代碼的基本框架搭建完畢,我們就要實現(xiàn)每一個選項的功能。這里是定義每一個功能的頭文件,聲明后才能在別的原文件中使用。

6.初始化模塊

void initcontact(contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

給定的代碼是一個函數(shù)initcontact,它用于初始化一個名為contact的結(jié)構(gòu)體指針pc。以下是對代碼的分析:

①函數(shù)聲明:void initcontact(contact* pc)

聲明了一個名為initcontact的函數(shù),它接受一個結(jié)構(gòu)體指針pc作為參數(shù),并且沒有返回值(即返回類型為void)。

②斷言:assert(pc) 斷言確保pc指針不為空。如果pc為空,斷言將失敗,并導致程序終止。

③初始化:pc->sz = 0 將結(jié)構(gòu)體指針pc的成員變量sz的值設置為0。這意味著將sz用作計數(shù)器或存儲元素數(shù)量的變量。

④內(nèi)存清零:memset(pc->data, 0, sizeof(pc->data))

使用memset函數(shù)將結(jié)構(gòu)體指針pc的成員變量data的內(nèi)存塊清零。sizeof(pc->data)用于確定pc->data成員的大小,以確保清零操作覆蓋整個內(nèi)存塊。

⑤通過這些操作,函數(shù)initcontact將結(jié)構(gòu)體指針pc所指向的contact結(jié)構(gòu)體進行初始化。初始化的結(jié)果是將sz設置為0,并將data的內(nèi)存塊清零。

7.增加聯(lián)系人模塊

void addcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通訊錄已滿\n");
		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].tele);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("通訊錄已添加\n");
	Sleep(2000);
}

該代碼定義了一個名為addcontact的函數(shù),函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

①函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

②然后判斷通訊錄的當前大小是否達到了最大值(MAX),如果達到了最大值則打印提示信息并返回。

③如果通訊錄未滿,則依次輸入聯(lián)系人的姓名、年齡、性別、電話和地址,并將這些信息保存到通訊錄中。

④ 最后,將通訊錄的大小加1,并打印添加成功的提示信息。使用Sleep函數(shù)暫停程序執(zhí)行2秒后再彈出菜單繼續(xù)選擇。使使用者方便觀察。

8.顯示通訊錄模塊

void showcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空\n");
		return;
	}
	int i = 0;
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name,
								            pc->data[i].age,
			                                pc->data[i].sex,
			                                pc->data[i].tele,
			                                pc->data[i].addr);
	}
	Sleep(2000);
}

該代碼定義了一個名為showcontact的函數(shù),函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

①函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

②然后判斷通訊錄的大小是否為0,如果為0則打印提示信息并返回。

③接下來,使用一個循環(huán)遍歷通訊錄中的每個聯(lián)系人,并依次打印其姓名、年齡、性別、電話和地址。

④ 最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。

需要注意的是,該代碼依賴于一些未給出的頭文件和結(jié)構(gòu)體定義,例如contact結(jié)構(gòu)體的定義。另外,該代碼使用了格式化輸出函數(shù)printf,其中使用了%-10s、%-5d等格式控制符,用于設置輸出字段的寬度和對齊方式。

9.刪除用戶模塊

int findname(contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return 1;
		}
	}
	return -1;
}
void delcontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除\n");
		return;
	}
	printf("輸入要刪除人的名字:");
	scanf("%s", name);
	int ret = findname(pc,name);
	if (ret == -1)
	{
		printf("要刪除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret; i <pc->sz-1 ; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("刪除成功\n");
	Sleep(2000);
}

該代碼定義了兩個函數(shù):findname和delcontact。

findname函數(shù)用于在通訊錄中查找指定姓名的聯(lián)系人,函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc和一個字符數(shù)組name。

①函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

②然后使用一個循環(huán)遍歷通訊錄中的每個聯(lián)系人,通過strcmp函數(shù)比較聯(lián)系人的姓名是否與指定的name相等。如果相等,則返回1表示找到了該聯(lián)系人。

③如果遍歷完整個通訊錄都沒有找到匹配的姓名,則返回-1表示未找到。

④delcontact函數(shù)用于從通訊錄中刪除指定姓名的聯(lián)系人,函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

⑤函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

⑥然后判斷通訊錄的大小是否為0,如果為0則打印提示信息并返回。

⑦接下來,依次輸入要刪除的聯(lián)系人的姓名,并調(diào)用findname函數(shù)查找該聯(lián)系人是否存在。如果不存在,則打印提示信息并返回。

⑧如果存在,使用一個循環(huán)從找到的位置開始,將后面的聯(lián)系人逐個往前移動一位,實現(xiàn)刪除該聯(lián)系人的功能。

⑨最后,將通訊錄的大小減1,并打印刪除成功的提示信息。使用Sleep函數(shù)暫停程序執(zhí)行2秒。

10.查找用戶模塊

void searchcontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("請輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("查詢成功?。n");
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name,
		                                pc->data[ret].age,
		                                pc->data[ret].sex,
		                                pc->data[ret].tele,
		                                pc->data[ret].addr);
	Sleep(2000);
}

該代碼定義了一個名為searchcontact的函數(shù),函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

①函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

②然后輸入要查找的聯(lián)系人的姓名。

③接下來,調(diào)用findname函數(shù)查找該姓名的聯(lián)系人在通訊錄中的位置。如果返回值為-1,則打印提示信息并返回。

④如果返回值不為-1,表示找到了該聯(lián)系人,打印查詢成功的提示信息。

⑤然后,使用printf函數(shù)按照一定的格式打印該聯(lián)系人的姓名、年齡、性別、電話和地址。

⑥最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。

11.修改用戶信息模塊

void modifycontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("請輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("請輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入電話:");
	scanf("%s", pc->data[ret].tele);
	printf("請輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功!\n");
}

該代碼定義了一個名為modifycontact的函數(shù),函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

①函數(shù)首先使用assert函數(shù)進行斷言,確保指針pc不為空。

②然后輸入要修改的聯(lián)系人的姓名。

③接下來,調(diào)用findname函數(shù)查找該姓名的聯(lián)系人在通訊錄中的位置。如果返回值為-1,則打印提示信息并返回。

④如果返回值不為-1,表示找到了該聯(lián)系人,依次輸入要修改的聯(lián)系人的姓名、年齡、性別、電話和地址,并將這些信息更新到通訊錄中。

⑤最后,打印修改成功的提示信息。

12.排序用戶信息模塊

int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp_age(const void* p1, const void* p2)
{
	return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp_addr(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sortcontact(contact* pc)
{
	int i = 0;
	char sort_choose[10];
	char sort_choose1[] = "name";
	char sort_choose2[] = "age";
	char sort_choose3[] = "addr";
	A:
	printf("請輸入根據(jù)什么進行排序:");
	scanf("%s", sort_choose);
	if (strcmp(sort_choose,sort_choose1) == 0)
	{
		//利用qsort 函數(shù)
		qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	}
	else if (strcmp(sort_choose,sort_choose2) == 0)
	{
		qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age);
	}
	else if (strcmp(sort_choose,sort_choose3) == 0)
	{
		qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr);
	}
	else
	{
		printf("無此排序參數(shù),請重新輸入?yún)?shù)\n");
		goto A;
	}
	//打印列標題
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	//打印數(shù)據(jù)
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-5d%-5s%-12s%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
	Sleep(2000);
}

該代碼定義了三個比較函數(shù):cmp_name、cmp_age和cmp_addr。這些函數(shù)用于在排序通訊錄時比較聯(lián)系人信息的不同字段。

①cmp_name函數(shù)用于比較聯(lián)系人姓名的大小,函數(shù)參數(shù)為指向兩個聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過調(diào)用strcmp函數(shù)比較兩個聯(lián)系人的姓名,并返回比較結(jié)果。

② cmp_age函數(shù)用于比較聯(lián)系人年齡的大小,函數(shù)參數(shù)為指向兩個聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過將第一個聯(lián)系人的年齡減去第二個聯(lián)系人的年齡,并返回比較結(jié)果。

③cmp_addr函數(shù)用于比較聯(lián)系人地址的大小,函數(shù)參數(shù)為指向兩個聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過調(diào)用strcmp函數(shù)比較兩個聯(lián)系人的地址,并返回比較結(jié)果。

④sortcontact函數(shù)用于對通訊錄中的聯(lián)系人進行排序,函數(shù)參數(shù)為一個指向contact結(jié)構(gòu)體的指針pc。

⑤函數(shù)首先定義一些變量和字符串數(shù)組用于接收用戶輸入的排序參數(shù)。

⑥然后,通過標簽A實現(xiàn)一個循環(huán),提示用戶輸入根據(jù)什么進行排序。根據(jù)用戶的輸入,分別調(diào)用qsort函數(shù)進行排序。排序時,根據(jù)用戶的選擇調(diào)用不同的比較函數(shù)。

⑦如果用戶輸入的排序參數(shù)無效,則打印提示信息并跳轉(zhuǎn)回標簽A,要求用戶重新輸入。

⑧排序完成后,先打印列標題,然后依次打印排序后的聯(lián)系人信息。

⑨最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。

13.清除模塊

void clccontact(contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
	printf("通訊錄已經(jīng)清空?。?!\n");
	Sleep(2000);
}

此代碼實現(xiàn)了一個清空通訊錄的函數(shù)。(即和初始化模塊一樣)函數(shù)接收一個指向聯(lián)系人結(jié)構(gòu)體的指針,將通訊錄結(jié)構(gòu)體中的數(shù)據(jù)清空,包括sz(通訊錄中已有聯(lián)系人數(shù)量)和data(存放聯(lián)系人信息的數(shù)組)。最后輸出提示信息“通訊錄已經(jīng)清空?。。?rdquo;并延時2秒。

此代碼的功能比較簡單,只是清空通訊錄??梢宰鳛橥ㄓ嶄浌芾硐到y(tǒng)的一個基本操作函數(shù)之一。

14.完整源代碼

test.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "adressbook.h"
void  menu()
{
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********1.添加           2.刪除*************\n");
	printf("*********3.查找           4.修改*************\n");
	printf("*********5.顯示           6.排序*************\n");
	printf("*********7.退出           8.清空*************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
	printf("*********************************************\n");
}
enum option
{
	add=1, 
	del=2,
	search=3,
	modify,
	show,
	sort,
	run,
	clc	
};
int main()
{
	int input = 0;
	contact 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 run:
			printf("退出通訊錄\n");
			break;
		case clc:
			clccontact(&con);
			break;
		default:
			printf("輸入非法,請重新輸入!\n");
			break;
		}
	} while (input != 7);
	return 0;
}

addressbook.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include "adressbook.h"
void initcontact(contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void addcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通訊錄已滿\n");
		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].tele);
	printf("請輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("通訊錄已添加\n");
	Sleep(2000);
}
void showcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空\n");
		return;
	}
	int i = 0;
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name,
								            pc->data[i].age,
			                                pc->data[i].sex,
			                                pc->data[i].tele,
			                                pc->data[i].addr);
	}
	Sleep(2000);
}
int findname(contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return 1;
		}
	}
	return -1;
}
void delcontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空,無法刪除\n");
		return;
	}
	printf("輸入要刪除人的名字:");
	scanf("%s", name);
	int ret = findname(pc,name);
	if (ret == -1)
	{
		printf("要刪除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret; i <pc->sz-1 ; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("刪除成功\n");
	Sleep(2000);
}
void searchcontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("請輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("查詢成功??!\n");
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name,
		                                pc->data[ret].age,
		                                pc->data[ret].sex,
		                                pc->data[ret].tele,
		                                pc->data[ret].addr);
	Sleep(2000);
}
void modifycontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("請輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("請輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請輸入電話:");
	scanf("%s", pc->data[ret].tele);
	printf("請輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功!\n");
}
int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp_age(const void* p1, const void* p2)
{
	return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp_addr(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sortcontact(contact* pc)
{
	int i = 0;
	char sort_choose[10];
	char sort_choose1[] = "name";
	char sort_choose2[] = "age";
	char sort_choose3[] = "addr";
	A:
	printf("請輸入根據(jù)什么進行排序:");
	scanf("%s", sort_choose);
	if (strcmp(sort_choose,sort_choose1) == 0)
	{
		//利用qsort 函數(shù)
		qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	}
	else if (strcmp(sort_choose,sort_choose2) == 0)
	{
		qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age);
	}
	else if (strcmp(sort_choose,sort_choose3) == 0)
	{
		qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr);
	}
	else
	{
		printf("無此排序參數(shù),請重新輸入?yún)?shù)\n");
		goto A;
	}
	//打印列標題
	printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址");
	//打印數(shù)據(jù)
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-5d%-5s%-12s%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
	Sleep(2000);
}
void clccontact(contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
	printf("通訊錄已經(jīng)清空!?。n");
	Sleep(2000);
}

addressbook.h如下:

#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <Windows.h>
typedef struct peoinfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}peoinfo;
typedef struct contact
{
	peoinfo data[MAX];
	int sz;//記錄當前人的信息個數(shù)
}contact;
void initcontact(contact* pc);
void addcontact(contact* pc);
void showcontact(contact* pc);
void delcontact(contact* pc);
void searchcontact(contact* pc);
void modifycontact(contact* pc);
void sortcontact(contact* pc);
void clccontact(contact* pc);

大家只需要將此代碼,按照文章開頭設置為三部分,點擊運行即可。

到此這篇關(guān)于C語言實現(xiàn)通訊錄的八種功能(添加、刪除、查找、修改、顯示、排序、退出、清空)的文章就介紹到這了,更多相關(guān)C語言 通訊錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)十大排序算法及排序算法常見問題

    C++實現(xiàn)十大排序算法及排序算法常見問題

    法是程序的靈魂,無論學習什么語言,做什么工程項目,都要考慮算法的效率實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)十大排序算法及排序算法常見問題的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 詳解如何使用C++寫一個線程安全的單例模式

    詳解如何使用C++寫一個線程安全的單例模式

    這篇文章主要為大家詳細介紹了如何使用C++寫一個線程安全的單例模式,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2022-10-10
  • C語言 main 函數(shù)詳情

    C語言 main 函數(shù)詳情

    這篇文章主要介紹C語言 main 函數(shù),文章將圍繞C語言 main 函數(shù)相關(guān)資料詳細展開,需要的朋友可以參考一下
    2021-10-10
  • Opencv實現(xiàn)綠幕視頻背景替換功能

    Opencv實現(xiàn)綠幕視頻背景替換功能

    這篇文章主要為大家詳細介紹了Opencv實現(xiàn)綠幕視頻背景替換功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++迭代器iterator詳解

    C++迭代器iterator詳解

    這篇文章主要為大家詳細介紹了C++迭代器模式Iterator,具有一定的參考價值,感興趣的小伙伴們可以參考一下希望能給你帶來幫助
    2021-08-08
  • C++模擬實現(xiàn)string的方法詳解

    C++模擬實現(xiàn)string的方法詳解

    標準庫類型string表示可變長的字符序列,使用string類型必須首先包含string的頭文件。本文將利用C++模擬實現(xiàn)string,需要的可以參考一下
    2022-11-11
  • C++實現(xiàn)LeetCode(200.島嶼的數(shù)量)

    C++實現(xiàn)LeetCode(200.島嶼的數(shù)量)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(200.島嶼的數(shù)量),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C語言結(jié)構(gòu)體中的函數(shù)指針

    詳解C語言結(jié)構(gòu)體中的函數(shù)指針

    這篇文章主要介紹了詳解C語言結(jié)構(gòu)體中的函數(shù)指針,文中對函數(shù)指針的基本概念也有講解,需要的朋友可以參考下
    2016-04-04
  • c++ 頭文件<cwchar>中常見函數(shù)的實現(xiàn)代碼

    c++ 頭文件<cwchar>中常見函數(shù)的實現(xiàn)代碼

    本文記錄了c++ 頭文件<cwchar>中常見函數(shù)的實現(xiàn),本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • C++ 實現(xiàn)進程池:主從架構(gòu)、管道通信與任務調(diào)度(示例詳解)

    C++ 實現(xiàn)進程池:主從架構(gòu)、管道通信與任務調(diào)度(示例詳解)

    從進程池架構(gòu)中,主進程負責任務分配與管理,子進程專注于任務處理,二者通過管道通信實現(xiàn)高效穩(wěn)定的任務執(zhí)行機制,本文詳細解析了進程池的創(chuàng)建、任務調(diào)度及退出流程,并強調(diào)了關(guān)閉歷史遺留文件描述符的重要性,感興趣的朋友一起看看吧
    2026-06-06

最新評論

保靖县| 哈密市| 西峡县| 门头沟区| 蕉岭县| 牡丹江市| 临海市| 孙吴县| 苏尼特左旗| 中牟县| 五莲县| 汤原县| 玉屏| 常熟市| 塔河县| 法库县| 大厂| 固安县| 延长县| 偃师市| 灵丘县| 喜德县| 安庆市| 新源县| 吴忠市| 大姚县| 蓝田县| 濮阳市| 连江县| 哈密市| 龙南县| 碌曲县| 香格里拉县| 中卫市| 漠河县| 加查县| 东港市| 长沙县| 金湖县| 云浮市| 昆明市|