【数据结构】汽车牌照的快速查询_第1页
【数据结构】汽车牌照的快速查询_第2页
【数据结构】汽车牌照的快速查询_第3页
【数据结构】汽车牌照的快速查询_第4页
【数据结构】汽车牌照的快速查询_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.东北大学信息科学与工程学院数据结构课程设计报告 题目 汽车牌照的快速查询课题组长 肖瑶课题组成员 陈果 张帅专业名称 计算机科学与技术班级 计算机1307指导教师 杨雷 2015 年 1月课程设计任务书题目: 汽车牌照的快速查询问题描述:在汽车数据的信息模型中,汽车牌照是具有结构特点的一类关键字。汽车牌照是字母和数字混编的,例如01B7238。利用查找和排序算法,实现辽宁省内汽车牌照的快速查找。设计要求:设计汽车牌照的快速查询程序。(1)采用顺序表、静态链表等数据结构。(2)利用静态链表对汽车牌照进行链式基数排序。(3)采用折半查找汽车牌照。(4)可以按城市进行分块索引查找。(5)其它完善性

2、功能。指导教师签字:2014年12月24日 目录1 课题概述11.1 课题任务11.2 课题原理11.3 相关知识32 需求分析22.1 课题调研22.2 用户需求分析23 方案设计23.1 总体功能设计23.2 数据结构设计23.3 函数原型设计23.4 主算法设计34 方案实现74.1 开发环境与工具74.2 程序设计关键技术74.3 个人设计实现(按组员分工)4.3.1 肖瑶设计实现74.3.1 张帅设计实现104.3.1 陈果设计实现145 测试与调试125.1 个人测试(按组员分工)125.1.1 肖瑶测试125.1.2 张帅测试145.1.3 测试155.2 组装与系统测试156

3、课题总结176.1 课题评价176.2 团队协作176.3 下一步工作176.4 个人设计小结(按组员分工)186.4.1 肖瑶设计小结186.4.2 陈果设计小结186.4.3 张帅设计小结197 附录A 课题任务分工20A-1 课题程序设计分工20A-2 课题报告分工21 附录B 课题设计文档(光盘)22B-1课程设计报告(电子版)22B-2源程序代码(*.H,*.CPP)22B-3工程与可执行文件)22 B-4屏幕演示录像文件(可选)22 附录C 用户操作手册(可选)22C.1 运行环境说明22C.2 操作说明22课题概述1.1课题任务 在汽车数据的信息模型中,汽车牌照是具有结构特点的一

4、类关键字。汽车牌照是字母和数字混编的,例如01B7238。利用查找和排序算法,实现辽宁省内汽车牌照的快速查找。设计汽车牌照的快速查询程序。(1)采用顺序表、静态链表等数据结构。(2)利用静态链表对汽车牌照进行链式基数排序。(3)采用折半查找汽车牌照。(4)可以按城市进行分块索引查找。(5)其它完善性功能。1.2 课题原理 通过输入汽车牌照信息,保存在一个文件中。程序从文件中读入信息,把车牌号码转换成相应的关键字并把车牌信息和关键字保存在链表中。再通过链式基数排序算法整理这些信息便于查找,最后通过折半查找算法实现快速查找功能。1.3 相关知识 一个汽车牌照相当于一辆汽车的身份证,因此通过查询汽车

5、牌照便可知道这辆汽车的主人、品牌等信息。汽车牌照是由汉子、字母及数字组成,即多关键字,其中数字和字母的比较1容易实现的,考虑到汉字的存储等各方面的原因,对汉字的排序并不是很容易就能完成的,因此不能直接对汉字排序。但特殊的是,汽车牌照中的汉字是各个省、直辖市及自治区的简称(比如辽代表辽宁,京代表北京),一共34个。但是由于汉语拼音可以和英文字母相互转换,因此可以按照汉语拼音的规则进行排序。 需求分析2.1 课题调研 汽车牌照由汉子、字母、数字组成,一汉字+字母+数字方式呈现。要实现对车牌号码的排序与查找就得想办法把汉字和字母转换成数字。2.2 用户需求分析 能对车牌号码实现链式基数排序,并能用查

6、找算法让用户户能根据车牌号码查到相关信息,能够输出车牌信息。 方案设计3.1 总体功能设计1.从文件读入数据保存进链表2.对车牌进行基数排序3二分查找查询汽车牌照4.输出车牌信息3.2 数据结构设计 程序要求实现对汽车牌照的排序与查找,而如果仅仅进行牌照的排序与查找,则显得程序没有太大的实用性,所以考虑在程序中加入例如车主的姓名以及车子的品牌等内容来增加程序的实用性。为了能够更好的完成这些功能,在这里选用链表来存储所有车辆的信息,用链表中的单个节点来存储一辆汽车的信息,而对应的各个节点的域中则存储其对应的车辆信息(如车牌号码、车主姓名、车的品牌等信息)。在存储汽车牌照中的汉字时,由于汉字在内存

7、中占用两个字节,需要使用字符串数据来存储。其中的26个字母则使用一个一维字符数组来存储。车主的姓名及车子的品牌则使用一维字符数组来存储。在基数排序时,每趟的数据收集由两个链队列来完成,链队列的个数为基数的个数,两个链队列的队列指针分别指向每组链队列的队头和队尾。 3.3 函数原型设计main():主函数;Rnode *Setlist():添加车辆函数;void Distribute(Rnode *q,int j):进行基数排序每一趟的分配函数;void Collect():进行基数排序每一趟的收集函数;int Search_Bin(Rnode *q,long int k,int low,int

8、 high);void find(Rnode *q):二分查找函数;void menu():菜单函数;void print():输出所有车辆信息函数;Rnode *RadixSort(Rnode *p):基数排序函数;3.4 主算法设计建立链表,添加汽车牌照信息:开始结束申请一结点p并为其分配内存空间head=NULLhead=p输入汽车的相应信息,经过相应的处理后存入结点p相应的域。将该结点按尾插法插入到链表的相应位置返回该链表的头指针YN对车牌号码进行基数排序:开始结束i=M-1i>=0调用Distribute及Collect函数i+遍历排序好的链表将每个车辆的牌照号转换为长整型数据

9、存于一个一维数组AMAX中。YN按车牌号码查询:开始结束输入需要查找的牌照将待查找的牌照号处理后,存于一整型变量中调用二分查找函数并返回cc=-1没有查找成功查找成功并输出该车的信息YN各函数间的关系:main()Distribute()menu()print()Collect()Setlist()find()RadixSort()Search_Bin()菜单界面,选择功能:n=1n=pn=c调用子函数SetList(p)调用子函数print()调用子函数find(p)调用子函数paixu(p)n=sYNNYYNN开始输入nNNYn=qNNY结果NN 方案实现4.1 开发环境与工具 Windo

10、ws 7,CodeBlocks4.2 程序设计关键技术 1. 把车牌号码转换成用于比较和排序的关键字:设立一个字符数组存26各大写字母,再设一个string类型数组存34省、直辖市、自治区各地的简称。那么汉字和字母就可转化成它们在数组中的位序数字; 2.递归实现二分查找算法; 3.链式基数排序的实现;4.3 个人设计实现(按组员分工)4.3.1 肖瑶设计实现Rnode *SetList()/头插法建立链表,从文件中读取信息保存到链表中 FILE *f1; Rnode *head,*p,*l; int m,j,k; string r; if(f1=fopen("汽车管理.txt&quo

11、t;,"r")=NULL) printf("不能打开文件!"); head=NULL; p=(Rnode *)malloc(sizeof(Rnode); while(fscanf(f1,"%s%s%s",p->key ,p->name ,p->paizi)!=EOF) /头插法建链表 if(head=NULL) l=head=p; else l->next=p; l=p; p=(Rnode *)malloc(sizeof(Rnode); p->next=NULL; p=head; while(p!=NUL

12、L) string key1=(string)p->key; string key2=key1.substr(0,2); for(j=0;j<N;j+) string key3=(string)name1j; if(key2=key3) k=j; if(k>33|k<0) cout<<"=您输入的车牌号码错误,请重新选择输入!"<<endl; break; int s=k/10; p->keynum0=s; s=k%10; p->keynum1=s; for(int h=0;h<K;h+) if(p->

13、key2=name2h) m=h; if(m>25|m<0) cout<<"=您输入的车牌号码错误,请重新选择输入!"<<endl; break; s=m/10; p->keynum2=s; s=m%10; p->keynum3=s; for(int n=3;n<M-1;n+) int c=(int)p->keyn-48; p->keynumn+1=c; p=p->next; flag=1; return head;int Search_Bin(Rnode *q,long int k,int low,i

14、nt high) /递归实现折半查找 int mid; if(low>high) return -1; else mid=(high+low)/2; if(Amid=k) return mid; else if(k<Amid) return (Search_Bin(q,k,low,mid-1); else return (Search_Bin(q,k,mid+1,high); void find(Rnode *q)/按车牌号码用二分查找法查询 Rnode *p; p=q; int k,m,c; char d8; long int s; cout<<"请输入您要

15、查找的车辆的汽车牌照:"<<endl; cin>>d; string key1=(string)d; string key2=key1.substr(0,2); for(int j=0;j<N;j+) string key3=(string)name1j; if(key2=key3) k=j; if(k>33|k<0) cout<<"对不起,您输入的车牌号不合法,请重新输入!"<<endl; s=k/10*100000000+k%10*10000000; for(int h=0;h<K;h+)

16、 if(d2=name2h) m=h; if(m>25|m<0) cout<<"对不起,您输入的车牌号不合法,请重新输入!"<<endl; s=s+m/10*1000000+m%10*100000; s=s+(long int)d3-48)*10000+(int)d4-48)*1000+(int)d5-48)*100+(int)d6-48)*10+(int)d7-48; c=Search_Bin(q,s,0,b); if(c=-1) cout<<"=对不起,没有找到您要查找的车辆信息,请重新输入!"<

17、<endl<<endl; else cout<<"tt"<<"车牌号码"<<"t"<<"车主姓名"<<"t"<<"车牌"<<endl; for(int i=0;i<c;i+) q=q->next; cout<<"tt"<<q->key<<"t"<<q->name&l

18、t;<"tt"<<p->paizi<<endl; cout<<endl;4.3.2 张帅设计实现void Distribute(Rnode *q,int j)/基数排序的一趟收集 Rnode *p; int i,k=0; for(i=0;i<=RAX-1;i+) fi=ri=NULL; p=q; while(p!=NULL) q=q->next; k=p->keynumj; if(fk=NULL) fk=p; else rk->next=p; /队尾指针向后移动一位 rk=p; rk->next=

19、NULL; p=q; Rnode *Collect()/基数排序的一趟收集 Rnode *L; int i=0,j,k; while(fi=NULL) i+; L=fi; for(j=i,k=i+1;k<=RAX-1;k+) if(fk!=NULL) rj->next=fk; j=k; return L;Rnode *RadixSort(Rnode *p)/对车牌号码进行链式基数排序 Rnode *q; int a=0; for(int i=M-1;i>=0;i-) Distribute(p,i); q=p=Collect(); cout<<"=完成对车

20、辆信息的排序!"<<endl; while(q!=NULL) Aa=q->keynum0*100000000+q->keynum1*10000000+q->keynum2*1000000+q->keynum3*100000+q->keynum4*10000+q->keynum5*1000+q->keynum6*100+q->keynum7*10+q->keynum8; q=q->next; b=a; a+; flag=0; return p;4.3.3 陈果设计实现void menu() /菜单即主界面 cout

21、<<"ttt"<<endl; cout<<"ttt 车辆信息管理系统 "<<endl; cout<<"ttt"<<endl; cout<<"ttt 1) 添加车辆信息 "<<endl; cout<<"ttt"<<endl; cout<<"ttt 2) 按车牌号码进行排序 "<<endl; cout<<"ttt&q

22、uot;<<endl; cout<<"ttt 3) 按车牌号码查找车辆 "<<endl; cout<<"ttt"<<endl; cout<<"ttt 4) 输出所有车辆信息 "<<endl; cout<<"ttt"<<endl; cout<<"ttt 0) 退出程序 "<<endl; cout<<"ttt"<<endl;R

23、node *RadixSort(Rnode *p)/输出所有车牌信息 Rnode *q; int a=0; for(int i=M-1;i>=0;i-) Distribute(p,i); q=p=Collect(); cout<<"=完成对车辆信息的排序!"<<endl; while(q!=NULL) Aa=q->keynum0*100000000+q->keynum1*10000000+q->keynum2*1000000+q->keynum3*100000+q->keynum4*10000+q->keyn

24、um5*1000+q->keynum6*100+q->keynum7*10+q->keynum8; q=q->next; b=a; a+; flag=0; return p; 测试与调试5.1 个人测试(按组员分工)5.1.1 肖瑶测试5.1.2 张帅测试排序前:5.1.3陈果测试5.2 组装与系统测试 课题总结6.1 课题评价 总的来说这次课程设计我们基本实现了题目所要求的功能,但整体情况不是特别理想有一些缺陷。题目要求我们用静态链,但不知道如何吧文件中的信息读入静态链表,如何把信息插入静态链表。我们试了很多次,但屡试屡败,所以就用了大家都比较熟练的动态链表。另外因为

25、索引查找,我们不知道如何从链表中抽出索引块来,所以没有实现。这次课程设计也算历经坎坷,由于我们仨编码能力太过薄弱,在很多地方走了不少弯路。写一个程序的过程不一定是快乐的,但是当程序调试成功的时候一定是激动人心的。从这次实验中,我们都深深认识到实践对于编程能力提高的重要性。我们不能只抱着数据结构钻研而不上机敲代码。通过这次实验,我们深感现实生活中问题的复杂性和灵活性,它不是直接套用树上的算法和数据结构就可以解决的。想解决现实生活中的问题我们必须学会转化,把问题分解然后一一分解再套用书上的数据结构去实现。当我们拿到这个问题时,因为不知道如何比较车牌间的关系,一筹莫展。但是我们想到了利用各种规则把汉

26、字和字母转换成数字,从而整个车牌号码就变成了可以直接比较的关键字。所以我们深感转化问题能力的重要性。6.2 团队协作程序开发不是一蹴而就的得慢慢的改,所以小组成员之间的配合特别重要。我们从这次课程设计中体会到了合作和交流的妙处。大家一起交流,能互相启发,有些问题就会迎刃而解。6.3下一步工作: 做出一个友好的可视化用户界面,完善功能,找出程序中的漏洞。6.4个人设计小结(按组员分工)6.4.1肖瑶总结: 通过这次实验巩固了我对数据结构的理解,提高了运用知识解决问题的能力。当我能看懂书上的算法,实现起来却是一波三折,一种“纸上得来终觉浅”的感慨。可见要想提高编程能力,光看算法可不行,上机敲代码也

27、相当重要。 在这次实验中我担当组长,这也给了我一个锻炼的机会,让我提高了自己的组织能力,让我学会了担当,让让我学会了要有全局观念意识。6.4.2陈果总结: 通过本次课程设计,让我感受到了团队的力量,课程设计刚开始时,小组成员一起思考讨论实际问题的解决方法,每个人都提出了自己的意见和建议,最后达成一致。在接下来的实现过程中,每个人又有自己不同的分工,并在过程中不断交流,优化问题的解决方法。更重要的是,这次课程设计让我有了一次把理论运用于实际的经验。在和同学的交流中,在自己亲手编码的过程中加深了对知识的理解。我也深感自己编码能力不大好,所以也让我有了多敲代码、努力提高编程技巧的动力。 6.4.3张

28、帅总结:这是我第一次做大型的课程设计,在此过程中遇到了很多不懂的问题,发现了自己还有很多不足,在寻找解决方法的过程中也获得了很多难得的心得与感悟。 课程设计是一个查漏补缺、不断完善的过程。通过查找资料,相互学习,使我对课程设计有了一个更清晰的认识,同时我也被先辈们的聪明才智深深折服。程序设计就是寻找一个最优化的方法去解决实际问题,给人们的生活带去方便与快捷。附录A课题程序设计分工 A-1 课题程序设计分工学号姓名程序设计函数原型、类功能说明20133993肖瑶Rnode *SetList()int Search_Bin(Rnode *q,long int k,int low,int high)

29、;void find(Rnode *q);建立并从文件添加车辆牌照函数;二分查找算法的实现;用按车牌用二分查找查询车辆牌照;20133997 张帅void Distribute(Rnode *q,int j);Rnode *Collect();Rnode *RadixSort(Rnode *p);链式基数排序的一趟分配过程;链式基数排序的一趟收集过程;对汽车牌照进行链式基数排序;20134002陈果void print(Rnode *p);void menu();输出全部汽车牌照信息;程序主界面;A-2 课题报告分工章节内容完成人1 课题概述1.1 课题任务1.2 课题原理 1.3 相关知识肖

30、瑶2 需求分析2.1 课题调研 2.2 用户需求分析肖瑶3 方案设计3.1 总体功能设计3.2 数据结构设计3.3 函数原型设计3.4 主算法设计3.5 用户界面设计肖瑶4 方案实现4.1 开发环境与工具4.2 程序设计关键技术4.3 个人设计实现(按组员分工)4.3.1 肖瑶设计实现4.3.2 张帅设计实现4.3.3 陈果设计实现 肖瑶 肖瑶 张帅 陈果5 测试与调试5.1 个人测试(按组员分工)5.1.1 肖瑶测试5.1.2 张帅测试5.1.3 陈果测试5.2 组装与系统测试 肖瑶 张帅 陈果 肖瑶6 课题总结6.1 课题评价6.2 团队协作6.3 下一步工作6.4 个人设计心得(按组员分

31、工)6.4.1 肖瑶设计心得6.4.2 张帅设计心得6.4.3 陈果设计心得 肖瑶 肖瑶 张帅 陈果附录B 课题设计文档(光盘)B-1课程设计报告(电子版)B-2源程序代码(*.H,*.CPP)B-3工程与可执行文件)B-4屏幕演示录像文件(可选)附录C 用户操作手册(可选)C.1 运行环境说明C.2 操作说明B-2源程序代码:#define N 34 /省市自治区的个数#define K 26 /大写字母的个数#define RAX 10 /基数的个数#define MAX 100 /最大能够处理的车辆数typedef struct nodeint keynumM;char key10;ch

32、ar name10;char paizi10;struct node *next;Rnode;string name1N="澳","川","鄂","甘","赣","港","贵","桂","黑","沪","吉","津","晋","京","辽","鲁","闽",&

33、quot;内","宁","青","琼","山","陕","苏","台","皖","湘","新","冀","渝","豫","云","藏","浙"char name2K='A','B','C','D','

34、;E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'Rnode *fRAX,*rRAX; /*fRAX,*rRAX分别为链队列的队头指

35、针和队尾指针long int AMAX;int flag=0; /记录在查找前是否进行了排序int b; /汽车牌照转换为数字后最后一个汽车牌照的数组中的下标Rnode *SetList() FILE *f1; Rnode *head,*p,*l; int m,j,k; string r; if(f1=fopen("汽车管理.txt","r")=NULL) printf("不能打开文件!"); head=NULL; p=(Rnode *)malloc(sizeof(Rnode); while(fscanf(f1,"%s%s%

36、s",p->key ,p->name ,p->paizi)!=EOF) /头插法建链表 if(head=NULL) l=head=p; else l->next=p; l=p; p=(Rnode *)malloc(sizeof(Rnode); p->next=NULL; p=head; while(p!=NULL) string key1=(string)p->key; string key2=key1.substr(0,2); for(j=0;j<N;j+) string key3=(string)name1j; if(key2=key3)

37、 k=j; if(k>33|k<0) cout<<"=您输入的车牌号码错误,请重新选择输入!"<<endl; break; int s=k/10; p->keynum0=s; s=k%10; p->keynum1=s; for(int h=0;h<K;h+) if(p->key2=name2h) m=h; if(m>25|m<0) cout<<"=您输入的车牌号码错误,请重新选择输入!"<<endl; break; s=m/10; p->keynum2=

38、s; s=m%10; p->keynum3=s; for(int n=3;n<M-1;n+) int c=(int)p->keyn-48; p->keynumn+1=c; p=p->next; flag=1; return head;void Distribute(Rnode *q,int j) Rnode *p; int i,k=0; for(i=0;i<=RAX-1;i+) fi=ri=NULL; p=q; while(p!=NULL) q=q->next; k=p->keynumj; if(fk=NULL) fk=p; else rk-&g

39、t;next=p; /队尾指针向后移动一位 rk=p; rk->next=NULL; p=q; Rnode *Collect() Rnode *L; int i=0,j,k; while(fi=NULL) i+; L=fi; for(j=i,k=i+1;k<=RAX-1;k+) if(fk!=NULL) rj->next=fk; j=k; return L;int Search_Bin(Rnode *q,long int k,int low,int high) /递归调用折半查找 int mid; if(low>high) return -1; else mid=(hi

40、gh+low)/2; if(Amid=k) return mid; else if(k<Amid) return (Search_Bin(q,k,low,mid-1); else return (Search_Bin(q,k,mid+1,high); void find(Rnode *q) Rnode *p; p=q; int k,m,c; char d8; long int s; cout<<"请输入您要查找的车辆的汽车牌照:"<<endl; cin>>d; string key1=(string)d; string key2=k

41、ey1.substr(0,2); for(int j=0;j<N;j+) string key3=(string)name1j; if(key2=key3) k=j; if(k>33|k<0) cout<<"对不起,您输入的车牌号不合法,请重新输入!"<<endl; s=k/10*100000000+k%10*10000000; for(int h=0;h<K;h+) if(d2=name2h) m=h; if(m>25|m<0) cout<<"对不起,您输入的车牌号不合法,请重新输入!&qu

42、ot;<<endl; s=s+m/10*1000000+m%10*100000; s=s+(long int)d3-48)*10000+(int)d4-48)*1000+(int)d5-48)*100+(int)d6-48)*10+(int)d7-48; c=Search_Bin(q,s,0,b); if(c=-1) cout<<"=对不起,没有找到您要查找的车辆信息,请重新输入!"<<endl<<endl; else cout<<"tt"<<"车牌号码"<

43、<"t"<<"车主姓名"<<"t"<<"车牌"<<endl; for(int i=0;i<c;i+) q=q->next; cout<<"tt"<<q->key<<"t"<<q->name<<"tt"<<p->paizi<<endl; cout<<endl;void print(

44、Rnode *p) cout<<"=所有车辆的信息如下:"<<endl<<endl; cout<<"车牌照号"<<"t"<<"车主姓名"<<"t"<<"车牌"<<endl; while(p!=NULL) cout<<p->key<<"t"<<p->name<<"tt"<<p->paizi<<endl; p=p->next; cout<<endl;Rnode *RadixSort(Rnode *p) Rnode *q; int a=0; for(int i=M-1;i>=0;i-) Distribute(p,i); q=p=Collect(); cout<<"=完成对车辆信息的排序!"<<endl; while(q!=NU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论