一、前言
对于通讯录管理系统,我们如果按照平时只创建一个源文件来实现是比较麻烦以及直观,我们一般创建一个test.c的源文件用来描述这个程序的大概,菜单的描绘。我们再创建一个contact.h的头文件用于添加各种头文件。最后,我们创建一个contact.c文件用于各项功能代码的实现。
二、通讯录管理系统的实现
1、关于通讯录的前期准备
(1)文件的创建
首先我们创建一个test.c的源文件,一个通讯录系统里面至少包括联系人的信息,年龄,性别,住址…,这就需要我们运用结构体来实现,同时switch选择结构帮助我们选择各种功能。代码如下
// 创建通讯录
int main()
{
int input = 0;
struct Contact con;// 通讯录
//初始化通讯录
do
{
menu();// 这里我们预留了菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
(2)菜单的实现
对于菜单的实现,额,也没啥好说的,咱们直接上代码好伐
void menu()
{
printf("******************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("*** 5.show 6.sort ****\n");
printf("*** 0.exit ****\n");
printf("******************************\n");
}
这样我们就做了一个简易的通讯录里面根据不同的选项对功能的实现
(3)通讯录管理系统的功能说明
我们实现了七个功能,1、增加 2、修改 3、查找 4、修改 5、展示 6、排序 0、退出
2、通讯录的功能实现
(1)初始化通讯录
我们现在test.c文件也就是循环的外面创建,这个写在循环之前不属于功能的实现
// 创建通讯录
int main()
{
int input = 0;
struct Contact con;// 通讯录
//初始化通讯录
InitContact(&con);// 结构体传参传的是地址
在初始化之前我们线创建一个人的结构为,然后我们再创建一个新的结构体,这一个结构体表现的就是我们整个通讯录管理系统,我们在contact.c文件中实现它
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void InitContact(struct Contact* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}
void AddContact(struct Contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法添加数据\n");
return;
}
写完后,我们就可以一步一步写其他的功能了
(2)增加联系人
由之前我们学过的只是可知,传参中,形参是实参的一份临时拷贝。因此我们传递的是结构体的地址
同时,由于是静态的通讯录,我们要考虑是否满了的情况,代码如下
void AddContact(struct Contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法添加数据\n");
return;
}
// 增加人的信息
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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
后面的功能类比如下
(3)删除联系人
在实现删除联系人之前我们要先找到这个联系人,如果找到了,咱们就删除,没找到我们就继续查找
代码实现
int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
找到后我们就可以进行删除操作
void DelContact(struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入要删除的人的名字:>");
scanf("%s", name);
// 查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要删除的人不存在\n");
else
{
// 删除
int j = 0;
for (j = ret; j <pc->sz-1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
}
(4)搜索联系人
void SearchContact(const struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入要查找的人的名字:>");
scanf("%s", name);
// 查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要查找的人不存在\n");
else
{
printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%20s\t%5s\t%5d\t%12s\t%30s\n", pc->data[ret].name,
pc->data[ret].sex, pc->data[ret].age,
pc->data[ret].tele, pc->data[ret].addr);
}
}
(5)修改联系人
void ModifyContact(struct Contact* pc)
{
printf("请输入要修改人的名字:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
printf("要修改的人不存在\n");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
(6)展示联系人
void ShowContact(const struct Contact* pc)
{
int i = 0;
printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%20s\t%5s\t%5d\t%12s\t%30s\n", pc->data[i].name,
pc->data[i].sex, pc->data[i].age,
pc->data[i].tele, pc->data[i].addr);
}
}
(7)排序联系人
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}
接下来我们将这个代码整体实现全部代码如下
test.c文件如下
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void menu()
{
printf("******************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("*** 5.show 6.sort ****\n");
printf("*** 0.exit ****\n");
printf("******************************\n");
}
// 创建通讯录
int main()
{
int input = 0;
struct Contact con;// 通讯录
//初始化通讯录
InitContact(&con);// 结构体传参传的是地址
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
contact.h文件如下
#pragma once
#include
#include
#include
#include
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
// 表示一个人的信息
struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char tele[MAX_TELE];
int age;
char addr[MAX_ADDR];
};
struct Contact
{
struct PeoInfo data[MAX];
int sz;
};
void InitContact(struct Contact* pc);// 初始化通讯录
void AddContact(struct Contact* pc);// 增加人的信息到通讯录
void ShowContact(const struct Contact* pc);// 显示通讯录中的信息
void DelContact(struct Contact* pc);// 删除指定联系人
void SearchContact(const struct Contact* pc);// 查找指定联系人
void ModifyContact(struct Contact* pc);// 修改联系人
void SortContact(struct Contact* pc);// 排序通讯录中的信息- 年龄
contact.c文件如下
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void InitContact(struct Contact* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}
void AddContact(struct Contact* pc)
{
assert(pc);
if (pc->sz == MAX)
{
printf("通讯录已满,无法添加数据\n");
return;
}
// 增加人的信息
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].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
void ShowContact(const struct Contact* pc)
{
int i = 0;
printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%20s\t%5s\t%5d\t%12s\t%30s\n", pc->data[i].name,
pc->data[i].sex, pc->data[i].age,
pc->data[i].tele, pc->data[i].addr);
}
}
int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入要删除的人的名字:>");
scanf("%s", name);
// 查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要删除的人不存在\n");
else
{
// 删除
int j = 0;
for (j = ret; j <pc->sz-1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
}
void SearchContact(const struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入要查找的人的名字:>");
scanf("%s", name);
// 查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要查找的人不存在\n");
else
{
printf("%20s\t%5s\t%5s\t%12s\t%30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%20s\t%5s\t%5d\t%12s\t%30s\n", pc->data[ret].name,
pc->data[ret].sex, pc->data[ret].age,
pc->data[ret].tele, pc->data[ret].addr);
}
}
void ModifyContact(struct Contact* pc)
{
printf("请输入要修改人的名字:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
printf("要修改的人不存在\n");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
int CmpByName(const void* e1, const void* e2)
{
return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}
以上就是完整的通讯录管理系统了。希望大家支持支持谢谢。
三、通讯录管理系统的优化(动态)
动态通讯录,需要我们熟练掌握malloc。以后我们再详细说明 。持续更新,敬请期待