系统中需要实现的功能如下
void menu()
{
printf("|------------------------|\n");
printf("|***** 1.添加联系人 *****|\n");
printf("|***** 2.删除联系人 *****|\n");
printf("|***** 3.查找联系人 *****|\n");
printf("|***** 4.修改联系人 *****|\n");
printf("|***** 5.显示联系人 *****|\n");
printf("|***** 6.排序联系人 *****|\n");
printf("|***** 7.清空联系人 *****|\n");
printf("|***** 0.退出通讯录 *****|\n");
printf("|------------------------|\n");
}
1. 设计联系人类型
#define MAX 100 //联系人数组最大容量
#define MAX_NAME 20 //姓名成员的最大范围
#define MAX_SEX 10 //性别成员的最大范围
#define MAX_TELE 12 //电话成员的最大范围
#define MAX_ADDR 30 //住址成员的最大范围
typedef struct PeoInfo //存储联系人的信息
{
char name[MAX_NAME]; //姓名
int age; //年龄
char sex[MAX_SEX]; //性别
char tele[MAX_TELE]; //电话
char addr[MAX_ADDR]; //住址
}PeoInfo; //PeoInfo 为自定义联系人类型
2. 设计通讯录类型
typedef struct Contact //存储通讯录两个信息
{
PeoInfo data[MAX]; //能存储 100 个联系人的联系人数组 (通讯录)
int count; //记录通讯录当前有几个人的信息
}Contact; //自定义的通讯录类型
代码实现
void empty_contact(Contact* pc) //清空通讯录(初始化通讯录)
{
//将联系人数组(通讯录)内的所有信息初始化为 0
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
代码实现
void add_contact(Contact* pc) //添加联系人
{
assert(pc);
if (MAX == pc->count) //联系人数组存满了
{
printf("通讯录空间不足,无法录入\n");
return;
}
printf("请输入姓名:");
scanf("%s", pc->data[pc->count].name); //name 是数组名,无需取地址
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入性别:");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->data[pc->count].tele);
printf("请输入住址:");
scanf("%s", pc->data[pc->count].addr);
pc->count++; //当前通讯录内联系人个数 + 1
printf("录入成功\n");
system("pause"); //按任意键继续
system("cls"); //清屏
}
实现思路
找到指定联系人
int find_by_name(const Contact* pc, char name[])
{
//该函数在(删除、查找、修改)时需要使用
assert(pc);
for (int i = 0; i < pc->count; i++)
{
if (!strcmp(pc->data[i].name, name))
{
return i; //找到了就返回对应该联系人的对应下标
}
}
return -1; //找不到指定联系人就返回 -1
}
删除指定联系人
void delete_contact(Contact* pc) //删除联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得有元素可删
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
int i = 0;
char name[MAX_NAME] = { 0 };
printf("请输入要删除的联系人:");
scanf("%s", name);
int pos = find_by_name(pc, name); //1.找到指定联系人的下标
if (-1 == pos)
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
for (i = pos; i < pc->count - 1; i++) //2.删除指定联系人
{
pc->data[i] = pc->data[i + 1];
}
pc->count--; //通讯录当前人数 - 1
printf("删除成功\n");
system("pause");
system("cls");
}
实现思路
代码实现
void search_contact(const Contact* pc) //查找联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被查找
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入要查找的联系人:");
scanf("%s", name);
int pos = find_by_name(pc,name); //找到指定联系人的位置
if (-1 == pos)
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
printf("姓名\t年龄\t性别\t电话\t住址\n");
printf("%s\t%d\t%s\t%s\t%s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
system("pause");
system("cls");
}
实现思路
代码实现
void modif_contact(Contact* pc) //修改联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被修改
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入要修改的联系人:");
scanf("%s", name);
int pos = find_by_name(pc, name); //找到指定联系人的位置
if (-1 == pos) //找不到联系人就结束掉函数
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
printf("请输入姓名:"); //找到了就将联系人的信息重新录入一遍
scanf("%s", pc->data[pos].name);
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);
printf("修改成功\n");
system("pause");
system("cls");
}
实现思路
代码实现
void show_contact(const Contact* pc) //显示联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得先由东西可以展示
{
printf("通讯录为空\n");
system("pause"); //按任意键继续
system("cls"); //清屏
return;
}
int i = 0;
printf("姓名\t年龄\t性别\t电话\t住址\n");
for (i = 0; i < pc->count; i++)
{
printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
system("pause");
system("cls");
}
比较函数
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
排序函数
void soft_contact(Contact* pc) //排序联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被排序
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);
printf("排序成功\n");
system("pause");
system("cls");
}
void empty_contact(Contact* pc) //清空联系人
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被清空
{
printf("通讯录已为空\n");
system("pause");
system("cls");
return;
}
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
system("pause"); //按任意键继续
system("cls"); //清屏
}
#include "contact.h"
void menu()
{
printf("|------------------------|\n");
printf("|***** 1.添加联系人 *****|\n");
printf("|***** 2.删除联系人 *****|\n");
printf("|***** 3.查找联系人 *****|\n");
printf("|***** 4.修改联系人 *****|\n");
printf("|***** 5.显示联系人 *****|\n");
printf("|***** 6.排序联系人 *****|\n");
printf("|***** 7.清空联系人 *****|\n");
printf("|***** 0.退出通讯录 *****|\n");
printf("|------------------------|\n");
}
int main()
{
int input = 0;
Contact con; //通讯录
init_contact(&con); //初始化通讯录
do
{
menu();
printf("请选择要进行的操作:");
scanf("%d", &input);
switch (input)
{
case 1:
add_contact(&con); break;
case 2:
delete_contact(&con); break;
case 3:
search_contact(&con); break;
case 4:
modif_contact(&con); break;
case 5:
show_contact(&con); break;
case 6:
soft_contact(&con); break;
case 7:
empty_contact(&con); break;
case 0:
printf("已退出通讯录\n"); break;
default:
printf("选择错误,请重新输入\n"); break;
}
} while (input);
return 0;
}
#include
#include
#include
#include
#define MAX 100 //联系人数组最大容量
#define MAX_NAME 20 //姓名成员的最大范围
#define MAX_SEX 10 //性别成员的最大范围
#define MAX_TELE 12 //电话成员的最大范围
#define MAX_ADDR 30 //住址成员的最大范围
typedef struct PeoInfo //自定义的联系人类型
{
char name[MAX_NAME]; //姓名
int age; //年龄
char sex[MAX_SEX]; //性别
char tele[MAX_TELE]; //电话
char addr[MAX_ADDR]; //住址
}PeoInfo;
typedef struct Contact //存储通讯录两个信息
{
PeoInfo data[MAX]; //能存储 100 个联系人信息的联系人数组 (通讯录)
int count; //记录通讯录当前有几个人的信息
}Contact; //自定义的通讯录类型
void init_contact(Contact* pc); //初始化通讯录
void add_contact(Contact* pc); //添加联系人
void delete_contact(Contact* pc); //删除联系人
void show_contact(const Contact* pc); //显示联系人
void search_contact(const Contact* pc); //查找联系人
void modif_contact(Contact* pc); //修改联系人
void soft_contact(Contact* pc); //排序联系人
void empty_contact(Contact* pc); //清空联系人
#include "contact.h"
//初始化通讯录
void init_contact(Contact* pc)
{
//将联系人数组(通讯录)内的所有信息初始化为 0
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
//添加联系人
void add_contact(Contact* pc)
{
assert(pc);
if (MAX == pc->count) //联系人数组存满了
{
printf("通讯录空间不足,无法录入\n");
system("pause");
system("cls");
return;
}
printf("请输入姓名:");
scanf("%s", pc->data[pc->count].name); //name 是数组名,无需取地址
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入性别:");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->data[pc->count].tele);
printf("请输入住址:");
scanf("%s", pc->data[pc->count].addr);
pc->count++; //当前通讯录内联系人个数 + 1
printf("录入成功\n");
system("pause"); //按任意键继续
system("cls"); //清屏
}
//显示联系人
void show_contact(const Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得先由东西可以展示
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
int i = 0;
printf("姓名\t年龄\t性别\t电话\t住址\n");
for (i = 0; i < pc->count; i++)
{
printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
system("pause"); //按任意键继续
system("cls"); //清屏
}
//寻找指定联系人的位置
int find_by_name(const Contact* pc, char name[])
{
//该函数在(删除、查找、修改)时需要使用
assert(pc);
for (int i = 0; i < pc->count; i++)
{
if (!strcmp(pc->data[i].name, name))
{
return i;//找到了就返回对应联系人的数组下标
}
}
return -1;
}
//删除联系人
void delete_contact(Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得有元素可删
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
int i = 0;
char name[MAX_NAME] = { 0 };
printf("请输入要删除的联系人:");
scanf("%s", name);
int pos = find_by_name(pc, name); //1.找到指定联系人的下标
if (-1 == pos)
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
for (i = pos; i < pc->count - 1; i++) //2.删除指定联系人
{
pc->data[i] = pc->data[i + 1];
}
pc->count--; //通讯录当前人数 - 1
printf("删除成功\n");
system("pause");
system("cls");
}
//查找联系人
void search_contact(const Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被查找
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入要查找的联系人:");
scanf("%s", name);
int pos = find_by_name(pc,name); //找到指定联系人的位置
if (-1 == pos)
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
printf("姓名\t年龄\t性别\t电话\t住址\n");
printf("%s\t%d\t%s\t%s\t%s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
system("pause");
system("cls");
}
//修改联系人
void modif_contact(Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被修改
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入要修改的联系人:");
scanf("%s", name);
int pos = find_by_name(pc, name); //找到指定联系人的位置
if (-1 == pos) //找不到联系人就结束掉函数
{
printf("没有指定联系人\n");
system("pause");
system("cls");
return;
}
printf("请输入姓名:"); //找到了就将联系人的信息重新录入一遍
scanf("%s", pc->data[pos].name);
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);
printf("修改成功\n");
system("pause");
system("cls");
}
int cmp_by_name(const void* e1, const void* e2)
{
//按照名字来比较
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//排序联系人
void soft_contact(Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被排序
{
printf("通讯录为空\n");
system("pause");
system("cls");
return;
}
qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);
printf("排序成功\n");
system("pause");
system("cls");
}
//清空联系人
void empty_contact(Contact* pc)
{
assert(pc);
if (0 == pc->count) //通讯录内得先有人可被清空
{
printf("通讯录已为空\n");
system("pause");
system("cls");
return;
}
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
system("pause"); //按任意键继续
system("cls"); //清屏
}