摘要:導航前言功能函數結構設定菜單交互主函數通訊錄初始化新增聯系人查找聯系人刪除聯系人修改聯系人查看所有聯系人清空所有聯系人以名字排序所有聯系人結尾語前言本文將實現一個簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。
本文將實現一個簡易的電話簿管理。
通訊錄可以用來存儲1000個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址。
電話簿要實現功能如下
- 添加聯系人信息
- 刪除指定聯系人信息
- 查找指定聯系人信息
- 修改指定聯系人信息
- 顯示所有聯系人信息
- 清空所有聯系人
- 以名字排序所有聯系人
本文主要以信息存儲在靜態數組里面分析,并且會在文末增加動態版本。
我們存儲的信息是復雜的,這需要結構體來描述。
信息包括名字,性別,電話號碼,年齡,住址。
#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 20#define ADDR_MAX 30struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};
對于功能選擇可以考慮枚舉常量解決
enum Option{ EXIT,//0 ADD,//1 DEL,//2 SEARCH,//3 MODIFY,//4 SHOW,//5 SORT//6};
通訊錄最多有1000人。
#define MAX 1000struct Contact{ struct PeoInfo date[MAX]; int sz;};
void menu(){ 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");}
int main(){ int input = 0; struct Contact 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 EXIT: //銷毀通訊錄 DestroyContact(&con); printf("退出通訊錄/n"); break; default: printf("選擇錯誤/n"); break; } } while (input); return 0;}
void Initcontact(struct Contact* pc){ pc->sz = 0; memset(pc->date, 0, MAX * sizeof(struct PeoInfo));}
void AddContact(struct Contact* pc){ struct PeoInfo tmp = { 0 }; if (pc->sz == MAX){ printf("通訊錄已滿1000人"); } else{ printf("請輸入名字:>"); scanf("%s", tmp.name); printf("請輸入年齡:>"); scanf("%d", tmp.age)); printf("請輸入性別:>"); scanf("%s", tmp.sex); printf("請輸入電話:>"); scanf("%s", tmp.tele); printf("請輸入地址:>"); scanf("%s", tmp.addr); pc->data[pc->sz] = tmp; printf("添加成功!"); pc->sz++; }}
?需要注意的是
- 需要判斷通訊錄有沒有滿,如果滿人則不能再添加
- 我們用sz來記錄最后一個成員
int FindContactByName(struct Contact* pc, char name[]){ int i = 0; for (i = 0; i < pc->sz; i++){ if (strcmp(pc->data[i].name, name) == 0){ return i; } } return -1;}
- 我們常見的聯系人查找中,有通過名字或者通過電話號碼查找,這里提供名字查找后返回數組下標的函數
- 這里通過字符串比較函數strcmp來比較名字是否相同
void SearchContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("請輸入要查找人的名字:>"); scanf("%s", name); int pos= FindContactByName(pc, name); if (-1 == pos) { printf("查無此人"); } else { printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "姓名", "年齡", "性別", "電話", "地址"); printf("%15s/t%5s/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}
找到了就返回信息,沒有找到就輸出查無此人
void DelContact(struct Contact* pc){ if (pc->sz == 0){ printf("通訊錄為空,無法刪除/n"); } char name[NAME_MAX] = { 0 }; printf("請輸入要刪除人的名字"); scanf_s("%s", name); int pos=FindContactByName(pc,name);//按照名字去查找,找到了就返回下標,未找到就返回-1 if (pos == -1){ printf("指定聯系人不存在/n"); } else{ int j = 0; for (j = pos; j < pc->sz-1; j++){ pc->data[j] = pc->data[j + 1]; } pc->sz--; printf("刪除成功!/n"); }}
- 執行刪除操作需要判斷是不是為空,如果是空的,那肯定不能再刪除
- 找到后執行刪除操作就是將后面信息往前覆蓋,并且sz要減去1
- 沒找到就要輸出刪除聯系人不存在
void ModifyContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("請輸入要修改人的名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) { printf("要修改的人不存在/n"); } else { printf("請輸入新的名字:>"); scanf("%s", pc->data[pos].name);//選擇放在下標為sz的data里面 printf("請輸入新的年齡:>"); scanf("%d", &(pc->data[pos].age)); printf("請輸入新的性別:>"); scanf("%s", pc->data[pos].sex); printf("請輸入新的電話:>"); scanf("%s", pc->data[pos].tele); printf("請輸入新的地址:>"); scanf("%s", pc->data[pos].addr); }}
- 找到聯系人進行修改
void ShowContact(struct Contact* pc){ int i = 0; printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "姓名", "年齡", "性別", "電話", "地址");//打印標題 for (i = 0; i < pc->sz; i++){ printf("%15s/t%5s/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}
void EmptyContact(struct Contact* pc){ pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoInfo));}
int CmpByname(const char* s1, const char* s2) { return strcmp(s1, s2);}void SortContact(struct Contact* pc) { qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByname); printf("排序完畢,請執行查看操作");}
- 這里采用的是C語言庫函數qsort
- cmpbyname為自定義函數
本電話簿不足之處
- 電話簿人數固定為1000人,后續開辟動態版本
- 信息保存再主存中,關閉程序或者斷電信息就會消失,后續增加文件保存函數,將信息保存在硬盤中
如有不足之處,歡迎指正!
源代碼下載
?源代碼下載鏈接
?
??下一篇:realloc實現動態電話簿?
?
?歡迎關注?點贊?收藏??留言?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121535.html
小編寫這篇文章的主要目的,主要介紹的是關于Python socket的相關知識,介紹的內容主要是涉及到編程的一些事情,以此用來進行搭建簡易的網絡聊天室,來實現相關的遠程聊天,這其實就是聊天工具的初始原型,下面就具體的內容給大家詳細解答下。 在這個周末剛剛寫出來的python桌面應用--網絡聊天室,主要通過pyqt5作為桌面應用框架,socket作為網絡編程的框架,從而實現包括客戶端和服務端的...
javascript實現純前端將數據導出excel是有兩種方式,現在就為大家介紹: 方法一 將table標簽,包括tr、td等對json數據進行拼接,直接在table的表格上體現出,但此方法的弊端在于輸出的是偽excel,即使是生成xls為后綴的文件,可文件形式上還是html, 代碼如下: <html> <head> <pstyle="f...
小編寫這篇文章的一個主要目的,主要是利用Python去制作截圖工具,當然,這個截圖工具是比較的簡易的,那么,具體的一個制作步驟是什么呢?下面就給大家詳細解答下。 這是工作期間同事想要個截完圖之后可以顯示并且永遠前置的截圖小工具(即不會被其他程序覆蓋)直接上代碼: ##-*-coding:utf-8-*- importtkinterastk importpyautogui imp...
此篇文章通常是詳細介紹了pyecharts結合flask架構,通常是詳細介紹怎樣在Flask架構使得用pyecharts,文中根據實例編碼為大家介紹得非常詳盡,需用的小伙伴可以參考一下 詳細介紹 文中通常是詳細介紹怎樣在Flask架構使得用pyecharts,有關Flask架構應用這兒不去做詳細詳細說明~ Flask模版3D渲染 首先要建立一個flask項目,flask項目對目錄結構要...
閱讀 3568·2021-11-15 11:36
閱讀 1059·2021-11-11 16:55
閱讀 694·2021-10-20 13:47
閱讀 2993·2021-09-29 09:35
閱讀 3428·2021-09-08 10:45
閱讀 2553·2019-08-30 15:44
閱讀 848·2019-08-30 11:10
閱讀 1427·2019-08-29 13:43