C語言靜態(tài)版通訊錄的設計與實現(xiàn)
1. 配置運行環(huán)境
本通訊錄運用到了三個文件
test.c //測試通訊錄的相關功能
contact.h //聲明
contact.c //通訊錄的實現(xiàn)模塊
2. 通訊錄的實現(xiàn)
想要做通訊錄,首要任務就是要把模塊想好。
先打印一個通訊錄的界面菜單
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)系人的信息
- 對聯(lián)系人的排序
- 顯示聯(lián)系人的信息
- 退出通訊錄
創(chuàng)建人的信息的結構體類型
第一步是封裝一個人的信息的結構體類型
由于封裝的結構體類型的名字太長,總是寫的話感覺太麻煩了
對 struct PeoInfo進行了typdef類型重命名
struct PeoInfp 改成 PeoInfp
//表示一個人的信息 typedef struct PeoInfo { char name[20]; int age; char sex[5]; char tele[12]; char addr[30]; }PeoInfo;
以上的數(shù)值如果以后會經(jīng)常用到的話,可以用#define 來定義,方便以后修改
#define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30
2.2 增加信息功能代碼的實現(xiàn)
//增加通訊錄信息 void AddContact(Contact* pc) { if (DATA_MAX == pc->sz) { 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); printf("信息添加成功!\n"); pc->sz++; }
2.3 顯示信息功能代碼的實現(xiàn)
void ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話 地址 //zhangsan 20 男 123456 北京 // //打印標題 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 刪除信息功能代碼的實現(xiàn)
void DelContact(pContact pc) { char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("通訊錄為空,無法刪除\n"); return; } //刪除 //1. 找到要刪除的人 - 位置(下標) printf("輸入要刪除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要刪除的人不存在\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 查詢信息功能代碼的實現(xiàn)
void SearchContact(const Contact* pc) { char name[MAX_NAME] = {0}; printf("請輸入要查找人的名字:>"); 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 修改信息功能代碼的實現(xiàn)
void ModifyContact(Contact* pc) { char name[MAX_NAME] = {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"); }
2.7 按名字排序信息功能代碼的實現(xiàn)
//按照名字來排序 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("通訊錄已滿,無法增加\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 ShowContact(const Contact* pc) { int i = 0; //姓名 年齡 性別 電話 地址 //hengchuan 20 男 123456 北京 // //打印標題 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("通訊錄為空,無法刪除\n"); return; } //刪除 //1. 找到要刪除的人 - 位置(下標) printf("輸入要刪除人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要刪除的人不存在\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("請輸入要查找人的名字:>"); 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("請輸入要修改人的名字:>"); 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_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 //表示一個人的信息 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //靜態(tài)版本的設計 typedef struct Contact { PeoInfo data[MAX];//存放數(shù)據(jù) int sz;//記錄通訊錄中的有效信息個數(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("請選擇:>"); 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("選擇錯誤\n"); break; } } while (input); return 0; }
4. 靜態(tài)版本通訊錄的缺點
缺點:
通訊錄的大小是固定的 - 100個元素當通訊錄退出后,重新運行,之前的信息都丟了
當前通訊錄中的信息都是保存在內存中的,程序退出,內存就回收了,下一次重新運行程序,內存重新分配,之前的數(shù)據(jù)就不見了
到此這篇關于C語言靜態(tài)版通訊錄的設計與實現(xiàn)的文章就介紹到這了,更多相關C語言靜態(tài)版通訊錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++11中跳轉initializer_list實現(xiàn)分析
這篇文章主要介紹了C++11中跳轉initializer_list實現(xiàn)分析,實例分析initializer_list<T>初體驗,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04C語言中指針 int *p=0;和int *p;*p=0;和”&“的關系和區(qū)別詳解
這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關系和區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02C++ 數(shù)據(jù)結構線性表-數(shù)組實現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)結構線性表-數(shù)組實現(xiàn)的相關資料,需要的朋友可以參考下2017-06-06C++ DLL動態(tài)庫的創(chuàng)建與調用(類庫,隱式調用)
本文主要介紹了C++ DLL動態(tài)庫的創(chuàng)建與調用(類庫,隱式調用),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05C語言進階輸入輸出重定向與fopen函數(shù)使用示例詳解
這篇文章主要為大家介紹了C語言進階輸入輸出重定向與fopen函數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02C語言實現(xiàn)航班售票系統(tǒng) C語言實現(xiàn)航班管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)航班售票系統(tǒng),C語言實現(xiàn)航班管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12