之前介绍了结构体,这次用结构体来实现一个通讯录
通讯录的功能如下:
1.通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
2.可以对联系人的信息进行增删改查的操作,以及显示所有联系人的信息
3.可以对联系人进行排序(以名字进行排序)
还是和之前写过的井字棋和扫雷的小游戏一样,依旧是有三个文件,contact.h声明函数,contact.c实现函数,test.c进行测试,那就开始吧
目录
1.创建菜单
2.添加联系人
3.查找联系人
4.显示所有联系人的信息
5.通讯录进行排序
6.修改联系人信息
7.删除联系人
1.创建菜单
通讯录开始显示一个菜单,菜单展示通讯录的各种功能,然后使用者进行选择,如图:
使用者输入数字进入对应的功能,选择0的时候提示退出,输入的数字不再范围内提示输入错误
依旧是使用do...while循环和switch语句来实现,代码如下:
//contact.h文件 #include#define NAME 20 #define SEX 5 #define ADDRESS 30 #define TELE 15 #define NUMS 1000 typedef struct information //个人信息的结构体 { char name[NAME]; int age; char sex[SEX]; char address[ADDRESS]; char tele[TELE]; }information; typedef struct Contact //通讯录结构体 { information data[NUMS];//存储联系人信息 int count;//记录人数,同时在访问时也可作为下标 }contact; //初始化通讯录 void InitContact(contact* pc); //contact.c文件 void InitContact(contact* pc)//初始化通讯录 { assert(pc); pc->count = 0; memset(pc->data, 0, sizeof(pc->data));//memste修改制定位置的内容,从数组data首元素地址开始到数组末尾结束全部改成0 } //test.c文件 void menu() { printf("+++++++++++++++++++++n"); printf("++ 1.add 2.del ++n"); printf("++ 3.find 4.mod ++n"); printf("++ 5.show 6.sort ++n"); printf("++++ 0.exit +++++n"); } enum Oprion { EXIT,//0 ADD, DEL, FIND, MOD, SHOW, SORT }; int main() { int input = 0; contact con = { 0 }; InitContact(&con);//进入循环前将通讯录初始化 do { menu(); printf("选择功能:"); scanf("%d", &input); switch (input) { case ADD: break; case DEL: break; case FIND: break; case MOD: break; case SORT: break; case SHOW: break; case EXIT: { printf("退出通讯录n"); break; } default: { printf("你是不是瞎n"); break; } } } while (input); return 0; }
下面就是具体功能的实现
2.添加联系人
首先,函数功能是添加联系人的信息,所以不需要返回任何数据,传参则采用传址的方式,在添加新的联系人之前要判断通讯录空间是否足够,代码如下:
//contact.h文件
void AddContact(contact* pc);
//contact.c文件
void AddContact(contact* pc)//添加联系人
{
assert(pc);
if (pc->count == NUMS)
{
printf("通讯录已满");
return;
}
else
{
//输入联系人的信息
printf("请输入名字:");
scanf("%s", pc->data[pc->count].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].address);
pc->count++;
printf("添加成功n");
}
}
3.查找联系人
输入联系人名字,通讯录会查找联系人。如果有,输出联系人的信息,没有则提示没找到此人
代码如下:
//contact.h文件
void FindContact(contact* pc,char name[]);
// contact.c文件
void FindContact(contact* pc,char name[])//寻找联系人信息
{
assert(pc);//进入循环前确认pc指向的是否为NULL
int i = 0;
for (i = 0; i < pc->count; ++i)
{
if (strcmp(pc->data[i].name, name) == 0)
{
printf("%-10st%-5st%-5st%-13st%-20sn", "名字", "年龄", "性别", "电话", "地址");
printf("%-10st%-5dt%-5st%-13st%-20sn",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].address);
break;
}
}
if (i == pc->count)
printf("查无此人n");
}
4.显示所有联系人的信息
这个函数实现较容易,就不详细讲了,代码如下:
//contact.h文件
void ShowContact(const contact* pc);//显示联系人信息
//contact.c文件
void ShowContact(const contact* pc)
{
assert(pc);
int i = 0;
printf("%-10st%-5st%-5st%-13st%-20sn", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i count; i++)
{
printf("%-10st%-5dt%-5st%-13st%-20sn",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].address);
}
}
5.通讯录进行排序
排序采用qsort函数来完成,我们要写的是比较大小的函数,如果你对qsort函数不了解的话,可以去看我的这篇博客:qsort函数的使用和模拟实现_鹰不泊wyk的博客-CSDN博客
我们是按照名字来进行排序的,所以函数内比较大小的话参数要改成char*类型,而在创建联系人信息的结构体的时候,我已经将名字放在首位,这样保证是按照 名字来排序的
比较大小的函数代码如下:
//contact.h文件
int compare(const void* p1, const void* p2);
//contact.c文件
int compare(const void* p1, const void* p2)
{
return *((char*)p1) - *((char*)p2);
}
6.修改联系人信息
输入名字,通讯录进行查找,找到提示输入新的信息,没找到提示没有此人,代码如下:
//contact.h文件
void ModContact(contact* pc, char name[]);
//contact.c文件
void ModContact(contact* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; ++i)
{
if (strcmp(pc->data[i].name, name) == 0)
{
printf("请输入名字:");
scanf("%s", pc->data[i].name);
printf("请输入年龄:");
scanf("%d", &(pc->data[i].age));
printf("请输入性别:");
scanf("%s", pc->data[i].sex);
printf("请输入电话:");
scanf("%s", pc->data[i].tele);
printf("请输入地址:");
scanf("%s", pc->data[i].address);
printf("修改成功n");
break;
}
}
if (i == pc->count)
printf("查无此人");
}
7.删除联系人
在删除联系人之前首先判断通讯录是否为空,然后是进行查找,找到联系人就删除,删除采用后面的数据覆盖前面的数据的形式,没有提示没找到
在删除联系人函数之前再创建一个函数,用于找联系人,找到返回下标,没找到返回-1,用这个函数的返回值作为是否查找到联系人的依据
代码如下:
//contact.h文件
int FindName(const contact* pc, char name[]);
void DeleteContact(contact* pc,char name[]);
//contact.c文件
int FindName(const contact* pc, char name[])//找姓名,找到返回下标值,找不到返回-1
{
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DeleteContact(contact* pc,char name[])
{
if (pc->count == 0)
{
printf("空通讯录n");
return;
}
int i = 0;
i = FindName(pc, name);
if (i == -1)
{
printf("查无此人n");
return;
}
else
{
int j = 0;
for (j = i; j < pc->count - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->count--;
printf("删除成功n");
}
}
通讯到这就基本写完,来看看具体的功能:
完



