C語(yǔ)言實(shí)現(xiàn)靜態(tài)存儲(chǔ)通訊錄的示例代碼
最初的構(gòu)思與規(guī)劃
產(chǎn)品在制作之前一定要進(jìn)行一定的構(gòu)思,把要設(shè)計(jì)和實(shí)現(xiàn)的功能羅列出來(lái)。
所需要的功能
我們可以打開(kāi)手機(jī)通訊錄發(fā)現(xiàn)有很多聯(lián)系人都已經(jīng)按照拼音順序排列的整整齊齊,想要找名字便可以搜索他的名字,誰(shuí)更換號(hào)碼了可以進(jìn)行修改,把誰(shuí)拉黑了,就可以刪除信息,認(rèn)識(shí)新朋友可以添加他的號(hào)碼。這就包括了 增、刪、查、改、展示、排序等功能。
現(xiàn)在設(shè)計(jì)的通訊錄是靜態(tài)版本下的通訊錄,之后會(huì)教大家制作動(dòng)態(tài)版本和文件版本。
顯示菜單以及main函數(shù)
那么我們要制作一個(gè)菜單把以上功能都加入進(jìn)去。
//菜單 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"); }
有了慘淡我們當(dāng)然要讓他是可以用的,不能當(dāng)花瓶呀。那我們就要寫一下我們的主函數(shù)(main)。
頭文件的聲明:
//contact.h #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 //表示一個(gè)人的信息 typedef struct PeoInfo { char name[MAX_NAME];//20字節(jié) char sex[MAX_SEX];//5字節(jié) char tele[MAX_TELE];//12字節(jié) int age; char addr[MAX_ADDR];//30字節(jié) }PeoInfo; //通訊錄 typedef struct Contact { PeoInfo data[MAX]; int sz; }Contact;
頭文件定義了一個(gè)結(jié)構(gòu)體存放個(gè)人信息 PeoInfo,但是我們這個(gè)通訊錄是有人數(shù)限制的,需要存一個(gè)人數(shù)進(jìn)去,那于是乎又設(shè)計(jì)了一個(gè)結(jié)構(gòu)體Contact 存放個(gè)人信息和已經(jīng)存了多少人的統(tǒng)計(jì)數(shù)sz。
//主函數(shù) int main() { int input = 0; Contact con; InitContact(&con); do { menu(); printf("請(qǐng)選擇>:"); scanf("%d", &input); switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SearchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); break; case 0: break; default: break; } } while (input); return 0; }
以上必須要重申一下,函數(shù)和變量的命名方式我比較推薦駝峰法,最好不要用拼音和英文的縮寫,更不要都是小寫或者都是大寫,作為一個(gè)合格的程序員要養(yǎng)成良好的編碼習(xí)慣。define 的變量最好全是大寫,但是每個(gè)單詞都要用_隔開(kāi),例如:#define MAX_SEX 5。
增加個(gè)人信息
void AddContact(Contact* pc)//這里重點(diǎn)說(shuō)一下,一定要確定好接收的是結(jié)構(gòu)體指針變量,形參和實(shí)參要多多復(fù)習(xí)。 { if (pc->sz == MAX)//頭文件中定義了 MAX是100,不要忘記結(jié)合頭文件 { printf("已經(jīng)滿了\n"); return; } else { printf("請(qǐng)輸入名字;》\n"); scanf("%s", pc->data[pc->sz].name);//這里我們要剖析一下,請(qǐng)看下面注釋 printf("請(qǐng)輸入性別:》\n"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入年齡:》\n"); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入電話:》\n"); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入地址:》\n"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加聯(lián)系人\n"); } }
注釋:
因?yàn)槲覀儌鞯氖墙Y(jié)構(gòu)體指針pc 結(jié)構(gòu)體指針引用數(shù)據(jù)要用剪頭->,之后引用到的數(shù)據(jù)data是結(jié)構(gòu)體數(shù)組需要添加下標(biāo)[pc->sz]就是它的下標(biāo),其中的pc->sz也是結(jié)構(gòu)體指針引用總個(gè)數(shù)sz的方式,最后已經(jīng)引用過(guò)的data里面的內(nèi)容要進(jìn)行引用需要用 . 這個(gè)符號(hào)引用(就是 普通結(jié)構(gòu)體的引用)。
提醒:
在這里還要再說(shuō)一下關(guān)于 if else中大括號(hào)的注意事項(xiàng),一定要縮進(jìn)和對(duì)齊,這還是一個(gè)程序員的基本功。另外還要提一下,else只會(huì)和最近的if結(jié)合,如果怕迷糊,請(qǐng)一定要在if結(jié)束后做大括號(hào){}。
顯示所有聯(lián)系人的信息
想要驗(yàn)證我們是不是真的添加了信息,那我們直接把他展示出來(lái)就好了,那順便把顯示所有聯(lián)系人函數(shù)也做出來(lái)。
//顯示所有聯(lián)系人 void ShowContact(Contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%d: 姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n", pc->sz, pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); ??????? } }
刪除個(gè)人信息
刪除個(gè)人信息之前需要先查到這個(gè)人,于是設(shè)計(jì)了一個(gè)搜索姓名函數(shù),根據(jù)搜索到的結(jié)果找到該聯(lián)系人的位置,再刪除。其實(shí)是這個(gè)搜索姓名函數(shù)是至關(guān)重要的,最后的查找、修改個(gè)人信息也要用到。
//搜索姓名函數(shù) int FindByName(Contact* pc, char name[]) { int i = 0; for (i=0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; } //刪除個(gè)人信息函數(shù) void DelContact(Contact* pc) { int ret = 0; char name[MAX_NAME]; printf("請(qǐng)輸入要?jiǎng)h除的名字:》"); scanf("%s", name); //查找以下是否存在 ret=FindByName(pc, name); if (ret ==-1) printf("刪除的人不存在\n"); else { //del int j = 0; for (j = ret; j < pc->sz-1; j++) { pc->data[j]=pc->data[j + 1]; } pc->sz--; printf("成功刪除!\n"); } }
查找個(gè)人信息
//搜索個(gè)人信息 void SearchContact(Contact* pc) { char name[MAX_NAME]; printf("請(qǐng)輸入要查找的姓名:》"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("輸入的是個(gè)球~\n"); } else { int i = ret; printf("姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } ???????}
更改個(gè)人信息
//修改個(gè)人信息 void ModifyContact(Contact* pc) { char name[MAX_NAME]; printf("請(qǐng)輸入要修改的的名字:》"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("輸入的是個(gè)球~\n"); } else { printf("請(qǐng)輸入名字;》\n"); scanf("%s", pc->data[ret].name); printf("請(qǐng)輸入性別:》\n"); scanf("%s", pc->data[ret].sex); printf("請(qǐng)輸入年齡:》\n"); scanf("%d", &(pc->data[ret].age)); printf("請(qǐng)輸入電話:》\n"); scanf("%s", pc->data[ret].tele); printf("請(qǐng)輸入地址:》\n"); scanf("%s", pc->data[ret].addr); printf("成功修改聯(lián)系人\n"); } }
這里有一個(gè)不足之處就是要更改就必須全部更改,不能只改一項(xiàng)信息,隨后會(huì)更新升級(jí)。
對(duì)聯(lián)系人信息進(jìn)行排序
//按年齡排序 int CompareOld(const void* st1, const void* st2) { return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age); } //按姓名排序 int CompareName(const void* st1, const void* st2) { return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name); } //排序信息 void SortContact(Contact* pc) { qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName);//這里就按姓名排序 }
這里的排序比較簡(jiǎn)單,用到了qsort函數(shù),如果對(duì)qsort函數(shù)有疑問(wèn),那之后會(huì)做一個(gè)針對(duì)排序的博客詳細(xì)講解。只需要記得qsort不管數(shù)組是什么類型都可以進(jìn)行排序(字符串,字符,數(shù)組等)。
最后產(chǎn)品展示
contart.h 頭文件
//contart.h 頭文件 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<assert.h> #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 //表示一個(gè)人的信息 typedef struct PeoInfo { char name[20]; char sex[5]; char tele[12]; int age; char addr[30]; }PeoInfo; //通訊錄 typedef struct Contact { PeoInfo data[100]; int sz; }Contact; //初始化通訊錄 void InitContact(Contact* pc); //增加人的信息 void AddContact(Contact* pc); //打印通訊錄信息 void ShowContact(Contact* pc); //刪除個(gè)人信息 void DelContact(Contact* pc); //搜索信息 void SearchContact(Contact* pc); //修改信息 void ModifyContact(Contact* pc); //排序信息 void SortContact(Contact* pc);
contart. c文件
//contart.c 文件 #define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" void InitContact(Contact* pc) { pc->sz = 0; memset(pc->data, 0, 100 * sizeof(PeoInfo)); } //增加聯(lián)系人 void AddContact(Contact* pc) { if (pc->sz == MAX) { printf("已經(jīng)滿了\n"); return; } else { printf("請(qǐng)輸入名字;》\n"); scanf("%s", pc->data[pc->sz].name); printf("請(qǐng)輸入性別:》\n"); scanf("%s", pc->data[pc->sz].sex); printf("請(qǐng)輸入年齡:》\n"); scanf("%d", &(pc->data[pc->sz].age)); printf("請(qǐng)輸入電話:》\n"); scanf("%s", pc->data[pc->sz].tele); printf("請(qǐng)輸入地址:》\n"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加聯(lián)系人\n"); } } //顯示所有聯(lián)系人 void ShowContact(Contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%d: 姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n", pc->sz, pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } } //搜索姓名函數(shù) int FindByName(Contact* pc, char name[]) { int i = 0; for (i=0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; } //刪除個(gè)人信息 void DelContact(Contact* pc) { int ret = 0; char name[MAX_NAME]; printf("請(qǐng)輸入要?jiǎng)h除的名字:》"); scanf("%s", name); //查找以下是否存在 ret=FindByName(pc, name); if (ret ==-1) printf("刪除的人不存在\n"); else { //del int j = 0; for (j = ret; j < pc->sz-1; j++) { pc->data[j]=pc->data[j + 1]; } pc->sz--; printf("成功刪除!\n"); } } //搜索信息 void SearchContact(Contact* pc) { char name[MAX_NAME]; printf("請(qǐng)輸入要查找的姓名:》"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("輸入的是個(gè)球~\n"); } else { int i = ret; printf("姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } } //修改信息 void ModifyContact(Contact* pc) { char name[MAX_NAME]; printf("請(qǐng)輸入要修改的的名字:》"); scanf("%s", name); int ret = FindByName(pc, name); if (ret == -1) { printf("輸入的是個(gè)球~\n"); } else { printf("請(qǐng)輸入名字;》\n"); scanf("%s", pc->data[ret].name); printf("請(qǐng)輸入性別:》\n"); scanf("%s", pc->data[ret].sex); printf("請(qǐng)輸入年齡:》\n"); scanf("%d", &(pc->data[ret].age)); printf("請(qǐng)輸入電話:》\n"); scanf("%s", pc->data[ret].tele); printf("請(qǐng)輸入地址:》\n"); scanf("%s", pc->data[ret].addr); printf("成功修改聯(lián)系人\n"); } } //按年齡排序 int CompareOld(const void* st1, const void* st2) { return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age); } //按姓名排序 int CompareName(const void* st1, const void* st2) { return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name); } //排序信息 void SortContact(Contact* pc) { qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName); }
main.c文件
//main.c 主函數(shù)文件代碼 #define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h" //一個(gè)漢字占兩個(gè)字節(jié) 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; Contact con; InitContact(&con); do { menu(); printf("請(qǐng)選擇>:"); scanf("%d", &input); switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SearchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); break; case 0: break; default: break; } } while (input); return 0; }
以上就是C語(yǔ)言實(shí)現(xiàn)靜態(tài)存儲(chǔ)通訊錄的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言靜態(tài)存儲(chǔ)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法,涉及C語(yǔ)言針對(duì)進(jìn)程操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07C語(yǔ)言實(shí)戰(zhàn)之浪漫煙花表白程序代碼
這篇文章主要介紹了C語(yǔ)言實(shí)戰(zhàn)之浪漫煙花表白程序代碼,需要的朋友可以參考下2021-04-04C++無(wú)符號(hào)整數(shù)溢出問(wèn)題解析
這篇文章主要介紹了C++無(wú)符號(hào)整數(shù)溢出探究,本文主要探討C/C++中無(wú)符號(hào)整數(shù)超過(guò)范圍后的計(jì)算問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Mac OS上搭建Apache+PHP+MySQL開(kāi)發(fā)環(huán)境的詳細(xì)教程
這篇文章主要介紹了Mac OS上搭建Apache+PHP+MySQL開(kāi)發(fā)環(huán)境的詳細(xì)教程,包括常見(jiàn)的PHP連接MySQL失敗問(wèn)題的解決辦法,需要的朋友可以參考下2016-01-01