停车场管理(C++,数据结构课设)

运用顺序队和顺序栈,字符动画

#include <iostream>
#include <string>
#include<cstringt.h>
#include <stack>
#include<Windows.h>
#include<malloc.h>
#include<algorithm>
#include<time.h>
#include<iomanip>
#include<chrono>
#define MAXL 100

using namespace std;


typedef struct node
{
	string cp;
	int car_color=1;
	double time_in,time_out;
}Node;

typedef struct qNode {   //队列指针 
	int Front, Rear;
	node sidewalk[MAXL];
}Queue;//front存,rear空

Queue que;
Node park[MAXL];
Node Out;
int park_space;
int park_car_number = 0;
int compare_park(string s);
int compare_side(string s);
//long long tim(Node tt);
void menu();
void animation_in_park();
void animation_in_side();
void animation_out_side(int x);
void animation_out_park(int x);
void print_park();
void print_side();
void  init_Queue(Queue& que);
void in_car();
void out_car();
void en_Queue(Queue& q, string s, int i);

void de_Queue(Queue& q);
void car_cout(node q);
void change_color(int i);
void change_color(int i)//车辆颜色
{
	switch (i)
	{
	case 0:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色
			break;
	case 1:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
			break;
	case 2:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
			break;
	case 3:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
			break;
	case 4:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//黄色
			break;
	case 5 :
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//粉色
			break;
	default:
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//青色
			break;
	
	}
	return;

}
void car_cout(node q)
{
	change_color(q.car_color);
	cout << "_____/----\\_______" << endl;
	cout << " (o)["<< setw(9) << std::left << q.cp<< "](o)" << endl;
	return;
}
void print_park()
{
	change_color(1);
	cout << "停车场内:" << endl;
	int i = 1;
	while (i <= park_car_number)
	{
		car_cout(park[i]);
		i++;
	}
	return;
}
void print_side()
{
	change_color(1);
	cout << "便道内:\n";
	int i = 0;
	while(que.Front+i<que.Rear)
	{

		car_cout(que.sidewalk[i + que.Front]);
		i++;
	}
	return;
}
void animation_out_park(int x)
{
	//车退栈
	for (int i = 1;i <=park_space - x;i++)
	{
		Sleep(500);
		system("cls");
		cout << "停车场内:\n";
		for (int k = 1;k < x;k++)
		{
			car_cout(park[k]);
		}
		for (int j = 0;j <=i;j++)
		{
			cout << endl;
		}
		for (int j = x;j <= park_car_number;j++)
		{
			car_cout(park[j]);
		}
	}

	for (int i = x;i <=park_car_number;i++)//栈变值
	{
		park[i] = park[i + 1];
	}

	park_car_number--;

	if (que.Rear - que.Front > 0)//队列入栈
	{
		park[park_space].cp = que.sidewalk[que.Front].cp;
		park[park_space].car_color = que.sidewalk[que.Front].car_color;
		park[park_space].time_in = clock();
		que.Front++;
		park_car_number++;
	}
	//车进栈
	for (int i = park_car_number - x;i > 0;i--)//车进栈
	{
		Sleep(200);
		system("cls");
		for (int k = 1;k < x;k++)
		{
			car_cout(park[k]);
		}
		for (int j = 0;j < i;j++)
		{
			cout << endl;
		}
		for (int j = x;j <= park_car_number;j++)
		{
			car_cout(park[j]);
		}
		print_side();
	}
	system("cls");
	print_park();
	print_side();
	return;
}

void animation_out_side(int x)
{
	node s;
		s.cp= que.sidewalk[x+que.Front].cp;
		s.car_color = que.sidewalk[x + que.Front].car_color;
	for (int i = x;i+que.Front < que.Rear;i++)
	{
		que.sidewalk[i + que.Front] = que.sidewalk[i + que.Front+1];
	}
	que.Rear--;
	int t = x;
	while (t)
	{
		//system("pause");
		Sleep(100);
		system("cls");
		print_park();
		change_color(1);
		cout << "便道内" << endl;
		int  j = 0;
		while (j < t - 1)
		{
			car_cout(que.sidewalk[que.Front + j]);
			j++;
		}
		change_color(que.sidewalk[que.Front + t-1].car_color);
		cout << "_____/----\\_______";
		change_color(s.car_color);
		cout<< "     " << "_____/----\\_______" << endl;
		change_color(que.sidewalk[que.Front + t-1].car_color);
		cout << " (o)[" << setw(9) << std::left << que.sidewalk[que.Front + t-1].cp << "](o)";
		change_color(s.car_color);
		cout << "     " << " (o)[" << setw(9) << std::left << s.cp << "](o)" << endl;
		j++;
		while (que.Front + j < que.Rear)
		{
			car_cout(que.sidewalk[que.Front + j]);
			j++;
		}
		t--;
		Sleep(1000);
	}
	system("cls");
	print_park();
	print_side();
	change_color(1);
	cout << "该车在便道内,无需支付费用" << endl;
	menu();
	return;
}
void out_car()
{
	cout << "请输入车牌号" << endl;
	cin >> Out.cp;
	int pos1 = compare_park(Out.cp);
	int pos2 = compare_side(Out.cp);//pos2为与队头距离
	if (pos1 == -1&&pos2==-1)
	{
		cout << "未找到此车" << endl;
		menu();
		return;
	}
	if (pos2>=0)
	{
		animation_out_side(pos2);
		return;
	}
	if(pos1>=0)
	{
		park[pos1].time_out = clock();

		animation_out_park(pos1);
		auto duration = park[pos1].time_in - park[pos1].time_out;
		//cout<<ctime(&park[pos1].time_out)
		cout << "需缴纳:" << duration/1000 << "元" << endl;
		menu();
	}
}
void in_car()
{
	string license_plate_number;
	cout << "请输入车牌号" << endl;
	cin >> license_plate_number;
	if (compare_park(license_plate_number) >= 0)
	{
		cout << "此车已在入停车场" << endl;
		menu();
		return;
	}
	if (compare_side(license_plate_number) >= 0)
	{
		cout << "此车已在入便道" << endl;
		menu();
		return;
	}
	if (park_car_number < park_space)//入停车场
	{
		park_car_number++;
		park[park_car_number].cp = license_plate_number;
		park[park_car_number].time_in = clock();
		park[park_car_number].car_color = rand() % 7;

		HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
		// 设置控制台窗口缓冲区大小
		COORD bufferSize = { 120, 120 };
		SetConsoleScreenBufferSize(hOut, bufferSize);

		animation_in_park();
		menu();
	}
	else//入便道
	{
	    int Car_color = rand() % 7;
		//que.Rear++;
		en_Queue(que, license_plate_number,Car_color);
		HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
		// 设置控制台窗口缓冲区大小
		COORD bufferSize = { 120, 120 };
		SetConsoleScreenBufferSize(hOut, bufferSize);

		animation_in_side();
		
	}
}

void de_Queue(Queue& q)
{
	q.Front++;
}

void en_Queue(Queue& q, string s,int i)
{
	q.sidewalk[q.Rear].cp = s;
	q.sidewalk[que.Rear].car_color = i;
	q.Rear++;
}

void  init_Queue(Queue& que) {
	que.Front = 1;
		que.Rear = 1;
}

void animation_in_park()
{
	change_color(1);
	int park_space_residue = park_space - park_car_number+1;//新车与最后方车辆间隔
	while (park_space_residue--)
	{
		Sleep(100);
		system("cls");
		int i = 1;
		change_color(1);
		cout << "停车场内:" << endl;
		while (i <park_car_number)
		{
			car_cout(park[i]);
			i++;
		}
		for (i = 0;i < park_space_residue;i++)
		{
			cout << endl;
		}
		car_cout(park[park_car_number]);
	}
	for (int i = 0;i < park_space - park_car_number;i++)
	{
		cout << endl;
	}
}

void animation_in_side()
{
	int t = 5;
	while (t--)
	{
		Sleep(100);
		system("cls");
		change_color(1);
		cout << "停车场内:" << endl;
		for (int i = 1;i <= park_space;i++)
			car_cout(park[i]);
		change_color(1);
		cout << "便道内:" << endl;
		if (que.Front+1 < que.Rear )
		{
			int i = que.Front;
			while(i < que.Rear-1)
			{
				car_cout(que.sidewalk[i]);
				i++;
			}
		}
		for (int i = 0;i < t;i++)
		{
			cout << endl;
		}
		car_cout(que.sidewalk[que.Rear - 1]);
	}
	menu();
}

void menu()
{
	change_color(1);
	cout << "********星树*********" << endl
		<< "*       1:新车入场   *" << endl
		<< "*      2:车离场      *" << endl
		<< "* 3:显示当前场地情况 *" << endl
		<< "**********************" << endl;
	char c;
	cin >> c;
	switch (c)
	{
	case'1':
		in_car();
		break;
	case'2':
		out_car();
		break;
	case'3':
		system("cls");
		print_park();
		print_side();
		menu();
		break;
	default:
		string error_input;
		cin >> error_input;
		cout << "输入错误";
		Sleep(1000);
		system("cls");
		menu();
		break;
	}
	return;
}
int  compare_park(string s)
{
	int i = 0;
	while (i <=park_car_number)
	{
		if (strcmp(s.c_str(), park[i].cp.c_str()) == 0)
		{
			return i;
		}
		i++;
	}
	return -1;
}

int compare_side(string s)
{
	int i = 0;
	while (i <= que.Rear-que.Front)
	{
		if (strcmp(s.c_str(), que.sidewalk[que.Front + i].cp.c_str()) == 0)
		{
			return i;
		}
		i++;
	}
	return -1;
}

int main()
{
	
	cout << "请输入停车场容量:" << endl;
	cin >> park_space;
	init_Queue(que);
	menu();
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值