C语言数据结构课程设计 停车场模拟管理程序

停车场模拟管理程序

问题描述

设有一个可以停放5辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满5辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车 未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。

需求分析

(1)定义一个主菜单,方便用户实现下述操作。要求菜单简洁、易操作、界面美观。

(2)根据车辆到达停车场和离开停车场时所停留的时间进行计时收费。
(3)按问题的描述,对车辆的进人和离开进行调度。当有车辆离开时,等待的车辆按顺序进入停车场停放。
(4)可以显示停车场信息和便道的信息。 

算法设计和实现

(1)功能图

C语言数据结构课程设计 停车场模拟管理程序_第1张图片

(2)概要设计

void Car_Come();  // 汽车进入停车场并停车

void Car_Leave(); //汽车离开停车场

void Stop_To_Pave(); //车辆进入便道等待

void Stop_To_Buff(); //车辆计费

void Leave_Pavement(); //从便道上开出车辆

void DisPlay(); //显示停车场所有车辆信息

void DisPlayPave(); //显示便道所有车辆信息

void Welcome(); //欢迎提示界面和操作菜单

void SmallWelcome(); //目前停车状况操作菜单

void Car_Leave_menu(); //用户查询车辆离开功能

void Search(); //根据车牌号码搜索车辆信息

(3)存储结构

typedef struct {

int TimeIn;

int TimeOut;

char ct[50];

char Lincense[10];

}Car; //车辆进入信息

typedef struct {

Car Stop[MAX_STOP];

int top;

}Stopping;  //停车场内信息

typedef struct {

Car Pave[MAX_PAVE];

int count;

int front, rear;

}Pavement;  //便道信息

typedef struct {

Car Let[MAX_STOP];

int top;

}Buffer;  //便道车辆移动

typedef struct {

Car Wait[MAX_PAVE];

int count;

int front, rear;

}Waiting;  //便道上等待的车辆信息

(4)源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include 

#include  

#include 

#include 

#include 



#define Price     0.1  

#define MAX_STOP  5

#define MAX_PAVE  4   



typedef struct {

int TimeIn;

int TimeOut;

char ct[50];

char Lincense[10];

}Car; //车辆进入信息



typedef struct {

Car Stop[MAX_STOP];

int top;

}Stopping;  //停车场内信息



typedef struct {

Car Pave[MAX_PAVE];

int count;

int front, rear;

}Pavement;  //便道信息



typedef struct {

Car Let[MAX_STOP];

int top;

}Buffer;  //便道车辆移动



typedef struct {

Car Wait[MAX_PAVE];

int count;

int front, rear;

}Waiting;  //便道上等待的车辆信息



Stopping s;

Pavement p;

Buffer   b;

Car      c;

Waiting  w;

char     C[10];



//函数声明

void Car_Come();  // 汽车进入停车场并停车

void Car_Leave(); //汽车离开停车场

void Stop_To_Pave(); //车辆进入便道等待

void Stop_To_Buff(); //车辆计费

void Leave_Pavement(); //从便道上开出车辆

void DisPlay(); //显示停车场所有车辆信息

void DisPlayPave(); //显示便道所有车辆信息

void Welcome(); //欢迎提示界面和操作菜单

void SmallWelcome(); //目前停车状况操作菜单

void Car_Leave_menu(); //用户查询车辆离开功能

void Search(); //根据车牌号码搜索车辆信息



// 汽车进入停车场并停车

void Car_Come() {

printf("请输入即将停车的车牌号:");

scanf("%s", &C);

int i = s.top;

while (i != -1) {

if (0 == strcmp(s.Stop[i].Lincense, C)) {

printf("输入有误,此汽车已存在!\n");

return;

}

i--;

}

int k = MAX_PAVE;

while (k != 0) {

if (0 == strcmp(p.Pave[k].Lincense, C)) {

printf("输入有误,此汽车已存在!\n");

return;

}

k--;

}

if (s.top >= MAX_STOP - 1) {

Stop_To_Pave();

}

else {

time_t t1;

long int t = time(&t1);

char* t2;

t2 = ctime(&t1);

s.Stop[++s.top].TimeIn = t;

strcpy(s.Stop[s.top].ct, t2);

strcpy(s.Stop[s.top].Lincense, C);

printf("牌照为%s的汽车停入停车位的%d车位,当前时间:%s\n", C, s.top + 1, t2);

}

}



//根据车牌号码搜索车辆信息

void Search() {

printf("请输入要搜索的车牌号:\n");

scanf("%s", &C);

int i, j, k, flag = 0;

time_t t1;

long int t = time(&t1);

if (s.top >= 0) {

for (i = s.top; i >= 0; i--) {

if (0 == strcmp(s.Stop[i].Lincense, C)) {

printf("此汽车在停车场内,信息如下:\n");

printf("\t车牌号\t\t停车位序\t当前所需支付金额\t进入时间\t\n");

printf("\t%s\t第%d个\t\t%0.f元\t\t\t%s", s.Stop[i].Lincense, i + 1, Price * (t - s.Stop[i].TimeIn), s.Stop[i].ct);

flag = 1;

break;

}

}

}

if (flag == 0 && p.count > 0) {

i = p.front, k = 1, j = p.rear;

while (i != j) {

if (0 == strcmp(p.Pave[i].Lincense, C)) {

printf("此汽车在停便道上\n");

printf("\t车牌号\t\t停车位序\n");

printf("\t%s\t第%d个", p.Pave[i].Lincense, k);

flag = 2;

break;

}

i++;

k++;

}

}

if (0 == flag)

printf("停车场内外不存在该汽车信息!\n");



}



//汽车离开停车场

void Car_Leave() {

printf("请输入即将离开的车牌号:");

scanf("%s", &C);

int i, j, flag = 1, flag2 = 1;

if (s.top >= 0) {

for (i = s.top; i >= 0; i--) {

flag = flag * strcmp(s.Stop[i].Lincense, C);

i--;

}

}



if (0 == flag) {

Stop_To_Buff();

}



if (flag != 0 /*&& flag2 != 0*/)

printf("停车场内没有该汽车的信息!\n");

}



//从便道上开出车辆

void Leave_Pavement() {

int i, j, flag = 0;

printf("请输入即将离开的车牌号:");

scanf("%s", &C);

if (p.count <= 0) {

printf("便道上不存在汽车!\n");

return;

}

while (p.count > 0) {

i = p.front;

if (0 == strcmp(p.Pave[i].Lincense, C)) {

break;

}

printf("牌照为%s的汽车暂时从便道进入临时便道\n", p.Pave[p.front].Lincense);

strcpy(w.Wait[w.rear].Lincense, p.Pave[p.front].Lincense);

p.front = (p.front + 1) % MAX_PAVE;

w.rear = (w.rear + 1) % MAX_PAVE;

w.count++;

p.count--;

}

printf("\n牌照为%s的汽车从便道上开走,不收取任何费用!\n\n", p.Pave[i].Lincense);

p.front = (p.front + 1) % MAX_PAVE;

p.count--;

while (p.count > 0) {

printf("牌照为%s的汽车暂时从便道进入临时便道\n", p.Pave[p.front].Lincense);

strcpy(w.Wait[w.rear].Lincense, p.Pave[p.front].Lincense);

p.front = (p.front + 1) % MAX_PAVE;

w.rear = (w.rear + 1) % MAX_PAVE;

w.count++;

p.count--;

}

while (w.count > 0) {

printf("\n牌照为%s的汽车返回便道\n", w.Wait[w.front].Lincense);

strcpy(p.Pave[p.rear].Lincense, w.Wait[w.front].Lincense);

w.front = (w.front + 1) % MAX_PAVE;

p.rear = (p.rear + 1) % MAX_PAVE;

w.count--;

p.count++;

}

}



//车辆计费

void Stop_To_Buff() {

while (s.top >= 0) {

if (0 == strcmp(s.Stop[s.top].Lincense, C)) {

break;

}

strcpy(b.Let[b.top++].Lincense, s.Stop[s.top].Lincense);

printf("牌照为%s的汽车暂时退出停车场\n", s.Stop[s.top--].Lincense);

}

printf("牌照为%s的汽车从停车场开走\n", s.Stop[s.top].Lincense);

time_t t1;

long int t = time(&t1);

s.Stop[s.top].TimeOut = t;

char* t2;

t2 = ctime(&t1);

printf("离开时间%s\n需付费%.0f元\n", t2, Price * (s.Stop[s.top].TimeOut - s.Stop[s.top].TimeIn));

s.top--;

while (b.top > 0) {

strcpy(s.Stop[++s.top].Lincense, b.Let[--b.top].Lincense);

printf("牌照为%s的汽车停回停车位%d车位\n", b.Let[b.top].Lincense, s.top + 1);

}

while (s.top < MAX_STOP - 1) {

if (0 == p.count)

break;

else {

strcpy(s.Stop[++s.top].Lincense, p.Pave[p.front].Lincense);

printf("牌照为%s的汽车从便道中进入停车位的%d车位\n", p.Pave[p.front].Lincense, s.top + 1);

time_t t1;

long int t = time(&t1);

char* t2;

s.Stop[s.top].TimeIn = t;

p.front = (p.front + 1) % MAX_PAVE;

p.count--;

}

}

}

//车辆进入便道等待

void Stop_To_Pave() {

if (p.count > 0 && (p.front == (p.rear + 1) % MAX_PAVE))

printf("便道已满,请下次再来!\n");

else {

strcpy(p.Pave[p.rear].Lincense, C);

p.rear = (p.rear + 1) % MAX_PAVE;

p.count++;

printf("牌照为%s的汽车停入便道上\n", C);

}

}



//显示停车场所有车辆信息

void DisPlay() {

int i = s.top;

if (-1 == i)

printf("停车场目前为空\n");

time_t t1;

long int t = time(&t1);

printf("\t车牌号\t\t停放时间\t当前所需支付金额\t停放位序\n");

while (i != -1) {

printf("\t%s\t%d分%d秒\t\t%.0f元\t\t\t第%d个\n", s.Stop[i].Lincense,

(t - s.Stop[i].TimeIn) / 60, (t - s.Stop[i].TimeIn) % 60, Price * (t - s.Stop[i].TimeIn), i + 1);

i--;

}

}



//显示便道所有车辆信息

void DisPlayPave() {

int i = p.front;

int k = 1;

if (0 == p.count)

printf("便道目前为空\n");

printf("\t车牌号\t\t停放位序\n");

while (i != p.rear && k <= p.count) {

printf("\t%s\t第%d个\n", p.Pave[i].Lincense, k++);

i = (i + 1) % MAX_PAVE;

}

}



//用户查询车辆离开功能

void Car_Leave_menu() {

while (1) {

system("cls");

SmallWelcome();

int i, cho;

scanf("%d", &i);

if (1 == i)  Car_Leave();

if (2 == i)  Leave_Pavement();

if (3 == i)  return;

printf("\n返回请输入0\n");

top:

scanf("%d", &cho);

if (0 == cho) {

continue;

}

else {

printf("您的输入有误,请重新输入\n");

goto top;

}

}

}

//目前停车状况操作菜单

void SmallWelcome() {

printf("\t*******************目前停车场状况***********************\n");

printf("\t停车场共有%d个车位,当前停车场共有%d辆车,等候区共有%d/%d辆车\n",

MAX_STOP, s.top + 1, (p.rear + MAX_PAVE - p.front) % MAX_PAVE, MAX_PAVE - 1);

printf("\t********************************************************\n");

printf("\t--------------欢   迎   再   次   光   临---------------\n");

printf("\t*                                                      *\n");

printf("\t*                   1.从停车场内驶出汽车               *\n");

printf("\t*                   2.从便道上驶出汽车                 *\n");

printf("\t*                   3.退出子管理系统                   *\n");

printf("\t*请注意:从停车场内驶离的汽车按照%.0f元/分钟计费          *\n", 60 * Price);

printf("\t*望周知:从便道上驶离的汽车不收取费用                  *\n");

printf("\t*                                                      *\n");

printf("\t*------------------------------------------------------*\n");

printf("\t---------------------请输入(1/2/3)----------------------\n");

}

void HideCursor() {

CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

//欢迎提示界面和操作菜单

void Welcome() {

time_t rawtime;

struct tm* timeinfo;

time(&rawtime);

timeinfo = localtime(&rawtime);

printf("\t\t\t%s", asctime(timeinfo));

HideCursor();

printf("\t*******************目前停车场状况***********************\n");

printf("\t停车场共有%d个车位,当前停车场共有%d辆车,等候区共有%d/%d辆车\n",

MAX_STOP, s.top + 1, (p.rear + MAX_PAVE - p.front) % MAX_PAVE, MAX_PAVE - 1);

printf("\t********************************************************\n");

printf("\t---------------欢  迎  来  到  停  车  场---------------\n");

printf("\t*                                                      *\n");

printf("\t*                   1.停车场停车信息显示               *\n");

printf("\t*                   2.便道上停车信息显示               *\n");

printf("\t*                   3.汽车到达停车场操作               *\n");

printf("\t*                   4.汽车离去停车场操作               *\n");

printf("\t*                   5.查找汽车功能                     *\n");

printf("\t*                   6.退出管理系统                     *\n");

printf("\t*收费标准:本停车场按照%.0f元/分钟计费,望周知            *\n", 60 * Price);

printf("\t*                                                      *\n");

printf("\t*------------------------------------------------------*\n");

printf("\t-----------------请输入(1/2/3/4/5/6) -------------------\n");

}



int main() {

s.top = -1;

b.top = 0;

p.rear = 0;

p.count = 0;

p.front = 0;

w.count = 0;

w.front = 0;

w.rear = 0;

while (1) {

system("color 0B");

system("cls");

Welcome();

int i, cho;

scanf("%d", &i);

if (1 == i)  DisPlay();

if (2 == i)  DisPlayPave();

if (3 == i)  Car_Come();

if (4 == i)  Car_Leave_menu();

if (5 == i)  Search();

if (6 == i) {

printf("\n欢迎您再次使用本系统哟 ε=ε=ε=(~ ̄▽ ̄)~\n\n");

break;

}

printf("\n返回请输入0\n");

begin:

scanf("%d", &cho);

if (0 == cho) {

continue;

}

else {

printf("您的输入有误,请重新输入\n");

goto begin;

}

}

return 0;

}

调试分析与测试结果

进入停车场模拟管理程序界面,输入3,停入第一辆车牌号为渝A123的车辆:C语言数据结构课程设计 停车场模拟管理程序_第2张图片

停车场停满后,车辆进入便道等候,此时便道也停满了3辆:

C语言数据结构课程设计 停车场模拟管理程序_第3张图片

输入1显示停车场信息,此时停了5辆车,分别显示出车牌号,停放时间,费用以及停放的次序:

C语言数据结构课程设计 停车场模拟管理程序_第4张图片

输入1,将车牌号为渝A123的车辆驶出停车场并计费,后序车辆依次前移,便道内的车辆驶入停场C语言数据结构课程设计 停车场模拟管理程序_第5张图片

运行结果符合预期

你可能感兴趣的:(C语言-数据结构-课程设计,c语言,数据结构,课程设计)