=========================================================================
相關(guān)代碼gitee自取:C語(yǔ)言學(xué)習(xí)日記: 加油努力 (gitee.com)
?=========================================================================
接上期:
學(xué)C的第三十天【自定義類型:結(jié)構(gòu)體、枚舉、聯(lián)合】_高高的胖子的博客-CSDN博客
?=========================================================================
? ? ? ? ? ? ? ? ? ? ?
通訊錄需求:
? ? ? ? ? ? ?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-617311.html
實(shí)現(xiàn)一個(gè)通訊錄,
通訊錄中存放保存人的信息:
名字、年齡、性別、
電話、地址
? ? ? ? ? ? ?
????????通訊錄相關(guān)功能:
- 通訊錄中可以存放100個(gè)人的信息
- 增加聯(lián)系人
- 刪除指定聯(lián)系人
- 修改指定聯(lián)系人
- 查找指定聯(lián)系人
- 顯示所有聯(lián)系人的信息
- 排序功能
? ? ? ? ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ?
多文件實(shí)現(xiàn)通訊錄
(1). contact.h文件 -- 相關(guān)函數(shù)和結(jié)構(gòu)體類型的聲明:
? ? ? ? ? ? ? ?
1 . 結(jié)構(gòu)體 struct PeoInfo -- 存放通訊錄聯(lián)系人的信息:
? ? ? ? ? ? ? ??
使用 typedef 重命名結(jié)構(gòu)體,
將 struct PeoInfo 重命名為 PeoInfo,
方便后續(xù)使用
? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ??
? ? ? ? ? ? ??
2 .?結(jié)構(gòu)體 struct contact -- 通訊錄類型:
? ? ? ? ? ? ? ??
使用 typedef 重命名結(jié)構(gòu)體,?
? ? ? ? ? ? ? ? ? ? ?
創(chuàng)建通訊錄信息結(jié)構(gòu)體變量數(shù)組
? ? ? ? ? ? ? ? ? ??
創(chuàng)建一個(gè)變量來(lái)記錄當(dāng)前通訊錄data的人數(shù)
? ? ? ? ? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
3 . 函數(shù) InitContact() 的聲明 -- 初始化通訊錄類型變量
? ? ? ? ? ? ? ??
參數(shù)接收 -- 通訊錄類型變量地址
返回類型 -- void
? ? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
4 .?函數(shù) AddContact() 的聲明 -- 增加通訊錄成員:
? ? ? ? ? ? ? ??
參數(shù)接收 -- 通訊錄類型變量地址
返回類型 -- void
? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
5 . 對(duì)常量使用進(jìn)行優(yōu)化 -- 設(shè)置 全局變量 和 枚舉
? ? ? ? ? ? ? ? ?
(一).?
設(shè)置 全局變量:
contact.h 中,
定義全局變量 MAX 100 -- 設(shè)置通訊錄最多人數(shù),
其它通訊錄信息也是同理
圖示:
? ? ? ? ? ? ? ??
(二).?
設(shè)置 枚舉:
對(duì)測(cè)試中,用戶輸入的選項(xiàng)進(jìn)行枚舉,
用對(duì)應(yīng)的功能名字代表對(duì)應(yīng)的選項(xiàng)
? ? ? ? ? ? ? ? ?
在 contact.h 文件中設(shè)置好后,
在 test.c 文件中進(jìn)行修改
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
6 .?函數(shù) ShowContact() 的聲明 -- 打印通訊錄所有成員信息:
? ? ? ? ? ? ? ??
參數(shù)接收 -- const Contact* pc
(只是打印,不用修改所以設(shè)置為常量)
? ? ? ? ? ?
返回類型 -- void
? ? ? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
7 .?函數(shù) FindByName() 的聲明 -- 刪除指定通訊錄成員信息:
? ? ? ? ? ? ? ??
參數(shù)接收 -- 通訊錄類型變量地址 和 要查找的名字字符串
返回類型 -- int,返回找到的元素下標(biāo) 或 未找到情況的-1
? ? ? ? ?
注:
該函數(shù)只在 contact.c文件 中支持其它函數(shù),
為了保密可以不在該文件聲明? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
8 .?函數(shù) DelContact() 的聲明 -- 刪除指定通訊錄成員信息:
? ? ? ? ? ? ? ??
參數(shù)接收 -- 通訊錄類型變量地址
返回類型 -- void
? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
9 .?函數(shù) SearchContact() 的聲明 -- 查找指定通訊錄成員信息:
? ? ? ? ? ? ? ??
參數(shù)接收 -- const Contact* pc
(只是打印,不用修改所以設(shè)置為常量)
? ? ? ? ? ?
返回類型 -- void
? ? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
10 .?函數(shù) ModifyContact() 的聲明 -- 查找指定通訊錄成員信息:
? ? ? ? ? ? ? ??
參數(shù)接收 -- 通訊錄類型變量地址
返回類型 -- void
? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
該文件對(duì)應(yīng)代碼:
#define _CRT_SECURE_NO_WARNINGS 1 //contact.h文件 -- 相關(guān)函數(shù)和類型的聲明: //包含頭文件: #include <string.h> #include <assert.h> #include <stdio.h> //定義全局變量 MAX 100 -- 設(shè)置通訊錄最多人數(shù) #define MAX 100 //通訊錄信息也是同理: #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 //對(duì)測(cè)試中,用戶輸入的選項(xiàng)進(jìn)行枚舉, //用對(duì)應(yīng)的功能名字代表對(duì)應(yīng)的選項(xiàng): enum OPTION { //枚舉中的內(nèi)容默認(rèn)0開(kāi)始往后排: EXIT, // 0 對(duì)應(yīng) 退出 ADD, // 1 對(duì)應(yīng) 增加 DEL, // 2 對(duì)應(yīng) 刪除 SEARCH, // 3 對(duì)應(yīng) 搜索 MODIFY, // 4 對(duì)應(yīng) 修改 SHOW, // 5 對(duì)應(yīng) 顯示所有 SORT // 6 對(duì)應(yīng) 排序 }; //1.結(jié)構(gòu)體 struct PeoInfo -- 存放保存人的信息: //使用 typedef 重命名結(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; //2.結(jié)構(gòu)體 struct contact -- 通訊錄類型: //使用 typedef 重命名結(jié)構(gòu)體, typedef struct contact { //創(chuàng)建通訊信息錄結(jié)構(gòu)體變量數(shù)組: PeoInfo data[MAX]; //創(chuàng)建一個(gè)變量來(lái)記錄當(dāng)前通訊錄data的人數(shù): int sz; }Contact; //3.函數(shù) InitContact() 的聲明 -- 初始化通訊錄類型變量 void InitContact(Contact* pc); //4.函數(shù) AddContact() 的聲明 -- 增加通訊錄成員: void AddContact(Contact* pc); //6.函數(shù) ShowContact() 的聲明 -- 打印通訊錄所有成員信息: void ShowContact(const Contact* pc); //7.函數(shù) FindByName() 的聲明?-- 刪除指定通訊錄成員信息: //該函數(shù)只在 contact.c文件 中支持其它函數(shù), //為了保密可以不在該文件聲明 int FindByName(Contact* pc, char name[]); //8.函數(shù) DelContact() 的聲明 -- 刪除指定通訊錄成員信息: void DelContact(Contact* pc); //9.函數(shù) SearchContact() 的聲明 -- 查找指定通訊錄成員信息: void SearchContact(const Contact* pc); //10 .?函數(shù) ModifyContact() 的聲明 -- 查找指定通訊錄成員信息: void ModifyContact(Contact* pc);
? ? ? ? ? ? ? ? ? ? ?
————————————————————————————————————————
? ? ? ? ? ? ? ? ? ??
(2). contact.c文件 -- 自定義函數(shù)的實(shí)現(xiàn):
? ? ? ? ? ? ??
1 .?函數(shù) InitContact()?-- 初始化通訊錄類型變量
? ? ? ? ? ? ? ??
在 contact.h文件 中包含 <string.h> 頭文件,
再在 contact.c文件中 包含通訊錄函數(shù)聲明頭文件:<contact.h>
? ? ? ? ? ? ??
使用 memset系統(tǒng)函數(shù),初始化data數(shù)組
參數(shù)1:被設(shè)置的空間 -- data
參數(shù)2:要設(shè)置的值?-- 0 (全部初始化為0)
參數(shù)3:要設(shè)置的空間大小 -- sizeof(pc->data) ,直接計(jì)算出大小
? ? ? ? ? ? ? ? ? ??
聯(lián)系人個(gè)數(shù) sz 初始化為0
? ? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
2 .?函數(shù) AddContact()?-- 增加通訊錄成員:
? ? ? ? ? ? ? ??
增加的前提是還沒(méi)放滿,
先判斷通訊錄是否人數(shù)已滿
? ? ? ? ? ? ? ? ?
如果未滿則開(kāi)始添加信息:
sz 和 data數(shù)組 的下標(biāo)是對(duì)應(yīng)的,
所以可以通過(guò) sz 找到 data 的對(duì)應(yīng)元素,
再通過(guò)對(duì)應(yīng)元素找到對(duì)應(yīng)元素的相應(yīng)信息,如果對(duì)應(yīng)的信息是數(shù)組,可以不加 取地址符&,
使用 scanf()函數(shù) 將信息放進(jìn)去
? ? ? ? ? ? ? ?
添加完一個(gè)聯(lián)系人后,將指針移向下一個(gè)聯(lián)系人位置
? ? ? ? ? ? ? ?
打印添加成功信息
? ? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
3 .?函數(shù) ShowContact()?-- 打印通訊錄所有成員信息:
? ? ? ? ? ? ? ??
打印列標(biāo)題,
再使用 for循環(huán) 循環(huán)打印信息,
注意巧用 printf()函數(shù)
? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
4 .?函數(shù) FindByName()?-- 刪除指定通訊錄成員信息:
? ? ? ? ? ? ? ??
使用 for循環(huán) 循環(huán)在通訊錄中查找該人坐標(biāo),
使用 strcmp函數(shù) 進(jìn)行判斷名字是否存在,
如果找到了則返回下標(biāo),未找到則返回-1
? ? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
5 .?函數(shù) DelContact()?-- 刪除指定通訊錄成員信息:
? ? ? ? ? ? ? ??
先判斷通訊錄是否為空,為空沒(méi)法刪除則直接返回,
? ? ? ? ? ? ? ??
不為空:
先輸入并接收要刪除的聯(lián)系人名字,
? ? ? ? ? ? ? ? ?
再調(diào)用 FindByName()函數(shù) 在通訊錄中查找該人下標(biāo),
? ? ? ? ? ? ? ?
未找到則打印相應(yīng)信息并返回,
? ? ? ? ?
找到了則刪除該下標(biāo)的聯(lián)系人,
? ? ? ? ? ??
刪除后,將指針向前移一位,
? ? ? ? ? ??
最后打印刪除成功
? ? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
6 .?函數(shù) SearchContact()?-- 查找指定通訊錄成員信息:
? ? ? ? ? ? ? ??
先輸入并接收要查找的聯(lián)系人名字,
? ? ? ? ? ? ? ? ?
再調(diào)用 FindByName()函數(shù) 在通訊錄中查找該人下標(biāo),
? ? ? ? ? ? ? ?
未找到則打印相應(yīng)信息并返回,
? ? ? ? ?
找到了則打印該下標(biāo)的聯(lián)系人信息
? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
7 .?函數(shù) ModifyContact()?-- 查找指定通訊錄成員信息:
? ? ? ? ? ? ? ??
先輸入并接收要修改的聯(lián)系人名字,
? ? ? ? ? ? ? ? ?
再調(diào)用 FindByName()函數(shù) 在通訊錄中查找該人下標(biāo),
? ? ? ? ? ? ? ?
未找到則打印相應(yīng)信息并返回,
? ? ? ? ?
找到了則修改該下標(biāo)聯(lián)系人信息
? ? ? ? ? ? ? ?
?圖示:
? ? ? ? ? ? ? ? ? ? ?
該文件對(duì)應(yīng)代碼:
#define _CRT_SECURE_NO_WARNINGS 1 //contact.c文件 -- 自定義函數(shù)的實(shí)現(xiàn): //包含頭文件: #include "contact.h" //1.函數(shù) InitContact()?--初始化通訊錄類型變量 void InitContact(Contact* pc) { //斷言: assert(pc); memset(pc->data, 0, sizeof(pc->data)); /*使用 memset系統(tǒng)函數(shù),初始化data數(shù)組。 參數(shù)1:被設(shè)置的空間 -- data 參數(shù)2:要設(shè)置的指-- 0 (全部初始化為0) 參數(shù)3:要設(shè)置的空間大小-- sizeof(pc->data) , 直接計(jì)算出大小*/ //聯(lián)系人個(gè)數(shù)初始化為0: pc->sz = 0; } //2.函數(shù) AddContact() 的聲明 -- 增加通訊錄成員: void AddContact(Contact* pc) { //斷言: assert(pc); //增加的前提是還沒(méi)放滿: if (pc->sz == MAX) { printf("通訊錄已滿,無(wú)法添加\n"); //無(wú)法添加直接返回: return; } //沒(méi)滿則開(kāi)始增加信息: // sz 和 data數(shù)組 的下標(biāo)是對(duì)應(yīng)的, // 所以可以通過(guò) sz 找到 data 的對(duì)應(yīng)元素, // 再通過(guò)對(duì)應(yīng)元素找到對(duì)應(yīng)元素的相應(yīng)信息 // 如果對(duì)應(yīng)的信息是數(shù)組??梢圆患?amp; //名字: printf("請(qǐng)輸入名字:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pc->sz].name); //年齡: printf("請(qǐng)輸入年齡:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%d", &pc->data[pc->sz].age); //性別: printf("請(qǐng)輸入性別:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pc->sz].sex); //電話: printf("請(qǐng)輸入電話:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pc->sz].tele); //地址: printf("請(qǐng)輸入地址:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pc->sz].addr); //添加完一個(gè)聯(lián)系人后,將指針移向下一個(gè)聯(lián)系人位置: pc->sz++; //打印添加成功信息: printf("成功添加聯(lián)系人\n"); } //3 .?函數(shù) ShowContact()?-- 打印通訊錄所有成員信息: void ShowContact(const Contact* pc) { //斷言: assert(pc); printf("\n"); //打印列標(biāo)題: printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址"); //使用 for循環(huán) 循環(huán)打印信息: int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-4d\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 ); // %20S:打印20個(gè)字符,這里名字是20個(gè)字符 // \t: 使用制表符進(jìn)行對(duì)齊 // %4d:打印4個(gè)整型,這里是年齡 // “-”號(hào) :左對(duì)齊 } printf("\n"); } //4 .?函數(shù) FindByName()?-- 刪除指定通訊錄成員信息: int FindByName(const Contact* pc, char name[]) { //遍歷查找該人坐標(biāo): int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) //如果 找到了一個(gè)下標(biāo)元素的name 和 要找的name 一樣 { return i; //返回此時(shí)找到的下標(biāo) } } return -1; //未找到則返回-1 } //5 . 函數(shù) DelContact()?--刪除指定通訊錄成員信息: void DelContact(Contact* pc) { //斷言: assert(pc); //先判斷通訊錄是否為空: if (pc->sz == 0) { //為空就沒(méi)法刪除了,直接返回 printf("通訊錄為空,無(wú)法刪除\n"); return; } //創(chuàng)建存放要?jiǎng)h除聯(lián)系人名字的字符數(shù)組: char name[MAX_NAME] = { 0 }; //輸入并接收刪除聯(lián)系人名字: printf("請(qǐng)輸入要?jiǎng)h除的人名字:>"); scanf("%s", name); //因?yàn)樵谕ㄓ嶄浿胁檎夷橙耸嵌鄠€(gè)功能所需要的, //所以可以將其封裝成函數(shù),再調(diào)用: int del = FindByName(pc, name); //如果del為-1,說(shuō)明未找到: if (del == -1) { printf("要?jiǎng)h除的人不存在\n"); return; //直接返回 } //如果找到了則刪除坐標(biāo)為del的聯(lián)系人: int i = 0; for (i = del; i < pc->sz-1; i++) //從del下標(biāo)開(kāi)始,到倒數(shù)第二個(gè)元素 { pc->data[i] = pc->data[i + 1]; //把del后1個(gè)元素賦給del,循環(huán)覆蓋掉del的元素 //倒數(shù)第二個(gè)元素+1 為最后一個(gè)元素為止 } //刪除一個(gè)后,將pc指針向前移一位: pc->sz--; //打印提示: printf("成功刪除該聯(lián)系人\n"); } //6 .?函數(shù) SearchContact()?-- 查找指定通訊錄成員信息: void SearchContact(const Contact* pc) { //斷言: assert(pc); //創(chuàng)建存放要查找的聯(lián)系人名字的字符數(shù)組: char name[MAX_NAME] = { 0 }; //輸入并接收要查找聯(lián)系人名字: printf("請(qǐng)輸入要查找的聯(lián)系人名字:>"); scanf("%s", name); //使用 FindByName() 函數(shù)查找該人在通訊錄中的下標(biāo): int pos = FindByName(pc, name); //如果del為-1,說(shuō)明未找到: if (pos == -1) { printf("要查找的人不存在\n"); return; //直接返回 } else //找到了則打印該人信息: { //打印列標(biāo)題: printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址"); //打印對(duì)應(yīng)信息: printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } //7 .?函數(shù) ModifyContact()?-- 查找指定通訊錄成員信息: void ModifyContact(Contact* pc) { //斷言: assert(pc); //創(chuàng)建存放要修改的聯(lián)系人名字的字符數(shù)組: char name[MAX_NAME] = { 0 }; //輸入并接收要修改聯(lián)系人名字: printf("請(qǐng)輸入要修改的聯(lián)系人名字:>"); scanf("%s", name); //使用 FindByName() 函數(shù)查找該人在通訊錄中的下標(biāo): int pos = FindByName(pc, name); //如果del為-1,說(shuō)明未找到: if (pos == -1) { printf("要修改的人不存在\n"); return; //直接返回 } else //找到了則修改該人信息: { //名字: printf("請(qǐng)輸入名字:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pos].name); //年齡: printf("請(qǐng)輸入年齡:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%d", &pc->data[pos].age); //性別: printf("請(qǐng)輸入性別:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pos].sex); //電話: printf("請(qǐng)輸入電話:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pos].tele); //地址: printf("請(qǐng)輸入地址:>"); //使用 scanf()函數(shù) 將信息放進(jìn)去 scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } }
? ? ? ? ? ? ? ? ? ? ?
————————————————————————————————————————
? ? ? ? ? ? ? ? ? ??
(3). test.c文件 -- 測(cè)試通訊錄:
? ? ? ? ? ? ??
1 . 函數(shù) void menu() -- 打印通訊錄菜單:
? ? ? ? ? ? ? ??
告知使用者輸入對(duì)應(yīng)數(shù)字實(shí)現(xiàn)對(duì)應(yīng)功能
? ? ? ? ? ? ? ?
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
2 .?函數(shù) void test() -- 完成通訊錄測(cè)試:
? ? ? ? ? ? ? ??
(一).?
使用 do while 循環(huán),
? ? ? ? ? ? ? ? ??
先打印菜單,
? ? ? ? ? ? ??
再根據(jù)輸入的選項(xiàng)來(lái)判斷是否需要再進(jìn)行服務(wù),
可以使用 switch 語(yǔ)句進(jìn)行篩選判斷
圖示:
? ? ? ? ? ? ?
(二).
包含<contact.h>頭文件,
通過(guò)結(jié)構(gòu)體 struct contact?(Contact),
創(chuàng)建通訊錄類型變量 -- con,
包含data數(shù)組,存放有效的通訊錄數(shù)據(jù),
和sz,記錄存放數(shù)據(jù)的個(gè)數(shù)
? ? ? ? ? ? ? ? ? ??
創(chuàng)建后還需要初始化,
調(diào)用 函數(shù)InitContact() 進(jìn)行初始化,
參數(shù)接收通訊錄類型變量的地址 -- &con
圖示:
? ? ? ? ? ? ? ?
(三).
如果用戶輸入 1 ,
則調(diào)用 函數(shù)AddContact() ,
增加聯(lián)系人,
參數(shù)接收 &con 對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作
? ? ? ? ? ??
如果用戶輸入 2?,
則調(diào)用 函數(shù)DelContact() ,
刪除指定通訊錄成員,
參數(shù)接收 &con 對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作
? ? ? ? ? ??
如果用戶輸入 3?,
則調(diào)用 函數(shù)SearchContact() ,
查找指定聯(lián)系人信息,
參數(shù)接收 &con 對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作
? ? ? ? ? ??
如果用戶輸入 4?,
則調(diào)用 函數(shù)ModifyContact() ,
修改指定聯(lián)系人信息,
參數(shù)接收 &con 對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作
? ? ? ? ? ??
如果用戶輸入 5?,
則調(diào)用 函數(shù)ShowContact() ,
打印所有聯(lián)系人信息,
參數(shù)接收 &con 對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作
? ? ? ? ? ??
如果用戶輸入 0,
則打印對(duì)應(yīng)信息并退出程序
? ? ? ? ? ? ? ?
如果用戶 輸入非法?,
則打印對(duì)應(yīng)信息并重新輸入
? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ??
3 . 主函數(shù)
? ? ? ? ? ? ? ??
直接調(diào)用 test()測(cè)試函數(shù)即可
? ? ? ? ? ? ? ??
圖示:
? ? ? ? ? ? ? ? ? ? ?
該文件對(duì)應(yīng)代碼:
#define _CRT_SECURE_NO_WARNINGS 1 //test.c文件 -- 測(cè)試通訊錄: //包含<contact.h>頭文件: #include "contact.h" //1 . 函數(shù) void menu() -- 打印通訊錄菜單: void menu() { // 選1:增加聯(lián)系人 選2:刪除聯(lián)系人 // 選3:搜索聯(lián)系人 選4:修改聯(lián)系人信息 // 選5:顯示所有聯(lián)系人 選6:對(duì)聯(lián)系人進(jìn)行排序 // 選0:退出通訊錄 printf("*****************************************************\n"); printf("***** 1. add 2. del *****\n"); printf("***** 3. search 4. modify *****\n"); printf("***** 5. show 6. sort *****\n"); printf("***** 0. exit *****\n"); printf("*****************************************************\n"); } //函數(shù) void test() -- 完成通訊錄測(cè)試: void test() { //創(chuàng)建通訊錄類型變量: Contact con; //調(diào)用函數(shù)初始化通訊錄類型變量: InitContact(&con); int input = 0;//接收輸入的數(shù)據(jù) do { //調(diào)用菜單函數(shù)打印菜單: menu(); //接收輸入數(shù)據(jù): printf("請(qǐng)選擇:>"); scanf("%d", &input); //使用switch語(yǔ)句進(jìn)行篩選判斷: switch (input) { case ADD: //如果用戶輸入1, //則調(diào)用AddContact()函數(shù) //添加聯(lián)系人: AddContact(&con); //參數(shù)接收 &con ,對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作 break; case DEL: //如果用戶輸入2, //則調(diào)用DelContact()函數(shù) //刪除指定聯(lián)系人: DelContact(&con); //參數(shù)接收 &con ,對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作 break; case SEARCH: //如果用戶輸入3, //則調(diào)用SearchContact()函數(shù) //查找指定聯(lián)系人: SearchContact(&con); //參數(shù)接收 &con ,對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作 break; case MODIFY: //如果用戶輸入 4?, //則調(diào)用ModifyContact()函數(shù) //修改指定聯(lián)系人信息 ModifyContact(&con); //參數(shù)接收 &con ,對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作 break; case SHOW: //如果用戶輸入5, //則調(diào)用ShowContact()函數(shù) //打印所有聯(lián)系人信息: ShowContact(&con); //參數(shù)接收 &con ,對(duì)通訊錄進(jìn)行對(duì)應(yīng)操作 break; case SORT: //待定 break; case EXIT: //如果用戶輸入0, //打印對(duì)應(yīng)信息并退出程序: printf("退出通訊錄\n"); break; default: //如果用戶 輸入非法, //打印對(duì)應(yīng)信息并程序輸入: printf("選擇錯(cuò)誤,重新選擇\n"); break; } } while (input); //只要輸入數(shù)據(jù)不為0就繼續(xù)進(jìn)行 } //主函數(shù): int main() { //調(diào)用測(cè)試函數(shù)進(jìn)行測(cè)試: test(); return; }
? ? ? ? ? ? ?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
? ? ? ? ? ? ?
最終實(shí)現(xiàn)效果:
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-617311.html
到了這里,關(guān)于學(xué)C的第三十一天【通訊錄的實(shí)現(xiàn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!