摘要:前言我們需要用語言模擬一個通訊錄可以用來存儲個人的信息每個人的信息包括姓名電話性別住址年齡功能包括新增聯系人查找聯系人刪除聯系人修改聯系人查看所有聯系人以名字排序所有聯系人注此版本不包含其他內容,后續會出更加全面的升級版本通訊錄語言簡易版
前言:
我們需要用C語言模擬一個通訊錄可以用來存儲1000個人的信息
每個人的信息包括:
姓名、電話、性別、住址、年齡
功能包括:
- 新增聯系人
- 查找聯系人
- 刪除聯系人
- 修改聯系人
- 查看所有聯系人
- 以名字排序所有聯系人
注:此版本不包含其他內容,后續會出更加全面的升級版本
目錄
菜單能夠實現和用戶的交互。
那么作為一個通訊錄怎么能沒有菜單選項呢?
我們第一步先來設計一個菜單選項
代碼如下:
void menu(){ printf("*********************************/n"); printf("** 1. 添加聯系人 **/n"); printf("** 2. 刪除聯系人 **/n"); printf("** 3. 查找聯系人 **/n"); printf("** 4. 修改聯系人 **/n"); printf("** 5. 顯示所有聯系人 **/n"); printf("** 6. 按姓名排序聯系人 **/n"); printf("** 0. exit **/n"); printf("*********************************/n");}
?演示效果:
寫完了通訊錄菜單后,我們就要對主函數進行設計
代碼如下:
int main(){ int input = 0; //創建通訊錄 struct Contact con;//con就是通訊錄,里面包含:1000個元素的數和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("選擇錯誤/n"); break; } } while (input); return 0;}
上面主函數內部的分支循環?case?中我們輸入的字符是為了便于理解,但是這樣是沒辦法實現最開始的以數字來進行菜單選項的初衷的,所以我們需要枚舉這些選擇功能來達到這樣的一個效果。
代碼如下:
enum Choose{ EXIT, //0 ADD, //1 DEL, //2 SEARCH,//3 MODIFY,//4 SHOW, //5 SORT //6};
這一步是為了實現前言中的通訊錄內容以及聯系人內容,為此我們需要用到結構體函數 struct
代碼如下:
//結構體:通訊錄中每個成員的信息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個信息 int size;//記錄當前結構體內已經有的元素個數};
為了實現我們上面結構體內部的這些內容,我們需要進行一些聲明
代碼如下:
#define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_PHONE 12#define MAX_ADDRESS 30
盡管我們這是一個基礎的通訊錄,它并不具備保存功能,但是我們應該讓它擁有一個初始化功能。
代碼如下:
//初始化通訊錄的函數void InitContact(struct Contact *ps){ memset(ps->data, 0, sizeof(ps->data)); ps->size = 0;//設置通訊錄最初只有0個元素}
為了更好的實現通訊錄功能,使其可讀性提高,這里特意設計了一個函數來通過查找姓名來實現通訊錄的功能
代碼如下:
//修飾FindByName函數,使其封裝在程序內部,不暴露出去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;//找不到的情況}
//增加一個信息到通訊錄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"); }}
模擬效果:
//刪除指定的聯系人void DelContact(struct Contact *ps){ char name[MAX_NAME]; printf("請輸入要刪除人的名字:>"); scanf("%s", name); //1.查找要刪除的人在什么位置 //找到了返回名字所在元素的下標 //找不到返回 -1 int pos = FindByName(ps, name); //2.刪除 //查詢不到聯系人 if (pos == -1) { printf("查詢不到要刪除的聯系人,請重試/n"); } else { //刪除數據 int j = 0; for(j = pos; j < ps->size-1; j++) { ps->data[j] = ps->data[j + 1]; //由于刪除了這個數據,所以后面的數據會頂替上來 } 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); }}
演示效果:?
//修改指定聯系人的信息void MoidfyContact(struct Contact *ps){ char name[MAX_NAME]; printf("請輸入要修改聯系人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要修改聯系人的信息不存在,請重試/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; //標題 printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年齡", "性別", "電話", "地址"); //數據 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); } }}
演示效果:?
//按姓名排序通訊錄內容void SortContact(struct Contact *ps){ if (ps->size <= 0){ printf("通訊錄中沒有聯系人,請添加!/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"); }}
演示效果:?
由于此時通訊錄只有一個成員,我們無法直觀地實現按名字排序的效果,所以這邊添加了幾個聯系人來更好的演示。
(1)排序前
(2)排序后
寫到這里我們是不是忘記了點什么?沒錯,那就是頭文件,不引用頭文件就會產生報錯,所以我們在寫代碼的時候一定要加上頭文件哦!
代碼如下:
#include #include #include
最后我們獻上完整的代碼:
#include #include #include #define MAX 1000#define MAX_NAME 20#define MAX_SEX 5#define MAX_PHONE 12#define MAX_ADDRESS 30//枚舉:選擇功能enum Choose{ EXIT, //0 ADD, //1 DEL, //2 SEARCH,//3 MODIFY,//4 SHOW, //5 SORT //6};//結構體:通訊錄中每個成員的信息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個信息 int size;//記錄當前結構體內已經有的元素個數};//初始化通訊錄的函數void InitContact(struct Contact *ps){ memset(ps->data, 0, sizeof(ps->data)); ps->size = 0;//設置通訊錄最初只有0個元素}//增加一個信息到通訊錄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函數,使其封裝在程序內部,不暴露出去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;//找不到的情況}//刪除指定的聯系人void DelContact(struct Contact *ps){ char name[MAX_NAME]; printf("請輸入要刪除人的名字:>"); scanf("%s", name); //1.查找要刪除的人在什么位置 //找到了返回名字所在元素的下標 //找不到返回 -1 int pos = FindByName(ps, name); //2.刪除 //查詢不到聯系人 if (pos == -1) { printf("查詢不到要刪除的聯系人,請重試/n"); } else { //刪除數據 int j = 0; for(j = pos; j < ps->size-1; j++) { ps->data[j] = ps->data[j + 1]; //由于刪除了這個數據,所以后面的數據會頂替上來 } 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); }}//修改指定聯系人的信息void MoidfyContact(struct Contact *ps){ char name[MAX_NAME]; printf("請輸入要修改聯系人的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("要修改聯系人的信息不存在,請重試/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; //標題 printf("%-20s/t%-4s/t%-5s/t%-12s/t%-20s/n", "名字", "年齡", "性別", "電話", "地址"); //數據 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); } }}//按姓名排序通訊錄內容void SortContact(struct Contact *ps){ if (ps->size <= 0){ printf("通訊錄中沒有聯系人,請添加!/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. 添加聯系人 **/n"); printf("** 2. 刪除聯系人 **/n"); printf("** 3. 查找聯系人 **/n"); printf("** 4. 修改聯系人 **/n"); printf("** 5. 顯示所有聯系人 **/n"); printf("** 6. 按姓名排序聯系人 **/n"); printf("** 0. exit **/n"); printf("*********************************/n");}int main(){ int input = 0; //創建通訊錄 struct Contact con;//con就是通訊錄,里面包含:1000個元素的數和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("選擇錯誤/n"); break; } } while (input); return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119295.html
??C語言通訊錄管理系統(簡易版)?? ?一、通訊錄?二、菜單實現和用戶交互?三、主函數????1.enum選項????2.switch判斷 ?四、定義聯系人和通訊錄????1.定義聯系人結構體????2.定義通訊錄結構體????3.定義結構體變量 ?五、通訊錄初始化?六、新增聯系人?七、查找聯系人?八、刪除聯系人?九、修改聯系人?十、查看所有聯系人?十一、清空所有聯系人?十二、以名字排序所有...
摘要:之前的通訊錄在程序退出后內部的數據就會消失,再次打開程序后只能重新輸入數據,為此我們增加了一個保存功能來保存信息。 前言: 由于之前實現的通訊錄在存儲方面只能支持靜態的1000人的存儲量,但是如果聯系人較少,則會造成較大的內存浪費。而當聯系人一旦超過1000時,就不能再繼續存儲信息了。因...
摘要:那么我們首先來改造儲存空間也就是通訊錄結構體靜態版本人信息存放在數組中統計存放的人數動態版本統計存放的人數有效容量我們將原本的結構體數組改為一個結構體指針,以此來維護用以儲存個人信息的空間。 上一期我們編寫了一個C語言版本的簡易通訊錄,但是我們的之前的通訊錄是沒有記憶功能的,也就是說,一旦關...
摘要:導航前言功能函數結構設定菜單交互主函數通訊錄初始化新增聯系人查找聯系人刪除聯系人修改聯系人查看所有聯系人清空所有聯系人以名字排序所有聯系人結尾語前言本文將實現一個簡易的電話簿管理。信息包括名字,性別,電話號碼,年齡,住址。 ...
摘要:學單片機多去官網上查資料,下載手冊,像我入門的單片機經常去官網,還有學的系列板子,公司的官網的官方例程給的很詳細,在英文視角閱讀對你大有益處。 目錄 1.C語言經典 2.單片機系列 3.Python方面 4.嵌入式LWip協議 5.Android 6.C++經典書籍 7.Linux開發 ...
閱讀 2818·2021-10-26 09:48
閱讀 1684·2021-09-22 15:22
閱讀 4062·2021-09-22 15:05
閱讀 621·2021-09-06 15:02
閱讀 2612·2019-08-30 15:52
閱讀 2117·2019-08-29 18:38
閱讀 2763·2019-08-28 18:05
閱讀 2336·2019-08-26 13:55