目录
前言
通讯录实现的思路与逻辑
通讯录具体实现步骤
完整代码展现
contact.h文件
contact.c文件
test.c文件
前言
通讯录采用模块化编程思路,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,// 0Add,// 1Del,// 2Search,//3Modify,//4Show //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 30typedef 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,// 0Add,// 1Del,// 2Search,//3Modify,//4Show //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;
}