【C语言】静态通讯录的实现

2023-10-27


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


  一、项目要求

实现一个通讯录

二、Contact.h

三、Contact.c

1、静态函数

2、初始化通讯录

3、打印

4、增加联系人信息

5、通过名字查找

6、删除联系人信息

7、修改信息

8、排序通讯录

9、清空通讯录

四、text.c

五、动图展示


一、项目要求

实现一个通讯录

通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二、Contact.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX_CAPACITY 100
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo date[MAX_CAPACITY];
	int size;
}Contact;

void ContactInit(Contact* pc);//初始化通讯录
void ContactPrint(const Contact* pc);//打印
void ContactAdd(Contact* pc);//增加联系人信息
void ContactDel(Contact* pc);//删除联系人信息
void ContactFind(const Contact* pc);//查找信息
void ContactModify(Contact* pc);//修改信息
void ContactSortByName(Contact* pc);//排序
void ContactEmpty(Contact* pc);//清空通讯录

先定义一个PeoInfo的结构体类型,里面包含了人的信息。

再将PeoInfo的数组和数组有效元素个数size包含至Contact,作为通讯录的模板。

三、Contact.c

1、静态函数

static int FindByName(const Contact* pc,const char arr[])//通过名字查找
{
	assert(pc&&arr);
	for (int i = 0; i < pc->size; i++)
	{
		if (strcmp(pc->date[i].name, arr) == 0)
		{
			return i;
		}
	}
	return -1;
}

可以通过名字查找通讯录中是否存在联系人,存在返回下标,不存在返回-1

2、初始化通讯录

void ContactInit(Contact* pc)//初始化通讯录
{
	assert(pc);
	pc->size = 0;
	memset(pc->date, 0, sizeof(pc->date));
}

将size置为0,使用memset函数将pc->date的内存按字节全部置为0

3、打印

void ContactPrint(const Contact* pc)//打印
{
	assert(pc);
	printf("姓名\t性别\t电话\t地址\t年龄\n");
	for (int i = 0; i < pc->size; i++)
	{
		printf("%s\t%s\t%s\t%s\t%d\n",
			pc->date[i].name,
			pc->date[i].sex,
			pc->date[i].tele,
			pc->date[i].addr,
			pc->date[i].age);
	}
}

for循环遍历打印pc->date中的结构体成员

4、增加联系人信息

void ContactAdd(Contact* pc)//增加联系人信息
{
	assert(pc&&pc->size<= MAX_CAPACITY);
	printf("请输入姓名:\n");
	scanf("%s", pc->date[pc->size].name);
	printf("请输入性别:\n");
	scanf("%s", pc->date[pc->size].sex); 
	printf("请输入电话:\n");
	scanf("%s", pc->date[pc->size].tele);
	printf("请输入地址:\n");
	scanf("%s", pc->date[pc->size].addr);
	printf("请输入年龄:\n");
	scanf("%d", &(pc->date[pc->size].age));
	pc->size++;
}

注意增加联系人后pc->size++

5、通过名字查找

void ContactFind(const Contact* pc)//查找信息
{
	assert(pc);
	printf("请输入姓名查找:");
	char arr[20] = { 0 };
	scanf("%s", arr);
	int pos = FindByName(pc, arr);
	if (pos != -1)
	{
		printf("查找到如下信息:\n");
		printf("姓名\t性别\t电话\t地址\t年龄\n");
		printf("%s\t%s\t%s\t%s\t%d\n",
			pc->date[pos].name,
			pc->date[pos].sex,
			pc->date[pos].tele,
			pc->date[pos].addr,
			pc->date[pos].age);
	}
	else
		printf("通讯录查无此人!\n");
}

先判断查找的信息是否在通讯录中,再打印该下标的信息。

6、删除联系人信息

void ContactDel(Contact* pc)//删除联系人信息
{
	assert(pc);
	printf("请输入姓名查找:");
	char arr[20]={0};
	scanf("%s", arr);
	int pos = FindByName(pc, arr);//记录size的位置
	if (pos==-1)
	{
		printf("通讯录没有该信息\n");
		return;
	}	
	for (int i = pos; i < pc->size - 1; i++)//移动元素
	{
		pc->date[i] = pc->date[i + 1];
	}
	pc->size--;
	printf("删除成功!\n");
}

通过静态函数FindByName返回的下标,通过for循环将后续元素逐个进行覆盖。

7、修改信息

void ContactModify(Contact* pc)//修改信息
{
	assert(pc);
	printf("请输入姓名查找:");
	char arr[20] = { 0 };
	scanf("%s", arr);
	int pos = FindByName(pc, arr);
	if (pos == -1)
	{
		printf("找不到\n");
		return;
	}
	else
	{
		printf("请输入更改后的姓名:\n");
		scanf("%s", pc->date[pos].name);
		printf("请输入更改后的性别:\n");
		scanf("%s", pc->date[pos].sex);
		printf("请输入更改后的电话:\n");
		scanf("%s", pc->date[pos].tele);
		printf("请输入更改后的地址:\n");
		scanf("%s", pc->date[pos].addr);
		printf("请输入更改后的年龄:\n");
		scanf("%d", &(pc->date[pos].age));
	}
}

先判断查找的信息是否在通讯录中,再修改该下标的信息。

8、排序通讯录

int name_cmp(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
}
void ContactSortByName(Contact* pc)//排序
{
	assert(pc&&pc->size!=0);
	qsort(pc->date, pc->size, sizeof(PeoInfo), name_cmp);
	printf("排序完成\n");
}

使用qsort函数排序通讯录,可参照本文学习qsort排序结构体的方法

9、清空通讯录

void ContactEmpty(Contact* pc)//清空通讯录
{
	assert(pc);
	ContactInit(pc);
	printf("通讯录已清空\n");
}

本文为静态通讯录,非动态开辟内存,此处使用初始化函数即可。

四、text.c

#include "contact.h"
void menu()
{
	printf("###########################\n");
	printf("#####1、add    2、del######\n");
	printf("#####3、find   4、modify###\n");
	printf("#####5、print  6、sort#####\n");
	printf("#####7、empty  8、exit#####\n");
	printf("###########################\n");
}
enum option
{
	ADD=1,
	DEL,
	FIND,
	MODIFY,
	PRINT,
	SORT,
	EMPTY,
	EXIT
};
int main()
{
	int input = 0;
	Contact c;//创建一个通讯录
	ContactInit(&c);//初始化通讯录
	while (1)
	{
		menu();
		printf("请输入选项:\n");
		scanf("%d", &input);
		if (input == ADD)
			ContactAdd(&c);//增加联系人信息
		else if (input == DEL)
			ContactDel(&c);//删除联系人信息
		else if (input == FIND)
			ContactFind(&c);//查找联系人信息
		else if (input == MODIFY)
			ContactModify(&c);//修改联系人信息
		else if (input == PRINT)
			ContactPrint(&c);//打印
		else if (input == SORT)
			ContactSortByName(&c);//排序
		else if (input == EMPTY)
			ContactEmpty(&c);//清空通讯录
		else if (input == EXIT)
			break;//退出
		else
			printf("输入错误!请重新输入!\n");
	}
	return 0;
}

使用enum枚举选项。

五、动图展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】静态通讯录的实现 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • 水果成篮

    LeetCode 904 水果成篮 在一排树中 第i棵树产生tree i 型的水果 你可以从你选择的任何树开始 然后重复执行以下步骤 把这棵树上的水果放进你的篮子里 如果你做不到 就停下来 移动到当前树右侧的下一棵树 如果右边没有树 就停下
  • 华为od机试 C++ 【寻找公共后缀】

    题目 你的任务是找出一个字符串数组中所有字符串的最长公共后缀 如果不存在公共后缀 则应返回 Zero 说明 公共后缀是指两个或更多字符串从末尾开始的相同字符序列 如果字符串数组为空 或者没有公共后缀 则返回 Zero 示例 示例1 输入 a
  • 网络安全 DNSSEC & HTTPDNS

    背景 随着技术的发展 网络环境也变得越来越复杂 而对于一个以网络数据传输提供服务的 App 来讲 在复杂多变的网络环境下安全稳定有效的提供好服务显得尤为重要 而为了提供安全稳定有效的 HTTP 网络服务 我们从网络请求的初始阶段 DNS 解
  • Vue3 作用域插槽v-slot

    文章目录 参考 作用域插槽应用场景 开发实验 参考 vue3官网 作用域插槽v slot 作用域插槽应用场景 插槽的内容可同时使用父组件域内和子组件域内的数据 数据传递如图 作用域插槽 官方案例 开发实验 在父组件中定义插槽
  • 爱心背景特效

  • 电影院座位连坐实现

    一 实现在线选座位功能 怎么实现连坐 实际分析 1 同一排构成连坐 2 座位可用 3 大于一形成 连坐 实现思路 前端传入一个座位的坐标的一个String的集合 前端可以传入混乱的坐标 后台来进行筛选 排序 分割数组 可以使用Arrays
  • 教程篇(7.2) 05. 规则 & SD-WAN ❀ Fortinet 网络安全架构师 NSE7

    在本课中 你将了解SD WAN规则如何根据使用的标准和策略工作 在本课中 你将了解上图显示的主题 通过了解SD WAN规则 你将了解SD WAN规则配置和操作的基础知识 SD WAN规则结合了流量匹配标准和流量转向偏好 它们描述了与SD W
  • Spring Cloud Alibaba Nacos 安装

    1 Nacos 官网下载地址 Releases alibaba nacos GitHub 2 使用 rz 命令上传到 虚拟机上 3 解压 tar zxvf nacos server 2 1 2 tar gz 注 解压后 可以直接启动 访问地
  • 系统重装系列(一)

    系统重装系列 一 自从上了大学后这电脑里的软件是越来越多 各种语言的环境配置 数据库 做题工具等等等 也懒得去一个个卸载 因为安装的太多geek卸载扫描都要半天 此外 好奇win11进行了抢先升级 大问题没有 但小Bug很头疼 最烦的是电池
  • 计算机基础知识(基础入门小白专属)五

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 疫情之下 你我素未谋面 但你一定要平平安安 一 起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 键盘特殊的按键功能
  • 【瑞吉外卖day05】

    套餐管理业务 1 新增套餐 1 1需求分析 1 2 代码开发 首先是套餐菜品关系类SetmealDish Data public class SetmealDish private Long id private Long setmealI
  • 数据分析系列之目录

    数据挖掘系列前言和目录 1 前言 为什么我要开这个系列 我明白 未来会是数据的天下 就如区块链而言 它是目前无法单独去生存下去 而是与其他技术绑定 才能更好地发挥未来的作用 什么是数据分析 就拿区块链的挖矿类比来说 数据就是矿 如何从大量矿
  • 数据表示——原码、反码、补码、移码

    到目前为止 我们学习了十进制 二进制 八进制 十六进制等用来代表实际数值的数 称为真值 这些数我们再日常生活中都会使用到 那么在计算机中数值是怎么来表示的呢 数在计算机中的表示形式统称为机器数 计算机中处理数据及运算都是采用二进制 通常规定
  • SpringBoot项目结构介绍

    访问 http start spring io 网址 进行项目导入 基本项目结构 src main java 程序开发以及主程序入口 src main resources 配置文件 src test java 测试程序 官方建议项目结构 m
  • Speech框架API

    文章目录 Speech SFVoiceAnalytics SFSpeechRecognitionResult SFTranscription SFTranscriptionSegment SFSpeechRecognitionRequest
  • React 基本简介(1)

    什么是 React 用于构建用户界面的 JavaScript 库 React API 是处理视图的 API 集合 React 仅仅负责 View 层渲染 一个视图渲染的工具库 不做框架的事情 打包 utils 等 React 组件组成 一个
  • 有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

    选择使用多库多表还是一个库多个表 取决于你的具体情况和需求 以下是一些考虑因素 数据隔离 如果每条业务线需要完全独立的数据隔离 例如不同业务线的数据不会相互关联或共享 那么使用多库可以更好地实现数据隔离 管理和维护 使用多库可以将不同业务线
  • pycharm2022.2.4在jupyter notebook模式下画动图不显示

    pycharm2022 2 4在jupyter notebook模式下画动图不显示 解决办法是 matplotlib auto 曾尝试过 matplotlib notebook 还是不行 notebook模式在web浏览器中可以正常使用 能
  • 输入20个学生的成绩,求平均成绩。要求控制成绩输入的正确性,即控制输入的成绩必须为0—100分。(C语言)

    代码 include
  • 【C语言】静态通讯录的实现

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 项目要求 实现一个通讯录 二 Contact h 三 Con