欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

通訊錄功能概要及前提說(shuō)明

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

在這里插入圖片描述

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

1.通信錄具體功能

通訊錄可以用來(lái)存儲(chǔ)100個(gè)人的信息,每個(gè)人的信息包括:姓名、性別、年齡、電話、住址

提供方法:
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.通訊錄存儲(chǔ)的信息

使用 typedef 將 struct peoinfo 類型自定義成 peoinfo 更加方邊后續(xù)使用。
利用宏定義設(shè)定各個(gè)參數(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;//記錄當(dāng)前人的信息個(gè)數(shù)
}contact;

其中,創(chuàng)建存放聯(lián)系人的通訊錄Contact,存放MAX個(gè)聯(lián)系人對(duì)應(yīng)的信息。sz用于記錄當(dāng)前儲(chǔ)存聯(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("請(qǐng)輸入功能:");
		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("輸入非法,請(qǐng)重新輸入!\n");
			break;
		}
	} while (input != 7);
	return 0;
}

我們知道case后只能加整數(shù),為了更加直觀的看到每一種功能,我們可以創(chuàng)建枚舉類型替換這些整數(shù),枚舉類型成員的值從0開(kāi)始遞增1,適用于代替case后的整數(shù),因?yàn)槲颐吹牟藛芜x項(xiàng)是從1到8,所以這里我們定義枚舉的第一個(gè)值為1,這樣后面就會(huì)默認(rèn)排序到8。

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

5.各個(gè)部分功能模塊聲明

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

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

6.初始化模塊

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

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

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

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

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

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

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

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

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

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

void addcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通訊錄已滿\n");
		return;
	}
	//增加信息
	printf("請(qǐng)輸入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請(qǐng)輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請(qǐng)輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請(qǐng)輸入電話:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("請(qǐng)輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("通訊錄已添加\n");
	Sleep(2000);
}

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

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

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

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

④ 最后,將通訊錄的大小加1,并打印添加成功的提示信息。使用Sleep函數(shù)暫停程序執(zhí)行2秒后再?gòu)棾霾藛卫^續(xù)選擇。使使用者方便觀察。

8.顯示通訊錄模塊

void showcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空\(chéng)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);
}

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

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

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

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

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

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

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("通訊錄為空,無(wú)法刪除\n");
		return;
	}
	printf("輸入要?jiǎng)h除人的名字:");
	scanf("%s", name);
	int ret = findname(pc,name);
	if (ret == -1)
	{
		printf("要?jiǎng)h除的人不存在\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);
}

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

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

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

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

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

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

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

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

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

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

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

10.查找用戶模塊

void searchcontact(contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("請(qǐng)輸入要查找人的姓名:");
	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);
}

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

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

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

③接下來(lái),調(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("請(qǐng)輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("請(qǐng)輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請(qǐng)輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請(qǐng)輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請(qǐng)輸入電話:");
	scanf("%s", pc->data[ret].tele);
	printf("請(qǐng)輸入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功!\n");
}

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

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

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

③接下來(lái),調(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("請(qǐng)輸入根據(jù)什么進(jìn)行排序:");
	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("無(wú)此排序參數(shù),請(qǐng)重新輸入?yún)?shù)\n");
		goto A;
	}
	//打印列標(biāo)題
	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);
}

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

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

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

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

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

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

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

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

⑧排序完成后,先打印列標(biāo)題,然后依次打印排序后的聯(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);
}

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

此代碼的功能比較簡(jiǎn)單,只是清空通訊錄??梢宰鳛橥ㄓ嶄浌芾硐到y(tǒng)的一個(gè)基本操作函數(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("請(qǐng)輸入功能:");
		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("輸入非法,請(qǐng)重新輸入!\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("請(qǐng)輸入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("請(qǐng)輸入年齡:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請(qǐng)輸入性別:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請(qǐng)輸入電話:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("請(qǐng)輸入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("通訊錄已添加\n");
	Sleep(2000);
}
void showcontact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通訊錄為空\(chéng)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("通訊錄為空,無(wú)法刪除\n");
		return;
	}
	printf("輸入要?jiǎng)h除人的名字:");
	scanf("%s", name);
	int ret = findname(pc,name);
	if (ret == -1)
	{
		printf("要?jiǎng)h除的人不存在\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("請(qǐng)輸入要查找人的姓名:");
	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("請(qǐng)輸入要查找人的姓名:");
	scanf("%s", name);
	int ret = findname(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("請(qǐng)輸入名字:");
	scanf("%s", pc->data[ret].name);
	printf("請(qǐng)輸入年齡:");
	scanf("%d", &(pc->data[ret].age));
	printf("請(qǐng)輸入性別:");
	scanf("%s", pc->data[ret].sex);
	printf("請(qǐng)輸入電話:");
	scanf("%s", pc->data[ret].tele);
	printf("請(qǐng)輸入地址:");
	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("請(qǐng)輸入根據(jù)什么進(jìn)行排序:");
	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("無(wú)此排序參數(shù),請(qǐng)重新輸入?yún)?shù)\n");
		goto A;
	}
	//打印列標(biāo)題
	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;//記錄當(dāng)前人的信息個(gè)數(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);

大家只需要將此代碼,按照文章開(kāi)頭設(shè)置為三部分,點(diǎn)擊運(yùn)行即可。

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

相關(guān)文章

  • Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置

    Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置

    這篇文章主要為大家介紹了Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 為什么獲取環(huán)境變量getenv小心有坑

    為什么獲取環(huán)境變量getenv小心有坑

    這篇文章主要介紹了獲取環(huán)境變量getenv小心有坑問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C語(yǔ)言與C++中const的用法對(duì)比

    C語(yǔ)言與C++中const的用法對(duì)比

    C語(yǔ)言中的const與C++有很大的不同,在C語(yǔ)言中用const修飾的變量仍是一個(gè)變量,表示這個(gè)變量是只讀的,不可顯示地更改,而在C++中用const修飾過(guò)后,就變成常量了
    2022-04-04
  • C/C++實(shí)現(xiàn)線性順序表的示例代碼

    C/C++實(shí)現(xiàn)線性順序表的示例代碼

    使用順序存儲(chǔ)結(jié)構(gòu)的線性存儲(chǔ)結(jié)構(gòu)的表為線性順序表。本文將分別利用C語(yǔ)言和C++實(shí)現(xiàn)線性順序表,文中示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • VS2019+Opencv4.0+Win10配置詳解

    VS2019+Opencv4.0+Win10配置詳解

    這篇文章主要介紹了VS2019+Opencv4.0+Win10配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言鏈表實(shí)現(xiàn)貪吃蛇小游戲

    C語(yǔ)言鏈表實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++中友元類和嵌套類使用詳解

    C++中友元類和嵌套類使用詳解

    友元是一種允許非類成員函數(shù)訪問(wèn)類的非公有成員的一種機(jī)制??梢园岩粋€(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元,所謂嵌套類,就是在類中聲明的類。如下代碼中,類Inner就是一個(gè)嵌套類,類Outer是外圍類
    2022-08-08
  • 深度理解C語(yǔ)言中的關(guān)鍵字static

    深度理解C語(yǔ)言中的關(guān)鍵字static

    在C語(yǔ)言中static主要定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中關(guān)鍵字static的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言數(shù)獨(dú)游戲的求解方法

    C語(yǔ)言數(shù)獨(dú)游戲的求解方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)獨(dú)游戲的求解方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++ 自增、自減運(yùn)算符的重載和性能分析小結(jié)

    C++ 自增、自減運(yùn)算符的重載和性能分析小結(jié)

    這篇文章主要介紹了C++ 自增、自減運(yùn)算符的重載和性能分析小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論