C语言结构体应用-通讯录

2023-11-14

总体介绍

本文主要介绍一个结构体的应用,我们来写一个通讯录。

总体结构:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("***1.add*****2.del*********\n");
	printf("***3.search**4.revise******\n");
	printf("***5.show****6.clear*******\n");
	printf("***7.sort****0.exit********\n");
}
int main()
{
	struct Contact con;
	Initcontact(&con);
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:Add(&con);
			break;
		case 2:Del(&con);
			break;
		case 3:Search(&con);
			break;
		case 4:Revise(&con);
			break;
		case 5:Show(&con);
			break;
		case 6:Clear(&con);
			break;
		case 7:Sort(&con);
			break;
		case 0:printf("退出通讯录\n");
			break;
		default:printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);
}

首先我们先打印一个菜单,来显示我们通讯录的各项功能,根据想用的功能来选相应得数字。

这是一种,是用switch语句来来实现各个功能函数的调用。

由于各个功能函数的参数与返回值都相同,所以我们可以将他们放到一个函数指针数组当中,这样代码看起来更整洁。

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("***1.add*****2.del*********\n");
	printf("***3.search**4.revise******\n");
	printf("***5.show****6.clear*******\n");
	printf("***7.sort****0.exit********\n");
}
int main()
{
	struct Contact con;
	Initcontact(&con);
	int input = 0;
	void(*pp[8])(struct Contact* pc) = { 0,Add ,Del ,Search ,Revise,Show,Clear ,Sort };
	
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input >= 0 && input <= 8)
		{
			if (input == 0)
				break;
			pp[input](&con);
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (input);
}

一,数据的定义及数据初始化

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct ConInfo
{
	char name[20];
	char sex[6];
	int age;
	char telphone[12];
	char addre[30];
};
struct Contact
{
	struct ConInfo data[1000];
	int sz;
};
void Initcontact(struct Contact* pc);
void Add(struct Contact* pc);
void Show(struct Contact* pc);
void Search(struct Contact* pc);
void Del(struct Contact* pc);
void Revise(struct Contact* pc);
void Clear(struct Contact* pc);
void Sort(const struct Contact* pc);

上面这是contact.h的头文件

void Initcontact(struct Contact* pc)
{
	assert(pc);
	memset(pc->data, '\0', sizeof(pc->data));
	pc->sz = 0;
}

这是初始化数据的函数,我们在使用通讯录之前确保里面的数据都是空的。

这里用memset函数直接将这么多字节的内容都初始化为0;
在这里插入图片描述
这是初始化之前。
在这里插入图片描述
这是初始化之后,可以看到,每个字符串都是空字符串,int型数据里放的也是0.

二,增加联系人

//增加通讯录的联系人
void Add(struct Contact* pc)
{
	printf("姓名:>");
	scanf("%s", (pc->data)[pc->sz].name);
	printf("性别:>");
	scanf("%s", (pc->data)[pc->sz].sex);
	printf("年龄:>");
	scanf("%d", &((pc->data)[pc->sz].age));
	printf("电话:>");
	scanf("%s", (pc->data)[pc->sz].telphone);
	printf("住址:>");
	scanf("%s", (pc->data)[pc->sz].addre);
	pc->sz++;
}

在这里插入图片描述

三,删除联系人

static int Find(const struct Contact* pc, char* _name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(_name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除联系人
void Del(struct Contact* pc)
{
	char name1[20];
	printf("请输入要删除联系人的姓名:>");
	scanf("%s", name1);
	int ret = Find(pc, name1);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		memmove((pc->data + ret), (pc->data + ret + 1),
			sizeof(struct ConInfo) * (pc->sz - 1 - ret));
		pc->sz--;
		printf("成功删除联系人\n");
	}
}

在这里插入图片描述

在这里插入图片描述

四,修改某个联系人

//修改指定联系人信息
void Revise(struct Contact* pc)
{
	char name2[20];
	printf("请输入要修改的联系人姓名:>");
	scanf("%s", name2);
	int ret = Find(pc, name2);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		printf("姓名:>");
		scanf("%s", (pc->data)[ret].name);
		printf("性别:>");
		scanf("%s", (pc->data)[ret].sex);
		printf("年龄:>");
		scanf("%d", &((pc->data)[ret].age));
		printf("电话:>");
		scanf("%s", (pc->data)[ret].telphone);
		printf("住址:>");
		scanf("%s", (pc->data)[ret].addre);
		printf("修改成功\n");
	}
}

例如我们修改lisi的年龄。
在这里插入图片描述

五,显示所有联系人

//显示所有联系人的信息
void Show(const struct Contact* pc)
{
	int i = 0;
	printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
		"姓名", "性别", "年龄", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
			pc->data[i].name, pc->data[i].sex, pc->data[i].age
			, pc->data[i].telphone, pc->data[i].addre);

	}
}

我们在展示上述功能的时候其实都已经运用了此功能。

在这里插入图片描述

六,删除所有联系人

//清空通讯录
void Clear(struct Contact* pc)
{
	memset(pc->data, '\0', sizeof(pc->data));
	pc->sz = 0;
}

删除所有联系人,实际就是重新初始化一遍。

七,按名字首字母排序联系人

//按姓氏排序联系人
int cmp_name(const void* s1, const void* s2)
{
	return strcmp(((struct ConInfo*)s1)->name, ((struct ConInfo*)s2)->name);
}
void Sort(const struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct ConInfo), cmp_name);
	Show(pc);
}

在这里插入图片描述
在这里插入图片描述

八,查找联系人

//查找联系人
void Search(struct Contact* pc)
{
	char _name[20];
	printf("请输入联系人的姓名:>");
	scanf("%s", _name);
	int ret = Find(pc, _name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
			"姓名", "性别", "年龄", "电话", "住址");
		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
			pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age
			, pc->data[ret].telphone, pc->data[ret].addre);
	}
}

在这里插入图片描述

九,代码展示

contact.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct ConInfo
{
	char name[20];
	char sex[6];
	int age;
	char telphone[12];
	char addre[30];
};
struct Contact
{
	struct ConInfo data[1000];
	int sz;
};
void Initcontact(struct Contact* pc);
void Add(struct Contact* pc);
void Show(struct Contact* pc);
void Search(struct Contact* pc);
void Del(struct Contact* pc);
void Revise(struct Contact* pc);
void Clear(struct Contact* pc);
void Sort(const struct Contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化通讯录
void Initcontact(struct Contact* pc)
{
	assert(pc);
	memset(pc->data, '\0', sizeof(pc->data));
	pc->sz = 0;
}
//增加通讯录的联系人
void Add(struct Contact* pc)
{
	printf("姓名:>");
	scanf("%s", (pc->data)[pc->sz].name);
	printf("性别:>");
	scanf("%s", (pc->data)[pc->sz].sex);
	printf("年龄:>");
	scanf("%d", &((pc->data)[pc->sz].age));
	printf("电话:>");
	scanf("%s", (pc->data)[pc->sz].telphone);
	printf("住址:>");
	scanf("%s", (pc->data)[pc->sz].addre);
	pc->sz++;
}
//显示所有联系人的信息
void Show(const struct Contact* pc)
{
	int i = 0;
	printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
		"姓名", "性别", "年龄", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
			pc->data[i].name, pc->data[i].sex, pc->data[i].age
			, pc->data[i].telphone, pc->data[i].addre);

	}
}
static int Find(const struct Contact* pc, char* _name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(_name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//查找联系人
void Search(struct Contact* pc)
{
	char _name[20];
	printf("请输入联系人的姓名:>");
	scanf("%s", _name);
	int ret = Find(pc, _name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		printf(" % -20s\t % -6s\t % -5s\t % -12s\t % -30s\n",
			"姓名", "性别", "年龄", "电话", "住址");
		printf(" % -20s\t % -6s\t % -5d\t % -12s\t % -30s\n",
			pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age
			, pc->data[ret].telphone, pc->data[ret].addre);
	}
}
//删除联系人
void Del(struct Contact* pc)
{
	char name1[20];
	printf("请输入要删除联系人的姓名:>");
	scanf("%s", name1);
	int ret = Find(pc, name1);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		memmove((pc->data + ret), (pc->data + ret + 1),
			sizeof(struct ConInfo) * (pc->sz - 1 - ret));
		pc->sz--;
		printf("成功删除联系人\n");
	}
}
//修改指定联系人信息
void Revise(struct Contact* pc)
{
	char name2[20];
	printf("请输入要修改的联系人姓名:>");
	scanf("%s", name2);
	int ret = Find(pc, name2);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
	}
	else
	{
		printf("姓名:>");
		scanf("%s", (pc->data)[ret].name);
		printf("性别:>");
		scanf("%s", (pc->data)[ret].sex);
		printf("年龄:>");
		scanf("%d", &((pc->data)[ret].age));
		printf("电话:>");
		scanf("%s", (pc->data)[ret].telphone);
		printf("住址:>");
		scanf("%s", (pc->data)[ret].addre);
		printf("修改成功\n");
	}
}
//清空通讯录
void Clear(struct Contact* pc)
{
	memset(pc->data, '\0', sizeof(pc->data));
	pc->sz = 0;
}
//按姓氏排序联系人
int cmp_name(const void* s1, const void* s2)
{
	return strcmp(((struct ConInfo*)s1)->name, ((struct ConInfo*)s2)->name);
}
void Sort(const struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct ConInfo), cmp_name);
	Show(pc);
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("***1.add*****2.del*********\n");
	printf("***3.search**4.revise******\n");
	printf("***5.show****6.clear*******\n");
	printf("***7.sort****0.exit********\n");
}
int main()
{
	struct Contact con;
	Initcontact(&con);
	int input = 0;
	void(*pp[8])(struct Contact* pc) = { 0,Add ,Del ,Search ,Revise,Show,Clear ,Sort };
	
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input >= 0&& input <= 8)
		{
			if (input == 0)
				break;
			pp[input](&con);
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (input);
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言结构体应用-通讯录 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐