0
点赞
收藏
分享

微信扫一扫

C语言是实现简易版通讯录(无文件保存)

王栩的文字 2022-05-02 阅读 72
c语言

简易版通讯录(无文件保存)实现新建 删除 查找 修改 查看 排序六个功能,分三个文件(address.h\address.c\main.c)实现

思路:

一、创建通讯录结构体类型数组 创建联系人结构体类型变量(包含姓名等)


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

#define num 1000
#define num_name 20
#define num_sex 5
#define num_phone 12
#define num_addr 30

struct people//联系人类型
{
	char name[num_name];//姓名
	char sex[num_sex];//性别
	int age;//年龄
	char phone[num_phone];//电话号码
	char addr[num_addr];//住址
};

struct contact//通讯录类型
{
	struct people data[num];
	int size;//联系人总数
};

二、初始化通讯录数组

void initcon(struct contact *con)//初始化函数
{
	//用memset函数将通讯录联系人类型全部初始化为‘0’
	memset(con->data, 0, sizeof(con->data));
	con->size = 0;//设置通讯录一开始只有0个联系人
}

三、实现新增联系人

1、判断通讯录人数是否已满(这里上限为1000)

2、如果没满,则给通讯录类型中的联系人结构体中的每一项赋值

3、通讯录中联系人总数加1

void addcon(struct contact* con)//添加联系人
{
	//判断通讯录是否已满
	if (con->size == num)
		printf("通讯录已经满了,无法增加\n");
	else
	{
		//将结构体每一项赋值
		printf("请输入名字:");
		scanf("%s", con->data[con->size].name);

		printf("请输入电话:");
		scanf("%s", con->data[con->size].phone);

		printf("请输入年龄:");
		scanf("%d", &(con->data[con->size].age));

		printf("请输入性别:");
		scanf("%s", con->data[con->size].sex);

		printf("请输入地址:");
		scanf("%s", con->data[con->size].addr);

		con->size++;//通讯录人数加1
		printf("添加成功\n");
	}
	printf("\n");
}

四、实现查看联系人

1、判断通讯录中是否有联系人

2、如果有联系人则将每一个数组中的每一项打印

void showcon(const struct contact* con)//查看联系人
{
	if (con->size == 0)
		printf("通讯录没有联系人\n");
	else
	{
		int i = 0;
		//左对齐打印每一项数据
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (i = 0; i < con->size; i++)
		{
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				con->data[i].name,
				con->data[i].age,
				con->data[i].sex,
				con->data[i].phone,
				con->data[i].addr);

		}
	}
	printf("\n");
}

五、实现删除联系人

1、删除一个联系人首先得先找到这个联系人所在的数组下标(因为下面的查找、修改都需要用到这一步,所以我们通过一个固定的函数来实现这一步)

2、找到该联系人后怎么样删除,这里用的方法是利用该联系人后面的所有联系人都往前覆盖一位的做法,然后数组总体减1

3、如果没有找到该联系人,则打印输出告诉我们

通用实现查找下标的函数(只在address.c中用到,所以加了static修饰)(利用想用查找的名字和数组中每一个联系人结构体的名字进行比较,存在返回1,不存在返回-1即可)

static int findname(struct contact* con,char name[num_name])//查找联系人下标并返回功能
{
	int i = 0;
	for (i = 0; i < con->size; i++)
	{
		//寻找该联系人 并记录下标
		if (strcmp(con->data[i].name, name) == 0)
			return i;
	}
	//如果找不到联系人则返回-1
	return -1;
}

实现删除

void delcon(struct contact* con)//删除联系人
{
	char name[num_name];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con,name);
	//判断是否找到这个联系人
	if (i != -1)
	{
		//删除联系人 该联系人后的所有联系人往前覆盖一位
		int k = 0;
		for (k = i; k < con->size-1; k++)
		{
			con->data[k] = con->data[k + 1];
		}
		con->size--;
		printf("删除成功\n");
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

六、查找联系人

和上面讲的查找联系人下标如出一辙,只需要找到该联系人下标后,将该下标的数据全部打印输出出来

void searchcon(const struct contact* con)//查找联系人
{
	char name[num_name];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con, name);
	if (i != -1)
	{
		//左对齐打印每一项数据
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				con->data[i].name,
				con->data[i].age,
				con->data[i].sex,
				con->data[i].phone,
				con->data[i].addr);
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

七、修改联系人

1、判断联系人是否存在,如果存在利用通用查找函数找到该联系人下标

2、重新输入该联系人全部信息即可

void moducon(struct contact* con)//修改联系人
{
	//修改该联系人 即找出该联系人的数据并全部重新赋值
	char name[num_name];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con, name);
	if (i != -1)
	{
		printf("请输入名字:");
		scanf("%s", con->data[i].name);

		printf("请输入电话:");
		scanf("%s", con->data[i].phone);

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

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

		printf("请输入地址:");
		scanf("%s", con->data[i].addr);

		printf("修改成功\n");
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

八、排序联系人

1、通过几大排序法按照名字的大小排序即可,这里用冒泡排序实现升序

2、比较名字大小,由于名字是字符串即使用strcmp函数实现

void sortcon(struct contact* con)//排序联系人
{
	int i = 0,j = 0;
	//按照名字大小用冒泡排序法进行升序排序
	for (i = 0; i < con->size-1; i++)
	{
		for (j = 0; j < con->size-1-i; j++)
		{
			//比较名字大小
			if (strcmp(con->data[j].name, con->data[j + 1].name) > 0)
			{
				//两值交换 注意结构体类型要一致
				struct people temp;
				temp = con->data[j];
				con->data[j] = con->data[j + 1];
				con->data[j + 1] = temp;
			}
		}
	}
	printf("\n");
}

以上就是整体实现思路了,完整代码如下

address.h

#pragma once

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

#define num 1000
#define num_name 20
#define num_sex 5
#define num_phone 12
#define num_addr 30

struct people//联系人类型
{
	char name[num_name];
	char sex[num_sex];
	int age;
	char phone[num_phone];
	char addr[num_addr];
};

struct contact//通讯录类型
{
	struct people data[num];
	int size;
};

enum option//枚举
{
	退出,
	新增,
	删除,
	查找,
	修改,
	查看,
	排序
};

//声明函数
void initcon(struct contact* con);//初始化

void addcon(struct contact* con);//添加联系人

void showcon(const struct contact* con);//查看联系人

void delcon(const struct contact* con);//删除联系人

void searchcon(struct contact* con);//查找联系人

void moducon(struct contact* con);//修改联系人

void sortcon(struct contact* con);//排序联系人

address.c

#include "address.h"

void initcon(struct contact *con)//初始化函数
{
	//用memset函数将通讯录联系人类型全部初始化为‘0’
	memset(con->data, 0, sizeof(con->data));
	con->size = 0;//设置通讯录一开始只有0个联系人
}

static int findname(struct contact* con,char name[num_name])//查找联系人下标并返回功能
{
	int i = 0;
	for (i = 0; i < con->size; i++)
	{
		//寻找该联系人 并记录下标
		if (strcmp(con->data[i].name, name) == 0)
			return i;
	}
	//如果找不到联系人则返回-1
	return -1;
}

void addcon(struct contact* con)//添加联系人
{
	//判断通讯录是否已满
	if (con->size == num)
		printf("通讯录已经满了,无法增加\n");
	else
	{
		//将结构体每一项赋值
		printf("请输入名字:");
		scanf("%s", con->data[con->size].name);

		printf("请输入电话:");
		scanf("%s", con->data[con->size].phone);

		printf("请输入年龄:");
		scanf("%d", &(con->data[con->size].age));

		printf("请输入性别:");
		scanf("%s", con->data[con->size].sex);

		printf("请输入地址:");
		scanf("%s", con->data[con->size].addr);

		con->size++;//通讯录人数加1
		printf("添加成功\n");
	}
	printf("\n");
}

void showcon(const struct contact* con)//查看联系人
{
	if (con->size == 0)
		printf("通讯录没有联系人\n");
	else
	{
		int i = 0;
		//左对齐打印每一项数据
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (i = 0; i < con->size; i++)
		{
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				con->data[i].name,
				con->data[i].age,
				con->data[i].sex,
				con->data[i].phone,
				con->data[i].addr);

		}
	}
	printf("\n");
}

void delcon(struct contact* con)//删除联系人
{
	char name[num_name];
	printf("请输入你要删除的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con,name);
	//判断是否找到这个联系人
	if (i != -1)
	{
		//删除联系人 该联系人后的所有联系人往前覆盖一位
		int k = 0;
		for (k = i; k < con->size-1; k++)
		{
			con->data[k] = con->data[k + 1];
		}
		con->size--;
		printf("删除成功\n");
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

void searchcon(const struct contact* con)//查找联系人
{
	char name[num_name];
	printf("请输入你要查找的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con, name);
	if (i != -1)
	{
		//左对齐打印每一项数据
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				con->data[i].name,
				con->data[i].age,
				con->data[i].sex,
				con->data[i].phone,
				con->data[i].addr);
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

void moducon(struct contact* con)//修改联系人
{
	//修改该联系人 即找出该联系人的数据并全部重新赋值
	char name[num_name];
	printf("请输入你要修改的联系人的名字:");
	scanf("%s", name);
	//调用查找联系人下标函数
	int i = findname(con, name);
	if (i != -1)
	{
		printf("请输入名字:");
		scanf("%s", con->data[i].name);

		printf("请输入电话:");
		scanf("%s", con->data[i].phone);

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

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

		printf("请输入地址:");
		scanf("%s", con->data[i].addr);

		printf("修改成功\n");
	}
	else
		printf("该联系人不存在\n");
	printf("\n");
}

void sortcon(struct contact* con)//排序联系人
{
	int i = 0,j = 0;
	//按照名字大小用冒泡排序法进行升序排序
	for (i = 0; i < con->size-1; i++)
	{
		for (j = 0; j < con->size-1-i; j++)
		{
			//比较名字大小
			if (strcmp(con->data[j].name, con->data[j + 1].name) > 0)
			{
				//两值交换 注意结构体类型要一致
				struct people temp;
				temp = con->data[j];
				con->data[j] = con->data[j + 1];
				con->data[j + 1] = temp;
			}
		}
	}
	printf("\n");
}

main.c

#include "address.h"

void meu()
{
	printf("**********************************************\n");
	printf("********1、新建联系人   2、删除联系人*********\n");
	printf("********3、查找联系人   4、修改联系人*********\n");
	printf("********5、查看联系人   6、排序联系人*********\n");
	printf("****************0、退出程序******************\n");
	printf("**********************************************\n");
}

int main()
{
	struct contact con;//con是通讯录
	initcon(&con);//初始化
	int i = 0;
	do
	{
		meu();
		printf("请输入你的选择:");
		scanf("%d", &i);
		switch (i)
		{
		//case枚举类型
		case 新增:
			addcon(&con);//增加联系人
			break;
		case 删除:
			delcon(&con);//删除联系人
			break;
		case 查找:
			searchcon(&con);//查找联系人
			break;
		case 修改:
			moducon(&con);//修改联系人
			break;
		case 查看:
			showcon(&con);//查看联系人
			break;
		case 排序:
			sortcon(&con);//排序联系人
			break;
		case 退出:
			printf("退出成功\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (i);
	return 0;
}

总结:需要了解好结构体的使用,并正确调用结构体变量,新手上路有很多不足,望各位大佬指出。

举报

相关推荐

0 条评论