C语言停车场管理实验报告
- 格式:doc
- 大小:133.50 KB
- 文档页数:12
课程设计任务书学生姓名:专业班级:软件2101(计算2101)指导教师:黄启荃钱小红工作单位:华夏学院计算机教研室设计题目:用C语言实现停车场管理程序的设计初始条件:1、栈与队列的建立和操作.2、带T C或V C的计算机系统。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)主要任务:(在规定的时间内完成下列任务)设有一个停放n辆车的狭长停车场,它只有一个大门供车辆出入。
车辆按到达停车场时间的早晚依次从停车场最里面向大门处停放。
若已放满n辆车,则后来的车只能停在外面等待,当有车开走后方依次进入,停在场内的车按时计费。
编制一个程序模拟该停车场管理。
1.汽车的模拟输入信息格式可设为:汽车牌照号码,到达/离去时刻如(‘a’,1,5)为1号车在5时刻到达,(‘b’,5,20)为5号车在20这个时刻离去2. 要求程序输出每辆车到达后的停车位置,以及离开停车场时应缴纳的费用及停留时间。
3.编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果,并对采用的算法进行分析。
设计报告撰写格式要求:(课程设计报告按统一通用格式书写)具体内容如下:①设计任务与要求②总体方案与说明③程序主要模块的流程图④源程序清单与注释⑤问题分析与解决方案(包括调试记录、调试报告,即在调试过程中遇到的主要问题、解决方法及改进设想);⑥小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料时间安排:6月20日---24日第一天布置题目,确定任务、查找相关资料第二天~第四天功能分析,编写程序,调试程序、运行系统;第五天程序验收、答辩;撰写设计报告。
指导教师签字:2011年6月20日系主任签字:年月日设计题目:用C语言实现停车场管理程序的设计1、问题描述即要求停车场是一个可停放n辆汽车的狭长通道,并只有一个大门可供汽车进出,汽车在停车场内按车辆到达的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),如车长内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理.每一组输入数据包括三个数据项:汽车”到达”或”离去”信息,汽车牌照号码以及到达或离去的时刻(到达或离去的时刻也可用计算机控制).对每一组输入数据进行操作后的输入信息为:如是车辆到达,则输入汽车在停车场内或便道上的停留位置;如是车辆离去,则输入汽车在停车场内停留的时间和应交的费用。
数据结构课程设计题目停车场管理器设计专业:计算机科学与技术班级:1401姓名:彭旭学号:143230135实验主要内容以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。
对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
环境Windows 10 Visual c++ c语言实验原理1.概要设计(1)抽象数据类型定义ADT Stack{数据对象:D={ai|ai ∈ElemSet, i=1,2,…n;n>0}数据关系:R1={<ai-1,ai>|ai-1,ai ∈D,i=2,…n}基本操作:InitStack(&S)操作结果:构造一个空栈S。
Push(&S,e)初始条件:栈S已存在。
操作结果:插入e为新的栈顶元素Pop(&S,&e)初始条件:栈S已存在。
操作结果:删除S的栈顶元素,并且用e返回。
}ADT StackADT Queue {数据对象:D={ai|ai ∈ElemSet, i=1,2,…n; n>0}数据关系:R1={<ai-1,ai>|ai-1,ai ∈D, i=2,…n}其中:a1为队头, an为队尾基本操作:InitQueue(&Q);操作结果:构造一个空队列QEnQueue(&Q,&e);初始条件:对列Q已存在。
操作结果:插入元素e为Q的新队尾元素。
DeQueue(&Q,&e);初始条件:对列Q已存在。
操作结果:删除Q的队头元素, 并用e返回。
}ADT Queue(2)本程序包含七个模块:<1>主程序模块,其中主函数为Void main(){初始化;构造空栈;输入已知数据;插入数据入栈;分析{入栈;出栈;入队;出队;}输出数据;}<2>构造栈模块-----构造一个空栈;栈插入模块-----插入新的数据元素;栈删除模块-----删除指定的数据元素;构造队列模块-----构造一个空队列;队列插入模块-----插入新的数据元素;队列删除模块-----删除指定的数据元素;(3)各模块之间的调用关系图解:2.详细设计<1>类型定义#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define MONEY 3typedef int Status;typedef struct ElemType{c har a[3];i nt num;i nt time;}ElemType;typedef struct SqStack {ElemType *base;//在栈构造之前和销毁之后,base的值为NULLElemType *top;//栈顶指针int stacksize;//当前已经分配的存储空间,以元素为单位}SqStack;//栈的表示typedef struct QNode{E lemType data;struct QNode *next;}QNode,*QueuePtr;//队列的表示typedef struct LinkQueue{QueuePtr front;//队头指针QueuePtr rear;//队尾指针}LinkQueue;<2>栈和队列的基本操作Status InitStack(SqStack &S)//构造一个空栈Status Push(SqStack &S,ElemType e)//插入元素e为新的栈顶元素Status Pop(SqStack &S,ElemType &e)//若栈不空,则删除S的栈顶元素,用e 返回其值,并返回OK;否则返回ERRORStatus InitQueue(LinkQueue &Q)//构造一个空队列QStatus EnQueue(LinkQueue &Q,ElemType e)//插入元素e为Q的新队列Status DeQueue(LinkQueue &Q,ElemType &e)//若队列不空,则删除Q的对头元素,用e返回其值,并返回Ok;否则返回ERROR;<3>部分操作的算法Status InitStack(SqStack &S){//构造一个空栈S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!S.base) exit (OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){//栈满,追加存储空间S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(El emType));if(!S.base) exit(OVERFLOW);//存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACK_INIT_SIZE;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){//若栈不空,则删除S的栈顶元素,用e 返回其值,并返回OK;否则返回ERRORif(S.top==S.base) return OK;e=*--S.top;return OK;}//----------------队列Status InitQueue(LinkQueue &Q){//构造一个空队列Q Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front) exit (OVERFLOW);//存储分配失败Q.front->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e){//插入元素e为Q 的新队列p=(QueuePtr)malloc(sizeof(QNode));//存储分配失败if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}Status DeQueue(LinkQueue &Q,ElemType &e){//若队列不空,则删除Q的对头元素,用e返回其值,并返回Ok;否则返回ERROR;if(Q.front==Q.rear) return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;free(p);return OK;}源程序Stop1.h:#include <stdio.h>#include <process.h>#include <malloc.h>#include <string.h>//------------------------函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define TNFEASIBLE -1#define OVERFLOW -2//Status 是函数的类型,其值是函数结果状态代码typedef int Status;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define MONEY 3Stop2.h:#include"stop1.h"typedef struct ElemType{char a[3];int num;int time;}ElemType;typedef struct SqStack{ElemType *base;ElemType *top;int stacksize;}SqStack;//栈的表示typedef struct QNode{ElemType data;struct QNode *next;}QNode,*QueuePtr;//队列的表示typedef struct LinkQueue{QueuePtr front;//队头指针QueuePtr rear;//队尾指针}LinkQueue;Status InitStack(SqStack &S);//构造空栈Status Push(SqStack &S,ElemType e);//进栈Status Pop(SqStack &S,ElemType &e);//出栈Status InitQueue(LinkQueue &Q);//构造一个空队列Status EnQueue(LinkQueue &Q,ElemType e);//入队Status DeQueue(LinkQueue &Q,ElemType &e);//出队Stop.cpp:#include"stop2.h"Status InitStack(SqStack &S){//构造空栈S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){//栈满,追加存储空间S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));if(!S.base) exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACK_INIT_SIZE;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){//出栈if (S.top==S.base) return OK;e=*--S.top;return OK;}/***********************************************************************队列*/ Status InitQueue(LinkQueue &Q){//构造一个空队列Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front) exit(OVERFLOW);Q.front->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e){//插入元素e为Q的新队列struct QNode *p;p=(QueuePtr)malloc(sizeof(QNode));if(!p) exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}Status DeQueue(LinkQueue &Q,ElemType &e){struct QNode *p;if(Q.front=Q.rear) return ERROR;p=Q.front->next=p->next;if(Q.rear==p) Q.rear=Q.front;free(p);return OK;}Stop_main.cpp:#include"stop2.h"main(){int i,t,f,m,n,s1_num,Q_num;struct SqStack s1,s2;struct LinkQueue Q;struct ElemType e,e1;s1_num=0;Q_num=0;t=0;m=0;InitStack(s1);InitStack(s2);InitQueue(Q);printf("停车场的容量是:");scanf("%d",&n);printf("输入车辆信息(E为退出,A为进入标志,D为离开标志,车牌号时间空格隔开):\n");scanf("%s",e1.a);scanf("%d%d",&e1.num,&e1.time);while(strcmp(e1.a,"E")!=0){if(strcmp(e1.a,"A")==0) {//当有车辆进来的时候if(s1_num<n) {Push(s1,e1);s1_num++;printf("此车停在停车场第%d辆\n",s1_num);}else {EnQueue(Q,e1);Q_num++;printf("此车停在便道距离门口第%d辆\n",Q_num);}}else if(strcmp(e1.a,"D")==0) {//当有车辆离开的时候f=s1_num;for(i=0;i<f;i++){Pop(s1,e);s1_num--;if(e1.num==e.num){t=e1.time-e.time;m=MONEY*t;printf("此车停车时间%d,所需费用%d元\n",t,m);break;} else Push(s2,e);}if(t==0&&m==0){printf("此车为便道内车,故无需收费\n");Q_num--;}while(s2.top!=s2.base){Pop(s2,e);Push(s1,e);s1_num++;}if(Q.front!=Q.rear){DeQueue(Q,e);Push(s1,e);s1_num++;}}else printf("错误\n");printf("输入数据\n");scanf("%s",e1.a);scanf("%d%d",&e1.num,&e1.time);}运行结果。
2008.12.25班级:55071——28学号:20071003753指导教师:刘文中姓名:谢永诚停车场管理一一.要求:1.设计一个停车场用长度为N的堆栈来模拟。
由于停车场内如有某辆车要开走,在它之后进来的车都必须先退出为它让道,待其开出停车场后,这些车再依原来的顺序进入。
2.程序输出每辆车到达后的停车位置,以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
二、程序中所采用的数据结构及存储结构的说明以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
栈以顺序结构实现,队列以链表实现。
程序中分别采用了“栈”和“队列”作为其存储结构。
“栈”的定义可知,每一次入栈的元素都在原栈顶元素之上成为新的元素,每一次出栈的元素总是当前栈顶元素使次栈元素成为新的栈顶元素,即最后进栈者先出栈。
程序中采用的结构是:typedef struct NODE{CarNode *stack[MAX+1]。
int top。
}SeqStackCar。
/*模拟车库*/“队列”是限定所有插入操作只能在表的一端进行,而所有的删除操作都只能在表的另一端进行。
插入端叫队尾,梦芭莎优惠券删除端叫对头。
按先进先出规则进行。
程序中采用的结构是:typedef struct Node{QueueNode *head。
QueueNode *rear。
}LinkQueueCar。
/*模拟通道*/三、算法的设计思想由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。
由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。
当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。
C语言课程设计实习报告姓名:成帅安学号:20141002605院(系):工程学院专业:土木工程2016年6 月2016.6 中国地质大学C语言课程设计 1 第一章停车场管理系统§1.1题目描述1、有一个两层的停车场,每层有6个车位,当第一层车停满后才允许使用第二层,(停车场可用一个二维数组实现,每个数组元素存放一个车牌号)每辆车的信息包括车牌号,层号,车位号,停车时间共4项,其中停车时间按分钟计算。
2、假设停车场初始状态为第一层已经停有4辆车,其车位号依次为1-4,停车时间依次为20,15,10,5。
即先将这四辆车的信息存入文件“car.dat"中(数组的对应元素也要进行赋值)。
3、停车操作:当一辆车进入停车场时,先输入其车牌号,再为它分配一个层号和一个车位号(分配前先查询车位的使用情况,如果第一层有空则必须停在第一层),停车时间设为5,最后将新停入的汽车的信息添加文件"car.dat"中,并将在此之前的所有车的停车时间加5。
4、收费管理(取车):当有车离开时,输入其车牌号,先按其停车时间计算费用,每5分钟0.2元。
(停车费用可设置一个变量进行保存),同时从文件"car.dat"中删除该车的信息,并将该车对应的车位设置为可使用状态(即二维数组对应元素清零)。
按用户的选择来判断是否要输出停车收费的总计。
5、输出停车场中全部车辆的信息。
6、退出系统。
§1.2算法设计1、需求分析:车辆信息用文件储存,提供文件的输入输出操作;当车离开时要删除文件中该车的信息,因而要提供文件的删除操作;用键盘式菜单实现功能选择。
2、总体设计思路:整个管理系统设计可设计为停车模块、取车模块、车辆浏览信息模块。
另外车辆停放信息涉及到从car.dat中读取,保存和修改,为了方便起见和程序的模块化,我将文件的读入和保存单独设计为两个子程序。
整体模块图如下:23、各子程序设计如下:(1)使用全局变量数组,用一个二维数组实现停车场车位的信息,int cars[12][4];2016.6 中国地质大学C语言课程设计 3 (2)通过读取car.dat的数据,对程序初始化。
数据结构停车场管理实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构中的栈和队列等知识,提高解决实际问题的能力。
二、实验环境编程语言:C++开发工具:Visual Studio三、实验原理1、停车场采用栈结构来存储停放的车辆信息。
栈具有先进后出的特点,符合车辆先进入停车场后离开的逻辑。
2、停车场外的便道采用队列结构来存储等待进入停车场的车辆。
队列具有先进先出的特点,符合车辆按到达顺序进入停车场的需求。
四、实验内容1、设计数据结构定义栈和队列的数据结构,包括存储车辆信息的结构体。
实现栈和队列的基本操作,如入栈、出栈、入队、出队等。
2、功能实现车辆进入停车场:当有车辆进入停车场时,将车辆信息压入栈中。
车辆离开停车场:当有车辆离开停车场时,从栈中弹出相应车辆,并计算停车费用。
显示停车场状态:实时显示停车场内车辆的信息。
处理便道上的车辆:当停车场有空位时,将便道上的车辆依次入停车场。
3、界面设计设计简单的命令行交互界面,方便用户输入操作指令。
五、实验步骤1、定义数据结构```cppstruct Car {int carNumber;int arrivalTime;int departureTime;};class Stack {private:Car stackArray;int top;int capacity;public:Stack(int size) {capacity = size;stackArray = new Carcapacity; top =-1;}~Stack(){delete stackArray;}bool isFull(){return top == capacity 1;}bool isEmpty(){return top ==-1;}void push(Car car) {if (!isFull()){stackArray++top = car;} else {std::cout <<"停车场已满,无法进入!"<< std::endl;}}Car pop(){if (!isEmpty()){return stackArraytop;} else {std::cout <<"停车场为空,无法离开!"<< std::endl; return {-1, -1, -1};}}Car peek(){if (!isEmpty()){return stackArraytop;} else {std::cout <<"停车场为空!"<< std::endl; return {-1, -1, -1};}}};class Queue {private:Car queueArray;int front;int rear;int capacity;public:Queue(int size) {capacity = size;queueArray = new Carcapacity;front = rear =-1;}~Queue(){delete queueArray;}bool isFull(){return (rear + 1) % capacity == front;}bool isEmpty(){return front ==-1;}void enqueue(Car car) {if (!isFull()){if (isEmpty()){front = 0;}rear =(rear + 1) % capacity; queueArrayrear = car;} else {std::cout <<"便道已满,无法等待!"<< std::endl;}}Car dequeue(){if (!isEmpty()){Car car = queueArrayfront;if (front == rear) {front = rear =-1;} else {front =(front + 1) % capacity;}return car;} else {std::cout <<"便道为空!"<< std::endl;return {-1, -1, -1};}}Car frontElement(){if (!isEmpty()){return queueArrayfront;} else {std::cout <<"便道为空!"<< std::endl;return {-1, -1, -1};}}};```2、主函数实现```cppint main(){int parkingLotCapacity = 10; //假设停车场容量为 10 Stack parkingLot(parkingLotCapacity);Queue waitingQueue(parkingLotCapacity);int choice;while (true) {std::cout <<"1、车辆进入停车场" << std::endl;std::cout <<"2、车辆离开停车场" << std::endl;std::cout <<"3、显示停车场状态" << std::endl;std::cout <<"4、退出" << std::endl;std::cout <<"请选择操作:";std::cin >> choice;switch (choice) {case 1: {int carNumber;std::cout <<"请输入车辆号码:";std::cin >> carNumber;Car car ={carNumber, time(NULL),-1};if (!parkingLotisFull()){parkingLotpush(car);std::cout <<"车辆"<< carNumber <<"进入停车场" <<std::endl;} else {waitingQueueenqueue(car);std::cout <<"停车场已满,车辆"<< carNumber <<"在便道等待" << std::endl;}break;}case 2: {int carNumber;std::cout <<"请输入要离开的车辆号码:";std::cin >> carNumber;Car car;bool found = false;for (int i = parkingLottop; i >= 0; i) {if (parkingLotstackArrayicarNumber == carNumber) {car = parkingLotpop();cardepartureTime = time(NULL);found = true;break;}}if (found) {int parkingTime = difftime(cardepartureTime, cararrivalTime);double parkingFee = parkingTime 2; //假设每单位时间停车费为2 元std::cout <<"车辆"<< carNumber <<"离开停车场,停车时间:"<< parkingTime <<"秒,停车费用:"<<parkingFee <<"元" << std::endl;if (!waitingQueueisEmpty()){Car waitingCar = waitingQueuedequeue();parkingLotpush(waitingCar);std::cout <<"便道上的车辆"<< waitingCarcarNumber <<"进入停车场" << std::endl;}} else {std::cout <<"未找到要离开的车辆" << std::endl;}break;}case 3: {std::cout <<"停车场内车辆:"<< std::endl;for (int i = parkingLottop; i >= 0; i) {std::cout << parkingLotstackArrayicarNumber <<"";}std::cout << std::endl;std::cout <<"便道上等待的车辆:"<< std::endl;if (!waitingQueueisEmpty()){for (int i = waitingQueuefront; i!= waitingQueuerear; i =(i + 1) %waitingQueuecapacity) {std::cout << waitingQueuequeueArrayicarNumber <<"";}std::cout << waitingQueuequeueArraywaitingQueuerearcarNumber<< std::endl;} else {std::cout <<"无" << std::endl;}break;}case 4:return 0;default:std::cout <<"无效的选择,请重新输入" << std::endl;}}return 0;}```六、实验结果1、车辆正常进入停车场,并在停车场已满时在便道等待。
数据结构-停车场管理系统实验报告数据结构停车场管理系统实验报告一、实验目的本次实验旨在通过设计和实现一个停车场管理系统,深入理解和应用数据结构的知识,包括栈、队列、链表等,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、需求分析1、停车场内有固定数量的停车位。
2、车辆进入停车场时,记录车辆信息(车牌号、进入时间)。
3、车辆离开停车场时,计算停车费用并输出相关信息。
4、能够显示停车场内车辆的停放情况。
四、数据结构设计1、为了实现车辆的先进先出,选择队列来存储停车场内的车辆信息。
2、用栈来存储临时停放的车辆信息,以便在停车场已满时进行处理。
五、算法设计1、车辆进入停车场检查停车场是否已满。
如果未满,将车辆信息加入队列,并记录进入时间。
2、车辆离开停车场在队列中查找要离开的车辆。
计算停车时间和费用。
将车辆从队列中删除。
3、显示停车场内车辆停放情况遍历队列,输出车辆信息。
六、主要代码实现```cppinclude <iostream>include <string>include <ctime>using namespace std;//车辆结构体struct Car {string licensePlate; //车牌号time_t entryTime; //进入时间};//队列类class Queue {private:Car data;int front, rear, capacity;public:Queue(int size) {capacity = size;data = new Carcapacity;front = rear = 0;}~Queue(){delete data;}bool isFull(){return (rear + 1) % capacity == front;}bool isEmpty(){return front == rear;}void enqueue(Car car) {if (isFull()){cout <<"停车场已满!"<< endl; return;}datarear = car;rear =(rear + 1) % capacity;}Car dequeue(){if (isEmpty()){cout <<"停车场为空!"<< endl;return Car();}Car car = datafront;front =(front + 1) % capacity;return car;}void display(){if (isEmpty()){cout <<"停车场内没有车辆。
停车场管理系统1题目要求设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车站。
停车站内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车站为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
【基本要求】要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场是的停车时间及它应该交的费用。
2需求分析根据题目要求,因为停车场是一个单条的序列,可以用结构体实现;在程序中,需要知道每辆来车的具体停放位置,应提供提示、查找、标记工作。
车辆离开要计时计费。
另外,每天开始时,停车场要初始化。
3总体设计这个系统可以分为:初始化、有车进入、有车离开、退出四个模块。
4详细设计main()函数体内包含了界面选则部分menu(),并单独Array抽出来作为一个独立函数,目的在于系统执行每部分模块后能够方便返回到系统界面。
即main()函数写为如下:void main()/*主函数*/{menu();/*菜单函数*/}菜单函数:void menu(){int n,w;do{puts("\t\t**************MENU**************\n\n");puts("\t\t\t 1.初始化");puts("\t\t\t 2.有车进入");puts("\t\t\t 3.有车离开");puts("\t\t\t 4.退出");puts("\n\n\t\t*********************************\n");printf("Please choice your number(1-4): [ ]\b\b");scanf("%d",&n);if(n<1||n>4)/*对选择的数字作判断*/{w=1;getchar();}else w=0;}while(w==1);switch(n){case 1:chushi();break;/*初始化函数*/case 2:jinru();break;/*车辆进入函数*/case 3:likai();break;/*车辆离开函数*/case 4:exit(0);/*退出*/}}初始化模块设计:【需求分析】该模块是将每一天开始的停车场内和便道车位清零。
停车场管理系统C语言实习报告一、实习背景在城市化进程不断加速的背景下,汽车数量急剧增长,停车难的问题日益突出,停车场管理系统成为解决这一问题的重要途径。
为了更好地了解和掌握停车场管理系统的开发过程和实现方法,我选择了该方向作为我的实习内容。
二、实习过程在实习过程中,我主要参与了停车场管理系统的需求分析、模块设计和编码实现等工作。
1.需求分析首先,我对停车场管理系统的需求进行了详细地分析和理解。
通过与公司内部相关人员的交流和讨论,我了解到停车场管理系统主要包括车辆信息管理、停车记录管理和收费管理等功能。
2.模块设计在需求分析的基础上,我开始进行停车场管理系统的模块设计工作。
根据需求,我划分出了车辆信息管理模块、停车记录管理模块和收费管理模块等多个模块。
然后,我详细地设计了这些模块的功能和数据流程,并与其他开发人员进行了交流和讨论。
3.编码实现在模块设计完成后,我开始进行停车场管理系统的编码实现工作。
首先,我选择了C语言作为开发语言,并使用了相关的开发工具。
然后,我按照设计的流程和规范进行了编码工作,并通过反复调试和测试,最终实现了一个具有基本功能的停车场管理系统。
三、实习收获通过这次实习,我对停车场管理系统的开发和实现过程有了更深入的了解和掌握。
首先,我学会了如何进行需求分析和模块设计,并将其应用于实际开发中。
其次,我通过实际编码实现了停车场管理系统,并通过调试和测试不断完善和优化。
最后,我还与其他开发人员进行了紧密的合作和协调,提高了我与他人沟通和协作的能力。
四、总结与展望通过这次实习,我对停车场管理系统有了全面的认识和了解,并学会了如何进行开发和实现。
但是,在实际工作中还存在一些不足之处,比如对一些技术的了解不够深入和对一些问题的解决不够完善。
因此,我希望今后能够进一步加强相关技术的学习和研究,提高自己的综合能力和解决问题的能力。
在未来的工作中,我将继续深入研究和学习停车场管理系统的相关技术,并通过不断地实践和探索,提高自己的专业能力和水平。
C 语⾔实现简易停车场管理系统本⽂实例为⼤家分享了C 语⾔实现停车场管理系统的具体代码,供⼤家参考,具体内容如下问题描述:设停车场内只有⼀个可停放n 辆汽车的狭长通道,且只有⼀个⼤门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(⼤门在最南端,最先到达的第⼀辆车停放在车场的最北端),若车场内已停满n 辆汽车,则后来的汽车只能在门外的便道上等候,⼀旦有车开⾛,则排在便道上的第⼀辆车即可开⼊;当停车场内某辆车要离开时,在它之后开⼊的车辆必须先退出车场为它让路,待该辆车开出⼤门外,其它车辆再按原次序进⼊车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费⽤。
由题得,此系统要实现的功能为:(1)设计停车场内的结构。
(由题分析为⼀个栈,因为只有⼀个门所以其就像数据结构中学到的栈,但是因为既要出栈⼜要⼊栈,此处我就将这个栈简化为了⼀个链表)(2)当车库满时,在车库外等待的结构。
(就像排队⼀样,先来先进后来后进,只能从⼀端进,另⼀端出)。
(3)车辆的结构,⼀辆车要有什么信息?⾸先要有这辆车的车牌号,可以⽤⼀个字符数组来存储(因为车牌不⼀定全是数字,还可能有汉字,英⽂字母等),题中要求要⽤要计算收费,就要知道驶⼊时间和驶出时间(怎样获取在下⾯会说到)。
算法描述:1、刚开始定义结构类型,如车的类型,车库⾥的类型,车库外等待的类型。
2、声明所要⽤到的函数:1234567891011121314void menu(Stack *cheku,SequenQueue* paidui);//开始菜单 //就是展⽰出菜单的函数//队列的相关操作SequenQueue* InitQueue();//申请⼀个空队int EmptyQueue(SequenQueue* Q);//判断队空int FullQueue(SequenQueue* Q);//判断队满int EnQueue(SequenQueue* Q, ElemType *e);//⼊队int DeQueue(SequenQueue* Q, ElemType *e); //出队Stack* build();//建链表int fullstack(Stack *cheku);//判断链表满void tingche(Stack *cheku,SequenQueue* paidui);//停车的函数void likai(Stack *cheku,SequenQueue* paidui);//离开的函数void chakan(Stack *cheku,SequenQueue* paidui);//查看车库停车情况的函数3、⼀些可能不理解的说明的说明。
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
功能描述以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表实现系统设计及实现1.头文件及宏定义#include <conio.h>#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include <windows.h>#define ClearScreen() system( "cls" ) // 清空当前屏幕#define setcolor() system("color 2f")//设置背景前景颜色#define Pause( szPrompt ) printf( "%s", szPrompt ),getch()2.时间和汽车信息结构体的定义(部分代码)typedef struct carinformation // 车辆信息{char szRegistrationMark[64]; // 车牌号char szArrivalTime[16]; // 到达时间char szEntranceTime[16]; // 进入停车场(开始计费)时间char szDepartureTime[16]; // 离开时间} TCARINFORMATION, *LPTCARINFORMATION;3.栈和队列的定义(部分代码)typedef struct carqueue // 链队{LPTCARNODE lpHead; // 头结点LPTCARNODE lpRear; // 指向当前队尾的指针int nEffectiveSize; // 当前队中元素个数} TCARQUEUE, *LPTCARQUEUE;4.栈和队列的初始化(部分代码)void InitQueue( LPTCARQUEUE &lpCarQueue ){lpCarQueue = ( LPTCARQUEUE ) malloc( sizeof( TCARQUEUE ) );lpCarQueue->lpHead = ( LPTCARNODE) malloc( sizeof( TCARNODE ) );lpCarQueue->lpHead->lpNext = NULL;lpCarQueue->lpRear = lpCarQueue->lpHead;lpCarQueue->nEffectiveSize = 0;}实现过程1.开始界面:输入车库容量2.输入车辆到达信息3.当车库停满车时临时停到便道上不收车费4.车辆离开后车库有车位便道上的车进入车库并显示离去车的收费记录5.显示车库及便道信息6.停止输入显示制作者信息及退出程序实训心得通过这次实训我对课本上的理论知识有了更深层次的了解,可能在仅一周的时间内学到的东西有限,不过却也是受益非浅,实训本来就是对平常所学的理论知识通过具体的实现表示出来是在完成理论课程学习之后安排的综合实践训练,任何一个优秀的程序员都是从实践中获得经验和教训的。
经过仅仅一周的实训从总体上说收获是很不错的!首先代码的编写能力明显提高,有了想法基本都能顺利表达出来;再者就是数据结构的选择使用能力也有了很大的提高!虽然,平时的实验课我们也有用各种数据做题,但那些都是很明确的该做什么操作,存什么,我们的发挥空间不大一般照做就行,然而这次实习我们却是在自主的选择判断,这本身就是一个很大的提高!但是还是很多的知识不了解,不过收获真的很多,但是最大的收获可能就是对编程的兴趣吧,在一次次的改掉错误,一次次的完成想要的效果后,越写越有感觉,越写越有成就感!当然还收获了无知,更确切的说是自知,原来我们现在什么也不算,还有很多有用的知识等着我们去学习!附录(代码)#include <conio.h>#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include <windows.h>// 清空当前屏幕#define ClearScreen() system( "cls" )//设置背景前景颜色#define setcolor() system("color 2f")// 显示字符串szPrompt 并等待用户按下任意键#define Pause( szPrompt ) printf( "%s", szPrompt ),getch()typedef struct carinformation // 车辆信息{char szRegistrationMark[64]; // 车牌号char szArrivalTime[16]; // 到达时间char szEntranceTime[16]; // 进入停车场(开始计费)时间char szDepartureTime[16]; // 离开时间} TCARINFORMATION, *LPTCARINFORMATION;typedef struct carstack{LPTCARINFORMATION lpCarInformation; // 车辆信息int nTop; // 栈顶元素下标int nStackSize; // 栈容量} TCARSTACK, *LPTCARSTACK;// 初始化栈lpCarStack, 将其容量设置为nSizevoid InitStack( LPTCARSTACK &lpCarStack, int nSize ){lpCarStack = ( LPTCARSTACK ) malloc( sizeof ( TCARSTACK ) ); lpCarStack->lpCarInformation = ( LPTCARINFORMATION ) malloc( nSize * sizeof ( TCARINFORMATION ));lpCarStack->nTop = -1;lpCarStack->nStackSize = nSize;}// 车辆信息carinfo 入栈lpCarStackvoid Push( LPTCARSTACK &lpCarStack, TCARINFORMATION carinfo ) {lpCarStack->nTop++;lpCarStack->lpCarInformation[lpCarStack->nTop] = carinfo;}// 车辆信息从栈lpCarStack 中弹出并存入carinfovoid Pop( LPTCARSTACK &lpCarStack, TCARINFORMATION &carinfo ) {carinfo = lpCarStack->lpCarInformation[lpCarStack->nTop];lpCarStack->nTop--;}// 若栈lpCarstack 空,返回TRUE;否则,返回FALSEBOOL IsStackEmpty( LPTCARSTACK lpCarStack ){return lpCarStack->nTop == -1;}// 若栈lpStackFull 满,返回TRUE;否则,返回FALSEBOOL IsStackFull( LPTCARSTACK lpCarStack ){return lpCarStack->nTop == ( lpCarStack->nStackSize - 1 );}// 销毁栈lpCarStack,将指针lpCarStack 置为NULLvoid DestroyStack( LPTCARSTACK &lpCarStack ){free( lpCarStack->lpCarInformation );free( lpCarStack );lpCarStack = NULL;}typedef struct carnode // 链队结点信息{TCARINFORMATION carinfo; // 车辆信息struct carnode *lpNext; // 指向下一个元素的指针} TCARNODE, *LPTCARNODE;typedef struct carqueue // 链队{LPTCARNODE lpHead; // 头结点LPTCARNODE lpRear; // 指向当前队尾的指针int nEffectiveSize; // 当前队中元素个数} TCARQUEUE, *LPTCARQUEUE;// 初始化链队lpCarQueuevoid InitQueue( LPTCARQUEUE &lpCarQueue ){lpCarQueue = ( LPTCARQUEUE ) malloc( sizeof( TCARQUEUE ) ); lpCarQueue->lpHead = ( LPTCARNODE) malloc( sizeof( TCARNODE ) ); lpCarQueue->lpHead->lpNext = NULL;lpCarQueue->lpRear = lpCarQueue->lpHead;lpCarQueue->nEffectiveSize = 0;}// 车辆信息carinfo 入队lpCarQueuevoid EnQueue( LPTCARQUEUE &lpCarQueue, TCARINFORMATION carinfo ){LPTCARNODE lpCarNode = ( LPTCARNODE ) malloc( sizeof( carnode ) );lpCarNode->carinfo = carinfo;lpCarNode->lpNext = NULL;lpCarQueue->lpRear->lpNext = lpCarNode;lpCarQueue->lpRear = lpCarQueue->lpRear->lpNext;lpCarQueue->nEffectiveSize++;}// 队头元素从链队lpCarQueue 中出队并存入carinfovoid DeQueue( LPTCARQUEUE &lpCarQueue, TCARINFORMATION &carinfo ){LPTCARNODE lpTemp = lpCarQueue->lpHead->lpNext;carinfo = lpTemp->carinfo;lpCarQueue->lpHead->lpNext = lpTemp->lpNext;free( lpTemp );lpCarQueue->nEffectiveSize--;}// 若链队lpCarQueue 为空,返回TRUE;否则,返回FALSEBOOL IsQueueEmpty( LPTCARQUEUE lpCarQueue ){return lpCarQueue->nEffectiveSize == 0;}// 销毁链队lpCarQueuevoid DestroyQueue( LPTCARQUEUE &lpCarQueue ){LPTCARNODE lpNextCarNode = NULL;for ( LPTCARNODE lpCarNode = lpCarQueue->lpHead; lpCarNode != NULL; lpCarNode = lpNextCarNode ){lpNextCarNode = lpCarNode->lpNext;free( lpCarNode );}free( lpCarQueue );lpCarQueue = NULL;}// 将字符串时间格式转换为数字(分钟)格式,例如12:36 将被转换为756 ( 12 * 60 + 36 )int ConvertTimeFormat( char *lpTime ){int nHour = 0;int nMinute = 0;sscanf( lpTime, "%d:%d", &nHour, &nMinute );return nHour * 60 + nMinute;}// 根据在停车场内的停留时间nContinuanceMinutes (分钟)计算费用double CalculateExpense( int nContinuanceMinutes ){return nContinuanceMinutes * ( 5.0 / 60 );}int main( void ){setcolor();int nParkCapability = 0; // 停车场容量putchar( '\n' );printf( "请输入停车场容量:" );scanf( "%d", &nParkCapability );LPTCARSTACK lpCarStack = NULL; // 停车场,用栈模拟豫InitStack( lpCarStack, nParkCapability );LPTCARQUEUE lpCarQueue = NULL; // 便道,用链队模拟InitQueue( lpCarQueue );char cCommandType = NULL; // 命令类型char szUserInput[128] = { NULL }; // 用户输入do{ClearScreen();setcolor();putchar( '\n' );puts( "--------------------" );puts( "[命令类型]" );puts( "A - 车辆到达" );puts( "D - 车辆离开" );puts( "E - 停止输入" );puts( "O - 显示当前停车场和便道使用情况" );putchar( '\n' );puts( "例:" );puts( "A,豫A1234,14:26" );puts( "D,豫A1234,16:51" );puts( "E" );puts( "O" );putchar( '\n' );printf( "请输入命令:" );scanf( "%s", szUserInput );puts( "--------------------" );char szCarInformation[128] = { NULL };sscanf( szUserInput, // 将命令类型与车辆信息分开存放"%c,%s",&cCommandType, // 用户输入的前半部分,即命令类型szCarInformation // 用户输入的后半部分,即车辆信息);char *lpCommaLocation = NULL; // 车辆信息字符串中的逗号位置for ( lpCommaLocation = szCarInformation; *lpCommaLocation != '\0'; lpCommaLocation++ ) {if ( *lpCommaLocation == ',' ){break;}}*lpCommaLocation = '\0';TCARINFORMATION carinfo = { NULL }; // 存储本次用户输入的车辆信息strcpy( carinfo.szRegistrationMark, szCarInformation );if ( cCommandType == 'A' ){strcpy( carinfo.szArrivalTime, lpCommaLocation + 1 );if ( FALSE == IsStackFull( lpCarStack ) ){strcpy( carinfo.szEntranceTime, carinfo.szArrivalTime );Push( lpCarStack, carinfo );printf( "已进入停车场第%d 个车位\n",lpCarStack->nTop + 1);printf( "车牌号:\t\t%s\n", carinfo.szRegistrationMark );printf( "进入时间:\t%s\n", carinfo.szEntranceTime );puts( "是否收费:\t是" );}else{EnQueue( lpCarQueue, carinfo );printf( "停车场已满,已停放在便道的第%d 个车位\n",lpCarQueue->nEffectiveSize);printf( "车牌号:\t\t%s\n", carinfo.szRegistrationMark );printf( "停放时间:\t%s\n", carinfo.szArrivalTime );puts( "是否收费:\t否" );}}else if ( cCommandType == 'D' ){strcpy( carinfo.szDepartureTime, lpCommaLocation + 1 );LPTCARSTACK lpTempCarStack = NULL;InitStack( lpTempCarStack, nParkCapability );TCARINFORMATION carinfoOut = { NULL };BOOL bIsCarFound = FALSE;while ( FALSE == IsStackEmpty( lpCarStack ) ){Pop( lpCarStack, carinfoOut );if ( 0 != strcmp( carinfoOut.szRegistrationMark, carinfo.szRegistrationMark ) ) {Push( lpTempCarStack, carinfoOut );}else{bIsCarFound = TRUE;break;}}while ( FALSE == IsStackEmpty( lpTempCarStack ) ){TCARINFORMATION tempcarinfo = { NULL };Pop( lpTempCarStack, tempcarinfo );Push( lpCarStack, tempcarinfo );}if ( FALSE == bIsCarFound ){printf( "车牌号为%s 的车未进入停车场.\n", carinfo.szRegistrationMark ); Pause( "--------------------\n按任意键输入下一条信息...\n" );continue;}strcpy( carinfoOut.szDepartureTime, carinfo.szDepartureTime );int nEntranceTime = ConvertTimeFormat( carinfoOut.szEntranceTime );int nDepartureTime = ConvertTimeFormat( carinfoOut.szDepartureTime );int nContinuanceMinutes = nDepartureTime - nEntranceTime;printf( "计费时段:\t%s - %s (共%d 分钟)\n",carinfoOut.szEntranceTime,carinfoOut.szDepartureTime,nContinuanceMinutes);double rExpense = CalculateExpense( nContinuanceMinutes );printf( "应交纳的费用:\t%.1lf 元\n", rExpense );if ( FALSE == IsQueueEmpty( lpCarQueue ) ){TCARINFORMATION tempcarinfo = { NULL };DeQueue( lpCarQueue, tempcarinfo );strcpy( tempcarinfo.szEntranceTime, carinfoOut.szDepartureTime ); Push( lpCarStack, tempcarinfo );puts( "--------------------" );printf( "停放在便道的第1 个车位,车牌号为%s 的车已进入停车场\n", tempcarinfo.szRegistrationMark);}}else if ( cCommandType == 'E' ){puts( "********************" );puts( " 姓名:肖熊\n" );puts( "学号:200813080245 \n" );puts( "********************" );break;}else if ( cCommandType == 'O' ){ClearScreen();setcolor();putchar( '\n' );puts( "[停车场使用情况]\n" );puts( "[车位]\t[车牌号]\t[到达时间]\t[进入(开始计费)时间]\n");for ( int i = 0; i <= lpCarStack->nTop; i++ ){printf( "%d\t%s\t\t%s\t\t%s\n",i + 1,lpCarStack->lpCarInformation[i].szRegistrationMark,lpCarStack->lpCarInformation[i].szArrivalTime,lpCarStack->lpCarInformation[i].szEntranceTime);}putchar( '\n' );putchar( '\n' );putchar( '\n' );puts( "[便道使用情况]\n" );puts( "[车位]\t[车牌号]\t[到达时间]\t[进入(开始计费)时间]\n");int nNum = 0;for ( LPTCARNODE lpCarNode = lpCarQueue->lpHead->lpNext;lpCarNode != NULL; lpCarNode = lpCarNode->lpNext ){nNum++;printf( "%d\t%s\t\t%s\t\t%s\n",nNum,lpCarNode->carinfo.szRegistrationMark,lpCarNode->carinfo.szArrivalTime,lpCarNode->carinfo.szEntranceTime);}putchar( '\n' );}else{puts( "输入信息有误.第一个字符只能为'A' 或'D' 或'E' 或'O' (区分大小写)." ); }Pause( "--------------------\n按任意键输入下一条信息.\n" );} while ( TRUE );DestroyStack( lpCarStack );DestroyQueue( lpCarQueue );Pause( "\n按任意键退出程序...\n" );return 0;}。