c语言——通讯录(文件版)

大家好我是小锋,今天我们来实现一个通讯录

准备工作

为了让我们的代码具有条理我们要建立三个文件一个文件用来放头文件一个文件用来放函数的实现,一个文件用来实现通讯录的基本逻辑。

然后我们其他的.c文件要使用头文件时我们要用# include<tongxunlu.h>包含;

接下来我们来讲讲基本逻辑,首先通讯录要完成的功能大致有哪些?

我们是不是要先建立一个界面让人选择这些功能?

选择上面功能我们就实现什么功能我们是不是要用到switch语句来实现,功能选择又不是只选一次,所以我们还要在外面嵌套循环,我们不论如何都要进行选择所以我们应该用do while循环。

这么看主体逻辑是不是有了?

我们的通讯录要存储联系人的各种信息,所以我们要创建一个结构体变量来存储这些信息

我们的通讯录要存储多少个人的信息我们不知道所以我们可以动态开辟内存当内存不够是我们可以开辟内存所以我们再创建一个通讯录结构体变量

接下来我们在main函数中就可以创建一个可以动态开辟内存的通讯录了

接下来我们肯定要初始化通讯录

接下来我们一一实现通讯录的功能

增加联系人

这里主要注意的是内存够不够,

我们写了一个函数来判断内存

显示联系人

这个很容易实现一个循环就搞定了

删除联系人

这里我们首先要判断删除的人存不存在,存在我们才进行删除。

这里删除我们就用后一块空间覆盖前一块空间并且删除之后存储的人变少了,我们记录人数的变量要减一。

修改联系人

与删除差不多先判断有没有这个人再进行修改。

查找联系人

这里我们发现有多个函数都要进行查找操作我们可以把这个功能分装成一个函数

排序联系人

最后的排序我们可以用qsort函数实现。

接下来我们还有退出函数还未实现,如果我们直接退出通讯录中的数据是不是销毁了,所以我们把通讯录的信息写入文件中,这样我们再次打开通讯录时,再从初始化中读取出来

最后我们再将动态开辟的内存销毁

这样一个通讯录就写成了。

源代码如下

tongxunlu.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<errno.h>#define NAME 20
#define PHONE 13
#define WHTER 20
#define MAN 5
#define MAX 100# define MRRL 3
# define MRKR 2//联系人的信息
typedef struct people {char mingzi[NAME];int nianling;char dianhua[PHONE];char dizhi[WHTER];char xingbie[MAN];
}people;//静态通讯录
//typedef struct tongxunlu {
//	people date[MAX];
//	int yicun;
//}tongxunlu;
//动态通讯录
typedef struct tongxunlu {people* date;int yicun;//存储联系人个数int RL;//容量
}tongxunlu;//初始化通讯录
void chushihua(tongxunlu* lgf);//增加联系人
void Zjia(tongxunlu* lgf);//显示联系人
void Xshi(const tongxunlu* lgf);//删除联系人
void Schu(tongxunlu* lgf);//修改联系人
void Xgai(tongxunlu* lgf);//查找联系人
void Czhao(const tongxunlu* lgf);//排序联系人
void Pxu(tongxunlu* lgf);//释放内存
void Sneicun(tongxunlu* lgf);//文件保存
void wenjian(tongxunlu* lgf);

tongxunlu.c

# include"wenjian.h"//扩容
void pand(tongxunlu* lgf) {if (lgf->yicun == lgf->RL) {printf("容量不足——扩容\n");people* ps = (people*)realloc(lgf->date, (lgf->RL + MRKR) * sizeof(people));if (ps == NULL) {printf("扩容失败:%s\n", strerror(errno));return;}lgf->date = ps;lgf->RL += MRKR;printf("扩容成功,当前容量为%d\n", lgf->RL);}
}//查找对象
int chazhao(tongxunlu* lgf, char* add) {int i = 0;for (i = 0; i < lgf->yicun; i++) {int n = strcmp(lgf->date[i].mingzi, add);if (n == 0) {return i;}}return -1;
}//初始化通讯录
//void chushihua(tongxunlu* lgf) {
//	lgf->yicun = 0;
//	memset(lgf->date, 0, sizeof(lgf->date));
//}//动态通讯录初始化
void chushihua(tongxunlu* lgf) {lgf->date = (people*)malloc(MRRL * sizeof(people));if (lgf->date == NULL) {printf("开辟内存失败:%s\n", strerror(errno));return;}memset(lgf->date, 0, MRRL * sizeof(people));lgf->RL = MRRL;lgf->yicun = 0;//读取文件//打开文件FILE* pa = fopen("tongxunlu.txt", "rb");if (pa == NULL) {perror("fopen");return ;}people mon;//读文件while (fread(&mon, sizeof(people), 1, pa)) {pand(lgf);lgf->date[lgf->yicun] = mon;lgf->yicun++;}fclose(pa);pa = NULL;
}//静态版本
//增加联系人
//void Zjia(tongxunlu* lgf) {
//	//判断通讯录是否满人
//	if (lgf->yicun == 100) {
//		printf("通讯录已满,无法添加\n");
//		return;
//	}
//	//输入联系人
//	printf("请输入名字\n");
//	scanf("%s", &(lgf->date[lgf->yicun].mingzi));
//	printf("请输入年龄\n");
//	scanf("%d", &(lgf->date[lgf->yicun].nianling));
//	printf("请输入电话\n");
//	scanf("%s", &(lgf->date[lgf->yicun].dianhua));
//	printf("请输入性别\n");
//	scanf("%s", &(lgf->date[lgf->yicun].xingbie));
//	printf("请输入地址\n");
//	scanf("%s", &(lgf->date[lgf->yicun].dizhi));
//	//
//	lgf->yicun++;
//	printf("添加成功\n");
//}//动态开辟版本
void Zjia(tongxunlu* lgf) {//判断通讯录是否满人pand(lgf);//输入联系人printf("请输入名字\n");scanf("%s", &(lgf->date[lgf->yicun].mingzi));printf("请输入年龄\n");scanf("%d", &(lgf->date[lgf->yicun].nianling));printf("请输入电话\n");scanf("%s", &(lgf->date[lgf->yicun].dianhua));printf("请输入性别\n");scanf("%s", &(lgf->date[lgf->yicun].xingbie));printf("请输入地址\n");scanf("%s", &(lgf->date[lgf->yicun].dizhi));//lgf->yicun++;printf("添加成功\n");
}//显示联系人
void Xshi(const tongxunlu* lgf) {printf("%-10s %-5s %-10s %-5s %-10s\n", "名字", "年龄", "电话", "性别", "地址");//输出联系人for (int i = 0; i < lgf->yicun; i++) {printf("%-10s %-5d %-10s %-5s %-10s\n",lgf->date[i].mingzi,//名字lgf->date[i].nianling,//年龄lgf->date[i].dianhua,//电话lgf->date[i].xingbie,//性别lgf->date[i].dizhi);//地址}}//删除联系人
void Schu(tongxunlu* lgf) {//输入删除对象char* add[MAX];printf("请输入要删除人的名字\n");scanf("%s", &add);//查找删除对象int n = chazhao(lgf, add);if (n == -1) {printf("你要删除的人不存在\n");}else {for (int j = n; j < lgf->yicun - 1; j++) {lgf->date[j] = lgf->date[j + 1];}lgf->yicun--;printf("删除完成\n");}
}//修改联系人
void Xgai(tongxunlu* lgf) {char add[MAX];//输入修改对象名字printf("输入修改对象名字\n");scanf("%s", &add);//查找对象int n = chazhao(lgf, add);if (n == -1) {printf("修改对象不存在\n");}else {//输入修改信息printf("请输入名字\n");scanf("%s", &(lgf->date[n].mingzi));printf("请输入年龄\n");scanf("%d", &(lgf->date[n].nianling));printf("请输入电话\n");scanf("%s", &(lgf->date[n].dianhua));printf("请输入性别\n");scanf("%s", &(lgf->date[n].xingbie));printf("请输入地址\n");scanf("%s", &(lgf->date[n].dizhi));printf("修改成功\n");}
}//查找联系人
void Czhao(const tongxunlu* lgf) {char* add[MAX];//输入查找对象printf("请输入查找对象名字\n");scanf("%s", add);int n = chazhao(lgf, add);if (n == -1) {printf("查找对象不存在\n");}else {printf("%-10s %-5s %-10s %-5s %-10s\n", "名字", "年龄", "电话", "性别", "地址");printf("%-10s %-5d %-10s %-5s %-10s\n",lgf->date[n].mingzi,//名字lgf->date[n].nianling,//年龄lgf->date[n].dianhua,//电话lgf->date[n].xingbie,//性别lgf->date[n].dizhi);//地址printf("查找完成\n");}
}//比较函数
int my_bijiao(const people* arr, const people* add) {return strcmp(arr, add);}//排序联系人
void Pxu(tongxunlu* lgf) {qsort(lgf->date, lgf->yicun, sizeof(lgf->date[0]), my_bijiao);printf("排序完成\n");Xshi(lgf);
}//释放内存
void Sneicun(tongxunlu* lgf) {free(lgf->date);lgf->date = NULL;lgf->RL = 0;lgf->yicun = 0;printf("释放内存\n");
}//文件保存
void wenjian(tongxunlu* lgf) {//打开文件FILE* ps = fopen("tongxunlu.txt", "wb");if (ps == NULL) {perror("fopen");return;}//写文件fwrite(lgf->date, sizeof(people), lgf->yicun, ps);//关闭文件fclose(ps);ps = NULL;printf("保存成功\n");
}

test.c

# include "wenjian.h"void fm() {printf("————————————————————————\n");printf("1,增加联系人\n");printf("2,删除联系人\n");printf("3,修改联系人\n");printf("4,显示联系人\n");printf("5,排序联系人\n");printf("6,查找联系人\n");printf("0,退出通讯录\n");printf("————————————————————————\n");
}enum add {tuichu,zhenjia,sanchu,xiugai,xianshi,paixu,chazhao,
};int main() {int n = 0;tongxunlu lgf;//初始化通讯录chushihua(&lgf);do {fm();printf("请选择——》");scanf_s("%d", &n);switch (n) {case zhenjia:Zjia(&lgf);break;case sanchu:Schu(&lgf);break;case xiugai:Xgai(&lgf);break;case xianshi:Xshi(&lgf);break;case paixu:Pxu(&lgf);break;case chazhao:Czhao(&lgf);break;case tuichu:wenjian(&lgf);Sneicun(&lgf);printf("退出通讯录\n");break;default:printf("选择错误\n");}} while (n);return 0;
}

 以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程管理

目录 一、进程创建 二、进程等待 1. 阻塞等待 2. 非阻塞等待 3. status位图 三、进程替换 1. exec* 系列函数 2. 高级语言程序替换 一、进程创建 进程是操作系统进程资源分配的最小单位&#xff0c;每一个进程都有自己独立的PID&#xff0c;以及进程控制块PCB。 父进…

【SAP-ABAP】CO01保存时错误DBSQL_DUPLICATE_KEY_ERROR

找到该表的主键OBJNR&#xff0c;事务代码SM56中查看当前缓冲到该key的号码段&#xff0c;事务代码SNRO修改对象名称OBJNR编号范围状态。 事务代码SM13查看数据更新记录

数据可视化-ECharts Html项目实战(5)

在之前的文章中&#xff0c;我们学习了如何设置滚动图例&#xff0c;工具箱设置和插入图片。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 数据可视化-ECharts…

nodejs社区垃圾分类管理平台的设计与实现python-flask-django-php

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 语言&#xf…

qt 实现 轮播图效果,且还有 手动 上一页和下一页 已解决

QT中有 轮播图的需求&#xff0c;按照正常html版本 。只需要配置数组就能搞定&#xff0c;但是c qt版本 应该用什么了。 第一想到的是采用定时器。 // 定时器初始化{m_pTime new QTimer(this);m_pTime->start(4 * 1000);//启动定时器并设置播放时间间隔m_pAutoFlag true;/…

vs2019新建Qt工程中双击 .ui 文件无法打开

vs2019 中创建的 Qt 工程&#xff0c;在使用的过程中&#xff0c;经常会有&#xff1a;双击 .ui 文件&#xff0c;闪退的情况&#xff0c;也即 .ui 文件无法打开&#xff01; 针对该问题的详细解决步骤如下&#xff1a; 1、右击该 .ui 文件&#xff0c;选择“打开方式” 2、…

②零基础MySQL数据库-MySQL约束

作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性&#xff0c;比如用户表有些列的值&#xff08;手机号&#xff09;不能为空&#xff0c;有些列的值&#xff08;身份证号&#xff09;不能重复 分类 主键约束(primary key) PK 自增长约束(auto_increme…

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

my2sql —— go语言版binlog解析及闪回工具

之前学习过python语言版binlog解析及闪回工具 MySQL闪回工具简介 及 binlog2sql工具用法 最近听同事介绍有了新的go语言版的my2sql。优点是不需要安装一大堆依赖包&#xff0c;直接可以安装使用&#xff0c;并且解析更高效&#xff0c;试用一下。 一、 下载安装 1. 软件下载 …

【原理图PCB专题】Cadence 17.4 配置Capture.ini让CIS数据库界面查看PCB封装

在CIS数据库中,如果进行了正确配置是可以查看原理图符号库与PCB封装库的。如下所示: 看到封装库的意义在于一个原理图封装是可以对应多个PCB封装的,如同一个原理图座子,对应了侧插或是竖插,那在没有PCB封装的时候,我们只能通过去看详细资料来判断。如果有PCB封装显示,只…

设计模式-访问者(Visitor)模式详解和应用

文章目录 前言访问者模式介绍结构包含的角色应用场景代码示例访问者模式的扩展访问者模式优缺点总结 前言 最近在做一个根据数学表达式生成java执行代码的功能&#xff0c;其中用到了访问者模式。使我对访问者模式有了更深入的理解。故写下此篇文章分享出来&#xff0c;不足之…

IPV6协议之RIPNG

目录 前言&#xff1a; 一、RIPNG与RIP的区别 二、如何配置RIPNG 如何解决RIPNG环路问题呢&#xff1f; 控制RIPNG的选路 1、修改RIPNG默认优先级 2.配置接口附加开销值从而干涉RIPNG的选路 RIPNG拓展配置 1.RIPNG的认证 配置RIPNG进程下的IPsec认证&#xff1a; 配…

Spring Cloud Gateway教程

1 微服务网关概述 Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务&#xff0c;旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能&#xff1a; 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…

基于python+vue超市在线销售系统的设计与实现flask-django-php-nodejs

根据此问题&#xff0c;研发一套超市在线销售系统&#xff0c;既能够大大提高信息的检索、变更与维护的工作效率&#xff0c;也能够方便信息系统的管理运用&#xff0c;从而减少信息管理成本&#xff0c;提高效率。 该超市在线销售系统采用B/S架构、并采用python语言以及django…

拌合楼管理系统(八) c#海康威视摄像头车牌识别

前言: c#调用海康威视SDK实现车牌识别 原本以为海康威视sdk的Demo里面没有车牌识别的实例,后来发现自己肤浅了,官方是有提供的,只是车牌识别是通过安防布警的方式实现的.程序主动监听,触发告警后获取到车牌信息. 一、接口调用的流程&#xff1a; 首先初始化sdk -> 开…

CI/CI实战-jenkis结合gitlab 4

实时触发 安装gitlab插件 配置项目触发器 生成令牌并保存 配置gitlab 测试推送 gitlab的实时触发 添加jenkins节点 在jenkins节点上安装docker-ce 新建节点server3 安装git和jdx 在jenkins配置管理中添加节点并配置从节点 关闭master节点的构建任务数

二分查找法总结

目录 1、思路讲解&#xff08;LC704&#xff09;2、代码思路讲解&#xff08;循环不变量&#xff09;&#xff08;1&#xff09; 左闭右闭&#xff08;2&#xff09;左闭右开&#xff08;3&#xff09;总结&#xff1a;左开右闭和左闭右开&#xff08;4&#xff09;复杂度分析 …

老阳分享|temu跨境电商选品师项目能赚钱吗?

近年来&#xff0c;跨境电商行业蓬勃发展&#xff0c;成为众多创业者追逐的热点。其中&#xff0c;老阳分享的temu跨境电商选品师项目备受关注。那么&#xff0c;这个项目真的能赚钱吗?下面&#xff0c;我们就跟随本文去了解一下。 首先&#xff0c;temu作为拼多多旗下的跨境电…