C語言實(shí)現(xiàn)簡易通訊錄完整流程
目標(biāo):通訊錄可以存放1000個(gè)人信息,人的信息:性別名字年齡電話住址 菜單打印
1.增加聯(lián)系人
2.刪除聯(lián)系人
3.查找聯(lián)系人(修改)
4.名字排序聯(lián)系人
5.展示
6.清空
分析:
首先通訊錄存放聯(lián)系人信息,還需知曉聯(lián)系人個(gè)數(shù),因此是個(gè)結(jié)構(gòu)體類型
其次人的信息類型多,因此每個(gè)聯(lián)系人也應(yīng)為結(jié)構(gòu)體類型
說明:
每個(gè)標(biāo)題下展示的代碼順序:test.c (主函數(shù)測試運(yùn)行)? ->? contact.h? (功能函數(shù)聲明)?->? contact.c? (功能函數(shù)實(shí)現(xiàn))
菜單打?。?/h2>
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:
//顯示聯(lián)系人信息
break;
case 6:
//清空聯(lián)系人
break;
case 0:
//退出通訊錄
break;
dafault:
break;
}
} while (input);
}
枚舉優(yōu)化:
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: //顯示聯(lián)系人信息 break; case 6: //清空聯(lián)系人 break; case 0: //退出通訊錄 break; dafault: break; } } while (input); }
上述菜單可以用枚舉對(duì)代碼可讀性進(jìn)行優(yōu)化,改進(jìn)如下:
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: //顯示聯(lián)系人信息 break; case Clear: //清空聯(lián)系人 break; case Exit: //退出通訊錄 break; dafault: break; } } while (input); }
定義結(jié)構(gòu)體?
#define Max 1000 #define name_Max 20 #define sex_Max 5 #define addr_Max 30 #define phone_Max 12 //結(jié)構(gòu)體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結(jié)構(gòu)體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數(shù)據(jù) int sz; //通訊錄中有效信息的個(gè)數(shù)(里面有幾個(gè)人) }Contact;
初始化
//完善菜單主函數(shù)部分 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)); //將數(shù)組初始化為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); //增加的信息應(yīng)該在原有效信息位置后,用pc->sz指向?qū)?yīng)位置 printf("請輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個(gè)變量,注意需要取地址 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++; //元素個(gè)數(shù)加一 printf("添加成功\n"); }
這里要注意通訊錄已滿的情況,并且添加信息時(shí)要注意是在原有效信息后得地址開始添加,防止重復(fù)。
刪除信息?
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("請輸入要?jiǎng)h除人的名字:"); scanf("%s",name); //實(shí)現(xiàn)查找函數(shù) int pos=FindByname(pc,name); //若找到返回下標(biāo),找不到則返回-1 if (pos==-1) { printf("無此人\n"); } else { //刪除--要?jiǎng)h除元素后面的元素依次向前覆蓋 int j = 0; for (j = pos;j<pc->sz-1;j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; printf("刪除成功\n"); } }
這里要注意一個(gè)查找函數(shù),輸入名字來查找聯(liá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); //找到后可以將內(nèi)容展現(xiàn)出來 printf("找著了\n請選擇是否修改:1.是 0.否\n"); scanf("%d",&put); if (1 == put) { Modify(pc->data,i); } return i; } } printf("沒找到\n"); return -1; }
這里我將第二項(xiàng)刪除功能的查找函數(shù)進(jìn)行聲明使用,并且將修改函數(shù)加入到查找函數(shù)中,兩個(gè)功能聯(lián)合到一起,但是在使用刪除功能的時(shí)候會(huì)出現(xiàn)重復(fù),這里要注意。
修改函數(shù)如下:
//修改 void Modify(Contact* pc,int i) { int bud = 0; do { printf("請選擇需要修改的內(nèi)容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請輸入內(nèi)容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); }
修改用到了字符串函數(shù)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函數(shù)來進(jìn)行。排序后調(diào)用展示函數(shù)進(jìn)行打印,來觀察排序效果。
展示信息?
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); //加負(fù)號(hào)左對(duì)齊,加/t統(tǒng)一每個(gè)元素間的距離 } }
清空聯(lián)系人?
case Clear: ClearContact(&con); break; //清空所有聯(lián)系人 void ClearContact(Contact* pc); //清空所有聯(lián)系人 void ClearContact(Contact* pc) { InitContact(pc); }
清空聯(lián)系人,相當(dāng)于再進(jìn)行一遍初始化通訊錄。
頭文件統(tǒng)一在contact.h里面包含:
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h>
?test.c 和 contact.c 統(tǒng)一引用頭文件 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 //結(jié)構(gòu)體人的信息 typedef struct Peoinfo { char name[name_Max]; int age; char sex[sex_Max]; char addr[addr_Max]; char phone[phone_Max]; }Peoinfo; //結(jié)構(gòu)體通訊錄的信息 typedef struct Contact { Peoinfo data[1000]; //存放數(shù)據(jù) int sz; //通訊錄中有效信息的個(gè)數(shù)(里面有幾個(gè)人) }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); //清空所有聯(lián)系人 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)); //將數(shù)組初始化為0 } //增加信息 void AddContact(Contact* pc) { assert(pc); if (pc->sz==Max) { printf("通訊錄滿了,無法添加\n"); return 0; } //輸入信息 printf("請輸入名字:"); scanf("%s",pc->data[pc->sz].name); //增加的信息應(yīng)該在原有效信息位置后,用pc->sz指向?qū)?yīng)位置 printf("請輸入年齡:"); scanf("%d", &(pc->data[pc->sz].age)); //age是個(gè)變量,注意需要取地址 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++; //元素個(gè)數(shù)加一 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); //加負(fù)號(hào)左對(duì)齊,加/t統(tǒng)一每個(gè)元素間的距離 } } 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("請輸入要?jiǎng)h除人的名字:"); scanf("%s",name); //實(shí)現(xiàn)查找函數(shù) int pos=FindByname(pc,name); //若找到返回下標(biāo),找不到則返回-1 if (pos==-1) { printf("無此人\n"); } else { //刪除--要?jiǎng)h除元素后面的元素依次向前覆蓋 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("請選擇需要修改的內(nèi)容\n1.名字 2.年齡 3.性別 4.地址 5.電話 0.取消\n請輸入:"); scanf("%d", &bud); switch (bud) { char chars[30] = { 0 }; case 1: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].name , chars); } break; case 2: { int num = 0; printf("請輸入內(nèi)容->"); scanf("%d", &num); pc->data[i].age = num; } break; case 3: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].sex , chars); } break; case 4: printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].addr , chars); break; case 5: { printf("請輸入內(nèi)容->"); scanf("%s", chars); strcpy(pc->data[i].phone , chars); } break; dafault: break; } } while (bud); } //清空所有聯(lián)系人 void ClearContact(Contact* pc) { InitContact(pc); }
到此這篇關(guān)于C語言實(shí)現(xiàn)簡易通訊錄完整流程的文章就介紹到這了,更多相關(guān)C語言 簡易通訊錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++類中隱藏的幾個(gè)默認(rèn)函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C++類中隱藏的幾個(gè)默認(rèn)函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
本文主要介紹了C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08通過一個(gè)小例子來簡單理解C語言中的內(nèi)存空間管理
這篇文章主要介紹了通過一個(gè)小例子來簡單理解C語言中的內(nèi)存空間管理,涉及到堆和棧等數(shù)據(jù)結(jié)構(gòu)的基本知識(shí),需要的朋友可以參考下2015-11-11C語言光標(biāo)旋轉(zhuǎn)與倒計(jì)時(shí)功能實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了C語言實(shí)現(xiàn)光標(biāo)旋轉(zhuǎn)與倒計(jì)時(shí)功能的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11