淮海工学院计算机工程学院数据结构课程设计通讯管理系统.docx
《淮海工学院计算机工程学院数据结构课程设计通讯管理系统.docx》由会员分享,可在线阅读,更多相关《淮海工学院计算机工程学院数据结构课程设计通讯管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
淮海工学院计算机工程学院数据结构课程设计通讯管理系统
淮海工学院计算机工程学院
课程设计报告
设计名称:
数据结构课程设计
选题名称:
通讯录管理系统
姓名:
学号:
专业班级:
系(院):
计算机工程学院
设计时间:
2012.12.24~2013.1.4
设计地点:
软件工程实验室、教室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计题目从任务书所列选题表中选取,每班每题不得超过2人。
学生自选课题
学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。
学生自选课题需在18周前报课程设计指导教师批准方可生效。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
该程序所做的工作是通讯录的管理系统,实现对联系人信息的添加、查询、浏览、删除、修改等功能。
程序规定:
(1)建立通讯薄,添加联系人的信息到此通讯薄,包括姓名、性别、城市、邮编、手机号、QQ号、Email;
(2)查询功能,按姓名、手机号查询联系人信息;
(3)其他功能:
现有联系人信息的浏览、修改、删除。
结果保存在文件中。
二概要设计
∙ 系统用到的抽象数据类型定义:
1.ADTLinearList{
数据元素:
D={
,i=1,2,…,n,
为某一数据对象}
关系:
基本操作:
(1)InitList(L);
(2)DestroyList(L);
(3)ClearList(L);
(4)EmptyList(L);
(5)ListLength(L);
(6)Locate(L,e);
(7)GetData(L,i);
(8)InsList(L,i,e);
(9)DelList(L,i,&e);
}ADTLinearList
系统中子程序及功能要求:
1.InitList(L):
初始化联系人的线性表。
2.CreatSeq(L,n):
建立一个顺序存储的线性表。
3.InsList(L,i,e):
插入联系人信息。
4.Add(L):
添加联系人信息。
5.SeqSearch(l,k):
顺序查找联系人信息。
6.NameSearch(L,k):
按姓名查询联系人信息。
7.NumberSearch(L,k):
按手机号查询联系人信息。
8.NameSort(r[],l):
按姓名进行排序。
9.Display(r[]):
浏览功能函数,按姓名显示所有联系人信息。
10.DelList(L,I,&e):
删除联系人信息。
11.Modifymenu(r[],k):
修改联系人信息。
12.mainmenu():
主菜单,包含添加、查询、浏览、删除、修改、退出功能。
13.searchmenu():
查询菜单,包括按姓名、手机号查询和返回主菜单功能。
14.Output(r[],i):
输出某联系人的信息;
∙ 各程序模块之间的调用关系(子程序编号见上):
主函数可调用子程序12
子程序12可调用子程序4、13、9、10、11
子程序4可调用子程序2、3、8、9
子程序13可调用子程序6、7
子程序9可调用子程序8
子程序10可调用子程序9
子程序11可调用子程序9
三详细设计
添加算法的伪代码描述如下:
voidInitList(SeqListL)/*初始化线性表
{
线性表长度赋值为0;
}
voidCreatSeq(SeqListL,intn)/*建立一个线形表
{
输出建立联系人的个数;
输入个数;
for(i=0;i<联系人;i++)
输入联系人的姓名、性别、城市、邮编、手机号、QQ号、Email;
线性表长度赋为n;
}
intInsList(SeqList*L,inti,RecordTyper[])
{
if(i<0||(i>L->last+1))
{
输出插入位置i不合法;
返回ERROR;
}
if(L->last>=maxsize)
{
输出表已满无法插入;
}
for(k=L->last;k>=i-1;k--)
k位置的信息移到k+1上;
赋i-1上的值为输入的信息;
表长+1;
}
intAdd(SeqListL,)
{调用函数CreatSeq(L)得到一个联系人表;
调用函数NameSort(r[],l)对联系人信息进行排序;
调用函数Display(r[])输出当前联系人的信息;
输出请输入添加的联系人的信息;
输入添加的联系人的信息;
调用函数InsList(&L,i,r)添加联系人;
调用函数NameSort(r[],l)对联系人信息进行排序;
调用函数Display(r[])输出当前联系人的信息;
}
intSeqSearch(SeqListL,KeyTypek)
{
赋记录表[0]的关键值等于k;
i=表长;
while([i]关键值不等于k)
i--;
返回(i);
}
voidNameSearch(SeqListL)
{
输出请输出要查找的联系人的姓名;
输入联系人的姓名charname[];
调用函数SeqSearch(L,name)得到联系人在表的位置a;
if(a==0)
输出该联系人不存在;
else
调用函数Output();
}
voidNumberSearch(SeqListL)
{
输出请输出要查找的联系人的手机号;
输入联系人的手机号intphone;
调用函数SeqSearch(L,phone)得到联系人在表的位置a;
if(a==0)
输出该联系人不存在;
else
调用函数Output();
}
voidNameSort(RecordTyper[],intlength)
{
for(i=2;i<=length;i++)
{
r[i]作哨兵;
j=i-1;
while(哨兵的关键值{
将j位置的关键值移到j+1位置上;
j减小1;
}
将哨兵记录插入到j+1位置上;
}
}
voidDisplay(RecordTyper[],intlength)
{
调用函数NameSort(r,l)对记录表进行排序;
输出姓名性别城市邮编手机号QQ号Email
for(i=1;i〈=length;i++)
{
输出记录i上的信息;
}
}
intDelList(SeqList*L,inti,ElemType*e)i为通过姓名查找所的位置
{
if(i<0||i>表长)
{
输出删除位置不合理;
返回错误;
}
*e指向顺序表记录表中的第i个记录;
for(k=i;k<=表长;k++)
{
将k+1位置上的信息移到k位置上;
}
表长-1;
返回正确;
}
voidModifymenu(RecordTyper[])
{
输出输入要修改的联系人的姓名;
输入姓名;
k=姓名;
调用SeqSearch(r,k),返回联系人的位置;
i=联系人的位置;
输出修改的信息
(1)性别
(2)城市,邮编(3)手机号(4)QQ号,Email;
flag=1;
while(flag)
{
输出请选择;
输入a
switch(a)
{
case1:
输出请输入要修改的性别;
输入修改性别b;
r[i].sex=b;
输出该人的所有信息;
break;
case2:
输出请入要修改的城市和邮编;
输入修改城市b,邮编c;
r[i].city=b;
r[i].postcode=c
输出该人的所有信息;
break;
case3:
输出请入要修改的手机号;
输入修改手机号b;
r[i].phone=b;
输出该人的所有信息;
break;
case4:
输出请入要修改的QQ和Email;
输入修改QQ号b,Emailc;
r[i].qq=b;
r[i].mail=c
输出该人的所有信息;
break;
case5:
flag=0;
调用函数mainmenu()返回主菜单;
break;
}
}
}
voidmainmenu()
{
flag=1;
输出欢迎使用通讯录管理系统
(1)添加
(2)查询
(3)浏览
(4)删除
(5)修改
(6)谢谢使用!
while(flag)
{
输出请选择:
输入数字;
switch(输入数字)
{
case1:
调用函数Add(L);
break;
case2:
调用函数searchmenu();
break;
case3:
调用函数Display(r[]);
break;
case4:
调用函数DelList();
break;
case5:
调用函数Modifymenu();
break;
case6:
flag=0
输出欢迎使用;
break;
}
}
}
voidsearchmenu()
{
flag=1
输出查询功能:
(1)按姓名查询;
(2)按手机号查询;
(3)返回主菜单
while(flag)
{
输出请选择;
输入数字;
switch(数字)
{
case1:
调用函数NameSearch();
break;
case2:
调用函数NumberSearch()
break;
case3:
flag=0;
调用函数mainmenu();
break;
}
}
}
四设计与调试分析
输入1,建立联系人,测试联系人是否建立成功。
输入2,输入添加的联系人的信息,测试是否添加成功。
输入3,测试查询功能,输入1,输入查询的姓名,是否可以查询到该联系人;输入2,输入手机号,是否可以查询到该联系人;输入3,是否可以返回主菜单。
输入4,测试浏览功能,是否能按姓名排序并显示所有的联系人。
输入5,测试删除功能,输入删除的联系人的姓名,看显示的当前的联系人是否已删除该联系人。
输入6,测试修改功能,输入修改的联系人的姓名,依次输入要修改的信息前的数字,输入修改后的内容,看输出的信息是否是修改后的信息。
输入7,测试退出程序,看是否能结束程序。
五用户手册
1、运行环境Windows,VC++6.0
2、执行文件:
通讯录管理系统.exe
3、用户界面:
主菜单包含
(1)建立联系人、
(2)添加、(3)查询、(4)浏览、(5)删除、(6)修改、(7)退出等功能,输入上述各数据,实现各功能。
输入1:
按提示输入初始建立联系人的个数,再分别输入各联系人的姓名、性别、城市、邮编、手机号、QQ号、Email,输完后按Enter键,会有当前联系人的显示。
输入2:
按提示输入要添加的联系人的各类信息,输完后按Enter键,会有当前联系人的显示。
输入3:
进入查询界面,有
(1)按姓名查询、
(2)按手机号查询、(3)返回主菜单。
输入1,输入要查询的联系人的姓名,Enter后会显示所查询联系人的所有信息;输入2,输入要查询联系人的手机号,Enter后会显示所查询联系人的所有信息;输入3,返回主菜单。
输入4:
可以浏览到所有联系人的按姓名排序的信息。
输入5:
进入删除功能,输入要删除的联系人的姓名,会显示删除后的联系人的姓名。
输入6:
进入修改界面,输入要修改联系人的姓名,可以修改
(1)姓名;
(2)性别;(3)城市、邮编;(4)手机号;(5)QQ、Email;输入上诉数字,可以实现相应功能。
输入7:
退出程序。
六测试成果
(1)主菜单:
添加联系人信息:
(2)添加联系人:
(3)查询:
按姓名、手机号
(4)浏览:
(5)删除:
(6)修改:
姓名、性别、城市、手机号、邮编、手机号、QQ号、Email
(7)退出:
七附录(源程序清单)
#include
#include
#include
#include
#include
#include
#definemaxsize100
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
typedefstruct
{
charname[20];
charsex[20];
charcity[20];
charpostcode[20];
charphone[20];
charqq[20];
charmail[20];
}Data;
typedefstruct
{
Datar[maxsize];
intlast;
}SeqList;
voidInitList(SeqList*L)
{
L->last=-1;
}
intsave(SeqList*L)
{
ofstreamoutfile("通讯录.txt",ios:
:
out);
if(!
outfile)
{
cerr<<"openerror!
"<exit
(1);
}
outfile<<"姓名性别城市邮编手机号QQ号Email"<for(inti=0;i<=L->last;i++)
{
outfile<r[i].name<r[i].sex<r[i].city<L->r[i].postcode<r[i].phone<r[i].qq<r[i].mail<}
outfile.close();
return0;
}
voidCreatSeq(SeqList*L)
{
intn;
printf("请输入建立的联系人的个数:
");
scanf("%d",&n);
printf("请输入联系人的姓名、性别、城市、邮编、手机号、QQ号、Email:
\n");
for(inti=0;i<=n-1;i++)
{
scanf("%s",&L->r[i].name);
scanf("%s",&L->r[i].sex);
scanf("%s",&L->r[i].city);
scanf("%s",&L->r[i].postcode);
scanf("%s",&L->r[i].phone);
scanf("%s",&L->r[i].qq);
scanf("%s",&L->r[i].mail);
}
L->last=n-1;
}
intInsList(SeqList*L,inti,Datar)
{
intk;
if((i<1)||(i>L->last+2))
{
printf("插入位置i不合法");
return(ERROR);
}
if(L->last>=maxsize-1)
{
printf("表已满无法插入");
return(ERROR);
}
for(k=L->last;k>=i-1;k--)
{
L->r[k+1]=L->r[k];
}
L->r[i-1]=r;
L->last++;
return(OK);
}
voidOutput(SeqList*L,inti)
{
printf("姓名性别城市邮编手机号QQ号Email\n");
printf("%-12s%-7s%-10s%-8s%-13s%-12s%s\n",L->r[i-1].name,L->r[i-1].sex,L->r[i-1].city,
L->r[i-1].postcode,L->r[i-1].phone,L->r[i-1].qq,L->r[i-1].mail);
}
intSeqSearch1(SeqList*L,chark[20])
{
inti=0;
while((i<=L->last)&&(strcmp(L->r[i].name,k))!
=0)
i++;
if(i<=L->last)
return(i+1);
elsereturn(-1);
}
intSeqSearch2(SeqList*L,chark[20])
{
inti=0;
while((i<=L->last)&&(strcmp(L->r[i].phone,k))!
=0)
i++;
if(i<=L->last)
return(i+1);
elsereturn(-1);
}
voidNameSearch(SeqList*L)
{
inti;
chara[20];
printf("请输入要查找的联系人的姓名:
");
scanf("%s",&a);
SeqSearch1(L,a);
i=SeqSearch1(L,a);
if(i==-1)
{
printf("该联系人不存在\n");
}
else
Output(L,i);
}
voidNumberSearch(SeqList*L)
{
inti;
chara[20];
printf("请输入要查找的联系人的手机号:
");
scanf("%s",&a);
SeqSearch2(L,a);
i=SeqSearch2(L,a);
if(i==-1)
{
printf("该联系人不存在\n");
}
else
Output(L,i);
}
intQKPass(Datar[],intleft,intright)
{
Datax;
intlow,high;
x=r[left];
low=left;
high=right;
while(low{
while((low=0)
high--;
if(low{
r[low]=r[high];
low++;
}
while((lowlow++;
if(low{
r[high]=r[low];
high--;
}
}
r[low]=x;
returnlow;
}
voidQKSort(Datar[],intlow,inthigh)
{
intpos;
if(low{
pos=QKPass(r,low,high);
QKSort(r,low,pos-1);
QKSort(r,pos+1,high);
}
}
voidDisplay(SeqList*L)
{
QKSort(L->r,0,L->last);
printf("姓名性别城市邮编手机号QQ号Email\n");
for(inti=0;i<=L->last;i++)
{
printf("%-12s%-7s%-10s%-8s%-13s%-12s%s\n",L->r[i].name,L->r[i].sex,L->r[i].city,
L->r[i].postcode,L->r[i].phone,L->r[i].qq,L->r[i].mail);
}
}
voidAdd(SeqList*L)
{
Datar;
printf("\n请输入要添加的联系人的信息:
\n");
scanf("%s",&r.name);
scanf("%s",&r.sex);
scanf("%s",&r.city);
scanf("%s",&r.postcode);
scanf("%s",&r.phone);
scanf("%s",&r.qq);
scanf("%s",&r.mail);
InsList(L,L->last+2,r);
printf("\n当前联系人信息:
\n");
Display(L);
}
intDelList(SeqList*L,inti,Data*r)
{
if(i<1||i>L->last+1)
{
printf("删除位置不合法!
\n");
return(ERROR);
}
*r=L->r[i];
for(intk=i;k<=L->last;k++)
L->r[k-1]=L->r[k];
L->last--;
return(OK);
}
voidsearchmenu(SeqList*L);
voidModifymenu(SeqList*L);
voidmainmenu()
{
inti,flag=1,j;