C语言之通讯录的实现
通讯录实现所需头文件和源文件
Contact.h的功能
声明函数和创建结构体变量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_PHONE 12
#define MAX_ADDRESS 30
#define DEFAULT_SZ 3
#define INTC_SZ 2
typedef struct PeoInform
{char name[MAX_NAME];int age;char sex[MAX_SEX];char phone[MAX_PHONE];char address[MAX_ADDRESS];
}PeoInform;//静态
//typedef struct Contact
//{
// PeoInform data[MAX];
// int size;
//
//}Contact;typedef struct Contact
{PeoInform* data;int size;int capacity;
}Contact;void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact(const Contact* pc);
void MoidfyContact(Contact* pc);
void SortContact(Contact* pc);
void DerstoryContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadCntact(Contact* pc);
Contact.c
设定通讯录所需的功能和函数的定义
void InitContact(Contact* pc);//初始化函数
void AddContact(Contact* pc);//增加用户
void ShowContact(const Contact* pc);//显示通讯录信息·
void DelContact(Contact* pc);//删除用户信息
void SearchContact(const Contact* pc);//搜索通讯录
void MoidfyContact(Contact* pc);//修改用户信息
void SortContact(Contact* pc);//排序通讯录
void DerstoryContact(Contact* pc);//因动态申请内存所以释放内存
void SaveContact(Contact* pc);//通讯录信息保存到文件
void LoadCntact(Contact* pc);//把文件保存到通讯录中
void InitContact(Contact* pc);
void InitContact(Contact* pc)
{//动态版memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址pc->size = 0;pc->capacity = DEFAULT_SZ;PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;//加载文件信息到通讯录//LoadContact(pc);
}
void AddContact(Contact* pc);
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);pc->size++;printf("添加成功\n");
}
``
void ShowContact(const Contact* pc);
void ShowContact(const Contact * pc){if (pc->size == 0){printf("通讯录为空\n");}else{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].phone,pc->data[i].address);}}}
void DelContact(Contact* pc);
static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}void DelContact(Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字>");scanf("%s", name);int pos = FindByName(pc,name);if (pos == -1){printf("查询不到联系人\n");}else{int j = 0;for (j = pos; j < pc->size; j++);}
}
void SearchContact(const Contact* pc);
static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}
void SearchContact(const Contact* pc)
{char name[MAX_NAME];printf("请输入查找人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].phone,pc->data[pos].address);}
}
void MoidfyContact(Contact* pc);
void MoidfyContact(Contact* pc)
{char name[MAX_NAME];printf("请输入修改联系人的名字>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要修改人的名字");}else{printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);printf("修改完成\n");}
}
void SortContact(Contact* pc);
void SortContact(Contact* pc){if (pc->size == 0){printf("通讯录没有联系人,请添加\n");}for (int i = 0; i < pc->size-1; i++){for (int j = 0; j < pc->size - 1 - i; j++){if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0){PeoInform tmp;tmp = pc->data[j];pc -> data[j] = pc->data[j+1];pc->data[j+1] = tmp;}}printf("排序成功\n");}}
void DerstoryContact(Contact* pc);
void DerstoryContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->size = 0;pc = NULL;
}
void SaveContact(Contact* pc);
void SaveContact(Contact* pc)//保存文件信息{FILE * pf = fopen("contact.txt", "wb");// 为了输出数据,打开一个二进制文件if (NULL == pf){perror("SaveContact");//打开失败就不用关闭文件了}else{int i = 0;for (i = 0; i < pc->size; i++){/fwrite(pc->data + i, sizeof(PeoInform), 1, pf);//1.结构体地址,一个元素占多少字节,多少个元素,写到pf这个文件}//一次写一个到pf所指文件fclose(pf);pf = NULL;printf("保存成功\n");}}
void LoadCntact(Contact* pc);
void LoadContact(Contact* pc){//把文件的内容放在通讯录中FILE* pf = fopen("contact.txt","rb"); //为了输入数据,打开一个二进制文件if (pf == NULL){perror("LoadContact");}else//读数据{PeoInform tmp = { 0 };int i = 0;//正常读到1返回1 没读到返0while (fread(&tmp, sizeof(PeoInform), 1, pf))//{check_capacity(pc);pc->data[i] = tmp;pc->size++;i++;}}fclose(pf);pf = NULL;}
contact.c的综合实现
#include "Contact.h"
void check_capacity(Contact* pc)
{if (pc->size = pc->capacity){PeoInform* str = (PeoInform*)realloc(pc->data, (pc->capacity + INTC_SZ) * sizeof(PeoInform));if (str == NULL){perror("check_capacity::realloc");return;}pc->data = str;pc->capacity += INTC_SZ;printf("增容成功");}
}//静态
//void InitContact(Contact* pc)
//{
// memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
// pc->size = 0;
//}//动态
void InitContact(Contact* pc)
{memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址pc->size = 0;pc->capacity = DEFAULT_SZ;PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;//加载文件信息到通讯录//LoadContact(pc);
}void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);pc->size++;printf("添加成功\n");
}static int FindByName(const Contact* pc, char name[MAX_NAME])
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}void DelContact(Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字>");scanf("%s", name);int pos = FindByName(pc,name);if (pos == -1){printf("查询不到联系人\n");}else{int j = 0;for (j = pos; j < pc->size; j++);}
}void SearchContact(const Contact* pc)
{char name[MAX_NAME];printf("请输入查找人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].phone,pc->data[pos].address);}
}void MoidfyContact(Contact* pc)
{char name[MAX_NAME];printf("请输入修改联系人的名字>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要修改人的名字");}else{printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);printf("修改完成\n");}
}void ShowContact(const Contact * pc){if (pc->size == 0){printf("通讯录为空\n");}else{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].phone,pc->data[i].address);}}}void SortContact(Contact* pc){if (pc->size == 0){printf("通讯录没有联系人,请添加\n");}for (int i = 0; i < pc->size-1; i++){for (int j = 0; j < pc->size - 1 - i; j++){if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0){PeoInform tmp;tmp = pc->data[j];pc -> data[j] = pc->data[j+1];pc->data[j+1] = tmp;}}printf("排序成功\n");}}void DerstoryContact(Contact* pc){free(pc->data);pc->data = NULL;pc->capacity = 0;pc->size = 0;pc = NULL;}void SaveContact(Contact* pc){FILE * pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{int i = 0;for (i = 0; i < pc->size; i++){fwrite(pc->data + i, sizeof(PeoInform), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}}void LoadContact(Contact* pc){FILE* pf = fopen("contact.txt","rb"); if (pf == NULL){perror("LoadContact");}else{PeoInform tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInform), 1, pf)){check_capacity(pc);pc->data[i] = tmp;pc->size++;i++;}}fclose(pf);pf = NULL;}
test.h
#include "Contact.h"void menu()
{printf("*********************************\n");printf("** 1. 添加联系人 **\n");printf("** 2. 删除联系人 **\n");printf("** 3. 查找联系人 **\n");printf("** 4. 修改联系人 **\n");printf("** 5. 显示所有联系人 **\n");printf("** 6. 按姓名排序联系人 **\n");printf("** 0. exit **\n");printf("*********************************\n");
}
void test()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2: DelContact(&con);break;case 3:SearchContact(&con);break;case 4:MoidfyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:DerstoryContact(&con);printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);
}
int main()
{test();return 0;
}
相关文章:

C语言之通讯录的实现
通讯录实现所需头文件和源文件 Contact.h的功能 声明函数和创建结构体变量 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX 1000 #define MAX_NAME 20 #define MAX…...

手把手教大家在 gRPC 中使用 JWT 完成身份校验
文章目录1. JWT 介绍1.1 无状态登录1.1.1 什么是有状态1.1.2 什么是无状态1.2 如何实现无状态1.3 JWT1.3.1 简介1.3.2 JWT数据格式1.3.3 JWT 交互流程1.3.4 JWT 存在的问题2. 实践2.1 项目创建2.2 grpc_api2.3 grpc_server2.4 grpc_client3. 小结上篇文章松哥和小伙伴们聊了在 …...

VSCode远程连接服务器
工作使用服务器的jupyter,直到有一天服务器挂了,然而,代码还没有来得及备份。o(╥﹏╥)o VScode远程连接服务器,使用服务器的资源,代码可以存在本地,可以解决上述困境。 1.官网下载VSCode.网址https://cod…...

【C++】-- 异常
目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和捕获 自定义异常体系 异常的重新抛出 异常安全 异常规范(C期望) C标准库的异常体系 异常的优缺点 C异常的优点 C异常的缺点 总结 C语言传统的处理错误的方式 传统的错误…...

Java中的Stack与Queue
文章目录一、栈的概念及使用1.1 概念1.2 栈的使用1.3 栈的模拟实现二、队列的概念及使用2.1 概念2.2 队列的使用2.3 双端队列(Deque)三、相关OJ题3.1 用队列实现栈。3.2 用栈实现队列。总结一、栈的概念及使用 1.1 概念 栈:一种特殊的线性表,其只允许在…...

xilinx FPGA在线调试方法总结(vivado+ila+vio)
本文主要介绍xilinx FPGA开发过程中常用的调试方法,包括ILA、VIO和TCL命令等等,详细介绍了如何使用。一、FPGA调试基本原则根据实际的输出结果表现,来推测可能的原因,再在模块中加ILA信号,设置抓信号条件,逐…...

自动化测试——css元素定位
文章目录一、css定位场景二、css相对定位的优点三、css的调试方法1、表达式中含有字符串:表达式中的引号一定和外面字符串的引号相反四、css基础语法1、标签定位2、class定位特别注意:当class类型的属性值包含多个分割值,$(.s_tab s_tab_1z9n…...
ChatGPT可能马上取代你,这是它能做的十个工作
ChatGPT 的横空出世,在业界掀起了惊涛骇浪。专家表示,ChatGPT 和相关人工智能技术可能会威胁到一些工作岗位,尤其是白领工作。 自去年11月发布以来,新型聊天机器人模型 ChatGPT 已经被用于各种各样的工作:撰写求职信、编写儿童读物,甚至帮助学生在论文中作弊。谷歌公司发…...

ubuntu转储coredump
方法一: 输入以下命令即可,其中${USER}为自己电脑的用户名: ulimit -c unlimited echo "/home/${USER}/core.%p" > /proc/sys/kernel/core_pattern 方法二: Disable apport : sudo systemctl stop apport.servicesudo system…...
基于单片机的毕业设计推荐
** 2023基于单片机的毕业设计推荐: ** 1、基于51单片机的多功能门禁系统(低端、功能限制较大)。 2、基于单片机的多功能实时时钟。 3、基于单片机的音乐播放器。 4、基于STM32单片机的多功能门禁系统(高端、没有限制)…...

APP测试中ios和androis的区别,有哪些注意点
目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 总结感谢每一个认真阅读我文章的人!!! 重点:…...

使用 Xcode 创建第一个 Objective-C 命令行程序 HelloWorld
总目录 iOS开发笔记目录 从一无所知到入门 文章目录创建项目运行项目,查看日志输出同一项目下新增子目录,切换要运行的 Target创建项目 打开 Xcode ,Create a new Xcode project 接下来的默认界面: 切换到 macOS 下ÿ…...

【蓝桥杯集训8】哈希表专题(3 / 3)
目录 手写哈希表 1、开放寻址法 2、拉链法 字符串前缀哈希表法 2058. 笨拙的手指 - 哈希表 秦九韶算法(进制转换) 枚举 秦九韶算法——将x进制数转化为十进制数 手写哈希表 活动 - AcWing 1、开放寻址法 设 h(x)k,也就是 x 的哈希值…...

Java Scanner 类,超详细整理,适合新手入门
目录 一、什么是 Java Scanner 类? 二、引用数据类型 1、引用数据类型的定义 三、Scanner 类有哪些常用方法? hasNext()用法 四、next() 与 nextLine() 区别 next(): nextLine(): 五、使用 next 方法 五、使用 nextLine方法 一、什…...

干货 | 中小企业选型 Elasticsearch 避坑指南
1、线上常见问题在我线下对接企业或线上交流的时候,经常会遇到各种业务场景不同的问题。比如,常见问题归类如下:常见问题1:ES 适合场景及架构选型问题。公司的核心业务是做企业员工健康管理,数据来自电子化后的员工体检…...

全局组件和局部组件
全局组件第一种定义方法:A、创建自己的组件:Loading.vueB、在main.js文件中引入组件并注册import Vue from vue import App from ./App.vue import * as filters from ./filterimport quanjuzujian from ./components/quanjuzujian.vueVue.component(qua…...

提取括号中的内容
正则能解决不嵌套的括号内容提取问题遇到一个问题,就是需要提取字符串中每一个中括号里的内容,在网上搜了一下,发现用正则表达式(\[[^\]]*\])可以提取中括号中的内容,以下面文本为匹配对象:PerformanceManager[第1个中…...

数据结构-算法的空间复杂度(1.2)
目录 1.空间复杂度 1.1 例子 1.2 空间的特殊性质 写在最后: 1.空间复杂度 空间复杂度也是一个数学表达式, 是对一个算法在运行过程中临时占用存储空间大小的量度。 他也是用大O渐进表示法。 1.1 例子 例1: 冒泡排序: v…...

【总结】python3启动web服务引发的一系列问题
背景 在某行的实施项目,需要使用python3环境运行某些py脚本。 由于行内交付的机器已自带python3 ,没有采取自行安装python3,但是运行python脚本时报没有tornado module。 错误信息 ModuleNotFoundError:No module named ‘torn…...

Linux:基于libevent读写管道代码,改进一下上一篇变成可以接收键盘输入
对上一篇进行改进,变成可以接收键盘输入,然后写入管道: 读端代码: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...