摘要:文章目錄前言前言一建立文件二編寫函數(shù)三調(diào)試運行四成果展示五代碼匯總總結(jié)前言通訊錄是我們?nèi)粘J謾C中常見的功能之一,綜合語言中結(jié)構(gòu)體,循環(huán),條件語句,動態(tài)內(nèi)存分配等等知識點,我們對手機通訊錄進行一個簡單的實現(xiàn),下面我們開始講解準備工作利用語
通訊錄是我們?nèi)粘J謾C中常見的功能之一,綜合C語言中結(jié)構(gòu)體,循環(huán),條件語句,動態(tài)內(nèi)存分配等等知識點,我們對手機通訊錄進行一個簡單的實現(xiàn),下面我們開始講解?。?!
所需知識:
①.函數(shù)調(diào)用,函數(shù)宏的定義及使用,庫函數(shù)對應的頭文件,函數(shù)聲明
②.循環(huán)語句,選擇語句( switch 和 if 語句?)的使用
③.指針,自定義類型的使用(結(jié)構(gòu)體和枚舉類型)
④.qsort函數(shù)的使用
⑤.動態(tài)內(nèi)存分配函數(shù)(malloc函數(shù)和realloc函數(shù))的使用
總結(jié):該程序所需的知識比較全面,可以借助本程序?qū)λ鶎WC語言的知識進行一個較為全面的復習
在這里我們采用的是多文件的編寫方式,各個文件分工明確,代碼簡約可讀性高
1.創(chuàng)建一個頭文件用來編寫函數(shù)聲明,庫函數(shù)的頭文件,定義define宏,定義結(jié)構(gòu)體的基本信息,我們把這些代碼都放在頭文件里面方便我們另外兩個文件調(diào)用,頭文件里面的代碼我們其他兩個 .c 文件中都要用到,這樣的編寫方式使我們的代碼更加簡約,增加可讀性。
2.在contact.c文件中我們主要編寫的是通訊錄的功能函數(shù)
3.在test.c文件中我們編寫的通訊錄的基本樣式,以及通過test.c這個文件去串起來其他兩個文件,實現(xiàn)通訊錄的功能
提示:為了方便解析代碼博主將代碼進行了拆分,在文章的最后會給大家放上最終三個文件的完整代碼
①.分析:我們知道通訊錄里面會存儲一個人的多個信息,比如:年齡,性別,電話等等,這些都是一個人的多個屬性,所以我們就可以把一個人的基本信息封裝到一個結(jié)構(gòu)體里
具體代碼如下:
struct PeoInfo//定義一個聯(lián)系人基本信息{ char name[namemax]; int age; char sex[sexmax]; char tel[telemax]; char addr[addrmax];};
我們看到在結(jié)構(gòu)體里面存儲一個人的五項基本信息,由于兩個 .c 文件都會用到此結(jié)構(gòu)體的成員信息,所以我們把這個結(jié)構(gòu)體放在文件中。我們注意到字符串數(shù)組括號里面沒有寫具體的數(shù)字,而是用宏進行了代替,這樣的目的是方便以后對數(shù)據(jù)的修改,僅僅對宏修改即可,省去對程序的每一個涉及到該字符串的數(shù)據(jù)進行修改。
該代碼塊涉及到的宏:
#define namemax 20#define sexmax 5#define telemax 12#define addrmax 30
我們看到如果需要修改字符串數(shù)組的容量,僅需要對宏后面的數(shù)據(jù)進行修改即可。
②.分析:我們已經(jīng)定義了一個基本聯(lián)系人的信息,我們想一下,一個通訊錄是由多個聯(lián)系人的基本信息組成的,所以我們又可以把多個聯(lián)系人的信息(即結(jié)構(gòu)體數(shù)組),封裝到一個結(jié)構(gòu)體中,此結(jié)構(gòu)體代表的就是我們的所需要的通訊錄
具體代碼如下:
struct contact{ struct PeoInfo* data; int sz ;//目前通訊錄有幾個 int capacity;//通訊錄的總?cè)萘縸;
我們在這里定義了一個結(jié)構(gòu)體用來存放多個聯(lián)系人的信息,在 contact 結(jié)構(gòu)體里我們存放了一個結(jié)構(gòu)體指針運來存放 PeoInfo 結(jié)構(gòu)體數(shù)組的首地址,這里結(jié)構(gòu)體指針代表的就是多個通訊錄成員的信息,sz變量用來記錄通訊錄的人數(shù),capacity變量代表的是通訊錄的總?cè)萘俊?/p>
我們先編寫一個菜單函數(shù),方便程序運行后根據(jù)菜單選擇序號進行功能的實現(xiàn)
具體代碼如下:
void menu(){ printf("**************************************/n"); printf("* 1.添加聯(lián)系人 2.刪除聯(lián)系人 */n"); printf("* 3.查找聯(lián)系人 4.修改聯(lián)系人 */n"); printf("* 5.展示通訊錄 6.按名字排序 */n"); printf("* 0.退出 */n"); printf("**************************************/n");}
菜單欄的樣式隨意設計即可。
接著我們定義一個枚舉類型,把我們功能的名稱都寫入枚舉類型中,注意這里寫入時要注意順序,和我們規(guī)定的菜單的功能編號一致,這樣可以保證輸入對應的序號實現(xiàn)對應的功能
enum Option{ EXIT, ADD, DEL, SERCH, MODIFY, SHOW, SORT};
這里的枚舉類型從頭開始默認的初值是 0 每向下走一個類型遞增 1 ,數(shù)值順序?qū)覀兊墓δ苄蛱柤纯?/p>
最后我們編寫我們的主函數(shù)作為調(diào)用通訊錄功能的函數(shù)
具體代碼如下:
#pragma warning(disable : 4996)#include "contact.h"void menu(){ printf("**************************************/n"); printf("* 1.添加聯(lián)系人 2.刪除聯(lián)系人 */n"); printf("* 3.查找聯(lián)系人 4.修改聯(lián)系人 */n"); printf("* 5.展示通訊錄 6.按名字排序 */n"); printf("* 0.退出 */n"); printf("**************************************/n");}enum OPTION{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; struct contact con;//創(chuàng)建一個通訊錄con變量 initcontact(&con);//初始化通訊錄 do { menu(); printf("請選擇通訊錄功能>"); scanf("%d", &input); switch (input) { case ADD: addcontact(&con); break; case DEL: delcontact(&con); break; case SEARCH: searchcontact(&con); break; case MODIFY: modifycontact(&con); break; case SHOW: showcontact(&con); break; case SORT: sortcontact(&con); break; case EXIT: destorycontact(&con); printf("退出通訊錄/n"); break; } } while (input); return 0;}
我們在這里定義了一個 input 輸入變量,根據(jù)用戶的輸入去實現(xiàn)不同的功能。創(chuàng)建了一個結(jié)構(gòu)體變量con,變量 con 代表的就是我們的剛剛設置好的通訊錄。定義一個 initcontact 函數(shù)對我們的通訊錄進行初始化(開辟空間)。進入循環(huán),用戶輸入不同的數(shù)據(jù)實現(xiàn)不同的功能,case后面的枚舉類型代表的就是對應的功能序號,在每一個功能下面都有一個功能函數(shù)去實現(xiàn)不同的功能,最后循環(huán)以輸入的input數(shù)值最后循環(huán)終止的條件,如果輸入的是 0 退出通訊錄,結(jié)束循環(huán)。
①.我們先對通訊錄進行初始化(即給通訊錄分配空間)
具體代碼如下:
void initcontact(struct contact* pc){ pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));//動態(tài)分配給data一塊內(nèi)存 pc->sz = 0;//初始化時通訊錄沒人 pc->capacity = size;//假設一開始的通訊錄容量為3后面不夠用隨時增容}
#define size 3
我們看到這里的參數(shù)傳進來的是我們通訊錄變量的地址,這里定義了一個 pc 指針去接收。我們首先給結(jié)構(gòu)體中的date數(shù)據(jù)(date代表多組聯(lián)系人)進行空間的開辟,我們假設通訊錄的通訊的總?cè)萘繛?3 先開辟 3 個空間,這三個空間的類型都是結(jié)構(gòu)體類型(struct PeoInfo類型),所以開辟空間的總大小,就是個數(shù) x 封裝成員基本信息的結(jié)構(gòu)體大小。然后利用malloc函數(shù)進行空間 的開辟,因為malloc函數(shù)的返回值是void*類型(開辟空間的首地址),我們需要把開辟的這上空間強制轉(zhuǎn)換為我們所需要的結(jié)構(gòu)體指針類型,再賦值給我們 pc 指針指向的 data 空間,這樣就完成了空間的開辟。又因為開始沒有添加聯(lián)系人的時候,通訊錄是空的,所以這里的 pc 指向的 sz 先把它賦值成 0 ,這里 pc 指向的 capacity 代表通訊錄的總?cè)萘浚覀兿劝阉x值成 3 之后空間不夠,再進行補充。
②.初始化完成后,我們開始實現(xiàn)我們的通訊錄的代號為 1 的功能即add(添加聯(lián)系人)函數(shù)的編寫
具體代碼如下:
void addcontact(struct contact* pc){ //如果通訊錄滿了 if (pc->sz == pc->capacity) { //增容 struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo)); if (ptr != NULL) { pc->data = ptr; pc->capacity += 2; printf("通訊錄增容成功/n"); } else { 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].tel); printf("請輸入新增聯(lián)系人的地址>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++;}
代碼解析:我們看到這里的參數(shù)傳進來的是我們通訊錄變量的地址,這里定義了一個 pc 指針去接收。進入函數(shù)先行判斷通訊錄滿沒滿,如果沒滿直接進入到下面的 scanf 和 printf 語句中進行成員基本信息的錄入,最后成員數(shù)sz+1。如果滿了判斷的條件就是目前通訊錄的 sz 個數(shù)等于我們的通訊錄的總?cè)萘繑?shù),這樣我們的通訊錄就已經(jīng)存滿了。進入到 if 語句中對空間重新分配,這里用到了realloc函數(shù),在realloc函數(shù)中傳入兩個參數(shù),一個是需要進行重新分配的空間,另一個是重新開辟的空間大小,這里的空間我們兩個兩個的給通訊錄增加(避免一次開辟過多對空間造成浪費),我們看到這里的空間在原本的通訊錄容量上capacity+2就是給我們的通訊錄總?cè)萘吭匍_辟兩個空間,有了需要開辟的空間個數(shù),我們用個數(shù) x 封裝成員基本信息的結(jié)構(gòu)體大小得到的就是我們需要重新開辟的空間大小,.realloc函數(shù)開辟空間后返回的是void*(開辟空間的首地址),我們在這里把它強轉(zhuǎn)為我們需要的結(jié)構(gòu)體指針類型,賦值給我們的定義的結(jié)構(gòu)體指針,這里新創(chuàng)建一個指針,不直接賦值給 pc 就是為了防止開辟空間失敗,把pc指針置空了,導致pc指針中的數(shù)據(jù)就清空了,為了防止這樣的情況發(fā)生,我們先定義一個中間變量存放開辟的空間,然后進入判斷如果這里返回的是空指針(NULL),證明空間開辟失敗了,直接返回空就可以了。如果開辟的不是空指針(NULL),就把這塊開辟的空間賦值給存儲多組成員信息的結(jié)構(gòu)體指針,然后對應通訊錄的總?cè)萘?+ 2,并打印一下告知空間開辟成功。
③.功能2:通訊錄的刪除操作(這里用到了strcmp函數(shù))--->C語言相關字符串庫函數(shù)用法
具體代碼如下:
void delcontact(struct contact* pc){ if (pc->sz == 0) { printf("通訊錄為空無法刪除/n"); return; } char name[namemax] = { 0 }; printf("請您輸入想要刪除的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { int j = 0; for (j = pos; j < pc->sz; j++) { pc->data[j] = pc->data[j + 1];//所有消息都進行交換 } pc->sz--; printf("該聯(lián)系人刪除成功/n"); }}
因為我們需要查找到對應的成員名字再進行刪除
所以我們在這里還需要再編寫一個查找名字的函數(shù)(該函數(shù)在后面的查找聯(lián)系人,更改聯(lián)系人中都有用到,因為他們都是通過名字去查找,再進行操作)
int Findname(char* name, struct contact* pc){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; } } return -1;}
我們先看刪除函數(shù),我們先進行判斷通訊錄是不是為空,如果sz為0的情況下,這時候通訊是無法進行刪除操作(因為通訊錄中沒有聯(lián)系人信息),如果為空就直接返回空。如果通訊錄有聯(lián)系人的信息,我們就定義一個由用戶輸入的名字,我們用這個名字去進行查找,查找到了就進行刪除操作,沒有這個名字就直接返回空(即刪除操作失敗了)。在查找的過程中我們就用到我們的查找函數(shù),我們看到查找函數(shù)中的參數(shù)一個是用戶輸入的名字,一個是通訊錄現(xiàn)有的成員信息,我們進行循環(huán)判斷,這里用到了strcmp函數(shù)進行字符串比較,如果相等就返回對應這個名字在結(jié)構(gòu)體中的下標位置,如果沒有查找到就返回-1。返回到刪除函數(shù)我們定義一個pos變量對返回值進行接收,然后再進行一次判斷,如果是-1代表沒有查找到函數(shù)返回空,如果不是 -1 證明查找到了該聯(lián)系人,即可以進行刪除操作,從pos(需要進行刪除操作的名字位置)位置開始依次把后面的結(jié)構(gòu)體成員信息向前一個賦值,把需要刪除的那個成員信息被后面的成員信息覆蓋掉即可,最后賦值操作完成后,目前得通訊錄人數(shù) -1即完成了我們的刪除操作。
④.功能三:通訊錄的查找操作
具體代碼如下:
void searchcontact(struct contact* pc){ char name[namemax] = { 0 }; printf("請您輸入想要查找的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[pos].name , pc->data[pos].age , pc->data[pos].sex , pc->data[pos].tel , pc->data[pos].addr); }}
查找函數(shù)依舊用到了我們的按名字查找函數(shù),在結(jié)構(gòu)體查找到用戶輸入的名字時,返回對應名字的成員下標,沒查找到就返回 -1,返回到查找函數(shù)中,進行判斷 -1 就是沒找到,不是 -1,就證明查找到了該聯(lián)系人,打印出來對應下標pos的結(jié)構(gòu)體成員變量信息即可。
⑤.功能四:修改指定聯(lián)系人
具體代碼如下:
void modifycontact(struct contact* pc){ char name[namemax] = { 0 }; printf("請您輸入想要修改的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { 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].tel); printf("請輸入修改聯(lián)系人的地址>"); scanf("%s", pc->data[pos].addr); printf("該聯(lián)系人信息修改成功!!!/n"); }}
在修改指定聯(lián)系人的代碼中我們可以看到,依舊使用到了查找函數(shù),我們使用查找名字函數(shù)進行查找用戶輸入想要更改的聯(lián)系人是不是在通訊錄中,如果不在返回 -1 ,如果在通訊錄里面,返回該聯(lián)系人對應的下標。返回到更改函數(shù)中,進行條件判斷,如果是 -1 返回空程序結(jié)束證明修改功能沒能實現(xiàn)。如果返回的不是 -1 就證明該聯(lián)系人在通訊錄里,將他對應的下標結(jié)構(gòu)體信息進行重新的錄入即可。
⑤.功能五:展示聯(lián)系人
具體代碼如下:
void showcontact(struct contact* pc){ printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[i].name , pc->data[i].age , pc->data[i].sex , pc->data[i].tel , pc->data[i].addr); }}
在打印信息的上面先定義一行標題,再利用循環(huán),循環(huán)條件是小于目前通訊錄的人數(shù)(pc所指向的sz個數(shù)),循環(huán)打印出來所有的信息即可
⑥.功能六:按照名字對通訊錄進行排序(這里用到了qsort函數(shù))-->?qsort函數(shù)的用法
具體代碼如下:
int cmp_byname(const void* e1, const void* e2){ return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);}void sortcontact(struct contact* pc){ qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_byname); printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[i].name , pc->data[i].age , pc->data[i].sex , pc->data[i].tel , pc->data[i].addr); }}
看到這里的 qsort 函數(shù)第一個參數(shù)是需要進行排序的數(shù)組名,第二個參數(shù)是數(shù)組的容量,即我們數(shù)組中的人數(shù),第三個參數(shù)是數(shù)組元素的大小,pc->data代表整個數(shù)組,pc->data[0]代表的就是數(shù)組的第一個元素,利用 sizeof 即可計算出來數(shù)組元素的大?。▎挝唬鹤止?jié)),最后一個參數(shù)是我們自定義比較函數(shù)的函數(shù)名。比較函數(shù)中,由于qsort函數(shù)對任意類型的元素都可以進行排序,所以里面參數(shù)的類型采用的都是 void* 類型(void*類型可以接收任意類型的指針),在比較的時候強制轉(zhuǎn)換我們需要比較的數(shù)據(jù)類型即可,由于這里需要通過名字進行比較,所以這里用到 strcmp 函數(shù)進行比較,如果相等返回 0 ,相異返回 -1/1。排序后循環(huán)打印出來排序后的通訊錄即可。
⑦.功能零:退出通訊錄并銷毀通訊錄
void destorycontact(struct contact* pc){ free(pc->data); pc->data = NULL; pc->sz = 0; pc->capacity = 0;}
這里把剛剛給 pc 所指向的data開辟的空間釋放掉這里用到了 free 函數(shù)即釋放我們剛剛動態(tài)開辟的空間,然后把 pc->data 指針置空,最后清空通訊錄的人數(shù)和總?cè)萘考纯桑C上就完成通訊錄的退出與銷毀。
①.信息錄入 + 通訊錄增容
②.刪除聯(lián)系人 + 展示
③.查找指定聯(lián)系人
④.修改指定聯(lián)系人 + 展示
⑤.按名字排序(按照字符的assic碼值進行比較的)
⑥.退出通訊錄
①.contact.h(所需頭文件,函數(shù)聲明,宏的定義)
#pragma once#include #include #include #define namemax 20#define sexmax 5#define telemax 12#define addrmax 30#define size 3struct PeoInfo//定義一個聯(lián)系人基本信息{ char name[namemax]; int age; char sex[sexmax]; char tel[telemax]; char addr[addrmax];};//這三個信息組成我們的通訊錄struct contact{ struct PeoInfo* data; int sz ;//目前通訊錄有幾個 int capacity;//通訊錄的總?cè)萘縸;//函數(shù)聲明//初始化通訊錄void initcontact(struct contact* pc);//增加聯(lián)系人void addcontact(struct contact* pc);//展示通訊錄void showcontact(struct contact* pc);//刪除指定聯(lián)系人void delcontact(struct contact* pc);//查找指定聯(lián)系人void searchcontact(struct contact* pc);//修改指定聯(lián)系人void modifycontact(struct contact* pc);//按名字進行排序void sortcontact(struct contact* pc);//銷毀通訊錄void destorycontact(struct contact* pc);
這里的是函數(shù)聲明:
②.test.c(測試函數(shù))
#pragma warning(disable : 4996)#include "contact.h"void menu(){ printf("**************************************/n"); printf("* 1.添加聯(lián)系人 2.刪除聯(lián)系人 */n"); printf("* 3.查找聯(lián)系人 4.修改聯(lián)系人 */n"); printf("* 5.展示通訊錄 6.按名字排序 */n"); printf("* 0.退出 */n"); printf("**************************************/n");}enum OPTION{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; struct contact con;//創(chuàng)建一個通訊錄con變量 initcontact(&con);//初始化通訊錄 do { menu(); printf("請選擇通訊錄功能>"); scanf("%d", &input); switch (input) { case ADD: addcontact(&con); break; case DEL: delcontact(&con); break; case SEARCH: searchcontact(&con); break; case MODIFY: modifycontact(&con); break; case SHOW: showcontact(&con); break; case SORT: sortcontact(&con); break; case EXIT: destorycontact(&con); printf("退出通訊錄/n"); break; } } while (input); return 0;}
③.contact.c(功能函數(shù)的編寫)
#pragma warning(disable : 4996)#include "contact.h"void initcontact(struct contact* pc){ pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));//動態(tài)分配給data一塊內(nèi)存 pc->sz = 0;//初始化時通訊錄沒人 pc->capacity = size;//假設一開始的通訊錄容量為3后面不夠用隨時增容}void addcontact(struct contact* pc){ //如果通訊錄滿了 if (pc->sz == pc->capacity) { //增容 struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo)); if (ptr != NULL) { pc->data = ptr; pc->capacity += 2; printf("通訊錄增容成功/n"); } else { 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].tel); printf("請輸入新增聯(lián)系人的地址>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++;}void showcontact(struct contact* pc){ printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[i].name , pc->data[i].age , pc->data[i].sex , pc->data[i].tel , pc->data[i].addr); }}int Findname(char* name, struct contact* pc){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; } } return -1;}void delcontact(struct contact* pc){ if (pc->sz == 0) { printf("通訊錄為空無法刪除/n"); return; } char name[namemax] = { 0 }; printf("請您輸入想要刪除的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { int j = 0; for (j = pos; j < pc->sz; j++) { pc->data[j] = pc->data[j + 1];//所有消息都進行交換 } pc->sz--; printf("該聯(lián)系人刪除成功/n"); }}void searchcontact(struct contact* pc){ char name[namemax] = { 0 }; printf("請您輸入想要查找的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[pos].name , pc->data[pos].age , pc->data[pos].sex , pc->data[pos].tel , pc->data[pos].addr); }}void modifycontact(struct contact* pc){ char name[namemax] = { 0 }; printf("請您輸入想要修改的聯(lián)系人姓名>"); scanf("%s", name); int pos = Findname(name, pc); if (pos == -1) { printf("沒找到此聯(lián)系人/n"); } else { 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].tel); printf("請輸入修改聯(lián)系人的地址>"); scanf("%s", pc->data[pos].addr); printf("該聯(lián)系人信息修改成功!!!/n"); }}int cmp_byname(const void* e1, const void* e2){ return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);}void sortcontact(struct contact* pc){ qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_byname); printf("%-15s/t%5s/t%8s/t%15s/t%30s/t/n/n", "姓名", "年齡", "性別", "電話", "地址"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-15s/t%5d/t%8s/t%15s/t%30s/t/n" , pc->data[i].name , pc->data[i].age , pc->data[i].sex , pc->data[i].tel , pc->data[i].addr); }}void destorycontact(struct contact* pc){ free(pc->data); pc->data = NULL; pc->sz = 0; pc->capacity = 0;}
這就是簡單通訊錄的實現(xiàn),對C語言很多的知識進行了全面的應用,后面還會對通訊錄實現(xiàn)文件的版本,還請持續(xù)關注,如果本篇文章存在問題請及時聯(lián)系博主,或者評論區(qū)下方留言,謝謝大家的支持??!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/121278.html
摘要:之前的通訊錄在程序退出后內(nèi)部的數(shù)據(jù)就會消失,再次打開程序后只能重新輸入數(shù)據(jù),為此我們增加了一個保存功能來保存信息。 前言: 由于之前實現(xiàn)的通訊錄在存儲方面只能支持靜態(tài)的1000人的存儲量,但是如果聯(lián)系人較少,則會造成較大的內(nèi)存浪費。而當聯(lián)系人一旦超過1000時,就不能再繼續(xù)存儲信息了。因...
摘要:那么我們首先來改造儲存空間也就是通訊錄結(jié)構(gòu)體靜態(tài)版本人信息存放在數(shù)組中統(tǒng)計存放的人數(shù)動態(tài)版本統(tǒng)計存放的人數(shù)有效容量我們將原本的結(jié)構(gòu)體數(shù)組改為一個結(jié)構(gòu)體指針,以此來維護用以儲存?zhèn)€人信息的空間。 上一期我們編寫了一個C語言版本的簡易通訊錄,但是我們的之前的通訊錄是沒有記憶功能的,也就是說,一旦關...
摘要:本篇文章將用語言代碼實現(xiàn)一個通訊錄管理系統(tǒng),本片文章博主將會運用到架構(gòu)提,枚舉,動態(tài)內(nèi)存開辟和文件操作等。這里存放數(shù)據(jù)的結(jié)構(gòu)是線性表。這個指針就可以通過動態(tài)開辟內(nèi)存來調(diào)整存放信息的大小。擴容成功這樣就實現(xiàn)了檢查通訊錄是否需要擴容的函數(shù)。 ...
摘要:導航前言功能函數(shù)結(jié)構(gòu)設定菜單交互主函數(shù)通訊錄初始化新增聯(lián)系人查找聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查看所有聯(lián)系人清空所有聯(lián)系人以名字排序所有聯(lián)系人結(jié)尾語前言本文將實現(xiàn)一個簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。 ...
摘要:通訊錄程序存放聯(lián)系人信息信息名字年齡性別電話住址增加聯(lián)系人刪除聯(lián)系人查找聯(lián)系人修改聯(lián)系人排序源文件代碼如下創(chuàng)建一個枚舉類型,分別對應菜單選項創(chuàng)建一個通訊錄初始化通訊錄最多可以放個聯(lián)系 ...
閱讀 3342·2021-11-24 10:43
閱讀 4302·2021-11-24 10:33
閱讀 3889·2021-11-22 09:34
閱讀 2202·2021-10-11 10:58
閱讀 3864·2021-10-11 10:58
閱讀 947·2021-09-27 13:36
閱讀 3724·2019-08-30 15:54
閱讀 3052·2019-08-29 18:41