今天我要介绍的是通讯录的实现(c语言)
首先先简单说一下思路吧。
一共需要三个文件分别为test.c(测试通讯录),contact.h(所需函数及头文件),contact.c(通讯录功能实现).因为通讯录存放的每个人的信息有:姓名,电话,年龄,性别,住址等信息。因此我们采用结构体来存放这些信息例如:
struct peop
{
char name[MAX_NAME];
char sex[MAX_SEX];
char phone_num[MAX_PHONE_NUM];
int age;
char home[MAX_HOME];
};
但这样虽然有了信息但是不能放入多个人的信息,所以我们还需要一个结构体去存放每一个人的信息并且记录这个人是第几个人。
struct contact
{
struct peop data[MAX];
int sz;
};
而我们也可以将数组中的数字define一下
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_PHONE_NUM 12
#define MAX_HOME 30
在建立好结构体之后我们就要开始代码的编写了。
首先我们先将我们的结构体中的成员初始化
//初始化
void initializecon(struct contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, MAX*sizeof(struct peop));
}
其次我们应该有一个菜单去表示出我们有些什么功能
void menu()
{
printf("********************************\n");
printf("******1.add 2.cut *********\n");
printf("******3.find 4.exchange*******\n");
printf("******5.show 6.sort ********\n");
printf("******0.quit********************\n");
printf("********************************\n");
}
现在我们应该在test.c中开始编写main函数,因为test.c是测试功能的所以我们应该用do while循环(无论如何通讯录都会执行一次),在do while中我们加入switch语句用来选择通讯录功能。
int main()
{
int a = 0;
struct contact con;
initializecon(&con);//初始化
printf("请选择:\n");
do
{
menu();
scanf("%d", &a);
switch (a)
{
case 1:
Addpeop(&con);
break;
case 2:
Cutpeop(&con);
break;
case 3:
Findpeop(&con);
break;
case 4:
Exchangepeop(&con);
break;
case 5:
Showpeop(&con);
break;
case 6:
Sortpeop(&con);
break;
case 0:
break;
default:
break;
}
} while (a);
return 0;
}
在上述条件完成之后我们就应该开始功能的实现了。
添加联系人:
在我们传入&con后我们先应该判断一下通讯录有没有满,再进行添加联系人。并且再每添加一位联系人之后我们应该让sz++以便于计数。
void Addpeop(struct contact* pc)
{
if(pc->sz == MAX)
{
printf("通讯录已满!无法存放联系人!");
}
else
{
printf("请输入联系人信息\n");
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
printf("成功增加联系人\n");
}
pc->sz++;
}
删除联系人:
在删除联系人之前我们要先查找该联系人是否存在,再进行删除操作。删除操作应该在查找到想要删除的联系人后,将该联系人的sz返回用后一位的联系人覆盖掉想要删除的联系人就好。(在for循环时循环数应小于sz-1,不然数组会越界)
static int find_peop(struct contact* pc,char name[])
{
int i = 0;
int ret = 0;
for(i;i<pc->sz;i++)
{
if(0 == strcmp(pc->data[i].name,name))
{
return i;
}
}
return -1;
}
void Cutpeop(struct contact* pc)
{
char cut_name[MAX_NAME];
printf("请输入要删除的联系人");
scanf("%s", &cut_name);
int ret = find_peop(pc, cut_name);
if(ret == -1)
{
printf("想要删除的联系人不存在!");
}
else
{
for(int i = ret;i<pc->sz-1;i++)
{
pc->data[i] = pc->data[i+1];
}
pc->sz--;
printf("成功删除");
}
}
查找联系人:
我们应该先利用上面写的查找函数先找到此人是否存在,再进行打印信息。
void Findpeop(const struct contact* pc)
{
char name[MAX_NAME];
printf("请输入想要查找的人的名字");
scanf("%s", &name);
int ret = find_peop(pc, name);
if (ret == -1)
{
printf("查找的联系人不存在!");
}
else
{
printf("%s,%s,%d,%s,%s\n", pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].phone_num,
pc->data[ret].home);
}
}
修改联系人信息:
同上先找到再进行修改。
void Exchangepeop(struct contact* pc)
{
char ex_name[MAX_NAME];
printf("请输入想要修改的联系人姓名");
scanf("%s", &ex_name);
int ret = find_peop(pc, ex_name);
if (ret == -1)
{
printf("想要修改的联系人不存在!");
}
else
{
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
}
}
显示联系人:
我们先建立一个for循环打印当前所有的联系人就好。
void Showpeop(const struct contact* pc)
{
int i;
for (i = 0; i < pc->sz; i++)
{
printf("%s,%s,%d,%s,%s\n", pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].phone_num,
pc->data[i].home);
}
}
对联系人进行排序(用姓名):
在这里我们用到了qsort函数。
int Cmpname(const void* e1, const void* e2)
{
return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}
void Sortpeop(struct contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct peop), Cmpname);
}
完整代码!!!!
#include<stdio.h>
#include<string.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_PHONE_NUM 12
#define MAX_HOME 30
struct peop
{
char name[MAX_NAME];
char sex[MAX_SEX];
char phone_num[MAX_PHONE_NUM];
int age;
char home[MAX_HOME];
};
struct contact
{
struct peop data[MAX];
int sz;
};
void initializecon(struct contact* pc);
void Addpeop(struct contact* pc);
void Cutpeop(struct contact* pc);
void Showpeop(const struct contact* pc);
void Findpeop(const struct contact* pc);
void Exchangepeop(struct contact* pc);
void Sortpeop(const struct contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("********************************\n");
printf("******1.add 2.cut *********\n");
printf("******3.find 4.exchange*******\n");
printf("******5.show 6.sort ********\n");
printf("******0.quit********************\n");
printf("********************************\n");
}
int main()
{
int a = 0;
struct contact con;
initializecon(&con);//初始化
printf("请选择:\n");
do
{
menu();
scanf("%d", &a);
switch (a)
{
case 1:
Addpeop(&con);
break;
case 2:
Cutpeop(&con);
break;
case 3:
Findpeop(&con);
break;
case 4:
Exchangepeop(&con);
break;
case 5:
Showpeop(&con);
break;
case 6:
Sortpeop(&con);
break;
case 0:
break;
default:
break;
}
} while (a);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化
void initializecon(struct contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, MAX*sizeof(struct peop));
}
void Addpeop(struct contact* pc)
{
if(pc->sz == MAX)
{
printf("通讯录已满!无法存放联系人!");
}
else
{
printf("请输入联系人信息\n");
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
printf("成功增加联系人\n");
}
pc->sz++;
}
void Showpeop(const struct contact* pc)
{
int i;
for (i = 0; i < pc->sz; i++)
{
printf("%s,%s,%d,%s,%s\n", pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].phone_num,
pc->data[i].home);
}
}
static int find_peop(struct contact* pc,char name[])
{
int i = 0;
int ret = 0;
for(i;i<pc->sz;i++)
{
if(0 == strcmp(pc->data[i].name,name))
{
return i;
}
}
return -1;
}
void Cutpeop(struct contact* pc)
{
char cut_name[MAX_NAME];
printf("请输入要删除的联系人");
scanf("%s", &cut_name);
int ret = find_peop(pc, cut_name);
if(ret == -1)
{
printf("想要删除的联系人不存在!");
}
else
{
for(int i = ret;i<pc->sz-1;i++)
{
pc->data[i] = pc->data[i+1];
}
pc->sz--;
printf("成功删除");
}
}
void Findpeop(const struct contact* pc)
{
char name[MAX_NAME];
printf("请输入想要查找的人的名字");
scanf("%s", &name);
int ret = find_peop(pc, name);
if (ret == -1)
{
printf("查找的联系人不存在!");
}
else
{
printf("%s,%s,%d,%s,%s\n", pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].phone_num,
pc->data[ret].home);
}
}
void Exchangepeop(struct contact* pc)
{
char ex_name[MAX_NAME];
printf("请输入想要修改的联系人姓名");
scanf("%s", &ex_name);
int ret = find_peop(pc, ex_name);
if (ret == -1)
{
printf("想要修改的联系人不存在!");
}
else
{
printf("请输入性名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].phone_num);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].home);
}
}
int Cmpname(const void* e1, const void* e2)
{
return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}
void Sortpeop(struct contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct peop), Cmpname);
}