C语言——通讯录的实现
目錄
創(chuàng)建項(xiàng)目環(huán)境
創(chuàng)建結(jié)構(gòu)體
test.c文件
創(chuàng)建通訊錄
增加聯(lián)系人
打印通訊錄
刪除指定聯(lián)系人
查找聯(lián)系人
更改聯(lián)系人
排列通訊錄
完善通訊錄
代碼
結(jié)語(yǔ)
創(chuàng)建項(xiàng)目環(huán)境
對(duì)于這個(gè)通訊錄的實(shí)現(xiàn),我們可以像寫三子棋一樣,怎樣去思考,那首先就要?jiǎng)?chuàng)建項(xiàng)目環(huán)境
?這次也要去分模塊去寫
首先我們先要思考一下,通訊錄有什么什么功能,它需要保存每個(gè)人的信息,對(duì)于這些信息我們還要進(jìn)行增加,刪除,查找,修改的操作,當(dāng)然我們使用的手機(jī)通訊錄也會(huì)按照字母的大小來(lái)排序。
開始我們自己創(chuàng)建的頭文件依舊可以把我們的庫(kù)函數(shù),自定義類型等等,都寫到這里面,在其他的源文件中引用" contact.h "。
創(chuàng)建結(jié)構(gòu)體
首先我們要存放一個(gè)人的信息,這里創(chuàng)建一個(gè)結(jié)構(gòu)體就可以存放人的名字,性別,年齡等。
這里用tpyedef重命名,以后PeoInfo就是這個(gè)結(jié)構(gòu)體
test.c文件
開始的文件就打印一個(gè)菜單,寫上之后要用到switch語(yǔ)句
可以根據(jù)我們的菜單來(lái)寫
?
創(chuàng)建通訊錄
下面這個(gè)Contact就是我們創(chuàng)建的通訊錄,可以存放1000個(gè)人的信息,sz記錄個(gè)數(shù)。
剛才的代碼也可以用define來(lái)定義一下,方便我們的之后修改這個(gè)值。
之后就可以在test.c文件中使用?
?當(dāng)然我們也可以用到上一篇提到的枚舉,這樣就可以和菜單匹配
?下面的switch也可以改寫成這樣
當(dāng)然也可以把枚舉拿到頭文件中?
增加聯(lián)系人
再增加聯(lián)系人之前,我們并沒(méi)有把Contact結(jié)構(gòu)體中的成員初始化,所以下一步要把通訊錄初始化。
?使用memset就可以把整個(gè)數(shù)組初始化為0
之后就可以寫增加函數(shù)了,也需要在頭文件中聲明一下
?
打印通訊錄
上一步我們寫了添加聯(lián)系人的函數(shù),之后我們寫打印通訊錄的函數(shù)來(lái)測(cè)試一下添加的聯(lián)系人的信息有沒(méi)有傳進(jìn)去。
?
?經(jīng)測(cè)試,輸入的信息都傳入了通訊錄中
刪除指定聯(lián)系人
當(dāng)我們想要?jiǎng)h除指定的聯(lián)系人的時(shí)候,首先要判斷通訊錄中是否還有數(shù)據(jù)。然后要找到我們想要?jiǎng)h除的人,之后的查找聯(lián)系人和更改聯(lián)系人也要找到聯(lián)系人,所以這里可以寫一個(gè)函數(shù)幫助我們查找,找到之后就可以刪除。
查找聯(lián)系人
當(dāng)我們要實(shí)現(xiàn)查找時(shí),前面的很多代碼都可以套用,比如通訊錄為空的時(shí)候,通訊錄中找不到的時(shí)候,以及找到了打印的時(shí)候,這些代碼前面也寫過(guò)。
更改聯(lián)系人
?這里不過(guò)多說(shuō)什么,代碼在前面已經(jīng)寫過(guò)了,靈活運(yùn)用就可以
排列通訊錄
????????排序聯(lián)系人的時(shí)候,就可以用到之前指針篇章的qsort函數(shù),也是非常的方便,只是這里是結(jié)構(gòu)體排序,參數(shù)1:傳入待排序的起始位置,既然要排序就指向聯(lián)系人的第一個(gè);參數(shù)2:元素個(gè)數(shù),也就是通訊錄中有幾個(gè)人;參數(shù)3:一個(gè)元素的字節(jié),也就是整個(gè)人的字節(jié)大小;參數(shù)4:排序的函數(shù)地址。
????????在寫排序函數(shù)的時(shí)候和排列整型數(shù)組不同,這里把e1和e2強(qiáng)制類型轉(zhuǎn)換成結(jié)構(gòu)體指針,這里就不需要解引用了,指針就直接用->,在我們?nèi)粘J褂玫耐ㄓ嶄浿?#xff0c;一般都是聯(lián)系人的首字母來(lái)比較,所以這里就直接拿name來(lái)比較了,name是一個(gè)字符串,用strcmp來(lái)比較。
完善通訊錄
???????到這里通訊錄基本就已經(jīng)完成了,最后就看看有什么可以優(yōu)化的地方,比如:查找和打印的功能不需要修改,但我們也不希望目標(biāo)結(jié)構(gòu)體改變,所以加上const來(lái)修飾;另一點(diǎn)就是,結(jié)構(gòu)體傳參的時(shí)候,使用傳址調(diào)用(上一篇也講到為什么結(jié)構(gòu)體要傳址而不是傳值),既然傳址就要用到指針,在函數(shù)調(diào)用的時(shí)候還是斷言一下的好。
代碼
所有代碼如下
contact.h文件
#pragma once#include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h>//類型的聲明#define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30enum Option {EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SORT,//5PRINT//6 };typedef struct PeoInfo {//存放一個(gè)人的信息char name[NAME_MAX];char sex[SEX_MAX];int age;char tele[TELE_MAX];char addr[ADDR_MAX]; }PeoInfo;typedef struct Contact {PeoInfo data[MAX];//存放1000個(gè)人的信息int sz;//記錄通訊錄中已經(jīng)保存的信息個(gè)數(shù) }Contact;//函數(shù)的聲明//初始化通訊錄 void InitContact(Contact* pc);//增加聯(lián)系人 void AddContact(Contact* pc);//打印通訊錄 void PrintContact(const Contact* pc);//刪除指定聯(lián)系人 void DelContact(Contact* pc);//查找聯(lián)系人 void SearchContact(const Contact* pc);//更改聯(lián)系人 void ModifyContact(Contact* pc);//排列聯(lián)系人 void SortContact(Contact* pc);const.c文件
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(Contact* pc) {assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data)); }void AddContact(Contact* pc) {assert(pc);if (pc->sz == MAX){printf("通訊錄已滿,無(wú)法添加\n");return;}//錄入信息printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pc->sz].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pc->sz].age));printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pc->sz].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pc->sz].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");}void PrintContact(const Contact* pc) {assert(pc);printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);} }//查找函數(shù),找到返回下標(biāo),找不到返回-1 int FindByName(const Contact* pc, char name[]) {assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (0 == strcmp(pc->data[i].name, name))return i;}return -1;}void DelContact(Contact* pc) {assert(pc);if (pc->sz == 0){printf("通訊錄已空,無(wú)法刪除\n");return;}//1. 找到指定聯(lián)系人char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要?jiǎng)h除人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要?jiǎng)h除的人不存在\n");return;}//刪除int j = 0;for (j = pos; j < pc->sz - 1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("刪除成功\n"); }void SearchContact(const Contact* pc) {assert(pc);if (pc->sz == 0){printf("通訊錄已空,無(wú)法查找\n");return;}//1. 找到指定聯(lián)系人char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}//找到了,打印printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }void ModifyContact(Contact* pc) {assert(pc);if (pc->sz == 0){printf("通訊錄已空,無(wú)法更改\n");return;}//1. 找到指定聯(lián)系人char name[NAME_MAX] = { 0 };printf("請(qǐng)輸入要更改人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要更改的人不存在\n");return;}//更改信息printf("請(qǐng)輸入名字:>");scanf("%s", pc->data[pos].name);printf("請(qǐng)輸入年齡:>");scanf("%d", &(pc->data[pos].age));printf("請(qǐng)輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請(qǐng)輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請(qǐng)輸入地址:>");scanf("%s", pc->data[pos].addr);printf("更改成功\n"); }int cmp_name(const void* e1, const void* e2) {assert(e1 && e2);return strcmp(((PeoInfo*)e1)->name, (((PeoInfo*)e2)->name)); } void SortContact(Contact* pc) {assert(pc);qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);printf("排序成功\n"); }test.c文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h"void menu() {printf("********************************\n");printf("***** 1.add 2.del ******\n");printf("***** 3.search 4.modify ******\n");printf("***** 5.sort 6.print ******\n");printf("***** 0.exit ******\n");printf("********************************\n"); } void test() {int input = 0;//創(chuàng)建通訊錄Contact con;//初始化通訊錄InitContact(&con);do{menu();printf("請(qǐng)選擇:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SORT:SortContact(&con);break;case PRINT:PrintContact(&con);break;case 0:printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");break;}} while(input); } int main() {test();return 0; }結(jié)語(yǔ)
通訊錄就寫完了,所謂結(jié)束也是開始,之后也會(huì)分享更多干貨的,敬請(qǐng)期待!!!
總結(jié)
以上是生活随笔為你收集整理的C语言——通讯录的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原声php 读取excel乱码_如何解决
- 下一篇: 步进电机如何选型