数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(32页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
目录
一、问题描述……………………………………….3
二、基本要求……………………………………….3
三、数据结构的设计……………………………….3
四、软件模块结构图……………………………….3
五、程序流程图…………………………………….5
六、源程序………………………………………….
七、调试分析………………………………………13
八、测试数据………………………………………17
九、用户使用手册…………………………………28
十、心得体会………………………………………29
一、问题描述
试编程完成通讯录的一般性管理工作,如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含姓名、电话号码、住址等个人基本信息。
二、基本要求
设计内容:
本系统应完成一下几方面的功能:
1)输入信息——enter();
2)显示信息———display();
3)查找以姓名作为关键字———search();
4)删除信息———delete();
5)存盘———save();
6)装入———load();
三、数据结构的设计
3.1主要数据结构
主要利用线性表的链式存储结构,来存储数据和信息。
3.2设计方法及原理
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。
因此,为了表示每个数据元素与其后继元素之间的逻辑关系,对于数据元素来说,除了存储数据本身信息之外,还需要存储一个指示其后继的信息。
这两部分组成数据的存储映像,称为结点。
四、软件模块结构图
五、程序流程图
6、源程序
/******头文件(.h)***********/
#include
#include/*I/O函数*/
#include/*标准库函数*/
#include/*字符串函数*/
#include/*字符操作函数*/
#include
#include
#defineM50/*定义常数表示记录数*/
//定义颜色
#defineREDSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
#defineCYANSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
#definePURPLESetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
#defineYELLOWSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
#defineWHITESetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
voidgotoxy(inta,intb)
{
intxx=0x0b;
HANDLEhOutput;
COORDloc;
loc.X=a;
loc.Y=b;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,loc);
return;
}
typedefstruct/*定义数据结构*/
{
charname[20];/*姓名*/
charflat[30];/*住址*/
chartele[10];/*电话*/
}ADDRESS;
/******声明函数原型*******/
intenter(ADDRESSt[]);/*输入记录*/
voiddisplay(ADDRESSt[],intn);/*显示记录*/
voidsearch(ADDRESSt[],intn);/*按姓名查找显示记录*/
intdeleter(ADDRESSt[],intn);/*删除记录*/
voidsave(ADDRESSt[],intn);/*记录保存为文件*/
intload(ADDRESSt[]);/*从文件中读记录*/
voidcopy();/*文件复制*/
voidprint(ADDRESStemp);/*显示单条记录*/
intfind(ADDRESSt[],intn,char*s);/*查找函数*/
intmenu_select();/*主菜单函数*/
/******主函数开始*******/
intmain()
{
inti;
ADDRESSadr[M];/*定义结构体数组*/
intlength;/*保存记录长度*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{
case0:
length=enter(adr);break;/*输入记录*/
case1:
display(adr,length);break;/*显示全部记录*/
case2:
search(adr,length);break;/*查找记录*/
case3:
length=deleter(adr,length);break;/*删除记录*/
case4:
save(adr,length);break;/*保存文件*/
case5:
length=load(adr);break;/*读文件*/
case6:
copy();break;/*复制文件*/
case7:
exit(0);/*如返回值为11则程序结束*/
}
}
}
/*菜单函数,函数返回值为整数,代表所选的菜单项*/
intmenu_select()
{
chars[80];
intc;
gotoxy(1,20);/*将光标定为在第20行,第1列*/
WHITE
printf("pressanykeyentermenu......\n");/*提示压任意键继续*/
system("pause");
system("cls");
gotoxy(1,1);
YELLOW
printf("\t*******************************************************************\n");
CYAN
printf("\n\t\t\tWELCOMETOTELECOM'SRESULTMANAGE\n");
YELLOW
printf("\t*******************************************************************\n");
PURPLE
printf("\t___________________________________________________________________\n\n");
printf("\t0.Enterrecord4.Savethefile\n");
printf("\t1.Displaythefile5.Loadthefile\n");
printf("\t2.Searchrecordonname6.copythefiletonewfile\n");
printf("\t3.Deletearecord7.Quit\n");
printf("\t___________________________________________________________________\n\n");
do{
CYANprintf("\n\t请输入您的选项(0~7):
");/*提示输入选项*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整型数*/
}while(c<0||c>7);/*选择项不在0~7之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/
intenter(ADDRESSt[])
{
inti,n;
char*s;
system("cls");
YELLOWprintf("\n您希望录入的联系人数目为:
\t");/*提示信息*/
scanf("%d",&n);/*输入记录数*/
PURPLEprintf("\n请开始编辑联系人信息!
");/*提示输入记录*/
printf("\n______\\(^o^)//_______\\(^o^)//_______\\(^o^)//______\\(^o^)//_______\\(^o^)//____\n");
printf("姓名住址电话号码\n");
printf("-----------------------------------------------------------------------------\n");
for(i=0;i{
scanf("%s%s%s",t[i].name,t[i].flat,t[i].tele);/*输入记录*/
printf("-----------------------------------------------------------------------------\n");
//printf("%s%s%s",t[i].name,t[i].flat,t[i].tele);
}
returnn;/*返回记录条数*/
}
/*显示记录,参数为记录数组和记录条数*/
voiddisplay(ADDRESSt[],intn)
{
inti;
system("cls");
YELLOW
printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^ALLTELCOM'SINFORMATION^^^^^^^^^^^^^^^^^^^^^^^^^\n");
CYAN
printf("\n姓名住址电话号码\n");
YELLOW
printf("----------------------------------------------------------------------------\n");
for(i=0;i{
CYAN
printf("%-20s%-30s%-10s\n",t[i].name,t[i].flat,t[i].tele);
}
if((i+1)%10==0)/*判断输出是否达到10条记录*/
{
YELLOW
printf("请按任意键继续...\n");/*提示信息*/
system("pause");
}
printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^END^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
}
/*查找记录*/
voidsearch(ADDRESSt[],intn)
{
chars[20];/*保存待查找姓名字符串*/
inti;/*保存查找到结点的序号*/
system("cls");
YELLOW
printf("请输入查找联系人姓名:
\n");
scanf("%s",s);/*输入待查找姓名*/
i=find(t,n,s);/*调用find函数,得到一个整数*/
if(i>n-1)/*如果整数i值大于n-1,说明没找到*/
printf("抱歉!
未发现该联系人信息。
\n");
else
print(t[i]);/*找到,调用显示函数显示记录*/
}
/*显示指定的一条记录*/
voidprint(ADDRESStemp)
{
system("cls");
CYAN
printf("\n----*o*----*o*----*o*----*o*----*o*----*o*----*o*----*o*----*o*----*o*-\n");
printf("\n姓名住址电话号码\n");
printf("\n-----------------------------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.flat,temp.tele);
printf("~~~~O&O~~~~O&O~~~~O&O~~~~O&O~~~~O&O~~~~END~~~~O&O~~~~O&O~~~~O&O~~~~O&O~~~\n");
}
/*查找函数,参数为记录数组和记录条数以及姓名s*/
intfind(ADDRESSt[],intn,char*s)
{
system("cls");
inti;
for(i=0;i{
if(strcmp(s,t[i].name)==0)/*记录中的姓名和待比较的姓名是否相等*/
returni;/*相等,则返回该记录的下标号,程序提前结结束*/
}
returni;/*返回i值*/
}
/*删除函数,参数为记录数组和记录条数*/
intdeleter(ADDRESSt[],intn)
{
chars[20];/*要删除记录的姓名*/
intch=0;
inti,j;
system("cls");
YELLOW
printf("请输入希望删除的联系人姓名:
\n");/*提示信息*/
scanf("%s",s);/*输入姓名*/
i=find(t,n,s);/*调用find函数*/
if(i>n-1)/*如果i>n-1超过了数组的长度*/
printf("抱歉!
未发现希望删除的联系人信息.\n");/*显示没找到要删除的记录*/
else
{
print(t[i]);/*调用输出函数显示该条记录信息*/
RED
printf("确定要删除该联系人信息?
<提示:
1为删除,0为不删除!
>\n");/*确认是否要删除*/
printf("请输入你的选项:
");
scanf("%d",&ch);/*输入一个整数0或1*/
if(ch==1)/*如果确认删除整数为1*/
{
for(j=i+1;j{
strcpy(t[j-1].name,t[j].name);/*将后一条记录的姓名拷贝到前一条*/
strcpy(t[j-1].flat,t[j].flat);/*将后一条记录的单位拷贝到前一条*/
strcpy(t[j-1].tele,t[j].tele);/*将后一条记录的电话拷贝到前一条*/
}
n--;/*记录数减1*/
printf("删除成功!
!
!
\n");
}
}
returnn;/*返回记录数*/
}
/*保存函数,参数为结构体数组和记录数*/
voidsave(ADDRESSt[],intn)
{
inti;
FILE*fp;/*指向文件的指针*/
system("cls");
if((fp=fopen("record.txt","wb"))==NULL)/*打开文件,并判断打开是否正常*/
{
RED
printf("抱歉!
无法打开该文件。
\n");/*没打开*/
exit
(1);/*退出*/
}
YELLOW
printf("\n保存文件\n");/*输出提示信息*/
fprintf(fp,"%d",n);/*将记录数写入文件*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
for(i=0;i{
fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].flat,t[i].tele);/*格式写入记录*/
fprintf(fp,"\r\n");/*将换行符号写入文件*/
}
fclose(fp);/*关闭文件*/
PURPLE
printf("\\n___\\(^o^)//_______\\(^o^)//_____恭喜!
保存成功。
_____\\(^o^)//______\n");/*显示保存成功*/
}
/*读入函数,参数为结构体数组*/
intload(ADDRESSt[])
{
inti,n;
FILE*fp;/*指向文件的指针*/
system("cls");
if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/
{
RED
printf("抱歉!
无法打开该文件。
\n");/*不能打开*/
exit
(1);/*退出*/
}
fscanf(fp,"%d",&n);/*读入记录数*/
for(i=0;ifscanf(fp,"%20s%30s%10s",t[i].name,t[i].flat,t[i].tele);/*按格式读入记录*/
fclose(fp);/*关闭文件*/
PURPLE
printf("恭喜您成功地将文件信息读入!
!
!
\n");/*显示保存成功*/
returnn;/*返回记录数*/
}
/*复制文件*/
voidcopy()
{
charoutfile[20];/*目标文件名*/
inti,n;
ADDRESStemp[M];/*定义临时变量*/
FILE*sfp,*tfp;/*定义指向文件的指针*/
system("cls");
if((sfp=fopen("record.txt","rb"))==NULL)/*打开记录文件*/
{
RED
printf("抱歉!
无法打开该文件。
\n");/*显示不能打开文件信息*/
exit
(1);/*退出*/
}
YELLOW
printf("请输入目标文件的名称,例如c:
\\f1\\te.txt:
\n");/*提示信息*/
scanf("%s",outfile);/*输入目标文件名*/
if((tfp=fopen(outfile,"wb"))==NULL)/*打开目标文件*/
{
RED
printf("抱歉!
无法打开该文件。
\n");/*显示不能打开文件信息*/
exit
(1);/*退出*/
}
fscanf(sfp,"%d",&n);/*读出文件记录数*/
fprintf(tfp,"%d",n);/*写入目标文件数*/
fprintf(tfp,"\r\n");/*写入换行符*/
for(i=0;i{
fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].flat,
temp[i].tele);/*读入记录*/
fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,
temp[i].flat,temp[i].tele);/*写入记录*/
fprintf(tfp,"\r\n");/*写入换行符*/
}
fclose(sfp);/*关闭源文件*/
fclose(tfp);/*关闭目标文件*/
PURPLE
printf("恭喜您成功地复制该文件!
!
!
\n");/*显示复制成功*/
}
七、调试分析
(1)delete无法直接定义为删除函数,因此将其改为deleter,即可实现构造删除函数的目的。
(2)主函数main()不能为无返回值类型,将其改为返回整型只类型即可。
(3)缺少一个头文件windows,程序出现大量错误。
(4)程序在第70行遗漏了一个反花括弧,导致程序出现大量错误。
(5)程序在第101行遗漏了一个分号,导致程序出错。
八、测试数据
8.1启动程序:
8.2菜单栏显示:
8.3选择选项0,进入联系人信息录入功能:
8.4返回主菜单,选择选项1,显示所有联系人信息:
8.5返回主菜单,选择选项2,进入查询联系人信息功能:
(1)根据系统提示,输入希望查询的联系人姓名后,可查看该联系人姓名:
(2)若所输入的待查询联系人有误,系统将警示无该联系人信息:
8.6返回主菜单,选择选项3,进入删除联系人信息的功能:
(1)根据系统提示,输入希望删除的联系人姓名后,即可进入到删除联系人信息的界面,由用户自行决定是否删除该条联系人记录,删除该联系人信息后通过主菜单选择显示联系人信息选项即可查看删除结果:
(2)若用户输入的待删除联系人有误,则系统警示无该联系人信息:
8.7返回主菜单选择保存文件选项4存盘即可将联系人信息以文件的形式保存,并且文件名为record,文件所在位置即为程序所在的存储路径:
8.8返回主菜单,选择选项5装入即可将文件信息读入通讯录系统。
首先通过选项1显示目前通讯录已有的联系人信息,接着对record文件中的联系人信息进行修改,例如添加两个新联系人,待将文件信息装入通讯录系统后,再通过选项1显示装入后的新的联系人信息:
8.9返回主菜单,选择选项6将通讯录系统中的联系人信息复制到新的文件中,即可实现通讯信息的备份:
(1)任意输入一个无效的存储路径,则系统会警示无法打开该文件:
(2)输入一个有效的存储路径即可实现目标功能,以达到对通讯信息备份的功能:
九、用户使用手册
此通讯录系统是一个较为简单的通讯录系统,目前该系统只支持对联系人姓名、住址、一个电话号码进行编辑储存,因此用户在使用过程中一定要严格按照系统的提示进行操作,否则系统会警示错误更严重的情况会出现bug。
当然,后期的处理过程中,本设计者会对程序的不足进