C语言通讯录

2023-11-20

主要知识,结构体、枚举、指针、递归、冒泡排序等。


一、前言

       本文将会使用c语言实现同通讯录,通讯录可储存联系人的姓名、电话、性别、年龄、住址,包括联系人的增减、查找(包括同名)、排序、联系人信息修改及联系人信息显示。

二、通讯录的实现

1.菜单

       通过菜单由用户选择要操作的功能:

void menu()
{
	printf("*****************************************\n");
	printf("*******   1.add       2.del     *********\n");
	printf("*******   3.modify    4.search  *********\n");
	printf("*******   5.sort      6.print   *********\n");
	printf("*******        0.exit           *********\n");
	printf("*****************************************\n");
}

2.结构体创建

typedef struct PeoInof
{
	char name[name_max];
	int age;
	char gender[gender_max];
	char tele[tele_max];
	char addr[addr_max];
}PeoInof;
typedef struct Contect
{
	PeoInof dete[dete_max];
	int sz;
	int num[dete_max];
	int sz1;
}Contect;

3.初始化通讯录

void InitContects(Contect* pc)
{
	pc->sz = 0;
	memset(pc->dete,0,sizeof(pc->dete));
}

4.查找函数 

       字符串比较函数依次查找,记录符合要求元素在数组中下标位置,再次将函数此时i带入此函数,继续递归查找,直至找完所有联系人。

static int FindName(int num, Contect* pc, char namecmp[])
{
	int i = 0;
	for (i = num; i < pc->sz; i++)
	{
		if (strcmp(namecmp, pc->dete[i].name) == 0)
		{
			pc->num[pc->sz1] = i;
			pc->sz1++;
			return FindName(i + 1, pc, namecmp);
		}
	}
	if (pc->sz1 != 0)
		return 1;
	else
		return -1;
}

5.增加联系人

       若通讯录已满显示“通讯录已存满!”,否则用户依次填入联系人信息,将信息存入同通讯录中 ,显示添加成功。

void AddContect(Contect* pc)
{
	if (pc->sz == dete_max)
	{
		printf("通讯录已存满!");
		return;
	}
	printf("请输入名字:\n");
	scanf("%s", pc->dete[pc->sz].name);
	printf("请输入电话:\n");
	scanf("%s", pc->dete[pc->sz].tele);
	printf("请输入地址:\n");
	scanf("%s", pc->dete[pc->sz].addr);
	printf("请输入性别:\n");
	scanf("%s", pc->dete[pc->sz].gender);
	printf("请输入年龄:\n");
	scanf("%d", &(pc->dete[pc->sz].age));
	pc->sz++;
	printf("添加成功\n");
}

6.删除联系人

       在联系人不为0的情况下输入联系人姓名,系统搜索出所有同名联系人,用户再具体选择删除。

void DelContect(Contect* pc)
{
	char namecmp[name_max] = { 0 };
	if (pc->sz == 0)
	{
		printf("保存联系人为0\n");
		return;
	}
	printf("请输入要删除的联系人\n");
	scanf("%s", namecmp);
	pc->sz1 = 0;
	int pos = FindName(0, pc, namecmp);
	if (pos > 0)
	{
		int i = 0;
		int j = 0;
		printf("%-10s%-6s%-20s%-6s%-40s\n", "  姓名", "  性别", "  电话", "  年龄", "  地址");
		for (i = 0; i < pc->sz1; i++)
		{
			printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i+1,pc->dete[pc->num[i]].name,
				pc->dete[pc->num[i]].gender,
				pc->dete[pc->num[i]].tele,
				pc->dete[pc->num[i]].age,
				pc->dete[pc->num[i]].addr);
		}
		printf("选择要删除的对象\n");
		scanf("%d", &j);
		if (j - 1 <= pc->sz1)
		{
			for (i = pc->num[j - 1]; i < pc->sz - 1; i++)
			{
				pc->dete[i] = pc->dete[pc->num[i + 1]];
			}
			pc->sz--;
			printf("删除成功\n");
		}
		else
		{
			printf("输入错误\n");
			return;
		}
	}
	else
		printf("未查找到相关联系人\n");
}

 7.修改联系人信息

      输入联系人姓名显示所有同名联系人,根据联系人序号选择要修改的联系人信息,联系人位置不变。

void ModContect(Contect* pc)
{
	char namecmp[name_max] = { 0 };
	if (pc->sz == 0)
	{
		printf("保存联系人为0\n");
		return;
	}
	printf("请输入要修改的联系人姓名\n");
	scanf("%s", namecmp);
	pc->sz1 = 0;
	int pos = FindName(0, pc, namecmp);
	if (pos > 0)
	{
		int i = 0;
		int j = 0;
		printf("%-10s%-6s%-20s%-6s%-40s\n", "  姓名", "  性别", "  电话", "  年龄", "  地址");
		for (i = 0; i < pc->sz1; i++)
		{
			printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i + 1, pc->dete[pc->num[i]].name,
				pc->dete[pc->num[i]].gender,
				pc->dete[pc->num[i]].tele,
				pc->dete[pc->num[i]].age,
				pc->dete[pc->num[i]].addr);
		}
		printf("选择要修改的对象\n");
		scanf("%d", &j);
		if (j - 1 <= pc->sz1)
		{
			printf("请输入名字:\n");
			scanf("%s", pc->dete[pc->num[j - 1]].name);
			printf("请输入电话:\n");
			scanf("%s", pc->dete[pc->num[j - 1]].tele);
			printf("请输入地址:\n");
			scanf("%s", pc->dete[pc->num[j - 1]].addr);
			printf("请输入性别:\n");
			scanf("%s", pc->dete[pc->num[j - 1]].gender);
			printf("请输入年龄:\n");
			scanf("%d", &(pc->dete[pc->num[j - 1]].age));
			printf("修改成功\n");
		}
		else
		{
			printf("输入错误\n");
			return;
		}
	}
	else
		printf("未查找到相关联系人\n");
}

8. 搜索联系人 

       根据联系人姓名查找出所有联系人并显示,若没有此联系人则会有相应的提示。

void SeaContect(Contect* pc)
{
	char namecmp[name_max] = { 0 };
	printf("请输入要查找的姓名\n");
	scanf("%s", namecmp);
	pc->sz1 = 0;
	int pos=FindName(0, pc, namecmp);
	if (pos > 0)
	{
		printf("%-10s%-6s%-20s%-6s%-40s\n", "  姓名", "  性别", "  电话", "  年龄", "  地址");
		for (int i = 0; i < pc->sz1; i++)
		{
			printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i+1,pc->dete[pc->num[i]].name,
				pc->dete[pc->num[i]].gender,
				pc->dete[pc->num[i]].tele,
				pc->dete[pc->num[i]].age,
				pc->dete[pc->num[i]].addr);
		}
	}
	else
		printf("未查找到相关联系人\n");
}

9.显示联系人

       显示所有联系人信息。

void PrintContect(Contect* pc)
{
	if (pc->sz == 0)
	{
		printf("保存联系人为0\n");
		return;
	}
	printf("%-10s%-6s%-20s%-6s%-40s\n", "  姓名", "  性别", "  电话", "  年龄" ,"  地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%d:%-10s%-6s%-20s%-6d%-40s\n",i+1, pc->dete[i].name, pc->dete[i].gender, pc->dete[i].tele, pc->dete[i].age, pc->dete[i].addr);
	}
}

10.联系人排序

        根据冒泡排序 对联系人进行排序。

void SortContrct(Contect* pc)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < pc->sz-1; i++)
	{
		for (j = 0; j < pc->sz -1- i; j++)
		{
			if ((strcmp(pc->dete[j].name, pc->dete[j+1].name)) > 0)
			{
				PeoInof Sor;
				Sor = pc->dete[j];
				pc->dete[j] = pc->dete[j+1];
				pc->dete[j+1] = Sor;
			}
		}
	}
	printf("排序成功\n");
}

三、代码展示

contect.h

#pragma once
#include <stdio.h>
#include<string.h>
#define name_max 20
#define gender_max 6
#define tele_max 12
#define addr_max 30
#define dete_max 1000
typedef struct PeoInof
{
	char name[name_max];
	int age;
	char gender[gender_max];
	char tele[tele_max];
	char addr[addr_max];
}PeoInof;
typedef struct Contect
{
	PeoInof dete[dete_max];
	int sz;
	int num[dete_max];
	int sz1;
}Contect;
void InitContects(Contect *pc);//初始化通讯录
void AddContect(Contect *pc);//增加联系人
void PrintContect(Contect* pc);//显示联系人
void DelContect(Contect* pc);//删除联系人
void SeaContect(Contect* pc);//查找联系人
void ModContect(Contect* pc);//修改联系人
void SortContrct(Contect* pc);//联系人排序

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("*****************************************\n");
	printf("*******   1.add       2.del     *********\n");
	printf("*******   3.modify    4.search  *********\n");
	printf("*******   5.sort      6.print   *********\n");
	printf("*******        0.exit           *********\n");
	printf("*****************************************\n");
}
enum Option
{
	EXIT,
	ADD,
	DEL,
	MODIFY,
	SEARCH,
	SORT,
	PRINT,
};
int main()
{
	int input=0;
	Contect con;
	InitContects(&con);
	do
	{
		menu();
		printf("请输入选项:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case ADD://
			AddContect(&con);
			break;
		case DEL:
			DelContect(&con);
			break;
		case MODIFY://修改
			ModContect(&con);
			break;
		case SEARCH://搜索//
			SeaContect(&con);
			break;
		case SORT://排序
			SortContrct(&con);
			break;
		case PRINT://
			PrintContect(&con);
			break;
		case EXIT://
			break;
		default:
			break;
		}
	} while (input);
	return 0;
}


结果展示

感谢观看

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

C语言通讯录 的相关文章

随机推荐

  • Java学习13:面向对象-多态(Polymorphism)内存分析图解

    1 概述 多态是Java面向对象三大特征之一 多态 Polymorphism 顾名思义 即对象具有多种形态 具体而言 是编译时类型 运行时类型 编译时类型 由声明时的类型决定 一般是父类 运行时类型 由实际对应的对象类型决定 具体是哪个子类
  • 腾讯、阿里多位大佬共同推荐!封神级Python学习路线+核心知识点笔

    人工智能时代下 Python毫无疑问是最热的编程语言 有人夸它功能强大还上手轻松 有人说它学习曲线不那么陡峭 但是更多的人 在推开Python的大门后却发现 Python入门容易但精通却不易 你是否也曾傻傻分不清 列表 元组 字典 集合 等
  • mysql navicat 修改默认值_怎么在navicat中为datetime设置默认值

    在使用navicat设计表的字段时 是可以给字段设置默认值的 但是datetime类型类型的字段缺设置不了 下面我们就为大家详细解读一下这个问题 由于MySQL目前字段的默认值不支持函数 所以以create time datetime de
  • 2023面试问答-计算机网络

    OSI 的七层模型分别是 各自的功能是什么 简要概括 物理层 底层数据传输 如网线 网卡标准 数据链路层 定义数据的基本格式 如何传输 如何标识 如网卡MAC地址 网络层 定义IP编址 定义路由功能 如不同设备的数据转发 传输层 端到端传输
  • 【ES实战】ES中关于segment的小结

    文章目录 ES中关于segment的小结 ES中segment相关的原理 在Lucene中的产生segment的过程 Lucene commit过程 ES为了实现近实时可查询做了哪些 缩短数据可被搜索的等待时长 增加数据的可靠性 优化seg
  • mysql更新一张表的字段来自另一张表的某个字段

    UPDATE tba a LEFT JOIN tbb b on a id b id set a xxx b xxxx where a id b id
  • 对于opencv摄像头调用与现实方向相反的问题怎么解决?

    可以对原始图像进行水平翻转 使用opencv自带的flip函数 例如 读取图像帧 ret frame cap read 水平翻转图像 frame cv2 flip frame 1 这样就可以了 后面的参数1代表水平翻转图像 而0代表垂直翻转
  • node.js与elasticsearch交互

    参考elasticsearch 以下简称es 官方javascript的API https www elastic co guide en elasticsearch client javascript api 6 x api refere
  • Sqli-Labs靶场(6--10)题详解

    目录 六 Less 6 GET Double Injection Double Quotes string GET 双重注入 双引号 字符串 七 Less 7 GET Dump into outfile string GET 导出文件 字符
  • Altium designer自动布线设置GND或其他网络不布线的方法

    1 在导航栏里面找到设计栏 找到类选项打开2 在Net Classes选项下 右击鼠标 找到添加类选项 会创建一个New Class 3 设置好需要布线的网络 以及不需要布线的网络 如下图 4 找到自动布线菜单栏下的网络类 点击进去如下图
  • Android下自定义的jar库文件编译和调用

    主要为了解决如下问题 项目中使用了Android未公开的API 在Eclipse下会有红叉显示 不同的项目抽出相同部分的代码共用 必需的前提条件 需要有Android源代码 编译的库文件主要是封装未公开API或者共用代码 工程1 Java库
  • h5单页面埋点问题(undefine)

    需求 商城页面里调用第三方资源埋点 代码实现 主要解决资源未加载就被调用问题 备注 把调用函数作为参数传进去 控制保证在资源加载完成后调用 let COLLECTURL http collect trc com index js 动态创建j
  • java的特点

    一 简单易学 1 java的风格类似于c 因而许多c c程序员初次接触java语言时会感到熟悉 从某种意义来说c 语言是从c语言继承而来 java语言是c 语言的一个变种 因此 学过c或c 的程序员可以更快速的掌握java编程技术 附图 编
  • 【mysql timeStamp默认值0000-00-00 00:00:00 报错:Invalid default value for ‘end_time’】

    mysql timeStamp默认值0000 00 00 00 00 00 报错 Invalid default value for end time 运行其中的sql文件时报错 nvalid default value for end t
  • python猜拳游戏编程代码_用python实现“猜拳"游戏

    原标题 用python实现 猜拳 游戏 用python实现 猜拳 游戏 先来练习一道用python编写的小程序 这道题是用for in 循环实现输入10个数并求和 这里用到了append 方法 append 方法 是一个很重要的方法 它是向
  • 计算机翻译的汉字,计算机系外文翻译(中英对照3000汉字左右).doc

    文档介绍 毕业设计 论文 外文资料翻译系别计算机信息与技术系专业计算机科学与技术班级姓名学号外文出处附件1 原文 2 putingMainarticle puter wasrecordedin1613 referringtoapersonw
  • 拓扑排序,广度优先

    使用一个队列来进行广度优先搜索 初始时 所有入度为 0 的节点都被放入队列中 它们就是可以作为拓扑排序最前面的节点 并且它们之间的相对顺序是无关紧要的 在广度优先搜索的每一步中 取出队首的节点 u 将 u 放入答案中 移除 u 的所有出边
  • hample滤波器的原理及其Python实现

    hample滤波器 1 作用及原理 2 Python实现 1 作用及原理 功能 检测并删除异常值 用一个一维向量 x x 1
  • 利用云原生数仓 Databend 构建 MySQL 的归档分析服务

    MySQL 常用 OLTP 业务环境 一般会使用比较好的硬件资源来提供对外服务 现在 MySQL 数据对外提供的数据动不动好几个 T 也是正常的 在很多业务中 数据有较强的生命周期 在线一段时间后 可能就是失去业务意义 如 某个业务下线 业
  • C语言通讯录

    主要知识 结构体 枚举 指针 递归 冒泡排序等 文章目录 一 前言 1 菜单 2 结构体创建 3 初始化通讯录 4 增加联系人 4 删除联系人 5 修改联系人信息 6 搜索联系人 7 显示联系人 8 联系人排序 三 代码展示 contect