一、实验目的
1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈、队列进行分析;
2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现;
3.通过对参考代码的运行与调试,并且对以核心功能模块代码进行注释,真正掌握算法的思路与实现步骤。
二、实验内容
1.设计系统主界面,要求选择菜单对应数字进入相应功能:
2.要求对以下各个功能模块进行算法设计;
(1)车辆到达模块;
(2)车辆离开模块;
(3)列表显示模块;
Dec C++和VS编译器创建项目都要创建C++项目:
VS:VS2019如何创建C++项目?_Gemini-zero的博客-CSDN博客_vs2019怎么创建c++项目打开VS2019,选择空项目后,点击下一步(如果没有找到空项目,说明你下载的时候没勾选C++模块)输入项目名,更改项目存放路径后,选择下一步选择C++文件,修改程序名称,点击添加找到“解决方案资源管理器”,右键点击源文件,选择添加新建项此时可以开始编写C++程序了...https://blog.csdn.net/qq_44364832/article/details/105820626Dec c++: https://jingyan.baidu.com/article/fd8044fae80db55031137a07.htmlhttps://jingyan.baidu.com/article/fd8044fae80db55031137a07.html
这是我的vs框架
1、车辆到达模块流程图: 2、车辆离开模块流程图:
功能截图:
创建头文件 struct.h 定义数据类型和存储结构
#pragma once
#ifndef __STRUCT_H__
#define __STRUCT_H__
#define MAX 3 //车位数
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define Xtime 30 //30分钟Xprice块钱
#define Xprice 1 //Xtime分钟一块钱
#define Etime 0 //前5分钟免费
typedef int Status;
// 车辆信息
typedef struct {
char num[10]; // 车牌
long reach; // 车辆到达时间
long leave; // 车辆离开时间
}Car;
// 车辆顺序栈:停车场Enter和临时停车Temp
typedef struct {
Car* top;
Car* base;
int stacksize;//栈可用的最大容量
}SqStack;
//链栈(临时)
typedef struct StackNode {
Car data;
struct StackNode* next;
}StackNode,*LinkStack;
// 便道停车wait队列的结点
typedef struct QNode {
Car data;
QNode* next;
}QNode, * QueuePtr;
// 便道停车链式队列
typedef struct {
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
#endif
创建 function_declare.h 头文件把所有的方法函数声明
#pragma once #ifndef __FUNCTION_H__ #define __FUNCTION_H__ void SelectAll(SqStack S, LinkQueue Q);//查看车库 Status InitTempStack(LinkStack& TempStack); //初始化临时栈 Status InitStack(SqStack & S); // 初始化车辆栈 Status Push(SqStack& S, Car e); // 车辆进栈 Status Pop(SqStack& S, Car& e, LinkStack& TempStack); // 车辆出栈 Car GetTop(SqStack& S); // 取栈顶元素 int StackEmpty(SqStack S); // 车辆栈判空 int StackFull(SqStack S, Car e); // 车辆栈判满 Status InitQueue(LinkQueue & Q); // 初始化车辆链式队列 Status EnQueue(LinkQueue& Q, Car e); // 车辆入队 Car DeQueue(LinkQueue& Q); // 车辆出队 Car GetHead(LinkQueue Q); // 取链队的对头元素 int QueueEmpty(LinkQueue Q); // 车辆队列判空 #endif
创建 caroperation.cpp 源文件编写系统的功能
#include#include #include #include #include "struct.h" //时间换算(传入秒) void TimeExpress(int time) { int min; int hour; int sec; if (time < 60) { printf("停车时长: %d 秒n", time); } else if (time < 3600) { min = time / 60; sec = time % 60; if (time % 60 == 0) { printf("停车时长: %d 分钟n", min); } else { printf("停车时长: %d 分钟 % d 秒n", min , sec); } } else { min = time / 60; sec = time % 60; hour = min / 60; min %= 60; if (sec == 0 && min == 0) { printf("停车时长: %d 小时n", hour); } else if(sec != 0 && min == 0){ printf("停车时长: %d 小时 0 分钟 %d 秒n", hour,sec); } else if (sec == 0 && min != 0) { printf("停车时长: %d 小时 %d 分钟n", hour, min); } else if (sec != 0 && min != 0) { printf("停车时长: %d 小时 %d 分钟 %d 秒n", hour,min, sec); } } } //前Etime分钟免费,费用Xtime分钟Xprice块钱,不到Xtime分钟按Xtime分钟算 //传入的time单位为分钟 int price(int time) { int price; if (time <= Etime)return 0; else { price = time / Xtime; if (time % Xtime != 0)price++; return price; } } // 车辆栈判空 int StackEmpty(SqStack S) { if (S.top == S.base) { printf("当前车库没有车辆!na"); return ERROR; } else { return OK; } } //查看车库 void SelectAll(SqStack S, LinkQueue Q) { if (StackEmpty(S)) { QueuePtr q=Q.front; printf("========车库========n"); while (S.top != S.base) { S.top--; printf("|%s|n", S.top->num); } printf("=======等待区=======n"); printf("-------------------------n"); if (q == Q.rear) { printf("暂无车辆等待..."); } else { while (q != Q.rear) { q = q->next; printf("%s ",q->data.num); } } printf("n-------------------------n"); } } // 初始化车辆栈 Status InitStack(SqStack& S) { S.base = new Car[MAX]; if (!S.base)exit(OVERFLOW); S.top = S.base; S.stacksize = MAX; return OK; } //初始化临时栈 Status InitTempStack(LinkStack &TempStack) { TempStack = NULL; return OK; } // 车辆栈判满 int StackFull(SqStack S,Car e) { if (S.top - S.base == MAX) { //printf("车库满了!an"); printf("车位已满 ==> 车牌号 %s 进入等待区!an", e.num); return ERROR; } else { return OK; } } // 车辆进栈 Status Push(SqStack& S, Car e) { if (StackFull(S,e)) { *S.top++ = e; printf("车牌号 %s 成功进库!n",e.num); printf("车位剩余:%d n", --S.stacksize); return OK; } //等待队列 return ERROR; } // 取栈顶元素 Car GetTop(SqStack& S) { return *--S.top; } //判断有没有该车辆 Status Find(SqStack S,Car e) { while (S.top != S.base) { S.top--; if (!strcmp(S.top->num, e.num)) { return OK; } } return ERROR; } // 链栈入栈(临时) Status TempPush(LinkStack& TempStack,Car e) { LinkStack p = new StackNode; p->data = e; p->next = TempStack; TempStack = p; return OK; } // 链栈出栈(临时) Car TempPop(LinkStack& TempStack) { LinkStack p; Car tempData; tempData = TempStack->data; p = TempStack; TempStack = TempStack->next; delete(p); return tempData; } // 车辆出栈 Status Pop(SqStack& S, Car& e, LinkStack& TempStack) { //是否空栈 if (StackEmpty(S)) { //判断有没有该车 if (!Find(S,e)) { printf("该车不在车库中!an"); return ERROR; } Car temp; while (true) { temp = GetTop(S); if (!strcmp(temp.num, e.num)) { printf("车牌号 %s 成功出库!n", e.num); //时间(出库时间) e.leave = time(NULL); //计费(传入分钟单位) int pay=price((e.leave - e.reach)/60); //出临时栈&进原栈(给车让位进另一个栈又出栈进回原栈) while (TempStack != NULL) { *S.top++ = TempPop(TempStack); } //时间换算并输出时间 TimeExpress(e.leave - e.reach); printf("请缴费 %d 元n", pay); printf("车位剩余:%d n", ++S.stacksize); return OK; } //进栈(让位的车进临时栈) TempPush(TempStack, temp); } } return ERROR; } // 初始化车辆链式队列 Status InitQueue(LinkQueue& Q) { Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q.front)return ERROR; else { Q.front->next = NULL; return OK; } } // 车辆队列判空 int QueueEmpty(LinkQueue Q) { if (Q.front == Q.rear) { //printf("队空!na"); return ERROR; }return OK; } // 取链队的对头元素 Car GetHead(LinkQueue Q) { return Q.front->next->data; } // 车辆入队 Status EnQueue(LinkQueue& Q, Car e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); if (!p) { printf("程序发生不可逆的错误,请联系管理员!na"); //printf("入队失败!an"); return ERROR; } else { p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; return OK; } } // 车辆出队 Car DeQueue(LinkQueue& Q) { QueueEmpty(Q); Car HeadCar=GetHead(Q); QueuePtr p; p = Q.front->next; Q.front->next = p->next; if (Q.rear == p)Q.rear = Q.front; free(p); return HeadCar; }
创建主函数 main.cpp 源文件编写界面并执行程序
#include#include #include #include #include"struct.h" #include"function_declare.h" int main() { SqStack S; LinkStack TempStack; LinkQueue Q; Car ReadyCar; Car e; int item; //栈初始化 if (!InitStack(S)) { printf("程序发生不可逆的错误,请联系管理员!na"); return ERROR; system("pause"); } //临时栈初始化 InitTempStack(TempStack); //队列初始化 if (!InitQueue(Q)) { printf("程序发生不可逆的错误,请联系管理员!na"); return ERROR; system("pause"); } MARK: while (1) { printf("*****欢迎使用停车场系统*****n"); printf("①车辆到达模块n"); printf("②车辆离开模块n"); printf("③列表显示模块n"); printf("④极致可视化n"); printf("⑤退出n"); printf("请选择功能: "); scanf("%d", &item); printf("-----------------n"); switch (item) { case 1: { printf("车牌号为:"); getchar(); scanf("%s", &e.num); //时间计费(入库开始时间) e.reach = time(NULL); if (!Push(S,e)) { EnQueue(Q,e); } printf("nn"); break; } case 2: { printf("输入要出库的车牌号:"); getchar(); scanf("%s", &e.num); if (Pop(S, e, TempStack)) { if (QueueEmpty(Q)) { //出队进栈 ReadyCar = DeQueue(Q); ReadyCar.reach = time(NULL); Push(S, ReadyCar); } } printf("nn"); break; } case 3: { SelectAll(S,Q); printf("nn"); break; } case 4: { system("cls"); while (1) { printf("*****极致可视化模式*****n"); printf("①车辆到达模块n"); printf("②车辆离开模块n"); printf("③列表显示模块n"); printf("④退出极致可视化模式n"); printf("请选择功能: "); scanf("%d", &item); printf("-----------------n"); switch (item) { case 1: { printf("车牌号为:"); getchar(); scanf("%s", &e.num); system("cls"); //时间计费(入库开始时间) e.reach = time(NULL); if (!Push(S, e)) { EnQueue(Q, e); } printf("n"); SelectAll(S, Q); break; } case 2: { printf("输入要出库的车牌号:"); getchar(); scanf("%s", &e.num); system("cls"); if (Pop(S, e, TempStack)) { if (QueueEmpty(Q)) { //出队进栈 ReadyCar = DeQueue(Q); ReadyCar.reach = time(NULL); Push(S, ReadyCar); } } printf("n"); SelectAll(S, Q); break; } case 3: { system("cls"); SelectAll(S, Q); printf("nn"); break; } case 4: system("cls"); goto MARK; break; default:printf("错误:输入正确的功能序号!an"); break; } } break; } case 5: return 0; system("pause"); default:printf("错误:输入正确的功能序号!an"); break; } } return 0; }
资源:
停车场管理系统(C语言顺序栈+链栈+链队列)-C++文档类资源-CSDN下载停车场管理系统(C语言车库顺序栈+临时栈链栈+排队车道链队列)更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_55797565/85183518
如果有用的话可以给一个小赞吗來



