🚀导航
- ⭐️前言⭐️
- 🌳功能函数
- 🍃结构设定
- 🍃菜单交互
- 🍃主函数
- 🍃通讯录初始化
- 🍃新增联系人
- 🍃查找联系人
- 🍃删除联系人
- 🍃修改联系人
- 🍃查看所有联系人
- 🍃清空所有联系人
- 🍃以名字排序所有联系人
- 💎结尾语💎
⭐️前言⭐️
本文将实现一个简易的电话簿管理。
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址。
电话簿要实现功能如下
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
本文主要以信息存储在静态数组里面分析,并且会在文末增加动态版本。
🌳功能函数
🍃结构设定
我们存储的信息是复杂的,这需要结构体来描述。
信息包括名字,性别,电话号码,年龄,住址。
#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++;
}
}
❗需要注意的是
- 需要判断通讯录有没有满,如果满人则不能再添加
- 我们用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;
}
- 我们常见的联系人查找中,有通过名字或者通过电话号码查找,这里提供名字查找后返回数组下标的函数
- 这里通过字符串比较函数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");
}
}
- 执行删除操作需要判断是不是为空,如果是空的,那肯定不能再删除
- 找到后执行删除操作就是将后面信息往前覆盖,并且sz要减去1
- 没找到就要输出删除联系人不存在
🍃修改联系人
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);
}
}
- 找到联系人进行修改
🍃查看所有联系人
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("排序完毕,请执行查看操作");
}
- 这里采用的是C语言库函数qsort
- cmpbyname为自定义函数
💎结尾语💎
本电话簿不足之处
- 电话簿人数固定为1000人,后续开辟动态版本
- 信息保存再主存中,关闭程序或者断电信息就会消失,后续增加文件保存函数,将信息保存在硬盘中
如有不足之处,欢迎指正!
源代码下载
🔑源代码下载链接
👉💎下一篇:realloc实现动态电话簿💎
🎉欢迎关注🔎点赞👍收藏⭐️留言📝