C語言實現簡易通訊錄完整流程
目標:通訊錄可以存放1000個人信息,人的信息:性別名字年齡電話住址 菜單打印
1.增加聯系人
2.刪除聯系人
3.查找聯系人(修改)
4.名字排序聯系人
5.展示
6.清空
分析:
首先通訊錄存放聯系人信息,還需知曉聯系人個數,因此是個結構體類型
其次人的信息類型多,因此每個聯系人也應為結構體類型
說明:
每個標題下展示的代碼順序:test.c (主函數測試運行) -> contact.h (功能函數聲明) -> contact.c (功能函數實現)
菜單打印:
void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); printf("請選擇->"); scanf("%d",&input); switch (input) { case 1: //增加信息 break; case 2: //刪除 break; case 3: //查找(修改) break; case 4: //按名字排序 break; case 5: //顯示聯系人信息 break; case 6: //清空聯系人 break; case 0: //退出通訊錄 break; dafault: break; } } while (input); }
枚舉優化:
上述菜單可以用枚舉對代碼可讀性進行優化,改進如下:
enum Oprion { Exit, Add, Del, Serch, Sort, Show, Clear }; void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); printf("請選擇->"); scanf("%d",&input); switch (input) { case Add: //增加信息 break; case Del: //刪除 break; case Serch: //查找(修改) break; case Sort: //按名字排序 break; case Show: //顯示聯系人信息 break; case Clear: //清空聯系人 break; case Exit: //退出通訊錄 break; dafault: break; } } while (input); }
定義結構體
#define Max 1000 #define name_Max 20 #define sex_Max 5 #define addr_Max 30 #define phone_Max 12 //結構體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結構體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數據 int sz; //通訊錄中有效信息的個數(裡面有幾個人) }Contact;
初始化
//完善菜單主函數部分 int main() { int input = 0; Contact con;//通訊錄 InitContact(&con);//初始化通訊錄 do
//初始化通訊錄 void InitContact(Contact* pc); //初始化通訊錄 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data,0,sizeof(pc->data)); //將數組初始化為0 }
增加信息
case Add: //增加信息 AddContact(&con); break; //增加信息到通訊錄 void AddContact(Contact* pc); //增加信息 void AddContact(Contact* pc) { assert(pc); if (pc->sz==Max) { printf("通訊錄滿瞭,無法添加\n"); return 0; } //輸入信息 printf("請輸入名字:"); scanf("%s",pc->data[pc->sz].name); //增加的信息應該在原有效信息位置後,用pc->sz指向對應位置 printf("請輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個變量,註意需要取地址 printf("請輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請輸入地址:"); scanf("%s", pc->data[pc->sz].addr); printf("請輸入電話:"); scanf("%s", pc->data[pc->sz].phone); pc->sz++; //元素個數加一 printf("添加成功\n"); }
這裡要註意通訊錄已滿的情況,並且添加信息時要註意是在原有效信息後得地址開始添加,防止重復。
刪除信息
case Del: //刪除 DeletContact(&con); break; //刪除 void DeletContact(Contact* pc); int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { return i; } } printf("沒找到\n"); return -1; } //刪除信息 void DeletContact(Contact* pc) { char name[name_Max]; if (pc->sz == 0) { printf("通訊錄為空,無法刪除\n"); } printf("請輸入要刪除人的名字:"); scanf("%s",name); //實現查找函數 int pos=FindByname(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"); } }
這裡要註意一個查找函數,輸入名字來查找聯系人,找到才能刪除。
查找(修改)
case Serch: printf("請輸入要查找人的名字:"); scanf("%s", name); FindByname(&con,name); break; //查找 int FindByname(const Contact*pc, char name[]); int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { int put = 0; printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //找到後可以將內容展現出來 printf("找著瞭\n請選擇是否修改:1.是 0.否\n"); scanf("%d",&put); if (1 == put) { Modify(pc->data,i); } return i; } } printf("沒找到\n"); return -1; }
這裡我將第二項刪除功能的查找函數進行聲明使用,並且將修改函數加入到查找函數中,兩個功能聯合到一起,但是在使用刪除功能的時候會出現重復,這裡要註意。
修改函數如下:
//修改 void Modify(Contact* pc,int i) { int bud = 0; do { printf("請選擇需要修改的內容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請輸入內容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); }
修改用到瞭字符串函數strcpy
名字排序
case Sort: Sortname(&con); break; //名字排序 void Sortname(Contact* pc); //name排序 int cmp_int(const void*e1,const void*e2) { return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name)); } void Sortname(Contact* pc) { qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int); ShowContact(pc); }
按名字排序這裡,我用到瞭快速排序qsort函數來進行。排序後調用展示函數進行打印,來觀察排序效果。
展示信息
case Show: //顯示 ShowContact(&con); break; //展示信息 void ShowContact(const Contact* pc); //展示信息 void ShowContact(const Contact* pc) { assert(pc); int i = 0; for (i = 0;i < pc->sz;i++) { printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //加負號左對齊,加/t統一每個元素間的距離 } }
清空聯系人
case Clear: ClearContact(&con); break; //清空所有聯系人 void ClearContact(Contact* pc); //清空所有聯系人 void ClearContact(Contact* pc) { InitContact(pc); }
清空聯系人,相當於再進行一遍初始化通訊錄。
頭文件統一在contact.h裡面包含:
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h>
test.c 和 contact.c 統一引用頭文件 contact.h
#include "contact.h"
總程序如下
test.c
#include "contact.h" enum Oprion { Exit, Add, Del, Serch, Sort, Show, Clear }; void menu() { printf("***************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.serch (modify) ***\n"); printf("*** 4.sort 5.show ***\n"); printf("*** 0.exit 6.clear ***\n"); printf("***************************\n"); } int main() { int input = 0; Contact con;//通訊錄 InitContact(&con);//初始化通訊錄 do { char name[name_Max]; menu(); printf("請選擇->"); scanf("%d",&input); switch (input) { case Add: //增加信息 AddContact(&con); break; case Del: //刪除 DeletContact(&con); break; case Serch: printf("請輸入要查找人的名字:"); scanf("%s", name); FindByname(&con,name); break; //case 4: // //修改 // Modify(&con); // break; case Sort: Sortname(&con); break; case Show: //顯示 ShowContact(&con); break; case Clear: ClearContact(&con); break; case Exit: printf("退出通訊錄\n"); break; dafault: break; } } while (input); }
contact.h
//聲明 #include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #define Max 1000 #define name_Max 20 #define sex_Max 5 #define addr_Max 30 #define phone_Max 12 //結構體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結構體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數據 int sz; //通訊錄中有效信息的個數(裡面有幾個人) }Contact; //初始化通訊錄 void InitContact(Contact* pc); //增加信息到通訊錄 void AddContact(Contact* pc); //展示信息 void ShowContact(const Contact* pc); //刪除 void DeletContact(Contact* pc); //查找 int FindByname(const Contact*pc, char name[]); //名字排序 void Sortname(Contact* pc); //修改 void Modify(Contact* pc, int i); //清空所有聯系人 void ClearContact(Contact* pc);
contact.c
#include "contact.h" //初始化通訊錄 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data,0,sizeof(pc->data)); //將數組初始化為0 } //增加信息 void AddContact(Contact* pc) { assert(pc); if (pc->sz==Max) { printf("通訊錄滿瞭,無法添加\n"); return 0; } //輸入信息 printf("請輸入名字:"); scanf("%s",pc->data[pc->sz].name); //增加的信息應該在原有效信息位置後,用pc->sz指向對應位置 printf("請輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個變量,註意需要取地址 printf("請輸入性別:"); scanf("%s", pc->data[pc->sz].sex); printf("請輸入地址:"); scanf("%s", pc->data[pc->sz].addr); printf("請輸入電話:"); scanf("%s", pc->data[pc->sz].phone); pc->sz++; //元素個數加一 printf("添加成功\n"); } //展示信息 void ShowContact(const Contact* pc) { assert(pc); int i = 0; for (i = 0;i < pc->sz;i++) { printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); //加負號左對齊,加/t統一每個元素間的距離 } } int FindByname(Contact*pc, char name[]) { int i = 0; for (i = 0;i<pc->sz;i++) { if (strcmp(pc->data[i].name, name)==0) { int put = 0; printf("%-10s\t%-5d\t%-5s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].phone); printf("找著瞭\n請選擇是否修改:1.是 0.否\n"); scanf("%d",&put); if (1 == put) { Modify(pc->data,i); } return i; } } printf("沒找到\n"); return -1; } //刪除信息 void DeletContact(Contact* pc) { char name[name_Max]; if (pc->sz == 0) { printf("通訊錄為空,無法刪除\n"); } printf("請輸入要刪除人的名字:"); scanf("%s",name); //實現查找函數 int pos=FindByname(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"); } } //name排序 int cmp_int(const void*e1,const void*e2) { return (strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name)); } void Sortname(Contact* pc) { qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_int); ShowContact(pc); } //修改 void Modify(Contact* pc,int i) { int bud = 0; do { printf("請選擇需要修改的內容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請輸入內容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請輸入內容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); } //清空所有聯系人 void ClearContact(Contact* pc) { InitContact(pc); }
到此這篇關於C語言實現簡易通訊錄完整流程的文章就介紹到這瞭,更多相關C語言 簡易通訊錄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!