目录
思维导图:
编辑
一,实现通讯录的第一步——实现逻辑
二,头文件内实现的内容
三,contect.c文件内的函数定义
3.1初始化通讯录:void InitContect(cotect*pc)
3.2:实现通讯录内容的增加:void AddContect(Contect* pc)
3.3:实现对通讯录的内容进行显示:void ShowContect(Contect* pc)
3.4对通讯录内的指定信息进行删除:void DelContect(Contect* pc)
3.5 实现对通讯录内人的信息的修改:void ModifyContect(Contect* pc)
3.6查找联系人:void SearchContect(Contect* pc)
3.7排序联系人 :void SortContect(Contect* pc)
3.8contect.c内最特殊的函数
1.1打印菜单
实现位置:test.c
实现函数:menu()
返回类型:void
作用:将通讯录可以实现的功能显示出来供使用对象选择
代码:
void menu() {
printf("*****1.ADD 2.DEL *****\n");
printf("*****3.SEARCH 4.MODIFY *****\n");
printf("*****5.SHOW 6.SORT *****\n");
printf("***** 0.EXIT *****\n");
}
1.2:通讯录功能实现逻辑
实现位置:test.c
enum {
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
int main() {
Contect* con;
InitContect(&con);//初始化通讯录
int input = 0;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case ADD:
AddContect();//添加通讯录的个人信息
break;
case DEL:
DelConteCt();//删除通讯录内的信息
break;
case SEARCH:
SearchContect();//查找通讯录的个人信息
break;
case MODIFY:
ModifyContect();//修改通讯录里的个人信息
break;
case SHOW:
ShowContect();//显示通讯录内的信息
break;
case SORT:
SortCpntect();//排序通讯录内的信息
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (input);
}
小细节❗:
在实现switch……case语句时,我没有使用数字。原因是因为使用了enum关键字。
enum也就是枚举,会把它里面的第一个第一个参数标记为0,其它的参数在这个基础
之上按顺序加1。在我们的例子中,EXIT就表示0,ADD表示1,DEL表示为2……以此类推
实现位置:contect.h
其实头文件内部实现的内容无非就是各种函数的声明,我在这里也就不一 一介绍了,但是在这里着重介绍下面的内容。
宏定义最大值,以及通讯录内容的定义:
通讯录的内容:
1.人的信息:
名字,年龄,性别,电话,住址
2.是第几个人
代码:
#define MAX_sz 100
#define MAX_name 5
#define MAX_age 5
#define MAX_sex 5
#define MAX_Tele 12
#define MAX_address 20
typedef struct PeoInfo {
char name[MAX_name];
int age[MAX_age];
char sex[MAX_sex];
char tele[MAX_Tele];
char address[MAX_address];
} PeoInfo;
typedef struct Contect {
PeoInfo data[MAX_data];
int sz;
}Contect ;
❗细节❗:
1.在这里使用宏定义的作用是为了后面方便修改结构体PeoInfo内的数组的大小
2.使用typedef的作用是对结构体进行重命名来方便使用结构体变量
contect.c函数可谓是我们整个通讯录实现工程的重头戏了,
现在让我们把目光放到contect.c内部详细讲解这个文件内定义的函数。
实现的功能:将通讯录内的内容初始化为0
代码:
Init(Contect* pc) {
int sz = 0;//将sz初始化为0
memset(pc->data, 0, sizeof(pc->data));//使用memset函数来对data进行初始化为0
};
知识补充:memset()
三个参数:
1. 要改变的数据的起始地址:pc->data
2.你想要改变为的值:0
3.你要改变的数据的字节大小:sizeof(pc->data)//sizeof(数组名)表示整个数组的大小
实现功能:对通讯录进行内容的填充
实现条件:在通讯录的空间还没有满
代码:
void AddContect(Contect* pc) {
if (pc -> sz < MAX_data) {
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");
}
else {
printf("通讯录已满\n");
}
}
实现功能:对通讯录的内容进行容易看懂的展示
代码:
void ShowContect(Contect* pc) {
printf("%-10s%-5s%-5s%-20s%-5s\n",
"名字","年龄","性别","电话","住址");
int i = 0;
while (i < pc->sz) {
printf("%-10s%-5d%-5s%-20s%-5s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
i++;
}
}
实现功能:对指定的联系人的信息的删除。
代码:
Find_By_Name(Contect* pc) {
char name[20];
printf("请输入你要删除的人的名字:>");
scanf("%s", name);
int i = 0;
for (i = 0;i < pc->sz;i++) {
if (strcmp(name, pc->data[i].name)==0)
return i;
}
return -1;
}
void DelContect(Contect* pc) {
int pos = 0;
int i = 0;
pos = Find_By_Name(pc);
if (pos == -1) {
printf("要删除的人的信息不存在\n");
return;
}
for (i = pos;i < pc->sz - 1;i++) {
pc->data[pos] = pc->data[pos + 1];
}
printf("删除成功!\n");
pc->sz--;
}
实现方法:通过一个Find_By_Name函数来对要查找的人的信息进行定位,找到了就返回该信息的下标,找不到就返回-1。在找到该成员下标的前提下,通过该下标后面的人的信息覆盖前面人的信息的方法来达到删除的目的。
实现功能:对你所不满的人的信息进行修改
代码:
void ModifyContect(Contect* pc) {
printf("请输入要修改人的名字:>");
int pos = Find_By_Name(pc);
if (pos == -1) {
printf("找不到要修改的联系人\n");
return;
}
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].addr);
printf("修改联系人成功\n");
}
}
实现方法:通过Find_By_Name函数来找到要修改的人的下标,然后返回这个下标。如果这个下标是-1那就输出找不到这个联系人的信息结束进程。如果不是-1那就通过下标来对指定联系人的信息进行逐个修改。
实现功能:找到联系人的信息并将他的信息显示出来。
代码:
void SearchContect(Contect* pc) {
int pos = 0;
printf("请输入要查找的人的信息:>");
pos = Find_By_Name(pc);
if (pos == -1) {
printf("要查找的人的信息不存在\n");
return;
}
else {
printf("%-10s%-5s%-5s%-20s%-5s\n",
"名字", "年龄", "性别", "电话", "住址");
printf("%-10s%-5d%-5s%-20s%-5s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
实现方法:通过Find_By_Name函数对想要查找的联系人的信息进行查找,定位下标。找到了便对该下标对应的信息进行打印显示。找不到就打印提示信息。
实现功能:对通讯录的内容进行排序
代码:
int cmp_By_Name(void* e1, void* e2) {
return strcmp(((Contect*)e1)->data->name , ((Contect*)e2)->data->name);
}
void SortContect(Contect* pc) {
qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_By_Name);
printf("排序成功\n");
}
实现方法:运用qsort函数来对通讯录里的内容进行排序。现在排的是升序,如果你想要拍成降序只需要将cmp_By_Name内的两个参数交换一下位置就可以了。在这里也要注意,比较按照名字来排序也就是需要比较字符串,所以在比较时需要使用strcmp函数来进行比较。
在这个文件里最特殊的函数便是Find_By_Name()这个函数。这个函数特殊的点在于它是没有在头文件里面声明的,因为这个函数只需要在contect.c文件里面使用。所以为了使这个函数能更加隐蔽,我们可以在Find_By_Name这个函数的前面加上一个static关键字。
static Find_By_Name(const Contect* pc) {
char name[20];
scanf("%s", name);
int i = 0;
for (i = 0;i < pc->sz;i++) {
if (strcmp(name, pc->data[i].name)==0)
return i;
}
return -1;
}
今天分享完毕!