数据结构汽车牌照的快速查询.docx

上传人:b****5 文档编号:4622256 上传时间:2022-12-07 格式:DOCX 页数:29 大小:116.88KB
下载 相关 举报
数据结构汽车牌照的快速查询.docx_第1页
第1页 / 共29页
数据结构汽车牌照的快速查询.docx_第2页
第2页 / 共29页
数据结构汽车牌照的快速查询.docx_第3页
第3页 / 共29页
数据结构汽车牌照的快速查询.docx_第4页
第4页 / 共29页
数据结构汽车牌照的快速查询.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

数据结构汽车牌照的快速查询.docx

《数据结构汽车牌照的快速查询.docx》由会员分享,可在线阅读,更多相关《数据结构汽车牌照的快速查询.docx(29页珍藏版)》请在冰豆网上搜索。

数据结构汽车牌照的快速查询.docx

数据结构汽车牌照的快速查询

东北大学信息科学与工程学院

数据结构课程设计报告

题目汽车牌照的快速查询

课题组长肖瑶

课题组成员陈果张帅

专业名称计算机科学与技术

班级计算机1307

指导教师杨雷

2015年1月

课程设计任务书

题目:

汽车牌照的快速查询

问题描述:

在汽车数据的信息模型中,汽车牌照是具有结构特点的一类关键字。

汽车牌照是字母和数字混编的,例如01B7238。

利用查找和排序算法,实现辽宁省内汽车牌照的快速查找。

设计要求:

设计汽车牌照的快速查询程序。

(1)采用顺序表、静态链表等数据结构。

(2)利用静态链表对汽车牌照进行链式基数排序。

(3)采用折半查找汽车牌照。

(4)可以按城市进行分块索引查找。

(5)其它完善性功能。

指导教师签字:

2014年12月24日

1课题概述1

1.1课题任务1

1.2课题原理1

1.3相关知识3

2需求分析2

2.1课题调研2

2.2用户需求分析2

3方案设计2

3.1总体功能设计2

3.2数据结构设计2

3.3函数原型设计2

3.4主算法设计3

4方案实现7

4.1开发环境与工具7

4.2程序设计关键技术7

4.3个人设计实现(按组员分工)

4.3.1肖瑶设计实现7

4.3.1张帅设计实现10

4.3.1陈果设计实现14

5测试与调试12

5.1个人测试(按组员分工)12

5.1.1肖瑶测试12

5.1.2张帅测试14

5.1.3测试15

5.2组装与系统测试15

6课题总结17

6.1课题评价17

6.2团队协作17

6.3下一步工作17

6.4个人设计小结(按组员分工)18

6.4.1肖瑶设计小结18

6.4.2陈果设计小结18

6.4.3张帅设计小结19

7附录A课题任务分工20

A-1课题程序设计分工20

A-2课题报告分工21

附录B课题设计文档(光盘)22

B-1课程设计报告(电子版)22

B-2源程序代码(*.H,*.CPP)22

B-3工程与可执行文件)22

B-4屏幕演示录像文件(可选)22

附录C用户操作手册(可选)22

C.1运行环境说明22

C.2操作说明22

课题概述

1.1课题任务

在汽车数据的信息模型中,汽车牌照是具有结构特点的一类关键字。

汽车牌照是字母和数字混编的,例如01B7238。

利用查找和排序算法,实现辽宁省内汽车牌照的快速查找。

设计汽车牌照的快速查询程序。

(1)采用顺序表、静态链表等数据结构。

(2)利用静态链表对汽车牌照进行链式基数排序。

(3)采用折半查找汽车牌照。

(4)可以按城市进行分块索引查找。

(5)其它完善性功能。

1.2课题原理

通过输入汽车牌照信息,保存在一个文件中。

程序从文件中读入信息,把车牌号码转换成相应的关键字并把车牌信息和关键字保存在链表中。

再通过链式基数排序算法整理这些信息便于查找,最后通过折半查找算法实现快速查找功能。

1.3相关知识

一个汽车牌照相当于一辆汽车的身份证,因此通过查询汽车牌照便可知道这辆汽车的主人、品牌等信息。

汽车牌照是由汉子、字母及数字组成,即多关键字,其中数字和字母的比较1容易实现的,考虑到汉字的存储等各方面的原因,对汉字的排序并不是很容易就能完成的,因此不能直接对汉字排序。

但特殊的是,汽车牌照中的汉字是各个省、直辖市及自治区的简称(比如辽代表辽宁,京代表北京),一共34个。

但是由于汉语拼音可以和英文字母相互转换,因此可以按照汉语拼音的规则进行排序。

需求分析

2.1课题调研

汽车牌照由汉子、字母、数字组成,一汉字+字母+数字方式呈现。

要实现对车牌号码的排序与查找就得想办法把汉字和字母转换成数字。

2.2用户需求分析

能对车牌号码实现链式基数排序,并能用查找算法让用户户能根据车牌号码查到相关信息,能够输出车牌信息。

方案设计

3.1总体功能设计

1.从文件读入数据保存进链表

2.对车牌进行基数排序

3.二分查找查询汽车牌照

4.输出车牌信息

3.2数据结构设计

程序要求实现对汽车牌照的排序与查找,而如果仅仅进行牌照的排序与查找,则显得程序没有太大的实用性,所以考虑在程序中加入例如车主的姓名以及车子的品牌等内容来增加程序的实用性。

为了能够更好的完成这些功能,在这里选用链表来存储所有车辆的信息,用链表中的单个节点来存储一辆汽车的信息,而对应的各个节点的域中则存储其对应的车辆信息(如车牌号码、车主姓名、车的品牌等信息)。

在存储汽车牌照中的汉字时,由于汉字在内存中占用两个字节,需要使用字符串数据来存储。

其中的26个字母则使用一个一维字符数组来存储。

车主的姓名及车子的品牌则使用一维字符数组来存储。

在基数排序时,每趟的数据收集由两个链队列来完成,链队列的个数为基数的个数,两个链队列的队列指针分别指向每组链队列的队头和队尾。

3.3函数原型设计

main():

主函数;

Rnode*Setlist():

添加车辆函数;

voidDistribute(Rnode*q,intj):

进行基数排序每一趟的分配函数;

voidCollect():

进行基数排序每一趟的收集函数;

intSearch_Bin((Rnode*q,longintk,intlow,inthigh);

voidfind(Rnode*q):

二分查找函数;

voidmenu():

菜单函数;

voidprint():

输出所有车辆信息函数;

Rnode*RadixSort(Rnode*p):

基数排序函数;

3.4主算法设计

建立链表,添加汽车牌照信息:

对车牌号码进行基数排序:

按车牌号码查询:

各函数间的关系:

菜单界面,选择功能:

方案实现

4.1开发环境与工具

Windows7,CodeBlocks

4.2程序设计关键技术

1.把车牌号码转换成用于比较和排序的关键字:

设立一个字符数组存26各大写字母,再设一个string类型数组存34省、直辖市、自治区各地的简称。

那么汉字和字母就可转化成它们在数组中的位序数字;

2.递归实现二分查找算法;

3.链式基数排序的实现;

4.3个人设计实现(按组员分工)

4.3.1肖瑶设计实现

Rnode*SetList()//头插法建立链表,从文件中读取信息保存到链表中

{

FILE*f1;

Rnode*head,*p,*l;

intm,j,k;

stringr;

if((f1=fopen("汽车管理.txt","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!

=NULL)

{

stringkey1=(string)p->key;

stringkey2=key1.substr(0,2);

for(j=0;j

{

stringkey3=(string)name1[j];

if(key2==key3)

k=j;

}

if(k>33||k<0)

{

cout<<"==您输入的车牌号码错误,请重新选择输入!

"<

break;

}

ints=k/10;

p->keynum[0]=s;

s=k%10;

p->keynum[1]=s;

for(inth=0;h

{

if(p->key[2]==name2[h])

m=h;

}

if(m>25||m<0)

{

cout<<"==您输入的车牌号码错误,请重新选择输入!

"<

break;

}

s=m/10;

p->keynum[2]=s;

s=m%10;

p->keynum[3]=s;

for(intn=3;n

{

intc=(int)p->key[n]-48;

p->keynum[n+1]=c;

}

p=p->next;

}

flag=1;

returnhead;

}

intSearch_Bin(Rnode*q,longintk,intlow,inthigh)//递归实现折半查找

{

intmid;

if(low>high)return-1;

else

{

mid=(high+low)/2;

if(A[mid]==k)

returnmid;

elseif(k

return(Search_Bin(q,k,low,mid-1));

else

return(Search_Bin(q,k,mid+1,high));

}

}

voidfind(Rnode*q)//按车牌号码用二分查找法查询

{

Rnode*p;

p=q;

intk,m,c;

chard[8];

longints;

cout<<"请输入您要查找的车辆的汽车牌照:

"<

cin>>d;

stringkey1=(string)d;

stringkey2=key1.substr(0,2);

for(intj=0;j

{

stringkey3=(string)name1[j];

if(key2==key3)k=j;

}

if(k>33||k<0)

cout<<"对不起,您输入的车牌号不合法,请重新输入!

"<

s=k/10*0+k%10*;

for(inth=0;h

{

if(d[2]==name2[h])

m=h;

}

if(m>25||m<0)

cout<<"对不起,您输入的车牌号不合法,请重新输入!

"<

s=s+m/10*1000000+m%10*100000;

s=s+((longint)d[3]-48)*10000+((int)d[4]-48)*1000+((int)d[5]-48)*100+((int)d[6]-48)*10+(int)d[7]-48;

c=Search_Bin(q,s,0,b);

if(c==-1)

cout<<"==对不起,没有找到您要查找的车辆信息,请重新输入!

"<

else

{

cout<<"\t\t"<<"车牌号码"<<"\t"<<"车主姓名"<<"\t"<<"车牌"<

for(inti=0;i

q=q->next;

cout<<"\t\t"<key<<"\t"<name<<"\t\t"<paizi<

}

cout<

}

4.3.2张帅设计实现

voidDistribute(Rnode*q,intj)//基数排序的一趟收集

{

Rnode*p;

inti,k=0;

for(i=0;i<=RAX-1;i++)

f[i]=r[i]=NULL;

p=q;

while(p!

=NULL)

{

q=q->next;

k=p->keynum[j];

if(f[k]==NULL)f[k]=p;

elser[k]->next=p;//队尾指针向后移动一位

r[k]=p;

r[k]->next=NULL;

p=q;

}

}

Rnode*Collect()//基数排序的一趟收集

{

Rnode*L;

inti=0,j,k;

while(f[i]==NULL)

i++;

L=f[i];

for(j=i,k=i+1;k<=RAX-1;k++)

if(f[k]!

=NULL)

{

r[j]->next=f[k];

j=k;

}

returnL;

}

Rnode*RadixSort(Rnode*p)//对车牌号码进行链式基数排序

{

Rnode*q;

inta=0;

for(inti=M-1;i>=0;i--)

{

Distribute(p,i);

q=p=Collect();

}

cout<<"==完成对车辆信息的排序!

"<

while(q!

=NULL)

{

A[a]=q->keynum[0]*0+q->keynum[1]*+q->keynum[2]*1000000+q->keynum[3]*100000+q->keynum[4]*10000+q->keynum[5]*1000+q->keynum[6]*100+q->keynum[7]*10+q->keynum[8];

q=q->next;

b=a;

a++;

}

flag=0;

returnp;

}

4.3.3陈果设计实现

voidmenu()//菜单即主界面

{

cout<<"\t\t\t┏━┳━━━━━━━━━━━━━━┳━┓"<

cout<<"\t\t\t┣━┫ 车辆信息管理系统 ┣━┫"<

cout<<"\t\t\t┣━┻━━━━━━━━━━━━━━┻━┫"<

cout<<"\t\t\t┃1)添加车辆信息┃"<

cout<<"\t\t\t┣━━━━━━━━━━━━━━━━━━┫"<

cout<<"\t\t\t┃2)按车牌号码进行排序┃"<

cout<<"\t\t\t┣━━━━━━━━━━━━━━━━━━┫"<

cout<<"\t\t\t┃3)按车牌号码查找车辆┃"<

cout<<"\t\t\t┣━━━━━━━━━━━━━━━━━━┫"<

cout<<"\t\t\t┃4)输出所有车辆信息┃"<

cout<<"\t\t\t┣━━━━━━━━━━━━━━━━━━┫"<

cout<<"\t\t\t┃0)退出程序┃"<

cout<<"\t\t\t┗━━━━━━━━━━━━━━━━━━┛"<

}

Rnode*RadixSort(Rnode*p)//输出所有车牌信息

{

Rnode*q;

inta=0;

for(inti=M-1;i>=0;i--)

{

Distribute(p,i);

q=p=Collect();

}

cout<<"==完成对车辆信息的排序!

"<

while(q!

=NULL)

{

A[a]=q->keynum[0]*0+q->keynum[1]*+q->keynum[2]*1000000+q->keynum[3]*100000+q->keynum[4]*10000+q->keynum[5]*1000+q->keynum[6]*100+q->keynum[7]*10+q->keynum[8];

q=q->next;

b=a;

a++;

}

flag=0;

returnp;

}

测试与调试

5.1个人测试(按组员分工)

5.1.1肖瑶测试

5.1.2张帅测试

排序前:

5.2组装与系统测试

课题总结

6.1课题评价

总的来说这次课程设计我们基本实现了题目所要求的功能,但整体情况不是特别理想有一些缺陷。

题目要求我们用静态链,但不知道如何吧文件中的信息读入静态链表,如何把信息插入静态链表。

我们试了很多次,但屡试屡败,所以就用了大家都比较熟练的动态链表。

另外因为索引查找,我们不知道如何从链表中抽出索引块来,所以没有实现。

这次课程设计也算历经坎坷,由于我们仨编码能力太过薄弱,在很多地方走了不少弯路。

写一个程序的过程不一定是快乐的,但是当程序调试成功的时候一定是激动人心的。

从这次实验中,我们都深深认识到实践对于编程能力提高的重要性。

我们不能只抱着数据结构钻研而不上机敲代码。

通过这次实验,我们深感现实生活中问题的复杂性和灵活性,它不是直接套用树上的算法和数据结构就可以解决的。

想解决现实生活中的问题我们必须学会转化,把问题分解然后一一分解再套用书上的数据结构去实现。

当我们拿到这个问题时,因为不知道如何比较车牌间的关系,一筹莫展。

但是我们想到了利用各种规则把汉字和字母转换成数字,从而整个车牌号码就变成了可以直接比较的关键字。

所以我们深感转化问题能力的重要性。

6.2团队协作

程序开发不是一蹴而就的得慢慢的改,所以小组成员之间的配合特别重要。

我们从这次课程设计中体会到了合作和交流的妙处。

大家一起交流,能互相启发,有些问题就会迎刃而解。

6.3下一步工作:

做出一个友好的可视化用户界面,完善功能,找出程序中的漏洞。

6.4个人设计小结(按组员分工)

通过这次实验巩固了我对数据结构的理解,提高了运用知识解决问题的能力。

当我能看懂书上的算法,实现起来却是一波三折,一种“纸上得来终觉浅”的感慨。

可见要想提高编程能力,光看算法可不行,上机敲代码也相当重要。

在这次实验中我担当组长,这也给了我一个锻炼的机会,让我提高了自己的组织能力,让我学会了担当,让让我学会了要有全局观念意识。

通过本次课程设计,让我感受到了团队的力量,课程设计刚开始时,小组成员一起思考讨论实际问题的解决方法,每个人都提出了自己的意见和建议,最后达成一致。

在接下来的实现过程中,每个人又有自己不同的分工,并在过程中不断交流,优化问题的解决方法。

更重要的是,这次课程设计让我有了一次把理论运用于实际的经验。

在和同学的交流中,在自己亲手编码的过程中加深了对知识的理解。

我也深感自己编码能力不大好,所以也让我有了多敲代码、努力提高编程技巧的动力。

这是我第一次做大型的课程设计,在此过程中遇到了很多不懂的问题,发现了自己还有很多不足,在寻找解决方法的过程中也获得了很多难得的心得与感悟。

课程设计是一个查漏补缺、不断完善的过程。

通过查找资料,相互学习,使我对课程设计有了一个更清晰的认识,同时我也被先辈们的聪明才智深深折服。

程序设计就是寻找一个最优化的方法去解决实际问题,给人们的生活带去方便与快捷。

附录A课题程序设计分工

A-1课题程序设计分工

学号

姓名

程序设计函数原型、类

功能说明

肖瑶

Rnode*SetList()

intSearch_Bin(Rnode*q,longintk,intlow,inthigh);

voidfind(Rnode*q);

建立并从文件添加车辆牌照函数;

二分查找算法的实现;

用按车牌用二分查找查询车辆牌照;

张帅

voidDistribute(Rnode*q,intj);

Rnode*Collect();

Rnode*RadixSort(Rnode*p);

链式基数排序的一趟分配过程;

链式基数排序的一趟收集过程;

对汽车牌照进行链式基数排序;

陈果

voidprint(Rnode*p);

voidmenu();

输出全部汽车牌照信息;

程序主界面;

A-2课题报告分工

章节

内容

完成人

1课题概述

1.1课题任务

1.2课题原理

1.3相关知识

肖瑶

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个人设计心得(按组员分工)

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源程序代码:

#defineN34//省市自治区的个数

#defineK26//大写字母的个数

#defineRAX10//基数的个数

#defineMAX100//最大能够处理的车辆数

typedefstructnode{

intkeynum[M];

charkey[10];

charname[10];

charpaizi[10];

structnode*next;

}Rnode;

stringname1[N]={"澳","川","鄂","甘","赣","港","贵","桂","黑","沪","吉","津","晋","京","辽","鲁","闽","内","宁","青","琼","山","陕","苏","台","皖","湘","新","冀","渝","豫","云","藏","浙"};

charname2[K]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

Rnode*f[RAX],*r[RAX];//*f[RAX],*r[RAX]分别为链队列的队头指针和队尾指针

longintA[MAX];

intflag=0;//记录在查找前是否进行了排序

intb;//汽车牌照转换为数字后最后一个汽车牌照的数组中的下标

Rnode*SetList()

{

FILE*f1;

Rnode*head,*p,*l;

intm,j,k;

stringr;

if((f1=fopen("汽车管理.txt","r"))==NULL)

printf("不能打开文件!

");

head=NULL;

p=(Rnode*)malloc(sizeof(Rnod

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1