完整word版车牌号管理系统word文档良心出品.docx
《完整word版车牌号管理系统word文档良心出品.docx》由会员分享,可在线阅读,更多相关《完整word版车牌号管理系统word文档良心出品.docx(25页珍藏版)》请在冰豆网上搜索。
完整word版车牌号管理系统word文档良心出品
淮海工学院计算机工程学院
课程设计报告
设计名称:
数据结构课程设计
选题名称:
车牌号管理系统
姓名:
学号:
专业班级:
软件工程
系(院):
计算机工程学院
设计时间:
2011.12.19~2011.12.30
设计地点:
软件工程实验室、教室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计题目从任务书所列选题表中选取,每班每题不得超过2人。
学生自选课题
学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。
学生自选课题需在18周前报课程设计指导教师批准方可生效。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
1.功能需求:
本程序利用基数排序的思想对一批具有结构特征的汽车牌照进行排序,并且利用二分查找的思想对排好序的汽车牌照进行查找。
2.性能需求:
运行程序时,输入一组要求的数据后,按要求操作,进行排序,查询时程序查找到匹配的数据,输出该关键字的其他信息。
3.数据需求:
数据包括3项,分别为牌照的号码,车的型号,车主的姓名,其中牌照的一项输入形式为01B7328,前两位代表地区,字母代表车的使用类型,后四位代表车号,查询时要求输入正确的车牌号码。
二概要设计
1.设计静态查找表的抽象数据类型
ADTRecordType{
charname[20];车主名字
charcarname[20];车名
KeyTypekey[7];子关键字
}ADTRecordType
ADTSLinkList{
数据元素:
关键字,是一个RecordType类型的数组,存放车牌号。
数据之间的关系是线性关系;
}
2.本程序包含三个模块。
主程序中的内容有
Voidmain
{
1初始化加入数据;
2.遍历表;
3.排序;
4.折半查找;
5.退出;
}
系统中的子程序及功能要求。
1.VoidDistribute(RecordTyper[],inti,pvectorhead,pvectortail)
记录数组r中已按低位关键字key[i+1],…,key[d]进行低位优先排序,本算法按第i个关键字key[i]建立10个队列,同一个队列中记录的key[i]相同。
Head[j]和tail[j]分别指向各自队列中第一个和最后一个记录(j=0,1,2,…9).head[j]=0表示相应队列为空队列。
2.Voidcollect(RecordTyper[],pvctorhead,pvctortail)
本算法从0到9扫描个队列将所有非空队列首尾相接,重新链接成一个链表。
3.VoidRadixSort(Recordr[],intlength)
Length个记录存放在数组r中,执行本算法进行基数排序后,链表中的记录将按关键字从小到大的顺序链接。
5.voidarrange(SLinkList*l)
对静态表进行整序
6.intsearch_bin(SLListl,charkey[])
二分查找
7.voidGetData(SLinkList*L)
从键盘获得数据。
8.voidSLListTraverse(SLinkList*L)
遍历静态表
9.intEqual(charkey1[],charkey2[])
判断相等
10.intLittle(charkey1[],charkey2[])
判断较小
模块之间调用关系
主函数调,(3,5),6,7,8
3调用1,2
6调用9,10
三详细设计
主要函数
voidDistribute_n(RecordTyper[],inti,shuzihead,shuzitail)//数字分配
{
intj,p;
for(j=0;j<=队列的个数;j++)//初始化队列
{
队列的头指针=0;全部为0
对列的尾指针=0;全部为0
}
p=第一个数据在数组中的位置
while(第一个数据在数组中的位置!
=0)
{
j=第一个数据的第i位在第几个队列
if(头指针==0)
头指针=第一个数据载表中的位置;else
该队列已有数据的下一个位置=p否则将该数在静态链表中的位置放在在同一个队列的数据之后
尾指针=p;tial[j]=该数在静态链表中的位置
p=下一个数据的位置值;
}
}
voidCollect_n(RecordTyper[],shuzihead,shuzitail)//收集重新构成链表
{
intj=0,t;
while(head[j]==0)
++j;//找第一个不为空的队列
r[0].next=head[j];t=tail[j];//把head[j]给第一个数据的位置
while(j<9)
{
++j;
while((j<9)&&(head[j]==0))找到不为0的队列
++j;
if(head[j]!
=0)
{
r[t].next=head[j];
t=tail[j];
}
}
r[t].next=0;//使最后一个数的next=0
}
voidradixsort(SLinkList*l)//基数排序
{
intn=l->length;数组的长度
zimuhead,tail;
shuziheads,tails;
for(inti=0;i<=n-1;i++)
l->r[i].next=i+1;初始化静态链表,确定静态链表的各个元素的位置
l->r[n].next=0;使最后一个数的next等于0
for(i=6;i>2;i--)
{
Distribute_n(l->r,i,heads,tails);调用分配函数
Collect_n(l->r,heads,tails);调用收集函数
}
Distribute_c(l->r,2,head,tail);调用分配函数
Collect_c(l->r,head,tail);调用收集函数
for(i=1;i>=0;i--)
{
Distribute_n(l->r,i,heads,tai调用分配函数
Collect_n(l->r,heads,tails);调用收集函数
}
}
voidarrange(SLinkList*l)//整序
{
intp,q;
RecordTypebuf;建立中间变量
p=第一个元素在表中的位置;p指向第一个元素在表中的位置
for(inti=1;i<表的长度;i++)
{
while(p
q=第p个元素的下一个数在表中的位置;
if(p!
=i)
{
buf=第p个元素的地址;
第p个元素的地址=第i个元素的地址;交换第i个元素的地址与第p个元素的地址
第i个元素的地址=buf;
第i个元素的下一个数在表中的位置=p;
}
p=q;
}
}
voidGetData(SLinkList*L)//获得数据
{
charkey='0';
intj=1;
cout<<"请输入车牌号码及车名与车主名,用'#'结束"<cout<<"例如:
01B3456"<cout<<"车牌号=";
for(inti=0;i<7;i++)
{
cin>>key;输入数据
第一个数据的车牌号码=key;
}
cout<<"车名:
";
cin>>第一个数据的车名;
cout<<"车主名:
";
cin>>第一个数据的车主名;
while(key!
='#')
{
j++;
cout<for(inti=0;i<7;i++)
{
cin>>key;输入第j个数据的车牌号码
if(key=='#'){j--;break;}
第j个数据的车牌号码=key;
}
if(key=='#')break;
cout<<"车名:
";
cin>>L->r[j].carname;
cout<<"车主名:
";
cin>>L->r[j].name;
}
L->length=j;
}
intbinsearch(SLinkList*L,chars[7])//折半查找
{
intk=0,sum=0,ss=0,mid,high,low=1;
high=L->length;
while(low<=high)
{
mid=(high+low)/2;
if(Equal(s,L->r[mid].key))return(mid);调用判断相等函数
elseif(Little(s,L->r[mid].key))high=mid-1;调用比较大小函数
elselow=mid+1;
}
return(0);
}
四设计与调试分析
1.车牌号管理
1.1初始化输入数据,车牌号码,车主名以及车名。
从键盘输入需要的数据。
如
车牌号:
20W4521车名bmw车主名zzx
车牌号:
11F4587车名lanbogine车主名zzp
车牌号:
55F1254车名benz车主名xcl
初始化成功。
1.2将表中的内容输出
遍历成功。
车牌号:
20W4521车名bmw车主名zzx
车牌号:
11F4587车名lanbogine车主名zzp
车牌号:
55F1254车名benz车主名xcl
与输入结果一致。
1.3对车牌号进行排序,用基数排序的方法。
11F4587lanboginezzp
20W4521bmwzzx
55F1254benzxcl
与预期结果一致。
1.4折半查找需要的车牌号码,输出此车牌号码的车主及车名
与预期结果一致。
查找成功。
1.5退出
五用户手册
1.运行程序,首先出现主界面,选项一,初始化表加入数据。
选项二,遍历表。
选项三,对车牌号排序。
选项四,查找。
选项五,退出。
运行查找之前一定要进行排序,因为是折半查找,所以要先进行排序。
2.输入数据,输入车牌号码,例如01B3456,及车主的姓名,车的名字。
3.遍历,顺序输出所有的数据
4,按基数排序的方法进行排序
5,查找,输入要查找的车牌号码,若查找成功则返回需要的车牌号及车主名与车名,若没有此信息则返回没有此车牌号。
六测试成果
七附录(源程序清单)
#defineKEY_SIZE7
#defineLIST_SIZE10
#include
usingnamespacestd;
typedefstruct{
charkey[KEY_SIZE];
charname[10];
charcarname[20];
intnext;
}RecordType;
typedefstruct{
RecordTyper[LIST_SIZE];
intlength;
intkeynum;
}SLinkList;
typedefintshuzi[10];
typedefintzimu[26];
voidInitSLList(SLinkList*L)//链表初始化
{
L->length=0;
L->keynum=7;
}
voidDistribute_n(RecordTyper[],inti,shuzihead,shuzitail)//数字分配
{
intj,p;
for(j=0;j<=9;j++)
{
head[j]=0;
tail[j]=0;
}
p=r[0].next;
while(p!
=0)
{
j=int(r[p].key[i]-'0');
if(head[j]==0)
head[j]=p;
else
r[tail[j]].next=p;
tail[j]=p;
p=r[p].next;
}
}
voidDistribute_c(RecordTyper[],inti,zimuhead,zimutail)//字母分配
{
intp,j;
for(j=0;j<=25;j++)
{
head[j]=0;
tail[j]=0;
}
p=r[0].next;
while(p!
=0)
{
j=int(int(r[p].key[i])-'A');
if(head[j]==0)head[j]=p;
elser[tail[j]].next=p;
tail[j]=p;
p=r[p].next;
}
}
voidCollect_n(RecordTyper[],shuzihead,shuzitail)//收集重新构成链表
{
intj=0,t;
while(head[j]==0)
++j;
r[0].next=head[j];t=tail[j];
while(j<9)
{
++j;
while((j<9)&&(head[j]==0))
++j;
if(head[j]!
=0)
{
r[t].next=head[j];
t=tail[j];
}
}
r[t].next=0;
}
voidCollect_c(RecordTyper[],zimuhead,zimutail)//字母类型收集重新构成链表
{
intj=0,t;
while(head[j]==0)
++j;
r[0].next=head[j];t=tail[j];
while(j<25)
{
++j;
while((j<25)&&(head[j]==0))
++j;
if(head[j]!
=0)
{
r[t].next=head[j];
t=tail[j];
}
}
r[t].next=0;
}
voidradixsort(SLinkList*l)//基数排序
{
intn=l->length;
zimuhead,tail;
shuziheads,tails;
for(inti=0;i<=n-1;i++)
l->r[i].next=i+1;
l->r[n].next=0;
for(i=6;i>2;i--)
{
Distribute_n(l->r,i,heads,tails);//调用分配函数
Collect_n(l->r,heads,tails);//调用收集函数
}
Distribute_c(l->r,2,head,tail);//调用分配函数
Collect_c(l->r,head,tail);//调用收集函数
for(i=1;i>=0;i--)
{
Distribute_n(l->r,i,heads,tails);//调用分配函数
Collect_n(l->r,heads,tails);//调用收集函数
}
}
voidarrange(SLinkList*l)//整序
{
intp,q;
RecordTypebuf;
p=l->r[0].next;//p指向第一个记录的当前位置
for(inti=1;ilength;i++)
{
while(pr[p].next;//找到第i个记录,并用p指示其在表中的当前位置。
q=l->r[p].next;
if(p!
=i)
{
buf=l->r[p];
l->r[p]=l->r[i];
l->r[i]=buf;//交换p与i
l->r[i].next=p;//使得被移走的记录使得以后可以由while循环找回
}
p=q;
}
}
voidGetData(SLinkList*L)//获得数据
{
charkey='0';
intj=1;
cout<<"请输入车牌号码及车名与车主名,用'#'结束"<cout<<"例如:
01B3456"<cout<<"车牌号=";
for(inti=0;i<7;i++)
{
cin>>key;
L->r[1].key[i]=key;
}
cout<<"车名:
";
cin>>L->r[1].carname;
cout<<"车主名:
";
cin>>L->r[1].name;
while(key!
='#')
{
j++;
cout<for(inti=0;i<7;i++)
{
cin>>key;
if(key=='#'){j--;break;}
L->r[j].key[i]=key;
}
if(key=='#')break;
cout<<"车名:
";
cin>>L->r[j].carname;
cout<<"车主名:
";
cin>>L->r[j].name;
}
L->length=j;
}
voidSLListTraverse(SLinkList*L)//遍历静态表
{
inti,j;
cout<cout<<"车牌号"<<""<<"车名"<<""<<"车主名"<for(i=1;i<=L->length;i++)
{
for(j=0;j<7;j++)
cout<r[i].key[j];
cout<<""<r[i].carname<<"";
cout<r[i].name<}
}
intEqual(charkey1[],charkey2[])//判断相等
{
for(inti=0;i<7;i++)
{if(key1[i]!
=key2[i])return0;}
return1;
}
intLittle(charkey1[],charkey2[])//判断较小
{
for(inti=0;i<7;i++)
{
if(key1[i]elseif(key1[i]>key2[i])return0;
}
return0;
}
intbinsearch(SLinkList*L,chars[7])//折半查找
{
intk=0,sum=0,ss=0,mid,high,low=1;
high=L->length;
while(low<=high)
{
mid=(high+low)/2;
if(Equal(s,L->r[mid].key))return(mid);
elseif(Little(s,L->r[mid].key))high=mid-1;
elselow=mid+1;
}
return(0);
}
voidmain()
{
inti;
SLinkListl;
do
{
cout<<"请选择1.初始化表加入数据2.遍历表3.对车牌号排序4.折半查找(必须先排好序)5退出"<cin>>i;
switch(i)
{
case1:
InitSLList(&l);
GetData(&l);
break;
case2:
SLListTraverse(&l);break;
case3:
radixsort(&l);
arrange(&l);
SLListTraverse(&l);
break;
case4:
intfind;
chars[7];
cout<<"请输入要查找的车牌号码"<cin>>s;
find=binsearch(&l,s);
if(find)
{
cout<<"在表中的位置为"<cout<<"车名";
cout<cout<<"车牌号码";
for(inti=0;i<7;i++)
cout<