c语言实现通讯录(详解)
在初始c語言的一段時間后我們經(jīng)常會遇到例如學生管理系統(tǒng)一類的大題,每次拿到的時候思路都是一團糟,這里我將和你一起學習如何用c語言實現(xiàn)通訊錄,實現(xiàn)的功能包含增,刪,改,查,展示。
1:構(gòu)建菜單
首先我們需要創(chuàng)建三個文件,一個用于存放我們所需的函數(shù)一個用于測試,一個用于實現(xiàn)我們自己所寫函數(shù)的功能。假如我們通訊錄包含一個人的信息有名字,年齡,性別,電話,住址,要實現(xiàn)這樣一個功能肯定是要用到我們的結(jié)構(gòu)體的。
?如果我們只是有了一個通訊錄,如果里面有5個人員信息的時候我們卻不知道,那么后面的人員信息就不知道往什么地方存,那么我們就可以在定義一個變量用來記錄我們當前通訊錄里面有多少個人,那么就可以在定義一個結(jié)構(gòu)體用來存我們的通訊錄和通訊錄里面有多少人。
?
通訊錄的信息有了,接下來我們就需要的告訴用戶使用我們通訊錄的時候是怎樣操作的,我們這里給上一個menu的菜單萊提示用戶怎樣進行操作,然后就是根據(jù)菜單的提升輸入內(nèi)容,然后我們就可以根據(jù)用戶輸入的內(nèi)容來實現(xiàn)我們對應的功能。在此之間我們需要先初始化一下我們的通訊錄,不然里面存的一些數(shù)字是一些隨機數(shù),影響我們后續(xù)的使用。
2:(函數(shù)ADD)增加人員信息的實現(xiàn)
在需要對結(jié)構(gòu)體內(nèi)部值修改的時候我們需要用到址調(diào)用,當我們把這樣一個結(jié)構(gòu)體類型傳過來的我們就用一個結(jié)構(gòu)體的指針來接收他。
?當我們拿到這個結(jié)構(gòu)體的時候得確保一下如果這個通訊錄滿了的話我們就可以給用戶提示一下當前通訊錄滿了
如果沒滿我就可以把人員信息往里面開始存了。存的方式也很簡單,我們只需要那這這個指針變量去指向date的這個結(jié)構(gòu)體里面的size就可以了
?3:(函數(shù)DEL)刪除聯(lián)系人的實現(xiàn)
刪除聯(lián)系人也很簡單有兩種方法一種是我們從數(shù)組里面找到這個數(shù)然后把后面的數(shù)一個一個往前面拿,另一個是把最后一個元素放在我們需要刪除的那個元素位置在進行排序就完成了。那么這里我們采用第一種方法
?接下來我們要確定通過什么方式來找到結(jié)構(gòu)體中對應的這個元素,假如我們就用名字的方法來刪除所對應的元素,我們可以定義一個name變量,然后通過遍歷這個結(jié)構(gòu)體來找,如果找到了我們就把后面的數(shù)依次往前拿,如果遍歷完都沒有找到這個名字,那么就說明這個聯(lián)系人不存在我們的通訊錄
?4:(函數(shù)MODIFY)改的實現(xiàn)
改的實現(xiàn)我們也采用通過名字來遍歷結(jié)構(gòu)體,如果找到了我們就可以把他經(jīng)行修改,如果找不到那就說明這個名字不存在。到了這里我們發(fā)現(xiàn)好像很多次我們都是需要通過名字來實現(xiàn)我們某個功能,那么我們這里是不是可以把查找某個人也封裝成一個函數(shù),每一次需要使用的時候就可以直接去調(diào)用它。我們假設如果這個函數(shù)返回一個-1就說明沒有找到我們需要經(jīng)行操作的那個人,如果是找到了,我們就返回找到了的那個下標。清楚了思路我們就可以實現(xiàn)這個函數(shù)了。
?有了這個函數(shù)之后,如果我們找到了這個名字那么就把他的下標返回來,然后直接通過下標對這個值經(jīng)行修改。
?5:查的實現(xiàn)
對于查的實現(xiàn)同樣,我們通過名字去尋找,當找到之后返回該值的下標,直接對下標所對應的值進行打印。
//頭文件 #pragma once #include<stdio.h> #include<string.h> #pragma warning(disable:4996) #define NUM 100 //通訊錄大小 #define MAX 20 // 姓名 #define AGE 20 #define SEX 5 //性別 #define ADDR 30 // 電話 #define TELE 12 //住址 struct peoInfo {char name[MAX]; //方便后續(xù)修改通訊錄的大小char age[AGE];char sex[SEX];char tele[TELE];char addr[ADDR]; }; struct peoInfo date[NUM]; //通訊錄類型 struct Contact {struct peoInfo date[NUM];int size; //記錄當前已經(jīng)有的元素個數(shù) }; enum option {EXIT, //用枚舉萊替代case的1方便閱讀ADD,DEL,SEARCT,MODIFY,SHOW,SORT }; //初始化通訊錄 void InitContact(struct Contact* ps);//增加聯(lián)系人 void AddContact(struct Contact* ps);//刪除聯(lián)系人 void DelContact(struct Contact* ps);//查找聯(lián)系人 void SEARCTContact(const struct Contact* ps);//展示聯(lián)系人列表 void ShowContact(const struct Contact* ps);//修改聯(lián)系人 void MODIFYContact(struct Contact* ps);//測試階段 #include"contact.h" 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[NUM];//通訊錄 包含300個元素和300個sizeInitContact(&con); //把結(jié)構(gòu)體賦初值do {menu();printf("請選擇>\n");scanf("%d", &input);switch (input){case ADD: //利用枚舉的一次自增來代替1—6方便用戶閱讀AddContact(&con); //增加聯(lián)系人break;case DEL:DelContact(&con);break; case SEARCT:SEARCTContact(&con);break;case MODIFY:MODIFYContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:break;case EXIT:break;default:printf("選擇錯誤,請重新輸入》\n");break;}} while (input);return 0; }//功能的實現(xiàn) #include"contact.h" void InitContact(struct Contact* ps)//ps是con存放con的地址的指針 {memset(ps->date, 0,sizeof(ps->date));//把通訊錄進行初始化ps->size = 0;//設置通訊錄最開始的人 } static int FindByName(const struct Contact* ps,char name[MAX]) //把每次需要查找的聯(lián)系人封裝一個函數(shù) {int i = 0;for (i = 0; i < ps->size; i++){if (0 == strcmp(ps->date[i].name, name)){return i; //如果找到了 返回該聯(lián)系人的下標}}return -1; //找不到返回-1 } void AddContact(struct Contact* ps) {if (ps->size == NUM){printf("通訊錄已滿,無法繼續(xù)增加\n");}else {printf("請輸入需要增加聯(lián)系人的名字\n");scanf("%s", ps->date[ps->size].name);//把增加的聯(lián)系人放在ps指向的date結(jié)構(gòu)里面的size下標printf("請輸入需要增加聯(lián)系人的年齡\n");scanf("%s", ps->date[ps->size].age);printf("請輸入需要增加聯(lián)系人的性別\n");scanf("%s", ps->date[ps->size].sex);printf("請輸入需要增加聯(lián)系人的電話\n");scanf("%s", ps->date[ps->size].tele);printf("請輸入需要增加聯(lián)系人的地址\n");scanf("%s", ps->date[ps->size].addr);ps->size++;printf("增加成功\n");} } void DelContact(struct Contact* ps) {printf("請輸入您要刪除的聯(lián)系人姓名\n");char name[MAX];//創(chuàng)建用來裝刪除人名字的數(shù)組scanf("%s", name);//找到返回名字所在元素下標 找不到返回-1int pos = FindByName(ps, name);if (-1 == pos)printf("要刪除的人不存在\n"); //當i遍歷完等于size的時候說明這個人不在通訊錄else{int j = 0;for (j = pos; j < ps->size - 1; j++) //讓j從找到的那個下標開始{ps->date[j] = ps->date[j + 1];//把結(jié)構(gòu)體date的j的元素每一個都被覆蓋}ps->size--; //下標--讓他指不到最后一個數(shù)printf("刪除成功\n");} }void SEARCTContact(const struct Contact* ps) {char name[MAX];printf("請輸入需要查找人的姓名\n");scanf("%s", name);int pos = FindByName(ps, name); if (-1 == ps->size){printf("您查詢的聯(lián)系人不存在\n");}else{printf("姓名:%s\n", ps->date[pos].name);printf("年齡:%s\n", ps->date[pos].age);printf("性別:%s\n", ps->date[pos].sex);printf("電話:%s\n", ps->date[pos].tele);printf("住址:%s\n", ps->date[pos].addr);} }void MODIFYContact(struct Contact* ps) {char name[MAX];printf("請輸入需要修改人的名字\n");scanf("%s", name);int pos = FindByName(ps,name); if (-1 == pos)printf("要修改的人不存在\n");else{printf("請輸入需要修改聯(lián)系人的名字\n");scanf("%s", ps->date[pos].name);//把增加的聯(lián)系人放在ps指向的date結(jié)構(gòu)里面的size下標printf("請輸入需要修改聯(lián)系人的年齡\n");scanf("%s", &(ps->date[pos].age));printf("請輸入需要修改聯(lián)系人的性別\n");scanf("%s", ps->date[pos].sex);printf("請輸入需要修改聯(lián)系人的電話\n");scanf("%s", ps->date[pos].tele);printf("請輸入需要修改聯(lián)系人的住址\n");scanf("%s", ps->date[pos].addr);printf("修改成功\n");} }void ShowContact(const struct Contact* ps) {if (ps->size == 0) //如果通訊錄沒人的話就不需要打印{printf("當前通訊錄暫無聯(lián)系人\n");}else{//printf("請輸入需要查詢的姓名:>\n");//scanf("%s", ps->date->name);int i = 0;printf("如下是通訊錄現(xiàn)有的聯(lián)系人的聯(lián)系人\n");printf("%s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年齡", "性別", "電話", "住址");for (i = 0; i < ps->size; i++){printf("%s\t%4s\t%5s\t%12s\t%22s\n",ps->date[i].name,ps->date[i].age,ps->date[i].sex,ps->date[i].tele,ps->date[i].addr);}} }?
總結(jié)
以上是生活随笔為你收集整理的c语言实现通讯录(详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php读取execl 实例,php读取e
- 下一篇: 数独终盘生成器(调试成果)