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…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
