<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
目標:通訊錄可以存放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("%-10st%-5dt%-5st%-15st%-20sn", 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("%-10st%-5dt%-5st%-15st%-20sn", 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"
#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); }
//宣告 #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);
#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("%-10st%-5dt%-5st%-15st%-20sn", 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("%-10st%-5dt%-5st%-15st%-20sn", 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語言 簡易通訊錄內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45