C语言实现简易通讯录实例
一、问题描述
用C语言来写一个简易的通讯录
二、功能介绍
通讯录
1.通讯录中能够存放1000个人的信息
每个人的信息:
名字,年龄,性别,电话,地址
2.增加人的信息
3.删除人的信息
4.修改指定人的信息
5.查找指定人的信息
6.排序
二、实现流程
1.创建通讯录
1.创建头文件contact.h
头文件contact.h用来实现类型的定义和函数的声明。
2.定义结构体类型(struct peoInfo)
一个人的信息包含名字,年龄,性别,电话,地址,所以我们要定义一个结构体类型才能完整的表述。
写一个结构体类型struct peoInfo存放一个人的信息
代码如下:
/类型的定义 typedef struct peoInfo { char name[MAX_NAME];//名字 char sex[MAX_SEX];//性别 int age;//年龄 char tele[MAX_TELE];//电话 char addr[MAX_ADDR];//地址 }peoInfo;
typedef(类型重命名),struct peoInfo重命名为peoInfo。
3.定义通讯录结构体类型(struct contact)
因为要存放1000个这样的人的信息,所以我们创建一个结构体类型的数组data。再创建一个变量sz来表示这个数组的下标,data数组中存第一个人信息的时候,我们放在下标为sz的位置,这个时候让我们的sz等于0,存第二个人的信息的时候,让我们的sz等于1,这样后续就方便我们通过下标的方式找到存入的每一个人的信息。
代码如下:
peoInfo data[MAX];//存放添加进来的人的信息 int sz;//记录的是通讯录中有效信息的个数
上述代码加起来就构成了我们的通讯录,很明显这也是一个结构体。
代码如下:
//通讯录 typedef struct contact { peoInfo data[MAX];//存放添加进来的人的信息 int sz;//记录的是通讯录中有效信息的个数 }contact;
4.#define定义标识符常量
为了后续我们方便随时调整通讯录的大小所以我们把数组的数字挨个用#define定义标识符常量
代码如下:
#define MAX_NAME 20 #define MAX_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000
5.功能实现函数的声明
/初始化通讯录 void Initcontact(contact* cp); //增加联系人信息 void AddContact(contact* cp); //打印联系人信息 void PintContact(const contact* cp); //删除联系人信息 void DelContact(contact* cp); //查找联系人信息 void SearchContact(contact* cp); //修改联系人信息 void ModifyContact(contact* cp);
2.创建源文件test.c
源文件test.c测试通讯录的模块
通讯录有了之后,我们要写出通讯录的基本操作逻辑,选择增加联系人,选择删除联系人,选择修改联系人......选择错误,重新选择,选择重新开始等等。
1.打印菜单
代码如下:
void menu() { printf("******************************\n"); printf("*****1.add 2.del *********\n"); printf("*****3.search 4.modify*******\n"); printf("*****5.sort 6.print *******\n"); printf("*****0.exit ***************\n"); printf("******************************\n"); }
2.枚举方法定义编号
代码如下:
enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SORT, PRINT };
3.主文件的实现
代码如下
int main() { int input = 0; //创建通讯录 contact con;//通讯录 //初始化通讯录 Initcontact(&con); 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: //修改联系人信息 ModifyContact(&con); break; case SORT: break; case PRINT: //打印人的信息 PintContact(&con); break; case EXIT: printf("退出登录\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
写出一个菜单来供用户们选择自己想要的功能,采用枚举的方式让程序员看代码的时候能一目了然,一眼就也可以看出来这里要实现的是什么功能。
3.创建源文件contact.c
源文件contact.c来实现我们想要的功能(函数的实现)
1.初始化通讯录为0(Initcontact函数实现)
//初始化通讯录为0 void Initcontact(contact* cp) { cp->sz = 0;//通讯录中人的数量先初始化为0 memset(cp->data, 0, sizeof(cp->data));//数组内存中每个字节初始化为0
2.增加通讯录联系人信息(AddContact函数实现)
先判断通讯录人数是不是满了,满了就无法添加,没满就添加联系人信息。
代码如下:
//增加联系人的信息 void AddContact(contact* cp) { if (cp->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } //增加一个人的信息 printf("请输入名字:>"); scanf("%s", cp->data[cp->sz].name); printf("请输入年龄:>"); scanf("%d", &(cp->data[cp->sz].age)); printf("请输入性别:>"); scanf("%s", cp->data[cp->sz].sex); printf("请输入电话:>"); scanf("%s", cp->data[cp->sz].tele); printf("请输入地址:>"); scanf("%s", cp->data[cp->sz].addr); cp->sz++; printf("增加成功\n"); }
3.打印通讯录联系人信息( PintContact函数实现)
代码如下:
//打印联系人的信息 void PintContact(const contact* cp) { //打印标题 int i = 0; printf("%-5s\t %-5s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < cp->sz; i++) { printf("%-5s\t %-5d\t %-5s\t %-12s\t %-20s\n", cp ->data[i].name, cp -> data[i].age, cp -> data[i].sex, cp -> data[i].tele, cp -> data[i].addr); } }
增加完联系人信息之后我们可以打印出来看一看。
4.删除通讯录联系人信息 (DelContact函数实现)
首先判断通讯录里有没有联系人,没有就无需删除,有的话就根据查找函数查找通讯录成员名字来删除所对应的信息。
代码如下:
static int FindByName(contact* cp, char name[]) { int i = 0; for (i = 0; i < cp->sz; i++) { if (strcmp(cp->data[i].name, name) == 0) { return i; } } return -1; } //删除联系人信息 void DelContact(contact* cp) { char name[MAX_NAME] = { 0 }; if (cp->sz == 0) { printf("通讯录为空,无需删除\n"); return; } //1.查找要删除的人 //有没有 printf("请输入要删除人的名字\n"); scanf("%s", name); int pos = FindByName(cp, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } //2.删除 int i = 0; for (i = pos; i < cp -> sz - 1; i++) { cp->data[i] = cp->data[i + 1]; } cp->sz--; printf("删除成功\n"); }
5.查找通讯录联系人信息( SearchContact函数实现)
根据查找函数查找通讯录成员名字来删除所对应的信息。
代码如下
/查找联系人信息 void SearchContact(contact* cp) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字\n"); scanf("%s", name); int pos = FindByName(cp, name); if (pos == -1) { printf("要查找的人不存在\n"); return; } else { printf("%-5s\t %-5s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址"); printf("%-5s\t %-5d\t %-5s\t %-12s\t %-20s\n", cp->data[pos].name, cp->data[pos].age, cp->data[pos].sex, cp->data[pos].tele, cp->data[pos].addr); } }
6.修改联系人信息(ModifyContact函数实现)
根据查找函数查找通讯录成员名字来修改所对应的信息。
代码如下:
//修改联系人的信息 void ModifyContact(contact* cp) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字\n"); scanf("%s", name); int pos = FindByName(cp, name); if (pos == -1) { printf("要修改的人不存在\n"); return; } else { printf("请输入名字:>"); scanf("%s", cp->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(cp->data[pos].age)); printf("请输入性别:>"); scanf("%s", cp->data[pos].sex); printf("请输入电话:>"); scanf("%s", cp->data[pos].tele); printf("请输入地址:>"); scanf("%s", cp->data[pos].addr); printf("修改成功\n"); } }
部分功能结果图:
总结:
上述简单实现了通讯录的增删改查功能,写出了一个简易通讯录