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

基于C語言打造高效便捷的通訊錄管理系統(tǒng)

 更新時(shí)間:2024年02月18日 10:34:01   作者:Betty’sSweet  
這篇文章主要為大家詳細(xì)介紹了如何基于C語言打造高效便捷的通訊錄管理系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

引言

在我們大致學(xué)習(xí)完C語言之后,我們就可以利用目前所學(xué)的知識(shí)去做一些有意思的項(xiàng)目,而今天貝蒂就帶大家完成一個(gè)通訊錄的簡易實(shí)現(xiàn),

本章你可能需要的知識(shí):

動(dòng)態(tài)內(nèi)存的使用:動(dòng)態(tài)內(nèi)存管理

文件的創(chuàng)建與使用:文件操作

1. 通訊錄要求

通訊錄包括每個(gè)人的姓名,性別,年齡,電話與地址。

玩家可以自由選擇通訊錄的進(jìn)出。

玩家可以自由增刪查改通訊錄中的數(shù)據(jù)。

2. 多文件管理

為了方便代碼的管理和保證通訊錄實(shí)現(xiàn)邏輯的清晰性,我們將采用多文件管理的模式。

創(chuàng)建頭文件contact.c,包含所有頭文件(其他源文件只需引用它即可),以及所有通訊錄功能的展現(xiàn)。

創(chuàng)建源文件contact.c,負(fù)責(zé)通訊錄所有功能的具體代碼實(shí)現(xiàn)。

創(chuàng)建源文件text.c,負(fù)責(zé)展現(xiàn)通訊錄實(shí)現(xiàn)的總體邏輯。

3. 通訊錄的準(zhǔn)備

3.1 預(yù)處理信息

為了方便我們后續(xù)更換通訊的信息,我們可以利用來定義通訊錄的具體信息的大小。

#define MAX 100//最大人數(shù)
#define MAX_NAME 20//名字最大長度
#define MAX_SEX 5//性別最大長度
#define MAX_TELE 12//電話最大長度
#define MAX_ADDR 30//地址最大長度

3.2 結(jié)構(gòu)體定義

每個(gè)人的通訊錄都要包含姓名,性別,年齡,電話與地址等信息,這時(shí)就需要我們創(chuàng)建一個(gè)結(jié)構(gòu)體來方便管理。

typedef struct PeoInfo
{
	char name[MAX_NAME];//名字
	int age;//年齡
	char sex[MAX_SEX];//性別
	char tele[MAX_TELE];//電話
	char addr[MAX_ADDR];//地址
}PeoInfo;

而我們需要用這個(gè)結(jié)構(gòu)體創(chuàng)建一個(gè)大小為100的數(shù)組,并且我們還需要知道當(dāng)前通訊錄的大小才能進(jìn)行增刪查改的操作,這兩者息息相關(guān),為了簡化代碼和增加代碼的可讀性,我們可以將這兩者重新定義一個(gè)結(jié)構(gòu)體。

typedef struct contact
{
	PeoInfo data[MAX];//一百個(gè)人的數(shù)據(jù)
	int sz;//通訊錄的大小
}contact;

4. 簡易菜單

void menu()
{
    printf("***********************************\n");
    printf("**    1.add          2.delete    **\n");
    printf("**    3.search       4.modify    **\n");
    printf("**    5.display      6.sort      **\n");
    printf("**             0.exit            **\n");
    printf("***********************************\n");
}

畫面展示:

5. 通訊錄具體功能

5.1 初始化

我們首先對(duì)通訊錄進(jìn)行初始化。

void InitContact(contact* pc)//初始化
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

5.2 展示聯(lián)系人

當(dāng)用戶選擇5時(shí)自動(dòng)展示通訊錄中的用戶,并且展示用戶過程中需要進(jìn)行對(duì)齊,便于用戶觀看。

void DisplayContact(contact* pc)//打印信息
{
	assert(pc);
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年紀(jì)",
		"性別", "電話", "地址");//默認(rèn)右對(duì)齊,修改為左對(duì)齊
	//中間也要留下足夠的空間
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

5.3 添加聯(lián)系人

用戶選擇1可以自由添加聯(lián)系人,如果通訊錄已滿,則提醒用戶通訊錄已滿,請(qǐng)先清理通訊錄。

(1) 檢查通訊錄是否已滿

如果通訊錄滿了返回0,未滿則返回1。

int CheckContact(contact*pc)//檢查大小
{
	assert(pc);
	if (pc->sz == 100)
	{
		return 0;
	}
	return 1;
}

(2) 添加

當(dāng)通訊錄未滿時(shí),用戶可以輸入數(shù)據(jù)添加新用戶。

void AddContact(contact* pc)//增加聯(lián)系人
{
	assert(pc);
	int ret = CheckContact(pc);//檢查是否滿了
	if (ret == 0)
	{
		printf("通訊錄已滿,請(qǐng)先清理通訊錄??!\n");
		return;
	}
	printf("請(qǐng)輸入聯(lián)系人的姓名:> ");
	scanf("%s", pc->data[pc->sz].name);
	printf("請(qǐng)輸入聯(lián)系人的年齡:> ");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請(qǐng)輸入聯(lián)系人的性別:> ");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請(qǐng)輸入聯(lián)系人的電話:> ");
	scanf("%s", pc->data[pc->sz].tele);
	printf("請(qǐng)輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pc->sz].addr);
	printf("用戶添加成功!\n");
	pc->sz++;
}

5.4 刪除聯(lián)系人

用戶可以選擇2清理通訊錄,刪除指定聯(lián)系人。

(1) 尋找下標(biāo)

在刪除指定練習(xí)人時(shí)我們需通過其姓名尋找該聯(lián)系人的下標(biāo)。找到返回其下標(biāo),否則返回-1、

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

(2) 刪除

通過尋找到的下標(biāo),我們可以利用后面的數(shù)據(jù)依次覆蓋來達(dá)到刪除的目的。

注意:我們不能覆蓋最后一個(gè)數(shù)據(jù)否則就會(huì)發(fā)生數(shù)組越界,這時(shí)我們只需減去通訊錄此時(shí)的大小就好了。

void DeleteContact(contact* pc)//刪除聯(lián)系人
{
	assert(pc);
         assert(pc->sz >= 0);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要?jiǎng)h除人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	for (int i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];//覆蓋
	}
    	printf("刪除成功\n");
	pc->sz--;
}

刪除前:

刪除后 :

5.5 查找聯(lián)系人

通過選擇3查找指定聯(lián)系人,沒有找到則提醒用戶沒有該用戶,查找到就打印其信息。

void SearchContact(contact* pc)//查找聯(lián)系人
{
	assert(pc);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要查找人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年紀(jì)",
		"性別", "電話", "地址");
	printf("%-15s\t%-5d\t%-5s\t%-12s\t%-30s", pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
}

5.6 修改聯(lián)系人

我們可以通過選擇4修改指定聯(lián)系人的信息。

void ModifyContact(contact* pc)//修改聯(lián)系人
{
	assert(pc);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要修改人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	printf("請(qǐng)輸入聯(lián)系人的姓名:> ");
	scanf("%s", pc->data[pos].name);
	printf("請(qǐng)輸入聯(lián)系人的年齡:> ");
	scanf("%d", &(pc->data[pos].age));
	printf("請(qǐng)輸入聯(lián)系人的性別:> ");
	scanf("%s", pc->data[pos].sex);
	printf("請(qǐng)輸入聯(lián)系人的電話:> ");
	scanf("%s", pc->data[pos].tele);
	printf("請(qǐng)輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}

修改前:

修改后:

5.7 排序聯(lián)系人

我們可以選擇6對(duì)通訊錄進(jìn)行排序,可以按照姓名,年紀(jì),性別,電話,地址排序。

int cmp1(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{
	return ((PeoInfo*)p1)->age- ((PeoInfo*)p2)->age;
}
int cmp3(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->sex, ((PeoInfo*)p2)->sex);
}
int cmp4(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->tele, ((PeoInfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->addr, ((PeoInfo*)p2)->addr);
}
void SortByName(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp1);
}
void SortByAge(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp2);
}
void SortBySex(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp3);
}
void SortByTele(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp4);
}
void SortByAddr(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp4);
}
void SortContact(contact* pc)//排序聯(lián)系人
{
	assert(pc);
	printf("請(qǐng)選擇如何排序:> ");
	char input[20];
	scanf("%s", input);
	if (strcmp(input, "姓名")==0)
	{
		SortByName(pc);//按姓名排序
	}
	else if (strcmp(input, "年齡") == 0)
	{
		SortByAge(pc);//按年齡排序
	}
	else if (strcmp(input, "性別") == 0)
	{
		SortBySex(pc);//按性別排序
	}
	else if (strcmp(input, "電話") == 0)
	{
		SortByTele(pc);//按電話排序
	}
	else if (strcmp(input, "地址") == 0)
	{
		SortByAddr(pc);//按地址排序
	}
	else
	{
		printf("輸入非法,請(qǐng)重新輸入\n");
	}
}

6. 改進(jìn)通訊錄

6.1 動(dòng)態(tài)內(nèi)存開辟

上述通訊錄有一個(gè)致命的缺點(diǎn)——通訊錄大小固定,為了解決這個(gè)問題我可以使用我們前面學(xué)過的動(dòng)態(tài)內(nèi)存開辟

(1) 新增變量

為了方便我們知道此時(shí)的容量大小,我們將在結(jié)構(gòu)體中加入新的變量。

typedef struct contact
{
	PeoInfo *data;//動(dòng)態(tài)開辟的數(shù)據(jù)
	int sz;//通訊錄的大小
	int capacity;//通訊錄的容量
}contact;

(2) 初始化

void InitContact(contact* pc)//初始化
{
	assert(pc);
	pc->sz = 0;
	pc->data = (PeoInfo*)calloc(2, sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact:");
		return;
	}
	pc->capacity = 2;
	/*memset(pc->data, 0, sizeof(pc->data));*/
}

(3) 增容

當(dāng)通訊錄用戶數(shù)量滿時(shí)增加內(nèi)存空間。

void CheckCapacity(contact* pc)//增容
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc->data = tmp;
		}
		else
		{
			perror("CheckCapacity:");
			return;
		}
		pc->capacity += 2;
		printf("增容成功\n");
	}
}

6.2 文件保存

我們發(fā)現(xiàn)每當(dāng)我們關(guān)閉程序時(shí)我們寫入的數(shù)據(jù)會(huì)被清空,我們要想保存上次寫入的數(shù)據(jù)就應(yīng)該使用文件操作。

(1) 加載數(shù)據(jù)

每次初始化時(shí)就要將上次文件的數(shù)據(jù)導(dǎo)入進(jìn)來。

void LoadContact(contact* pc)//加載上次數(shù)據(jù)
{
	PeoInfo tmp = { 0 };
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		return;
	}
	//讀取文件,存放到通訊錄
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	//返回值為0就是遇見文件末尾
	{
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	fclose(pf);
	pf = NULL;
}

(2) 保存數(shù)據(jù)

當(dāng)程序正常結(jié)束時(shí)保存數(shù)據(jù)。

void SaveContact(contact* pc)//保存數(shù)據(jù)
{
	FILE* pfWrite = fopen("contact.txt", "wb");
	if (pfWrite == NULL)
	{
		perror("fopen:");
		return;
	}
	//寫通訊錄中數(shù)據(jù)到文件中
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pfWrite);
	}
	fclose(pfWrite);
	pfWrite = NULL;
	printf("保存成功\n");

}

7. 通訊錄邏輯的搭建

用戶通過數(shù)字選擇功能。

每次選擇完之后返回菜單。

選擇退出之后保存數(shù)據(jù),程序結(jié)束。

enum Option
	//利用枚舉增加代碼的可讀性
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	SORT
};
void test()
{
	int input = 0;
	contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("請(qǐng)輸入你的選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DeleteContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case DISPLAY:
			DisplayContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			SaveContact(&con);//退出保存數(shù)據(jù)
		    DestroyContact(&con);
			break;
		default:
			printf("非法輸入,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

8. 完整代碼

8.1 contact.h

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_NAME 20//名字最大長度
#define MAX_SEX 5//性別最大長度
#define MAX_TELE 12//電話最大長度
#define MAX_ADDR 30//地址最大長度
typedef struct PeoInfo
{
	char name[MAX_NAME];//名字
	int age;//年齡
	char sex[MAX_SEX];//性別
	char tele[MAX_TELE];//電話
	char addr[MAX_ADDR];//地址
}PeoInfo;
typedef struct contact
{
	PeoInfo *data;//動(dòng)態(tài)開辟的數(shù)據(jù)
	int sz;//通訊錄的大小
	int capacity;//通訊錄的容量
}contact;
void InitContact(contact* pc);//初始化
void DisplayContact(contact* pc);//打印信息
void AddContact(contact* pc);//增加聯(lián)系人
void DeleteContact(contact* pc);//刪除聯(lián)系人
void SearchContact(contact* pc);//查找聯(lián)系人
void ModifyContact(contact* pc);//修改聯(lián)系人
void SortContact(contact* pc);//排序聯(lián)系人
void SaveContact(contact* pc);//保存數(shù)據(jù)
void DestroyContact(contact* pc);//銷毀內(nèi)存

8.2 contact.c

#include"contact.h"
void CheckCapacity(contact* pc)//增容
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* tmp = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc->data = tmp;
		}
		else
		{
			perror("CheckCapacity:");
			return;
		}
		pc->capacity += 2;
		printf("增容成功\n");
	}
}
void LoadContact(contact* pc)//加載上次數(shù)據(jù)
{
	PeoInfo tmp = { 0 };
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		return;
	}
	//讀取文件,存放到通訊錄
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	//返回值為0就是遇見文件末尾
	{
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	fclose(pf);
	pf = NULL;
}

void InitContact(contact* pc)//初始化
{
	assert(pc);
	pc->sz = 0;
	pc->data = (PeoInfo*)calloc(2, sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact:");
		return;
	}
	pc->capacity = 2;
	LoadContact(pc);
	/*memset(pc->data, 0, sizeof(pc->data));*/
}
void DisplayContact(contact* pc)//打印信息
{
	assert(pc);
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年紀(jì)",
		"性別", "電話", "地址");//默認(rèn)右對(duì)齊,修改為左對(duì)齊
	//中間也要留下足夠的空間
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-15s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

void AddContact(contact* pc)//增加聯(lián)系人
{
	assert(pc);
	CheckCapacity(pc);//檢查是否滿了
	printf("請(qǐng)輸入聯(lián)系人的姓名:> ");
	scanf("%s", pc->data[pc->sz].name);
	printf("請(qǐng)輸入聯(lián)系人的年齡:> ");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("請(qǐng)輸入聯(lián)系人的性別:> ");
	scanf("%s", pc->data[pc->sz].sex);
	printf("請(qǐng)輸入聯(lián)系人的電話:> ");
	scanf("%s", pc->data[pc->sz].tele);
	printf("請(qǐng)輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pc->sz].addr);
	printf("用戶添加成功!\n");
	pc->sz++;
}
int FindName(contact* pc, char name[])
{
	assert(pc&&name);
	for (int pos = 0; pos < pc->sz; pos++)
	{
		if (strcmp(pc->data[pos].name, name) == 0)
		{
			return pos;
		}
	}
	return -1;
}
void DeleteContact(contact* pc)//刪除聯(lián)系人
{
	assert(pc);
	assert(pc->sz >= 0);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要?jiǎng)h除人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	for (int i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];//覆蓋
	}
	printf("刪除成功\n");
	pc->sz--;
}
void SearchContact(contact* pc)//查找聯(lián)系人
{
	assert(pc);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要查找人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年紀(jì)",
		"性別", "電話", "地址");
	printf("%-15s\t%-5d\t%-5s\t%-12s\t%-30s", pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
}
void ModifyContact(contact* pc)//修改聯(lián)系人
{
	assert(pc);
	char name[MAX_NAME];
	printf("請(qǐng)輸入需要修改人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個(gè)人!!\n");
		return;
	}
	printf("請(qǐng)輸入聯(lián)系人的姓名:> ");
	scanf("%s", pc->data[pos].name);
	printf("請(qǐng)輸入聯(lián)系人的年齡:> ");
	scanf("%d", &(pc->data[pos].age));
	printf("請(qǐng)輸入聯(lián)系人的性別:> ");
	scanf("%s", pc->data[pos].sex);
	printf("請(qǐng)輸入聯(lián)系人的電話:> ");
	scanf("%s", pc->data[pos].tele);
	printf("請(qǐng)輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}
int cmp1(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{
	return ((PeoInfo*)p1)->age- ((PeoInfo*)p2)->age;
}
int cmp3(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->sex, ((PeoInfo*)p2)->sex);
}
int cmp4(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->tele, ((PeoInfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->addr, ((PeoInfo*)p2)->addr);
}
void SortByName(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp1);
}
void SortByAge(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp2);
}
void SortBySex(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp3);
}
void SortByTele(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp4);
}
void SortByAddr(contact* pc)
{
	qsort(pc, pc->sz, sizeof(PeoInfo), cmp4);
}
void SortContact(contact* pc)//排序聯(lián)系人
{
	assert(pc);
	printf("請(qǐng)選擇如何排序:> ");
	char input[20] = { 0 };
	scanf("%s", input);
	if (strcmp(input, "姓名")==0)
	{
		SortByName(pc);//按姓名排序
	}
	else if (strcmp(input, "年齡") == 0)
	{
		SortByAge(pc);//按年齡排序
	}
	else if (strcmp(input, "性別") == 0)
	{
		SortBySex(pc);//按性別排序
	}
	else if (strcmp(input, "電話") == 0)
	{
		SortByTele(pc);//按電話排序
	}
	else if (strcmp(input, "地址") == 0)
	{
		SortByAddr(pc);//按地址排序
	}
	else
	{
		printf("輸入非法,請(qǐng)重新輸入\n");
	}
}
void DestroyContact(contact* pc)
{
	free(pc->data);
	pc->data= NULL;
	pc->capacity = 0;
	pc->sz = 0;
	printf("銷毀成功\n");
}
void SaveContact(contact* pc)//保存數(shù)據(jù)
{
	FILE* pfWrite = fopen("contact.txt", "wb");
	if (pfWrite == NULL)
	{
		perror("fopen:");
		return;
	}
	//寫通訊錄中數(shù)據(jù)到文件中
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pfWrite);
	}
	fclose(pfWrite);
	pfWrite = NULL;
	printf("保存成功\n");

}

8.3 text.c

#include"contact.h"

enum Option
	//利用枚舉增加代碼的可讀性
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	SORT
};

void menu()
{
    printf("***********************************\n");
    printf("**    1.add          2.delete    **\n");
    printf("**    3.search       4.modify    **\n");
    printf("**    5.display      6.sort      **\n");
    printf("**             0.exit            **\n");
    printf("***********************************\n");
}
void test()
{
	int input = 0;
	contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("請(qǐng)輸入你的選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DeleteContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case DISPLAY:
			DisplayContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			SaveContact(&con);//退出保存數(shù)據(jù)
		    DestroyContact(&con);
			break;
		default:
			printf("非法輸入,請(qǐng)重新輸入\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

以上就是基于C語言打造高效便捷的通訊錄管理系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于C語言通訊錄管理系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入解析C++中派生類的構(gòu)造函數(shù)

    深入解析C++中派生類的構(gòu)造函數(shù)

    這篇文章主要介紹了深入解析C++中派生類的構(gòu)造函數(shù),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例

    C語言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例

    C語言標(biāo)準(zhǔn)庫中的<ctype.h>和<string.h>頭文件分別提供了豐富的字符處理和字符串處理函數(shù),本文就來介紹一下C語言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-11-11
  • C語言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    C語言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過加減乘除以及括號(hào)運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下
    2022-08-08
  • 在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫圖文教程

    在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫圖文教程

    這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫圖文教程,本文詳細(xì)講解了DLL庫的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下
    2014-09-09
  • C++作用域與函數(shù)重載的實(shí)現(xiàn)

    C++作用域與函數(shù)重載的實(shí)現(xiàn)

    本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • java string對(duì)象上的操作,常見的用法你知道嗎

    java string對(duì)象上的操作,常見的用法你知道嗎

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-08-08
  • C++?DLL注入工具(完整源碼)

    C++?DLL注入工具(完整源碼)

    這篇文章主要介紹了C++?DLL注入工具的相關(guān)資料,并向大家分享了完整的源碼,具有一定的參考價(jià)值,希望對(duì)正在工作或?qū)W習(xí)的你有所幫助
    2022-02-02
  • C語言實(shí)例梳理講解常用關(guān)鍵字的用法

    C語言實(shí)例梳理講解常用關(guān)鍵字的用法

    關(guān)鍵字是C語言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語言,同時(shí)C語言的關(guān)鍵字也是面試筆試中??嫉膬?nèi)容。C語言的關(guān)鍵字共有32個(gè),但并不是每個(gè)關(guān)鍵字都有坑,本篇文章將通過理論聯(lián)系實(shí)際的方式為大家講解C語言中易混易錯(cuò)以及常考的一些關(guān)鍵字
    2022-05-05
  • C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式

    C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式

    為了避免因?yàn)閷㈩悗熘械乃接谐蓡T開放給類的使用方而導(dǎo)致的軟件邏輯外泄,因此需要將對(duì)外代碼中的私有成員隱藏起來,下面我們來了解一下隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式
    2022-05-05
  • 總結(jié)C語言中const關(guān)鍵字的使用

    總結(jié)C語言中const關(guān)鍵字的使用

    一起雖然學(xué)過c語言,但是并沒有寫過太多的代碼,最近想要拾起c語言,就寫了一些代碼,但是對(duì)const關(guān)鍵字比較陌生,這里總結(jié)一下,方法自己和大家有需要的時(shí)候參考借鑒,下面跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11

最新評(píng)論