C语言:通讯录(纯代码)

目录

背景:VS2019编译器

创建文件:

contact.h代码:

test.c代码:

contact.c代码:


背景:VS2019编译器

创建文件:

contact.h代码:

#pragma once

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

//类型声明
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
	char addr[30];
}PeoInfo;

//通讯录
typedef struct Contact
{
	PeoInfo data[100];//存放人的信息
	int count;		//记录当前通讯录中实际存储人的信息个数。
}Contact;


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

//增加通讯录信息
void AddContact(Contact* pc);

//显示通讯录信息
void ShowContact(Contact* pc);

//删除通讯录信息
void DelContact(Contact* pc);

//查找通讯录信息
void SearchContact(Contact* pc);

//修改通讯录信息
void ModifyContact(Contact* pc);

//排序通讯录信息
void SortContact(Contact* pc);

test.c代码:

#define _CRT_SECURE_NO_WARNINGS
//实现通讯录
//测试文件
#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");
}
int main()
{
	int input = 0;
	Contact con;		//通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:		//增加
			AddContact(&con);
			break;
		case 2:		//删除
			DelContact(&con);
			break;
		case 3:		//查找
			SearchContact(&con);
			break;	
		case 4:		//修改
			ModifyContact(&con);
			break;
		case 5:		//显示
			ShowContact(&con);
			break;
		case 6:		//排序
			SortContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}
	} while(input);

	return 0;
}

contact.c代码:

#define _CRT_SECURE_NO_WARNINGS
//通讯录模块文件
#include "contact.h"

#define MAX 100

void InitContact(Contact* pc)
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}


void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->count == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("增加成功\n");
}

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0;i < pc->count;i++)
	{
		printf("%-20s\t", pc->data[i].name);
		printf("%-5d\t", pc->data[i].age);
		printf("%-5s\t", pc->data[i].sex);
		printf("%-12s\t", pc->data[i].tele);
		printf("%-30s\n", pc->data[i].addr);
	}
}

static int FindName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0;i < pc->count;i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}

	return -1;
}

void DelContact(Contact* pc)
{
	assert(pc);
	printf("请输入要删除的人名:>");
	char name[20] = { 0 };
	scanf("%s", name);
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("要删除的信息不存在\n");
		return;
	}
	else
	{
		int i = 0;
		for (i = flag;i < pc->count - 1;i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->count--;
		printf("删除成功。\n");
	}

}

void SearchContact(Contact* pc)
{
	assert(pc);
	printf("请输入要查找人的名字:");
	char name[20] = { 0 };
	scanf("%s", name);
	//查找
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("找不到该信息。\n");
		return;
	}
	else
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n",pc->data[flag].name,pc->data[flag].age, pc->data[flag].sex, pc->data[flag].tele, pc->data[flag].addr);
	}
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	printf("请输入要修改的人名:");
	char name[20] = { 0 };
	scanf("%s", name);
	//查找
	int flag = FindName(pc, name);
	if (flag == -1)
	{
		printf("找不到该信息。\n");
		return;
	}
	else
	{
		printf("请输入修改后的名字:>");
		scanf("%s", pc->data[flag].name);
		printf("请输入修改后的年龄:>");
		scanf("%d", &pc->data[flag].age);
		printf("请输入修改后的性别:>");
		scanf("%s", pc->data[flag].sex);
		printf("请输入修改后的电话:>");
		scanf("%s", pc->data[flag].tele);
		printf("请输入修改后的地址:>");
		scanf("%s", pc->data[flag].addr);
		printf("修改成功\n");
	}
}

void SortContact(Contact* pc)
{
	assert(pc);
	//冒泡排序,按名字升序
	int i = 0;
	int j = 0;
	PeoInfo C = { 0 };
	for (i = 0;i < pc->count;i++)
	{
		for (j = 1;j < pc->count - i;j++)
		{
			if (strcmp(pc->data[j - 1].name, pc->data[j].name) > 0)
			{
				C = pc->data[j - 1];
				pc->data[j - 1] = pc->data[j];
				pc->data[j] = C;
			}
		}
	}
	printf("排序成功。");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GTH手册学习注解

CPLL的动态配置 终于看到有这个复位功能了 QPLL SWITCHing需要复位 器件级RESET没发现有管脚引出来 两种复位方式&#xff0c;对应全复位和器件级复位 对应的复位功能管脚 改那个2分频的寄存器说明段&#xff0c;复位是自动发生的&#xff1f;说明可能起效了&#xff0c;但是分…

STM32---通用定时器(二)相关实验

写在前面&#xff1a;前面我们学习了基本定时器、通用定时器的相关理论部分&#xff0c;了解到通用定时器的结构框图&#xff0c;总共包含六大模块&#xff1a;时钟源、控制器、时基单元、输入捕获、公共部分以及输出捕获。对相关模块的使用也做详细的讲解。本节我们主要是对上…

【NR 定位】3GPP NR Positioning 5G定位标准解读(八)- OTDOA定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

少儿编程 蓝桥杯青少组科技素养题 信息素养真题及解析第25套

少儿编程 科技素养 信息素养真题第25套 1、旅行结束之后&#xff0c;回到家的小蓝决定将照片备份在云端的网盘上。备份照片主要占用的是小蓝家的( )带宽 A、下行 B、上行 C、文件 D、数据 答案&#xff1a;B 考点分析&#xff1a;主要考查网络相关知识&#xff0c;要将照…

多种方法求解数组排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

基于GAN对抗网进行图像修复

一、简介 使用PyTorch实现的生成对抗网络&#xff08;GAN&#xff09;模型&#xff0c;包括编码器&#xff08;Encoder&#xff09;、解码器&#xff08;Decoder&#xff09;、生成器&#xff08;ResnetGenerator&#xff09;和判别器&#xff08;Discriminator&#xff09;。…

CSS中有哪些方式可以隐藏页面元素(区别详解)

文章目录 一、前言二、实现方式display:nonevisibility:hiddenopacity:0设置height、width属性为0position:absoluteclip-path小结 三、区别参考文献 一、前言 在平常的样式排版中&#xff0c;我们经常遇到将某个模块隐藏的场景 通过css隐藏元素的方法有很多种&#xff0c;它…

HttpURLConnection详解及使用

HttpURLConnection 请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowUserInteractionsetDefaultUseCaches 发送URL请求 建立实际连接之后&#xff0c;就是发送请求&#xff0c;把请求参数传到…

探讨系统测试的最佳实践与思维模式!

这是测试活动过程详解系列的最后一篇文章。之前的想法&#xff0c;是对测试过程各重要环节进行拆解&#xff0c;然后介绍这个环节重点要做的事情&#xff0c;为什么要做这些事&#xff0c;以及注意事项。 前面几篇文章分别介绍了单元测试、集成测试、回归测试阶段要解决的问题…

初识C语言—初识C语言

前言 C语言全面了解&#xff0c;全貌认识 细致的学习&#xff0c;细枝末节 什么是C语言 维基百科 C 语言是一种通用的高级语言&#xff0c;最初是由丹尼斯里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 …

【QT+QGIS跨平台编译】之七十六:【QGIS_Native+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、QGIS_Native介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、QGIS_Native介绍 QGIS_Native模块是QGIS软件的核心部分,提供了许多基本功能和核心组件,主要用于处理与底层操作系统的关系。 二、QGIS下载 QGIS网址: QGIS Source Download 三、文件分析…

苹果cms模板保护设置,防止被扒

苹果cms模板保护设置&#xff0c;防止被扒 如今互联网时代&#xff0c;网站模板前端被扒是常有的事&#xff0c;如何防止模板数据被扒&#xff1f; 保护设置方法&#xff1a; 登录宝塔 找到安装模板的网站 设置禁止访问文件 方法参考截图后缀填&#xff1a;php|html 目录填&a…

抽象的java发送邮箱2.0版本

优化了更多细节 SpringBoot3&#xff1a;前置框架 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframewo…

Linux系统架构----nginx上构建虚拟主机

Linux系统架构----nginx上构建虚拟主机 一、构建虚拟主机概述 利用虚拟主机&#xff0c;不用为每个运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程&#xff0c;虚拟主机提供了在同一台服务器、同一组Nginx进程上运行的多个网站的功能与Apache相同&#xff0c;N…

【OpenCV】如何在Linux操作系统下正确安装 OpenCV

前言 我是在虚拟机上跑的 Linux 5.8.0-44-generic。 配置如下&#xff1a; 目录 第一步&#xff1a;下载依赖文件 第二步&#xff1a;下载 opencv 和 opencv_contrib 源码 第三步&#xff1a;解压缩包 第四步&#xff1a;移动文件 第五步&#xff1a;生成 makefile 文件 …

深入理解 Webpack 热更新原理:提升开发效率的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

攻击技术:命令和控制服务器(C2)是什么意思

在攻击者使用的众多策略中&#xff0c;最阴险的策略之一是命令和控制服务器&#xff08;C2&#xff09;。通过这篇文章&#xff0c;我们想准确地解释它是什么。 这些服务器充当计算机黑客行动的大脑&#xff0c;协调受感染设备的操作并允许攻击者随意操纵它们。 在网络安全领…

智慧公厕系统的组成部分有什么?

智慧公厕系统是现代城市管理中一项重要的创新&#xff0c;利用物联网、互联网、大数据、云计算、自动化控制等先进的技术手段&#xff0c;提供高效便捷的公厕服务。从信息系统的角度来看&#xff0c;智慧公厕系统主要由硬件、软件和网络组成&#xff0c;硬件、软件和网络三大部…

首屏性能优化:提升用户体验的秘籍

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python图像处理:1.插值、频域变换与对比度增强

一、几何变换 7.图像的插值 (1)原理介绍 下面对比三种插值方法&#xff0c;分别是最近邻插值法、双线性插值法、卷积插值法&#xff0c;三种方法的前提和特点、优缺点、适用场景如下&#xff1a; 最近邻插值&#xff08;Nearest Neighbor Interpolation&#xff09;&#xf…