通讯录的实现
文章目录
一、打印菜单的编写和输入逻辑的编写
-
将枚举常量和输入逻辑对应,作用:增强代码的可读性,例如:将数字
1
与Add
操作对应;// enum 枚举的应用 增强代码的可读性 enum Option { // 自动编号 从 0 开始 EXIT, // 将数字 `0` 与对应的操作 `EXIT` 联系起来 ADD, // 将数字 `1` 与对应的操作 `ADD` 联系起来 DEL, SEARCH, MODIFY, SHOW, SORT };
// 输入逻辑的编写 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 SORT: //排序 -qsort break; case EXIT: printf("退出通讯录\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input);
二、定义通讯录用户信息的结构体变量
// 放到 contact.h 的文件中 //类型的声明 typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX]; }PeoInfo;
// 把结构体数组再次用结构体封装,比起直接在main()函数中创建结构体数组,增加代码的可读性 typedef struct Contact { PeoInfo data[MAX]; //存放数据 int sz; //记录的时当前通讯录中存放的人的信息个数 }Contact;
三、创建通讯录,并将通讯录初始化
//创建通讯录
Contact con;//通讯录
//初始化通讯录
InitContact(&con);
// 将通讯录初始化
void InitContact(Contact* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
四、增加新联系人 AddContact()
函数的编写
// 增加新联系人
void AddContact(Contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法增加\n");
return;
}
//增加信息
printf("请输入名字:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:");
scanf("%s", pc->data[pc->sz].addr);
//
pc->sz++;
printf("增加成功\n");
}
五、显示通讯录人的信息ShowContact()
函数的编写
void ShowContact(const Contact* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通讯录为空,无需打印\n");
return;
}
int i = 0;
//名字 年龄 性别 电话 地址
//xxx xxx xxx xxx xxx
printf("%-20s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
//打印每个人的信息
printf("%-20s%-5d%-5s%-12s%-30s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
六、删除通讯录中的用户信息
-
先编写
FindByName()
函数查找用户 -
static
函数在内存中只有一份,普通函数在函数调用时维持一份拷贝// static 修饰,静态函数 只在当前声明的文件下使用 static int FindByName(Contact* pc, char name[]) { assert(pc); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1;//找不到 }
-
删除函数
DelContact()
的编写
void DelContact(Contact* pc)
{
char name[NAME_MAX];
assert(pc);
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
printf("输入要删除人的名字:");
scanf("%s", name);//zhangsan
//找到名字为name的人
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("要删除的人不存在\n");
return;
}
//删除这个人
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
七、修改通讯录中的信息ModifyContact()
函数的编写
void ModifyContact(Contact* pc)
{
char name[NAME_MAX];
assert(pc);
printf("请输入要修改人的名字:");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("要修改的人不存在\n");
return;
}
//修改
printf("请输入名字:");
scanf("%s", pc->data[ret].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[ret].age));
printf("请输入性别:");
scanf("%s", pc->data[ret].sex);
printf("请输入电话:");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}