当前位置:首页 » 《休闲阅读》 » 正文

C语言实现简易动态电话簿&&文末提供源代码下载_wang_fm的博客

14 人参与  2022年02月01日 12:51  分类 : 《休闲阅读》  评论

点击全文阅读


🚀导航

  • ⭐️前言⭐️
  • 🌳功能函数
    • 🍃结构设定
    • 🍃菜单交互
    • 🍃主函数
    • 🍃通讯录初始化
    • 🍃新增联系人
    • 🍃查找联系人
    • 🍃删除联系人
    • 🍃修改联系人
    • 🍃查看所有联系人
    • 🍃清空所有联系人
    • 🍃以名字排序所有联系人
  • 💎结尾语💎

⭐️前言⭐️

本文将实现一个简易的电话簿管理。
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。
电话簿要实现功能如下

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

本文主要以信息存储在静态数组里面分析,并且会在文末增加动态版本。

🌳功能函数

🍃结构设定

我们存储的信息是复杂的,这需要结构体来描述。
信息包括名字,性别,电话号码,年龄,住址。

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 30

struct PeoInfo{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
};

对于功能选择可以考虑枚举常量解决

enum Option{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};

通讯录最多有1000人。

#define MAX 1000
struct Contact
{
	struct PeoInfo date[MAX];
	int sz;
};

🍃菜单交互

void menu(){
	printf("******************************\n");
	printf("****  1. add     2. del  *****\n");
	printf("****  3. search  4. modify****\n");
	printf("****  5. show    6. sort   ***\n");
	printf("****  0. exit               **\n");
	printf("******************************\n");
}

🍃主函数

int main()
{
	int input = 0;
	struct 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 MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case EXIT:
			//销毁通讯录
			DestroyContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

🍃通讯录初始化

void Initcontact(struct Contact* pc)
{
	pc->sz = 0;
	memset(pc->date, 0, MAX * sizeof(struct PeoInfo));
}

🍃新增联系人

void AddContact(struct Contact* pc)
{
	struct PeoInfo tmp = { 0 };
	if (pc->sz == MAX){
		printf("通讯录已满1000人");
	}
	else{
		printf("请输入名字:>");
		scanf("%s", tmp.name);
		printf("请输入年龄:>");
		scanf("%d", tmp.age));
		printf("请输入性别:>");
		scanf("%s", tmp.sex);
		printf("请输入电话:>");
		scanf("%s", tmp.tele);
		printf("请输入地址:>");
		scanf("%s", tmp.addr);
		pc->data[pc->sz] = tmp;
		printf("添加成功!");
		pc->sz++;
	}
}

❗需要注意的是

  1. 需要判断通讯录有没有满,如果满人则不能再添加
  2. 我们用sz来记录最后一个成员

🍃查找联系人

int FindContactByName(struct Contact* pc, char name[]){
	int i = 0;
	for (i = 0; i < pc->sz; i++){
		if (strcmp(pc->data[i].name, name) == 0){
			return i;
		}
	}
	return -1;
}
  1. 我们常见的联系人查找中,有通过名字或者通过电话号码查找,这里提供名字查找后返回数组下标的函数
  2. 这里通过字符串比较函数strcmp来比较名字是否相同
void SearchContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos= FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("查无此人");
	}
	else
	{
		printf("%15s\t%5s\t%8s\t%15s\t%30s\n\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%15s\t%5s\t%8s\t%15s\t%30s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

找到了就返回信息,没有找到就输出查无此人

🍃删除联系人

void DelContact(struct Contact* pc){
	if (pc->sz == 0){
		printf("通讯录为空,无法删除\n");
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除人的名字");
	scanf_s("%s", name);
	int pos=FindContactByName(pc,name);//按照名字去查找,找到了就返回下标,未找到就返回-1
	if (pos == -1){
		printf("指定联系人不存在\n");
	}
	else{
		int j = 0;
		for (j = pos; j < pc->sz-1; j++){
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("删除成功!\n");
	}
}
  1. 执行删除操作需要判断是不是为空,如果是空的,那肯定不能再删除
  2. 找到后执行删除操作就是将后面信息往前覆盖,并且sz要减去1
  3. 没找到就要输出删除联系人不存在

🍃修改联系人

void ModifyContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("请输入新的名字:>");
		scanf("%s", pc->data[pos].name);//选择放在下标为sz的data里面
		printf("请输入新的年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入新的性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入新的地址:>");
		scanf("%s", pc->data[pos].addr);
	}
}
  1. 找到联系人进行修改

🍃查看所有联系人

void ShowContact(struct Contact* pc){
	int i = 0;
	printf("%15s\t%5s\t%8s\t%15s\t%30s\n\n", "姓名", "年龄", "性别", "电话", "地址");//打印标题
	for (i = 0; i < pc->sz; i++){
		printf("%15s\t%5s\t%8s\t%15s\t%30s\n",
			pc->data[i].name, 
			pc->data[i].age, 
			pc->data[i].sex, 
			pc->data[i].tele, 
			pc->data[i].addr);
	}
}

🍃清空所有联系人

void EmptyContact(struct Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}

🍃以名字排序所有联系人

int CmpByname(const char* s1, const char* s2) {
	return strcmp(s1, s2);
}
void SortContact(struct Contact* pc) {
	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByname);
	printf("排序完毕,请执行查看操作");
}
  1. 这里采用的是C语言库函数qsort
  2. cmpbyname为自定义函数

💎结尾语💎

本电话簿不足之处

  1. 电话簿人数固定为1000人,后续开辟动态版本
  2. 信息保存再主存中,关闭程序或者断电信息就会消失,后续增加文件保存函数,将信息保存在硬盘中

如有不足之处,欢迎指正!

源代码下载

🔑源代码下载链接
 
👉💎下一篇:realloc实现动态电话簿💎
 
🎉欢迎关注🔎点赞👍收藏⭐️留言📝


点击全文阅读


本文链接:http://zhangshiyu.com/post/34155.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1