摘要:利用语言进阶知识中的结构体枚举联合体来制作通讯录管理系统工程。
利用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"//初始化通讯录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"//初始化通讯录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"//初始化通讯录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"//初始化通讯录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"//初始化通讯录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"); }}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/120978.html
摘要:结构体类型的特殊声明在初阶结构体中,我们已经将了结构体类型是如何进行声明的,那么在这里,我们将讲一些特殊的结构体声明不完全的声明。所以我们应该这样写通过指针来找到下一个同类型结构体的写法,我们就称之为结构体的自引用。 ...
摘要:如下面的结构体包含三个成员,分别是。联合体是一种结构。其对其方式适合其中所有成员。 结构体、枚举、联合体 1.什么是结构体、枚举、联合体2.定义结构体2.1 包含...
摘要:本篇文章将用语言代码实现一个通讯录管理系统,本片文章博主将会运用到架构提,枚举,动态内存开辟和文件操作等。这里存放数据的结构是线性表。这个指针就可以通过动态开辟内存来调整存放信息的大小。扩容成功这样就实现了检查通讯录是否需要扩容的函数。 ...
摘要:文章目录前言前言一建立文件二编写函数三调试运行四成果展示五代码汇总总结前言通讯录是我们日常手机中常见的功能之一,综合语言中结构体,循环,条件语句,动态内存分配等等知识点,我们对手机通讯录进行一个简单的实现,下面我们开始讲解准备工作利用语 文章目录 前言一、建立文件二、编写函数三、调试运...
阅读 2000·2021-09-30 09:53
阅读 1844·2021-09-24 09:48
阅读 1757·2019-08-30 14:01
阅读 2171·2019-08-29 18:35
阅读 1251·2019-08-26 18:27
阅读 2981·2019-08-26 12:12
阅读 945·2019-08-23 17:16
阅读 934·2019-08-23 15:31