基于C語言打造高效便捷的通訊錄管理系統(tǒng)
引言
在我們大致學(xué)習(xí)完C語言之后,我們就可以利用目前所學(xué)的知識(shí)去做一些有意思的項(xiàng)目,而今天貝蒂就帶大家完成一個(gè)通訊錄的簡(jiǎn)易實(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//名字最大長(zhǎng)度 #define MAX_SEX 5//性別最大長(zhǎng)度 #define MAX_TELE 12//電話最大長(zhǎng)度 #define MAX_ADDR 30//地址最大長(zhǎng)度
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),為了簡(jiǎn)化代碼和增加代碼的可讀性,我們可以將這兩者重新定義一個(gè)結(jié)構(gòu)體。
typedef struct contact
{
PeoInfo data[MAX];//一百個(gè)人的數(shù)據(jù)
int sz;//通訊錄的大小
}contact;
4. 簡(jiǎn)易菜單
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//名字最大長(zhǎng)度
#define MAX_SEX 5//性別最大長(zhǎng)度
#define MAX_TELE 12//電話最大長(zhǎng)度
#define MAX_ADDR 30//地址最大長(zhǎng)度
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語言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例
C語言標(biāo)準(zhǔn)庫(kù)中的<ctype.h>和<string.h>頭文件分別提供了豐富的字符處理和字符串處理函數(shù),本文就來介紹一下C語言字符函數(shù)與字符串函數(shù)的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-11-11
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)鏈接庫(kù)圖文教程
這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫(kù)圖文教程,本文詳細(xì)講解了DLL庫(kù)的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下2014-09-09
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ì)象上的操作,常見的用法你知道嗎
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-08-08
C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式
為了避免因?yàn)閷㈩悗?kù)中的私有成員開放給類的使用方而導(dǎo)致的軟件邏輯外泄,因此需要將對(duì)外代碼中的私有成員隱藏起來,下面我們來了解一下隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式2022-05-05

