整个成员管理系统设计为数据增加模块、数据修改模块、数据删除模块、数据按名字或按类别查找模块、数据浏览模块、数据清空模块、数据存储模块。
// 头文件
#include
#include
#include
#include
#include
#define na 20
#define te 20
#define em 30
#define cate 20
#define first_size 3
enum Select
{
Exit,
Add,
Dele,
Find,
Modify,
Sort,
Show,
Destory,
Save,
};
typedef struct people
{
char name[na];
char tele[te];
char category[cate];
char email[em];
}people;
typedef struct num_con //通讯录
{
people *data;//结构体数组 存放好多人信息
int size;//记录当前已有的元素个数
int capa;//当前最大容量 capa ==size时,容量已满
}num_con;
void menu();
void check(num_con *ps);//检查是否需要扩容
int find_kind();//选择查找类型
int find(num_con *ps,char name[na]);//查找名字
void Initialize_con(num_con *ps);//初始化
void add(num_con *ps);//增加
void dele(num_con *ps);//删除
void findkind(num_con *ps);//按类别查找
void findname(num_con *ps);//按名字查找
void modify(num_con *ps);//修改
void sort(num_con *ps);//排序
void show(const num_con *ps);//显示
void destory(num_con * ps);//清空
void save(num_con *ps); //保存
void load(num_con *ps);//加载
#include "contact.h"
/* 测试 */
int main(int argc, char *argv[])
{
//创建通讯录
num_con con;
Initialize_con(&con); //初始化
int input=0;
int i=0;
//读取数据
read(&con);
do
{
menu();
printf("快点选择鸭!\n");
scanf("%d",&input);
switch(input)
{
case Exit:
save(&con);//保存数据
destory(&con);//销毁通讯录并释放内存
system("cls");
printf("退出成功\n");
break;
case Add:
add(&con);
break;
case Dele:
dele(&con);
break;
case Find:
i=find_kind();
if(i==1)
findname(&con);
else if(i==2)
findkind(&con);
break;
case Modify:
modify(&con);
break;
case Sort:
sort(&con);
break;
case Show:
show(&con);
break;
case Destory:
destory(&con);
break;
case Save:
save(&con);
break;
default:
printf("输入错误鸭,请重新输入哦!\n");
break;
}
}while(input);
return 0;
}
//函数
#include "contact.h"
void menu ()
{
printf("———————————————\n");
printf("************通讯录************\n");
printf("***0.退出************1.增加***\n");
printf("***2.删除************3.查找***\n");
printf("***4.修改************5.排序***\n");
printf("***6.显示************7.清空***\n");
printf("**********8.保存文件**********\n");
printf("******************************\n");
}
void Initialize_con(num_con *ps)//初始化
{
ps->data=(people *)malloc(first_size*sizeof(people));//动态初始化空间
if(ps->data==NULL)
return;
ps->size=0;
ps->capa=first_size;
//把文件中已经存放的信息加载入通讯录
load(ps);
}
void check(num_con *ps)//检查是否需要扩容
{
if(ps->size==ps->capa)
{
//增容
//临时指针存放增加容量后的空间
people * newcapa=(people *)realloc(ps->data,(ps->capa+1)*sizeof(people));
if(newcapa!=NULL)//扩容成功
{
ps->data==newcapa;
ps->capa+=1;//容量扩大
printf("扩容成功啦\n");
}
else
printf("哎哟扩容失败了\n");
}
}
//选择查找类型
int find_kind()
{
int i=0;
while(1)
{
printf("请选择查找类型\n1.按名字\t2.按类型\n");
scanf("%d",&i);
if(i==1||i==2)
{
return i;
}
else
{
printf("输入有误,请重新输入\n");
}
}
}
//查找名字
int find(num_con *ps,char name[na])
{
int i=0;
for(i=0;isize;i++)
{
if(strcmp(name,ps->data[i].name)==0)
return i;
}
return -1;
}
//添加
void add(num_con *ps)
{
check(ps);//检查当前通讯录容量
char a[cate];
int b=1;
//增加一个人的数据
printf("名字:>\n");
scanf("%s",ps->data[ps->size].name);//data数组下标==size
printf("电话:>\n");
scanf("%s",ps->data[ps->size].tele);
do
{
printf("类别:请准确输入朋友、同事、商务、一般:>\n");
scanf("%s",a);
getchar();//接受回车
if(strcmp(a,"朋友")==0||
strcmp(a,"同事")==0||
strcmp(a,"商务")==0||
strcmp(a,"一般")==0)
{
b=0;
strcpy(ps->data[ps->size].category,a);
}
else
{
printf("输入错误,请重新输入\n");
}
}while(b);
printf("地址:>\n");
scanf("%s",ps->data[ps->size].email);
ps->size++;
printf("好耶!成功添加!\n");
}
//删除
void dele(num_con *ps)
{
printf("删掉谁好呢?\n");
char a[na];
scanf("%s",a);
//寻找名字
int result=find(ps,a);
if(result==-1)
{
printf("找不到啊呜呜呜\n");
}
else
{
int j=0;
for(j=result;jsize-1;j++)
{
ps->data[j]=ps->data[j+1];
}
ps->size--;
printf("删除成功!\n");
}
}
//按类别查找
void findkind(num_con *ps)
{
int i=0,t=0;
char a[cate];
printf("按类别查找:\n请输入:>朋友、同事、商务、一般:>\n");
scanf("%s",a);
printf("正在查找中...\n");
printf("————————————————————\n");
for(i=0;isize;i++)
{
if(strcmp(ps->data[i].category,a)==0)
{
t=1;
printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址");
printf("%-10s\t%-10s\t%-10s\t%-10s\n",
ps->data[i].name,
ps->data[i].tele,
ps->data[i].category,
ps->data[i].email);
}
}
if(t==0)
{
printf("找不到啊呜呜呜\n");
}
}
//按名字查找
void findname(num_con *ps)
{
int i=0;
if(0==ps->size)
{
printf("通讯录为空,无法查找\n");
return;
}
char a[na];
printf("按名字查找:\n请输入:>\n");
scanf("%s",a);
getchar();//接受回车
printf("正在查找中...\n");
printf("————————————————————\n");
int result=find(ps,a);
if(result==-1)
{
printf("找不到啊呜呜呜\n");
}
else
{
printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址");
printf("%-10s\t%-10s\t%-10s\t%-10s\n",
ps->data[result].name,
ps->data[result].tele,
ps->data[result].category,
ps->data[result].email);
}
}
//修改
void modify(num_con *ps)
{
int i=0;
if(0==ps->size)
{
printf("通讯录为空,无法修改\n");
return;
}
char a[na];
printf("请输入要修改的人的名字\n");
scanf("%s",a);
//寻找名字
int result=find(ps,a);
if(result==-1)
{
printf("找不到啊呜呜呜\n");
}
else
{
printf("已找到\n请输入修改的内容:>\n");
printf("名字修改为:>\n");
scanf("%s",ps->data[result].name);
printf("电话修改为:>\n");
scanf("%s",ps->data[result].tele);
printf("类别修改为:>\n");
scanf("%s",ps->data[result].category);
printf("邮箱修改为:>\n");
scanf("%s",ps->data[result].email);
printf("修改成功啦!\n");
}
}
//排序
void sort(num_con *ps)
{
int i=0,j=0;
people peo;
printf("正在按名字排序中:>\n");
for(i=0;isize;i++)
{
for(j=i+1;jsize;j++)
if(strcmp(ps->data[i].name,ps->data[j].name)>=0)
{
peo=ps->data[i];
ps->data[i]=ps->data[j];
ps->data[j]=peo;
}
}
printf("排好啦!想看看嘛~\n");
}
//显示
void show(const num_con *ps)
{
int i=0;
if(ps->size==0)
printf("通讯录为空\n");
else
{
printf("%-10s\t%-10s\t%-10s\t%-10s\n","名字","电话","类别","地址");
for(i=0;isize;i++)
{
printf("%-10s\t%-10s\t%-10s\t%-10s\n",
ps->data[i].name,
ps->data[i].tele,
ps->data[i].category,
ps->data[i].email);
}
}
}
//清空
void destory(num_con * ps)
{
free(ps->data);
ps->data=NULL;
ps->size=0;
system("cls");
printf("已被清空\n");
}
//加载
void load(num_con *ps)
{
people t={0};//创建成员信息的临时变量
FILE*pf=fopen("CONTACT","rb");
if(pf==NULL)
{
printf("load::%s\n",strerror(errno));//错误信息
return;
}
//读取文件
while(fread(&t,sizeof(people),1,pf))//如果读到 0 ,即读取完毕
{
check(ps);//检查容量
ps->data[ps->size]=t;
ps->size++;
}
fclose(pf);
pf=NULL;
}
void save(num_con *ps)
{
int i=0;
FILE* pf=fopen("CONTACT","wb");
if(pf==NULL)
{
printf("save::%s\n",strerror(errno));//错误信息
return ;
}
//写入文件
for(i=0;isize;i++)
{
fwrite(&(ps->data[i]),sizeof(people),1,pf);
}
fclose(pf);
pf=NULL;
system("cls");
printf("保存成功\n");
}
强烈建议各位在敲完一段函数之后,及时调试,免得错误难以找出。最好还是一个函数一个文件。
最后附上课程设计报告,希望对你有所帮助。
1.课程设计内容简介
使用计算机对通讯录成员信息进行管理,拥有手工管理无法达到的优点。搜索迅速,查找方便,修改方便,存储量大,成本低等。将通讯录保存在电脑中,不仅十分便利,还能及时更新数据,防止数据丢失。
在本通讯录中,你可以对联系人进行分类,同事类、朋友类、商务类、一般类。分好组后,可以进行增删改查。当用户需要查询联系人时可以直接通过搜索名字,或者通过分组来查询联系人。本系统提高了查询工作效率,为用户提高更多便利。
2.需求分析
1.通讯录记录文件存储,要提供文件的输入输出功能,运行程序时将通讯录数据从文件读取到内存中;
2.实现成员信息的删改,因而提供文件的修改和删除,并将修改后的信息再保存到文件中;
3.要浏览所有成员记录,故提供显示操作;
4.要按名字排序输出信息,因而提供排序操作;
5.要清空通讯录信息,所以提供清空操作;
6.另外要提供可视化菜单以及实现功能的选择。
3.总体设计
整个成员管理系统设计为数据增加模块、数据修改模块、数据删除模块、数据查找模块、数据浏览模块、数据清空模块、数据保存模块
4.详细设计
数据结构采用结构体,设计成员信息纪录结构体,并为struct people 创建一个新的名字people :
typedef struct people
{
char name[na];
char tele[te];
char category[cate];
char email[em];
}people;
主函数菜单的选择功能,用switch 实现,并使用枚举便于提示程序员,每一个数字对应的自定义功能。
enum Select
{
Exit,
Add,
Dele,
Find,
Modify,
Sort,
Show,
Destory,
Save,
};
(1)主函数输出提示菜单
增加成员纪录、修改成员纪录、删除成员纪录、查找成员记录、浏览成员纪录、清
空成员记录。
(2)检查容量模块
检查是否需要扩容,如果容量不足,则使用realloc增加空间。
(3)选择查找类别模块
通过菜单选择按什么类别查找,按名字,或按类别。
(4)查找名字模块
通讯录的查找修改可以通过该函数寻找是否存在某一成员,节省代码量。
(5)数据增加模块
通过菜单选择增加成员纪录。
(6)数据修改模块
通过菜单选择修改成员纪录。
(7)数据删除模块
通过菜单选择删除成员记录。
(8)数据查找模块
通过菜单选择查找成员记录,可按名字,可按类型。
(9)数据排序模块
通过菜单选择按名字这一字符串大小来排序。
(10)数据显示模块
通过菜单选择显示成员记录,新输入的以及文件中的信息。
(11)数据清空模块
通过菜单选择清空成员信息。
(12)文件读取模块
用fopen打开CONTACT文件,用fread读取CONTACT文件。将该模块放入初始化结构体数组的函数中,以后打开该程序使用显示功能,即可加载成员信息。
(13)文件保存模块
用fwrite把成员信息写入CONTACT文件,可通过菜单选择保存功能,也可选择退出功能时自动保存。
建立通讯录结构体数组,包含内容如下。
typedef struct num_con //通讯录
{
people *data;//结构体数组 存放好多人信息
int size;//记录当前已有的元素个数
int capa;//当前最大容量 capa ==size时,容量已满
}num_con;
感谢观看!留个赞再走吧!祝你生活愉快!