C語(yǔ)言靜態(tài)版通訊錄的設(shè)計(jì)與實(shí)現(xiàn)
1. 配置運(yùn)行環(huán)境
本通訊錄運(yùn)用到了三個(gè)文件
test.c //測(cè)試通訊錄的相關(guān)功能
contact.h //聲明
contact.c //通訊錄的實(shí)現(xiàn)模塊
2. 通訊錄的實(shí)現(xiàn)
想要做通訊錄,首要任務(wù)就是要把模塊想好。
先打印一個(gè)通訊錄的界面菜單
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"); }
2.1 通訊錄的功能目錄
通訊錄的功能有7種:
- 增加聯(lián)系人
- 刪除指定聯(lián)系人
- 查找聯(lián)系人
- 修改聯(lián)系人的信息
- 對(duì)聯(lián)系人的排序
- 顯示聯(lián)系人的信息
- 退出通訊錄
創(chuàng)建人的信息的結(jié)構(gòu)體類(lèi)型
第一步是封裝一個(gè)人的信息的結(jié)構(gòu)體類(lèi)型
由于封裝的結(jié)構(gòu)體類(lèi)型的名字太長(zhǎng),總是寫(xiě)的話感覺(jué)太麻煩了
對(duì) struct PeoInfo進(jìn)行了typdef類(lèi)型重命名
struct PeoInfp 改成 PeoInfp
//表示一個(gè)人的信息 typedef struct PeoInfo { char name[20]; int age; char sex[5]; char tele[12]; char addr[30]; }PeoInfo;
以上的數(shù)值如果以后會(huì)經(jīng)常用到的話,可以用#define 來(lái)定義,方便以后修改
#define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30
2.2 增加信息功能代碼的實(shí)現(xiàn)
//增加通訊錄信息 void AddContact(Contact* pc) { if (DATA_MAX == pc->sz) { printf("通訊錄信息存儲(chǔ)空間已滿!\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); printf("信息添加成功!\n"); pc->sz++; }
2.3 顯示信息功能代碼的實(shí)現(xiàn)
void ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話 地址 //zhangsan 20 男 123456 北京 // //打印標(biāo)題 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
2.4 刪除信息功能代碼的實(shí)現(xiàn)
void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } //刪除 //1. 找到要?jiǎng)h除的人 - 位置(下標(biāo)) printf("輸入要?jiǎng)h除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; //2. 刪除 - 刪除pos位置上的數(shù)據(jù) for (i = pos; i<pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); }
2.5 查詢(xún)信息功能代碼的實(shí)現(xiàn)
void SearchContact(const Contact* pc) { char name[MAX_NAME] = {0}; printf("請(qǐng)輸入要查找人的名字:>"); scanf("%s", name); //查找 int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } //打印 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }
2.6 修改信息功能代碼的實(shí)現(xiàn)
void ModifyContact(Contact* pc) { char name[MAX_NAME] = {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"); }
2.7 按名字排序信息功能代碼的實(shí)現(xiàn)
//按照名字來(lái)排序 int cmp_by_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name); printf("排序成功\n"); }
3. 完整靜態(tài)版本通訊錄的全部源碼
3.1 contact.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void InitContact(Contact* pc) { pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); } void AddContact(Contact* 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 ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話 地址 //hengchuan 20 男 123456 北京 // //打印標(biāo)題 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) for (i = 0; i < pc->sz; i++) { printf("%-10s %-4d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } static int FindByName(const Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; } void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通訊錄為空,無(wú)法刪除\n"); return; } //刪除 //1. 找到要?jiǎng)h除的人 - 位置(下標(biāo)) printf("輸入要?jiǎng)h除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要?jiǎng)h除的人不存在\n"); return; } int i = 0; //2. 刪除 - 刪除pos位置上的數(shù)據(jù) for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("刪除成功\n"); } void SearchContact(const Contact* pc) { char name[MAX_NAME] = { 0 }; printf("請(qǐng)輸入要查找人的名字:>"); scanf("%s", name); //查找 int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } //打印 printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址"); //打印數(shù)據(jù) printf("%-10s %-4d %-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) { char name[MAX_NAME] = { 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"); } //按照名字來(lái)排序 int cmp_by_name(const void* e1, const void* e2) { return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc) { qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name); printf("排序成功\n"); }
3.2 contact.h
#pragma once #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 //表示一個(gè)人的信息 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //靜態(tài)版本的設(shè)計(jì) typedef struct Contact { PeoInfo data[MAX];//存放數(shù)據(jù) int sz;//記錄通訊錄中的有效信息個(gè)數(shù) }Contact, *pContact; //初始化通訊錄 void InitContact(Contact* pc); //增加指定聯(lián)系人 void AddContact(Contact* pc); //顯示聯(lián)系人信息 void ShowContact(const Contact* pc); //刪除指定聯(lián)系人 //void DelContact(Contact* pc); void DelContact(pContact pc); //查找指定聯(lián)系人 void SearchContact(const Contact* pc); //修改通訊錄 void ModifyContact(Contact* pc); //排序通訊錄元素 void SortContact(Contact* pc);
3.3 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. show 6. sort ***\n"); printf("***** 0. exit ***\n"); printf("********************************\n"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; int main() { int input = 0; 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 SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EXIT: printf("退出通訊錄\n"); break; default: printf("選擇錯(cuò)誤\n"); break; } } while (input); return 0; }
4. 靜態(tài)版本通訊錄的缺點(diǎn)
缺點(diǎn):
通訊錄的大小是固定的 - 100個(gè)元素當(dāng)通訊錄退出后,重新運(yùn)行,之前的信息都丟了
當(dāng)前通訊錄中的信息都是保存在內(nèi)存中的,程序退出,內(nèi)存就回收了,下一次重新運(yùn)行程序,內(nèi)存重新分配,之前的數(shù)據(jù)就不見(jiàn)了
到此這篇關(guān)于C語(yǔ)言靜態(tài)版通訊錄的設(shè)計(jì)與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言靜態(tài)版通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11中跳轉(zhuǎn)initializer_list實(shí)現(xiàn)分析
這篇文章主要介紹了C++11中跳轉(zhuǎn)initializer_list實(shí)現(xiàn)分析,實(shí)例分析initializer_list<T>初體驗(yàn),結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04C語(yǔ)言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解
這篇文章主要介紹了C語(yǔ)言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02C++ 數(shù)據(jù)結(jié)構(gòu)線性表-數(shù)組實(shí)現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)線性表-數(shù)組實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06C++ DLL動(dòng)態(tài)庫(kù)的創(chuàng)建與調(diào)用(類(lèi)庫(kù),隱式調(diào)用)
本文主要介紹了C++ DLL動(dòng)態(tài)庫(kù)的創(chuàng)建與調(diào)用(類(lèi)庫(kù),隱式調(diào)用),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C語(yǔ)言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解
這篇文章主要為大家介紹了C語(yǔ)言進(jìn)階輸入輸出重定向與fopen函數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒(méi)
這篇文章主要介紹了關(guān)于C++中sort()函數(shù)的用法,并通過(guò)三種方法介紹了按降序排列的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03C語(yǔ)言實(shí)現(xiàn)航班售票系統(tǒng) C語(yǔ)言實(shí)現(xiàn)航班管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)航班售票系統(tǒng),C語(yǔ)言實(shí)現(xiàn)航班管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12