一、实验目的
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 <string.h>
#include<stdlib.h>
#include <stdio.h>
#include<time.h>
#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("当前车库没有车辆!\n\a");
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("车库满了!\a\n");
printf("车位已满 ==> 车牌号 %s 进入等待区!\a\n", 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) {
/*if (TempStack == NULL) {
printf("临时栈空\a\n");
return ERROR;
}*/
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("该车不在车库中!\a\n");
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("队空!\n\a");
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("程序发生不可逆的错误,请联系管理员!\n\a");
//printf("入队失败!\a\n");
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 源文件编写界面并执行程序文章来源:https://www.toymoban.com/news/detail-474173.html
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#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("程序发生不可逆的错误,请联系管理员!\n\a");
return ERROR;
system("pause");
}
//临时栈初始化
InitTempStack(TempStack);
//队列初始化
if (!InitQueue(Q)) {
printf("程序发生不可逆的错误,请联系管理员!\n\a");
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("\n\n");
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("\n\n");
break;
}
case 3: {
SelectAll(S,Q);
printf("\n\n");
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("\n\n");
break;
}
case 4:
system("cls");
goto MARK;
break;
default:printf("错误:输入正确的功能序号!\a\n");
break;
}
}
break;
}
case 5:
return 0;
system("pause");
default:printf("错误:输入正确的功能序号!\a\n");
break;
}
}
return 0;
}
资源:
停车场管理系统(C语言顺序栈+链栈+链队列)-C++文档类资源-CSDN下载停车场管理系统(C语言车库顺序栈+临时栈链栈+排队车道链队列)更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_55797565/85183518文章来源地址https://www.toymoban.com/news/detail-474173.html
如果有用的话可以给一个小赞吗🤭
到了这里,关于停车场管理系统(C语言顺序栈+链栈+链队列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!