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

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

26 人参与  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://m.zhangshiyu.com/post/34155.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

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

最新文章

  • 全文缘来是你早注定良心(萧千雅胡一阳)列表_全文缘来是你早注定良心
  • 「爱让我溺毙而亡」小说节选推荐_[羽柔乔羽柔林絮]章节限时抢先看‌
  • 此去经年人未还霍沉洲沈青禾后续结局霍沉洲
  • 山海不相逢内容精选(温逸尘沈衿)_山海不相逢内容精选(温逸尘沈衿)
  • (番外)+(全书)霍沉洲沈青禾此去经年人未还(霍沉洲沈青禾)_(霍沉洲沈青禾此去经年人未还)列表_笔趣阁(霍沉洲沈青禾)
  • (番外)+(全书)霍沉洲沈青禾(此去经年人未还霍沉洲沈青禾)完结_(霍沉洲沈青禾)列表_笔趣阁(此去经年人未还霍沉洲沈青禾)
  • 「重回八零,拒绝替嫁冲喜」章节彩蛋限时释出‌_卫东玉兰苏夏人气小说未删减节选
  • 重生七零祁同伟不再是农民儿子结局+番外纯净版全书免费重生七零祁同伟不再是农民儿子结局+番外纯净版全书免费
  • 傅雅宁的神女老婆,却在背地承欢作乐顾尘傅雅宁全书在线
  • 全文神女老婆,却在背地承欢作乐全局(顾尘傅雅宁)列表_全文神女老婆,却在背地承欢作乐全局
  • (番外)+(全书)此去经年人未还全书+番外+后续免费下载_(沈青禾霍沉洲)此去经年人未还全书+番外+后续列表_笔趣阁(沈青禾霍沉洲)
  • 完结文毁容的姐姐和瞎眼的我离开后,姜家两兄弟悔哭了+后续列表_完结文毁容的姐姐和瞎眼的我离开后,姜家两兄弟悔哭了+后续(林梦婉)

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

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