C语言实现通讯录(实现增删查改显示功能)面向对象的编程

news2025/1/16 8:00:01

前言

大家好,我是程序猿爱打拳。今天我给大家带来的是C语言实现通讯录,主要的实现方式是结构体。

目录

1.设计思想

2.各个模块的实现

3.最终效果展示


1.设计思想

首先,我们在设计一个通讯录的时候。我们得知道通讯录的基本功能是什么。比如当你在街上遇见一个女孩你很中意她,因此首先你要做的是向她要电话号码,这时候我们手机的通讯录就发挥作用了,当你要到电话号码后你得死皮赖脸一点再问她要姓名然后继续发起攻势问她要住址、年龄。这样通讯录存入的一条记录就诞生了。当然,某一天你跟这个女生聊掰了,你想删除关于她所有的信息。这时你要使用到的功能就是删除信息。当然我们可以把模块设置得更丰富一些,因此我们设计可以有以下几个模块:

  • 增加信息
  • 删除信息
  • 查找信息
  • 修改信息
  • 显示信息

2.各个模块的实现

(1)增加信息

//函数的声明
void AddContact(Console* pc);

//函数的定义
void AddContact(Console* pc)
{
	if (pc->sz == Per_Max)
	{
		printf("通讯录人员已满!\n");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s", pc->date[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->date[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->date[pc->sz].sex);
	printf("请输入地址:>");
	scanf("%s", pc->date[pc->sz].addr);
	printf("请输入电话:>");
	scanf("%d", &(pc->date[pc->sz].tele));

	pc->sz++;
}

 (2)删除信息

//函数的声明
void DeleContact(Console* pc);

//函数的定义
void DeleContact(Console* pc)
{
	char key[Name_Max] = {0};
	int i = 0;
	int pos = 0;
	if (pc->sz == 0)
	{
		printf("通讯录里面还没有记录!\n");
		return;
	}
	printf("请输入此人的姓名:>");
	scanf("%s", &key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, key) == 0)
		{
			pos = i;
			break;
		}
	}

	for (i = pos; i < pc->sz-1; i++)
	{
		pc->date[i] = pc->date[i+1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

 (3)查找信息

//函数的声明-查找信息
void SearchContact(Console* pc);

//函数的定义
void SearchContact(Console* pc)
{
	char key[Name_Max];
	int i = 0;
	int ret = -1;
	printf("请输入查找人的姓名:>");
	scanf("%s", key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name,key) == 0)
		{
			ret = 1;
			break;
		}
	}
	if (ret==-1)
	{
		printf("没有此人!");
	}
	else
	{
		printf("查找的信息为:\n");
		printf("%-10s%-10d%-10s%-10s%-10d\n",
			pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].addr,
			pc->date[i].tele
			);
	}
}

(4)修改信息

//函数的声明-修改信息
void ModifyContact(Console* pc);

//函数的定义
void ModifyContact(Console* pc)
{
	assert(pc);
	char key[Name_Max];
	int i = 0;
	int ret = -1;
	printf("请输入你要修改的人姓名:>");
	scanf("%s", key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, key) == 0)
		{
			ret = 1;
			break;
		}
	}
	if (ret == -1)
	{
		printf("没有此人!\n");
	}
	else
	{
		printf("此人的信息为:\n");
		printf("%-10s%-10d%-10s%-10s%-10d\n",
			pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].addr,
			pc->date[i].tele
		);
	}
	printf("请输入姓名:>");
	scanf("%s", pc->date[i].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->date[i].age));
	printf("请输入性别:>");
	scanf("%s", pc->date[i].sex);
	printf("请输入地址:>");
	scanf("%s", pc->date[i].addr);
	printf("请输入电话:>");
	scanf("%d", &(pc->date[i].tele));
	printf("修改成功!\n");
}

(5)显示信息

//函数的声明-显示信息
void ShowContact(Console* pc);

//函数的定义
void ShowContact(Console* pc)
{
	int i = 0;
	printf("%-10s%-10s%-10s%-10s%-10s\n", 
	"姓名", "年龄", 
	"性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-10d%-10s%-10s%-10d\n", 
		pc->date[i].name,
		pc->date[i].age,
		pc->date[i].sex,
		pc->date[i].addr,
		pc->date[i].tele
		);
	}
}

3.最终效果展示

为了编写程序的便利,我们一般模块化编写程序,各个函数用到头文件和函数的声明我们封装到一个名为.h的头文件里面。函数的定义我们放到一个.c的文件里面,主函数我们再放入另一个.c的文件里面。那么我在设计通讯录的工程中,我把各个函数用到头文件和函数的声明放到contact.h文件中,函数的定义放到contact.c文件中,主函数放到test.c文件中。

(1)contact.h文件中

//Person结构体内的参数设置
#define Per_Max 100
#define Name_Max 20
#define Sex_Max 5
#define Addr_Max 20

//各个函数用到的头文件
#include<stdio.h>
#include<string.h>
#include<assert.h>

//定义Person结构体
typedef struct Person
{
	char name[Name_Max];
	int age;
	char sex[Sex_Max];
	char addr[Addr_Max];
	int tele;
}Person;

//控制Person结构体
typedef struct Console
{
	Person date[Per_Max];
	int sz;
}Console;

//初始化通讯录
void InitContact(Console* pc);

//增加信息
void AddContact(Console* pc);

//删除信息
void DeleContact(Console* pc);

//查找信息
void SearchContact(Console* pc);

//修改信息
void ModifyContact(Console* pc);

//显示信息
void ShowContact(Console* pc);

(2)contact.c文件中

//引入contact.h头文件
#include"contact.h"

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

//增加信息
void AddContact(Console* pc)
{
	assert(pc);
	if (pc->sz == Per_Max)
	{
		printf("通讯录人员已满!\n");
		return;
	}
	printf("请输入姓名:>");
	scanf("%s", pc->date[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->date[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->date[pc->sz].sex);
	printf("请输入地址:>");
	scanf("%s", pc->date[pc->sz].addr);
	printf("请输入电话:>");
	scanf("%d", &(pc->date[pc->sz].tele));

	pc->sz++;
}


//删除信息
void DeleContact(Console* pc)
{
	assert(pc);
	char key[Name_Max] = {0};
	int i = 0;
	int pos = 0;
	if (pc->sz == 0)
	{
		printf("通讯录里面还没有记录!\n");
		return;
	}
	printf("请输入此人的姓名:>");
	scanf("%s", &key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, key) == 0)
		{
			pos = i;
			break;
		}
	}

	for (i = pos; i < pc->sz-1; i++)
	{
		pc->date[i] = pc->date[i+1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

//查找信息
void SearchContact(Console* pc)
{
	assert(pc);
	char key[Name_Max];
	int i = 0;
	int ret = -1;
	printf("请输入查找人的姓名:>");
	scanf("%s", key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name,key) == 0)
		{
			ret = 1;
			break;
		}
	}
	if (ret==-1)
	{
		printf("没有此人!");
	}
	else
	{
		printf("%-10s%-10s%-10s%-10s%-10s\n",
			"姓名", "年龄",
			"性别", "地址", "电话");
		printf("%-10s%-10d%-10s%-10s%-10d\n",
			pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].addr,
			pc->date[i].tele
			);
	}
}

//修改信息
void ModifyContact(Console* pc)
{
	assert(pc);
	char key[Name_Max];
	int i = 0;
	int ret = -1;
	printf("请输入你要修改的人姓名:>");
	scanf("%s", key);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, key) == 0)
		{
			ret = 1;
			break;
		}
	}
	if (ret == -1)
	{
		printf("没有此人!\n");
	}
	else
	{
		printf("此人的信息为:\n");
		printf("%-10s%-10d%-10s%-10s%-10d\n",
			pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].addr,
			pc->date[i].tele
		);
	}
	printf("请输入姓名:>");
	scanf("%s", pc->date[i].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->date[i].age));
	printf("请输入性别:>");
	scanf("%s", pc->date[i].sex);
	printf("请输入地址:>");
	scanf("%s", pc->date[i].addr);
	printf("请输入电话:>");
	scanf("%d", &(pc->date[i].tele));
	printf("修改成功!\n");
}

//显示信息
void ShowContact(Console* pc)
{
	assert(pc);
	int i = 0;
	printf("%-10s%-10s%-10s%-10s%-10s\n",
		"姓名", "年龄",
		"性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s%-10d%-10s%-10s%-10d\n",
			pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].addr,
			pc->date[i].tele
		);
	}
}

(3)test.c文件中

//引入contact.h头文件
#include"contact.h"

//菜单
void men()
{
	printf("+--------------+--------------+\n");
	printf("|  1.增加信息  |  2.删除信息  |\n");
	printf("+--------------+--------------+\n");
	printf("|  3.查找信息  |  4.修改信息  |\n");
	printf("+--------------+--------------+\n");
	printf("|  5.显示信息  |  0.退出程序  |\n");
	printf("+--------------+--------------+\n");
}

//主函数
int main()
{
	int input = 0;
	Console con;
	InitContact(&con);
	do
	{
	  men();
	  printf("请输入你的选项:>");
	  scanf("%d", &input);
	  switch (input)
	  {
	  case 0:
		  printf("你已退出程序!");
		  break;
	  case 1:
		  AddContact(&con);
		  break;
	  case 2:
		  DeleContact(&con);
		  break;
	  case 3:
		  SearchContact(&con);
		  break;
	  case 4:
		  ModifyContact(&con);
		  break;
	  case 5:
		  ShowContact(&con);
		  break;
	  default:
		  printf("请选择正确的选项!");
		  break;
	  }
	} while (input);
	return 0;
}

效果展示:

 

 

 

 

注意:

细心的伙伴会发现,我们每一个函数的实现都用到了查找信息。因此我们可以把查找信息专门设置为一个函数。因此每个函数都可以调用查找信息函数,实现函数的嵌套,你可以尝试一下。

当然,每当这个程序退出去以后。所有的信息都会消失,我们得重新输入。这就是单个语言的局限性,因此我们需要学习数据库知识。或者你可以通过.text文件保存下来,你也可以尝试下。

此通讯录可以增添功能,如排序等等。


以上就是本次博文的内容,感谢阅读! 

Never Give Up

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python第一周作业

作业1&#xff1a;1、PPT上五个控制台界面2、要求定义两个数&#xff0c;并且交换它们的值&#xff08;请使用多种方式&#xff0c;越多越好&#xff09;作业1作业2&#xff1a;判断一个数&#xff0c;是否是2的指数2的指数0000 0010 0000 00010000 0100 0000 00110000 1000 00…

EXCEL-职业版本(2)

Excel-职业版本&#xff08;2&#xff09; 定位 1.如何快速定位到不连续的空值&#xff0c;填充为0 1.在任意空单元格里复制0 2.选中数据区域CtrlA 3.CtrlG 4.选择【定位条件】 5.选择【空值】 6.ctrlV 粘贴 即可 2.怎么一次性计算每个小组的数量 单价和金额的和? 1.选中…

Spring——是什么?作用?内容?用到的设计模式?

目录 什么是spring&#xff1f; spring是为了解决什么问题而衍生的&#xff1f;&#xff08;历史&#xff09;Spring解决了实际生产中的什么问题&#xff1f; spring包含了哪些部分&#xff1f;&#xff08;组成&#xff09; Spring的特点是什么&#xff1f; spring框架中…

K_A14_004 基于STM32等单片机驱动旋转角度传感器模块 串口与OLED0.96双显示

K_A14_004 基于STM32等单片机驱动旋转角度传感器模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC旋转角度传感器模块1.2、STM32F103C8T6旋转角度传感器模块五、…

Arthas阿尔萨斯的使用安装详细教程

Arthas阿尔萨斯的使用安装详细教程一、阿尔萨斯能解决什么什么问题二、安装与命令三、实际应用四、自学途径本篇文章是自学B站“御风大世界”视频的提炼和总结。 原视频见&#xff1a;Arthas使用教程 一、阿尔萨斯能解决什么什么问题 alibaba出品线上JVM监控诊断利器 1、是一…

Flask源码篇:Flask路由规则与请求匹配过程(超详细,易懂)

目录1 启动时路由相关操作&#xff08;1&#xff09;分析app.route()&#xff08;2&#xff09;分析add_url_rule()&#xff08;3&#xff09;分析Rule类&#xff08;4&#xff09;分析Map类&#xff08;5&#xff09;分析MapAdapter类&#xff08;6&#xff09;分析 url_rule_…

深度学习技巧应用2-神经网络中的‘残差连接’

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍 深度学习技巧应用2-神经网络中的‘残差连接’。 一、残差连接介绍 残差连接是一种神经网络中的一种运用技巧。由于深层网络容易出现梯度消失或梯度爆炸的问题&#xff0c;因此可以通过残差连接的方式&#xff0c;将网…

C++数据结构 —— 红黑树

目录 1.红黑树概念 2.红黑树节点的定义 3.红黑树的插入操作 4.红黑树的调整动作 4.1调整动作1 4.2调整动作2 4.3调整动作3 4.4插入算法的完整代码 4.5验证红黑树 4.6完整代码 1.红黑树概念 与AVL树一样&#xff0c;红黑树也是map、set等关联式容器的底层结构。但红黑…

大数据开发学习好找工作么

工作到底好不好找&#xff0c;市场需求是一方面&#xff0c;更多的还是要看个人成长背景和实际能力抛开两点都不谈就单说好找或者不好找纯属有点耍流氓了大数据需求越来越多&#xff0c;只有技术在手不愁找不到工作。 大数据开发主要是负责大数据挖掘&#xff0c;大数据清洗处…

谷歌验证码的使用

1. 表单重复提交之验证码 1.1 表单重复提交三种常见情况 提交完表单。服务器使用请求转来进行页面跳转。这个时候&#xff0c;用户按下功能键 F5&#xff0c;就会发起最后一次的请求。造成表单重复提交问题。解决方法&#xff1a;使用重定向来进行跳转用户正常提交服务器&…

行为型模式之策略模式

行为型模式&#xff1a;类和对象如何交互&#xff0c;划分责任和算法&#xff0c;即对象之间通信。 概念 策略模式是对算法的包装&#xff0c;是把使用算法的责任和算法本身分割开来&#xff0c;委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面…

Servlet请求响应

文章目录Servlet请求响应进阶内容回顾Servlet 体系结构get/post 请求Servlet 的生命周期web.xml 配置文件HttpServletRequest 接口文件上传HttpServletResponse 接口文件下载响应表格的案例转发与重定向简介请求转发原理请求转发案例重定向原理重定义与请求转发的区别Servlet请…

分巧克力(二分)

儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有 N 块巧克力&#xff0c;其中第 i 块是 HiWi 的方格组成的长方形。为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足&#xff1a;形…

百度“松果“ OJ赛第一周 题解

百度"松果" OJ赛第一周 题解 第一周的周赛基本考察的都是模拟和递推递归问题&#xff0c;虽然不涉及很难的算法&#xff0c;但是还是比较考察代码能力和思维能力的。 1.数据流的中位数 题意&#xff1a;要求你做一个系统可以进行两个操作&#xff0c;第一个操作是…

cloud flare 真不错(常规思路)

2022-10-20 前言 接到一个测试目标&#xff0c;开局cloudflare&#xff0c;最后运气不错还是拿下了。因授权测试等原因&#xff0c;文章仅展示思路历程。 过程 信息搜集 给的目标是test.com&#xff0c;前期经过一些基本的信息搜集&#xff0c;发现了一个求职子域employee…

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统&#xff0c;功能包括&#xff1a;任务管理、时间管理、信号量、消息队列、…

嵌入式开发:McObject eXtremeDB嵌入式数据库系统

嵌入式数据库已经成为数据库技术的一种流行应用&#xff0c;尤其是对于企业中的物联网应用。有很多理由将数据库嵌入到应用程序的端点中&#xff0c;而不仅仅是将数据推送到设备中。嵌入式开发人员在选择嵌入式数据库时&#xff0c;真正重要且与众不同的解决方案是写入速度、大…

【边缘端环境配置】英伟达Jetson系列安装pytorch/tensorflow/ml/tensorrt环境(docker一键拉取)

【边缘端环境配置】英伟达Jetson系列安装pytorch/tensorflow/ml/tensorrt环境&#xff08;docker一键拉取&#xff09;0.JetPack1.安装输入法2.安装docker和nvidia-docker3.拉取l4t-pytorch镜像4.拉取l4t-tensorflow镜像5.拉取l4t-ml镜像6.拉取tensorrt镜像7.镜像换源8.其他&am…

三数之和(双指针 or hash表)

给你一个整数数组nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]]满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 3 < …

ubuntu22.04 Desktop 服务器安装

操作系统 使用的是Uubntu22.04 Desktop的版本&#xff0c;系统安装后&#xff0c;默认开启了53端口和631端口 关闭udp 5353、53791端口&#xff08;avahi-daemon服务&#xff09; sudo systemctl stop avahi-daemon.socket avahi-daemon.service sudo systemctl disable ava…