C语言——通讯录的实现
目錄
創建項目環境
創建結構體
test.c文件
創建通訊錄
增加聯系人
打印通訊錄
刪除指定聯系人
查找聯系人
更改聯系人
排列通訊錄
完善通訊錄
代碼
結語
創建項目環境
對于這個通訊錄的實現,我們可以像寫三子棋一樣,怎樣去思考,那首先就要創建項目環境
?這次也要去分模塊去寫
首先我們先要思考一下,通訊錄有什么什么功能,它需要保存每個人的信息,對于這些信息我們還要進行增加,刪除,查找,修改的操作,當然我們使用的手機通訊錄也會按照字母的大小來排序。
開始我們自己創建的頭文件依舊可以把我們的庫函數,自定義類型等等,都寫到這里面,在其他的源文件中引用" contact.h "。
創建結構體
首先我們要存放一個人的信息,這里創建一個結構體就可以存放人的名字,性別,年齡等。
這里用tpyedef重命名,以后PeoInfo就是這個結構體
test.c文件
開始的文件就打印一個菜單,寫上之后要用到switch語句
可以根據我們的菜單來寫
?
創建通訊錄
下面這個Contact就是我們創建的通訊錄,可以存放1000個人的信息,sz記錄個數。
剛才的代碼也可以用define來定義一下,方便我們的之后修改這個值。
之后就可以在test.c文件中使用?
?當然我們也可以用到上一篇提到的枚舉,這樣就可以和菜單匹配
?下面的switch也可以改寫成這樣
當然也可以把枚舉拿到頭文件中?
增加聯系人
再增加聯系人之前,我們并沒有把Contact結構體中的成員初始化,所以下一步要把通訊錄初始化。
?使用memset就可以把整個數組初始化為0
之后就可以寫增加函數了,也需要在頭文件中聲明一下
?
打印通訊錄
上一步我們寫了添加聯系人的函數,之后我們寫打印通訊錄的函數來測試一下添加的聯系人的信息有沒有傳進去。
?
?經測試,輸入的信息都傳入了通訊錄中
刪除指定聯系人
當我們想要刪除指定的聯系人的時候,首先要判斷通訊錄中是否還有數據。然后要找到我們想要刪除的人,之后的查找聯系人和更改聯系人也要找到聯系人,所以這里可以寫一個函數幫助我們查找,找到之后就可以刪除。
查找聯系人
當我們要實現查找時,前面的很多代碼都可以套用,比如通訊錄為空的時候,通訊錄中找不到的時候,以及找到了打印的時候,這些代碼前面也寫過。
更改聯系人
?這里不過多說什么,代碼在前面已經寫過了,靈活運用就可以
排列通訊錄
????????排序聯系人的時候,就可以用到之前指針篇章的qsort函數,也是非常的方便,只是這里是結構體排序,參數1:傳入待排序的起始位置,既然要排序就指向聯系人的第一個;參數2:元素個數,也就是通訊錄中有幾個人;參數3:一個元素的字節,也就是整個人的字節大小;參數4:排序的函數地址。
????????在寫排序函數的時候和排列整型數組不同,這里把e1和e2強制類型轉換成結構體指針,這里就不需要解引用了,指針就直接用->,在我們日常使用的通訊錄中,一般都是聯系人的首字母來比較,所以這里就直接拿name來比較了,name是一個字符串,用strcmp來比較。
完善通訊錄
???????到這里通訊錄基本就已經完成了,最后就看看有什么可以優化的地方,比如:查找和打印的功能不需要修改,但我們也不希望目標結構體改變,所以加上const來修飾;另一點就是,結構體傳參的時候,使用傳址調用(上一篇也講到為什么結構體要傳址而不是傳值),既然傳址就要用到指針,在函數調用的時候還是斷言一下的好。
代碼
所有代碼如下
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 {//存放一個人的信息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個人的信息int sz;//記錄通訊錄中已經保存的信息個數 }Contact;//函數的聲明//初始化通訊錄 void InitContact(Contact* pc);//增加聯系人 void AddContact(Contact* pc);//打印通訊錄 void PrintContact(const Contact* pc);//刪除指定聯系人 void DelContact(Contact* pc);//查找聯系人 void SearchContact(const Contact* pc);//更改聯系人 void ModifyContact(Contact* pc);//排列聯系人 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("通訊錄已滿,無法添加\n");return;}//錄入信息printf("請輸入名字:>");scanf("%s", pc->data[pc->sz].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pc->sz].age));printf("請輸入性別:>");scanf("%s", pc->data[pc->sz].sex);printf("請輸入電話:>");scanf("%s", pc->data[pc->sz].tele);printf("請輸入地址:>");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);} }//查找函數,找到返回下標,找不到返回-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("通訊錄已空,無法刪除\n");return;}//1. 找到指定聯系人char name[NAME_MAX] = { 0 };printf("請輸入要刪除人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要刪除的人不存在\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("通訊錄已空,無法查找\n");return;}//1. 找到指定聯系人char name[NAME_MAX] = { 0 };printf("請輸入要查找人的名字:>");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("通訊錄已空,無法更改\n");return;}//1. 找到指定聯系人char name[NAME_MAX] = { 0 };printf("請輸入要更改人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要更改的人不存在\n");return;}//更改信息printf("請輸入名字:>");scanf("%s", pc->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(pc->data[pos].age));printf("請輸入性別:>");scanf("%s", pc->data[pos].sex);printf("請輸入電話:>");scanf("%s", pc->data[pos].tele);printf("請輸入地址:>");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;//創建通訊錄Contact con;//初始化通訊錄InitContact(&con);do{menu();printf("請選擇:>");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("選擇錯誤,請重新選擇\n");break;}} while(input); } int main() {test();return 0; }結語
通訊錄就寫完了,所謂結束也是開始,之后也會分享更多干貨的,敬請期待!!!
總結
以上是生活随笔為你收集整理的C语言——通讯录的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原声php 读取excel乱码_如何解决
- 下一篇: 步进电机如何选型