# 基于C语言实现的汽车牌照的快速查询
# 1 课题概述
## 1.1 课题任务
在汽车数据的信息模型中,汽车牌照是具有结构特点的一类关键字。汽车牌照是字母和数字混编的,例如01B7238。利用查找和排序算法,实现辽宁省内汽车牌照的快速查找。
设计汽车牌照的快速查询程序:
- 采用顺序表、静态链表等数据结构
- 可以随机、文件及人工输入数据
- 利用静态链表对汽车牌照进行链式基数排序
- 采用折半查找汽车牌照
- 可以按城市进行分块索引查找
- 其它完善性或扩展性功能
## 1.2 课题原理
根据题意,首先采用线性链表数据结构来储存车牌号。录入方面,录入部分分为随机录入和人工录入,同时在人工录入方面设定判错。查找方面,采用二分法查找,同时也采用了另一种分块查找,加快查找速度。排序方面,运用了链式基数排序,可对车牌大小和地区分布多重排序。
# 2 需求分析
## 2.1 课题调研
根据我们的研究和查阅相关资料,首先牌照总的来讲分为三类,摩托车车牌、货车车牌、还有就是常见的中小型车车牌。这三类车牌是可以存在重复的,不过极少见,同类车牌不能有重复,且在目前车牌最多只有三位字母。当然,还有其他种类的车牌比如军用等,但是肯定不会有这种权限去查询的。其次是,目前车牌采用的是摇号制,所以肯定要有随机数据机制。再然后辽宁一共有14个城市,分为A-沈阳市 B-大连市 C-鞍山市 D-抚顺市 E-本溪市 F丹东市 G-锦州市 H-营口市 J-阜新市 K-辽阳市 L-盘锦市 M-铁岭市 N-朝阳市 P-葫芦岛市 V-省直系统。
## 2.2 用户需求
用户需求基本跟题目要求一样,随机数据,折半查询,车排排序,界面可视化。这些上文中有就不做过多解释。除此之外我们还加入了模糊查找,在查询时只要输入关键字就能把含有关键字的所有信息显示出来,极大方便了查找,而且还加入了统计,最大限度考虑到了用户使用时的需求。
# 3 方案设计
## 3.1 总体功能设计
### 3.1.1 界面设计
运用控制台操作界面,界面主菜单及子菜单设置如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2dba505c3cad6942d14f021727828014.writebug)
对于程序刚开始运行,我们采用的流程是:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/40da65c64475e8366385973cbba81779.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/5b2fd69ce60e8e5d2f1573e9b5fde8d1.writebug)
### 3.1.2 数据维护
三种数据的录入,修改和删除采用字符界面的形式进行操作,即用户输入1,2,3进行选择选项,然后按照提示进行信息改动。在录入,修改或者删除信息过程中,遇到异常输入,则执行输入循环直到用户输入符合条件的信息为止。改动后的信息通过先写进链表的方式全部写进文件。具体实现流程如下图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b81bdbc7ad76f6a202b1ea32248c5c4c.writebug)
### 3.1.3 数据查询
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f08295fa6e21312ba57d7cff9a8cdc7b.writebug)
进入界面后执行流程如图所示(如果输入选项有误,一直循环输入,直到输入正确的选项为止):
![](http://www.writebug.com/myres/static/uploads/2021/10/19/d4afdb13519f3e36ec4e737c2560b7d9.writebug)
### 3.1.4 数据统计
![](http://www.writebug.com/myres/static/uploads/2021/10/19/bba6709cfca1df04241ffde7cda7dcaa.writebug)
## 3.2 数据结构设计
| 中文名 | 标识符 | 类型 |
| --------- | ----- | -------- |
| 车主姓名 | Name | char[15] |
| 车辆类型 | Type | char[15] |
| 车牌号 | Num | char[15] |
| 车主号码 | Phone | char[15] |
| 指向下一节点的指针 | next | Car \* |
| 中文名 | 标识符 | 类型 |
| ------------------- | -------- | ------------- |
| 弹出窗口层数 | LayerNo | char |
| 弹出窗口区域坐标 | rcArea | SMALL\_RECT |
| 弹出窗口区域字符单元原信息存储缓冲区 | pContent | CHAR\_INFO \* |
| 弹出窗口区域字符单元原属性值存储缓冲区 | pScrAtt | char \* |
| 指向下一结点的指针 | next | LAYER\_NODE\* |
| 中文名 | 标识符 | 类型 |
| ---------- | ------- | --------- |
| 标签字符串数组首地址 | ppLabel | char \*\* |
| 标签定位数组首地址 | pLoc | COORD \* |
| 标签个数 | num | int |
| 中文名 | 标识符 | 类型 |
| --------------------- | ----- | -------------- |
| 热区定位数组首地址 | pArea | SMALL\_RECT \* |
| 热区类别(按键、文本框、选项框)数组首地址 | pSort | char \* |
| 热区序号数组首地址 | pTag | char \* |
| 热区个数 | num | int |
| 全局头指针标识符 | 类型 |
| -------------- | -------------- |
| gp\_top\_layer | LAYER\_NODE \* |
| gp\_head1 | CAR \* |
## 3.3 函数原型设计
```c++
LoadData(); /*数据加载*/
InitInterface(); /*界面初始化*/
RunSys(); /*系统功能模块的选择及运行*/
CloseSys(); /*退出系统*/
List MakeEmpty(); //创建一个空的线性表,将链表数据读入数组
BOOL ShowAllInfor(); //显示数组的所有信息
void ShowInfor(List L);
BOOL MaintainCarInfo(void); //维护车辆基本信息
BOOL ShowRadixSorting(void); //显示车辆信息基数排序
void RadixSorting(List L);
void freedom(void); //释放所有的内存
//随机数据的生成
BOOL ShowGenrnd(void); //随机生产数据的界面
void Genrnd(); //随机结构体的生成
void GenrndNum(char * buff); //随机车牌的生成
void GenrndPhone(char * buff); //随机号码的生成
void GenrndName(char * buff); // 随机车主名字的生成
void GenrndType(char * buff); //随机汽车类型的生成
char *wholename(int a); //返回对应的项目类型全称
//模糊查找
BOOL ShowFuzzySearch(void); //显示模糊查找界面
void FuzzySearch(List l,char k[]); //模糊查找函数
int intain(char *a,char *b); //判断a是不是b的子串
int panduan(char str[]);
```
## 3.4 主算法设计
- 基于基数排序的车牌号码查找
- 基于判断子字符串的模糊查找
- 二分查找
## 3.5 用户界面设计
采用控制台界面,实现通过键盘输入能够控制菜单选择的功能(如图2-1)。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/30e9e5f95e10e0040b27ef6777f66f55.writebug)
通过在标准输入输出界面中输入选择选项来达到数据变动,查询和统计的功能,并输出相应结果。
在使用说明中介绍该系统的一些快捷键使用方法。
## 3.6 输入输出设计
- 通过读取文件的内容进行输入
- 通过手动输入的方式进行设计
- 通过随机生成的方式进行生成数据
# 4 方案实现
## 4.1 开发环境与工具
我们组采用的是在Windows下的c-free系统,包括可视化的实现也是采用了Windows的系统函数。
## 4.2 个人程序实现
### 4.2.1 设计实现
![](http://www.writebug.com/myres/static/uploads/2021/10/19/2a524a8f8b5528e0ccb438fad574b5fb.writebug)
负责的是查询系统,依题意,首要采用的是二分法,再分为分块查询和直接查询。因为二分法的局限性,为此的对策是,因为是同一地区,把基数排序好的录入为数组再进行二分法查找。因为基数排序恰好有两种,所以不同的查询方式调用不同的基数