资源描述
课 程 设 计 报 告
课程名称数据结构课程设计
课题名称 停车场管理系统
专 业 信息管理与信息系统
班 级 09级1班
学 号 200903110112
姓 名 洪俊斌
指导教师赵锦元、李峰、罗敬
2011年 1月 9 日
湖南工程学院
课 程 设 计 任 务 书
课程名称 数据结构
课 题 停车场管理系统
专业班级 信息管理0901班
学生姓名 洪俊斌
学 号 200903110112
指导老师 赵锦元、李峰、罗敬
审 批
任务书下达日期 2011 年 1 月 3 日
任务完成日期 2011年 1 月 20 日
一、设计内容与设计要求
1.设计内容:
[问题描述] 设停车场只是一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出,还有一个等停的的狭长通道。汽车在停车场内按车辆的先后顺序依次排列,若车站内已停满汽车,则后来的汽车只能在门外的通道上等停,一旦停车场内有车开走,则排在通道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车站为它让路,待该车辆开出大门,为它让路的车辆再按原来次序进入车场.在这里假设汽车不能从便道上开走,试设计这样一个停车场模拟管理程序.
[基本功能]
(1) 车辆成批入站。
当一个停车场刚开始投入运行的时候,会有很多车进来,因此,要设计一个函数来实现车辆批量进站。并要检测车辆的数目是否超过规定的最大容量,给出相关提示信息.
(2)单个车辆入站。
当系统正常投入运行后,会有零散的车辆进进出出,因此,设计一个函数实现单个车辆入站.
(3)车站内信息实时显示。
车站内信息包括两个部分:停车场内停放的车辆以及在外面通道上等停的车辆。
(4)车辆出站。
当停车场内车辆出站后,检查通道上是否有车等停,如果有,则要把排在最前面的车调入停车场内.
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等.
5).实际操作过程中遇到的问题及解决方法:设计总结及心得体会。
6).上机演示。
二、进度安排
第 19 周 星期一 8时:00分——11时:30分
星期二 8时:00分—-11时:30分
星期三 14时:00分——17时:30分
星期四 14时:00分-—17时:30分
星期五 8时:00分—-11时:30分
第 20 周 星期一 8时:00分——11时:30分
附:
课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单).
正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序源代码).
目 录
1 系统需求分析1
1.1设计思想1
1。2实现方法1
2 总体设计2
2.1总体设计图2
2。2模块流程图3
2.2.1:车辆成批入站3
2。2。2:车站内信息显示4
3 详细设计5
3。1 采用结构体定义的相关数据类型5
3。2 功能函数设计6
4 系统测试及其结果11
4.1 程序调试中的问题11
4.2 结果截图13
4。2。1:case1:车辆成批入站13
4。2。2:case3:车辆出站15
5 心得体会16
6 附录18
6。1源程序代码18
6。2 参考文献24
7 评分表25
1 系统需求分析
1。1设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个循环队列来实现.当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的循环队列的头结点连到原来的第二辆车上就可以了.
这个程序的关键是车辆的进站和出站操作,以及车场和通道之间的相互关系.由于车站是一个很窄的、一边开口的车道,先进后出,类似数据结构中的栈结构,故车场用栈这种数据结构来描述.外面的狭长的通道,先进先出,故可用队列结构来描述。考虑到车场和通道在整个程序中都要用到。故把这两个变量定义成全局变量。本程序中的数据对象是汽车,可以认为车牌号是每个元素的关键项,不能重复,和现实中一样,另外加了车主姓名这一数据项,为表简洁,其他相关信息如入场时间,车的类型,收取费率等,都不再考虑,具体应用的时候可以方便地修改得到。
1。2实现方法
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个循环队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此循环队列上的结点而已.
2 总体设计
2.1总体设计图
停车场
车辆
管理
系统
车辆
出站
显示
车站
内汽
车信息
车站管理系统主菜单 函 数
退出
系统
车辆
成批
入站
单个
车辆
入站
图2。1 功能模块图
运行程序到系统界面,接着系统界面就会出现让你能选择的功能:
【1】车辆成批入站
【2】单个车辆入站
【3】车辆出站
【4】车站内信息实时显示
【5】相关功能设定
【0】退出本系统
2.2模块流程图
2。2.1:车辆成批入站
开 始
输入汽车的车牌号还有车主姓名
strcpy(pcar.num,pnum);
strcpy(pcar.name,pname);
Push(SCar,pcar)==-1
InsertQueue(QCar,pcar)==-1
车站已满!车辆已经入通道!
通道已满,进入通道失败!!
while(strcmp(pnum,"#")!=0)
结 束
这批汽车已经成功进入停车场
n
y
n
y
n
y
图2。2车辆成批入站流程图
2.2。2:车站内信息显示
开 始
SCar->top==-1
i=0
i<SCar->top+1
printf("%-13s",SCar->data[i].num);printf("%18s\n",SCar->data[i].name);
i++
QCar->rear!=QCar->front
while(front!=rear)
printf("%-13s",SCar->data[i].num);printf("%18s\n",SCar->data[i].name);
front=(front+1)%QCar->n
结 束
y
n
n
y
y
n
图2.3停车场内信息显示流程图
3 详细设计
3.1 采用结构体定义的相关数据类型
前面提到,要用到栈和队列的操作.这里,由于一个车场的最大容量是一定的,且车场最多执行的操作是插入和删除操作,所以用顺序储存结构可以带来更大益处.为了防止队列中出现“假溢出”现象,这里采用了循环队列.在模拟汽车这个对象时,进行了简化处理,只取得最核心的两个数据项:车牌号和车主姓名.具体数据结构定义如下:
首先定义maxsize为20:
#define maxsize 20
第二个再定义汽车的信息:车牌号num[10]和车主姓名name[10]:
typedef struct car{
char num[10];
char name[10];
}Car;
第三个定义汽车场的结构,在这里我把它看成是一个栈,在这里定义栈的容量等信息:
typedef struct {
Car data[maxsize];
int n;//栈容量设定
int top;
}Stack;//顺序栈 用来存放汽车场内的车辆信息
第四个定义通道的结构,在这里我把它看成是一个循环队列,在这里定义队列胡容量等信息:
typedef struct {
Car data[maxsize];
int n;//队列容量设定
int num;//当前通道上的车辆数
int front,rear;
}Queue;//循环队列 用来存放通道内的车辆信息
3。2 功能函数设计
(1)车辆成批入站void InitCarpark(void)//车辆成批入站
此函数也可以作为初始化车场的函数,因为一个车场刚开始投入运行的时候会有很多的车进来,这也是设计此函数最重要的一个原因。每行输入一个汽车信息,最后结束的时候输入“# #”即可。汽车信息中前面表示汽车的车牌号,后面表示车主姓名,中间用空格隔开。当输入汽车的数目超过规定的最大容量的时候(如果开始不设置最大容量,默认值为系统申请的最大值maxsize=20),自动检测条件,给出相关提示信息。程序如下:
void InitCarpark(void)//车辆成批入站
{char num[8],*pnum,name[10],*pname;
Car pcar;
pnum=num;
pname=name;
printf(”\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开))(以'# #'这个符号结束):\n”);
scanf("%s%s”,pnum,pname);
while(strcmp(pnum,"#”)!=0)
{strcpy(pcar.num,pnum);
strcpy(pcar。name,pname);
if(Push(SCar,pcar)==-1)
{ printf("\n车站已满!车辆已经入通道!\n”);
if(InsertQueue(QCar,pcar)==-1)
printf("\n通道已满,进入通道失败!!\n”);
}
scanf("%s%s”,pnum,pname);
}
printf("这批汽车已经成功进入停车场\n”);
getch();
carmenu();
}
(2)单个车辆入站void InsertCar(void)//单个车辆入站
当系统正常投入运行后,会有零散的车辆进进出出,如还用成批输入方式的话,将会带来一定的麻烦。此函数具有函数InitCarpark()几乎所有的功能,程序跟InitCarpark()这个差不多,同样先输入,然后再判断停车场是否满了,通道是否满了,最后执行结果,程序如下:
void InsertCar(void)//单个车辆入站
{char num[10],*pnum,name[10],*pname;
Car pcar;
pnum=num;
pname=name;
printf("\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开)):\n”);
scanf("%s%s”,pnum,pname);
strcpy(pcar.num,pnum);
strcpy(pcar。name,pname);
if(Push(SCar,pcar)==—1)
{printf("\n车站已满!车辆已经入通道!\n”);
if(InsertQueue(QCar,pcar)==—1)
printf(”\n通道已满,进入通道失败!\n”);
getch();
}
(3)车辆内信息显示函数void ShowCar(void)//车站内信息显示
如果车场本身是空的,没有汽车,那么也就不存在查看汽车信息了。故本函数一开始进行合理性检查,如果条件不成立,拒绝执行显示信息操作,给出出错的信息后返回到主界面。前面提到,车站内信息包括两部分:车场内停放的车辆,在外面通道上等停的车辆。因为通道上也不一定有车,程序输出车场内的所有汽车信息后,自动进行判断通道上是否有车辆.如果有车辆的话,继续输出停在通道上的车子信息.程序如下:
void ShowCar(void)//车站内信息显示
{ int i,front,rear;
if(SCar—〉top==—1)
{ printf("\n\n这停车场是空的!\n");getch();carmenu();}
printf("\n\n目前停车场的车有:\n--—车牌号—-——————--—车主姓名\n”);
for(i=0;i〈SCar->top+1;i++)
{ printf(” %—13s",SCar—〉data[i]。num);
printf(”%18s\n”,SCar-〉data[i]。name);}
if(QCar—〉rear!=QCar—>front)//通道内有车辆
{front=QCar->front;rear=QCar—〉rear;
printf("\n通道信息:\n——-车牌号—-————-———--——车主姓名\n”);
while(front!=rear)
{printf(" %—13s",QCar—>data[front]。num);
printf(”%18s\n”,QCar—>data[front].name);
front=(front+1)%QCar-〉n;}
}
}
(4)车辆出站函数void ExitCar(void)//车辆出站
同上,首先进行和利息你给检查。这里的检查包括两个部分:车场非空且输入的车牌号在车场中.如果一切条件满足,则执行推车操作。最后,检查通道上是否有车辆等待。如果通道不为空,程序会自动把排在通道最前面的车调入车场内。
其中,退车的算法过程如下:
① 前面检测条件满足时,执行如下操作:由于车场很窄,当一辆车要出场时,排在它后面的车辆需要先出场,等要退出的车开走后,刚才为它让道的那些车再按原次序进入车场。不难看出,这里需要创建一个临时栈,用于保存让道车辆的信息。
② 在前面的合理性检查中,已经定位到出场车辆所在位置,从栈顶开始,到所在位置前一个结束,车场内执行出栈操作,临时栈结构执行入栈操作。
③ 在当前位置执行出栈操作,即可实现指定的车辆出场.
④ 当临时栈不为空时,依次执行:临时栈退栈,车场内入栈.
(5)车站模拟系统相关功能设定函数void SetCar(void)//车站模拟系统相关功能设定
此函数很简单,首先用一个do-while循环,得到一个合理值,修改相关参数即可。这里有一个防错设计:当输入的最大容量小于车场内当前的车辆数时,拒绝执行修改.程序如下:
void SetCar(void)//车站模拟系统相关功能设定
{ int b;
printf(”选择1:修改停车场的容量\n”);
printf(”选择2:修改通道的容量\n”);
printf(”请你选择操作(1—2):\n”);
scanf("%d",&b); /*读入选择*/
if(b==1)
{int n,flag=1;
printf(”\n\n目前停车场最大的容纳量是:%d\n”,SCar—>n);
printf("\n输入您想要的停车场的最大容纳量:(〈=%d)\n”,maxsize);
do{ printf(”请输入数值:”);
scanf("%d”,&n);
if(n>maxsize){printf(”输入错误,请重新输入\n”);}
if(n〈SCar—〉top+1)
{ flag=0;
n=SCar—〉n;
break;
}
}while(n〈0||n>maxsize);
SCar-〉n=n;
if(flag!=0) printf("\n修改成功!\n");
else
printf("\n错误!车站车辆已经超过此数!如要再输,请再按功能5\n”);
getch();
carmenu();}
if(b==2)
{ int n,flag=1;
printf(”\n\n目前通道最大的容纳量是:%d\n”,QCar—〉n—1);
printf(”\n请输入您想要的通道的最大容纳量:(<=%d)\n”,maxsize);
do{ printf(”请输入数值:”);
scanf("%d”,&n);
if(n>maxsize){printf(”输入错误,请重新输入\n”);}
if(n<QCar—>rear+1)
{ flag=0;
n=QCar—>n;
break;
}
}while(n〈0||n>maxsize);
QCar->n=n+1;
if(flag!=0) printf("\n修改成功!\n”);
else
printf(”\n错误!车站车辆已经超过此数!如要再输,请再按功能5\n");
getch();
carmenu();}}
(6)车站管理系统主菜单函数void carmenu(void)//车站管理系统主菜单
此函数是用户与系统之间的一个窗口,用户通过它来选择相关操作.用printf语句打印出供选择项目后,用不会显的getch()得到一个字符,用开关语句switch进行分类,判断用户想要执行的操作,然后执行相关功能函数即可.
(7)主函数void main(void)
为分别表示车场和通道的两个指针变量申请空间,分别调用相应的初始化函数,得到一个合理解,然后程序流向主供选菜单,供用户选择执行。
void main(void)
{if((SCar=(Stack *)malloc(sizeof(Stack)))==NULL)
{ printf(”Failed!”);exit(1);}
if((QCar=(Queue *)malloc(sizeof(Queue)))==NULL)
{printf("Failed!");exit(1);}
InitStack(SCar);InitQueue(QCar);
carmenu();exit(0);
}
4系统测试及其结果
4。1 程序调试中的问题
调试过程中的主要问题
由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。本程序的调试运行,总体上情况良好,但中间也出现了一些小问题.其中比较有代表性的主要问题有:
(1)当停车场已经达到最大容量,但仍有车辆进入停车场的时候,运行界面上没有出现或者说出现了但又跳掉了“车站已满!车辆已经入通道!"的提示信息。在查阅了多种资料后,在那一个printf语句后加了一个getch(),此时,程序运行结果就符合要求了,看起来也比较清晰了.
(2)使用getch()语句必须使用头文件#include<conio。h〉
刚开始因为没有使用这个头文件,所以会出现getch()这个无法辨别
图4。1 错误报告1
(3)在对字符型的数据进行赋值的时候,要用strcpy,而不能直接用pcar。num=pnum这样的赋值形式,这样子会产生如下的错误:
图4。2 错误报告2
正确的形式应该是这样的:strcpy(pcar.num,pnum);
(4)同时,对字符型的数据进行比较的时候,也需要用strcmp.
不过我认为用while(pnum=="#”)的形式也是可以的,我试验了一下,结果是可以的,所以不用strcmp这个东西也是可以的。
注意呀,那个#符号必须加””号,不加的话就有四个错误了:
图4。3 错误报告3
(5)把通道看成是一个队列,但在通道中的车辆数目总是少一辆,刚开始总是感觉疑问,明明就是设定maxsize为20的,通道内的车辆为什么就只有19辆呢,后来,我突然想到原来队列的Q—〉front是不存放数据的,终于找到了错误的地方了,所以我在定义数列的地方,把原来的Q—〉n=maxsize改成了Q-〉n=maxsize+1;结果是对的了.
(6)采用清屏的功能:system(”cls”); /*运行前清屏*/
刚开始不知道有这个功能,在屏幕执行的时候,总感觉屏幕非常的复杂杂乱,感觉不是很舒服,后来问了同学一下,发现了这个功能,就马上加上了这个功能,屏幕就看起来比较清晰和舒服了。
(7)刚开始的时候,程序的健壮性不是很强,在主菜单函数中选择case多少时,如果不是规定的数字范围内的时候,它就会直接说按任意键返回.所以为了增强程序的健壮性,在最后加上default:ShowCar()这句话,在一开始运行程序的时候,由于此时停车场内信息没有输入,认为是空的,而当用户选择了退出车站的时候,程序将给出出错的信息“这停车场是空的".
(8)在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难,所以尽量少用goto语句.因为在网上看到了这段话,所以我就把那个车站模拟系统相关功能设定这个模块改成用do—while语句的形式,其实我觉得do—while语句还是比较容易能实现的,而且程序也比较容易去检测出错误。
(9)对于通道的假定,原本是没有采用循环队列的,只是采用了比较基本简单的顺序存储队列,后来发现,这样子会发生“假溢出"的现象,所谓的“假溢出” 顾名思义就是队列出现了“假满"的情况,而不是“真满”,比如 设队头指针为front,队尾指针是rear,约定front指向队头元素的前一位置,rear指向队尾元素。当front等于—1时队空,rear等于m—1时为队满。由于队列的性质(“删除"在队头而“插入"在队尾),所以当队尾指针rear等于m—1时,若front不等于—1,则队列中仍有空闲单元,所以队列并不是真满。这时若再有入队操作,会造成假“溢出".
4.2结果截图
4。2.1:case1:车辆成批入站
待主界面显示出来后,按1进入输入车辆的界面,然后输入你想输入的车辆信息,然后以“# #”号结束;在此之前,你还可以先设定车站和通道的容量;如下图:
1:先修改停车场与通道的容量,都改成2;
图4。4车辆成批入站结果截图(1)
图4。5车辆成批入站结果截图(2)
2:成批输入三辆汽车的信息,因为停车场内只能停两辆汽车,所以第三辆车要停放在通道上等停,一旦停车场内有汽车开走,通道上的车辆即可进入;
图4.6车辆成批入站结果截图(3)
3:待返回主界面后,按4,即会显示出车站内与通道上的车辆信息;
图4.7车辆成批入站结果截图(4)
4。2.2:case3:车辆出站
1:输入想要出站的汽车牌号,然后汽车出站,接着通道上的第一辆汽车进入停车场;
图4.8车辆出结果截图(1)
2:通道内的车已经进入停车场,如下图:
图4。9车辆出结果截图(2)
5 心得体会
2011年1月12日星期三,我终于把忙了一个星期的数据结构课程设计做完了,感觉有点累吧,这一个星期,几乎每天都对着电脑,或者就是在图书馆的205借书室TP书柜那边查阅相关的资料,还要被图书馆的老师说要关门啦,请自习的同学赶紧出去,可是因为没有找到我想要的答案或者是资料,我就是想赖着不想走,没办法,图书馆的老师比较大,我还是闷闷不乐的出去了.不过,今天看见我完成了的程序,我感到非常的高兴,我全身的那种疲惫感嗖的一声,全都不见了,身上的压力感,责任感也变得轻了好多,整个人也感觉变轻松了,只因为我把程序改完了,脸上的表情也慢慢的从绷紧的状态变成了松弛的状态,慢慢恢复原来的搞怪和喜欢帮人了(Ps:因为做这个程序有时候比较心烦,那时别人叫我帮他看一下程序,因为自己的没搞好,哪有心情看别人的呀,那种程序都好长的说,所以就拒绝了,现在想起来,诶,只能说对不起喽).
好喽,废话都说完了,还是切入正题要紧……
话说这也是我第三次做课程设计了,第一次是做唐志航老师的《C语言课程设计》,第二次是做李峰老师的《计算机软件与系统》的课程设计,这是第三次,名字是《数据结构课程设计之停车场管理系统》,刚开始拿到停车场系统这个题目的时候,我就有点迷茫了,我在想为什么我拿到的不是生死者游戏或者是别的什么课程设计,偏偏让我拿到了这个比较复杂的课程设计,没办法,学号是12号,左算右算除以5余数还是为2。不过也许是因为这个程序比较复杂,我学到了许多很重要的知识,除了巩固设计语言外,而且了解了很多程序设计的实现方法,对《数据结构》这本书有了更深程度的认同.后来,我把程序给敲完了,我才发现,其实你只要把这个程序分模块完成,其实一点都不难,这好像《数据结构》中所学的“递进”思想吧,先算简单的,然后再返回再做比较复杂的。
通过这次的课程设计,我拓宽了知识面,锻炼了能力.比如对于队列的队满或者队空的状态呀,或者队列的长度呀,记得我那时想了好久的一个问题,我在上面程序的调试分析里有提过,就是我明明定义maxsize等于20,可是通道内汽车的数量却只能输进19辆汽车的信息,我纠结了好久,后来,我的脑袋中突然闪过一个循环队列的图,那个Q—>front好像是不存放数据资料的,后来我问了赵老师,也确认了,这个Q-〉front这个结点确实是不存放数据的,这样子一想,问题就游刃而解了,只要把原来的Q—>n=maxsize改成了Q—〉n=maxsize+1就OK了。
也许这就是课程设计的目的吧,在于把理论和实际相结合吧,把课堂上所学到的系统化的理论知识投到实际中,巩固还没有巩固的知识点,也有助于我们提高观察,分析和解决问题的实际工作能力,就像那时我和赵老师在对问题进行分析时,因为双方对汽车场通道的看法都是不同的,所以我们就进行讨论了,我觉得能和老师讨论这很重要,特别是能找出程序上的不足,对完善我们的程序有着莫大的帮助,那天下午,我也改进了程序,在程序上加上了一个选择,就是停车场和通道的容量,可以由你更改,改变原来的默认值,但唯一的前提是不能比默认值大,所以,很谢谢赵老师。
可以说吧,《数据结构》真的也比较难,特别是知识点非常的多,很容易看那个忘记了这个,对于课设要用到的综合知识,那可是难上加上,不过,这也才激发了我的兴趣,有动力比别人早完成程序。很开心我做到了,既完成了课设也学到了好多知识,经历了这一个星期,我收获了如下的几点:
1. 程序的设计思想的精巧的重要性,是不管怎么说都不为过的,好的程序可以让大家很快的明白你的思想,而且很方便的来实现它。还有不管这程序有多长,只要你解释了之后,别人很快就能明白,看程序也比较简单了。
2.《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践.一个人的力量是有限的,要想把课程设计做的更好,就要学会参考一定的资料,要善于捕获资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感.
3.学会“递进”的思想:程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决.再总体解决大的问题.这样做起来不仅有条理也使问题得到了轻松的解决.
这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的基本技能,提高了我适应实际,实践编程的能力.
这次的课程设计我对于专业课的学习有了更加深刻的认识,以为现在学的知识用不上就加以怠慢,等到想用的时候却发现自己的学习原来是那么的不扎实。以后努力学好每门专业课,让自己拥有更多的知识,才能解决更多的问题!
总的来说,这次课程设计让我获益匪浅,对数据结构也有了进一步的理解和认识,也让我相信,只要你要做(just do it),没有什么困难能难倒我们……
6 附录
6。1源程序代码
#include<stdio。h〉
#include<string.h〉
#include〈conio.h〉
#include〈stdlib。h〉
#define maxsize 20
typedef struct car{
char num[10];
char name[10];
}Car;
typedef struct {
Car data[maxsize];
int n;//栈容量设定
int top;
}Stack;//顺序栈
typedef struct {
Car data[maxsize];
int n;//队列容量设定
int num;//当前通道上的车辆数
int front,rear;
}Queue;//循环队列
Stack *SCar;//全局变量:车站内车辆信息
Queue *QCar;//全局变量:通道内车辆信息
void carmenu(void);
void InitStack(Stack *S)
{
S-〉top=-1;
S—〉n=maxsize;
}
void InitQueue(Queue *Q)
{Q—〉front=Q—>rear=Q—〉num=0;
Q—>n=maxsize+1;
}
int Push(Stack *S,Car x)//入栈操作
{if(S—>top==S-〉n-1)
return(—1);
S-〉top++;
S-〉data[S—〉top]=x;
return(0);
}
int Pop(Stack *S,Car *px)//出栈操作
{if(S—〉top==—1)
return(—1);
S—〉top—-;
*px=S—>data[S—〉top+1];
return(0);
}
int InsertQueue(Queue *Q,Car x)//入队
{if(((Q-〉rear+1)%Q—〉n)==Q—>front)
return(—1);
Q—〉num++;
Q-〉data[Q—〉rear]=x;
Q—〉rear=(Q—〉rear+1)%Q-〉n;
return(0);
}
int DeleteQueue(Queue *Q,Car *x)//出队
{if(Q-〉front==Q—>rear)
return(-1);
Q-〉num--;
*x=Q—>data[Q->front];
Q—>front=(Q—〉front+1)%Q—〉n;
return(0);
}
void ShowCar(void)//车站内信息显示
{int i,front,rear;
if(SCar->top==-1)
{printf("\n\n这停车场是空的!\n”);
getch();
carmenu();}
printf(”\n\n目前停车场的车有:\n-——车牌号——--—-—---———-车主姓名\n”);
for(i=0;i〈SCar—〉top+1;i++)
{printf(" %—13s”,SCar—>data[i]。num);
printf("%18s\n”,SCar—>data[i].name);}
if(QCar—〉rear!=QCar—〉front)//通道内有车辆
{front=QCar->front;
rear=QCar-〉rear;
printf("\n通道信息:\n——-车牌号—-——————--————车主姓名\n”);
while(front!=rear)
{printf(” %-13s",QCar-〉data[front]。num);
printf(”%18s\n”,QCar->data[front]。name);
front=(front+1)%QCar-〉n;}
}
getch();
carmenu();
}
void InitCarpark(void)//车辆成批入站
{char num[8],*pnum,name[10],*pname;
Car pcar;
pnum=num;
pname=name;
printf("\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开))(以’# #’这个符号结束):\n”);
scanf(”%s%s”,pnum,pname);
while(strcmp(pnum,”#”)!=0)
{strcpy(pcar。num,pnum);
strcpy(pcar。name,pname);
if(Push(SCar,pcar)==—1)
{printf(”\n车站已满!车辆已经入通道!\n”);
if(InsertQueue(QCar,pcar)==—1)
printf("\n通道已满,进入通道失败!!\n”);
}
scanf(”%s%s”,pnum,pname);
}
printf(”这批汽车已经成功进入停车场\n”);
getch();
carmenu();
}
void InsertCar(void)//单个车辆入站
{char num[10],*pnum,name[10],*pname;
Car pcar;
pnum=num;
pname=name;
printf(”\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开)):\n”);
scanf(”%s%s”,pnum,pname);
strcpy(pcar。num,pnum);
strcpy(pcar.name,pname);
if(Push(SCar,pcar)==—1)
{printf("\n车站已满!车辆已经入通道!\n");
if(InsertQueue(QCar,pcar)==—1)
printf("\n通道已满,进入通道失败!\n”);
getch();
}
carmenu();
}
void ExitCar(void)//车辆出站
{
int i,position,flag=0;
Car x;
Stack *S;
char num[10],*pnum;
pnum=num;
if(SCar—>top==—1)//车站不能为空
{printf("\n\n这停车场是空的!\n");
getch();
carmenu();
}
printf("\n\n请输入车子的车牌号:\n”);//输入出站车辆的车牌号
scanf(”%s",pnum);
for(i=0;i<SCar—〉top+1;i++)
if(strcmp(SCar—〉data[i]。num,pnum)==0)
{position=i;
flag=1;
}
if(!flag)
{printf("对不起,没有找到该车的信息!");
getch();
carmenu();
}
if((S=(Stack *)malloc(sizeof(Stack)))==NULL)
{printf(”Failed!");
exit(1);
}
InitStack(S);
for(i=SCar->top;i>position;i—-)
{
Pop(SCar,&x);//车场出车
Push(S,x);//通道入车
}
Pop(S
展开阅读全文