当前位置: 首页 > news >正文

通讯录——C语言实现

头文件Contact.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma once
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30//表示一个人的信息
//struct PeoInfo
//{
//	char name[20];
//	int age;
//	char sex[5];
//	char tele[12];
//	char addr[30];
//};
typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录通讯录中的有效信息个数
}Contact;//初始化通讯录
void InitContact(Contact* pc);//增加指定联系人
void AddContact(Contact* pc);//显示联系人信息
void ShowContact(const Contact* pc);//删除指定联系人
void DelContact(Contact* pc);//查找指定联系人
void SearchContact(const Contact* pc);//修改通讯录
void ModifyContact(Contact* pc);//排序通讯录元素
void SortContact(Contact* pc);

测试文件test.c

#define _CRT_SECURE_NO_WARNINGS
#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");printf("*****************************\n");
}
enum Option
{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

#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"void InitContact(Contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}void AddContact(Contact* pc)
{if (pc->sz == MAX){printf("通讯录已满,无法增加\n");return;}printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址:>");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");
}void ShowContact(const Contact* pc)
{int i = 0;//姓名      年龄       性别     电话       地址//zhangsan   20         男      123456     北京//打印标题printf("%-10s %-4s %-5s %-12s %-30s\n ", "姓名", "年龄", "性别", "电话", "地址");for (i = 0;i < pc->sz;i++){printf("%s %d %s %s %s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);}
}static int FindByName(const Contact* pc, char name[])
{int i = 0;int pos = 0;for (i = 0;i < pc->sz;i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}/*if (i == pc->sz){return -1;}*/return -1;
}
void DelContact(Contact* pc)
{char name[MAX_NAME] = { 0 };if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//删除//1.找到要删除的人 - 位置 (下标)printf("输入要删除人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要删除的人不存在\n");return; }int i = 0;//2.删除 - 删除pos位置上的数据 for (i = pos;i<pc->sz-1;i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n"); 
}void SearchContact(const Contact* pc)
{char name[MAX_NAME] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}//打印printf("%-10s %-4s %-5s %-12s %-30s\n ", "姓名", "年龄", "性别", "电话", "地址");//打印数据printf("%s %d %s %s %s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);
}void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };printf("输入要修改人的名字\n");scanf("%s", name); int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");}//修改printf("请输入名字:>");scanf("%s", pc->data[pos].name);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);printf("修改成功\n");
}//按照名字来排序
int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{qsort(pc->data,pc->sz,sizeof(PeoInfo), cmp_by_name);
}

相关文章:

通讯录——C语言实现

头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…...

优思学院|3步骤计算出Cpk|学习Minitab

在生产和质量管理中&#xff0c;准确了解和控制产品特性至关重要。一个关键的工具是Cpk值&#xff0c;它是衡量生产过程能力的重要指标。假设我们有一个产品特性的规格是5.080.02&#xff0c;通过收集和分析过程数据&#xff0c;我们可以计算出Cpk值&#xff0c;进而了解生产过…...

【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异

JDK、JRE与JVM&#xff1a;揭开Java运行环境的神秘面纱 在Java开发者的日常工作中&#xff0c;JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境&#xff0c;但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…...

Linux中的touch命令

在Linux中&#xff0c;​touch​命令主要用于创建空的文件或者更新已存在文件的时间戳。下面是 ​touch​命令的使用方式和示例说明&#xff1a; 创建空文件 要创建一个空文件&#xff0c;可以使用 ​touch​命令并指定文件名&#xff0c;如下所示&#xff1a; touch new_fi…...

智能驾驶规划控制理论学习-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…...

二叉树——二叉树所有路径

二叉树所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","1-…...

算法训练营day38(补),动态规划6

package main func max(a, b int) int { if a > b { return a } return b } 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 每件商品都有无限个&#xff01; 问背包能背的物品最大价值是多少&#xff1f; func package03(weight, value []…...

【java、微服务、nacos】nacos服务分级存储模型

Nacos服务分级存储模型 ① 一级是服务&#xff0c;例如userservice ②二级是集群&#xff0c;例如杭州或上海 ③ 三级是实例&#xff0c;例如杭州机房的某台部署了userservice的服务器 配置实例集群属性 改变服务的yml文件 spring:cloud:nacos:discovery:cluster-name: H…...

共享旅游卡:打开0费用旅游新纪元,探索40+精彩线路

随着现代生活节奏的加快&#xff0c;旅游成为了许多人释放压力、寻求乐趣的方式。然而&#xff0c;面对琳琅满目的旅游线路和不断上涨的旅游费用&#xff0c;许多人望而却步。 今天&#xff0c;我们要为您介绍一种颠覆传统旅游方式的创新产品——共享旅游卡。它不仅能让您以0费…...

MQTT协议解析:揭秘固定报头、可变报头与有效载荷的奥秘

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种轻量级的通讯协议&#xff0c;常用于远程传感器和控制设备的通讯。MQTT协议基于发布/订阅模式&#xff0c;为大量计算能力有限且工作在低带宽、不可靠网络环境中的设备…...

备战蓝桥杯---树形DP基础3

上一次我们讲了二叉苹果树&#xff0c;现在我们加一点难度&#xff0c;从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP&#xff0c;我们其实可以发现&#xff0c;我们可以用类似背包的思想求解&#xff0c;这就是所谓的树上背包。 我们先加进第一个儿子来…...

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知&#xff0c;获得了许多点赞和收藏。最近也收到了审稿结果&#xff0c;给的意见是大修major revision&#xff0c;总之只要不…...

c#委托的三种实现方式

委托是实质一个类&#xff0c;主要目的是将方法当作参数进行传递。 委托是.NET编程的精髓之一&#xff0c;在日常编程中经常用到&#xff0c;在C#中实现委托主要有Func、Action、delegate三种方式&#xff0c;本节主要就这三种委托的用法通过实例展开讲解。 Func用法解析 【F…...

c/c++|红黑树|分析应用|锚点

红黑树是一种自平衡的二叉查找树&#xff0c;它保持着良好的平衡&#xff0c;能够在插入和删除等操作后通过一系列旋转和重新着色操作来保持树的平衡。这种平衡性质使得红黑树在搜索、插入和删除等操作的平均和最坏情况下的时间复杂度都是O(log n)。以下是红黑树的一些关键特性…...

2-29算法习题总结

贪心问题 小A的糖果 题目描述 小 A 有 n n n 个糖果盒&#xff0c;第 i i i 个盒中有 a i a_i ai​ 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗&#xff0c;他想知道&#xff0c;要让任意两个相邻的盒子中糖的个数之和都不大于 x x x&#xff0c;至少得吃掉几颗糖…...

当Linux 磁盘满了,查看大文件并删除

当你的Linux磁盘空间满了时&#xff0c;可以通过以下步骤查找大文件并删除它们&#xff1a; 检查磁盘空间&#xff1a; 使用以下命令检查磁盘空间的使用情况&#xff1a; df -h这将显示文件系统的使用情况&#xff0c;包括每个文件系统的总大小、已用空间、可用空间和挂载点。 …...

STL -萃取特性迭代器

1. STL简单概述 a. STL六大组成部分 容器&#xff08;Container&#xff09;空间配置器&#xff08;allocator&#xff09;算法&#xff08;Algorithm&#xff09;迭代器&#xff08;Iterator&#xff09;仿函数&#xff08;Function object&#xff09;适配器&#xff08;Ad…...

python pandas写入csv

在Python的Pandas库中&#xff0c;可以使用to_csv方法将DataFrame对象写入CSV文件。以下是一个简单的示例&#xff1a; import pandas as pd# 创建一个DataFrame对象 data {Name: [Alice, Bob, Charlie, David],Age: [25, 30, 35, 40],City: [New York, Los Angeles, Chicago…...

oracle 数据库建集群式数据库的DBLINK的语法

根据需要修改以下红色字体的部分即可。 1、连接集群式数据库DBLINK语法 create public database link 自定义的dblink名字 connect to 连接对方数据库的用户名 identified by "密码" using (DESCRIPTION (ADDRESS_LIST (FAILOVER ON) (LOAD_BALANCE OFF) …...

基于JAVA的毕业设计分配选题系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 专业档案模块2.2 学生选题模块2.3 教师放题模块2.4 选题审核模块 三、系统展示四、核心代码4.1 查询专业4.2 新增专业4.3 选择课题4.4 取消选择课题4.5 审核课题 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...