【C】想练习C语言?通讯录的实现了解一下

news2024/12/24 21:41:24

目录

实现思路

开始实现

添加增加联系人功能

添加显示联系人信息的功能

添加删除联系人功能

添加查找指定联系人的功能

添加修改指定联系人的功能

测试

代码

Test.c

Contact.c

Contact.h


实现思路

1.通讯录中保存人的信息:名字、年龄、性别、电话、住址

2.通讯录的功能:

  • 通讯录可以存放100个人的信息
  • 增加联系人
  • 删除指定联系人
  • 修改指定联系人
  • 查找指定联系人
  • 显示所有联系人的信息
  • 排序功能

实现以上思路,我们需要创建3个文件

  • test.c   - 测试通讯录
  • contact.h  - 函数和类型的声明
  • contact.c  - 函数的实现

 我们可以以结构体的形式设计保存每个人的信息

struct PeoInfo

{

//....

}

当通讯录需要存放100个人的信息时,我们可以以数组形式存放这些结构体

开始实现

创建3个文件

在头文件Contact.h进行类型的声明

代码

#pragma once


//类型的声明

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char addr[30];
}PeoInfo;

写出主函数,我们需要在test()中完成我们的整个测试,

我们打印菜单,同时通过do..while()循环,完成功能的选择

(注:记得加上 #include"Contact.h" 引用自己的头文件)

代码

#define _CRT_SECURE_N0_WARNINGS 1
#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");
}
void test()
{
	int input = 0;
	//首先得有通讯录
	PeoInfo data[100];
    int sz=0;//记录通讯录的人数的增加
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 0:
			break;
		default:
			break;
		}

	} while (input);
}
int main()
{
	test();
	return 0;
}

我们对通讯录部分进行整合封装,并初始化

 

 

 用预处理指令如#define MAX 100让类型声明中的数据可以修改,便于维护

将利用枚举代替数字,更加直观

添加增加联系人功能

添加显示联系人信息的功能

我们现在已经加了两个功能,来运行测试一下

好了,测试成功,我们继续添加功能

添加删除联系人功能

改进:将删除功能中的查询联系人部分封装为函数,后续功能需要查询就可以字节调用这个函数,提高代码复用性。(注:这个函数不需要在头文件声明,因为该函数只需要在内部使用)

添加查找指定联系人的功能

添加修改指定联系人的功能

 

对于排序功能,排序方式有很多种,比如按姓名排序,按年龄排序等等,可以跟据需求来设计,这里就不一一实现了。

添加退出功能,直接打印退出游戏并跳出。

当选择到非法字符时,打印重新选择,并跳出选择界面。

 到这里,一个建议的通讯录就完成了。

让我们来测试一下

测试

 

 

 测试成功!

下面是这个通讯录程序的实现代码

代码

Test.c

#define _CRT_SECURE_NO_WARNINGS 1

#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");
}
void test()
{
	int input = 0;
	//首先得有通讯录
	//PeoInfo data[100];
	//int sz = 0;
	Contact con;
	InitContact(&con);//结构体传参,最好传地址

	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%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:
			//排序
			//按名字排序?
			//按年龄排序?
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;

		}

	} while (input);
}
int main()
{
	test();
	return 0;
}

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

void InitContact(Contact* pc)
{
	assert(pc);//检测指针是否为空指针,增强代码的健壮性
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}


void AddContact(Contact* pc)
{
	assert(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;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄","性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}




//删除联系人功能实现

//常规写法*********

//void DelContact(Contact* pc)
//{
//	if (pc->sz == 0)
//	{
//		printf("通讯录为空,无法删除\n");
//		return;
//	}
//	char name[MAX_NAME] = { 0 };
//	assert(pc);
//	//删除
//	printf("请输入要删除的人的名字:>");
//	scanf("%s", name);
//
//	//找到要删除的人//遍历
//	int i = 0;
//	int del = 0;
//	int flag = 0;
//	for (i = 0; i < pc->sz; i++)
//	{
//		if (strcmp(pc->data[i].name, name)==0)//strcmp()用于比较两个字符串是否相等,相等返回0
//		{
//			del = i;
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("要删除的联系人不存在\n");
//		return;
//	}
//
//
//	//删除坐标为del的联系人
//	for (i = del; i < pc->sz-1; i++)
//	{
//		pc->data[i] = pc->data[i + 1];
//	}
//	pc->sz--;
//	printf("成功删除联系人\n");
//}

//****************





//*******************
//封装查询函数
int FindByName(const Contact* pc, char name[])
{
	//找到要删除的人//遍历
	int i = 0;

	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//strcmp()用于比较两个字符串是否相等,相等返回0
		{
			return i;//找到了
		}
	}
	return -2;//找不到
}
//*****************************


//删除过程中有查询步骤,查询可以单独封装为函数,其他功能也可以使用这个函数

void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	assert(pc);
	//删除
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);

	//找到要删除的人//遍历
	int del = FindByName(pc, name);
	if (del == 0)
	{
		printf("要删除的联系人不存在\n");
		return;
	}
	int i = 0;
	//删除坐标为del的联系人
	for (i = del; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");
}


//添加查询指定联系人的功能
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找联系人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -2)
		printf("要查找的人不存在\n");
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");

		//打印数据
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\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)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
		printf("要修改的人不存在\n");
	else
	{
		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");
	}

}

Contact.h

#pragma once

#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

//枚举 代替数字,更加直观
enum OPTION
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};

//类型的声明

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[100];
	int sz;
}Contact;


//函数声明
// 
//初始化通讯录
void InitContact(Contact* pc);

//增加联系人
void AddContact(Contact* pc);

//显示所有联系人的信息
void ShowContact(const Contact* pc);//只打印,不涉及修改信息,所以加const

//删除指定联系人
void DelContact(Contact* pc);


//查找指定联系人
void SearchContact(Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

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

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

相关文章

Camtasia2024永久激活码

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

[Python进阶] 消息框、弹窗:tkinter库

6.16 消息框、弹窗&#xff1a;tkinter 6.16.1 前言 应用程序中的提示信息处理程序是非常重要的部分&#xff0c;用户要知道他输入的资料到底正不正确&#xff0c;或者是应用程序有一些提示信息要告诉用户&#xff0c;都必须通过提示信息处理程序来显示适当的信息&#xff0c…

CC001:CC照片建模

摘要&#xff1a;CC照片建模原理是通过从图像中提取特征点和特征描述符&#xff0c;然后根据特征点的匹配来计算相机的位姿&#xff0c;从而生成三维点云数据。最后&#xff0c;借助网格重建和纹理映射的方法&#xff0c;将点云转换为带有纹理的三维网格模型。 实验数据&#x…

【Java每日一题】——第四十题:设计一个Shape接口和它的两个实现类Square和Circle(2023.10.26)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

windows上安装wsl(windows的linux子系统)

windows上安装wsl 说明 wsl(Windows Subsystem for Linux),windows的linux子系统。 我以为直接在微软应用商店直接下载想要安装的linux环境就可以了。 然而,出现了这个错误 Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0…

递归神经网络 (RNN)

弗朗西斯科佛朗哥 一、说明 循环神经网络非常有趣&#xff0c;因为与前馈网络不同&#xff0c;在前馈网络中&#xff0c;数据只能在一个方向上传播&#xff0c;每个神经元可以与连续层的一个或多个神经元连接&#xff0c;在这种类型的网络中&#xff0c;神经元还可以环回自身或…

Java和Linux脚本操作:如何实现自动化测试?

Java和Linux脚本操作&#xff1a;实现自动化测试的方法与示例 引言&#xff1a; 在软件开发过程中&#xff0c;自动化测试能够极大地提高测试效率和质量。通过使用Java语言和Linux脚本&#xff0c;我们可以编写强大的自动化测试脚本&#xff0c;实现自动化执行测试用例、生成测…

shopee哪个站点好做

Shopee是一个跨国电子商务平台&#xff0c;拥有许多不同的站点&#xff0c;分布在亚洲和其他地区。哪个Shopee站点适合做生意要取决于你的产品、目标市场和其他因素。以下是一些考虑因素&#xff1a; 1、目标市场&#xff1a;首先要确定你想要销售的产品的目标市场是哪里。不同…

Transformer-深度学习-台湾大学李宏毅-课程笔记

目录 参考Seq2seqSequence-to-sequence&#xff08;Seq2seq&#xff09;适用任务语音识别机器翻译语音翻译语音合成聊天机器人自然语言处理硬解任务&#xff1a;文法分析硬解任务&#xff1a;多标签分类硬解任务&#xff1a;目标检测 Sequence-to-sequence&#xff08;Seq2seq&…

《动手学深度学习 Pytorch版》 10.5 多头注意力

多头注意力&#xff08;multihead attention&#xff09;:用独立学习得到的 h 组不同的线性投影&#xff08;linear projections&#xff09;来变换查询、键和值&#xff0c;然后并行地送到注意力汇聚中。最后&#xff0c;将这 h 个注意力汇聚的输出拼接在一起&#xff0c;并且…

0024Java程序设计-毕业论文管理系统的设计与实现

文章目录 **目录**系统设计开发环境 随着高校的规模不断扩大,如何合理地利用教学资源、有效地加强教学管理工作,已成为各大高校关注的焦点。目前,在教学管理方面,特别是在学生学籍管理、成绩管理等方面都普遍采用了网络化管理手段,而对于课程设计这一重要的教学环节,则普遍采用…

暴跌5600亿!台积电没有想到,中国5G手机如此要命

自从国产5G手机上市以来&#xff0c;台积电的股价持续下跌&#xff0c;至今已下跌了蒸发770亿美元&#xff08;约5600亿元&#xff09;&#xff0c;损失规模居亚洲之首&#xff0c;然而更可怕的是这款手机产生的影响正持续扩大&#xff0c;台积电可能面临生存危机。 一、台积电…

Maven项目用jetty在服务器部署与配置

Maven项目用jetty在服务器部署与配置 零.Jetty在服务器部署配置 0.1 修改jetty的默认端口 修改 $JETTY_HOME/etc/jetty.xml 文件&#xff0c; 将jetty.port的值改为指定自己需要的端口号即可&#xff0c; 默认为8080。 如下图 jetty 9 版本中&#xff0c;修改%JETTY_HOME%…

A股风格因子看板 (2023.10 第12期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第12期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

贝锐蒲公英推出二层组网功能,实现远程工业设备数据互通、扫描发现

工业物联是目前的发展趋势所在&#xff0c;包含人机互动、状态感知、设备监测、数据交互等应用场景&#xff0c;海量的设备需要实现互联网接入与管理能力。 但是&#xff0c;工业设备往往位于分散在各地的制造工厂或是户外&#xff0c;且不同地区通常使用了不同的网络运营商&am…

windows中毒

一.查看系统账户安全 1.查看服务器是否有弱口令、可疑账号、隐藏账号、克隆账号、远 程管理端口是否对公网开放 2.winr 查看他 二.检查异常端口 进程 查看端口 定位exe程序 3.另一种方法 d盾 火绒剑 xuetr 判断可疑进程 三.检查启动项 计划任务 服务 …

分享5款小而精的实用软件

分享是一种神奇的东西,它使快乐增大,它使悲伤减小。分享好用软件给大家的同时&#xff0c;我自己也能获得愉悦的心情。 1.鼠标点击特效——ClickShow ​ ClickShow是一款给鼠标点击加上特效的软件&#xff0c;可以让用户在点击鼠标时显示一层波纹特效&#xff0c;左键&#x…

ArcGIS中如何为跨带数据投影?

北京54、西安80高斯克吕格投影是我国常用的投影坐标系统,它们是一种分带投影方式,有3和6分带,不适合大范围内的投影使用。但是如果有份数据范围较大,跨越了多个度带,该选择哪个坐标系统进行投影转换呢? 在大范围内,常用的坐标系统有Albers等面积投影和Lambert等角投影,…

【C++面向对象】9. 重载

文章目录 【 1. 函数重载 】【 2. 运算符重载 】2.1 可重载运算符 / 不可重载运算符2.2 一元 运算符重载2.3 二元 运算符重载2.4 关系 运算符重载2.5 输入/输出 运算符重载2.6 和-- 运算符重载2.7 赋值 运算符重载2.8 函数调用() 运算符重载2.9 下标[ ] 运算符重载2.10 类成员访…

众和策略可靠吗?股权除息是好是坏?

可靠 股权除息&#xff0c;指的是公司在股息发放前&#xff0c;将公司股票分拆&#xff0c;以减少股东持有的股份&#xff0c;添加每股的股息金额。简略来说&#xff0c;就是将股份拆成更小的比例&#xff0c;每股股息也随之添加。 股权除息关于股东来说&#xff0c;好坏参半…