通过使用C语言来创建一个通讯录的管理系统,管理人员可对成员信息进行管理。成员信息包括姓名、年龄、电话、性别以及住址,执行操作有增删改查这四项基本操作以及成员信息全览和信息排序。
由于成员信息较多,可以选择通过结构体来创建一个通讯录结构体和一个成员信息结构体。
通讯录结构体内部会嵌套一个成员信息结构体和一个表示成员数量的变量。
struct Infor
{
char name[nlen];
int age;
char tele[tlen];
char sex[slen];
char addres[alen];
};
struct Contact
{
struct Infor data[MAX];
int size;
};
首先对于通讯录来说,建立一个菜单是非常重要的,这就好比在一个餐厅里,只有提供了一份菜单,顾客就可以根据自己的意愿的点菜,在操作界面显示一个完整简明的菜单,才能更好地管理通讯录系统。
void menu()
{
printf("************************************\n");
printf("******* 通讯录管理系统 *******\n");
printf("************************************\n");
printf("******* 1.add *******\n");//添加信息
printf("******* 2.delete *******\n");//删除信息
printf("******* 3.update *******\n");//更改信息
printf("******* 4.read *******\n");//查找信息
printf("******* 5.show *******\n");//打印信息
printf("******* 6.sort *******\n");//排序信息
printf("******* 0.exit *******\n");//退出
printf("************************************\n");
}
//初始化通讯录
void InitContact(struct Contact* stu);
//添加信息
void AddContact(struct Contact* stu);
//打印信息
void ShowContact(const struct Contact* stu);
//根据姓名查找位置
int FindByName(const struct Contact* stu, char name[nlen]);
//删除信息
void DeleteContact(struct Contact* stu);
//查找信息
void ReadContact(const struct Contact* stu);
//修改信息
void UpdateContact(struct Contact* stu);
//排序信息
void SortContact(struct Contact* stu);
为什么要对通讯录进行初始化呢,因为在创建了通讯录之后,里边的所有信息的以随机值的形式存在,不知道的还以为这个通讯录里已经存放了成员信息。
void InitContact(struct Contact* stu)
{
memset(stu->data, 0, sizeof(stu->data));
stu->size = 0;
}
void AddContact(struct Contact* stu)
{
if (stu->size == MAX)
{
printf("通讯录已满,无法添加信息!\n");
}
else
{
printf("请添加姓名:");
scanf("%s", (stu->data)[stu->size].name);
printf("请添加年龄:");
scanf("%d", &((stu->data)[stu->size].age));
printf("请添加电话:");
scanf("%s", (stu->data)[stu->size].tele);
printf("请添加性别:");
scanf("%s", (stu->data)[stu->size].sex);
printf("请添加地址:");
scanf("%s", (stu->data)[stu->size].addres);
stu->size++;
printf("添加成功\n");
}
}
void ShowContact(const struct Contact* stu)
{
if (stu->size == 0)
{
printf("通讯录为空\n");
}
else
{
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
for (int i = 0; i < stu->size; i++)
{
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[i].name,
stu->data[i].age,
stu->data[i].tele,
stu->data[i].sex,
stu->data[i].addres);
}
}
}
这个函数的存在就是为了通讯录管理人员通过成员姓名来查找该成员信息所处的位置。
static int FindByName(const struct Contact* stu,char name[nlen] )
{
int i = 0;
for (i = 0; i < stu->size; i++)
{
if (0 == strcmp(stu->data[i].name, name))
{
return i;
}
}
return -1;
}
void DeleteContact(struct Contact* stu)
{
if (stu->size == 0)
{
printf("通讯录为空,无法删除\n");
}
char name[nlen];
printf("请输入要删除信息人的名字:");
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要删除的信息不存在!\n");
}
else
{
for (int j = ret; j < stu->size - 1; j++)
{
stu->data[j] = stu->data[j + 1];
}
stu->size--;
printf("删除成功\n");
}
}
void ReadContact(const struct Contact* stu)
{
printf("请输入要查找信息人的名字:");
char name[nlen];
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要查找的信息不存在\n");
}
else
{
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[ret].name,
stu->data[ret].age,
stu->data[ret].tele,
stu->data[ret].sex,
stu->data[ret].addres);
}
}
void UpdateContact(struct Contact* stu)
{
printf("请输入要该信息人的名字:");
char name[nlen];
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要修改的信息不存在\n");
}
else
{
printf("请添加姓名:");
scanf("%s", (stu->data)[ret].name);
printf("请添加年龄:");
scanf("%d", &((stu->data)[ret].age));
printf("请添加电话:");
scanf("%s", (stu->data)[ret].tele);
printf("请添加性别:");
scanf("%s", (stu->data)[ret].sex);
printf("请添加地址:");
scanf("%s", (stu->data)[ret].addres);
printf("修改成功\n");
}
}
在排序这一模块,我们选择使用qsort函数来进行排序,对这个函数不清楚的朋友可以看一下我之前写的一篇关于qsort函数的博客。
int cmp_s(const void* elem1, const void* elem2)
{
return strcmp((char*)elem1, (char*)elem2);
}
void SortContact(struct Contact* stu)
{
qsort(stu, stu->size, sizeof(stu->data[0]), cmp_s);
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
for (int i = 0; i < stu->size; i++)
{
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[i].name,
stu->data[i].age,
stu->data[i].tele,
stu->data[i].sex,
stu->data[i].addres);
}
}
#include "contact.h"
void menu()
{
printf("************************************\n");
printf("******* 通讯录管理系统 *******\n");
printf("************************************\n");
printf("******* 1.ADD *******\n");
printf("******* 2.DELETE *******\n");
printf("******* 3.UPDATE *******\n");
printf("******* 4.READ *******\n");
printf("******* 5.SHOW *******\n");
printf("******* 6.SORT *******\n");
printf("******* 0.EXIT *******\n");
printf("************************************\n");
}
enum option
{
EXIT,
ADD,
DELETE,
UPDATE,
READ,
SHOW,
SORT
};
int main()
{
int input = 0;
struct Contact stu;
InitContact(&stu);
do
{
menu();
printf("请选择操作:");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&stu);
break;
case DELETE:
DeleteContact(&stu);
break;
case UPDATE:
UpdateContact(&stu);
break;
case READ:
ReadContact(&stu);
break;
case SHOW:
ShowContact(&stu);
break;
case SORT:
SortContact(&stu);
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请从新操作:\n");
break;
}
} while (input);
return 0;
}
#include "contact.h"
void InitContact(struct Contact* stu)
{
memset(stu->data, 0, sizeof(stu->data));
stu->size = 0;
}
void AddContact(struct Contact* stu)
{
if (stu->size == MAX)
{
printf("通讯录已满,无法添加信息!\n");
}
else
{
printf("请添加姓名:");
scanf("%s", (stu->data)[stu->size].name);
printf("请添加年龄:");
scanf("%d", &((stu->data)[stu->size].age));
printf("请添加电话:");
scanf("%s", (stu->data)[stu->size].tele);
printf("请添加性别:");
scanf("%s", (stu->data)[stu->size].sex);
printf("请添加地址:");
scanf("%s", (stu->data)[stu->size].addres);
stu->size++;
printf("添加成功\n");
}
}
void ShowContact(const struct Contact* stu)
{
if (stu->size == 0)
{
printf("通讯录为空\n");
}
else
{
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
for (int i = 0; i < stu->size; i++)
{
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[i].name,
stu->data[i].age,
stu->data[i].tele,
stu->data[i].sex,
stu->data[i].addres);
}
}
}
static int FindByName(const struct Contact* stu,char name[nlen] )
{
int i = 0;
for (i = 0; i < stu->size; i++)
{
if (0 == strcmp(stu->data[i].name, name))
{
return i;
}
}
return -1;
}
void DeleteContact(struct Contact* stu)
{
if (stu->size == 0)
{
printf("通讯录为空,无法删除\n");
}
char name[nlen];
printf("请输入要删除信息人的名字:");
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要删除的信息不存在!\n");
}
else
{
for (int j = ret; j < stu->size - 1; j++)
{
stu->data[j] = stu->data[j + 1];
}
stu->size--;
printf("删除成功\n");
}
}
void ReadContact(const struct Contact* stu)
{
printf("请输入要查找信息人的名字:");
char name[nlen];
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要查找的信息不存在\n");
}
else
{
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[ret].name,
stu->data[ret].age,
stu->data[ret].tele,
stu->data[ret].sex,
stu->data[ret].addres);
}
}
void UpdateContact(struct Contact* stu)
{
printf("请输入要该信息人的名字:");
char name[nlen];
scanf("%s", name);
int ret = FindByName(stu, name);
if (ret == -1)
{
printf("您要修改的信息不存在\n");
}
else
{
printf("请添加姓名:");
scanf("%s", (stu->data)[ret].name);
printf("请添加年龄:");
scanf("%d", &((stu->data)[ret].age));
printf("请添加电话:");
scanf("%s", (stu->data)[ret].tele);
printf("请添加性别:");
scanf("%s", (stu->data)[ret].sex);
printf("请添加地址:");
scanf("%s", (stu->data)[ret].addres);
printf("修改成功\n");
}
}
int cmp_s(const void* elem1, const void* elem2)
{
return strcmp((char*)elem1, (char*)elem2);
}
void SortContact(struct Contact* stu)
{
qsort(stu, stu->size, sizeof(stu->data[0]), cmp_s);
printf("%-10s\t%-5s\t%-10s\t%-5s\t%-10s\n", "姓名", "年龄", "电话", "性别", "地址");
for (int i = 0; i < stu->size; i++)
{
printf("%-10s\t%-5d\t%-10s\t%-5s\t%-10s\n",
stu->data[i].name,
stu->data[i].age,
stu->data[i].tele,
stu->data[i].sex,
stu->data[i].addres);
}
}
#include
#include
#include
#define MAX 1000
#define nlen 20
#define tlen 11
#define slen 10
#define alen 10
struct Infor
{
char name[nlen];
int age;
char tele[tlen];
char sex[slen];
char addres[alen];
};
struct Contact
{
struct Infor data[MAX];
int size;
};
void InitContact(struct Contact* stu);
void AddContact(struct Contact* stu);
void ShowContact(const struct Contact* stu);
void DeleteContact(struct Contact* stu);
void ReadContact(const struct Contact* stu);
int FindByName(const struct Contact* stu, char name[nlen]);
void UpdateContact(struct Contact* stu);
void SortContact(struct Contact* stu);
注:此文章是一篇初级版的通讯录管理系统,后续还要对其进行优化处理。