C語(yǔ)言實(shí)現(xiàn)通訊錄的八種功能(添加、刪除、查找、修改、顯示、排序、退出、清空)
通訊錄功能概要及前提說(shuō)明
此通訊錄利用C語(yǔ)言完成,可以實(shí)現(xiàn)八種功能的通訊錄(添加、刪除、查找、修改、顯示、排序、退出、清空)
代碼由三部分組成,為什么要寫成三部分而不寫成一部分可以參考我以前的博客,如下:鏈接: link
1.通信錄具體功能
通訊錄可以用來(lái)存儲(chǔ)100個(gè)人的信息,每個(gè)人的信息包括:姓名、性別、年齡、電話、住址
提供方法:
1.添加聯(lián)系人信息
2.刪除指定聯(lián)系人信息
3.查找指定聯(lián)系人信息
4.修改指定聯(lián)系人信息
5.顯示所有聯(lián)系人信息
6.清空所有聯(lián)系人
7.以名字/年齡/地址排序所有聯(lián)系人
2.初始化菜單
void menu() { printf("*********************************************\n"); printf("*********************************************\n"); printf("*********************************************\n"); printf("*********1.添加 2.刪除*************\n"); printf("*********3.查找 4.修改*************\n"); printf("*********5.顯示 6.排序*************\n"); printf("*********7.退出 8.清空*************\n"); printf("*********************************************\n"); printf("*********************************************\n"); printf("*********************************************\n"); }
3.通訊錄存儲(chǔ)的信息
使用 typedef 將 struct peoinfo 類型自定義成 peoinfo 更加方邊后續(xù)使用。
利用宏定義設(shè)定各個(gè)參數(shù)的值,后續(xù)不需要再重新定義。
#define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 100//最大人數(shù) typedef struct peoinfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }peoinfo; typedef struct contact { peoinfo data[MAX]; int sz;//記錄當(dāng)前人的信息個(gè)數(shù) }contact;
其中,創(chuàng)建存放聯(lián)系人的通訊錄Contact,存放MAX個(gè)聯(lián)系人對(duì)應(yīng)的信息。sz用于記錄當(dāng)前儲(chǔ)存聯(lián)系人的數(shù)量。
4.通訊錄基本框架
enum option { add=1, del=2, search=3, modify, show, sort, run, clc }; int main() { int input = 0; contact con;//通訊錄 //初始化 initcontact(&con); do { menu(); printf("請(qǐng)輸入功能:"); 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 run: printf("退出通訊錄\n"); break; case clc: clccontact(&con); break; default: printf("輸入非法,請(qǐng)重新輸入!\n"); break; } } while (input != 7); return 0; }
我們知道case后只能加整數(shù),為了更加直觀的看到每一種功能,我們可以創(chuàng)建枚舉類型替換這些整數(shù),枚舉類型成員的值從0開(kāi)始遞增1,適用于代替case后的整數(shù),因?yàn)槲颐吹牟藛芜x項(xiàng)是從1到8,所以這里我們定義枚舉的第一個(gè)值為1,這樣后面就會(huì)默認(rèn)排序到8。
通訊錄運(yùn)行通過(guò)do-while實(shí)現(xiàn),內(nèi)部調(diào)用menu函數(shù)打印開(kāi)始菜單,然后提示用戶選擇功能。
5.各個(gè)部分功能模塊聲明
void initcontact(contact* pc); void addcontact(contact* pc); void showcontact(contact* pc); void delcontact(contact* pc); void searchcontact(contact* pc); void modifycontact(contact* pc); void sortcontact(contact* pc); void clccontact(contact* pc);
代碼的基本框架搭建完畢,我們就要實(shí)現(xiàn)每一個(gè)選項(xiàng)的功能。這里是定義每一個(gè)功能的頭文件,聲明后才能在別的原文件中使用。
6.初始化模塊
void initcontact(contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); }
給定的代碼是一個(gè)函數(shù)initcontact,它用于初始化一個(gè)名為contact的結(jié)構(gòu)體指針pc。以下是對(duì)代碼的分析:
①函數(shù)聲明:void initcontact(contact* pc)
聲明了一個(gè)名為initcontact的函數(shù),它接受一個(gè)結(jié)構(gòu)體指針pc作為參數(shù),并且沒(méi)有返回值(即返回類型為void)。
②斷言:assert(pc) 斷言確保pc指針不為空。如果pc為空,斷言將失敗,并導(dǎo)致程序終止。
③初始化:pc->sz = 0 將結(jié)構(gòu)體指針pc的成員變量sz的值設(shè)置為0。這意味著將sz用作計(jì)數(shù)器或存儲(chǔ)元素?cái)?shù)量的變量。
④內(nèi)存清零:memset(pc->data, 0, sizeof(pc->data))
使用memset函數(shù)將結(jié)構(gòu)體指針pc的成員變量data的內(nèi)存塊清零。sizeof(pc->data)用于確定pc->data成員的大小,以確保清零操作覆蓋整個(gè)內(nèi)存塊。
⑤通過(guò)這些操作,函數(shù)initcontact將結(jié)構(gòu)體指針pc所指向的contact結(jié)構(gòu)體進(jìn)行初始化。初始化的結(jié)果是將sz設(shè)置為0,并將data的內(nèi)存塊清零。
7.增加聯(lián)系人模塊
void addcontact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通訊錄已滿\n"); return; } //增加信息 printf("請(qǐng)輸入名字:"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("通訊錄已添加\n"); Sleep(2000); }
該代碼定義了一個(gè)名為addcontact的函數(shù),函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
①函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
②然后判斷通訊錄的當(dāng)前大小是否達(dá)到了最大值(MAX),如果達(dá)到了最大值則打印提示信息并返回。
③如果通訊錄未滿,則依次輸入聯(lián)系人的姓名、年齡、性別、電話和地址,并將這些信息保存到通訊錄中。
④ 最后,將通訊錄的大小加1,并打印添加成功的提示信息。使用Sleep函數(shù)暫停程序執(zhí)行2秒后再?gòu)棾霾藛卫^續(xù)選擇。使使用者方便觀察。
8.顯示通訊錄模塊
void showcontact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通訊錄為空\(chéng)n"); return; } int i = 0; printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } Sleep(2000); }
該代碼定義了一個(gè)名為showcontact的函數(shù),函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
①函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
②然后判斷通訊錄的大小是否為0,如果為0則打印提示信息并返回。
③接下來(lái),使用一個(gè)循環(huán)遍歷通訊錄中的每個(gè)聯(lián)系人,并依次打印其姓名、年齡、性別、電話和地址。
④ 最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。
需要注意的是,該代碼依賴于一些未給出的頭文件和結(jié)構(gòu)體定義,例如contact結(jié)構(gòu)體的定義。另外,該代碼使用了格式化輸出函數(shù)printf,其中使用了%-10s、%-5d等格式控制符,用于設(shè)置輸出字段的寬度和對(duì)齊方式。
9.刪除用戶模塊
int findname(contact* pc, char name[]) { assert(pc); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return 1; } } return -1; } void delcontact(contact* pc) { char name[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } printf("輸入要?jiǎng)h除人的名字:"); scanf("%s", name); int ret = findname(pc,name); if (ret == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; for (i = ret; i <pc->sz-1 ; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); Sleep(2000); }
該代碼定義了兩個(gè)函數(shù):findname和delcontact。
findname函數(shù)用于在通訊錄中查找指定姓名的聯(lián)系人,函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc和一個(gè)字符數(shù)組name。
①函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
②然后使用一個(gè)循環(huán)遍歷通訊錄中的每個(gè)聯(lián)系人,通過(guò)strcmp函數(shù)比較聯(lián)系人的姓名是否與指定的name相等。如果相等,則返回1表示找到了該聯(lián)系人。
③如果遍歷完整個(gè)通訊錄都沒(méi)有找到匹配的姓名,則返回-1表示未找到。
④delcontact函數(shù)用于從通訊錄中刪除指定姓名的聯(lián)系人,函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
⑤函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
⑥然后判斷通訊錄的大小是否為0,如果為0則打印提示信息并返回。
⑦接下來(lái),依次輸入要?jiǎng)h除的聯(lián)系人的姓名,并調(diào)用findname函數(shù)查找該聯(lián)系人是否存在。如果不存在,則打印提示信息并返回。
⑧如果存在,使用一個(gè)循環(huán)從找到的位置開(kāi)始,將后面的聯(lián)系人逐個(gè)往前移動(dòng)一位,實(shí)現(xiàn)刪除該聯(lián)系人的功能。
⑨最后,將通訊錄的大小減1,并打印刪除成功的提示信息。使用Sleep函數(shù)暫停程序執(zhí)行2秒。
10.查找用戶模塊
void searchcontact(contact* pc) { char name[NAME_MAX]; assert(pc); printf("請(qǐng)輸入要查找人的姓名:"); scanf("%s", name); int ret = findname(pc, name); if (ret == -1) { printf("要查找的人不存在\n"); return; } printf("查詢成功!!\n"); printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); Sleep(2000); }
該代碼定義了一個(gè)名為searchcontact的函數(shù),函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
①函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
②然后輸入要查找的聯(lián)系人的姓名。
③接下來(lái),調(diào)用findname函數(shù)查找該姓名的聯(lián)系人在通訊錄中的位置。如果返回值為-1,則打印提示信息并返回。
④如果返回值不為-1,表示找到了該聯(lián)系人,打印查詢成功的提示信息。
⑤然后,使用printf函數(shù)按照一定的格式打印該聯(lián)系人的姓名、年齡、性別、電話和地址。
⑥最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。
11.修改用戶信息模塊
void modifycontact(contact* pc) { char name[NAME_MAX]; assert(pc); printf("請(qǐng)輸入要查找人的姓名:"); scanf("%s", name); int ret = findname(pc, name); if (ret == -1) { printf("要修改的人不存在\n"); return; } printf("請(qǐng)輸入名字:"); scanf("%s", pc->data[ret].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[ret].age)); printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[ret].sex); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[ret].tele); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[ret].addr); printf("修改成功!\n"); }
該代碼定義了一個(gè)名為modifycontact的函數(shù),函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
①函數(shù)首先使用assert函數(shù)進(jìn)行斷言,確保指針pc不為空。
②然后輸入要修改的聯(lián)系人的姓名。
③接下來(lái),調(diào)用findname函數(shù)查找該姓名的聯(lián)系人在通訊錄中的位置。如果返回值為-1,則打印提示信息并返回。
④如果返回值不為-1,表示找到了該聯(lián)系人,依次輸入要修改的聯(lián)系人的姓名、年齡、性別、電話和地址,并將這些信息更新到通訊錄中。
⑤最后,打印修改成功的提示信息。
12.排序用戶信息模塊
int cmp_name(const void* p1, const void* p2) { return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name); } int cmp_age(const void* p1, const void* p2) { return ((peoinfo*)p1)->age-((peoinfo*)p2)->age; } int cmp_addr(const void* p1, const void* p2) { return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr); } void sortcontact(contact* pc) { int i = 0; char sort_choose[10]; char sort_choose1[] = "name"; char sort_choose2[] = "age"; char sort_choose3[] = "addr"; A: printf("請(qǐng)輸入根據(jù)什么進(jìn)行排序:"); scanf("%s", sort_choose); if (strcmp(sort_choose,sort_choose1) == 0) { //利用qsort 函數(shù) qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name); } else if (strcmp(sort_choose,sort_choose2) == 0) { qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age); } else if (strcmp(sort_choose,sort_choose3) == 0) { qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr); } else { printf("無(wú)此排序參數(shù),請(qǐng)重新輸入?yún)?shù)\n"); goto A; } //打印列標(biāo)題 printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s%-5d%-5s%-12s%-30s\t\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } Sleep(2000); }
該代碼定義了三個(gè)比較函數(shù):cmp_name、cmp_age和cmp_addr。這些函數(shù)用于在排序通訊錄時(shí)比較聯(lián)系人信息的不同字段。
①cmp_name函數(shù)用于比較聯(lián)系人姓名的大小,函數(shù)參數(shù)為指向兩個(gè)聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過(guò)調(diào)用strcmp函數(shù)比較兩個(gè)聯(lián)系人的姓名,并返回比較結(jié)果。
② cmp_age函數(shù)用于比較聯(lián)系人年齡的大小,函數(shù)參數(shù)為指向兩個(gè)聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過(guò)將第一個(gè)聯(lián)系人的年齡減去第二個(gè)聯(lián)系人的年齡,并返回比較結(jié)果。
③cmp_addr函數(shù)用于比較聯(lián)系人地址的大小,函數(shù)參數(shù)為指向兩個(gè)聯(lián)系人信息結(jié)構(gòu)體的指針p1和p2。通過(guò)調(diào)用strcmp函數(shù)比較兩個(gè)聯(lián)系人的地址,并返回比較結(jié)果。
④sortcontact函數(shù)用于對(duì)通訊錄中的聯(lián)系人進(jìn)行排序,函數(shù)參數(shù)為一個(gè)指向contact結(jié)構(gòu)體的指針pc。
⑤函數(shù)首先定義一些變量和字符串?dāng)?shù)組用于接收用戶輸入的排序參數(shù)。
⑥然后,通過(guò)標(biāo)簽A實(shí)現(xiàn)一個(gè)循環(huán),提示用戶輸入根據(jù)什么進(jìn)行排序。根據(jù)用戶的輸入,分別調(diào)用qsort函數(shù)進(jìn)行排序。排序時(shí),根據(jù)用戶的選擇調(diào)用不同的比較函數(shù)。
⑦如果用戶輸入的排序參數(shù)無(wú)效,則打印提示信息并跳轉(zhuǎn)回標(biāo)簽A,要求用戶重新輸入。
⑧排序完成后,先打印列標(biāo)題,然后依次打印排序后的聯(lián)系人信息。
⑨最后,使用Sleep函數(shù)暫停程序執(zhí)行2秒。
13.清除模塊
void clccontact(contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); printf("通訊錄已經(jīng)清空?。?!\n"); Sleep(2000); }
此代碼實(shí)現(xiàn)了一個(gè)清空通訊錄的函數(shù)。(即和初始化模塊一樣)函數(shù)接收一個(gè)指向聯(lián)系人結(jié)構(gòu)體的指針,將通訊錄結(jié)構(gòu)體中的數(shù)據(jù)清空,包括sz(通訊錄中已有聯(lián)系人數(shù)量)和data(存放聯(lián)系人信息的數(shù)組)。最后輸出提示信息“通訊錄已經(jīng)清空?。?!”并延時(shí)2秒。
此代碼的功能比較簡(jiǎn)單,只是清空通訊錄??梢宰鳛橥ㄓ嶄浌芾硐到y(tǒng)的一個(gè)基本操作函數(shù)之一。
14.完整源代碼
test.c如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "adressbook.h" void menu() { printf("*********************************************\n"); printf("*********************************************\n"); printf("*********************************************\n"); printf("*********1.添加 2.刪除*************\n"); printf("*********3.查找 4.修改*************\n"); printf("*********5.顯示 6.排序*************\n"); printf("*********7.退出 8.清空*************\n"); printf("*********************************************\n"); printf("*********************************************\n"); printf("*********************************************\n"); } enum option { add=1, del=2, search=3, modify, show, sort, run, clc }; int main() { int input = 0; contact con;//通訊錄 //初始化 initcontact(&con); do { menu(); printf("請(qǐng)輸入功能:"); 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 run: printf("退出通訊錄\n"); break; case clc: clccontact(&con); break; default: printf("輸入非法,請(qǐng)重新輸入!\n"); break; } } while (input != 7); return 0; }
addressbook.c如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include "adressbook.h" void initcontact(contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void addcontact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通訊錄已滿\n"); return; } //增加信息 printf("請(qǐng)輸入名字:"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("通訊錄已添加\n"); Sleep(2000); } void showcontact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通訊錄為空\(chéng)n"); return; } int i = 0; printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } Sleep(2000); } int findname(contact* pc, char name[]) { assert(pc); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return 1; } } return -1; } void delcontact(contact* pc) { char name[NAME_MAX]; assert(pc); if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } printf("輸入要?jiǎng)h除人的名字:"); scanf("%s", name); int ret = findname(pc,name); if (ret == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; for (i = ret; i <pc->sz-1 ; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); Sleep(2000); } void searchcontact(contact* pc) { char name[NAME_MAX]; assert(pc); printf("請(qǐng)輸入要查找人的姓名:"); scanf("%s", name); int ret = findname(pc, name); if (ret == -1) { printf("要查找的人不存在\n"); return; } printf("查詢成功!!\n"); printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr); Sleep(2000); } void modifycontact(contact* pc) { char name[NAME_MAX]; assert(pc); printf("請(qǐng)輸入要查找人的姓名:"); scanf("%s", name); int ret = findname(pc, name); if (ret == -1) { printf("要修改的人不存在\n"); return; } printf("請(qǐng)輸入名字:"); scanf("%s", pc->data[ret].name); printf("請(qǐng)輸入年齡:"); scanf("%d", &(pc->data[ret].age)); printf("請(qǐng)輸入性別:"); scanf("%s", pc->data[ret].sex); printf("請(qǐng)輸入電話:"); scanf("%s", pc->data[ret].tele); printf("請(qǐng)輸入地址:"); scanf("%s", pc->data[ret].addr); printf("修改成功!\n"); } int cmp_name(const void* p1, const void* p2) { return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name); } int cmp_age(const void* p1, const void* p2) { return ((peoinfo*)p1)->age-((peoinfo*)p2)->age; } int cmp_addr(const void* p1, const void* p2) { return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr); } void sortcontact(contact* pc) { int i = 0; char sort_choose[10]; char sort_choose1[] = "name"; char sort_choose2[] = "age"; char sort_choose3[] = "addr"; A: printf("請(qǐng)輸入根據(jù)什么進(jìn)行排序:"); scanf("%s", sort_choose); if (strcmp(sort_choose,sort_choose1) == 0) { //利用qsort 函數(shù) qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name); } else if (strcmp(sort_choose,sort_choose2) == 0) { qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age); } else if (strcmp(sort_choose,sort_choose3) == 0) { qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr); } else { printf("無(wú)此排序參數(shù),請(qǐng)重新輸入?yún)?shù)\n"); goto A; } //打印列標(biāo)題 printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s%-5d%-5s%-12s%-30s\t\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } Sleep(2000); } void clccontact(contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); printf("通訊錄已經(jīng)清空?。。n"); Sleep(2000); }
addressbook.h如下:
#define _CRT_SECURE_NO_WARNINGS 1 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 100 #include <stdio.h> #include <assert.h> #include <string.h> #include <Windows.h> typedef struct peoinfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }peoinfo; typedef struct contact { peoinfo data[MAX]; int sz;//記錄當(dāng)前人的信息個(gè)數(shù) }contact; void initcontact(contact* pc); void addcontact(contact* pc); void showcontact(contact* pc); void delcontact(contact* pc); void searchcontact(contact* pc); void modifycontact(contact* pc); void sortcontact(contact* pc); void clccontact(contact* pc);
大家只需要將此代碼,按照文章開(kāi)頭設(shè)置為三部分,點(diǎn)擊運(yùn)行即可。
到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)通訊錄的八種功能(添加、刪除、查找、修改、顯示、排序、退出、清空)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置
這篇文章主要為大家介紹了Java C++ 算法題解leetcode1582二進(jìn)制矩陣特殊位置示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C++ 自增、自減運(yùn)算符的重載和性能分析小結(jié)
這篇文章主要介紹了C++ 自增、自減運(yùn)算符的重載和性能分析小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12