前言
- 创建一个简易版通讯录包含以下几个功能:新增联系人,打印通讯录,查找联系人,删除联系人,修改联系人,按名排序通讯录
创建通讯录结构体和初始化
- 创建联系人结构体,包含联系人的基本信息
- 使用 #define 定义各项成员的大小,方便后续修改和使用
#define MAX 199
#define NAME_MAX 20
#define SEX_MAX 5
#define PHO_MAX 12
#define ADD_MAX 30
typedef struct PeoInfo {
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char phone[PHO_MAX];
char add[ADD_MAX];
}PeoInfo;
- 创建通讯录结构体,包含联系人结构体数组和联系人数量
typedef struct Contact {
PeoInfo data[MAX];
int sz;
}Contact;
- 为方便以后优化,独立处一个初始化通讯录函数
void InitContact(Contact* pc) {
assert(pc);
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data)); // 需要引入库函数 #include <string.h>
}
新增联系人
- 通讯录为空时 sz 为0,新增第一个联系人放在下标为 0 的位置,因此把新增的人放在下标为 sz 的位置,新增联系人完成, sz ++
void AddContact(Contact* pc) {
assert(pc); // 需引入库函数 #include <assert.h>
if (pc->sz == MAX) {
printf("已满");
return;
}
// 把新增的人放在下标为sz的位置
printf("请输入名字:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入手机号:");
scanf("%s", pc->data[pc->sz].phone);
printf("请输入地址:");
scanf("%s", pc->data[pc->sz].add);
pc->sz++;
printf("添加成功\n");
}
打印通讯录
void PrintContact(const Contact* pc) {
assert(pc);
printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
for (int i = 0; i < pc->sz; i++) {
printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
}
}
查找联系人
- 为方便后续函数使用,将查找联系人封装为两个函数,FindContact 查找联系人下标,SearchContact 打印联系人信息
int FindContact(const Contact* pc, char* name) {
assert(pc && name);
for (int i = 0; i < pc->sz; i++) {
if (0 == strcmp(pc->data[i].name, name)) {
return i;
}
}
return -1;
}
void SearchContact(const Contact* pc) {
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入要查找的姓名\n");
scanf("%s", name);
int i = FindContact(pc, name);
if (-1 == i) {
printf("查找的人不存在\n");
return;
}
printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
}
删除联系人
- FindContact 查找联系人下标,DelContact 删除相应联系人
void DelContact(Contact* pc) {
assert(pc);
if (pc->sz == 0) {
printf("空通讯录 无法删除\n");
return;
}
char name[NAME_MAX] = { 0 };
printf("请输入要删除的姓名\n");
scanf("%s", name);
int pos = FindContact(pc, name);
if (-1 == pos) {
printf("删除的人不存在\n");
return;
}
for (int i = pos; i < pc->sz-1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除完成\n");
}
修改联系人
- FindContact 查找联系人下标,ModContact 修改相应联系人
void ModContact(Contact* pc) {
char name[NAME_MAX] = { 0 };
printf("请输入要修改的人的姓名\n");
scanf("%s", name);
int i = FindContact(pc, name);
if (-1 == i) {
printf("修改的人不存在\n");
return;
}
printf("请输入后的信息:\n");
printf("请输入名字:");
scanf("%s", pc->data[i].name);
printf("请输入性别:");
scanf("%s", pc->data[i].sex);
printf("请输入年龄:");
scanf("%d", &(pc->data[i].age));
printf("请输入手机号:");
scanf("%s", pc->data[i].phone);
printf("请输入地址:");
scanf("%s", pc->data[i].add);
printf("修改成功 信息如下:\n");
printf("%-15s %-5s %-3s %-15s %-20s\n", "姓名", "性别", "年龄", "手机号", "地址");
printf("%-15s %-5s %-3d %-15s %-20s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].add);
}
按名排序通讯录
- 封装一个交换函数 SwapContact, 使用冒泡排序实现按名排序通讯录
void SwapContact(Contact* pc,int x,int y) {
PeoInfo tmp = pc->data[x];
pc->data[x] = pc->data[y];
pc->data[y] = tmp;
}
void SortContact(Contact* pc) {
assert(pc);
for (int i = 0; i < pc->sz - 1; i++) {
int flag = 0;
for (int j = 0; j < pc->sz - i - 1; j++) {
if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) {
SwapContact(pc, j, j + 1);
flag = 1;
}
}
if (0 == flag) {
break;
}
}
printf("排序完成\n");
PrintContact(pc);
}
创建调用函数
- 使用枚举定义使用通讯录的操作
enum Option {
EXIT,
ADD,
DEL,
SEARCH,
MOD,
SORT,
PRINT
};
- 创建菜单函数,与枚举的内容一一对应
void menu() {
printf("*******************\n");
printf("*******************\n");
printf("**1.add 2.del**\n");
printf("**3.search 4.mod**\n");
printf("**5.sort 6.Pri**\n");
printf("**0.ext **\n");
printf("*******************\n");
printf("*******************\n");
}
- 创建运行通讯录函数
- 其中 case 的内容与枚举一一对应,提高代码可读性
void RunContact() {
int input = 0;
// 创建通讯录
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 MOD:
ModContact(&con);
break;
case SORT:
SortContact(&con);
break;
case PRINT:
PrintContact(&con);
break;
case 0:
printf("退出程序");
break;
default:
printf("输入错误");
break;
}
} while (input);
}
int main() {
RunContact();
return 0;
}
运行结果