通讯录的实现(详解)

本篇博客将为大家带来通讯录的实现!!!

目录

通讯录的基本介绍:

 通讯录的实现过程:

1.设计通讯录的目录

2.基础菜单的实现:

3.定义人的信息

4.定义通讯录的信息

5.创建通讯录并且初始化

6.添加联系人的信息

7.显示通讯录的信息

8.删除联系人的信息

9.查找联系人的信息

10.修改联系人的信息

11.排序联系人的信息—按名字排序

完整代码展现:

test.c:

contact.c:

contact.h:

结语:


通讯录的基本介绍:

记录一个人的基本信息,并且需要它可以实现增删查改等功能;

可以保存100个人的信息                                    人的信息:

        1.添加联系人信息;                                    名字

        2.删除联系人信息;                                    年龄

        3.查找联系人信息;                                    性别

        4.修改联系人信息;                                    电话

        5.显示联系人信息;                                    地址

        6.排序联系人信息;

        0.退出程序 

     


 通讯录的实现过程:

建议:实现之前我们可以分成三个模块

test.c用于专门测试通讯录功能

contact.c用于实现通讯录具体功能

contact.h用于实现接口的声明

1.设计通讯录的目录

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.基础菜单的实现:

#include <stdio.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
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:break;case DEL:break;case SEARCH:break;case MODIFY:break;case SHOW:break;case SORT:break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

3.定义人的信息

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30//定义人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;

4.定义通讯录的信息

#define MAX 100
typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录的时当前通讯录中存放的人的信息个数
}Contact;

5.创建通讯录并且初始化

通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化

void InitContact(Contact* con)
{assert(con);con->sz = 0;memset(con->data, 0, sizeof(con->data));}

 现在已经全部初始化为0 如果不初始化将会是随机值

注:实现过程都是在contact.c中的文件实现

6.添加联系人的信息

void ADDContact(Contact* con)
{assert(con);//判断一下通讯录是否满了if (con->sz == MAX){printf("通讯录已满,无法添加\n");return ;}printf("请输入联系人名字\n");scanf("%s", con->data->name);printf("请输入联系人年龄\n");scanf("%d", &(con->data->age));printf("请输入联系人性别\n");scanf("%s", con->data->sex);printf("请输入联系人电话\n");scanf("%s", con->data->tele);printf("请输入联系人地址\n");scanf("%s", con->data->addr);con->sz++;printf("添加完成\n");}

7.显示通讯录的信息

既然已经完成了添加联系人的信息了,我们可以显示一下到底输入了什么

void SHOWContact(Contact* con)
{assert(con);if (con->sz == 0){printf("通讯录无内容\n");return;}printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");int i;for (i = 0; i < con->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name, con->data[i].age,con->data[i].sex, con->data[i].tele,con->data[i].addr);}}

8.删除联系人的信息

int Fing_by_name(Contact* con, char* name)
{assert(con);int i;for (i = 0; i < con->sz; i++){if (strcmp(con->data[i].name, name) == 0){return i;}}return -1;
}void DELContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法删除\n");return ;}printf("请输入你想删除联系人的名字:\n");scanf("%s", name);// 查找通讯录里有没有该名字int ret=Fing_by_name(con, name);if (ret == -1){printf("要删除的人不存在\n");return ;}//否则返回他的下标  //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可int i;for (i = ret; i < con->sz - 1; i++){con->data[i] = con->data[i + 1];}con->sz--;printf("删除成功\n");
}

不懂的可以看里面的注释,这个先要写一个查找函数,在删除

9.查找联系人的信息

void SEARCHContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法查找\n");return;}printf("请输入你想查找联系人的名字:\n");scanf("%s", name);int ret = Fing_by_name(con, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,con->data[ret].age,con->data[ret].sex,con->data[ret].tele,con->data[ret].addr);
}

思路很简单了 ,先查找出来 再打印出来

10.修改联系人的信息

void MODIFYContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法修改\n");return;}printf("请输入你想修改联系人的名字:\n");scanf("%s", name);int ret = Fing_by_name(con, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入联系人名字:");scanf("%s", con->data[ret].name);printf("请输入联系人年龄:");scanf("%d", &(con->data[ret].age));printf("请输入联系人性别:");scanf("%s", con->data[ret].sex);printf("请输入联系人电话:");scanf("%s", con->data[ret].tele);printf("请输入联系人地址:");scanf("%s", con->data[ret].addr);printf("修改完成\n");
}

先查找到改信息 在重新输入

11.排序联系人的信息—按名字排序

int cmp_by_name(const void* e1, const void* e2)
{return strcmp(   ((PeoInfo*)e1)->name  , ((PeoInfo*)e2)->name);
}
void SORTContact(Contact* con)
{assert(con);if (con->sz == 0){printf("通讯录为空,无法排序\n");return;}qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);printf("排序完成\n");
}

 这里要运用的qosrt函数,不会的可以看我之前的文章有介绍,很好实现的


完整代码展现:

test.c:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#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
{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;
}

contact.c:

#include "contact.h"
void InitContact(Contact* con)
{assert(con);con->sz = 0;memset(con->data, 0, sizeof(con->data));}void ADDContact(Contact* con)
{assert(con);//判断一下通讯录是否满了if (con->sz == MAX){printf("通讯录已满,无法添加\n");return ;}printf("请输入联系人名字:");scanf("%s", con->data[con->sz].name);printf("请输入联系人年龄:");scanf("%d", &(con->data[con->sz].age));printf("请输入联系人性别:");scanf("%s", con->data[con->sz].sex);printf("请输入联系人电话:");scanf("%s", con->data[con->sz].tele);printf("请输入联系人地址:");scanf("%s", con->data[con->sz].addr);con->sz++;printf("添加完成\n");}void SHOWContact(Contact* con)
{assert(con);if (con->sz == 0){printf("通讯录无内容\n");return;}printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");int i;for (i = 0; i < con->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",con->data[i].name, con->data[i].age,con->data[i].sex, con->data[i].tele,con->data[i].addr);}}int  Fing_by_name(Contact* con, char* name)
{assert(con);int i;for (i = 0; i < con->sz; i++){if (strcmp(con->data[i].name, name) == 0){return i;}}return -1;
}void DELContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法删除\n");return ;}printf("请输入你想删除联系人的名字:\n");scanf("%s", name);// 查找通讯录里有没有该名字int ret=Fing_by_name(con, name);if (ret == -1){printf("要删除的人不存在\n");return ;}//否则返回他的下标  //思路: 因为要删除这一行信息 所以直接让后面的信息往前挪一个信息即可int i;for (i = ret; i < con->sz - 1; i++){con->data[i] = con->data[i + 1];}con->sz--;printf("删除成功\n");
}void SEARCHContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法查找\n");return;}printf("请输入你想查找联系人的名字:\n");scanf("%s", name);int ret = Fing_by_name(con, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("%-20s%-5d%-5s%-12s%-30s\n", con->data[ret].name,con->data[ret].age,con->data[ret].sex,con->data[ret].tele,con->data[ret].addr);printf("查找完成");
}void MODIFYContact(Contact* con)
{char name[NAME_MAX];assert(con);if (con->sz == 0){printf("通讯录为空,无法修改\n");return;}printf("请输入你想修改联系人的名字:\n");scanf("%s", name);int ret = Fing_by_name(con, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入联系人名字:");scanf("%s", con->data[ret].name);printf("请输入联系人年龄:");scanf("%d", &(con->data[ret].age));printf("请输入联系人性别:");scanf("%s", con->data[ret].sex);printf("请输入联系人电话:");scanf("%s", con->data[ret].tele);printf("请输入联系人地址:");scanf("%s", con->data[ret].addr);printf("修改完成\n");
}int cmp_by_name(const void* e1, const void* e2)
{return strcmp(   ((PeoInfo*)e1)->name  , ((PeoInfo*)e2)->name);
}
void SORTContact(Contact* con)
{assert(con);if (con->sz == 0){printf("通讯录为空,无法排序\n");return;}qsort(con->data, con->sz, sizeof(con->data[0]), cmp_by_name);printf("排序完成\n");
}

contact.h:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100//定义人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录的时当前通讯录中存放的人的信息个数
}Contact;//初始化通讯录
void InitContact(Contact* con);//添加联系人的信息
void ADDContact(Contact* con);//显示通讯录的信息
void SHOWContact(Contact* con);//删除联系人的信息
void DELContact(Contact* con);//查找联系人的信息
void SEARCHContact(Contact* con);//修改联系人的信息
void MODIFYContact(Contact* con);//排序联系人的信息-按名字
void SORTContact(Contact* con);

结语:

首先非常感谢大家的观看,这只是一个初步的通讯录,它还可以进阶实现

这个通讯录还存在很多缺陷:

1.它不能保存完成,一旦退出就消失了

2.它至少固定的大小,我们只开创了100个联系人,万一少于联系人,这个就浪费了很多的空间

所以下次我们会使用动态内存管理,可以自由开辟内存,就不会有浪费或不够。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140793.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

面试问题之如何解释微服务

这次的面试还是感觉非常愉快&#xff0c;没有那么憋屈&#xff0c;问的问题也非常有意思。 问题 假设现在有一个人完全不懂微服务&#xff0c;你能和对方解释下什么是微服务吗&#xff1f; 面试回答 这个问题如果要完全回答好&#xff0c;感觉不是那么容易。 什么是微服务 …

基于springboot高校场馆预订系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

JAXB(Java Architecture for XML Binding)下载、使用

简介 JAXB&#xff08;Java Architecture for XML Binding&#xff09;就是XML数据绑定的java架构。JAXB可以根据XML Schema生成java类&#xff0c;也能根据java类生成XML Schema&#xff0c;XML数据绑定指定了XML请求和XML响应如何映射成java对象。 JAXB提供了API和工具&…

笔记 | 非素数个数(朴素筛查 || 埃式筛查法)

非素数个数 题目描述朴素筛查方法题解 题目描述 求a-b之间的非素数个数 特别的&#xff0c;1也算作素数&#xff0c;区间是[a, b]。 输入输出格式 输入描述: 多组测试数据。 输入两个正整数数a,b&#xff0c;其中a<b<10^7。 输出描述: 输出答案。 输入输出样例 输入样例…

浅谈SpringMVC的请求流程

目录标题 浅谈SpringMVC的请求流程SpringMVC的介绍SpringMVC的逻辑概念运行图解知识总结 浅谈SpringMVC的请求流程 对于SpringMVC而言重点是了解它的底层运行逻辑&#xff0c;从而可以根据其逻辑来进行实际业务的操作或者是利用原理增强业务的功能性&#xff0c;最终达到项目预…

利用hutool工具类实现验证码功能

hutool工具类实现验证码 一.生成验证码二.校验验证码三.使用案例1.引入hutool工具类2.VerifyCodeResp接口响应体3.VerifyCodeController验证码工具类4.测试验证5.项目结构及源码下载 利用hutool工具类&#xff0c;可以很方便生成不同类型的验证码。这里简单记录下使用过程。 一…

基于OSATE环境的AADL项目——简单的项目构建与分析示例

一、背景 本文描述了一个非常简单的AADL项目的构建&#xff0c;以及一个示例项目的分析过程。本文主要记录了OSATE工具环境的一些基本操作&#xff0c;适用于刚刚了解OSATE之后&#xff0c;对于整个工具环境无从下手的小白。 因为基于OSATE环境的AADL项目的构建和分析的详细示…

LeetCode算法心得——美丽塔 I(HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;hashmap的灵活应用&#xff0c;然后边界的细节处理&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .美丽塔 美丽塔 I 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴…

Keil 无法烧写程序

问题描述&#xff1a; Keil MDK V5.38 按 F8 键无法烧录程序&#xff0c;提示: Error: Flash Download failed - "Cortex-M7", No Algorithm found for: 08000000H - 080013D3H 解决办法&#xff1a; Debug 工具改为&#xff1a;ST-Link Debugger Debug 的 Conne…

【C++】STL之list深度剖析及模拟实现

目录 前言 一、list 的使用 1、构造函数 2、迭代器 3、增删查改 4、其他函数使用 二、list 的模拟实现 1、节点的创建 2、push_back 和 push_front 3、普通迭代器 4、const 迭代器 5、增删查改(insert、erase、pop_back、pop_front) 6、构造函数和析构函数 6.1、默认构造…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

【pytest】 参数化@pytest.mark.parametrize

1.创建 test_parametrize.py 通过 pytest.mark.parametrize 方法设置参数 import pytestimport math#pytest参数化 pytest.mark.parametrize("base,exponent,expected", # 参数变量名称# 每个元组都是一条测试用例测试数据[(2,2,4),(3,3,9),(1,9,1),(0,9,0)],i…

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接&#xff1a;http://tecdat.cn/?p24492 此分析的目的是构建一个过程&#xff0c;以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益&#xff08;点击文末“阅读原文”获取完整代码数…

Java————网络编程

一 、网络编程基础 1. 为什么需要网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c; 如优酷看视频&#xff0c;实质是通过网络&#xff0c; 获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。 相比本地资…

汽车电子——产品标准规范汇总和梳理(车载网络)

文章目录 前言 一、菊花链 二、K Line 三、L Line 四、RS485 五、LIN 六、CAN 七、FlexRay 八、MOST 九、Bluetooth 十、LAN 十一、移动网络 十二、实施和测试 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、菊花链 暂无统一的正式标准。 菊花链通信&…

Linux查看系统信息

# 查看操作系统的详细信息 uname -a# 查看已安装的Linux发行版信息 cat /etc/os-release# 查看Linux Standard Base (LSB)的信息 lsb_release -a# 查看主机的信息 hostnamectl# 查看文件系统的磁盘空间使用情况 df -h# 查看系统内存的使用情况 free -h# 查看网络接口的信息 ifc…

[React] react-hooks如何使用

react-hooks思想和初衷&#xff0c;也是把组件&#xff0c;颗粒化&#xff0c;单元化&#xff0c;形成独立的渲染环境&#xff0c;减少渲染次数&#xff0c;优化性能。 文章目录 1.为什么要使用hooks2.如何使用hooks2.1 useState2.2 useEffect2.3 useLayoutEffect2.4 useRef2.5…

【网络编程】TCP Socket编程

TCP Socket编程 1. ServerSocket2. Socket3. TCP的长短连接4. Socket 通信模型5. 代码示例&#xff1a;TCP 回显服务器 流套接字&#xff1a; 使用传输层TCP协议 TCP: 即Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;传输层协议。 TCP的特点…

【计算机网络】IP协议(下)

文章目录 1. 特殊的IP地址2. IP地址的数量限制3. 私有IP地址和公网IP地址私有IP为什么不能出现在公网上&#xff1f;解决方案——NAT技术的使用 4. 路由5. IP分片问题为什么要进行切片&#xff1f;如何做的分片和组装&#xff1f;16位标识3位标志13位片偏移例子 细节问题如何区…