目录
一、需要实现的功能
1.1 类型和结构体的定义
二、拆分代码
2.1 游戏菜单
2.1.1 函数调用
2.1.2 函数体的实现
2.1.2运行效果
2.2 初始化结构体
2.2.1 函数调用
2.2.2 函数体的实现
2.2.3 运行结果
2.3 添加联系人信息
2.3.1 函数调用
2.3.2 函数体的实现
2.3.3 运行结果
2.3 删除指定联系人信息
2.3.1 函数调用
2.3.2 函数体的实现
2.3.3 运行结果
2.4 查找指定联系人信息
2.4.1 函数调用
2.4.2 函数体的实现
2.4.3 运行结果
2.5 修改指定联系人信息
2.5.1 函数调用
2.5.2 函数体的实现
2.5.3 运行结果
2.6 显示所有联系人信息
2.6.1 函数调用
2.6.2 函数体的实现
2.6.3 运行结果
2.7 以名字排序所有联系人
2.7.1 函数调用
2.7.2 函数体的实现
2.7.3 运行结果
2.8 清空所有联系人
2.8.1 函数调用
2.8.2 函数体的实现
2.8.3 运行结果
2.9 通讯录的逻辑(主函数)
三、 完整代码
3.1 contact.h(函数的声明)
3.2 contact.c(函数的实现)
3.3 test.c(测试通讯录的逻辑)
END.
通讯录和三子棋,扫雷都是用三个模块来实现
test.c(测试通讯录的逻辑) contact.c(函数的实现) contact.h(函数的声明)
一、需要实现的功能
- 可以添加1000个联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 以名字排序所有联系人
- 清空所有联系人
1.1 类型和结构体的定义
个人信息包括:姓名,年龄,性别,电话,地址
C语言中没有能够表示个人信息的类型,需要定义结构体类型来实现
通讯录需要能够存放1000个人,可以用一个结构体数组来实现
还需要一个整型来记录存了几个人
我们可以把个人信息和记录数字的整型,组合成一个结构体,方便我们使用
定义数组大小并没有用数字直接定义,而是用宏定义实现
这样我们后期如果需要更改数组大小只需要修改一次
contact,peoInfo,sz的关系
二、拆分代码
2.1 游戏菜单
2.1.1 函数调用
2.1.2 函数体的实现
菜单就是用peintf语句实现
2.1.2运行效果
2.2 初始化结构体
结构体中的sz是记录联系人的个数,如果我们不将它初始化,他里面存放的是随机值,这样在增加联系人时+1,就没有任何意义了。
2.2.1 函数调用
2.2.2 函数体的实现
2.2.3 运行结果
2.3 添加联系人信息
2.3.1 函数调用
参数是通讯录的地址也就是包含个人信息和记录个数的结构体
2.3.2 函数体的实现
2.3.3 运行结果
2.3 删除指定联系人信息
2.3.1 函数调用
2.3.2 函数体的实现
判断姓名是否一样的函数,在查找修改中都会使用,封装成函数更加方便
2.3.3 运行结果
2.4 查找指定联系人信息
2.4.1 函数调用
2.4.2 函数体的实现
2.4.3 运行结果
2.5 修改指定联系人信息
2.5.1 函数调用
2.5.2 函数体的实现
2.5.3 运行结果
2.6 显示所有联系人信息
2.6.1 函数调用
2.6.2 函数体的实现
2.6.3 运行结果
2.7 以名字排序所有联系人
2.7.1 函数调用
2.7.2 函数体的实现
2.7.3 运行结果
2.8 清空所有联系人
2.8.1 函数调用
2.8.2 函数体的实现
2.8.3 运行结果
2.9 通讯录的逻辑(主函数)
枚举的验证
枚举可以改变值
三、 完整代码
3.1 contact.h(函数的声明)
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define NAME_MAX 20 //存放姓名的数组大小
#define SEX_MAX 6 //存放性别的数组大小
#define TELE_MAX 12 //存放电话的数组大小
#define ADDRESS_MAX 20 //存放地址的数组大小
#define DATA_MAX 1000 //存放个人信息的数组大小
enum c
{
EXIT,
ADD,
DEL,
SEARCH,
MOD,
PRINT,
SORT,
EMPTY,
};
typedef struct peoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char address[ADDRESS_MAX];
}peoInfo;
//静态contact
typedef struct contact
{
peoInfo data[DATA_MAX];//存放个人信息
int sz;//记录有几个人的信息
}contact;
//初始化
void InitContact(contact* pc);
//增加信息
void AddContact(contact* pc);
//打印通讯录
void PrintContact(contact* pc);
//删除联系人
void DelContact(contact* pc);
//查找联系人
void SearchContact(contact* pc);
//修改联系人
void ModContact(contact* pc);
//清空联系人
void EmptyContact(contact* pc);
//联系人排序
void SortContact(contact* pc);
3.2 contact.c(函数的实现)
#include"contact.h"
//初始化
void InitContact(contact* pc)
{
assert(pc);
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
//增加信息
void AddContact(contact* pc)
{
if (pc->sz == DATA_MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
assert(pc);
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].address);
pc->sz++;
printf("添加成功\n");
}
//打印通讯录
void PrintContact(contact* pc)
{
assert(pc);
int i = 0;
printf("%-10s %-5s %-6s %-12s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s %-5d %-6s %-12s %-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].address);
}
printf("\n");
}
//判断名字是否一致
int Find_Name(contact* pc, char* name)
{
assert(pc&&name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//删除联系人
void DelContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入需要删除人的姓名\n");
scanf("%s", name);
//找到返回坐标,没找到返回0.
int pos = Find_Name(pc, name);
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");
PrintContact(pc);
}
}
//查找联系人
void SearchContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入查找人的姓名\n");
scanf("%s", name);
//找到返回坐标,没找到返回0.
int pos = Find_Name(pc, name);
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
printf("找到联系人\n");
printf("%-10s %-5s %-6s %-12s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-10s %-5d %-6s %-12s %-15s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tele, pc->data[pos].address);
}
}
//修改联系人
void ModContact(contact* pc)
{
assert(pc);
char name[NAME_MAX];
if (pc->sz == 0)
{
printf("通讯录没有联系人\n");
return;
}
printf("输入需要修改联系人的姓名->");
scanf("%s", name);
int pos = Find_Name(pc, name);
if (pos == -1)
{
printf("没有找到要删除的联系人\n");
}
else
{
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].address);
printf("修改成功\n");
//修改完后,打印一下子
PrintContact(pc);
}
}
//清空联系人
void EmptyContact(contact* pc)
{
assert(pc);
char q =0;
printf("你确定要清空所有联系人吗?(Y/N)\n");
getchar();
scanf("%c", &q);
if (q=='Y')
{
int i = 0;
for (i = pc->sz - 1; i > 0; i--)
{
pc->data[i - 1] = pc->data[i];
pc->sz--;
}
if (pc->sz == 1)
{
pc->sz--;
}
//打印
printf("清空联系人\n");
PrintContact(pc);
}
else
{
printf("取消清空联系人\n");
return;
}
}
//qsort排序
int con_name(const void* e1, const void* e2)
{
return (strcmp(((contact*)e1)->data->name , ((contact*)e2)->data->name));
}
//联系人排序
void SortContact(contact* pc)
{
assert(pc);
qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);
//打印
printf("排序完成\n");
PrintContact(pc);
}
3.3 test.c(测试通讯录的逻辑)
#include"contact.h"
void menu()
{
printf("-------------------------------\n");
printf("-------1.add 2.del---------\n");
printf("-------------------------------\n");
printf("-------3.search 4.mod---------\n");
printf("-------------------------------\n");
printf("-------5.print 6.sort--------\n");
printf("-------------------------------\n");
printf("-------7.empty 0.exit--------\n");
printf("-------------------------------\n");
}
void test()
{
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 PRINT:
//打印通讯录
PrintContact(&con);
break;
case SORT:
//联系人排序
SortContact(&con);
break;
case EMPTY:
//清空联系人
EmptyContact(&con);
break;
case EXIT:
printf("退出程序。\n");
break;
default:
printf("输入错误,请重新选择。\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
END.
虽然,通讯录的功能都已经实现。但还是没有那么完美,本次能够存放1000个人的信息,但存不下1001个人的信息。只存放1个人的信息,但空间开辟了1000个,就会造成空间的极大浪费,所以还是有比较大的缺陷。
如果空间能够动态开辟,就能完美解决这个问题,欲知后事如何,且听下回分解。
最后把这句话送给大家:
Victory won‘t come to me unless I go to it.
胜利是不会向我们走来的,我必须自己走向胜利。