目录
前言
通讯录采用模块化编程思路,test.c文件专门测试通讯录的功能,contact.h文件存放函数声明 contact.c存放通讯录对应功能的具体实现;
通讯录的功能能够保存联系人的信息,而联系人的信息包括 姓名 性别 年龄 电话号码 地址
通讯录的功能应该包含如下选项:
1.增加联系人 2.删除指定联系人 3.查找指定联系人
4.修改指定联系人信息 5.显示通讯录中联系人的信息 0.退出通讯录
通讯录实现的思路与逻辑
- 创建通讯录菜单函数以供用户选择其想实现的功能
- 使用结构体描述联系人信息并创建通讯录,通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
- 初始化通讯录;
- 增加联系人的信息;
- 显示通讯录中的信息;
- 删除指定联系人的信息;
- 查找指定联系人的信息;
- 修改指定联系人的相关信息;
通讯录具体实现步骤
- 菜单界面
void menu()
{
printf("********************************\n");
printf("******1.Add 2.Del ********\n");
printf("******3.Search 4.Modify********\n");
printf("******5.Show 0.Exit**********\n");
printf("********************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("请输入选择:> ");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case Exit:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
while (input);
}
int main()
{
test();
return 0;
}
- 创建通讯录
通讯录里面存放联系人的相关信息,而联系人的信息由姓名 性别 年龄 电话号码 地址组成
typedef struct PeoInfo
{
char name[20];
int age;
char sex[5];
char tele[12];
char addr[30];
}PeoInfo;
通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数,为了方便函数传参,封装成一个结构体;
typedef struct Contact
{
PeoInfo data[1000];//可以存放1000个人的信息
int sz;//记录通讯录中已经保存的联系人的个数
}Contact;
为了方便代码可以修改指定大小,使用#define定义的标识符常量代替,同时对上述数字用标识符常量代替
#define Data_Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
建立菜单功能和选项具有一定的关联性使用枚举;
enum Option
{
Exit,// 0
Add,// 1
Del,// 2
Search,//3
Modify,//4
Show //5
};
菜单界面修改如下:
void menu()
{
printf("********************************\n");
printf("******1.Add 2.Del ********\n");
printf("******3.Search 4.Modify********\n");
printf("******5.Show 0.Exit**********\n");
printf("********************************\n");
}
void test()
{
//创建通讯录
Contact con;
int input = 0;
do
{
menu();
printf("请输入选择:> ");
scanf("%d", &input);
switch (input)
{
case Add:
break;
case Del:
break;
case Search:
break;
case Modify:
break;
case Show:
break;
case Exit:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
while (input);
}
int main()
{
test();
return 0;
}
结构体个人信息修改如下:
typedef struct PeoInfo
{
char name[Name_Max];
int age;
char sex[Sex_Max];
char tele[Tele_Max];
char addr[Addr_Max];
}PeoInfo;
通讯录信息修改如下:
typedef struct Contact
{
PeoInfo data[Data_Max];//可以存放1000个人的信息
int sz;//记录通讯录中已经保存的联系人的个数
}Contact;
- 初始化通讯录
使用memset()函数将数组初始化为0,并且将记录通讯录联系人个数的sz置为0;
//初始化通讯录
void InitContact(Contact * pc)
{
assert(pc != NULL);
memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;
pc->sz = 0;
}
- 增加联系人的信息
//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{
assert(pc != NULL);
//考虑异常情况 当通讯录数据存放满,直接返回
if (pc->sz == Data_Max)
{
printf("通讯录已满,无法添加\n");
return;
}
//1.录入信息
printf("请输入名字: ");
scanf("%s", (pc->data[pc->sz]).name);
printf("请输入年龄: ");
scanf("%d", &(pc->data[pc->sz]).age);
printf("请输入性别: ");
scanf("%s", (pc->data[pc->sz]).sex);
printf("请输入电话号码: ");
scanf("%s", (pc->data[pc->sz]).tele);
printf("请输入地址: ");
scanf("%s", (pc->data[pc->sz]).addr);
//2.sz++;
pc->sz++;
printf("添加成功\n");
}
- 显示通讯录中的信息
void ShowContact(const Contact * pc)
{
assert(pc != NULL);
int i = 0;
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
}
}
- 删除指定联系人的信息
先根据姓名找到要删除的元素(不考虑重名),然后删除,删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;
int FindByName(const Contact* pc,char name[])
{
assert(pc != NULL);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//比较姓名—实际比较字符串—strcmp()函数
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
//遍历完整个数组,仍然没有返回,说明找不到;
return -1;
}
//删除指定联系人的信息
void DelContact(Contact *pc)
{
assert(pc != NULL);
//如果通讯录里面元素为0,直接返回;
if (pc->sz == 0)
{
printf("通讯录已空,无法删除\n");
return;
}
//根据姓名查找
char name[Name_Max] = { 0 };
printf("请输入姓名:");
scanf("%s", name);
//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;
int pos=FindByName(pc,name);
if (pos == -1)
{
printf("联系人不存在,无法删除\n");
return;
}
//删除
int j = 0;
for (j = pos; j <pc->sz-1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("删除成功\n");
}
- 查找指定联系人的信息;
void SearchContact(const Contact* pc)
{
assert(pc != NULL);
char name[Name_Max] = { 0 };
printf("请输入查找人的姓名:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("联系人不存在\n");
return;
}
//找到联系人,显示联系人相关信息;
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,
pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
- 修改联系人的相关信息
void ModContact(Contact* pc)
{
assert(pc != NULL);
//先根据姓名查找要修改的元素
char name[Name_Max] = { 0 };
printf("请输入修改人的姓名:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("联系人不存在\n");
return;
}
//重新输入该位置的信息;
printf("请输入名字: ");
scanf("%s", (pc->data[pos]).name);
printf("请输入年龄: ");
scanf("%d", &(pc->data[pos]).age);
printf("请输入性别: ");
scanf("%s", (pc->data[pos]).sex);
printf("请输入电话号码: ");
scanf("%s", (pc->data[pos]).tele);
printf("请输入地址: ");
scanf("%s", (pc->data[pos]).addr);
printf("修改成功\n");
}
完整代码展现
contact.h文件
# include <stdio.h>
# include <string.h>
# include <assert.h>
#define Data_Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
typedef struct PeoInfo
{
char name[Name_Max];
int age;
char sex[Sex_Max];
char tele[Tele_Max];
char addr[Addr_Max];
}PeoInfo;
//通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
//为了方便传参,封装成一个结构体;
typedef struct Contact
{
PeoInfo data[Data_Max];//可以存放1000个人的信息
int sz;//记录通讯录中已经保存的联系人的个数
}Contact;
//建立菜单功能和选项的关联使用枚举;
enum Option
{
Exit,// 0
Add,// 1
Del,// 2
Search,//3
Modify,//4
Show //5
};
//函数的声明
//初始化通讯录
void InitContact(Contact * pc);
//增加联系人的信息
void AddContact(Contact * pc);
//显示通讯录中的信息
void ShowContact(const Contact * pc);
//删除指定联系人的信息
void DelContact(Contact *pc);
//查找指定联系人的信息
void SearchContact(const Contact* pc);
//修改联系人的相关信息
void ModContact(Contact* pc);
contact.c文件
# include "contact.h"
//初始化通讯录
void InitContact(Contact * pc)
{
assert(pc != NULL);
memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;
pc->sz = 0;
}
//增加联系人的信息
//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{
assert(pc != NULL);
//考虑异常情况 当通讯录数据存放满,直接返回
if (pc->sz == Data_Max)
{
printf("通讯录已满,无法添加\n");
return;
}
//1.录入信息
printf("请输入名字: ");
scanf("%s", (pc->data[pc->sz]).name);
printf("请输入年龄: ");
scanf("%d", &(pc->data[pc->sz]).age);
printf("请输入性别: ");
scanf("%s", (pc->data[pc->sz]).sex);
printf("请输入电话号码: ");
scanf("%s", (pc->data[pc->sz]).tele);
printf("请输入地址: ");
scanf("%s", (pc->data[pc->sz]).addr);
//2.sz++;
pc->sz++;
printf("添加成功\n");
}
//显示通讯录中的信息
void ShowContact(const Contact * pc)
{
assert(pc != NULL);
int i = 0;
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
}
}
int FindByName(const Contact* pc,char name[])
{
assert(pc != NULL);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//比较姓名—实际比较字符串—strcmp()函数
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
//遍历完整个数组,仍然没有返回,说明找不到;
return -1;
}
//删除指定联系人的信息
void DelContact(Contact *pc)
{
assert(pc != NULL);
//如果通讯录里面元素为0,直接返回;
if (pc->sz == 0)
{
printf("通讯录已空,无法删除\n");
return;
}
//先根据姓名找到要删除的元素(不考虑重名)
char name[Name_Max] = { 0 };
printf("请输入姓名:");
scanf("%s", name);
//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;
int pos=FindByName(pc,name);
if (pos == -1)
{
printf("联系人不存在,无法删除\n");
return;
}
//删除
//删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;
int j = 0;
for (j = pos; j <pc->sz-1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("删除成功\n");
}
//查找指定联系人的信息
void SearchContact(const Contact* pc)
{
assert(pc != NULL);
char name[Name_Max] = { 0 };
printf("请输入查找人的姓名:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("联系人不存在\n");
return;
}
//找到联系人,显示联系人相关信息;
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,
pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
//修改联系人的信息
void ModContact(Contact* pc)
{
assert(pc != NULL);
//先根据姓名查找要修改的元素
char name[Name_Max] = { 0 };
printf("请输入修改人的姓名:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("联系人不存在\n");
return;
}
//重新输入该位置的信息;
printf("请输入名字: ");
scanf("%s", (pc->data[pos]).name);
printf("请输入年龄: ");
scanf("%d", &(pc->data[pos]).age);
printf("请输入性别: ");
scanf("%s", (pc->data[pos]).sex);
printf("请输入电话号码: ");
scanf("%s", (pc->data[pos]).tele);
printf("请输入地址: ");
scanf("%s", (pc->data[pos]).addr);
printf("修改成功\n");
}
test.c文件
# include "contact.h"
void menu()
{
printf("********************************\n");
printf("******1.Add 2.Del ********\n");
printf("******3.Search 4.Modify********\n");
printf("******5.Show 0.Exit**********\n");
printf("********************************\n");
}
void test()
{
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);
int input = 0;
do
{
menu();
printf("请输入选择:> ");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&con);
break;
case Del:
DelContact(&con);
break;
case Search:
SearchContact(&con);
break;
case Modify:
ModContact(&con);
break;
case Show:
ShowContact(&con);
break;
case Exit:
printf("退出通讯录\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
while (input);
}
int main()
{
test();
return 0;
}