admin管理员组

文章数量:1794759

通讯录的实现

思路

思路:通讯录: 1、人的信息:姓名+年龄+性别+地址+电话 2、通讯录中可以存放100个人的信息 3:功能: 1》增加联系人 2》删除指定联系人 3》查找指定联系人的信息 4》修改指定联系人的信息 5》显示所有联系人的信息 6》排序(用年龄,名字都行)

1、用到的头文件

代码语言:javascript代码运行次数:0运行复制
#include<string.h>//memmove、memset的头文件
#include<stdio.h> 
#include<stdlib.h>//qsort的头文件 

2、声明

代码语言:javascript代码运行次数:0运行复制
//人的信息
#define MAX 100
#define NAME_MAX 20
#define NAME_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

3、结构体的创建

代码语言:javascript代码运行次数:0运行复制
人信息的结构体
typedef struct PeoInfo
{
	char name[NAME_MAX];//名字
	int age;            //年龄
	char sex[NAME_MAX]; //性别
	char addr[ADDR_MAX];//地址
	char tele[TELE_MAX];//电话
}PeoInfo;

通讯录结构体
typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息
	int sz;//当前已经放的人的信息的个数
}Contact;
知识点:typedef:重命名

4、先写一个菜单函数

代码语言:javascript代码运行次数:0运行复制
void menu()
{
	printf("***********************************");
	printf("******   1.add       2del     *****");//2删除
	printf("******   3.search    4.modify *****");//3查找
	printf("******   5.show      6.sort   *****");//4修改
	printf("******   0.exit               *****");//5显示
    printf("***********************************");//6排序
	printf("***********************************");
}

5、创建通讯录

代码语言:javascript代码运行次数:0运行复制
Contact con;

6、初始化通讯录

代码语言:javascript代码运行次数:0运行复制
	//初始化通讯录
	InitContact(&con);

初始化函数

代码语言:javascript代码运行次数:0运行复制
​
void InitContact(Contact* pc)//初始化
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。
}

7、用do-while循环

main函数中代码

代码语言:javascript代码运行次数:0运行复制
int main()
{
	
	//创建通讯录
	Contact con;//也可直接在这里等于0,就是不够灵活
	//初始化通讯录
	InitContact(&con);
	int input = 0;
	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);//除了0外都是为真继续循环
	return 0;
}

8、增加联系人

函数代码

代码语言:javascript代码运行次数:0运行复制
//添加
void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;//void可以有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].addr);

	printf("请输入电话:>>");
	scanf("%s", pc->data[pc->sz].tele);

	(pc->sz)++;//每存入一个就++一个
}

9、删除指定联系人

函数代码

代码语言:javascript代码运行次数:0运行复制
/删除指定联系人
void DelContact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
	}
	//删除
	//找到要删除的人
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int ret = FindByName(pc, name);//通过名字查找,返回的用ret存下来
	//找不到返回-1
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;//没有要删除的人直接返回就好
	}
	//删除
	//删除后,要把后面的数据前移一位,把删除的覆盖掉
	//法一可以一个一个移动
	// 法二也可以用memove
	for (int j = ret; j < pc->sz - 1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;//删除后,人数减去一
	printf("删除成功\n");
}

10、查找指定联系人的信息,并打印

函数代码

代码语言:javascript代码运行次数:0运行复制
//查找指定联系人
void SearchContact(const Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入想查找人的名字\n");
	scanf("%s", name);
	int ret = FindByName(pc, name);//用ret来接受是否找到,没找到还是-1
	if (-1 == ret)
	{
		printf("要查找的人不存在\n");
		return;//没有要查找的人直接返回就好
	}

	//找到
	//打印信息
	printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",
		pc->data[ret].name,
		pc->data[ret].age,
		pc->data[ret].sex,
		pc->data[ret].addr,
		pc->data[ret].tele);
}

11、修改指定联系人的信息 函数代码

代码语言:javascript代码运行次数:0运行复制
//修改指定联系人
void ModifyContact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入想修改人的名字\n");
	scanf("%s", name);
	int ret = FindByName(pc, name);//用ret来接受是否找到,没找到还是-1
	if (-1 == ret)
	{
		printf("要修改的人不存在\n");
		return;//没有要查找的人直接返回就好
	}
	//找到修改的人了
	//修改
	//就是再ret这个位置处的人重新录入这个人的信息
	printf("请输入名字:>>");//不用换行
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:>>");
	scanf("%d", &pc->data[ret].age);
	printf("请输入性别:>>");
	scanf("%s", pc->data[ret].sex);
	printf("请输入地址:>>");
	scanf("%s", pc->data[ret].addr);
	printf("请输入电话:>>");
	scanf("%s", pc->data[ret].tele);
	printf("修改完成\n");
	//修改人信息不会改变个数
}

12、显示所有联系人的信息

函数代码

知识点:-加数字左对齐
代码语言:javascript代码运行次数:0运行复制
//show,打印出来
void ShowContact(const Contact* pc)
{
	int i = 0;
	printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		//左对齐
		printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

13、排序(用年龄,名字都行),用年龄举例,sqort用法有说过

函数代码

代码语言:javascript代码运行次数:0运行复制
//排序并打印,以年龄为例子
int cmp_stu_by_age(const void* e1, const void* e2)
{      //强转为结构体指针
	return  ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;

要排序的数组是data,data里边儿的每一个数据元素是PeoInfo,
然后,要把它强转成PeoInfo的一个类型,然后去访问它的一个age进行比较了。

}

//排序并打印
void SortContact(Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_stu_by_age);
	int i = 0;
	printf("%-10s\t%-4s\t%-10s\t%-15s\t%-15s\n", "名字", "年龄", "性别", "地址", "电话");
	for (i = 0; i < pc->sz; i++)
	{
		//左对齐
		printf("%-10s\t%-4d\t%-10s\t%-15s\t%-15s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-17,如有侵权请联系 cloudcommunity@tencent 删除data函数排序数据数组

本文标签: 通讯录的实现