简易通讯录(C语言)

前言

 

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

目录

一、通讯录菜单

 二、枚举主函数内部选项

三、通讯录主函数

四、定义联系人及通讯录

1.定义联系人

2.定义通讯录

五、声明全局变量

六、初始化通讯录

七、通讯录功能实现

1.增加联系人

 2.删除联系人

3.查找联系人

4.修改联系人

5.显示联系人

6.清除联系人

7.排序联系人

 八、完整代码

utili.h

contact.h

contact.cpp

contactMain.cpp

一、通讯录菜单

首先我们要设计一个简易菜单来完成交互

代码实现

void Menu()
{
	printf("****************通 讯 录****************\n");
	printf("*   [1] Add                 [2] Del    *\n");
	printf("*   [3] Find                [4] Modify *\n");
	printf("*   [5] Show                [6] Clear  *\n");
	printf("*   [7] Sort                [0] Quit   *\n");
	printf("****************************************\n");
}

二、枚举主函数内部选项

我们采用枚举对主函数菜单的选择进行设置

enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };

三、通讯录主函数

我们通过上面枚举,用switch分支来实现菜单选择。

代码实现

void main()
{
	Contact cont;
	InitContact(&cont);

	int select = 1;
	while (select)
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &select);

		if (select == QUIT)
			break;

		switch (select)
		{
		case ADD:
			AddContact(&cont);
			break;
		case DEL:
			DelContact(&cont);
			break;
		case FIND:
			FindContact(&cont);
			break;
		case MODIFY:
			ModifyContact(&cont);
			break;
		case SHOW:
			ShowContact(&cont);
			break;
		case CLEAR:
			ClearContact(&cont);
			break;
		case SORT:
			SortContact(&cont);  //qsort
			break;
		}
	}

}

四、定义联系人及通讯录

这里是为了实现题目要求,要使用自定义结构体(struct)

1.定义联系人

代码实现

typedef struct PersonInfo
{
	char name[MAX_NAME_SIZE];
	char sex[MAX_SEX_SIZE];
	int age;
	char tel[MAX_TEL_SIZE];
	char address[MAX_ADDR_SIZE];
}PersonInfo;

2.定义通讯录

代码实现

typedef struct Contact
{
	PersonInfo cont[MAX_CONTACT_SIZE];
	size_t     capacity;
	size_t     size;
}Contact;

五、声明全局变量

这里是对上面结构体内部信息的声明

代码实现

#define MAX_NAME_SIZE 10
#define MAX_SEX_SIZE   3
#define MAX_TEL_SIZE   12
#define MAX_ADDR_SIZE 128

#define MAX_CONTACT_SIZE 8

六、初始化通讯录

代码实现

void InitContact(Contact *pcont)
{
	assert(pcont != NULL);
	memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE);
	pcont->capacity = MAX_CONTACT_SIZE;
	pcont->size = 0;
}

七、通讯录功能实现

1.增加联系人

代码实现

void AddContact(Contact *pcont)
{
	assert(pcont != NULL);
	if (IsFullContact(pcont))
	{
		printf("通讯录空间已满,不能新增信息.....\n");
		return;
	}

	printf("姓名:>");
	scanf("%s", pcont->cont[pcont->size].name);
	printf("性别:>");
	scanf("%s", pcont->cont[pcont->size].sex);
	printf("年龄:>");
	scanf("%d", &pcont->cont[pcont->size].age);
	printf("电话:>");
	scanf("%s", pcont->cont[pcont->size].tel);
	printf("住址:>");
	scanf("%s", pcont->cont[pcont->size].address);

	pcont->size++;
	printf("增加完成.......\n");
}

 2.删除联系人

代码实现

void DelContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要删除的名字:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	int i;
	for (i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
			break;
	}
	if (i >= pcont->size)
	{
		printf("要删除的信息不存在.....\n");
		return;
	}

	for (int k = i; k<pcont->size - 1; ++k)
		pcont->cont[k] = pcont->cont[k + 1];
	pcont->size--;
	printf("删除完成.......\n");
}

3.查找联系人

代码实现

int  FindContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要查找的姓名:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
		{
			printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
				pcont->cont[i].sex,
				pcont->cont[i].age,
				pcont->cont[i].tel,
				pcont->cont[i].address);
			return i;
		}

	}
	return -1;
}

4.修改联系人

代码实现

void ModifyContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要修改的名字:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	int i;
	for (i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
			break;
	}
	if (i >= pcont->size)
	{
		printf("要修改的信息不存在.....\n");
		return;
	}

	printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n");
	int select;
	scanf("%d", &select);
	if (select == 1)
	{
		printf("请输入要修改姓名:>");
		scanf("%s", pcont->cont[i].name);
	}
	else if (select == 2)
	{
		printf("请输入要修改性别:>");
		scanf("%s", pcont->cont[i].sex);
	}
	else if (select == 3)
	{
		printf("请输入要修改年龄:>");
		scanf("%d", &pcont->cont[i].age);
	}
	else if (select == 4)
	{
		printf("请输入要修改电话:>");
		scanf("%s", pcont->cont[i].tel);
	}
	else if (select == 5)
	{
		printf("请输入要修改地址:>");
		scanf("%s", pcont->cont[i].address);
	}
	printf("修改完成.......\n");
}

5.显示联系人

代码实现

void ShowContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i<pcont->size; ++i)
	{
		printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
			pcont->cont[i].sex,
			pcont->cont[i].age,
			pcont->cont[i].tel,
			pcont->cont[i].address);
	}
}

6.清除联系人

代码实现

void ClearContact(Contact *pcont)
{
	assert(pcont != NULL);
	pcont->size = 0;
	printf("清除完成.......\n");

7.排序联系人

代码实现

void SortContact(Contact *pcont)
{
	assert(pcont != NULL);
	for (int i = 0; i<pcont->size - 1; ++i)
	{
		for (int j = 0; j<pcont->size - 1 - i; ++j)
		{
			if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0)
			{
				PersonInfo tmp = pcont->cont[j];
				pcont->cont[j] = pcont->cont[j + 1];
				pcont->cont[j + 1] = tmp;
			}
		}
	}
	printf("排序完成.......\n");
}

 八、完整代码

utili.h

#ifndef _UTILI_H_
#define _UTILI_H_

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

#endif /* _UTILI_H_ */

contact.h

#ifndef _CONTACT_H_
#define _CONTACT_H_

#include"utili.h"

enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };

#define MAX_NAME_SIZE 10
#define MAX_SEX_SIZE   3
#define MAX_TEL_SIZE   12
#define MAX_ADDR_SIZE 128

#define MAX_CONTACT_SIZE 8

//定义通讯录人员信息
typedef struct PersonInfo
{
	char name[MAX_NAME_SIZE];
	char sex[MAX_SEX_SIZE];
	int age;
	char tel[MAX_TEL_SIZE];
	char address[MAX_ADDR_SIZE];
}PersonInfo;

//定义通讯录结构
typedef struct Contact
{
	PersonInfo cont[MAX_CONTACT_SIZE];
	size_t     capacity;
	size_t     size;
}Contact;

/

bool IsFullContact(Contact *pcont);

void InitContact(Contact *pcont);
void AddContact(Contact *pcont);
void ShowContact(Contact *pcont);
int  FindContact(Contact *pcont);
void DelContact(Contact *pcont);
void ModifyContact(Contact *pcont);
void SortContact(Contact *pcont);

void ClearContact(Contact *pcont);


#endif /* _CONTACT_H_ */

contact.cpp

#include"contact.h"

void InitContact(Contact *pcont)
{
	assert(pcont != NULL);
	memset(pcont->cont, 0, sizeof(PersonInfo)* MAX_CONTACT_SIZE);
	pcont->capacity = MAX_CONTACT_SIZE;
	pcont->size = 0;
}

bool IsFullContact(Contact *pcont)
{
	assert(pcont != NULL);
	return pcont->size >= pcont->capacity;
}

void AddContact(Contact *pcont)
{
	assert(pcont != NULL);
	if (IsFullContact(pcont))
	{
		printf("通讯录空间已满,不能新增信息.....\n");
		return;
	}

	printf("姓名:>");
	scanf("%s", pcont->cont[pcont->size].name);
	printf("性别:>");
	scanf("%s", pcont->cont[pcont->size].sex);
	printf("年龄:>");
	scanf("%d", &pcont->cont[pcont->size].age);
	printf("电话:>");
	scanf("%s", pcont->cont[pcont->size].tel);
	printf("住址:>");
	scanf("%s", pcont->cont[pcont->size].address);

	pcont->size++;
	printf("增加完成.......\n");
}

void ShowContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i<pcont->size; ++i)
	{
		printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
			pcont->cont[i].sex,
			pcont->cont[i].age,
			pcont->cont[i].tel,
			pcont->cont[i].address);
	}
}

int  FindContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要查找的姓名:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	printf("%-10s%-5s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
		{
			printf("%-10s%-5s%-6d%-13s%s\n", pcont->cont[i].name,
				pcont->cont[i].sex,
				pcont->cont[i].age,
				pcont->cont[i].tel,
				pcont->cont[i].address);
			return i;
		}

	}
	return -1;
}

void DelContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要删除的名字:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	int i;
	for (i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
			break;
	}
	if (i >= pcont->size)
	{
		printf("要删除的信息不存在.....\n");
		return;
	}

	for (int k = i; k<pcont->size - 1; ++k)
		pcont->cont[k] = pcont->cont[k + 1];
	pcont->size--;
	printf("删除完成.......\n");
}

void ModifyContact(Contact *pcont)
{
	assert(pcont != NULL);
	printf("请输入要修改的名字:>");
	char name[MAX_NAME_SIZE] = { 0 };
	scanf("%s", name);

	int i;
	for (i = 0; i<pcont->size; ++i)
	{
		if (strcmp(name, pcont->cont[i].name) == 0)
			break;
	}
	if (i >= pcont->size)
	{
		printf("要修改的信息不存在.....\n");
		return;
	}

	printf("你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)\n");
	int select;
	scanf("%d", &select);
	if (select == 1)
	{
		printf("请输入要修改姓名:>");
		scanf("%s", pcont->cont[i].name);
	}
	else if (select == 2)
	{
		printf("请输入要修改性别:>");
		scanf("%s", pcont->cont[i].sex);
	}
	else if (select == 3)
	{
		printf("请输入要修改年龄:>");
		scanf("%d", &pcont->cont[i].age);
	}
	else if (select == 4)
	{
		printf("请输入要修改电话:>");
		scanf("%s", pcont->cont[i].tel);
	}
	else if (select == 5)
	{
		printf("请输入要修改地址:>");
		scanf("%s", pcont->cont[i].address);
	}
	printf("修改完成.......\n");
}

void SortContact(Contact *pcont)
{
	assert(pcont != NULL);
	for (int i = 0; i<pcont->size - 1; ++i)
	{
		for (int j = 0; j<pcont->size - 1 - i; ++j)
		{
			if (strcmp(pcont->cont[j].name, pcont->cont[j + 1].name) > 0)
			{
				PersonInfo tmp = pcont->cont[j];
				pcont->cont[j] = pcont->cont[j + 1];
				pcont->cont[j + 1] = tmp;
			}
		}
	}
	printf("排序完成.......\n");
}

void ClearContact(Contact *pcont)
{
	assert(pcont != NULL);
	pcont->size = 0;
	printf("清除完成.......\n");
}

contactMain.cpp

#include"contact.h"

void Menu()
{
	printf("****************通 讯 录****************\n");
	printf("*   [1] Add                 [2] Del    *\n");
	printf("*   [3] Find                [4] Modify *\n");
	printf("*   [5] Show                [6] Clear  *\n");
	printf("*   [7] Sort                [0] Quit   *\n");
	printf("****************************************\n");
}

void main()
{
	Contact cont;
	InitContact(&cont);

	int select = 1;
	while (select)
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &select);

		if (select == QUIT)
			break;

		switch (select)
		{
		case ADD:
			AddContact(&cont);
			break;
		case DEL:
			DelContact(&cont);
			break;
		case FIND:
			FindContact(&cont);
			break;
		case MODIFY:
			ModifyContact(&cont);
			break;
		case SHOW:
			ShowContact(&cont);
			break;
		case CLEAR:
			ClearContact(&cont);
			break;
		case SORT:
			SortContact(&cont);  //qsort
			break;
		}
	}

}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mᴇᴇᴛ ꦿ᭄.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值