(1)、 通过课程设计,加深对《数据结构》这一课程所学内容的进一步理解与巩固。
(2)、 通过课程设计,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合
理的模块化结构。
(3)、 通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
(4)、 通过课程设计,训练 C 程序调试能力,能将一个中小型各级组织系统联调通过。
(5)、 通过课程设计,开发一个中小型系统,掌握系统研发全过程。
(6)、 通话课程设计,培养分析问题、解决实际问题的能力
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
要求设计程序输出如下:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
1、算法思想分析
由于停车场是一个狭窄通道, 而且只有一个大门可供汽车进出, 问题要求汽 车停车场内按车辆到达时间的先后顺序, 依次由北向南排列。 由此很容易联想到 数据结构中的堆栈模型, 因此可首先设计一个堆栈, 以堆栈来模拟停车场, 又因 为每个汽车的车牌号都不一样, 这样一来可以根据车牌号准确找到汽车位置, 所 以堆栈里的数据元素我设计成汽车的车牌号。 当停车场内某辆车要离开时, 在他 之后进入的车辆必须先退出车场为它让路, 待该辆车开出大门外, 其他车辆再按 原次序进入停车场。 这是个一退一进的过程, 而且让道的汽车必须保持原有的先 后顺序,因此可再设计一个堆栈, 以之来暂时存放为出站汽车暂时让道的汽车车 牌号。当停车场满后, 继续进来的汽车需要停放在停车场旁边的便道上等候, 若 停车场有汽车开走, 则按排队的先后顺序依次进站, 最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道, 队列中的数据元素仍然设计成汽车的车牌号。 另外,停车场根据汽车在停车场内 停放的总时长来收费的, 在便道上的时间不计费, 因此必须记录车辆进入停车场 时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。 由于时间不像汽车一样需要让道, 我设计了一个顺序表来存放时间。 又用顺序表 用派生法设计了一个堆栈,恰好满足上面模拟停车场的需要。
2、实现方法
离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。对于此停车场管理系统的实现, 就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。 至于通道上车辆的停放则用一个链队列来实现, 此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。 对于要对停车场内的车辆根据其停放时间收取相应的停车费用, 可以记录下车辆进入以及
1.构建结构体
(1)定义车辆结构体函数
struct BUS
{
int num;
int intime;
int outtime;
}bus[10000],buss[1000];
其中定义了车辆的车牌、车辆停的位置、车辆停留的时间的数据类型,和进入停车场车辆的最大的数用一个数组表示最大数不超过10000 便道不能超多1000辆。
(2)定义停车场结构体函数
struct seq//停车场
{
int bus[10000];
int top;
};
其中定义了停车场所停车辆的数据类型,和停的车辆数的数据类型。
(3)定义便道结构体函数
struct Biandao
{
int data;
int time;
int num;
struct Biandao *next;
};
struct biandao
{
Biandao *first;
Biandao *rear;
}biandao;
其中定义了进入便道的时间、车牌。和车辆入栈的位置。
2.创建主函数
int main()
{
int x,t;//记录时间,位置的变量
int n;//记录主车道车位数量的变量
printf("请输入停车场主车位数量:");
cin >> n;//键盘输入主车道车位数量
char a[7],b[7];//a数组记录停放车辆和取车以及退出系统关键字,b数组作为记录车辆牌号信息的数组
seq s;
s.top=0;//初始化栈
seqq ss;
ss.topp=0;
biandao.first=NULL;//初始化链队 首尾置空
biandao.rear =NULL;
int num = 0;
printf("输入start进入停车厂,take取车,quit退出:");
while (cin>>a)//给A数组赋值
{
if(strcmp(a,"start")==0){
//用比较字符串比较A数组中记录的关键字是否与start相等
printf("输入车牌号信息:");
cin>>b;//输入车牌号
printf("输入停车位置(1-%d):",n);
cin>>x;//输入位置
printf("原定停车时间:");
cin>>t;//输入预约时间
if ( s.top >= n )//如果停车场已满
{
printf("主道已满,只能听在辅道了!!!\n");
Biandao *p;//一个新结点P
p=(Biandao *)malloc(sizeof(Biandao));
p->data=x;//把位置存放在p结点的data域中
p->time=t;//把时间信息存放在p结点time域中
strcpy(p->we,b);//用字符串复制函数把b存放的牌号信息复制到p结点的we域
num++;
p->next=NULL;//将P结点的next域置空
if (biandao.rear != NULL){
//队尾不为空
biandao.rear->next=p;//将p结点的信息赋值队尾
biandao.rear=p;
}
if (biandao.first==NULL){
//队头为空
biandao.first=p;//将p结点的信息赋值到队头
}
printf("车牌为:");
puts(biandao.first->we);//输出队头指针指向的we的信息
printf("\n在便道的第%d位置,时间为%d\n",num,t);
}
else//停车场未满
{
s.top=0;//将top置为0
for(int i=0;i<x;i++){
//找到要存入栈的位置
s.top++;
}
bus[s.top].num=x;//将位置信息存放在num
bus[s.top].intime=t;//将时间信息存放在intime
strcpy(bus[s.top].l,b);//将b存放的车牌号信息存放l
}
printf("车牌为:");
puts(bus[s.top].l);//输出top位置上的l
printf("停车场的第%d位置,停车时间为%d\n",s.top,bus[s.top].intime);
printf("start继续停车,take取车,quit退出:");
}
else if (strcmp(a,"take")==0)//如果a记录的关键字等于take
{
memset(b,0,sizeof b);//将b数组置空
printf("输入车牌号(1-%d):",n);
cin>>b;//记录车牌信息
printf("输入停留时间:");
cin>>t; //记录时间
if (s.top == 0)//栈空
{
printf("输入错误 重新输入\n");//输出错误
printf("start继续停车,take取车,quit退出:");
continue;//返回whlie 循环重新开始
}
else
{
int nu=0;//记录位置变量
for (int i=0;i<=n;i++)//看车辆是否在主车道
{
if (strcmp(bus[i].l, b)==0)//如果车辆信息与主车道的车辆信息有匹配的
{
nu=i;
if(t>bus[nu].intime){
//停留时间大于预约时间
printf("你以超时,超过时间按每小时6块收费,原价5块");
printf("\n停留时间%d, 费用 %d \n", t ,bus[nu].intime*5+bus[nu].intime*6 );
}else{
//停留时间小于预约时间
printf("你以超时,超过时间按每小时6块收费,原价5块");
printf("\n停留时间%d, 费用 %d \n", t ,bus[nu].intime*5);
}
for (int i=nu ;i<=s.top;i++)//出停车站
{
bus[i]=bus[i+1];
}
s.top--;
}
}
if(nu==0){
//如果主车道没有该车辆
printf("车量不在主车道! 等待主车道的主车把车开走你才可以进入停车场!\n");
printf("start继续停车,take取车,quit退出:");
continue;//返回上层
}
if (biandao.first!=NULL)//如果便道上有车
{
s.top++;//top加一
bus[s.top].num = biandao.first->data;
bus[s.top].intime = biandao.first->time;
strcpy(bus[s.top].l,biandao.first->we);
num--;
Biandao *q;
q=biandao.first;
biandao.first=biandao.first->next;
free(q);
printf("车牌为:");
puts(bus[s.top].l);
printf("已经进入停车主车道!");
printf("在停车场的第%d位置,停车时间为%d\n",s.top,bus[s.top].intime);
}
}
printf("start继续停车,take取车,quit退出:");
}
else if(strcmp(a,"quit")==0){
printf("感谢使用本停车场系统!!");
exit(1);
}
}
}
3.输入车牌号信息,停车位置,原定停车时间
通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。在这段时间里,我对for、while等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯。在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。在程序的调试能力上,无形中得到了许多的提高。例如:头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct BUS
{
int num;//记录位置
int intime;//记录预约时间
char l[100];//记录车牌号
}bus[10000],buss[1000];
struct seq//停车场
{
int bus[10000];//系统最大元素数量
int top;//记录主车道车辆数量
};
struct seqq
{
int buss[1000];
int topp;
};
struct Biandao
{
int data;//辅车道车辆位置
char we[100];//车辆牌号信息
int time;//预约时间
int num;
struct Biandao *next;
};
struct biandao
{
Biandao *first;
Biandao *rear;
}biandao;
int main()
{
int x,t;//记录时间,位置的变量
int n;//记录主车道车位数量的变量
printf("请输入停车场主车位数量:");
cin >> n;//键盘输入主车道车位数量
char a[7],b[7];//a数组记录停放车辆和取车以及退出系统关键字,b数组作为记录车辆牌号信息的数组
seq s;
s.top=0;//初始化栈
seqq ss;
ss.topp=0;
biandao.first=NULL;//初始化链队 首尾置空
biandao.rear =NULL;
int num = 0;
printf("输入start进入停车厂,take取车,quit退出:");
while (cin>>a)//给A数组赋值
{
if(strcmp(a,"start")==0){
//用比较字符串比较A数组中记录的关键字是否与start相等
printf("输入车牌号信息:");
cin>>b;//输入车牌号
printf("输入停车位置(1-%d):",n);
cin>>x;//输入位置
printf("原定停车时间:");
cin>>t;//输入预约时间
if ( s.top >= n )//如果停车场已满
{
printf("主道已满,只能停在辅道了!!!\n");
Biandao *p;//一个新结点P
p=(Biandao *)malloc(sizeof(Biandao));
p->data=x;//把位置存放在p结点的data域中
p->time=t;//把时间信息存放在p结点time域中
strcpy(p->we,b);//用字符串复制函数把b存放的牌号信息复制到p结点的we域
num++;
p->next=NULL;//将P结点的next域置空
if (biandao.rear != NULL){
//队尾不为空
biandao.rear->next=p;//将p结点的信息赋值队尾
biandao.rear=p;
}
if (biandao.first==NULL){
//队头为空
biandao.first=p;//将p结点的信息赋值到队头
}
printf("车牌为:");
puts(biandao.first->we);//输出队头指针指向的we的信息
printf("\n在便道的第%d位置,时间为%d\n",num,t);
}
else//停车场未满
{
s.top=0;//将top置为0
for(int i=0;i<x;i++){
//找到要存入栈的位置
s.top++;
}
bus[s.top].num=x;//将位置信息存放在num
bus[s.top].intime=t;//将时间信息存放在intime
strcpy(bus[s.top].l,b);//将b存放的车牌号信息存放l
}
printf("车牌为:");
puts(bus[s.top].l);//输出top位置上的l
printf("停车场的第%d位置,停车时间为%d\n",s.top,bus[s.top].intime);
printf("start继续停车,take取车,quit退出:");
}
else if (strcmp(a,"take")==0)//如果a记录的关键字等于take
{
memset(b,0,sizeof b);//将b数组置空
printf("输入车牌号(1-%d):",n);
cin>>b;//记录车牌信息
printf("输入停留时间:");
cin>>t; //记录时间
if (s.top == 0)//栈空
{
printf("输入错误 重新输入\n");//输出错误
printf("start继续停车,take取车,quit退出:");
continue;//返回whlie 循环重新开始
}
else
{
int nu=0;//记录位置变量
for (int i=0;i<=n;i++)//看车辆是否在主车道
{
if (strcmp(bus[i].l, b)==0)//如果车辆信息与主车道的车辆信息有匹配的
{
nu=i;
if(t>bus[nu].intime){
//停留时间大于预约时间
printf("你以超时,超过时间按每小时6块收费,原价5块");
printf("\n停留时间%d, 费用 %d \n", t ,bus[nu].intime*5+bus[nu].intime*6 );
}else{
//停留时间小于预约时间
printf("你以超时,超过时间按每小时6块收费,原价5块");
printf("\n停留时间%d, 费用 %d \n", t ,bus[nu].intime*5);
}
for (int i=nu ;i<=s.top;i++)//出停车站
{
bus[i]=bus[i+1];
}
s.top--;
}
}
if(nu==0){
//如果主车道没有该车辆
printf("车量不在主车道! 等待主车道的主车把车开走你才可以进入停车场!\n");
printf("start继续停车,take取车,quit退出:");
continue;//返回上层
}
if (biandao.first!=NULL)//如果便道上有车
{
s.top++;//top加一
bus[s.top].num = biandao.first->data;
bus[s.top].intime = biandao.first->time;
strcpy(bus[s.top].l,biandao.first->we);
num--;
Biandao *q;
q=biandao.first;
biandao.first=biandao.first->next;
free(q);
printf("车牌为:");
puts(bus[s.top].l);
printf("已经进入停车主车道!");
printf("在停车场的第%d位置,停车时间为%d\n",s.top,bus[s.top].intime);
}
}
printf("start继续停车,take取车,quit退出:");
}
else if(strcmp(a,"quit")==0){
printf("感谢使用本停车场系统!!");
exit(1);
}
}
}