【C语言进阶】C语言实现通讯录(简易版)
前言:
我們需要用C語言模擬一個(gè)通訊錄可以用來存儲1000個(gè)人的信息
每個(gè)人的信息包括:
姓名、電話、性別、住址、年齡
功能包括:
注:此版本不包含其他內(nèi)容,后續(xù)會出更加全面的升級版本
通訊錄(C語言簡易版)
目錄
一、通訊錄菜單
二、通訊錄主函數(shù)
三、枚舉主函數(shù)內(nèi)部選項(xiàng)
四、定義聯(lián)系人及通訊錄
????????(一)定義聯(lián)系人內(nèi)容(結(jié)構(gòu)體)
????????(二)定義通訊錄內(nèi)容(結(jié)構(gòu)體)
五、全局變量聲明
六、初始化通訊錄
七、通過姓名查找函數(shù)
八、實(shí)現(xiàn)通訊錄功能
????????(一)新增聯(lián)系人
????????(二)刪除聯(lián)系人
????????(三)查找聯(lián)系人
?????????(四)修改聯(lián)系人
????????(五)顯示所有聯(lián)系人
????????(六)按姓名排序所有聯(lián)系人
九、頭文件
十、完整代碼
一、通訊錄菜單
菜單能夠?qū)崿F(xiàn)和用戶的交互。
那么作為一個(gè)通訊錄怎么能沒有菜單選項(xiàng)呢?
我們第一步先來設(shè)計(jì)一個(gè)菜單選項(xiàng)
代碼如下:
void menu() {printf("*********************************\n");printf("** 1. 添加聯(lián)系人 **\n");printf("** 2. 刪除聯(lián)系人 **\n");printf("** 3. 查找聯(lián)系人 **\n");printf("** 4. 修改聯(lián)系人 **\n");printf("** 5. 顯示所有聯(lián)系人 **\n");printf("** 6. 按姓名排序聯(lián)系人 **\n");printf("** 0. exit **\n");printf("*********************************\n"); }?演示效果:
二、通訊錄主函數(shù)
寫完了通訊錄菜單后,我們就要對主函數(shù)進(jìn)行設(shè)計(jì)
代碼如下:
int main() {int input = 0;//創(chuàng)建通訊錄struct Contact con;//con就是通訊錄,里面包含:1000個(gè)元素的數(shù)和size//初始化通訊錄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:MoidfyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤\n");break;}} while (input);return 0; }三、枚舉主函數(shù)內(nèi)部選項(xiàng)
上面主函數(shù)內(nèi)部的分支循環(huán)?case?中我們輸入的字符是為了便于理解,但是這樣是沒辦法實(shí)現(xiàn)最開始的以數(shù)字來進(jìn)行菜單選項(xiàng)的初衷的,所以我們需要枚舉這些選擇功能來達(dá)到這樣的一個(gè)效果。
代碼如下:
enum Choose {EXIT, //0ADD, //1DEL, //2SEARCH,//3MODIFY,//4SHOW, //5SORT //6 };四、定義聯(lián)系人及通訊錄
這一步是為了實(shí)現(xiàn)前言中的通訊錄內(nèi)容以及聯(lián)系人內(nèi)容,為此我們需要用到結(jié)構(gòu)體函數(shù) struct
(一)定義聯(lián)系人內(nèi)容(結(jié)構(gòu)體)
代碼如下:
//結(jié)構(gòu)體:通訊錄中每個(gè)成員的信息 typedef struct PeoInform {char name[MAX_NAME];int age;char sex[MAX_SEX];char phone[MAX_PHONE];char address[MAX_ADDRESS]; }PeoInform;?(二)定義通訊錄內(nèi)容(結(jié)構(gòu)體)
代碼如下:
//通訊錄類型 struct Contact {struct PeoInform data[MAX];//存放1000個(gè)信息int size;//記錄當(dāng)前結(jié)構(gòu)體內(nèi)已經(jīng)有的元素個(gè)數(shù) };五、全局變量聲明
為了實(shí)現(xiàn)我們上面結(jié)構(gòu)體內(nèi)部的這些內(nèi)容,我們需要進(jìn)行一些聲明
代碼如下:
#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_PHONE 12 #define MAX_ADDRESS 30六、初始化通訊錄
盡管我們這是一個(gè)基礎(chǔ)的通訊錄,它并不具備保存功能,但是我們應(yīng)該讓它擁有一個(gè)初始化功能。
代碼如下:
//初始化通訊錄的函數(shù) void InitContact(struct Contact *ps) {memset(ps->data, 0, sizeof(ps->data));ps->size = 0;//設(shè)置通訊錄最初只有0個(gè)元素 }七、通過姓名查找函數(shù)
為了更好的實(shí)現(xiàn)通訊錄功能,使其可讀性提高,這里特意設(shè)計(jì)了一個(gè)函數(shù)來通過查找姓名來實(shí)現(xiàn)通訊錄的功能
代碼如下:
//修飾FindByName函數(shù),使其封裝在程序內(nèi)部,不暴露出去 static int FindByName(const struct Contact *ps, char name[MAX_NAME]) {int i = 0;for(i = 0; i < ps->size; i++){if(0 == strcmp(ps->data[i].name, name)){return i;}}return -1;//找不到的情況 }八、實(shí)現(xiàn)通訊錄功能
(一)新增聯(lián)系人
//增加一個(gè)信息到通訊錄 void AddContact(struct Contact *ps) {if(ps->size == MAX){printf("通訊錄已滿,無法增加\n");}else{printf("請輸入名字:>");scanf("%s", ps->data[ps->size].name);printf("請輸入年齡:>");scanf("%d", &(ps->data[ps->size].age));printf("請輸入性別:>");scanf("%s", ps->data[ps->size].sex);printf("請輸入電話:>");scanf("%s", ps->data[ps->size].phone);printf("請輸入家庭地址:>");scanf("%s", ps->data[ps->size].address);ps->size++;printf("添加成功\n");} }模擬效果:
?(二)刪除聯(lián)系人
//刪除指定的聯(lián)系人 void DelContact(struct Contact *ps) {char name[MAX_NAME];printf("請輸入要?jiǎng)h除人的名字:>");scanf("%s", name);//1.查找要?jiǎng)h除的人在什么位置//找到了返回名字所在元素的下標(biāo)//找不到返回 -1int pos = FindByName(ps, name);//2.刪除//查詢不到聯(lián)系人if (pos == -1){printf("查詢不到要?jiǎng)h除的聯(lián)系人,請重試\n");}else{//刪除數(shù)據(jù)int j = 0;for(j = pos; j < ps->size-1; j++){ps->data[j] = ps->data[j + 1];//由于刪除了這個(gè)數(shù)據(jù),所以后面的數(shù)據(jù)會頂替上來}ps->size--;printf("刪除成功\n");} }?演示效果:
(三)查找聯(lián)系人
//查找指定的人的信息 void SearchContact(const struct Contact *ps) {char name[MAX_NAME];printf("請輸入要查找人的名字:>");scanf("%s", name);int pos = FindByName(ps, name);if (pos == -1){printf("要查找的人不存在,請重試\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[pos].name,ps->data[pos].age,ps->data[pos].sex,ps->data[pos].phone,ps->data[pos].address);} }演示效果:?
?(四)修改聯(lián)系人
//修改指定聯(lián)系人的信息 void MoidfyContact(struct Contact *ps) {char name[MAX_NAME];printf("請輸入要修改聯(lián)系人的名字:>");scanf("%s", name);int pos = FindByName(ps, name);if (pos == -1){printf("要修改聯(lián)系人的信息不存在,請重試\n");}else{printf("請輸入名字:>");scanf("%s", ps->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(ps->data[pos].age));printf("請輸入性別:>");scanf("%s", ps->data[pos].sex);printf("請輸入電話:>");scanf("%s", ps->data[pos].phone);printf("請輸入家庭地址:>");scanf("%s", ps->data[pos].address);printf("修改完成\n");} }演示效果:?
?(五)顯示所有聯(lián)系人
//展示通訊錄中聯(lián)系人的信息 void ShowContact(const struct Contact *ps) {if(ps->size == 0){printf("通訊錄為空\n");}else{int i = 0;//標(biāo)題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)for(i = 0; i < ps->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].phone,ps->data[i].address);}} }演示效果:?
(六)按姓名排序所有聯(lián)系人
//按姓名排序通訊錄內(nèi)容 void SortContact(struct Contact *ps) {if (ps->size <= 0){printf("通訊錄中沒有聯(lián)系人,請?zhí)砑?\n");}int i = 0;int j = 0;for (i = 0; i< ps->size - 1; i++){for (j = 0; j< ps->size - i - 1; j++){if (strcmp( ps->data[j].name, ( ps->data[j + 1]).name) > 0){PeoInform tmp;tmp = ps->data[j];ps->data[j] = ps->data[j + 1];ps->data[j + 1] = tmp;}}printf("排序成功!\n");} }演示效果:?
由于此時(shí)通訊錄只有一個(gè)成員,我們無法直觀地實(shí)現(xiàn)按名字排序的效果,所以這邊添加了幾個(gè)聯(lián)系人來更好的演示。
(1)排序前
(2)排序后
九、頭文件
寫到這里我們是不是忘記了點(diǎn)什么?沒錯(cuò),那就是頭文件,不引用頭文件就會產(chǎn)生報(bào)錯(cuò),所以我們在寫代碼的時(shí)候一定要加上頭文件哦!
代碼如下:
#include <stdio.h> #include <string.h> #include <stdlib.h>十、完整代碼
最后我們獻(xiàn)上完整的代碼:
#include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_PHONE 12 #define MAX_ADDRESS 30//枚舉:選擇功能 enum Choose {EXIT, //0ADD, //1DEL, //2SEARCH,//3MODIFY,//4SHOW, //5SORT //6 };//結(jié)構(gòu)體:通訊錄中每個(gè)成員的信息 typedef struct PeoInform {char name[MAX_NAME];int age;char sex[MAX_SEX];char phone[MAX_PHONE];char address[MAX_ADDRESS]; }PeoInform;//通訊錄類型 struct Contact {struct PeoInform data[MAX];//存放1000個(gè)信息int size;//記錄當(dāng)前結(jié)構(gòu)體內(nèi)已經(jīng)有的元素個(gè)數(shù) };//初始化通訊錄的函數(shù) void InitContact(struct Contact *ps) {memset(ps->data, 0, sizeof(ps->data));ps->size = 0;//設(shè)置通訊錄最初只有0個(gè)元素 }//增加一個(gè)信息到通訊錄 void AddContact(struct Contact *ps) {if(ps->size == MAX){printf("通訊錄已滿,無法增加\n");}else{printf("請輸入名字:>");scanf("%s", ps->data[ps->size].name);printf("請輸入年齡:>");scanf("%d", &(ps->data[ps->size].age));printf("請輸入性別:>");scanf("%s", ps->data[ps->size].sex);printf("請輸入電話:>");scanf("%s", ps->data[ps->size].phone);printf("請輸入家庭地址:>");scanf("%s", ps->data[ps->size].address);ps->size++;printf("添加成功\n");} }//修飾FindByName函數(shù),使其封裝在程序內(nèi)部,不暴露出去 static int FindByName(const struct Contact *ps, char name[MAX_NAME]) {int i = 0;for(i = 0; i < ps->size; i++){if(0 == strcmp(ps->data[i].name, name)){return i;}}return -1;//找不到的情況 }//刪除指定的聯(lián)系人 void DelContact(struct Contact *ps) {char name[MAX_NAME];printf("請輸入要?jiǎng)h除人的名字:>");scanf("%s", name);//1.查找要?jiǎng)h除的人在什么位置//找到了返回名字所在元素的下標(biāo)//找不到返回 -1int pos = FindByName(ps, name);//2.刪除//查詢不到聯(lián)系人if (pos == -1){printf("查詢不到要?jiǎng)h除的聯(lián)系人,請重試\n");}else{//刪除數(shù)據(jù)int j = 0;for(j = pos; j < ps->size-1; j++){ps->data[j] = ps->data[j + 1];//由于刪除了這個(gè)數(shù)據(jù),所以后面的數(shù)據(jù)會頂替上來}ps->size--;printf("刪除成功\n");} }//查找指定的人的信息 void SearchContact(const struct Contact *ps) {char name[MAX_NAME];printf("請輸入要查找人的名字:>");scanf("%s", name);int pos = FindByName(ps, name);if (pos == -1){printf("要查找的人不存在,請重試\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[pos].name,ps->data[pos].age,ps->data[pos].sex,ps->data[pos].phone,ps->data[pos].address);} }//修改指定聯(lián)系人的信息 void MoidfyContact(struct Contact *ps) {char name[MAX_NAME];printf("請輸入要修改聯(lián)系人的名字:>");scanf("%s", name);int pos = FindByName(ps, name);if (pos == -1){printf("要修改聯(lián)系人的信息不存在,請重試\n");}else{printf("請輸入名字:>");scanf("%s", ps->data[pos].name);printf("請輸入年齡:>");scanf("%d", &(ps->data[pos].age));printf("請輸入性別:>");scanf("%s", ps->data[pos].sex);printf("請輸入電話:>");scanf("%s", ps->data[pos].phone);printf("請輸入家庭地址:>");scanf("%s", ps->data[pos].address);printf("修改完成\n");} }//展示通訊錄中的信息 void ShowContact(const struct Contact *ps) {if(ps->size == 0){printf("通訊錄為空\n");}else{int i = 0;//標(biāo)題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)for(i = 0; i < ps->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",ps->data[i].name,ps->data[i].age,ps->data[i].sex,ps->data[i].phone,ps->data[i].address);}} }//按姓名排序通訊錄內(nèi)容 void SortContact(struct Contact *ps) {if (ps->size <= 0){printf("通訊錄中沒有聯(lián)系人,請?zhí)砑?\n");}int i = 0;int j = 0;for (i = 0; i< ps->size - 1; i++){for (j = 0; j< ps->size - i - 1; j++){if (strcmp( ps->data[j].name, ( ps->data[j + 1]).name) > 0){PeoInform tmp;tmp = ps->data[j];ps->data[j] = ps->data[j + 1];ps->data[j + 1] = tmp;}}printf("排序成功!\n");} }void menu() {printf("*********************************\n");printf("** 1. 添加聯(lián)系人 **\n");printf("** 2. 刪除聯(lián)系人 **\n");printf("** 3. 查找聯(lián)系人 **\n");printf("** 4. 修改聯(lián)系人 **\n");printf("** 5. 顯示所有聯(lián)系人 **\n");printf("** 6. 按姓名排序聯(lián)系人 **\n");printf("** 0. exit **\n");printf("*********************************\n"); }int main() {int input = 0;//創(chuàng)建通訊錄struct Contact con;//con就是通訊錄,里面包含:1000個(gè)元素的數(shù)和size//初始化通訊錄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:MoidfyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯(cuò)誤\n");break;}} while (input);return 0; }總結(jié)
以上是生活随笔為你收集整理的【C语言进阶】C语言实现通讯录(简易版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux如何删除tree命令,误删tr
- 下一篇: php登录界面的代码,php登录页面()