摘要:导航前言功能函数结构设定菜单交互主函数通讯录初始化新增联系人查找联系人删除联系人修改联系人查看所有联系人清空所有联系人以名字排序所有联系人结尾语前言本文将实现一个简易的电话簿管理。信息包括名字,性别,电话号码,年龄,住址。
本文将实现一个简易的电话簿管理。
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。
电话簿要实现功能如下
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
本文主要以信息存储在静态数组里面分析,并且会在文末增加动态版本。
我们存储的信息是复杂的,这需要结构体来描述。
信息包括名字,性别,电话号码,年龄,住址。
#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 20#define ADDR_MAX 30struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};
对于功能选择可以考虑枚举常量解决
enum Option{ EXIT,//0 ADD,//1 DEL,//2 SEARCH,//3 MODIFY,//4 SHOW,//5 SORT//6};
通讯录最多有1000人。
#define MAX 1000struct Contact{ struct PeoInfo date[MAX]; int sz;};
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");}
int main(){ int input = 0; struct 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 EXIT: //销毁通讯录 DestroyContact(&con); printf("退出通讯录/n"); break; default: printf("选择错误/n"); break; } } while (input); return 0;}
void Initcontact(struct Contact* pc){ pc->sz = 0; memset(pc->date, 0, MAX * sizeof(struct PeoInfo));}
void AddContact(struct Contact* pc){ struct PeoInfo tmp = { 0 }; if (pc->sz == MAX){ printf("通讯录已满1000人"); } else{ printf("请输入名字:>"); scanf("%s", tmp.name); printf("请输入年龄:>"); scanf("%d", tmp.age)); printf("请输入性别:>"); scanf("%s", tmp.sex); printf("请输入电话:>"); scanf("%s", tmp.tele); printf("请输入地址:>"); scanf("%s", tmp.addr); pc->data[pc->sz] = tmp; printf("添加成功!"); pc->sz++; }}
❗需要注意的是
- 需要判断通讯录有没有满,如果满人则不能再添加
- 我们用sz来记录最后一个成员
int FindContactByName(struct Contact* pc, char name[]){ int i = 0; for (i = 0; i < pc->sz; i++){ if (strcmp(pc->data[i].name, name) == 0){ return i; } } return -1;}
- 我们常见的联系人查找中,有通过名字或者通过电话号码查找,这里提供名字查找后返回数组下标的函数
- 这里通过字符串比较函数strcmp来比较名字是否相同
void SearchContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos= FindContactByName(pc, name); if (-1 == pos) { printf("查无此人"); } else { printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "姓名", "年龄", "性别", "电话", "地址"); printf("%15s/t%5s/t%8s/t%15s/t%30s/n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}
找到了就返回信息,没有找到就输出查无此人
void DelContact(struct Contact* pc){ if (pc->sz == 0){ printf("通讯录为空,无法删除/n"); } char name[NAME_MAX] = { 0 }; printf("请输入要删除人的名字"); scanf_s("%s", name); int pos=FindContactByName(pc,name);//按照名字去查找,找到了就返回下标,未找到就返回-1 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"); }}
- 执行删除操作需要判断是不是为空,如果是空的,那肯定不能再删除
- 找到后执行删除操作就是将后面信息往前覆盖,并且sz要减去1
- 没找到就要输出删除联系人不存在
void ModifyContact(struct Contact* pc){ char name[NAME_MAX] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) { printf("要修改的人不存在/n"); } else { printf("请输入新的名字:>"); scanf("%s", pc->data[pos].name);//选择放在下标为sz的data里面 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); }}
- 找到联系人进行修改
void ShowContact(struct Contact* pc){ int i = 0; printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "姓名", "年龄", "性别", "电话", "地址");//打印标题 for (i = 0; i < pc->sz; i++){ printf("%15s/t%5s/t%8s/t%15s/t%30s/n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}
void EmptyContact(struct Contact* pc){ pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoInfo));}
int CmpByname(const char* s1, const char* s2) { return strcmp(s1, s2);}void SortContact(struct Contact* pc) { qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByname); printf("排序完毕,请执行查看操作");}
- 这里采用的是C语言库函数qsort
- cmpbyname为自定义函数
本电话簿不足之处
- 电话簿人数固定为1000人,后续开辟动态版本
- 信息保存再主存中,关闭程序或者断电信息就会消失,后续增加文件保存函数,将信息保存在硬盘中
如有不足之处,欢迎指正!
源代码下载
?源代码下载链接
??下一篇:realloc实现动态电话簿?
?欢迎关注?点赞?收藏⭐️留言?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121535.html
小编写这篇文章的主要目的,主要介绍的是关于Python socket的相关知识,介绍的内容主要是涉及到编程的一些事情,以此用来进行搭建简易的网络聊天室,来实现相关的远程聊天,这其实就是聊天工具的初始原型,下面就具体的内容给大家详细解答下。 在这个周末刚刚写出来的python桌面应用--网络聊天室,主要通过pyqt5作为桌面应用框架,socket作为网络编程的框架,从而实现包括客户端和服务端的...
javascript实现纯前端将数据导出excel是有两种方式,现在就为大家介绍: 方法一 将table标签,包括tr、td等对json数据进行拼接,直接在table的表格上体现出,但此方法的弊端在于输出的是伪excel,即使是生成xls为后缀的文件,可文件形式上还是html, 代码如下: <html> <head> <pstyle="f...
小编写这篇文章的一个主要目的,主要是利用Python去制作截图工具,当然,这个截图工具是比较的简易的,那么,具体的一个制作步骤是什么呢?下面就给大家详细解答下。 这是工作期间同事想要个截完图之后可以显示并且永远前置的截图小工具(即不会被其他程序覆盖)直接上代码: ##-*-coding:utf-8-*- importtkinterastk importpyautogui imp...
此篇文章通常是详细介绍了pyecharts结合flask架构,通常是详细介绍怎样在Flask架构使得用pyecharts,文中根据实例编码为大家介绍得非常详尽,需用的小伙伴可以参考一下 详细介绍 文中通常是详细介绍怎样在Flask架构使得用pyecharts,有关Flask架构应用这儿不去做详细详细说明~ Flask模版3D渲染 首先要建立一个flask项目,flask项目对目录结构要...
阅读 3567·2021-11-15 11:36
阅读 1059·2021-11-11 16:55
阅读 692·2021-10-20 13:47
阅读 2992·2021-09-29 09:35
阅读 3427·2021-09-08 10:45
阅读 2552·2019-08-30 15:44
阅读 847·2019-08-30 11:10
阅读 1427·2019-08-29 13:43