通讯录管理系统实验报告
学院:物理与电子工程学院
专业:电子信息科学与技术
学号:1319200011
姓名:朱大神
日期:2014年6月12日
一.题目要求
?用C设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
?功能要求
?(1)查看功能:选择此功能时,列出下列三类选择。A办公类,B个人类,C商务类,当选中某类时,显示出此类中的所有数据。
?(2)增加功能:能录入新数据,一个结点包括:姓名、电话号码、分类(可选项有:A 办公类,B 个人类,C 商务类)、电子邮件。例如:杨春135******** 商务类 chuny@https://www.doczj.com/doc/fe9111462.html,。
?当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;
录入的新数据能按递增的顺序自动进行条目编号。
?(3)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改。
?(4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
二.程序功能
主要包含以下功能:
1.建立功能——建立通讯录
2.保存功能——保存通讯录
3.读取功能——读取文件
4.查找功能——查找联系人
5.删除功能——删除联系人
6.添加功能——添加联系人
7.修改功能——修改联系人
8.退出功能——退出系统
三.系统功能模块
建立功能:
在主菜单中输入1,进入建立功能。用户输入联系人姓名,电话,类别,邮箱,建立一个新的通讯录。在输入姓名处输入“*”结束添加。
保存功能:
在主菜单中输入2,进入保存功能。将已创建的通讯录保存到文件中。
读取功能:
在主菜单中输入3,进入读取功能。读取已经存在的通讯录文件。
查找功能:
在主菜单中输入4,进入查找功能。创建通讯录或读取文件之后才能进行查找。查找方式有三种:1. 按姓名查找2. 按类型查找3. 查看所有人。
删除功能:
在主菜单中输入5,进入删除功能。创建通讯录或读取文件之后才能进行删除。用户输入待删除联系人的姓名,系统显示待删除联系人的信息,并提示是否删除该联系人。
添加功能:
在主菜单中输入6,进入添加功能。创建通讯录或读取文件之后才能按提示添加联系人。
修改功能:
在主菜单中输入7,进入修改功能。创建通讯录或读取文件之后才能进行修该。通过姓名查找到联系人进行修改。
退出功能:在主菜单中输入8,退出通讯录管理系统。
主菜单
建立通讯录
保存通讯录
读取文件
查找联系人
删除联系人
添加联系人
修改联系人
退出系统
四.函数流程图
1.建立通讯录(单链表)
2.保存通讯录
3.读取文件
4.查找联系人
5.删除联系人
6.添加联系人
7.修改联系人
五.实验结果开始界面:
建立通讯录:
保存通讯录:
读取文件:
查找联系人:1.按姓名查找
2.按类别查找
3.显示所有
删除联系人:
添加联系人:
修改联系人:
退出系统:
六.体会
终于写到体会这部分了,这个程序设计花了我不少时间和精力。从一开始拿到题目,完全没有头绪,到后来慢慢分析题目,选数据结构,查资料,请教前辈,到最后终于用将近一个星期写出了这个通讯录管理系统,满满的都是泪啊。
这次程序设计让我对单链表有了新的认识。之前学习C语言的时候觉得单链表没什么用,经过这次程序设计,我发现单链表的功能是十分强大的,主要看你会不会用而已。
尽管单链表相对简单,但是第一学期学习链表的时候我并没有学好,这导致我在编程的过程中指针的使用出了很多问题,后来通过重温书本,请教同学,终于搞定了这部分。这也让我更加掌握链表这块知识。
还有文件读取与保存这块,第一学期C语言课并没有讲,我当时觉得它很难也懒得去自学了,后来到了这个程序设计,我不得不去学习这部分的知识。但让我意想不到的是,文件这部分内容比我想象的要简单得多,文件应该是这个通讯录管理系统中最简单的两个函数了。所以,有些事情你不去探索,不知道难易,
有些事情你不去摸索,不知道它多有趣。
最后,尽管编程过程痛苦,但是让我巩固了以前的知识,提高了动手能力,而且程序写出来让我非常有成就感,所以还是很感谢有这门课程的。
七.参考文献
1.C语言程序设计(第四版)
2.数据结构(C语言版)
3.百度知道
八.源程序
#include
#include
#include
#include
#define TEL struct telephone_list
struct telephone_list
{
char name[100]; //姓名
char tel[100]; //电话
char type[100]; //类型
char mail[100]; //邮箱
TEL *next;
};
int total=0; //统计联系人
void Save(TEL *head); //函数声明
TEL* Create()
{
total=0;
int k=0; //判断是否成功添加第一个联系人
int i=0; //判断联系人是否重复
TEL *head,*p1,*p2,*p3;
char saveflag;
head=p1=p2=NULL;
while(1) //添加联系人
{
p1= (TEL*)malloc(sizeof(TEL)); //分配动态存储空间
printf("请输入姓名,添加完成时在姓名后输入*,结束添加\n");
scanf("%s",p1->name);
if(strcmp(p1->name,"*")==0) //结束添加联系人
{
if(total==0)
{
printf("添加了0个联系人\n");
free(p1); //释放p1空间
return (head);
}
else
{
break; //跳出while(1)
}
}
printf("请输入电话号码:\n");
scanf("%s",p1->tel);
printf("请输入类别:(办公类/个人类/商务类)\n");
scanf("%s",p1->type);
printf("请输入邮箱:\n");
scanf("%s",p1->mail);
if(k>0) //添加第一个联系人之后
{
p3=head; //遍历链表
while(p3!=NULL) //判断联系人是否重复
{
if((strcmp(p1->name,p3->name)==0)&&(strcmp(p1->tel,p3->tel)==0)) //重复
{
free(p1);
printf("该联系人已存在\n");
i=1;
printf("按任意键返回主菜单\n");
getch();
//任意键
break;
}
if((strcmp(p1->name,p3->name))&&(strcmp(p1->tel,p3->tel))&&(p3==p2)) //无重复{
i=0;
break; //跳出if(k>0)
}
p3=p3->next; //下一个结点
}
if(i==1) //联系人重复
{
break; //跳出while(p3!=NULL)
}
}
if(head==NULL) //添加第一个联系人head为空
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
total++; //人数+1
k++;
}
p2->next=NULL; //最后一个结点的指针域为空
if(i==0)
{
free(p1);
printf("\n新建通讯录成功,共有%d个联系人,是否保存?(Y/N)\n ",total);
getchar();
scanf("%c",&saveflag);
if(saveflag=='y'||saveflag=='Y')
Save (head); //保存
else
printf("\联系人未保存\n");
}
return head; //返回头指针
}
void Save(TEL *head)
{
FILE *fp; //文件指针
TEL *f;
if ((fp=fopen("telephone.txt","w"))==NULL) //打开输出文件
{
printf("文件打开失败\n");
getch();
exit(0); //退出
}
f=head;
while(f!=NULL)
{
fwrite(f,sizeof(TEL),1,fp); //从f所指向的文件中读入一个大小为sizeof(TEL)的数据存到fp中
f=f->next; //下一个结点
}
fclose(fp); //关闭文件
printf("文件保存成功,按任意键返回主菜单\n");
getch();
}
TEL *Read()
{
FILE *fp; //文件指针
TEL *f1,*f2,*head=NULL;
char ch; //存放文件的第一个字符
if((fp=fopen("telephone.txt","r"))==NULL) //打开输入文件
{
printf("该文件不存在,按任意键返回主菜单\n");
getch();
exit(0);
}
ch=fgetc(fp); //从fp所指文件读入一个字符,读取成功带回所读字符,失败则返回文件结束标志EOF(即-1)
if(ch==EOF) //文件为空
{
printf("文件为空,请建立通讯录,按任意键返回主菜单\n");
getch();
return head; //返回头指针
}
else
{
rewind(fp); //把文件位置指针移至文件开头
}
f1=(TEL *) malloc(sizeof(TEL));
head=f1;
while(!feof(fp)) //文件结束,feof返回非零值,否则返回0
{
if(fread(f1,sizeof(TEL),1,fp)!=1) //fread函数执行成功返回1
break; //跳出while(!feof(fp))
total++; //人数+1
f1->next=(TEL *)malloc(sizeof(TEL)); //为下一个结点申请存储空间
f2=f1;
f1=f1->next;
}
f2->next=NULL; //最后一个结点的指针域为空
free(f1);
fclose(fp); //关闭文件
printf("文件读取成功,按任意键返回主菜单\n");
getch();
return head; //返回头指针
}
void Search(TEL* head)
{
int choice;
int count=1; //联系人序号
TEL *p;
int flag;
int searchflag=1;
char go;
char name[100];
char type[100];
printf("查询方式:(请输入序号)\n");
printf("1.姓名\n");
printf("2.类别\n");
printf("3.显示所有\n");
scanf("%d",&choice);
getchar();
switch(choice) //选择查询方式
{
case 1:
while(searchflag)
{
flag=0;
printf("\n请输入待查找联系人的姓名: \n");
scanf("%s",&name);
getchar();
p=head;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
printf("%d.",count);