服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现停车管理系统

C语言实现停车管理系统

2022-10-20 13:32会飞的企鹅 C/C++

这篇文章主要为大家详细介绍了C语言实现停车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本题为大家分享了C语言实现停车管理系统的具体代码,供大家参考,具体内容如下

设计题目

设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应缴纳的费用和它在停车场内停留的时间。

需求分析

由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。因此,本题求解过程中需用到两个栈和一个队列。栈以顺序结构实现,队列以链表结构实现。

程序代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include
#include<stdlib.h>
#include<stdio.h>
#include
#define MAXSIZE 5
#define price 0.01
#pragma warning(disable: 4996)
using namespace std;
 
typedef struct time {
  int hour;
  int min;
  }Time;/时间结点/
typedef struct carnews {
  char num[10];
  Time reach;
  Time leave;
 }CarNode;/车辆信息结点/
typedef struct NODE {
  CarNode* stack[MAXSIZE + 1];
  int top; //栈可用的最大容量
 }SeqStackCar;/模拟停车场/
typedef struct car {
  CarNode* data;
  struct car* next;
}QueueNode; //模拟车进入便道,便道的车进入停车场
typedef struct Node {
  QueueNode* head; //头指针
  QueueNode* rear; //尾指针
}LinkQueueCar;/模拟便道/
 void InitStack(SeqStackCar*); //创建空栈
 int InitQueue(LinkQueueCar*); //创建空队列
 int Arrival(SeqStackCar*, LinkQueueCar*); //车辆到达
 void Leave(SeqStackCar*, SeqStackCar*, LinkQueueCar*); //车辆离开
 void PRINT(CarNode*, int); //输出离开车辆的信息清单
 void List(SeqStackCar, LinkQueueCar); //对所用到的函数作提前声明
   int main() {
    SeqStackCar Enter, Temp;
    LinkQueueCar Wait;
  int ch;
  InitStack(&Enter);//初始化车站
  InitStack(&Temp);//初始化让路的临时栈
  InitQueue(&Wait);//初始化通道
while (1) {
cout << "@欢迎使用本停车管理系统@" << endl;
cout << “----------------------------------------------------------------” << endl;
cout << " # # 1.车辆到达 # # " << endl;
cout << " # # 2.车辆离开 # # " << endl;
cout << " # # 3.列表显示 # # " << endl;
cout << " # # 4.退出系统 # # " << endl;
cout << “----------------------------------------------------------------” << endl;
cout << “!说明:请注意正确输入时间,在输入‘时'后,按‘ENTER'或者‘空格',再输入‘分'。不要为非数字” << endl;
cout << “请输入所需要的服务!(1-4).” << endl;//进入系统的目录显示
while (1) {
cin >> ch;
if (ch >= 1 && ch <= 4)break;
else cout << “输入错误!请选择:(1-4).” << endl;
}
switch (ch) {
  case 1:Arrival(&Enter, &Wait); break;//车辆到达
  case 2:Leave(&Enter, &Temp, &Wait); break;//车辆离开
  case 3:List(Enter, Wait); break;//列表显示信息
  case 4:exit(0);//退出主程序
  default:break;
  }
 }
}
void InitStack(SeqStackCar s) {//初始化栈
  int i; //停车数量
  s->top = 0; //栈顶元素置为0
  for (i = 0; i <= MAXSIZE; i++)
  s->stack[s->top] = NULL;
}
 int InitQueue(LinkQueueCar Q) {//初始化便道
  Q->head = (QueueNode*)malloc(sizeof(QueueNode)); //malloc函数为动态分配空间
  if (Q->head != NULL) {
  Q->head->next = NULL;
  Q->rear = Q->head; //头尾指针置为相等,队列为空
  return(1);
}
else return(-1);
}
  int Arrival(SeqStackCar* Enter, LinkQueueCar* W) {//车辆到达
  CarNode* p;
  QueueNode* t;
  p = (CarNode*)malloc(sizeof(CarNode));//malloc函数为动态分配空间
  flushall();//清除所有的缓存区
  cout << “请输入车牌号(例如:AB123):” << endl;
  cin >> p->num;
  if (Enter->top < MAXSIZE)//车场未满,车进车场
{
  Enter->top++;
  cout << “车辆在车场第” << Enter->top << “位置!” << endl;
  cout << “请输入到达时间:(小时:分钟)” << endl;
  cin >> p->reach.hour;
  while (p->reach.hour < 0 || p->reach.hour>23) {//控制时间格式正确
  cout << “输入错误!” << endl;
  cout << “请重新输入到达时间的时(0-23)!” << endl;
  cin >> p->reach.hour;
}
  cin >> p->reach.min;
  while (p->reach.min < 0 || p->reach.min>59) {//控制分钟格式正确
  cout << “输入错误!” << endl;
  cout << “请重新输入到达时间的分(0-59)!” << endl;
  cin >> p->reach.min;
}
Enter->stack[Enter->top] = p;
return(1);
}
else//车场已满,车进便道
{
cout << “车场已满,请在便道等待!” << endl;
t = (QueueNode*)malloc(sizeof(QueueNode));
t->data = p;
t->next = NULL;
W->rear->next = t;
W->rear = t;
return(1);
}
}
void Leave(SeqStackCar* Enter, SeqStackCar* Temp, LinkQueueCar* W) {//车辆离开
int room;
CarNode* p;
QueueNode* q;
//判断车场内是否有车
if (Enter->top > 0)//有车
{
while (1) {//输入离开车辆的信息
cout << “请输入车在车场的位置1–” << Enter->top << “:”;
cin >> room;
if (room >= 1 && room <= Enter->top)break;
}
while (Enter->top > room) {//车辆离开
Temp->top++;//临时通道栈顶指针
Temp->stack[Temp->top] = Enter->stack[Enter->top];
Enter->stack[Enter->top] = NULL;
Enter->top–;
}
p = Enter->stack[Enter->top];
Enter->stack[Enter->top] = NULL;
Enter->top–;
while (Temp->top >= 1) {//判断临时通道上是否有车
Enter->top++;
Enter->stack[Enter->top] = Temp->stack[Temp->top];
Temp->stack[Temp->top] = NULL;
Temp->top–;
}
PRINT(p, room);
if ((W->head != W->rear) && Enter->top < MAXSIZE) {//车站是未满
//便道的车辆进入车场
q = W->head->next;
p = q->data;//p指向链队头
Enter->top++;
cout << “便道的” << p->num << “号车进入车场第” << Enter->top << “位置!” << endl;
cout << “请输入现在的时间(小时:分钟):” << endl;
cin >> p->reach.hour;
if (p->reach.hour < 0 || p->reach.hour>23) {
cout << “输入错误!” << endl;
cout << “请重新输入到达时间的时(0-23):” << endl;
cin >> p->reach.hour;
}
cin >> p->reach.min;
if (p->reach.min < 0 || p->reach.min>59) {
cout << “输入错误!” << endl;
cout << “请重新输入到达时间的分(0-59):” << endl;
cin >> p->reach.min;
}
Enter->stack[Enter->top] = p;
W->head->next = q->next;
if (q == W->rear)W->rear = W->head;
free(q);//释放q地址
}
else cout << “便道里没有车!” << endl;//便道没车
}
else cout << “车场里没有车!” << endl;//车场没车
}
void PRINT(CarNode* p, int room) {//输出离开车辆的信息清单
int A1, A2, B1, B2;
cout << “请输入离开的时间:(小时:分钟)” << endl;
cin >> p->leave.hour;
while (p->leave.hour < 0 || p->leave.hour>23) {
cout << “输入错误!” << endl;
cout << “请重新输入离开的时间的时(0-23):” << endl;
cin >> p->leave.hour;
B1 = p->leave.hour;
}
cin >> p->leave.min;
if (p->leave.min < 0 || p->leave.min>59) {
cout << “输入错误!” << endl;
cout << “请重新输入离开的时间的分(0-59):” << endl;
cin >> p->leave.min;
}
cout << endl << “离开车辆的车牌号为:” << endl;
puts(p->num);
cout << “其到达的时间为:” << p->reach.hour << “:” << p->reach.min << endl;
cout << “其离开的时间为:” << p->leave.hour << “:” << p->leave.min << endl;
A1 = p->reach.hour;
A2 = p->reach.min;
B1 = p->leave.hour;
B2 = p->leave.min;
cout << “应交费用为:” << (((B1 - A1) * 60 + (B2 - A2)) + 1440) % 1440 * price << “元!” << endl;
}
void List1(SeqStackCar* S) {//列表显示车场信息
cout << “您选择的是车场停车情况!” << endl;
int i;
if (S->top > 0) {//判断车站内是否有车
cout << “位置 到达时间 车牌号” << endl;
for (i = 1; i <= S->top; i++) {
cout << " " << i << " " << S->stack[i]->reach.hour << “:” << S->stack[i]->reach.min << " " << S->stack[i]->num << endl;
}
}
else cout << “车场里没有车!” << endl;
}
void List2(LinkQueueCar* W) {//列表显示便道信息
cout << “您选择的是便道停车情况!” << endl;
int j = 1;
QueueNode* p;
p = W->head->next;
if (W->head != W->rear) {//判断通道上是否有车
cout << “等待车辆的车牌号码为:” << endl;
while (p != NULL) {
cout << j;
puts(p->data->num);
cout << j << " " << p->data->num << endl;
p = p->next;
j++;
}
}
else cout << “便道里没有车!”;
}
void List(SeqStackCar S, LinkQueueCar W) {//列表界面
int flag, tag; //列表和标签
flag = 1;
while (flag) {//列表显示循环控制
 cout << “请选择您要显示的信息!(1-3):” << endl;
 cout << “#——1.车场——#” << endl;
 cout << “#——2.便道——#” << endl;
 cout << “#——3.返回——#” << endl;
while (1) {
 cin >> tag;
 if (tag >= 1 || tag <= 3)break;
 else cout << “输入错误!请选择(1-3):” << endl;
}
switch (tag) {
  case 1:List1(&S); break;//列表显示车场信息
  case 2:List2(&W); break;//列表显示便道信息
  case 3:flag = 0; break;
 default:break;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_55292171/article/details/122167742

延伸 · 阅读

精彩推荐
  • C/C++C语言中无符号与有符号及相加问题

    C语言中无符号与有符号及相加问题

    这篇文章主要介绍了C语言中无符号与有符号及相加问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    C语言教程网6002021-06-30
  • C/C++C++异常捕捉与处理的深入讲解

    C++异常捕捉与处理的深入讲解

    这篇文章主要给你大家介绍了关于C++异常捕捉与处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    李春港12252021-09-29
  • C/C++C语言下快速排序(挖坑法)详解

    C语言下快速排序(挖坑法)详解

    大家好,本篇文章主要讲的是C语言下快速排序(挖坑法)详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    绅士·永10852022-07-27
  • C/C++C语言结构体简单入门讲解

    C语言结构体简单入门讲解

    这篇文章主要介绍了C语言结构体简单入门讲解,本文讲述了结构体的基本定义和操作,讲解了几个比较实用的函数和案例,希望对你有所帮助...

    pieds8572021-11-18
  • C/C++C++中SetConsoleCursorPosition()移动光标函数的用法大全

    C++中SetConsoleCursorPosition()移动光标函数的用法大全

    这篇文章主要介绍了C++中SetConsoleCursorPosition()移动光标函数的用法大全,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的...

    Ridiculer5292021-10-28
  • C/C++c++用指针交换数组的实例讲解

    c++用指针交换数组的实例讲解

    下面小编就为大家分享一篇c++用指针交换数组的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    月炼4142021-06-10
  • C/C++C++实现LeetCode(140.拆分词句之二)

    C++实现LeetCode(140.拆分词句之二)

    这篇文章主要介绍了C++实现LeetCode(140.拆分词句之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang9402021-12-06
  • C/C++C指针原理教程之C指针基础

    C指针原理教程之C指针基础

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型...

    myhaspl4212021-07-21