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

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

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

引言

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

本章你可能需要的知識:

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

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

1. 通訊錄要求

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

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

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

2. 多文件管理

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

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

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

創(chuàng)建源文件text.c,負(fù)責(zé)展現(xiàn)通訊錄實現(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)體定義

每個人的通訊錄都要包含姓名,性別,年齡,電話與地址等信息,這時就需要我們創(chuàng)建一個結(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;

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

typedef struct contact
{
	PeoInfo data[MAX];//一百個人的數(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 初始化

我們首先對通訊錄進(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時自動展示通訊錄中的用戶,并且展示用戶過程中需要進(jìn)行對齊,便于用戶觀看。

void DisplayContact(contact* pc)//打印信息
{
	assert(pc);
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年紀(jì)",
		"性別", "電話", "地址");//默認(rèn)右對齊,修改為左對齊
	//中間也要留下足夠的空間
	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)系人,如果通訊錄已滿,則提醒用戶通訊錄已滿,請先清理通訊錄。

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

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

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

(2) 添加

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

void AddContact(contact* pc)//增加聯(lián)系人
{
	assert(pc);
	int ret = CheckContact(pc);//檢查是否滿了
	if (ret == 0)
	{
		printf("通訊錄已滿,請先清理通訊錄??!\n");
		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].tele);
	printf("請輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pc->sz].addr);
	printf("用戶添加成功!\n");
	pc->sz++;
}

5.4 刪除聯(lián)系人

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

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

在刪除指定練習(xí)人時我們需通過其姓名尋找該聯(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á)到刪除的目的。

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

void DeleteContact(contact* pc)//刪除聯(lián)系人
{
	assert(pc);
         assert(pc->sz >= 0);
	char name[MAX_NAME];
	printf("請輸入需要刪除人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\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("請輸入需要查找人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\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("請輸入需要修改人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\n");
		return;
	}
	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].tele);
	printf("請輸入聯(lián)系人的地址:> ");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功\n");
}

修改前:

修改后:

5.7 排序聯(lián)系人

我們可以選擇6對通訊錄進(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("請選擇如何排序:> ");
	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("輸入非法,請重新輸入\n");
	}
}

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

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

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

(1) 新增變量

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

typedef struct contact
{
	PeoInfo *data;//動態(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ù)量滿時增加內(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ù)據(jù)會被清空,我們要想保存上次寫入的數(shù)據(jù)就應(yīng)該使用文件操作。

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

每次初始化時就要將上次文件的數(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ù)據(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("請輸入你的選擇:>");
		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("非法輸入,請重新輸入\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;//動態(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)右對齊,修改為左對齊
	//中間也要留下足夠的空間
	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("請輸入聯(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].tele);
	printf("請輸入聯(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("請輸入需要刪除人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\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("請輸入需要查找人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\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("請輸入需要修改人的姓名:> ");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通訊錄中并沒有這個人!!\n");
		return;
	}
	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].tele);
	printf("請輸入聯(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("請選擇如何排序:> ");
	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("輸入非法,請重新輸入\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("請輸入你的選擇:>");
		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("非法輸入,請重新輸入\n");
			break;
		}
	} while (input);
}

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

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

相關(guān)文章

  • 基于C++11手?jǐn)]前端Promise及應(yīng)用與優(yōu)勢

    基于C++11手?jǐn)]前端Promise及應(yīng)用與優(yōu)勢

    本文將從一個手寫的 C++ Promise實現(xiàn)(基于 C++11)出發(fā),分析其工作原理,并與 std::promise 進(jìn)行對比,探討兩者的異同點以及適用場景,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    本篇文章是對在C語言調(diào)試中,鎖定錯誤的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 浮點數(shù)乘法和整形乘除法的效率經(jīng)驗比較

    浮點數(shù)乘法和整形乘除法的效率經(jīng)驗比較

    這篇文章主要為大家介紹了浮點數(shù)乘法和整形乘除法的效率經(jīng)驗比較,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    相對于操作NandFlash,操作NorFlash相對簡單,因為基本不需要考慮壞塊,NorFlash也沒有OOB區(qū)域,也跟ECC沒有關(guān)系。讀寫擦除相對容易,下面看個例子吧
    2013-12-12
  • C語言用棧模擬實現(xiàn)隊列問題詳解

    C語言用棧模擬實現(xiàn)隊列問題詳解

    本片文章帶你分析如何用兩個棧,并且只使用棧的基本功能來模擬實現(xiàn)隊列,其中同樣只實現(xiàn)隊列的基本功能,感興趣的朋友來看看吧
    2022-04-04
  • C語言基礎(chǔ) strlen 函數(shù)

    C語言基礎(chǔ) strlen 函數(shù)

    這篇文章主要介紹了C語言基礎(chǔ) strlen 函數(shù),在C 語言中,char 字符串也是一種非常重要的數(shù)據(jù)類型,我們可以使用 strlen 函數(shù)獲取字符串長度,這就是C語言strlen 函數(shù)的作用,下面我們來簡單介紹該內(nèi)容,需要的朋友可以參考以下
    2021-10-10
  • 深入了解一下C語言中的柔性數(shù)組

    深入了解一下C語言中的柔性數(shù)組

    柔性數(shù)組是在C99中定義的,即結(jié)構(gòu)體的最后一個元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組。這篇文章將通過簡單的示例為大家介紹一下柔性數(shù)組的使用,感興趣的可以了解一下
    2023-02-02
  • C++操作SQLite簡明教程

    C++操作SQLite簡明教程

    這篇文章主要介紹了C++操作SQLite簡明教程,包含創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)等常用操作,需要的朋友可以參考下
    2014-06-06
  • OpenCV基于距離變換和分水嶺實現(xiàn)圖像分割

    OpenCV基于距離變換和分水嶺實現(xiàn)圖像分割

    圖像分割是根據(jù)灰度、顏色、紋理和形狀等特征,把圖像分成若干個特定的、具有獨特性質(zhì)的區(qū)域。本文將基于距離變換和分水嶺實現(xiàn)圖像分割,需要的可以了解一下
    2022-09-09
  • c語言求1+2+...+n的解決方法

    c語言求1+2+...+n的解決方法

    本篇文章是對在c語言中求1+2+...+n的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

开封县| 茂名市| 四子王旗| 玉溪市| 邻水| 静乐县| 洪江市| 临颍县| 洱源县| 陆川县| 洱源县| 军事| 克东县| 班戈县| 桂东县| 塔河县| 伊春市| 德阳市| 林西县| 肇州县| 晋中市| 邵阳市| 宿松县| 丰宁| 西和县| 新安县| 日土县| 通河县| 青海省| 手游| 晋宁县| 虹口区| 株洲市| 黄骅市| 东宁县| 大庆市| 阜新| 茶陵县| 镇巴县| 南阳市| 开化县|