通讯录(C语言版)(静态通讯录)

✨欢迎来到脑子不好的小菜鸟的文章✨

      🎈创作不易,麻烦点点赞哦🎈

          所属专栏:项目

          我的主页:脑子不好的小菜鸟

          文章特点:关键点和步骤讲解放在

          代码相应位置

 引言:

1.菜单

通讯录也如同游戏,需要菜单来供使用者选择,因此要用do...while...(第一次看我文章的小伙伴可以看看我这两篇文章啦:1.扫雷游戏(有讲解)-CSDN博客        2.猜数字游戏(C语言实现)-CSDN博客)

2.功能总结

通讯录有很多功能,因此我们在做出它之前总结一下他的功能

1.添加联系人

2.删除联系人

3.查看联系人

4.查找联系人

5.排序联系人

(根据自己的需要,可以是电话号码从小到大,也可以是名字从小到大)

6.修改联系人

0.退出

(退出是退出循环,所以设为0合适)

文件准备:

与游戏一样,通常需要三个文件:

1.contact.h

包含函数的声明和某些重要量的定义,这些量定义在头文件中方便源文件的使用,也方便代码的统一修改,使之灵活(用define来说明,如:扫雷中的行和列(row和col))

2.contact.c

包含重要的函数实现部分

3.test.c

包含菜单和某些变量的定义(如:扫雷中的棋盘)

开始制作

1.菜单

还是熟悉的do...while...啦

//菜单
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;//重要变量
	char name[NAME_MAX] = { 0 };
    //变量创建
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

2.contact.h函数的实现

头文件中为函数类型的声明

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

3.contact.c函数的实现

初始化部分:

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

这里运用了memset函数,具体函数如图所示:

由图可知,需要包含头文件<string.h> ,

void* dest:要被初始化的地址(通常为数组名);

int c:用于初始化的数(该题初始化为0);

size_t count:被初始化的元素个数

注意:!!!!!!!

memset函数是以字节来赋值的,所以count部分都是用sizeof(...)来表示,()内为要被初始化的数组名

Add部分:

void Add(Contact* con)
{
	assert(con);
    //避免空指针,断言,记得包含头文件:<assert.h>

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	/*年龄不是数组,要取地址*/
	con->count++;
    /*记得++*/
}

Sort部分:

运用了qsort函数,具体可参考该文章:qsort函数的使用和模拟实现排序-CSDN博客

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
                /*比较的是字符串,要运用strcmp函数,记得头文件:<string.h>*/
                /*强制转换为结构体类型*/

   // return ((PeoInfo*)e1)->tele - ((PeoInfo*)e2)->tele);
    /*按照号码排序*/
}

void Sort(Contact* con)
{
	assert(con);

	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/

}

Show部分:

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

剩下的部分都要运用到查找部分,我将查找部分写为了FindPeo函数

FindPeo部分:

int FindPeo(Contact* con,char name[])
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)//如果名字相同,则返回下标
			return i;			
	}
	return -1;//未找到,返回-1
}

Del部分:

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

Search部分:

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

Modify部分:

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

		printf("更改成功\n");
	}
}

好的,现在只需在test.c部分运用一些语句修饰就可以啦!

4.test.c函数的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

总结:

contact.h:

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

#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30

#define MAX 100


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char address[ADDRESS_MAX];	
	int age;
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int count;
}Contact;

void InitContact(Contact* con);

void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);

contact.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void InitContact(Contact* con)
{
	con->count = 0;
	memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}

void Add(Contact* con)
{
	assert(con);

	printf("请输入联系人名字:\n");
	scanf("%s", con->data[con->count].name);

	printf("请输入联系人性别:\n");
	scanf("%s", con->data[con->count].sex);

	printf("请输入联系人电话:\n");
	scanf("%s", con->data[con->count].tele);

	printf("请输入联系人地址:\n");
	scanf("%s", con->data[con->count].address);

	printf("请输入联系人年龄:\n");
	scanf("%d", &(con->data[con->count].age));
	//年龄不是数组,要取地址
	con->count++;
}

void Del(Contact* con)
{
	assert(con);

	char name[NAME_MAX];
	printf("请输入联系人名字:\n");
	scanf("%s", name);

	int j = FindPeo(con, name);
	if (FindPeo(con, name) != -1)
	{
		for (int i = j; i < con->count - 1; i++)
		{
			con->data[i] = con->data[i + 1];
		}
		con->count--;
		printf("删除成功\n");
	}
	else
		printf("未找到该联系人,删除失败\n");
}

int FindPeo(Contact* con,char name[])/*!!!!!!!是数组啊,不是字符啊!!!!!!*/
{
	assert(con);

	for (int i = 0; i < con->count; i++)
	{
		if (strcmp(name, con->data[i].name) == 0)
			return i;			
	}
	return -1;
}

void Search(Contact* con, char name[])
{
	int i=FindPeo(con, name);
	if(i==-1)
		printf("没有找到该联系人\n");
	else
	{
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
		printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
			con->data[i].sex,
			con->data[i].tele,
			con->data[i].address,
			con->data[i].age);
	}
}

void cmp(const void* e1, const void* e2)
{
	return 	(strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
}

void Sort(Contact* con)
{
	assert(con);

	//pai_xu_by_name(con);
	qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
									/*因为比较的是结构体*/
}

void Modify(Contact* con, char name[])
{
	assert(con);

	int i = FindPeo(con, name);
	if (FindPeo(con, name)==-1)
	{
		printf("未找到该联系人,更改失败\n");
	}
	else
	{
		printf("请输入联系人名字:\n");
		scanf("%s", con->data[i].name);

		printf("请输入联系人性别:\n");
		scanf("%s", con->data[i].sex);

		printf("请输入联系人电话:\n");
		scanf("%s", con->data[i].tele);

		printf("请输入联系人地址:\n");
		scanf("%s", con->data[i].address);

		printf("请输入联系人年龄:\n");
		scanf("%d", &(con->data[i].age));

		printf("更改成功\n");
	}
}

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

test.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

										/*静态通讯录*/
void menu()
{
	//添加,删除,显示,查找,排序,修改,退出
	printf("***************************\n");
	printf("***1.Add	2.Del	***\n");
	printf("***3.Show	4.Search***\n");
	printf("***5.Sort	6.Modify***\n");
	printf("***0.exit		***\n");
	printf("***************************\n");
}

int main()
{
	int input;
	Contact con;
	char name[NAME_MAX] = { 0 };

	/*记得初始化啊!!!!!!!!!!*/
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				printf("添加联系人\n");
				Add(&con);
				break;
			case 2:
				printf("删除联系人\n");
				Del(&con);
				break;
			case 3:
				printf("显示联系人\n");
				Show(&con);
				break;
			case 4:
				printf("查找联系人\n");
				printf("请输入查找人的姓名:\n");
				scanf("%s", name);
				Search(&con, name);
				break;
			case 5:
				printf("排序\n");
				Sort(&con);
				printf("排序成功\n");
				break;
			case 6:
				printf("修改联系人\n");
				printf("请输入修改人的姓名:\n");
				scanf("%s", name);
				Modify(&con,name);
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	}while (input);
	return 0;
}

恭喜你啦,今天又进步了一点点~

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

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

相关文章

pyspark 笔记:窗口函数window

窗口函数相关的概念和基本规范可以见&#xff1a;pyspark笔记&#xff1a;over-CSDN博客 1 创建Pyspark dataFrame from pyspark.sql.window import Window import pyspark.sql.functions as F employee_salary [("Ali", "Sales", 8000),("Bob&qu…

JFlash工具将多个Bin文件或hex文件合并成一个(app+bootloader)

开发过程中&#xff0c;会遇到需要将多个bin文件合并成一个bin文件&#xff0c;尤其是需要将bootloader文件和App文件合并成一个文件。 1.使用version6.8下载地址&#xff1a;https://www.segger.com/downloads/jlink/ 2.芯片运行的起始地址:J-Flash工具可以根据选择的芯片类型…

el-date-picker默认结束为当前时分秒

在element ui中的日期时间选择组件中默认是00:00,现在需求是点击默认结束时间为当前时分秒&#xff0c;查了很多资料写的都不准确 需求&#xff1a;实现日期时间组件可选择当前日期&#xff0c;比如当前是2024年01月17号下午17&#xff1a;21 那选中时必须结束时间为17&#x…

JQuery 操作Class滚动轮播展示效果

JQuery 操作Class滚动轮播展示效果 展示效果&#xff1a; 1.html <div class"list"><div class"item"><div class"icon"></div><div class"content">第一行xxxxxxxxx</div></div><div …

图解第五代英特尔至强可扩展处理器

四年五节点&#xff0c;一年出两代。在年初推出代号Sapphire Rapids&#xff08;蓝宝石激流&#xff0c;SPR&#xff09;的第四代英特尔至强可扩展处理器之后&#xff0c;仅隔11个月&#xff0c;代号Emerald Rapids&#xff08;绿宝石激流&#xff0c;EMR&#xff09;的第五代英…

uniapp写微信小程序实现电子签名

写电子签名一定要注意的是一切全部按照手机上的适配来&#xff0c;为啥这么说呢&#xff0c;因为你在微信开发者工具中调试的时候认为是好的&#xff0c;正常的非常nice,当你发布版本的时候你会发现问题出来了。我下边的写法你可以直接用很简单。就是要记住canvas的几个属性和用…

CSC8021_computer network_The Application Layer

The Role of the Application layer The Application layer is the interface between the network and its users › It contains network services (e.g. DNS) › It contains user applications (e.g. email, web browsing&#xff09; Domain Name System (DNS) › The …

51单片机_智能家居终端

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统&#xff1f;51单片机的芯片是否具有与WiFi通信的能力&#xff1f;如果有的话&#xff0c;具体有哪些芯片啊&a…

安泰高压放大器设计的意义及其应用价值

高压放大器的设计是电子工程领域中的重要课题。其意义在于提供强大的放大能力&#xff0c;将高电压信号放大到所需的输出水平。高压放大器在多个领域具有广泛应用&#xff0c;包括科学研究、医疗设备、工业驱动和能量传输等。下面安泰电子将带来高压放大器设计的意义和其所带来…

豆瓣酱生产加工污水处理需要哪些工艺设备

酱生产加工工程中&#xff0c;污水处理是一个至关重要的环节。豆瓣酱作为一种传统的食品调料&#xff0c;由于其酱豆和辅料的混合&#xff0c;往往会产生大量的污水。为了实现环境友好型生产&#xff0c;保护我们的大自然&#xff0c;豆瓣酱生产厂家需要采用一些科学先进的工艺…

SpringBoot 2.x 正式停更了。Java 8 由 Solon 接收!

最近有好多个新闻说&#xff1a;SpringBoot 2.x 正式停更了&#xff0c;Java 8 怎么办&#xff1f;当然用 Solon 喽&#xff01; Solon&#xff0c;同时支持 jdk8, jdk11, jdk17, jdk21。也支持 graalvm native image。既支持 java8&#xff0c;也支持 java21 的&#xff1a; …

基于springboot+vue的网上订餐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;NEOAPI SDK联合OpenCV进行图…

centos7 arm服务器编译升级安装动态库libstdc++.so.6,解决GLIBC和CXXABI版本低的问题

前言 由于centos7内置的libstdc.so.6版本太低&#xff0c;导致安装第三方包的时候&#xff0c;会报“CXXABI_1.3.8”不存在等问题。 自带的打印如下&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBC strings /usr/lib64/libstdc.so.6 | grep CXXABI 如图 升级 注…

数据结构之串

数据结构之串 1、串的定义及基本运算2、串的存储结构3、串的模式匹配 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;以便…

16bit半精度浮点加乘法(用于结果验证)-图形测试小程序(python)

测试&#xff1a; 代码如下&#xff1a; import tkinter as tk import struct from tkinter import Entry, Button, Labeldef float_to_binary_16(value):# 将浮点数转换为16位二进制表示binary_representation struct.pack(!e, value)binary_string .join(f{byte:08b} for…

Ubuntu20.4 Mono C# gtk 编程习练笔记(二)

界面设计习练后&#xff0c;下面写一些程序设计心得。 程序结构 先看一下程序总体结构&#xff0c;先在program.cs中找到main入口&#xff0c;在命名空间下是MainClass类&#xff0c;Main函数进入后首先建立应用程序环境 Application.Init&#xff0c;然后对MainWindow进行实…

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

【性能调优】local模式下flink处理离线任务能力分析

文章目录 一. flink的内存管理1.Jobmanager的内存模型2.TaskManager的内存模型2.1. 模型说明2.2. 通讯、数据传输方面2.3. 框架、任务堆外内存2.4. 托管内存 3.任务分析 二. 单个节点的带宽瓶颈1. 带宽相关理论2. 使用speedtest-cli 测试带宽3. 任务分析3. 其他工具使用介绍 本…