简易通讯录

前言

  • 创建一个简易版通讯录包含以下几个功能:新增联系人,打印通讯录,查找联系人,删除联系人,修改联系人,按名排序通讯录

创建通讯录结构体和初始化

  • 创建联系人结构体,包含联系人的基本信息
  • 使用 #define 定义各项成员的大小,方便后续修改和使用
#define MAX 199
#define NAME_MAX 20
#define SEX_MAX 5
#define PHO_MAX 12
#define ADD_MAX 30

typedef struct PeoInfo {
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char phone[PHO_MAX];
	char add[ADD_MAX];
}PeoInfo;
  • 创建通讯录结构体,包含联系人结构体数组和联系人数量
typedef struct Contact {
	PeoInfo data[MAX];
	int sz;		
}Contact;
  • 为方便以后优化,独立处一个初始化通讯录函数
void InitContact(Contact* pc) {
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));  // 需要引入库函数 #include <string.h>
}

新增联系人

  • 通讯录为空时 sz 为0,新增第一个联系人放在下标为 0 的位置,因此把新增的人放在下标为 sz 的位置,新增联系人完成, sz ++
void AddContact(Contact* pc) {
	assert(pc);     // 需引入库函数 #include <assert.h>
	if (pc->sz == MAX) {
		printf("已满");
		return;
	}
	// 把新增的人放在下标为sz的位置
	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].phone);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].add);
	pc->sz++;
	printf("添加成功\n");
}

打印通讯录

void PrintContact(const Contact* pc) {
	assert(pc);
	printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
	for (int i = 0; i < pc->sz; i++) {
		printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
	}
}

查找联系人

  • 为方便后续函数使用,将查找联系人封装为两个函数,FindContact 查找联系人下标,SearchContact 打印联系人信息
int FindContact(const Contact* pc, char* name) {
	assert(pc && name);
	for (int i = 0; i < pc->sz; i++) {
		if (0 == strcmp(pc->data[i].name, name)) {
			return i;
		}
	}
	return -1;
}
void SearchContact(const Contact* pc) {
    assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的姓名\n");
	scanf("%s", name);
	int i = FindContact(pc, name);
	if (-1 == i) {
		printf("查找的人不存在\n");
		return;
	}
	printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
	printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
}

删除联系人

  • FindContact 查找联系人下标,DelContact 删除相应联系人
void DelContact(Contact* pc) {
	assert(pc);
	if (pc->sz == 0) {
		printf("空通讯录 无法删除\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除的姓名\n");
	scanf("%s", name);
	int pos = FindContact(pc, name);
	if (-1 == pos) {
		printf("删除的人不存在\n");
		return;
	}
	for (int i = pos; i < pc->sz-1; i++) {
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除完成\n");
}

修改联系人

  • FindContact 查找联系人下标,ModContact 修改相应联系人
void ModContact(Contact* pc) {
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的姓名\n");
	scanf("%s", name);
	int i = FindContact(pc, name);
	if (-1 == i) {
		printf("修改的人不存在\n");
		return;
	}
	printf("请输入后的信息:\n");
	printf("请输入名字:");
	scanf("%s", pc->data[i].name);
	printf("请输入性别:");
	scanf("%s", pc->data[i].sex);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[i].age));
	printf("请输入手机号:");
	scanf("%s", pc->data[i].phone);
	printf("请输入地址:");
	scanf("%s", pc->data[i].add);

	printf("修改成功 信息如下:\n");
	printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
	printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
}

按名排序通讯录

  • 封装一个交换函数 SwapContact, 使用冒泡排序实现按名排序通讯录
void SwapContact(Contact* pc,int x,int y) {
	PeoInfo tmp = pc->data[x];
	pc->data[x] = pc->data[y];
	pc->data[y] = tmp;
}
void SortContact(Contact* pc) {
	assert(pc);
	for (int i = 0; i < pc->sz - 1; i++) {
		int flag = 0;
		for (int j = 0; j < pc->sz - i - 1; j++) {
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) {
				SwapContact(pc, j, j + 1);
				flag = 1;
			}
		}
		if (0 == flag) {
			break;
		}
	}
	printf("排序完成\n");
	PrintContact(pc);
}

创建调用函数

  • 使用枚举定义使用通讯录的操作
enum Option {
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MOD,
	SORT,
	PRINT
};
  • 创建菜单函数,与枚举的内容一一对应
void menu() {
	printf("*******************\n");
	printf("*******************\n");
	printf("**1.add		2.del**\n");
	printf("**3.search	4.mod**\n");
	printf("**5.sort	6.Pri**\n");
	printf("**0.ext          **\n");
	printf("*******************\n");
	printf("*******************\n");
}
  • 创建运行通讯录函数
  • 其中 case 的内容与枚举一一对应,提高代码可读性
void RunContact() {
	int input = 0;
	// 创建通讯录
	Contact con;
	InitContact(&con);
	do {
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input) {
			case ADD:
				AddContact(&con);
				break;
			case DEL:
				DelContact(&con);
				break;
			case SEARCH:
				SearchContact(&con);
				break;
			case MOD:
				ModContact(&con);
				break;
			case SORT:
				SortContact(&con);
				break;
			case PRINT:
				PrintContact(&con);
				break;
			case 0:
				printf("退出程序");
				break;
			default:
				printf("输入错误");
				break;
		}
	} while (input);
}
int main() {
	RunContact();
	return 0;
}

运行结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值