摘要:利用語言進階知識中的結構體枚舉聯合體來制作通訊錄管理系統工程。
利用C語言進階知識中的結構體、枚舉、聯合體來制作通訊錄管理系統工程。
相比于以往寫三子棋游戲的籠統,該文章更加詳細的解釋每一步、每個函數創建后的測試,逐層分析代碼。
日后,看懂的基礎上還需多加敲寫,不斷完善自己的邏輯!?????????????????????
????????????????
目錄
?排序函數就不再多帶帶編寫了,利用qsort( )函數就可以解決,閑時可能會繼續在此寫寫.........
目前,先在contact.c文件中聲明了一個人的所包含的信息、多少個人? 以及當前通訊錄有效信息(? 該通訊錄目前包含多少人? ?)
contact.c文件
#pragma once#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//1000個人的信息struct PeoInfo data[PEOPLE_MAX];int sz;//當前通訊錄的有效信息(包含多少個人的信息)
有了通訊錄,我們需要清理,即:
contact.c文件
#pragma once#include#include#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact{ struct PeoInfo data[PEOPLE_MAX];//1000個人的數據,存放在data數組中 int sz;//記錄當前通訊錄的有效信息的個數(包含多少個人的信息)};//初始化通訊錄void InitContact(struct Contact* pc);
contact.c文件
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"http://初始化通訊錄void InitContact(struct Contact* pc){ pc->sz = 0;//默認沒有信息 //memset(pc->data, 0, PEOPLE_MAX * sizeof(struct PeoInfo)); memset(pc->data, 0, PEOPLE_MAX * sizeof(pc->data));}
test.c文件
#include"contact.h"void menu(){ printf("************************************/n"); 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"); printf("************************************/n");}enum Option{ EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; //創建一個通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>/n"); scanf("%d", &input); switch (input) { case ADD: break; case DEL: break; case SHOW: break; case EXIT: printf("退出通訊錄/n"); break; default: printf("選擇錯誤!/n"); break; } } while (input); return 0;}
——————>查看添加聯系人的工程是否制作完成,利用Show來打印:
test.c文件
#include"contact.h"void menu(){ printf("************************************/n"); 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"); printf("************************************/n");}enum Option{ EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; //創建一個通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>/n"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: break; case SHOW: ShowContact(&con); break; case EXIT: printf("退出通訊錄/n"); break; default: printf("選擇錯誤!/n"); break; } } while (input); return 0;}
contact.h文件
#pragma once#include#include#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact{ struct PeoInfo data[PEOPLE_MAX];//1000個人的數據,存放在data數組中 int sz;//記錄當前通訊錄的有效信息的個數(包含多少個人的信息)};//初始化通訊錄void InitContact(struct Contact* pc);//增加聯系人void AddContact(struct Contact* pc);//顯示所有的聯系人void ShowContact(struct Contact* pc);
contact.c文件
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"http://初始化通訊錄void InitContact(struct Contact* pc){ pc->sz = 0;//默認沒有信息 //memset(pc->data, 0, PEOPLE_MAX * sizeof(struct PeoInfo)); memset(pc->data, 0, PEOPLE_MAX * sizeof(pc->data));}//增加聯系人void AddContact(struct Contact* pc){ if (pc->sz == PEOPLE_MAX) { printf("通訊錄滿了/n"); } else { 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++; }}//顯示所有的聯系人void ShowContact(struct Contact* pc){ int i = 0; //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->sz; i++) { //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); }}
打印效果演示:
刪除功能:
我們想要實現指定刪除聯系人的功能,就需要先確定要刪除的名字是什么,那么必然需要判斷該名字在不在此通訊錄中,就想到了需要pos記錄下標
test.c文件
#include"contact.h"void menu(){ printf("************************************/n"); 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"); printf("************************************/n");}enum Option{ EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; //創建一個通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>/n"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SHOW: ShowContact(&con); break; case EXIT: printf("退出通訊錄/n"); break; default: printf("選擇錯誤!/n"); break; } } while (input); return 0;}
contact.h文件
#pragma once#include#include#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact{ struct PeoInfo data[PEOPLE_MAX];//1000個人的數據,存放在data數組中 int sz;//記錄當前通訊錄的有效信息的個數(包含多少個人的信息)};//初始化通訊錄void InitContact(struct Contact* pc);//增加聯系人void AddContact(struct Contact* pc);//顯示所有的聯系人void ShowContact(struct Contact* pc);//刪除指定聯系人void DelContact(struct Contact* pc);
contact.c文件
用strcmp函數來確認是否通訊錄中含有該名字的信息
如果存在改名字信息,就需要完成指定刪除,而刪除就要把該指定聯系人該行信息刪除后,后面聯系人的信息依次順移
for (j = pos; j < pc->sz - 1; j++)中的 pc->sz - 1需要多加思考,因為最后一個信息后面就沒有信息了,data[j+1]繼續將后面? “? 莫須有 ”? 的信息往前順移就不合理了。
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"http://初始化通訊錄void InitContact(struct Contact* pc){ pc->sz = 0;//默認沒有信息 //memset(pc->data, 0, PEOPLE_MAX * sizeof(struct PeoInfo)); memset(pc->data, 0, sizeof(pc->data));}//增加聯系人void AddContact(struct Contact* pc){ if (pc->sz == PEOPLE_MAX) { printf("通訊錄滿了/n"); } else { 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++; }}//顯示所有的聯系人void ShowContact(struct Contact* pc){ int i = 0; //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->sz; i++) { //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); }}//刪除指定聯系人int FindContactByName(struct Contact* pc, const char* name){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到 return -1;}void DelContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("請輸入要刪除聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的聯系人不存在!/n"); } //刪除 else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; //提示 printf("刪除成功!/n"); }}
我們發現程序執行到最后有個小Bug,那就是通訊錄已經為空了,繼續刪是執行不了的,所以我們代碼中應該再完善一下;
刪除之前,先判斷一下該通訊錄是否還有信息可以刪除,如果沒有信息可以刪除,那么就直接return,表示刪除結束就可以了。
完善的contact.c文件:
//省略內容,見上void DelContact(struct Contact* pc){ if (pc->sz == 0) { printf("通訊錄為空,無法刪除!/n"); return; } char name[NAME_MAX] = { 0 }; printf("請輸入要刪除聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的聯系人不存在!/n"); } //刪除 else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; //提示 printf("刪除成功!/n"); }}
想要實現查找,就需要用FindContactByName先確定pos,看是否查找的聯系人在通訊錄里。
如果在通訊錄里,就用類似于顯示功能函數將 “ 遍歷 ”步驟換成僅打印pos位置的數據即可
test.c文件
#include"contact.h"void menu(){ printf("************************************/n"); 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"); printf("************************************/n");}enum Option{ EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; //創建一個通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>/n"); scanf("%d", &input); switch (input) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case SHOW: ShowContact(&con); break; case EXIT: printf("退出通訊錄/n"); break; default: printf("選擇錯誤!/n"); break; } } while (input); return 0;}
contact.h文件
#pragma once#include#include#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact{ struct PeoInfo data[PEOPLE_MAX];//1000個人的數據,存放在data數組中 int sz;//記錄當前通訊錄的有效信息的個數(包含多少個人的信息)};//初始化通訊錄void InitContact(struct Contact* pc);//增加聯系人void AddContact(struct Contact* pc);//顯示所有的聯系人void ShowContact(struct Contact* pc);//刪除指定聯系人void DelContact(struct Contact* pc);//查找指定聯系人void SearchContact(const struct Contact* pc);
contact.c文件
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"http://初始化通訊錄void InitContact(struct Contact* pc){ pc->sz = 0;//默認沒有信息 //memset(pc->data, 0, PEOPLE_MAX * sizeof(struct PeoInfo)); memset(pc->data, 0, sizeof(pc->data));}//增加聯系人void AddContact(struct Contact* pc){ if (pc->sz == PEOPLE_MAX) { printf("通訊錄滿了/n"); } else { 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++; }}//顯示所有的聯系人void ShowContact(struct Contact* pc){ int i = 0; //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->sz; i++) { //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); }}//刪除指定聯系人int FindContactByName(const struct Contact* pc, const char* name){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到 return -1;}void DelContact(struct Contact* pc){ if (pc->sz == 0) { printf("通訊錄為空,無法刪除!/n"); return; } char name[NAME_MAX] = { 0 }; printf("請輸入要刪除聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的聯系人不存在!/n"); } //刪除 else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; //提示 printf("刪除成功!/n"); }}//查找指定聯系人void SearchContact(const struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("輸入要查找的聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("查無此人!/n"); } else { //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}
和查找函數一樣,甚至可以直接copy下來代碼,來判斷要修改的聯系人是否存在。
如果pos存在,那么就需要用類似于Add函數的代碼,只不過把 “ 遍歷 ”換成pos位置處的數據來進行修改即可:
test.c文件
#include"contact.h"void menu(){ printf("************************************/n"); 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"); printf("************************************/n");}enum Option{ EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT};int main(){ int input = 0; //創建一個通訊錄 struct Contact con; //初始化通訊錄 InitContact(&con); do { menu(); printf("請選擇:>/n"); 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 EXIT: printf("退出通訊錄/n"); break; default: printf("選擇錯誤!/n"); break; } } while (input); return 0;}
contact.h文件
#pragma once#include#include#define NAME_MAX 30#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 30#define PEOPLE_MAX 1000//一個人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通訊錄struct Contact{ struct PeoInfo data[PEOPLE_MAX];//1000個人的數據,存放在data數組中 int sz;//記錄當前通訊錄的有效信息的個數(包含多少個人的信息)};//初始化通訊錄void InitContact(struct Contact* pc);//增加聯系人void AddContact(struct Contact* pc);//顯示所有的聯系人void ShowContact(struct Contact* pc);//刪除指定聯系人void DelContact(struct Contact* pc);//查找指定聯系人void SearchContact(const struct Contact* pc);//修改指定聯系人void ModifyContact(struct Contact* pc);
contact.c文件
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"http://初始化通訊錄void InitContact(struct Contact* pc){ pc->sz = 0;//默認沒有信息 //memset(pc->data, 0, PEOPLE_MAX * sizeof(struct PeoInfo)); memset(pc->data, 0, sizeof(pc->data));}//增加聯系人void AddContact(struct Contact* pc){ if (pc->sz == PEOPLE_MAX) { printf("通訊錄滿了/n"); } else { 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++; }}//顯示所有的聯系人void ShowContact(struct Contact* pc){ int i = 0; //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->sz; i++) { //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr ); }}//刪除指定聯系人int FindContactByName(const struct Contact* pc, const char* name){ int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到 return -1;}void DelContact(struct Contact* pc){ if (pc->sz == 0) { printf("通訊錄為空,無法刪除!/n"); return; } char name[NAME_MAX] = { 0 }; printf("請輸入要刪除聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("指定的聯系人不存在!/n"); } //刪除 else { int j = 0; for (j = pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--; //提示 printf("刪除成功!/n"); }}//查找指定聯系人void SearchContact(const struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("輸入要查找的聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("查無此人!/n"); } else { //打印標題 (美觀) printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr"); //打印每個數據 printf("%15s/t%5d/t%8s/t%15s/t%30s/n/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}//修改指定聯系人void ModifyContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("輸入要修改的聯系人的名字:>"); scanf("%s", name); //查找 int pos = FindContactByName(pc, name); if (pos == -1) { printf("要修改的聯系人數據不存在!/n"); } else { 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"); }}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/120978.html
摘要:結構體類型的特殊聲明在初階結構體中,我們已經將了結構體類型是如何進行聲明的,那么在這里,我們將講一些特殊的結構體聲明不完全的聲明。所以我們應該這樣寫通過指針來找到下一個同類型結構體的寫法,我們就稱之為結構體的自引用。 ...
摘要:如下面的結構體包含三個成員,分別是。聯合體是一種結構。其對其方式適合其中所有成員。 結構體、枚舉、聯合體 1.什么是結構體、枚舉、聯合體2.定義結構體2.1 包含...
摘要:本篇文章將用語言代碼實現一個通訊錄管理系統,本片文章博主將會運用到架構提,枚舉,動態內存開辟和文件操作等。這里存放數據的結構是線性表。這個指針就可以通過動態開辟內存來調整存放信息的大小。擴容成功這樣就實現了檢查通訊錄是否需要擴容的函數。 ...
摘要:文章目錄前言前言一建立文件二編寫函數三調試運行四成果展示五代碼匯總總結前言通訊錄是我們日常手機中常見的功能之一,綜合語言中結構體,循環,條件語句,動態內存分配等等知識點,我們對手機通訊錄進行一個簡單的實現,下面我們開始講解準備工作利用語 文章目錄 前言一、建立文件二、編寫函數三、調試運...
閱讀 2013·2021-09-30 09:53
閱讀 1855·2021-09-24 09:48
閱讀 1765·2019-08-30 14:01
閱讀 2176·2019-08-29 18:35
閱讀 1258·2019-08-26 18:27
閱讀 2987·2019-08-26 12:12
閱讀 955·2019-08-23 17:16
閱讀 950·2019-08-23 15:31