1、 程序会显示提示,根据提示输入数字、字符或数据。测试数据:测试数据的每个记录包括五项,分别为牌照号码、汽车商标、颜色、注册日期和车主的姓名,其中牌照号码为七位(k0-k6),输入形式如下:K0 和 k1 输入值为01-04(代表地区),k2输入值为 AZ(代表车的使用类型),后4位为 00009999(代表车号),例如: O1B7328。其余四项输入内容因为不涉及本程序的核心思想,故只要求一般字符串类型即可。查询时,输入合法的汽车牌照号码。测试数据要求用30个左右的数据项进行测试,头两位暂限定 0104,第3位为 AZ,以便可使牌照号码相对集中。程序测试数据:3001S5842 将明 2007
2、-12-02 blue jid04D2154 陈琳 2005-11-01 yellow jo 02A0021 潘晓静 2011-04-22 white jae01S8930 李峰 2010-08-13 green aie03C3589 张三 2007-02-18 blue nhi04E2184 Lucy 2009-11-28 black as604A2505 赵晗 2009-10-30 brown ja 03C3269 Lily 2007-11-30 pink jos03B3568 Tom 2005-12-17 blue jos01A8983 Jim 2006-02-19 white kfe0
3、2A7777 韩梦龙 2005-02-07 black vds02C2222 钱国正 2009-08-05 green yer01G8652 刘晓莉 2008-11-07 white kfe03H0029 Kasserine 2008-04-08 black xfd04G9665 索海丰 2009-04-09 red trs03B3222 唐如云 2007-10-08 brown htr02L6622 王睫 2007-11-08 blue nrr04L1122 Shelly 2006-11-03 black gf04A2200 David 2009-02-22 red ert01E8000 赵
4、远 2007-03-08 pink tre02V0009 唐文 2006-07-02 blue thh01B3321 郑华 2008-12-02 white jh03S6699 索耀光 2008-01-01 white rd03D4115 赵沙 2007-11-11 yellow kew01F6339 赵欢欢 2007-07-14 red kfe02H7775 叶丽娜 2009-08-15 brown wg02A8993 孙珍珍 2010-11-27 white wb02P8692 赵楠 2006-10-12 black trt04W5524 孙中华 2004-03-21 yellow ms0
5、3W6688 John 2007-01-11 pink esg(2) 概要设计本程序所用的抽象数据类型的定义:ArrType / 指针数组类型SLList / 静态链表类型SLCell / 静态链表的结点类型KeysType / 定义关键字类型为字符型InfoType / 定义其它数据项的类型主程序的流程及各程序模块之间的层次关系:开始先选择读入原始数据方式:1: 从文件读入(在桌面建立test.txt文档,第一行为记录数,记录数=10000,记录数必须符实,否则程序出错;第二行开始数据,数据用空格隔开,例如: 01S5842 将明 2007-12-02 blue jid);2: 直接用程序内
6、数据。然后对数据进行操作: 按车牌号排序并输出; 是否输出到文件?(y/n) 查找; 1): 按车牌号查找(排序后进行); 0: 退出 1:删除2): 按车牌号前两位查找;3): 按车牌号第三位查找。3: 按顺序插入数据;(排序后)4: 简单统计。 按车牌号前两位统计; 2): 按车牌号第三位统计。(3) 详细设计采用C语言定义相关的数据类型:typedef struct InfoType / 车主姓名等其它信息 char name17; char date12; char color11; char mark10;InfoType; / 定义其它数据项的类型 typedef char Key
7、sType; / 定义关键字类型为字符型 typedef struct SLCell / 静态链表的结点类型 KeysType keysMAX_NUM_OF_KEY+1; / 关键字(字符串末尾+0) InfoType oth; / 其它数据项 int next;SLCell;typedef struct SLList / 静态链表类型 SLCell rMAX_SPACE; /* 静态链表的可利用空间,r0为头结点*/ int keynum; / 记录的当前关键字个数 int recnum; / 静态链表的当前长度SLList;typedef int ArrTypeRADIX; / 指针数组类
8、型各模块的算法:基数排序:void Distribute(SLCell r,int i,ArrType f,ArrType e);/*静态键表L的r域中记录已按(keys0,keysi-1)有序。本算法按第i个关键字keysi建立RADIX个子表,使同一子表中记录的keysi相同。f0.RADIX-1和e0.RADIX-1分别指向各子表中第一个和最后一个记录*/void Collect(SLCell r,ArrType f,ArrType e);/*本算法按keysi自小至大地将f0.RADIX-1所指各子表依次链接成一个链表,e0.RADIX-1为各子表的尾指针。*/void Sort(SL
9、List L,int adr);/*求得adr1.L.length,adri为静态链表L的第i个最小记录的序号*/void Rearrange(SLList &L,int adr);/*adr给出静态链表L的有序次序,即L.radri是第i小的记录。本算法按adr重排L.r,使其有序。void RadixSort(SLList &L);/*L是采用静态链表表示的顺序表。对L作基数排序,使得L成为按关键字自小到大的有序静态链表,L.r0为头结点。void write(SLList l); / 输出到文件查找:int judge(char s); / 判断车牌号是否合法 int Search1(S
10、LList ST); /* 在表ST中折半查找其关键字等于key的数据元素。若找到,则打印该元素在表中的信息*/void Delete(SLList *l,int d); / 删除l中第d个记录void Search2(SLList l); / 据车牌号前两位搜索 void Search3(SLList l); / 据车牌号第三位搜索插入:int Read(SLList l,SLCell *r); /* 读取车牌号到r,若l中有此车牌号则读取失败*/ void Insert(SLList *l); /* 在l中按基数排序顺序插入车牌号及其他信息*/统计:void Statistic1(SLLi
11、st l); / 据车牌号前两位进行统计 void Statistic2(SLList l); / 据车牌号第三位进行统计函数的调用关系图: (4) 调试分析调试中遇到的问题及对问题的解决方法:我在调试中遇到了许多问题,由于问题太多无法一一说明,这里只说一些编译无错误而程序无法正常运行,或者程序的执行结果与预想的不同,其它的大部分错误软件在编译时会有提示,就不说了。1、出现如图1情况的,我碰到的有几种。图11) scanf或fscanf语句中一定要用变量的地址,而不是变量本身。这种错误在学习C语言时就强调过,但编程时还是得小心,我的程序在编了300多行时出现这个错误,费了好些时间才查找出来;2
12、) 数组或其它变量定义空间不足。例如在基数排序中,需要两个指针数组,大小与基数相同,如果小于基数的话,会出现图1所示的情况。2、程序执行结果与预想结果不同,如图2和图3所示图2这里有一个经常不经意犯的小错误,就是经常把“=”写成“=”,上图中while(a=0);以下还有一例:图4和图5中,if (c=y)。图3图4图53、有三个问题我不知如何解决:图4和图5中,运行结果是打印完“是否输出到文件?(y/n)”后直接回车打印“输入错误”,之间并没有让输入字符进行选择;图5中程序中使用的是scanf函数而不是getch()函数,因为编译时会提示没有getch()此函数,应该如何做才能把它找出来?如
13、图6、图7和图8所示,当进行选择时,若输入字母,则会进入死循环,而输入其它数字时则不会,我试了一下,当输入如!#等特殊字符时也会进入死循环,我暂时没能解决掉这个问题。图6图7图8暂时就这些问题了。(5) 使用说明及测试结果程序开始后,先选择读入原始数据方式;选择后,程序会先将数据按原来顺序打印出来;然后程序显示主菜单,对数据进行操作;1:按车牌号排序并输出;程序会先对原始数据以车牌号为关键字进行基数排序并输出;输出后程序会提示是否输出到文件,进行选择;若选择“y”,程序会将排好序的数据记录在桌面建立txt文档保存;若选择“n”,程序会继续回到主菜单。 程序会要求输入要查找的车牌号,读入后对其合
14、法性进行检验,若不合法(格式不正确),会要求重新输入;若合法,则查找。查找到后,程序会打印出车牌号的位置及其相关信息,然后进行选择是否删除;若未查找到,则打印“未找到与此车牌号相关的信息”;程序读入前两位后,会依次将满足条件的车牌号及其它相关信息打印出来,并在最后统计有多少个记录满足条件; 按车牌号第三位查找; 同前一个查找类似,程序找到满足条件的车牌号后会依次打印出车牌号及其相关信息,并在最后总和共有多少记录满足条件。先说,4: 程序会对已存在的记录以前两位进行统计,分别打印出各个种类有多少个; 按车牌号第三位统计程序会对已存在的记录以车牌号第三位进行统计,分别打印出各个种类有多少个。程序会
15、先要求输入要插入数据的车牌号,进行判断是否合法,不合法包括格式不正确和原始数据中已存在,程序会给出相应的提示,要求不合法的重新输入,然后要求输入车主姓名及其它相关信息,进行插入操作,成功后程序会提示插入成功并将所在位置打印出来;最后可以选择主菜单中的排序进行查看插入的数据及其所在位置。完成操作后,想退出程序的可以通过主菜单中的“0:退出”实现,其它菜单中一样可以通过此功能退出当前菜单。(6) 源程序(带注释)这是我从cpp文件中直接复制粘贴过来的:#includestdio.hstdlib.hmath.hstring.h#define N 30#define RADIX 26 /* 关键字基数
16、,此时是二十六个字母(包括十进制整数)的基数*/#define MAX_SPACE 10000 / 链表最大空间 #define MAX_NUM_OF_KEY 7 / 关键字位数 int menu0(); / 选择读入原始数据方式 int menu(); / 总菜单 int menu1(); / 查找菜单 int menu11(); / 删除菜单 int menu2(); / 统计菜单 int duru(SLList *l,int r); / 执行读入原始数据 void print(SLList L,int w); / 按数组序号输出静态链表本算法按第i个关键字keysi建立RADIX个子表,
17、使同一子表中记录的keysi相同。f0.RADIX-1和e0.RADIX-1分别指向各子表中第一个和最后一个记录*/ / 据车牌号第三位搜索 / 据车牌号第三位进行统计 / 删除l中第d个记录 /* 读取车牌号到r,若l中有此车牌号则读取失败 */ /* 在l中按基数排序顺序插入车牌号及其他信息 */int main() SLList l; int a,o,x,y,z; l.recnum=N; l.keynum=MAX_NUM_OF_KEY; do a=menu0(); a=duru(&l,a); while(a=0); printf(车牌号排序前:n); print(l,0); x=menu
18、(); switch(x) case 1: RadixSort(l);车牌号排序后: write(l); break; case 2: y=menu1(); switch(y) o=Search1(l); if (o) Delete(&l,o);Search2(l);break; case 3:Search3(l); case 0: while(y!=0); if (l.recnumMAX_SPACE) Insert(&l); else空间已满,无法插入! case 4: z=menu2(); switch(z)Statistic1(l);Statistic2(l); while(z!nttt
19、 Bye bye!nnn while(x! system(pause return 0;int menu0() int x; -n | 1: 从文件读入(在桌面建立test.txt文档,第一行为记录数, |n | 记录数第二行 |n | 开始数据,数据用空格隔开,例如: |n | 01S5842 将明 2007-12-02 blue jid); | 2:please select(1-2): scanf(%d,&x); while(x2)输入错误!Please enter the number(1-2): ; return x;int menu() -n | 0: 退出! | 3:(排序后) |n | 4: please select(0-4): /怎样能避免输入两个数字和字母的情况?0|x4)Please enter the number(0-4):int menu1() -n|n please select(0-3):3)Please enter the number(0-3):int menu11() -n 退出
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1