对于通讯录中的每一个成员,有姓名、年龄、电话等信息,所以可以通过结构体实现通讯录。
通讯录的功能如下:
1.可以保存自定义最大数量人的信息:年龄(age)、性别(sex)、姓名(name)、地址(addr)、电话(tele).
2.可以对存储的信息进行增删查改,排序和打印。
对代码进行分块处理,包括test.c的测试文件,contact.c的函数实现文件,contact.c的声明文件
contact.h头文件
#define MAX 10000
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_ADDR 30
#define MAX_TELE 20
#define INIAT 3
typedef struct peoinof
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char addr[MAX_ADDR];
char tele[MAX_TELE];
}peoinof;
typedef struct contact
{
peoinof* data;
int sz;//当前的元素个数
int capacity;//最大元素个数
}contact;
void Initcontact(contact* pc);//初始化函数
void addcontact(contact* pc);//增加信息函数
void delcontact(contact* pc);//删除信息函数
void showcontact(const contact* pc);//打印信息函数
void modifycontact(contact* pc);//修改信息函数
void sortcontact(contact*pc);//排序函数
void seachcontact(contact* pc);//查找信息函数
text.c函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include"test.h"
enum Oprion
{
EXIT,//0
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
SHOW
};
void meau1()
{
printf("********************************\n");
printf("********************************\n");
printf("***1.add 2.del ***********\n");
printf("***3.seacher 4.modify ********\n");
printf("***5.sort 6.show **********\n");
printf("*** 0.exit **********\n");
printf("********************************\n");
printf("********************************\n");
}
int main()
{
int input = 0;
contact con = { 0 };//创建通讯录
Initcontact(&con);//初始化
do
{
meau1();
printf("请选择\n");
scanf("%d", &input);
switch (input)
{
case ADD:
addcontact(&con);
break;
case DEL:
delcontact(&con);
break;
case SEARCH:
seachcontact(&con);
break;
case MODIFY:
modifycontact(&con);
break;
case SORT:
sortcontact(&con);
break;
case SHOW:
showcontact(&con);
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
contact.c文件
1.初始化通讯录
void Initcontact(contact* pc)
{
assert(pc);
pc->sz = 0;
peoinof* tmp = (peoinof*)malloc(sizeof(peoinof) * INIAT);
if (tmp!=NULL)
{
pc->data = tmp;
}
else
{
printf("Initcontact()::%s\n", strerror(errno));
return;
}
pc->capacity = INIAT; //通讯录初始存储最大联系人数量
}
2.增加联系人函数
增加联系人的时候,需要考虑已经有的人数和最大人数的关系,所以可以通过checkcontact函数判断
void checkcontact(contact* con)
{
assert(con);
if (con->sz==con->capacity)
{
peoinof* tmp = (peoinof*)realloc(con->data, sizeof(peoinof) * (con->capacity + 2));
if (tmp != NULL)
{
con->data = tmp;
printf("增容成功\n");
}
else
{
printf("cheackcontact():: %s\n", strerror(errno));
}
}
}
void addcontact(contact*pc)
{
assert(pc);
checkcontact(pc);
if (pc->sz ==MAX)
{
printf("通讯录满了,无法添加信息\n");
return;
}
printf("请输入添加的姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入添加的年龄:\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入添加的性别:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入添加的地址:\n");
scanf("%s", pc->data[pc->sz].addr);
printf("请输入添加的电话:\n");
scanf("%s", pc->data[pc->sz].tele);
pc->sz++;
printf("联系人添加成功\n");
}
3.删除联系人函数
删除联系人信息时,是通过核对姓名进行删除。所以还需要一个查找姓名的函数。如果能在通讯录中找到,就返回对于的下标,如果没有找到就返回-1;
int findname(const contact* pc,char name[])
{
for (int i = 0; i <pc->sz; i++)
{
if (strcmp(pc->data[i].name,name)==0)
{
return i;
}
}
return -1;
}
void delcontact(contact* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通讯录没有信息,无法删除\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入要删除人的姓名:\n");
scanf("%s", name);
int key = findname(pc, name);
if (key == -1)
{
printf("没有想删除的信息\n");
return;
}
else
{
for (int i = key; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
}
4.查找联系人信息
通过遍历通讯录,找到和联系人姓名相同的人的信息
void seachcontact(contact* pc)
{
assert(pc);
printf("请输入查找人的姓名:\n");
char name[MAX_NAME] = { 0 };
scanf("%s", name);
int key=findname(pc, name);
if (key == -1)
printf("查找人不存在\n");
else
{
printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-10s\t%-5d\t%-5s\t%-13s\t%-20s\n",
pc->data[key].name, pc->data[key].age, pc->data[key].sex, pc->data[key].tele, pc->data[key].addr);
}
}
5.修改联系人信息函数
void modifycontact(contact* pc)
{
assert(pc);
printf("请输入修改人的姓名\n");
char name[MAX_NAME] = { 0 };
scanf("%s", name);
int key = findname(pc, name);
if (key == -1)
{
printf("修改人不存在\n");
}
else
{
printf("请输入添加的姓名:\n");
scanf("%s", pc->data[key].name);
printf("请输入添加的年龄:\n");
scanf("%d", &pc->data[key].age);
printf("请输入添加的性别:\n");
scanf("%s", pc->data[key].sex);
printf("请输入添加的地址:\n");
scanf("%s", pc->data[key].addr);
printf("请输入添加的电话:\n");
scanf("%s", pc->data[key].tele);
printf("修改成功\n");
}
}
6.打印通讯录信息函数
void showcontact(const contact* pc)
{
assert(pc);
int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-13s\t%-20s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
7.排序函数
排序有两种排序方法,一种是联系人的姓名,一种是联系人的年龄。
enum chose
{
EXIT,
NAME,
AGE
};
void meau2()
{
printf("******************************\n");
printf("****1.name 2.age *****\n");
printf("****0.exit ******************\n");
printf("******************************\n");
}
int cmp_name(const void* e1, const void* e2)
{
assert(e1 && e2);
return strcmp(((peoinof*)e1)->name, ((peoinof*)e2)->name);
}
int cmp_age(const void* e1, const void* e2)
{
assert(e1 && e2);
if (((peoinof*)e1)->age == ((peoinof*)e2)->age)
return 0;
else if (((peoinof*)e1)->age > ((peoinof*)e2)->age)
return 1;
else
return -1;
}
void sortcontact(contact* pc)
{
assert(pc);
int input = 0;
meau2();
printf("请选择排序方式\n");
scanf("%d", &input);
switch (input)
{
case NAME:
qsort(pc->data, pc->sz, sizeof(peoinof), cmp_name);
break;
case AGE:
qsort(pc->data, pc->sz, sizeof(peoinof), cmp_age);
break;
case EXIT:
printf("退出选择\n");
break;
default:
printf("选择错误\n");
break;
}
}
运行结果