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

目录

实现思路

开始实现

添加增加联系人功能

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

添加删除联系人功能

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

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

测试

代码

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,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5SORT//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.mzph.cn/news/122537.shtml

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

相关文章

音视频常见问题(六):视频黑边或放大

摘要 本文介绍了视频黑边或放大的原因和解决方案。主要原因包括视频分辨率与显示视图尺寸不一致、摄像头采集、美颜滤镜格式兼容和分辨率。为了解决这些问题&#xff0c;开发者可以选择合适的渲染模式、动态调整分辨率、处理视频旋转和使用自定义视频渲染。 即构音视频SDK提供…

每日一道算法题:26. 删除有序数组中的重复项

难度 简单 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为…

Winform 多语言化快速解析替换工具-1分钟一个界面

随着业务的扩展&#xff0c;有的软件有多语言化的需求。那么如果软件已经很多写死的文字内容如何快速进行语言化替换呢&#xff0c;一个一个去改工作量太大。 于是开发了个小工具用来替换现有内容并生成语音包&#xff0c;原理就是采用正则表达式进行匹配控件关键字以及中文进…

基础数据类型和引用数据类型区别?

基础数据类型和引用数据类型的区别如下&#xff1a; 存储上的区别&#xff1a;基础数据类型是存放在栈中的简单数据段&#xff1b;引用数据类型是存放在堆内存中的对象&#xff0c;在栈内存中存放的是堆内存中具体内容的引用地址&#xff0c;通过这个地址可以快速查找到对象。…

AS/400简介

AS400 AS400 简介AS/400操作系统演示 AS400 简介 在 AS400 中&#xff0c;AS代表“应用系统”。它是多用户、多任务和非常安全的系统&#xff0c;因此用于需要同时存储和处理敏感数据的行业。它最适合中级行业&#xff0c;因此用于制药行业、银行、商场、医院管理、制造业、分销…

基于长短期神经网络的可上调容量PUP预测,基于长短期神经网络的可下调容量PDO预测,LSTM可调容量预测

目录 背影 摘要 代码和数据下载:基于长短期神经网络的可上调容量PUP预测,基于长短期神经网络的可下调容量PDO预测,LSTM可调容量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88230834 LSTM的基本定义 LSTM实现的步骤 基于长短…

使用FastAPI部署Ultralytics YOLOv5模型

YOLO是You Only Look Once(你只看一次)的缩写&#xff0c;它具有识别图像中的物体的非凡能力&#xff0c;在日常应用中会经常被使用。所以在本文中&#xff0c;我们将介绍如何使用FastAPI的集成YOLOv5&#xff0c;这样我们可以将YOLOv5做为API对外提供服务。 Python有几个web框…

CGAL+QT

先安装CGAL和QT 安装完QT其中MSVC 这两个没配置 1、x32配置选择的是 x64配置选择的是 2、CGAL 5.4.5 - Manual: Using CGAL on Windows (with Visual C) 参数文章配置一些环境变量 3、 测试 新建build 进行cmake QT、Boost、CGAL都自动匹配上了&#xff08;环境变量已经配…

FastAPI框架学习笔记(快速入门FastAPI框架)

1. 写在前面 今天整理一篇后端框架的笔记&#xff0c; fastapi框架是比较主流的后端异步web框架&#xff0c;关键是python语言可以写&#xff0c;正好公司最近安排了一些后端服务的活&#xff0c; 所以就看了一个fastapi框架的入门课程(链接在底部)&#xff0c;完成任务&#…

lua-web-utils和proxy设置示例

以下是一个使用lua-web-utils和proxy的下载器程序&#xff1a; -- 首先安装lua-web-utils库 local lwu require "lwu" ​ -- 获取服务器 local function get_proxy()local proxy_url "duoipget_proxy"local resp, code, headers, err lwu.fetch(proxy_…

图像识别在自动驾驶汽车中的决策规划与控制策略研究。

图像识别在自动驾驶汽车中的决策规划与控制策略研究 随着自动驾驶技术的不断发展&#xff0c;图像识别已经成为实现自动驾驶的关键技术之一。在自动驾驶汽车中&#xff0c;图像识别技术主要用于环境感知、决策规划和控制系统。本文将重点探讨图像识别在自动驾驶汽车中的决策规…

Mysql底层执行过程及基于PK的“数据跳跃”

Mysql底层执行过程 当MySQL收到一个查询&#xff0c;特别是像 WHERE id ? 这样的基于主键的查询时&#xff0c;它可以高效地找到所需的数据。以下是基于InnoDB存储引擎&#xff08;MySQL的默认存储引擎&#xff09;进行查询的底层过程&#xff1a; 解析查询: MySQL首先会解析…

后端实现大文件分片上传

项目框架 net6 webapi 放开上传大小限制 放开代码 | 框架层限制 在 Program.cs 文件中添加如下代码 不然会出现下面的限制错误 From表单限制&#xff1a;Failed to read the request form. Multipart body length limit 134217728 exceeded 请求体超长&#xff1a;Request bo…

pytorch:Model模块专题

一、说明 关于pytorch使用中&#xff0c;模块扮演重要校色&#xff0c;大部分功能不能密集展现&#xff0c;因此&#xff0c;我们这个文章中&#xff0c;将模块的种种功能详细演示一遍。 二、模块 PyTorch使用模块来表示神经网络。模块包括&#xff1a; 有状态计算的构建块。…

Win10中Pro/E鼠标滚轮不能缩放该怎么办?

Pro/E安装好后&#xff0c;鼠标滚轮不能缩放模型&#xff0c;该怎么办&#xff1f;问题多发生在win8/win10上&#xff0c;新装了PROE&#xff0c;发现滑动鼠标中键不能放大缩小。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件系统…

【PyQt】调整子控件的层级以调整绘制的先后顺序

简述 qt中貌似没有直接设置z序的函数&#xff0c;但对应的有其他调整z序的方法&#xff1a; QWidget.raise_()&#xff1a;置顶 QWidget.lower()&#xff1a;置底 QWidget.stackUnder(wid)&#xff1a;置于指定控件之下 其中关键函数是QWidget.stackUnder(wid)&#xff0c;利…

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块

首先了解涉及的新词汇&#xff0c;编程外国人发明的&#xff0c;所以大部分是和他们语言相关&#xff0c;了解对应意思&#xff0c;可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口&#xff0c;进口商品&#xff1b;输入&#xff0c;引进&#xff1b;重要性&#xff1b;…

【Unity】3D跑酷游戏

展示 finish_all * 方块跑酷 1.教程链接 翻墙&#xff1a;https://www.youtube.com/watch?v9ZEu_I-ido4&listPLPV2KyIb3jR53Jce9hP7G5xC4O9AgnOuL&index3 2.基础制作 最终成果 2.1 基本场景 1.创建Cube作为跑道 1&#xff09;记得把位置Reset&#xff1b; 2&#…

Linux部署Redis Cluster高可用集群(附带集群节点添加删除以及槽位分配操作详解)

目录 一、前言二、下载安装Redis2.1、选择需要安装的Redis版本2.2、下载并解压Redis2.3、编译安装Redis 三、部署Redis Cluster高可用集群3.1、准备配置文件3.2、启动Redis服务3.3、创建Redis集群3.4、查看集群关系3.5、连接集群Redis进行数据读写以及重定向测试3.6、故障转移和…

使用Scala和Sttp库编写爬虫程序

以下是一个使用Scala和Sttp库编写的视频爬虫程序&#xff0c;该程序使用了proxy来获取IP。请注意&#xff0c;这个示例需要在上找到一个具体的视频链接&#xff0c;然后将其传递给crawlVideo函数。 import scala.util.{Failure, Success} import scala.concurrent.{Future, Ex…