1、完整word版车牌号管理系统word文档良心出品淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 数据结构课程设计 选题名称: 车牌号管理系统 姓 名: 学 号: 专业班级: 软件工程 系 (院): 计算机工程学院 设计时间: 2011.12.192011.12.30 设计地点: 软件工程实验室、教室 成绩:指导教师评语: 签名: 年 月 日1课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题
2、的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2课程设计任务与要求:任务根据教材数据结构-C语言描述(耿国华主编)和参考书数据结构题集(C语言版)(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。设计题目从任务书所列选题表中选取,每班每题不得超过2人。学生自选课题学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识
3、。学生自选课题需在18周前报课程设计指导教师批准方可生效。要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C+,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、
4、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3课程设计说明书一 需求分析1功能需求: 本程序利用基数排序的思想对一批具有结构特征的汽车牌照进行排序,并且利用二分查找的思想对排好序的汽车牌照进行查找。2性能需求: 运行程序时,输入一组要求的数据后,按要求操作,进行排序,查询时程序查找到匹配的数据,输出该关键字的其他信息。3数据需求: 数据包括3项,分别为牌照的号码,车的型号,车主的姓名,其中牌照的一项输入形式为01B7328,前两位代表地区,字母代表车的使用类型,后四位代表车号,查询时要求输入正确的车牌号码。 二 概要设计1设计静态查找表
5、的抽象数据类型ADT RecordTypechar name20; 车主名字char carname20; 车名KeyType key7; 子关键字 ADT RecordTypeADT SLinkList数据元素:关键字,是一个RecordType类型的数组,存放车牌号。数据之间的关系是线性关系;2.本程序包含三个模块。主程序中的内容有Void main 1初始化加入数据;2.遍历表;3排序;4折半查找;5.退出;系统中的子程序及功能要求。1.Void Distribute(RecordType r,int i,pvector head,pvector tail)记录 数组r中已按低位关键字k
6、eyi+1,keyd进行低位优先排序,本算法 按第i个关键字keyi建立10个队列,同一个队列中记录的keyi相同。Headj和tailj分别指向各自队列中第一个和最后一个记录(j=0,1,2,9).headj=0表示相应队列为空队列。2.Void collect(RecordType r,pvctor head,pvctor tail)本算法从0到9扫描个队列将所有非空队列首尾相接,重新链接成一个链表。3.Void RadixSort(Record r,int length)Length 个记录存放在数组r中,执行本算法进行基数排序后,链表中的记录将按关键字从小到大的顺序链接。5. void
7、 arrange(SLinkList *l) 对静态表进行整序6.int search_bin(SLList l,char key) 二分查找7. void GetData(SLinkList *L) 从键盘获得数据。8. void SLListTraverse(SLinkList *L)遍历静态表9. int Equal(char key1,char key2)判断相等10. int Little(char key1,char key2)判断较小模块之间调用关系主函数调,(3,5),6,7,83调用1,26调用 9,10三 详细设计主要函数void Distribute_n(RecordTy
8、pe r,int i,shuzi head,shuzi tail) /数字分配 int j,p; for(j=0;j=队列的个数;j+) /初始化队列 队列的头指针=0;全部为0 对列的尾指针=0;全部为0 p=第一个数据在数组中的位置 while(第一个数据在数组中的位置!=0) j=第一个数据的第i位在第几个队列 if(头指针=0) 头指针=第一个数据载表中的位置; else 该队列已有数据的下一个位置=p 否则将该数在静态链表中的位置放在在同一个队列的数据之后 尾指针=p; tialj=该数在静态链表中的位置 p=下一个数据的位置值; void Collect_n(RecordType
9、r,shuzi head,shuzi tail) /收集重新构成链表 int j=0,t; while(headj=0) +j; /找第一个不为空的队列 r0.next=headj;t=tailj; /把headj给第一个数据的位置 while(j9) +j; while(jlength; 数组的长度 zimu head,tail; shuzi heads,tails; for(int i=0;iri.next=i+1; 初始化静态链表,确定静态链表的各个元素的位置 l-rn.next=0; 使最后一个数的next等于0 for(i=6;i2;i-) Distribute_n(l-r,i,he
10、ads,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); 调用收集函数 void arrange(SLinkList *l) /整序 int p,q; RecordType buf; 建立中间变量 p=第一个元素在表中的位置; p指向第一个元素在表
11、中的位置 for(int i=1;i表的长度;i+) while(pi)p=第p个元素的下一个数在表中的位置; q=第p个元素的下一个数在表中的位置; if(p!=i) buf=第p个元素的地址; 第p个元素的地址=第i个元素的地址; 交换第i个元素的地址与第p个元素的地址 第i个元素的地址=buf; 第i个元素的下一个数在表中的位置=p; p=q; void GetData(SLinkList *L) /获得数据 char key=0; int j=1; cout请输入车牌号码及车名与车主名,用#结束endl; cout例如: 01B3456endl; cout车牌号=; for(int i
12、=0;ikey; 输入数据 第一个数据的车牌号码=key; cout第一个数据的车名; cout第一个数据的车主名; while(key!=#) j+; coutendl车牌号=; for(int i=0;ikey; 输入第j个数据的车牌号码 if(key=#) j-;break; 第j个数据的车牌号码=key; if(key=#) break; coutL-rj.carname; coutL-rj.name; L-length=j; int binsearch(SLinkList *L,char s7) /折半查找 int k=0,sum=0,ss=0,mid,high,low=1; hig
13、h=L-length; while(lowrmid.key)return(mid); 调用判断相等函数 else if(Little(s,L-rmid.key)high=mid-1; 调用比较大小函数 else low=mid+1; return(0); 四 设计与调试分析1.车牌号管理1.1 初始化输入数据,车牌号码,车主名以及车名。从键盘输入需要的数据。如车牌号:20W4521 车名bmw 车主名 zzx车牌号:11F4587 车名lanbogine 车主名 zzp车牌号:55F1254 车名benz 车主名 xcl初始化成功。1.2将表中的内容输出遍历成功。车牌号:20W4521 车名b
14、mw 车主名 zzx车牌号:11F4587 车名lanbogine 车主名 zzp车牌号:55F1254 车名benz 车主名 xcl与输入结果一致。1.3对车牌号进行排序,用基数排序的方法。11F4587 lanbogine zzp20W4521 bmw zzx55F1254 benz xcl与预期结果一致。1.4折半查找需要的车牌号码,输出此车牌号码的车主及车名与预期结果一致。查找成功。1.5退出五 用户手册1.运行程序,首先出现主界面,选项一,初始化表加入数据。选项二,遍历表。选项三,对车牌号排序。选项四,查找。选项五,退出。运行查找之前一定要进行排序,因为是折半查找,所以要先进行排序。
15、2.输入数据,输入车牌号码,例如01B3456,及车主的姓名,车的名字。3.遍历,顺序输出所有的数据4,按基数排序的方法进行排序5,查找,输入要查找的车牌号码,若查找成功则返回需要的车牌号及车主名与车名,若没有此信息则返回没有此车牌号。六 测试成果七 附录(源程序清单)#define KEY_SIZE 7#define LIST_SIZE 10#include using namespace std;typedef struct char keyKEY_SIZE; char name10; char carname20; int next;RecordType;typedef struct R
16、ecordType rLIST_SIZE; int length; int keynum;SLinkList;typedef int shuzi10;typedef int zimu26;void InitSLList(SLinkList *L) /链表初始化 L-length=0; L-keynum=7;void Distribute_n(RecordType r,int i,shuzi head,shuzi tail) /数字分配 int j,p; for(j=0;j=9;j+) headj=0; tailj=0; p=r0.next; while(p!=0) j=int(rp.keyi-
17、0); if(headj=0) headj=p; else rtailj.next=p; tailj=p; p=rp.next; void Distribute_c(RecordType r,int i,zimu head,zimu tail) /字母分配 int p,j; for(j=0;j=25;j+) headj=0; tailj=0; p=r0.next; while(p!=0) j=int(int(rp.keyi)-A); if(headj=0)headj=p; else rtailj.next=p; tailj=p; p=rp.next; void Collect_n(Record
18、Type r,shuzi head,shuzi tail) /收集重新构成链表 int j=0,t; while(headj=0) +j; r0.next=headj;t=tailj; while(j9) +j; while(j9)&(headj=0) +j; if(headj!=0) rt.next=headj; t=tailj; rt.next=0;void Collect_c(RecordType r,zimu head,zimu tail) /字母类型收集重新构成链表 int j=0,t; while(headj=0) +j; r0.next=headj;t=tailj; while(
19、j25) +j; while(jlength; zimu head,tail; shuzi heads,tails; for(int i=0;iri.next=i+1; l-rn.next=0; for(i=6;i2;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,he
20、ads,tails); /调用分配函数 Collect_n(l-r,heads,tails); /调用收集函数 void arrange(SLinkList *l) /整序 int p,q; RecordType buf; p=l-r0.next; /p指向第一个记录的当前位置 for(int i=1;ilength;i+) while(prp.next; /找到第i个记录,并用p指示其在表中的当前位置。 q=l-rp.next; if(p!=i) buf=l-rp; l-rp=l-ri; l-ri=buf; /交换p与i l-ri.next=p; /使得被移走的记录使得以后可以由while循
21、环找回 p=q; void GetData(SLinkList *L) /获得数据 char key=0; int j=1; cout请输入车牌号码及车名与车主名,用#结束endl; cout例如: 01B3456endl; cout车牌号=; for(int i=0;ikey; L-r1.keyi=key; coutL-r1.carname; coutL-r1.name; while(key!=#) j+; coutendl车牌号=; for(int i=0;ikey; if(key=#) j-;break; L-rj.keyi=key; if(key=#) break; coutL-rj.
22、carname; coutL-rj.name; L-length=j; void SLListTraverse(SLinkList *L) /遍历静态表 int i,j; coutendl; cout车牌号 车名 车主名endlendl; for(i=1;ilength;i+) for(j=0;j7;j+) coutri.keyj; cout ri.carname ; coutri.nameendl; int Equal(char key1,char key2) /判断相等 for(int i=0;i7;i+) if(key1i!=key2i) return 0; return 1;int L
23、ittle(char key1,char key2) /判断较小 for(int i=0;i7;i+) if(key1ikey2i) return 0; return 0;int binsearch(SLinkList *L,char s7) /折半查找 int k=0,sum=0,ss=0,mid,high,low=1; high=L-length; while(lowrmid.key)return(mid); else if(Little(s,L-rmid.key)high=mid-1; else low=mid+1; return(0); void main() int i; SLink
24、List l; do cout请选择 1.初始化表加入数据 2.遍历表 3.对车牌号排序 4.折半查找(必须先排好序) 5退出 i; switch(i) case 1:InitSLList(&l); GetData(&l); break; case 2:SLListTraverse(&l);break; case 3:radixsort(&l); arrange(&l); SLListTraverse(&l); break; case 4: int find; char s7; cout请输入要查找的车牌号码s; find=binsearch(&l,s); if(find) cout在表中的位置为binsearch(&l,s)endl; cout车名; coutl.rfind.carnameendl; cout车牌号码; for(int i=0;i7;i+) coutl
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1