1、停车场模拟管理系统实验报告班级:数学一班 姓名:杨宁 学号:2007429010 日期:2008-11-8一、需求分析:1. 程序功能:用顺序栈模拟停车位和辅助栈,用顺序队模拟便道。来车显示停车位置,离车显示车辆调度情况及应交的停车费,还能查询特定车牌号的汽车所在的位置。2. 输入输出要求:C,L,F,Q 分别表示来车,离车,查询车,退出;来车时输入车牌号,走时输入所在停车位的位置,查询输入车牌号;3. 测试数据:(1) 来车:JE001 到 JE010(2) 查询:JE003,JE008(3) 离车:JE001,JE007(4) 退出二、概要设计:1. 本程序所用的抽象数据类型定义:顺序栈,
2、顺序队;2. 主模块的流程及个子模块的主要功能:(1) STOPPING *init_stopping() 初始化停位(2) BUFFER *init_buff() 初始化辅助栈 (3) PAVEMENT *init_pavement() 初始化便道(4) void car_come(char *plate,char *in_time) 来车函数(5) void car_leave(int pos,char *out_time) 离车函数(6) void stop_to_buff(int pos) 从停车位进入辅助栈函数(7) void buff_to_stop(int pos) 从辅助栈进入
3、停车位函数(8) void pave_to_stop() 从便道进入停车位函数(9) float checkout(char *in_time,char *out_time) 计算停车费函数(10) void welcome() 欢迎函数(11) void display() 显示停车场情况的函数(12) void show_car(char *plate) 查询并显示汽车信息的函数(13) void main() 主函数三、详细设计:1. 采用 C 语言定义停车位、辅助栈、便道:(1)STOPPING *init_stopping() /*初始化停车位*/STOPPING *s;s=(STO
4、PPING *)malloc(sizeof(STOPPING);if(!s)printf(“STOPPING 空间不足!“);return NULL;elses-top=-1;return s; (2)BUFFER *init_buff() /*初始化辅助栈*/BUFFER *b;b=(BUFFER *)malloc(sizeof(BUFFER);if(!b)printf(“BUFFER 空间不足!“);return NULL;elseb-top=-1;return b;(3)PAVEMENT *init_pavement() /*初始化便道 */PAVEMENT *p;p=(PAVEMENT
5、 *)malloc(sizeof(PAVEMENT);p-front=p-rear=MAX_PAVE-1;return p;2. 主要功能模块的伪码算法:(1) void car_come(char *plate,char *in_time)If(停车为未满)来车进入停车位;Else来车进入便道等候;(2) void car_leave(int pos,char *out_time)输入汽车所在位置;If(汽车不在最后一个车位)stop_to_buff(int pos);所选汽车离去;显示应缴费用;If(辅助栈不空)buff_to_stop(int pos);if(便道不空)pave_to_s
6、top();(3) void show_car(char *plate)遍历停车位,如找到所查汽车则停止;If(停车位无此车)遍历便道,如找到停止;if(便道无此车)显示信息无此车;3. 函数调用关系:四、调试分析:1. 调试中的问题及解决方法:(1) 各函数无法都作用于顺序队和顺序栈,解决方法:将顺序队和顺序栈定义成全局变量;(2) 无法将输入的字符指针 char *plate 接收的车牌号字符串传递给各函数,解决方法:在给 plate 输入前给 plate 开辟空间plate=(char *)malloc(sizeof(char);(3) 无法将字符串型的时间逐个转换成整型,解决方法:定义
7、字符型指针,逐一指向字符串中的每个字符;五、使用说明及测试结果:1. 使用说明:输入 C(L、F、Q)表示来车(离车、查询、退出) ,接下来按照提示输入;2. 测试结果:(1) 来车:请选择您要的操作:c请输入您的车牌号:JE001请输入您的入场时间:10:10Main()Car_come()Car_leave()Show_car()Stop_to_buff()Buff_to_stop()Pave_to_stop()Welcome()Display ()Checkout()请您停放在 1 号车位!您的入场时间为:10:10停车位的情况:1 车位JE001(2 ) 离车:请选择您要的操作:请输入
8、您的汽车所在停车位的车位数:请输入您的离场时间:10:40牌照为 JE003 的汽车暂时退出停车位!牌照为 JE002 的汽车暂时退出停车位!拍照为 JE001 的汽车从停车场开走!请交费 3.0 元!牌照为 JE002 的汽车停回停车位的 1 车位!牌照为 JE003 的汽车停回停车位的 2 车位!停车位的情况:1 车位JE0022 车位JE003(3 ) 请选择您要的操作:F请输入您要查找的车牌号:JE002您的汽车 JE002 位于停车位的 1 车位!六、源程序:#include“stdio.h“#include“stdlib.h“#include“string.h“#define MA
9、X_STOP 5 /*停车位*/#define MAX_PAVE 100 /*便道位*/typedef structchar *license_plate; /*车牌号*/char *in_time; /*进入停车场的时间*/char *out_time; /*离开停车场的时间*/char state; /*状态,S 表示停车位,P 表示便道,L 表示离开*/ CAR;typedef struct /*定义停车为类型 */CAR STOPMAX_STOP;int top;STOPPING;typedef struct /*定义便道类型 */CAR PAVEMAX_PAVE;int front,
10、rear;PAVEMENT;typedef struct /*定义辅助栈类型 */CAR BUFFMAX_STOP;int top;BUFFER;STOPPING *init_stopping() /*初始化停车位*/STOPPING *s;s=(STOPPING *)malloc(sizeof(STOPPING);if(!s)printf(“STOPPING 空间不足!“);return NULL;elses-top=-1;return s; BUFFER *init_buff() /*初始化辅助栈*/BUFFER *b;b=(BUFFER *)malloc(sizeof(BUFFER);i
11、f(!b)printf(“BUFFER 空间不足!“);return NULL;elseb-top=-1;return b;PAVEMENT *init_pavement() /*初始化便道*/PAVEMENT *p;p=(PAVEMENT *)malloc(sizeof(PAVEMENT);p-front=p-rear=MAX_PAVE-1;return p;static STOPPING *stopping=init_stopping(); /*定义停车位 */static BUFFER *buff=init_buff(); /*定义辅助栈 */static PAVEMENT *pavem
12、ent=init_pavement(); /*定义便道*/void car_come(char *plate,char *in_time) /*来车函数*/if(stopping-top!=MAX_STOP-1)stopping-top+;stopping-STOPstopping-top.license_plate=plate;stopping-STOPstopping-top.in_time=in_time;stopping-STOPstopping-top.state=S;printf(“请您停放在%d 号车位!您的入场时间为:%sn“,stopping-top+1,stopping-S
13、TOPstopping-top.in_time);elsepavement-rear=(pavement-rear+1)%MAX_PAVE;pavement-PAVEpavement-rear.license_plate=plate;pavement-PAVEpavement-rear.in_time=in_time;pavement-PAVEpavement-rear.state=P;printf(“停车位已满!请在便道等待!您的入场时间为:%sn“,pavement-PAVEpavement-rear.in_time);void stop_to_buff(int pos) /*暂入辅助栈函
14、数*/buff-top+;buff-BUFFbuff-top.license_plate=stopping-STOPpos.license_plate;buff-BUFFbuff-top.in_time=stopping-STOPpos.in_time;stopping-top-;printf(“牌照为%s 的汽车暂时退出停车位!n“,stopping-STOPpos.license_plate);void buff_to_stop(int pos) /*由辅助栈返回停车位函数*/stopping-top+;stopping-STOPpos.license_plate=buff-BUFFbuf
15、f-top.license_plate;stopping-STOPpos.in_time=buff-BUFFbuff-top.in_time;stopping-STOPpos.state=S;buff-top-;printf(“牌照为%s 的汽车停回停车位的%d 车位!n“,stopping-STOPpos.license_plate,pos+1);void pave_to_stop() /*由便道进入停车位函数*/ stopping-top+;pavement-front=(pavement-front+1)%MAX_PAVE;stopping-STOPstopping-top.licens
16、e_plate=pavement-PAVEpavement-front.license_plate;stopping-STOPstopping-top.in_time=pavement-PAVEpavement-front.in_time;stopping-STOPstopping-top.state=S;printf(“牌照为%s 的汽车从便道上进入停车位的%d 车位!n“,pavement-PAVEpavement-front.license_plate,MAX_STOP);float checkout(char *in_time,char *out_time) /*记时收费函数 */in
17、t sum1=0,sum2=0;char *a,*b;a=in_time;b=out_time;sum1+=(*(a+4)-0)+(*(a+3)-0)*10;sum1+=(*(a+1)-0)+(*a-0)*10)*60;sum2+=(*(b+4)-0)+(*(b+3)-0)*10;sum2+=(*(b+1)-0)+(*b-0)*10)*60;return(sum2-sum1)*0.1);void car_leave(int pos,char *out_time) /*离车函数*/int a=pos;int b=a-1;int c,d;float money;money=checkout(sto
18、pping-STOPb.in_time,out_time); if(aMAX_STOP|atop)for(c=stopping-top;cb;c-)stop_to_buff(c);d=buff-top;stopping-top-;printf(“牌照为%s 的汽车从停车场开走!请交费%f 元!n“,stopping-STOPb.license_plate,money);if(buff-top!=-1)for(c=b;cfront!=pavement-rear)pave_to_stop();void welcome() /*欢迎界面*/printf(“n 欢迎使用本程序nn“);printf(“
19、本程序为停车场的模拟管理程序,有车到来时请按 C(或 c)键。n“);printf(“然后根据屏幕提示进行相关操作,有车要走时请按 L(或 l)键。n“);printf(“然后根据屏幕提示进行相关操作,查找汽车时请按 F(或 f)键。n“);printf(“然后根据屏幕提示进行相关操作,要退出程序请按 Q(或 q)键。nnn“);void display() /*显示停车场情况函数 */int i=0,j;int k=1; /*表示便道位置*/if(stopping-top=-1)printf(“停车位上暂无车辆!nn“);elseprintf(“停车位的情况:n“);while(itop)p
20、rintf(“%d 车位%sn“,i+1,stopping-STOPi.license_plate);i+;if(pavement-front!=pavement-rear)j=(pavement-front+1)%MAX_PAVE;printf(“便道上的情况:n“);while(jrear)printf(“%d 位置%sn“,k,pavement-PAVEj.license_plate);j+;k+;printf(“n“);void show_car(char *plate) /*查找并显示信息函数*/int i,j;for(i=0;itop;i+)if(!strcmp(stopping-
21、STOPi.license_plate,plate) break;if(i=stopping-top+1)for(j=(pavement-front+1)%MAX_PAVE;jrear;j+)if(!strcmp(pavement-PAVEj.license_plate,plate) break;if(itop+1)printf(“您的汽车%s 位于停车位的%d 车位!nn“,plate,i+1);elseif(jrear+1)printf(“您的汽车位于便道的%d 位置!nn“,j-(pavement-front+1)%MAX_PAVE+1);elseprintf(“对不起,停车场中无此车!
22、nn“);void main() char key;char *plate,*in_time,*out_time;int a;welcome();display();printf(“请选择您要的操作:“);do scanf(“%c“,if(key=c|key=C)printf(“请输入您的车牌号:“);plate=(char *)malloc(sizeof(char);scanf(“%s“,plate);printf(“请输入您的入场时间:“);in_time=(char *)malloc(sizeof(char);scanf(“%s“,in_time);car_come(plate,in_t
23、ime);display();printf(“请选择您要的操作:“);if(key=l|key=L)printf(“请输入您的汽车所在停车位的车位数:“);scanf(“%d“,printf(“请输入您的离场时间:“);out_time=(char *)malloc(sizeof(char);scanf(“%s“,out_time);car_leave(a,out_time);display();printf(“请选择您要的操作:“);if(key=f|key=F) printf(“请输入您要查找的车牌号:“);plate=(char *)malloc(sizeof(char);scanf(“%s“,plate);show_car(plate);printf(“请选择您要的操作:“);while(key!=qprintf(“谢谢使用本程序,再见!n“);