数据结构课程设计报告通讯录.docx
《数据结构课程设计报告通讯录.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告通讯录.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告通讯录
数据结构课程设计报告
专业:
计算机科学与技术
年级:
课题名称:
通讯录
小组成员1:
小组成员2:
小组成员3:
信息技术学院专业教研室一
一、问题描述
设计目的:
用〈〈数据结构〉〉中的双向链表作数据结构,结合C语言基本知识。
编写一个通讯录管理系统。
以把所学数据结构知识应用到实际软件开发中去。
设计内容:
本系统应完成一下几方面的功能:
1)输入信息——enter();
2)显示信息———display();
3)查找以姓名作为关键字———search();
4)删除信息———delete();
5)存盘———save();
6)装入———load();
设计要求:
1)每条信息至包含:
姓名(NAME)街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项
2)作为一个完整的系统,应具有友好的界面和较强的容错能力
3)上机能正常运行,并写出课程设计报告
二、需求分析
A,添加:
系统将提示用户输入新添加人员信息,输入到文件中,人员信息数据包括姓名(name),街道(street),城市(city),邮编(eip),国家(state).
B,删除:
首先由用户输入要删除的人员的姓名,然后调用删除函数,删除该人员的所有相关资料.
C,显示所有人员信息:
该功能将显示已经保存的所有人员的姓名,街道,城市,邮编及国家.
D,查询:
可由用户输入要查找的人员姓名,然后系统用查找函数查找,接着系统使用相关文件命令输出所查找的人员的全部信息.
E,退出系统
关闭通讯录管理系统.
三、概要设计
六个函数的实现:
voidenter();新添纪录
voidsearch();按姓名查询
voiddisplay();显示
voidload();读取文件
voidsave();写入文件
voiddelete();删除
四、详细设计
通讯录管理系统功能说明图:
新添联系人
查询菜单
删除联系人
保存退出
不保存退出
通讯录管理系统
数据结构及各模块分析:
1.设计类、对象及基本数据类型:
创建一个record类,它有五个数据成员:
charname[20];姓名
charstreet[20];街道
charcity[20];城市
chareip[20];邮编
charstate[20];国家
2.包含函数及功能如下:
voidmainmenu();主菜单
voidsearchmenu();查找菜单
voidenter();新添纪录
voidsearch();按姓名查询
voiddisplay();显示所有
voidload();读取文件
voidsave();写入文件
voiddelete();按姓名删除
3.结构体:
structrecord
{
charstreet[20];
charname[20];
charcity[20];
charstate[20];
chareip[20];
}student[500];
structslnode
{
recorddate;
structslnode*next;
structslnode*prior;
};
五、调试分析
●voidload()//从文件导入
{
if((fp=fopen("student","rb"))==NULL)//打开文件进行读的操作
{
printf("\n\t\t通讯录文件不存在");
if((fp=fopen("student","wb"))==NULL)//打开文件进行读的操作
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录文件已建立");
printf("\n\t\t按任意键进入主菜单");
getch();//从键盘接收一个字符
}
return;//返回主函数的主菜单
}
exit(0);
}
fseek(fp,0,2);/*文件位置指针移动到文件末尾*/
if(ftell(fp)>0)/*文件不为空*/
{
rewind(fp);/*文件位置指针移动到文件开始位置*/
for(num=0;!
feof(fp)&&fread(&student[num],sizeof(structrecord),1,fp);num++);
.......
getch();
return;
}
●voidmainmenu()//主菜单
{
charchoic;
system("cls");
printf("\n\t\t***************欢迎进入通讯录系统***************");
printf("\n\t\t******************1-新添纪录******************");
printf("\n\t\t******************2-查找联系人****************");
printf("\n\t\t******************3-删除联系人***************");
printf("\n\t\t******************4-保存退出*****************");
printf("\n\t\t******************5-不保存退出***************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
choic=getch();
switch(choic)
{
case'1':
enter();break;
case'2':
searchmenu();break;
case'3':
delet();break;
case'4':
save();break;
case'5':
exit(0);
default:
mainmenu();
}
}
●voidsearchmenu()//查询菜单
{
charchoic;
system("cls");
printf("\n\t\t*******************查询菜单*******************");
printf("\n\t\t****************1-显示所有********************");
printf("\n\t\t****************2-按姓名查询******************");
printf("\n\t\t****************3-返回主菜单******************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:
");
choic=getch();
switch(choic)
{
case'1':
display();break;
case'2':
search();break;
case'3':
mainmenu();break;
}
}
●voidenter()//添加纪录
{
printf("\n\t\t****************请输入学生信息****************\n");
printf("\n\t\t姓名:
");
scanf("%s",&student[num].name);
printf("\n\t\t街道:
");
scanf("%s",&student[num].street);
printf("\n\t\t城市:
");
scanf("%s",&student[num].city);
printf("\n\t\t输入邮编:
");
scanf("%s",&student[num].eip);
printf("\n\t\t国家:
");
scanf("%s",&student[num].state);
num++;
listinsert();
printf("\n\t\t是否继续添加?
(Y/N):
");
if(getch()=='y')
enter();
return;
}
●voiddisplay()//显示所有
{
inti;
system("cls");
if(num!
=0)
{
printf("\n\t\t***************以下为通讯录所有信息************");
for(i=0;i{
printf("\n\t\t姓名:
%s",student[i].name);
printf("\n\t\t街道:
%s",student[i].street);
printf("\n\t\t城市:
%s",student[i].city);
printf("\n\t\t邮编:
%s",student[i].eip);
printf("\n\t\t国家:
%s",student[i].state);
printf("\t\t");
if(i+1{
printf("\n\t\t__________________________");
//system("pause");
}
}
printf("\n\t\t************************************************");
}
else
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单:
");
getch();
return;
}
●voidsearch()//查找联系人
{
intj=0,a=0;//j用来记录查找
.......
scanf("%s",name);
for(inti=a;inext)//num用来表示联系人的个数
{
if(strcmp(name,p->next->date.name)==0)//查找是否有该人,有则输出该点所有信息,并往下查找。
{
printf("查询到的信息:
");
printf("\n");
printf("姓名:
");
printf("%s",p->next->date.name);
............
j++;
}
if(j==0)
printf("\t\t该通讯录没有该人!
");
if((i+1){
printf("\n\t\t是否继续查找相同名字的学生信息:
(y/n)");
.........
}
else
{
printf("\n\t\t按任意键返回主菜单");
..........
}
}
}
●voiddelet()//删除联系人
{
inta=0;
intfindmark=0;
intj;
intdeletemark=0;
inti;
charname[20];
printf("\n\t\t请输入要删除学生姓名:
");
scanf("%s",name);
for(i=a;i{
if(strcmp(student[i].name,name)==NULL)
{
printf("\n\t\t以下是您要删除的学生纪录:
");
findmark++;
printf("\n\t\t________________________________");
printf("\n\t\t姓名:
%s",student[i].name);
printf("\n\t\t街道:
%s",student[i].street);
printf("\n\t\t城市:
%s",student[i].city);
printf("\n\t\t邮编:
%s",student[i].eip);
printf("\n\t\t国家:
%s",student[i].state);
printf("\n\t\t________________________________");
printf("\n\t\t是否删除?
(y/n)");
if(getch()=='y')
{
for(j=i;jstudent[j]=student[j+1];
num--;
deletemark++;
printf("\n\t\t删除成功");
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");
if(getch()=='y')
{
a=i;
continue;
}
}
printf("\n\t\t是否继续删除?
(y/n)");
if(getch()=='y')
delet();
return;
}
if((i+1){
printf("\n\t\t是否继续删除相同姓名的同学信息?
(y/n)");
if(getch()=='y')
{
a=i;
continue;
}
}
}
else
continue;
}
if((deletemark==0)&&(findmark==0))
{
printf("\n\t\t没有该同学的纪录");
return;
}
else
if(findmark!
=0)
{
printf("\n\t\t没有重名信息");
printf("\n\t\t没有该同学的纪录");
return;
}
}
六、使用说明
1.运行环境:
MicrosoftVisualC++6.0
2.细节和具体的操作方法:
将软件进行初始化,即在VC++6.0中运行该程序,进入程序主界面,首次运行会建立txt文件,提示文件是否成功建立。
然后按任意键后进入主菜单。
界面显示的是“主菜单”,主菜单有五个方面:
1,新添记录
2,查询菜单
3,删除联系人
4,保存退出
5,不保存退出
按“1”新添加记录,根据提示,输入信息相关信息。
按“2”显示查询的菜单。
按“3”删除指定联系人。
按“4”将输入的联系人信息保存到文件中并退出通讯录。
按“5”退出通讯录,不保存输入的联系人信息。
查询菜单包裹三个方面
1,显示所有
2,按姓名查询
3,返回主菜单
按“1”显示所有联系人的信息。
按“2”按姓名进行查询。
按“3”返回主菜单。
七、总结
1.程序的编写应是:
三分编写,七分调试;
2.程序编写之前需求分析,至关重要,将关系这整个项目的成败.
3.熟能生巧,这次在用指针处理双向链表时,以前对这块内容并不十分清楚,这次感觉很吃力,所以在今后的编程之中,尽可能把基本技能练习熟练.
4.做软件最终是满足用户的需求,所以做软件时应一切应以用记为导向.