静态通讯录的实现
一.通讯录的各项功能及主体框架
1.通讯录的要求实现功能
0.退出菜单 1.添加联系人信息 2.删除指定名字的联系人信息 3.修改联系人的信息 4.查找好友的信息 5.展示通讯录联系人信息
我们根据通讯录的各项功能进行编写页面菜单
2.页面菜单
代码语言:javascript复制void menu()
{
//打印通讯录菜单
//0.退出菜单
//1.添加联系人信息
//2.删除指定名字的联系人信息
//3.修改联系人的信息
//4.查找好友的信息
//5.展示通讯录联系人信息
//6.对通讯录指定信息进行排序
printf("*************************************************n");
printf("********** ——欢迎来到通讯录菜单—— *********n");
printf("********** 0.退出菜单 *********n");
printf("********** 1.添加联系人信息 *********n");
printf("********* 2.删除联系人信息 *********n");
printf("********* 3.修改联系人信息 *********n");
printf("********* 4.查找联系人信息 *********n");
printf("********* 5.展示联系人信息 *********n");
printf("*************************************************n");
}
3.通讯录的主体框架实现
代码语言:javascript复制//将菜单的功能一一列举出来,以枚举的类型呈现
enum
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
SHOW,
};
int main()
{
int input = 0;
//创建通讯录
struct Contact con; //Con就是通讯录,里面包含1000个人的信息,及size
InitContact(&con);
do
{
menu();
printf("请选择功能:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case MODIFY :
MotifyContact(&con);
break;
case SEARCH :
SearchContact(&con);
break;
case SHOW:
ShowContact(con);
break;
case EXIT:
break;
default:
printf("选择错误,请重新输入!!n");
break;
}
} while(input);
return 0;
}
我们用枚举类型将功能一一列举出来,同时每一个枚举成员也代表着对应的数字,我们在switch ...case 语句中也不用 case 1,case 2来记录每一功能对应的数字了,直接以case ADD,case DEL表示,更加直接了当。
4.通讯录初始化及个人信息的表示
代码语言:javascript复制#define MAX 1000
#define MAX_name 20
#define MAX_tel 20
#define MAX_sex 5
#define MAX_addr 30
struct PeoInfor
{
char name[MAX_name];
int age;
char sex[MAX_sex];
char tel[MAX_tel];
char addr[MAX_addr];
};
struct Contact
{
struct PeoInfor date[MAX]; // 存放个人信息
int size; //记录当前已有的元素个数
};
void InitContact(struct Contact* ps)
{
memset(ps->date, 0, sizeof(ps->date));
ps->size = 0; //设置通讯录的元素有0个
}
二、功能函数的具体实现
1.增加联系人的信息
代码语言:javascript复制void AddContact(struct Contact* ps)
{
if (ps->size == MAX)
{
printf("该通讯录空间已满,无法储存n");
}
else
{
printf("请输入姓名:>");
scanf("%s", ps->date[ps->size].name);
printf("请输入年龄:>");
scanf("%d", &(ps->date[ps->size].age));
printf("请输入性别:>");
scanf("%s", ps->date[ps->size].sex);
printf("请输入电话:>");
scanf("%s", ps->date[ps->size].tel );
printf("请输入地址:>");
scanf("%s", ps->date[ps->size].addr);
ps->size ;
printf("添加成功n");
}
}
2.删除联系人的信息
代码语言:javascript复制void DelContact(struct Contact *ps)
{
// 查找要删除的人在什么位置,根据名字
char name[MAX_name];
printf("请输入要删除的联系人名字:>");
scanf("%s", name);
int i = 0;
int j = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[j].name))
{
break;
}
}
if (i==ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
else
{
for (j = i; j < ps->size; j )
{
ps->date[j] = ps->date[j 1];
}
}
ps->size--;
printf("删除成功n");
}
3.修改联系人的信息
代码语言:javascript复制void MotifyContact(struct Contact *ps)
{
char name[MAX_name];
printf("请输入要删除的联系人名字:>");
scanf("%s", name);
int i = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[i].name))
{
break;
}
}
if (i == ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
//表示找到该联系人
//对下标为i的联系人信息进行修改
else
{
printf("请输入姓名:>");
scanf("%s", ps->date[i].name);
printf("请输入年龄:>");
scanf("%d", &(ps->date[i].age));
printf("请输入性别:>");
scanf("%s", ps->date[i].sex);
printf("请输入电话:>");
scanf("%s", ps->date[i].tel);
printf("请输入地址:>");
scanf("%s", ps->date[i].addr);
}
printf("修改成功n");
}
4.查找联系人的信息
代码语言:javascript复制void SearchContact(struct Contact *ps)
{
char name[MAX_name];
printf("请输入要查找的联系人名字:>");
scanf("%s", name);
int i = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[i].name))
{
break;
}
}
if (i == ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
//表示找到该联系人
//对下标为i的联系人信息进行显示
else
{
printf("st%4st%5stst sn", "名字", "年龄", "性别", "电话", "地址");
printf("stMt%5stst sn",
ps->date[i].name,
ps->date[i].age,
ps->date[i].sex,
ps->date[i].tel,
ps->date[i].addr);
}
}
5.展示通讯录联系人信息
代码语言:javascript复制void ShowContact(struct Contact ps)
{
if (ps.size == 0)
{
printf("通讯录为空,无法展示n");
}
else
{
printf("st%4st%5stst sn","名字","年龄","性别","电话","地址");
int i = 0;
for (i = 0; i < ps.size; i )
{
printf("stMt%5stst sn",
ps.date[i].name,
ps.date[i].age,
ps.date[i].sex,
ps.date[i].tel,
ps.date[i].addr);
}
}
}
整体代码展示
1.test.c 通讯录主体框架测试文件
代码语言:javascript复制#include
#include "contact.h"
#include
void menu()
{
//打印通讯录菜单
//0.退出菜单
//1.添加联系人信息
//2.删除指定名字的联系人信息
//3.修改联系人的信息
//4.查找好友的信息
//5.展示通讯录联系人信息
//6.对通讯录指定信息进行排序
printf("*************************************************n");
printf("********** ——欢迎来到通讯录菜单—— *********n");
printf("********** 0.退出菜单 *********n");
printf("********** 1.添加联系人信息 *********n");
printf("********* 2.删除联系人信息 *********n");
printf("********* 3.修改联系人信息 *********n");
printf("********* 4.查找联系人信息 *********n");
printf("********* 5.展示联系人信息 *********n");
printf("*************************************************n");
}
//将菜单的功能一一列举出来,以枚举的类型呈现
enum
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
SHOW,
};
int main()
{
int input = 0;
//创建通讯录
struct Contact con; //Con就是通讯录,里面包含1000个人的信息,及size
InitContact(&con);
do
{
menu();
printf("请选择功能:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case MODIFY :
MotifyContact(&con);
break;
case SEARCH :
SearchContact(&con);
break;
case SHOW:
ShowContact(con);
break;
case EXIT:
break;
default:
printf("选择错误,请重新输入!!n");
break;
}
} while(input);
return 0;
}
2.contact.c 通讯录函数文件
代码语言:javascript复制#include
#include
#include "contact.h"
void InitContact(struct Contact* ps)
{
memset(ps->date, 0, sizeof(ps->date));
ps->size = 0; //设置通讯录的元素有0个
}
void AddContact(struct Contact* ps)
{
if (ps->size == MAX)
{
printf("该通讯录空间已满,无法储存n");
}
else
{
printf("请输入姓名:>");
scanf("%s", ps->date[ps->size].name);
printf("请输入年龄:>");
scanf("%d", &(ps->date[ps->size].age));
printf("请输入性别:>");
scanf("%s", ps->date[ps->size].sex);
printf("请输入电话:>");
scanf("%s", ps->date[ps->size].tel );
printf("请输入地址:>");
scanf("%s", ps->date[ps->size].addr);
ps->size ;
printf("添加成功n");
}
}
void ShowContact(struct Contact ps)
{
if (ps.size == 0)
{
printf("通讯录为空,无法展示n");
}
else
{
printf("st%4st%5stst sn","名字","年龄","性别","电话","地址");
int i = 0;
for (i = 0; i < ps.size; i )
{
printf("stMt%5stst sn",
ps.date[i].name,
ps.date[i].age,
ps.date[i].sex,
ps.date[i].tel,
ps.date[i].addr);
}
}
}
void DelContact(struct Contact *ps)
{
// 查找要删除的人在什么位置,根据名字
char name[MAX_name];
printf("请输入要删除的联系人名字:>");
scanf("%s", name);
int i = 0;
int j = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[j].name))
{
break;
}
}
if (i==ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
else
{
for (j = i; j < ps->size; j )
{
ps->date[j] = ps->date[j 1];
}
}
ps->size--;
printf("删除成功n");
}
void MotifyContact(struct Contact *ps)
{
char name[MAX_name];
printf("请输入要删除的联系人名字:>");
scanf("%s", name);
int i = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[i].name))
{
break;
}
}
if (i == ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
//表示找到该联系人
//对下标为i的联系人信息进行修改
else
{
printf("请输入姓名:>");
scanf("%s", ps->date[i].name);
printf("请输入年龄:>");
scanf("%d", &(ps->date[i].age));
printf("请输入性别:>");
scanf("%s", ps->date[i].sex);
printf("请输入电话:>");
scanf("%s", ps->date[i].tel);
printf("请输入地址:>");
scanf("%s", ps->date[i].addr);
}
printf("修改成功n");
}
void SearchContact(struct Contact *ps)
{
char name[MAX_name];
printf("请输入要查找的联系人名字:>");
scanf("%s", name);
int i = 0;
//查找名字
for (i = 0; i < ps->size; i )
{
if (0 == strcmp(name, ps->date[i].name))
{
break;
}
}
if (i == ps->size) // i从循环里出来,strcmp还是不等于0
{
printf("未找到该联系人的信息n");
}
//表示找到该联系人
//对下标为i的联系人信息进行显示
else
{
printf("st%4st%5stst sn", "名字", "年龄", "性别", "电话", "地址");
printf("stMt%5stst sn",
ps->date[i].name,
ps->date[i].age,
ps->date[i].sex,
ps->date[i].tel,
ps->date[i].addr);
}
}
3.contact.h 宏定义及函数声明文件
代码语言:javascript复制#define MAX 1000
#define MAX_name 20
#define MAX_tel 20
#define MAX_sex 5
#define MAX_addr 30
struct PeoInfor
{
char name[MAX_name];
int age;
char sex[MAX_sex];
char tel[MAX_tel];
char addr[MAX_addr];
};
struct Contact
{
struct PeoInfor date[MAX]; // 存放个人信息
int size; //记录当前已有的元素个数
};
// 声明函数
void InitContact(struct Contact* ps);
void AddContact(struct Contact* ps);
void ShowContact(struct Contact ps);
void DelContact(struct Contact *ps);
void MotifyContact(struct Contact *ps);
void SearchContact(struct Contact *ps);
小结
由于我们写的通讯录是有一定空间的,我们定义的通讯录空间是一定的,所以仍然存在限制和缺点。
代码语言:javascript复制#define MAX 1000
struct Contact
{
struct PeoInfor date[MAX]; // 存放个人信息
int size; //记录当前已有的元素个数
};
这就是通讯录的1.0版本,后续将持续更新,我们将在2.0版本升级为拥有动态内存空间的通讯录,在3.0版本将升级为拥有文件操作保存功能的通讯录版本。
欢迎大家的关注与欣赏!!
未完待续…
C语言实战项目——动态通讯录2.0