C语言实现通讯录
C語言實現初階通訊錄
本篇主要介紹C語言實現初階通訊錄文章目錄
- C語言實現初階通訊錄
- 前言
- 一、功能介紹
- 二、模板構建
- 三、通訊錄界面
- 四、 通訊錄的初始化
- 五、功能實現
- 一、增加
- 二、展示
- 三、刪除
- 四、查找
- 五、修改
- 六、排序
- 六 功能優化
- 七 完整代碼
- 總結
前言
本篇主要介紹C語言實現通訊錄。通訊錄涵蓋初階包括進階C語言的許多知識點,包括但不限于指針,動態內存分配,文件操作,結構體的運用。
這篇博客是初階通訊錄,即不涉及動態內存以及文件操作。完整版我會在后續發布,在這個版本的基礎上進行一定的修改。
下面開始
一、功能介紹
1,增加成員信息
2,刪除成員信息
3,搜索成員信息
4,修改成員信息
5,排序成員信息
6,打印成員信息
二、模板構建
通訊錄模板 的構建是通過結構體來實現的。
這里需要兩個結構體,一個是struct PeoInfo,用來創建用戶信息類型,包括姓名,年齡,電話,性別,住址。另一個是struct Contact,用來創建通訊錄類型,該類型包含了兩個元素,其中一個是數組:struct PeoInfo data[1000],即該通訊錄可容納1000人,另一個是size,即你要存的是第幾個人(相當于把這個人存入數組的哪個位置)
因此,我們便可以創建一個變量,其類型為Contact,其名稱我們稱之為con
Contact con;這是它內部的成員
data是一個數組,上面提到過,該數組的每一個元素都是一個結構體類型
三、通訊錄界面
菜單可以實現與用戶的良好交互,因此有必要實現一個菜單打印函數。
```c 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 input;do{menu();scanf("%d", &input);switch (input){case 1:add();//增加功能break;case 2:del();//刪除功能break;case 3:search();//查找功能break;case 4:modify();//更改功能break;case 5:show();//展示break;case 6:sort();//排序break;case 0:break;default:printf("你的輸入有誤,請重新輸入\n");break;}} while (input);當input輸入為0時,while(input)判定為假,跳出循環。當用戶輸入0-6之外的數字,會給出“你的輸入有誤,請重新輸入”的提示。
以上就是通訊錄的界面部分
四、 通訊錄的初始化
由于一開始,我們的通訊錄內部是沒有任何成員的,且size應置為0,即將第一個成員放入數組的第0個位置。因此,我們需要對通訊錄進行初始化。
初始化前:
初始化方法:創建一個Init函數進行實現
這里借助內存設置函數memset將data這塊空間的內存全部設為0。注意,由于我們要改變的是con的值,因此我們選擇傳址調用函數。
初始化后:
五、功能實現
一、增加
增加函數,因為要改變通訊錄的內部,因此依然選擇傳址調用
void add(Contact* con)我們要做的依次輸入成員信息,并將該信息存入data數組的相應位置。因此,每執行一次該函數,size就應該++一次。那么,如何訪問到該數組呢?con->data可訪問該數組,那么如何訪問該數組的第size個元素呢? 可以使用 (con->data)[con->size]
那么如何訪問第size個元素的某個變量,比如年齡呢?我們可以借助"."運算符來實現。 (con->data)[con->size].age接著我們借助scanf實現數據的輸入
增加的實現效果如下
依次輸入后,通過監視窗口可以看到data[0]已經發生了改變。
二、展示
展示窗口可以展示你目前的通訊錄的內容,實現完該函數后對后續功能的檢查會變得十分方便,因此我們先來實現 展示 這個功能。
void show(Contact* con) {for (int i = 0; i < con->size; i++){printf("-----------------------------\n");printf(" 成員編號:【%d】\n", i);printf("姓名:%s\n", (con->data)[i].name);printf("年齡:%d\n", (con->data)[i].age);printf("電話:%s\n", (con->data)[i].tel);printf("住址:%s\n", (con->data)[i].address);printf("性別:%s\n", (con->data)[i].sex);}}這段代碼的邏輯十分簡單,通過一個for循環來確定打印的名單數目,即如果size為1,就只打印一個名單(因為此時只有一個成員)效果如下
可以看到,當我選擇了’‘show’'時,其展示了我存入的兩個成員的信息。
三、刪除
刪除功能,即刪除某個成員的信息
這個功能就有些復雜了,第一,你要找到你所刪除的元素的位置,比如我要刪掉5號,那么我們就要找到對應數組的下標,并將其刪除。第二,刪除之后通訊錄的狀態如何把控。假設我們現在有八個成員,而我們要刪掉第4個成員的信息,我們其實有兩種刪除方法
1、刪掉四,隨后五、六、七、八依次往前覆蓋,并進行size–(因為現在只剩下七個元素了)
2、直接將八移動到四的位置。但這樣會打亂通訊錄成員的順序。
我們在這里選擇1進行實現。
首先,我們使用for循環找到要刪除的元素的位置,如果循環到最后依然沒有找到,就打印要找的人不存在并return.
接著,我們再次借助for循環,挨個進行元素替換,最后,我們進行con->size–并在屏幕上打印刪除成功
else {for (int m = i; m < con->size-1; m++){(con->data)[i] = (con->data)[i + 1];(con->size)--;printf("刪除成功");} }效果展示:
先存入三個成員
然后輸入一個不存在的成員
然后我們刪除李四
刪除實現成功!
四、查找
寫過刪除功能后,查找功能就似乎變得十分簡單了;
查找功能雖不需要進行通訊錄內部的改變,但眾所周知,結構體傳參傳指針的效率遠高于直接傳入一個結構體,因此我們依然選擇傳入指針。
那么我們只需實現類似于刪除中的查找姓名功能,再進行打印即可。
如果輸入了一個不存在的姓名,會給出提示
如果給出了一個存在的成員名字,會打印出該成員的信息
代碼邏輯十分簡單,如下所示
五、修改
修改的邏輯也十分簡單,輸入需要修改的成員編號,然后重新輸入數據即可
效果如下
先增添一名成員
此時面板如下
再修改0號成員
修改完展示如下
可以看到,0號成員的信息已經發生了改變
代碼如下
六、排序
最后一個功能為排序功能,即輸入你要交換的兩個成員的編號,然后對他們的信息進行交換。
這個功能我們需要創建一個臨時空間用于交換,因此我們在原有的Contact這個結構體類中新增一個成員
即data2,其用于臨時儲存
隨后進行交換即可
交換前
交換后
六 功能優化
如果仔細觀察,你會發現其實每次輸一個功能是,這個通訊錄的界面十分混亂。那么如何解決這個問題呢,可以在適當的位置加入cls,即清空屏幕來達到簡潔的效果。
我選擇的是在除去菜單打印函數的每個函數的入口加入cls,這樣每次執行一個新的功能,都會把殘留的信息清空。
七 完整代碼
頭文件(用于函數的聲明以及結構體的聲明):contact.h
#ifndef _CONTACT_H_ #define _CONTACT_H_ #include<stdio.h> #include<windows.h> typedef struct PeoInfo {char name[10];char sex[5];int age;char address[20];char tel[12]; }PeoInfo; typedef struct Contact {PeoInfo data2[20];PeoInfo data[1000];int size; }Contact; void menu(); void Init(Contact*); void add(Contact*); void show(Contact*); void del(Contact*); void searcg(Contact*); void modify(Contact*); void sort(Contact*); #endif // _CONTACT_H_源文件1(用于函數的實現):test.c
#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");} void Init(Contact* con) {system("cls");memset(con->data, 0, sizeof(con->data));con->size = 0; } void add(Contact* con) {system("cls");printf("請輸入住址\n");scanf("%s", &((con->data)[con->size].address));printf("請輸入姓名\n");scanf("%s", &((con->data)[con->size].name));printf("請輸入性別\n");scanf("%s", &((con->data)[con->size].sex));printf("請輸入電話\n");scanf("%s", &((con->data)[con->size].tel));printf("請輸入年齡\n");scanf("%d", &((con->data)[con->size].age));(con->size)++;printf("添加完成\n"); } void show(Contact* con) {system("cls");if (con->size == 0){printf("通訊錄為空");}else{for (int i = 0; i < con->size; i++){printf("-----------------------------\n");printf(" 成員編號:【%d】\n", i);printf("姓名:%s\n", (con->data)[i].name);printf("年齡:%d\n", (con->data)[i].age);printf("電話:%s\n", (con->data)[i].tel);printf("住址:%s\n", (con->data)[i].address);printf("性別:%s\n", (con->data)[i].sex);}}} void del(Contact* con) {system("cls");char del_name[10];printf("請輸入你要刪除的成員的名字\n");scanf("%s", &del_name);int i;for ( i = 0; i < con->size; ++i){if (strcmp((con->data)[i].name, del_name) == 0)break;}if (i == con->size){printf("要刪除的人不存在\n");}else{for (int m = i; m < con->size - 1; m++){(con->data)[i] = (con->data)[i + 1];}(con->size)--;printf("刪除成功\n");} } void search(Contact* con) {system("cls");char search_name[10];printf("請輸入你要查找的成員的名字\n");scanf("%s", &search_name);int i;for (i = 0; i < con->size; ++i){if (strcmp((con->data)[i].name, search_name) == 0)break;}if (i == con->size){printf("要查找的人不存在\n");}else{printf(" 查找成功,成員信息如下\n ");printf("-----------------------------\n");printf(" 成員編號:【%d】\n", i);printf("姓名:%s\n", (con->data)[i].name);printf("年齡:%d\n", (con->data)[i].age);printf("電話:%s\n", (con->data)[i].tel);printf("住址:%s\n", (con->data)[i].address);printf("性別:%s\n", (con->data)[i].sex);} } void modify(Contact* con) {system("cls");printf("請輸入你要修改的成員的編號\n");int number;scanf("%d", &number);printf("請輸入新的住址\n");scanf("%s", &((con->data)[number].address));printf("請輸入新的姓名\n");scanf("%s", &((con->data)[number].name));printf("請輸入新的性別\n");scanf("%s", &((con->data)[number].sex));printf("請輸入新的電話\n");scanf("%s", &((con->data)[number].tel));printf("請輸入新的年齡\n");scanf("%d", &((con->data)[number].age));printf("修改完成\n"); } void sort(Contact* con) {system("cls");printf("請輸入你要交換的兩個成員的編號(二者用空格隔開)\n");int num1;int num2;scanf("%d%d", &num1, &num2);(con->data2)[0] = (con->data)[num1];(con->data)[num1] = (con->data)[num2];(con->data)[num2] = (con->data2)[0];printf("交換成功\n"); }源文件2(調用函數):contact.c
#include"contact.h" void main() {Contact con;Init(&con);int input;do{menu();scanf("%d", &input);switch (input){case 1:add(&con);//增加功能break;case 2:del(&con);//刪除功能break;case 3:search(&con);//查找功能break;case 4:modify(&con);//修改功能break;case 5:show(&con);//展示break;case 6:sort(&con);//排序break;case 0:break;default:printf("你的輸入有誤,請重新輸入\n");break;}} while (input); }總結
不得不說的是,這個通訊錄的功能十分簡陋,第一,它不允許你根據成員的多少來設置空間,而是固定的1000容量。第二,每當你關閉界面,你的所有成員信息都會被銷毀,下次打開時什么也沒有。這顯然不能稱之為一個合格的通訊錄。在我的下篇博客我會對這兩個問題進行解決,碼字不易,希望點贊支持
總結
- 上一篇: CSS Grid布局(2)
- 下一篇: 小程序根据手机机型设置自定义底部导航距离