本篇主要實現(xiàn)一個簡單的通訊錄,其功能主要包括對聯(lián)系人的增刪改查等签财。
整體框架
從上圖可以看出此通訊錄主要包括七個功能模塊:
- 增加聯(lián)系人:該模塊主要功能是往通訊錄中增加一個新的聯(lián)系人敬鬓,主要包括聯(lián)系人的姓名淹朋、性別、年齡钉答、電話础芍、住址等信息;
- 修改聯(lián)系人:該模塊主要功能是根據(jù)聯(lián)系人姓名修改通訊錄該聯(lián)系人的其他信息数尿;
- 刪除聯(lián)系人:該模塊主要功能是根據(jù)聯(lián)系人姓名刪除通訊錄該聯(lián)系人仑性;
- 查看聯(lián)系人:該模塊主要功能是根據(jù)聯(lián)系人姓名查看通訊錄該聯(lián)系人的所有信息;
- 展示通訊錄:該模塊主要功能是展示通訊錄中所有聯(lián)系人的所有信息右蹦;
- 排序:該模塊主要功能是通過通訊錄中所有聯(lián)系人的姓名來對通訊錄進(jìn)行排序诊杆;
- 清空:該功能模塊主要是清空通訊錄的所有內(nèi)容。
功能模塊的實現(xiàn)
由于一個聯(lián)系人包含多種信息嫩实,我們沒法用一個基本類型來表示刽辙,所以我們自定義一個用戶類型結(jié)構(gòu)體,該結(jié)構(gòu)體主要包括聯(lián)系人姓名甲献、性別宰缤、年齡、電話晃洒、地址慨灭,如下:
// 用戶結(jié)構(gòu)體
typedef struct User {
char name[128];
char sex[16];
int age;
char phone[32];
char address[512];
} User;
我們再自定義一個通訊錄結(jié)構(gòu)體,主要包含兩個成員球及,分別是聯(lián)系人數(shù)組和有效聯(lián)系人個數(shù)氧骤,如下:
#define MAX 1000
typedef struct UserBook {
User users[MAX];
// 有效聯(lián)系人個數(shù)
int size;
} UserBook;
在主函數(shù)中我們創(chuàng)建一個通訊錄類型的變量來保證各個模塊操作的都是同一個通訊錄,然后我們將該通訊錄的地址傳給各個模塊來實現(xiàn)各個模塊的功能吃引。
增加聯(lián)系人模塊
根據(jù)入?yún)⒘斜韨魅氲耐ㄓ嶄浀刂穼νㄓ嶄涍M(jìn)行操作筹陵,從鍵盤中輸入要添加的用戶信息(姓名、性別镊尺、年齡朦佩、電話、地址)庐氮,將以上信息添加至通訊錄中聯(lián)系人數(shù)組users的size下標(biāo)處(因為size之前的下標(biāo)為有效聯(lián)系人下標(biāo))语稠,然后對有效聯(lián)系人數(shù)量size自增,添加成功后向用戶反饋提示信息,包括操作結(jié)果和當(dāng)前聯(lián)系人數(shù)量仙畦。
void add(UserBook* ub) {
printf("請輸入聯(lián)系人的姓名输涕、性別、年齡慨畸、電話莱坎、地址:");
scanf(
"%s %s %d %s %s",
ub->users[ub->size].name, ub->users[ub->size].sex,
&ub->users[ub->size].age, ub->users[ub->size].phone,
ub->users[ub->size].address
);
ub->size++;
printf("用戶添加成功,當(dāng)前用戶數(shù)為:%d個\n", ub->size);
}
修改聯(lián)系人模塊
根據(jù)入?yún)魅氲耐ㄓ嶄浀刂愤M(jìn)行修改聯(lián)系人的操作寸士,首先根據(jù)用戶輸入的姓名查找此用戶型奥,用一個index變量來保存查找的結(jié)果(即該聯(lián)系人在通訊錄中的下標(biāo)),若在通訊錄中沒找到該聯(lián)系人碉京,則返回,并提示用戶沒找到螟深;若找到該聯(lián)系人谐宙,此時從鍵盤上輸入要修改的聯(lián)系人信息(姓名、性別界弧、年齡凡蜻、電話、地址)垢箕,修改成功后提示用戶修改成功划栓。
void modify(UserBook* ub) {
char name[1024];
printf("請輸入您要修改的姓名:");
scanf("%s", name);
int index = -1;
for (int i = 0; i < ub->size; i++) {
if (strcmp(name, ub->users[i].name) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("沒找到\n");
return;
}
printf("請輸入姓名、性別条获、年齡忠荞、電話和地址:");
scanf(
"%s %s %d %s %s",
ub->users[index].name, ub->users[index].sex,
&ub->users[index].age, ub->users[index].tele,
ub->users[index].address
);
printf("修改成功\n");
}
刪除聯(lián)系人模塊
根據(jù)入?yún)魅氲耐ㄓ嶄浀刂愤M(jìn)行刪除聯(lián)系人的操作,首先根據(jù)用戶輸入的姓名查找此用戶帅掘,用一個index變量來保存查找的結(jié)果(即該聯(lián)系人在通訊錄中的下標(biāo))委煤,若在通訊錄中沒找到該聯(lián)系人,則返回修档,并提示用戶沒找到碧绞;若找到該聯(lián)系人,則將該聯(lián)系人以后的所有有效聯(lián)系人向前移動一個位置吱窝,并且有效聯(lián)系人個數(shù)自減讥邻。
void del(UserBook* ub) {
char name[1024];
printf("請輸入您要刪除的姓名:");
scanf("%s", name);
int index = -1;
for (int i = 0; i < ub->size; i++) {
if (strcmp(name, ub->users[i].name) == 0) {
index = i;
break;
}
}
// 找到并刪除
if (index != -1) {
for (int i = index; i < ub->size - 1; i++) {
ub->users[i] = ub->users[i + 1];
}
// 有效用戶數(shù)量自減
ub->size--;
printf("刪除成功\n");
return;
}
printf("沒找到\n");
}
查看聯(lián)系人模塊
根據(jù)入?yún)魅氲耐ㄓ嶄浀刂愤M(jìn)行查看聯(lián)系人的操作,首先根據(jù)用戶輸入的姓名在通訊錄中查找院峡,用一個count變量來保存查找到的用戶數(shù)量兴使,然后將查找到的所有用戶信息打印出來,然后向用戶反饋查找到的聯(lián)系人數(shù)量撕予。
void search(UserBook* ub) {
int count = 0;
char name[1024];
printf("請輸入您要查找的姓名:");
scanf("%s", name);
for (int i = 0; i < ub->size; i++) {
if (strcmp(name, ub->users[i].name) == 0) {
printf(
"[%d]. 姓名:%s 性別:%s 年齡:%d 電話:%s 地址:%s\n",
i + 1,
ub->users[i].name, ub->users[i].sex,
ub->users[i].age, ub->users[i].tele,
ub->users[i].address
);
count++;
}
}
printf("共計找到%d個\n", count);
}
展示通訊錄模塊
根據(jù)傳入的通訊錄地址來進(jìn)行展示通訊錄的操作鲫惶,首先用一個for循環(huán)來遍歷整個通訊錄的有效用戶,并打印所有有效用戶的信息(姓名实抡、性別欠母、年齡欢策、電話、地址)赏淌,然后向用戶反饋通訊錄中所有的有效聯(lián)系人數(shù)量踩寇。
void show(UserBook* ub) {
for (int i = 0; i < ub->size; i++) {
printf(
"[%d]. 姓名:%s\t性別:%s\t年齡:%d\t電話:%s\t地址:%s\n",
i + 1,
ub->users[i].name, ub->users[i].sex,
ub->users[i].age, ub->users[i].tele,
ub->users[i].address
);
}
printf("共計%d個\n", ub->size);
}
排序模塊
根據(jù)傳入通訊錄的地址來進(jìn)行排序操作,用冒泡排序根據(jù)用戶姓名來進(jìn)行排序六水,完成排序后向用戶反饋提示信息俺孙。
void sort(UserBook* ub) {
for (int i = 0; i < ub->size - 1; i++) {
for (int j = 0; j < ub->size - 1 - i; j++) {
if (strcmp(ub->users[j].name, ub->users[j + 1].name) > 0) {
User tmp = ub->users[j];
ub->users[j] = ub->users[j + 1];
ub->users[j + 1] = tmp;
}
}
}
printf("排序完成\n");
}
清空模塊
將傳入通訊錄的有效用戶個數(shù)置為0,則清空成功掷贾,并向用戶反饋結(jié)果睛榄。
void clear(UserBook* ub) {
ub->size = 0;
printf("清除成功\n");
}