目录
1.函数主体部分
2.结构体的定义
定义一个结构体来实现联系人信息的存放
3.打印菜单
4.枚举函数的定义
5.初始化通讯录
6.实现通讯录功能
1.增加联系人:
2:删除联系人
3.修改联系人
4.查找联系人
5.排序联系人(通过名字排序)
6.查看所有联系人
7.代码总览
第一步先来完成函数的主体部分:
int main()
{
int input = 0;
contacts con;//创建结构体
Initcontacts(&con);//初始化结构体
do
{
menu();
printf("请输入>:");
scanf("%d", &input);
switch(input)
{
case add://增加
Addcontacts(&con);
break;
case delete://删除
Deletecontacts(&con);
break;
case revise://修改
Revisecontacts(&con);
break;
case find://查找
Findcontacts(&con);
break;
case sort://排序
Sortcontacts(&con);
break;
case display://打印
Dispcontacts(&con);
break;
case quit:
printf("已退出程序");
break;
default:
printf("输入错误,请重新输入>:");
}
} while (input);
return 0;
}
typedef struct Peoinfo
{
char name[20];//名字
char gender[5];//性别
int gae;//年龄
char arr[15];//电话
char ress[30];//地址
}peo;
typedef struct Contacts
{
peo data[MAX];//最多能存放多少信息
int size;//用来记录以录入的多少信息
}contacts;
menu()
{
printf("**************************\n");
printf("******1.Add 2.Delete*****\n");
printf("******3.Rent 4.Find*******\n");
printf("******5.Sort 6.Display****\n");
printf("******** 0.Exit ********\n");
printf("**************************\n");
}
菜单里包含了我们所有要实现的功能,供使用者选择.
enum my_em
{
quit,
add,
delete,
revise,
find,
sort,
display
};
上面主函数内部的分支循环 case 中我们输入的字符是为了便于理解,到那一处该实现哪个功能;
void Initcontacts(contacts* pc)
{
assert(pc);
pc->size = 0;
memset(pc->data, 0, sizeof(pc->data));//将通讯录初始化为0个元素
}
增加联系人最初我们要有一个判断如果通讯录的信息已经存放满了将提示:通讯录已满
void Addcontacts(contacts* pc)
{
assert(pc);
if (pc->size == MAX)
{
printf("通讯录已满");
return;
}
else
{
printf("请输入名字>:");
scanf("%s", pc->data[pc->size].name);
printf("请输入性别>:");
scanf("%s", &(pc->data[pc->size].gender));
printf("请输入年龄>:");
scanf("%d", &(pc->data[pc->size].gae));
printf("请输入电话>:");
scanf("%s", pc->data[pc->size].arr);
printf("请输入地址>:");
scanf("%s", &(pc->data[pc->size].ress));
pc->size++;
printf("添加成功!!\n");
}
}
要删除联系人首先我们要通过名字找到对应的联系人,我们先完成一个查找函数来帮我们找到要删除的联系人,为什么要封装成一个查找函数呢?因为我们再后续的查找联系人和修改联系人中也需要找到联系人在进行对应的操作,所以封装一个查找函数也帮我们完成后续的操作做准备.
int Findby(const contacts* pc,char name[20])//查找函数
{
assert(pc);
int i = 0;
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp(pc->data[i].name,name))
return i;//返回查找人对应的下标
}
return -1;//找不到返回-1
}
接下来我们完成删除联系人就会简单很多了:
删除联系人也有一个必要的条件就是你的通讯录里得有联系人,如果通讯录为空就不用继续执行了.
void Deletecontacts(contacts* pc)
{
assert(pc);
char name[20] = { 0 };
int i = 0;
if (pc->size == 0)//判断当前通讯录是否为空
{
printf("当前通讯录为空,无法删除\n");
return;
}
//查找
printf("请输入要删除人的名字>:");
scanf("%s", &name);
int pos = Findby(pc,name);//通过查找函数返回我们想得到的数据
if (pos == -1)//如果为-1则找不到
{
printf("要删除的人不存在\n");
return;
}
//删除
for (i = pos; i < pc->size; i++)//如果找到了我们通过pos返回的联系人的下标
//从后向前覆盖达到了删除的效果
{
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功\n");
}
我们通过覆盖达到了删除的效果,那如果通讯录为满我们要删除他最后一个联系人时又该怎么办呢?其实要删除最后一个联系人的话的确后面没有数据可以覆盖到要删除的目标,其实这里可以不用管他,其实通过size-1后我们就已经访问不到最后一个联系人了,当我们添加新的联系人时也就可以把他覆盖.
完成了增加和删除后后面的思路都大同小异,就不一一介绍了。
void Revisecontacts(contacts* pc)
{
char name[20] = { 0 };
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
printf("请输入被修改人的名字>:");
scanf("%s", &name);
int pos = Findby(pc, name);
if (pos == -1)
{
printf("要修改的人不存在>:");
return;
}
printf("请输入名字>:");
scanf("%s", pc->data[pos].name);
printf("请输入性别>:");
scanf("%s", &(pc->data[pos].gender));
printf("请输入年龄>:");
scanf("%d", &(pc->data[pos].gae));
printf("请输入电话>:");
scanf("%s", pc->data[pos].arr);
printf("请输入地址>:");
scanf("%s", &(pc->data[pos].ress));
printf("修改成功!!\n");
}
oid Findcontacts(const contacts* pc)
{
assert(pc);
char name[20] = { 0 };
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
printf("请输入要查找的名字>:");
scanf("%s", &name);
int pos = Findby(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("查找成功\n");
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
pc->data[pos].name,
pc->data[pos].gender,
pc->data[pos].gae,
pc->data[pos].arr,
pc->data[pos].ress);
}
int compare(const void* e1,const void* e2)
{
return(strcmp(((peo*)e1)->name, ((peo*)e2)->name));
}
void Sortcontacts(contacts* pc)
{
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
else if (pc->size == 1) {
printf("当前通讯录只有一个联系人,不用排序\n");
}
qsort(pc->data,pc->size,sizeof(pc->data[0]),compare);
printf("排序成功\n");
}
排序联系人我们通过qsort来实现排序,qsort所需要的四个参数为: (数组地址(首元素地址),
要排序元素的个数,
数组单个元素的大小(单位为字节),
排序函数(具体可以看qsort的实现));
void Dispcontacts(const contacts* pc)
{
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
int i = 0;
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->size; i++)
{
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].gender,
pc->data[i].gae,
pc->data[i].arr,
pc->data[i].ress);
}
}
整个代码封装为三个部分:
1.test.c(函数主体部分)
#define _CRT_SECURE_NO_WARNINGS
#include"test.h"
menu()
{
printf("**************************\n");
printf("******1.Add 2.Delete*****\n");
printf("******3.Rent 4.Find*******\n");
printf("******5.Sort 6.Display****\n");
printf("******** 0.Exit ********\n");
printf("**************************\n");
}
int main()
{
int input = 0;
contacts con;
Initcontacts(&con);
do
{
menu();
printf("请输入>:");
scanf("%d", &input);
switch(input)
{
case add://增加
Addcontacts(&con);
break;
case delete://删除
Deletecontacts(&con);
break;
case revise://修改
Revisecontacts(&con);
break;
case find://查找
Findcontacts(&con);
break;
case sort://排序
Sortcontacts(&con);
break;
case display://打印
Dispcontacts(&con);
break;
case quit:
printf("已退出程序");
break;
default:
printf("输入错误,请重新输入>:");
}
} while (input);
return 0;
}
2.test.h(函数的头文件以及声明)
#pragma once
#include
#include
#include
#include
#define MAX 1000
typedef struct Peoinfo
{
char name[20];//名字
char gender[5];//性别
int gae;//年龄
char arr[15];//电话
char ress[30];//地址
}peo;
typedef struct Contacts
{
peo data[MAX];//最多能存放多少信息
int size;//用来记录以录入的多少信息
}contacts;
enum my_em
{
quit,
add,
delete,
revise,
find,
sort,
display
};
//初始化通讯录
void Initcontacts(contacts* pc);
//添加联系人
void Addcontacts(contacts* pc);
//查找联系人
void Findcontacts(const contacts* pc);
//删除联系人
void Deletecontacts(contacts* pc);
//打印通讯录
void Dispcontacts(contacts* pc);
//修改联系人
void Revisecontacts(contacts* pc);
//通讯录排序
void Sortcontacts(contacts* pc);
3.game.c(自定义函数的实现部分)
#define _CRT_SECURE_NO_WARNINGS
#include"test.h"
void Initcontacts(contacts* pc)
{
assert(pc);
pc->size = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void Addcontacts(contacts* pc)
{
assert(pc);
if (pc->size == MAX)
{
printf("通讯录已满");
return;
}
else
{
printf("请输入名字>:");
scanf("%s", pc->data[pc->size].name);
printf("请输入性别>:");
scanf("%s", &(pc->data[pc->size].gender));
printf("请输入年龄>:");
scanf("%d", &(pc->data[pc->size].gae));
printf("请输入电话>:");
scanf("%s", pc->data[pc->size].arr);
printf("请输入地址>:");
scanf("%s", &(pc->data[pc->size].ress));
pc->size++;
printf("添加成功!!\n");
}
}
void Dispcontacts(const contacts* pc)
{
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
int i = 0;
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->size; i++)
{
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].gender,
pc->data[i].gae,
pc->data[i].arr,
pc->data[i].ress);
}
}
int Findby(const contacts* pc,char name[20])//查找函数
{
assert(pc);
int i = 0;
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp(pc->data[i].name,name))
return i;
}
return -1;
}
void Deletecontacts(contacts* pc)
{
assert(pc);
char name[20] = { 0 };
int i = 0;
if (pc->size == 0)//判断当前通讯录是否为空
{
printf("当前通讯录为空,无法删除\n");
return;
}
//查找
printf("请输入要删除人的名字>:");
scanf("%s", &name);
int pos = Findby(pc,name);
if (pos == -1)
{
printf("要删除的人不存在\n");
return;
}
//删除
for (i = pos; i < pc->size; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("删除成功\n");
}
void Findcontacts(const contacts* pc)
{
assert(pc);
char name[20] = { 0 };
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
printf("请输入要查找的名字>:");
scanf("%s", &name);
int pos = Findby(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("查找成功\n");
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
pc->data[pos].name,
pc->data[pos].gender,
pc->data[pos].gae,
pc->data[pos].arr,
pc->data[pos].ress);
}
void Revisecontacts(contacts* pc)
{
char name[20] = { 0 };
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
printf("请输入被修改人的名字>:");
scanf("%s", &name);
int pos = Findby(pc, name);
if (pos == -1)
{
printf("要修改的人不存在>:");
return;
}
printf("请输入名字>:");
scanf("%s", pc->data[pos].name);
printf("请输入性别>:");
scanf("%s", &(pc->data[pos].gender));
printf("请输入年龄>:");
scanf("%d", &(pc->data[pos].gae));
printf("请输入电话>:");
scanf("%s", pc->data[pos].arr);
printf("请输入地址>:");
scanf("%s", &(pc->data[pos].ress));
printf("修改成功!!\n");
}
int compare(const void* e1,const void* e2)
{
return(strcmp(((peo*)e1)->name, ((peo*)e2)->name));
}
void Sortcontacts(contacts* pc)
{
assert(pc);
if (pc->size == 0)
{
printf("当前通讯录为空\n");
return;
}
else if (pc->size == 1) {
printf("当前通讯录只有一个联系人,不用排序\n");
}
qsort(pc->data,pc->size,sizeof(pc->data[0]),compare);
printf("排序成功\n");
}
这一期的内容到这里就结束了,感谢大家的浏览,也希望自己今后继续进步早日拿到offer!!