Lab Assignment #2 The Parking Garage The CSC326 Parking Garage contains 2 lanes,
ID: 3679259 • Letter: L
Question
Lab Assignment #2
The Parking Garage
The CSC326 Parking Garage contains 2 lanes, each capable of holding up to 10 cars. There is only a single entrance/exit to the garage at one end of the lanes.
If a customer arrives to pick up a car which is not nearest the exit, all cars blocking the cars' path are moved into the other lane. If more cars still must be moved out of the way, they go into the street. When the customer's car is driven out, all cars in the street must be put back into the garage.
Write a C++ program that reads input from a file (that you create). Each line in the file contains two fields separated by a blank: a code (A = an arriving car, or D= a car wishes to depart) and a license plate number (this could be a string). Cars are assumed to arrive and depart in the order specified by the input. The program should print a message whenever a car arrives or departs.
When a car arrives, the message should specify whether or not there is room in the garage for the car. If there is no room, the car leaves without entering. When a car departs, the message should include the number of times the car had to be moved out of the way so that other cars could depart. Each move from one lane to the other counts as 1; each move to the street counts as 1; each move from the street to a lane counts as 1. Don't forget to check for conditions such as someone wanting a car that's not in the garage, trying to park a car but both lanes are full, trying to park a car when only one lane is full, etc.
Your program should define an object from a 'garage' class to represent the 2 lanes and the street. The garage class will contain three stack objects one for each lane and the street. Use the dynamic array implementation of the stack. You'll need methods for manipulating the cars in the lanes, e.g. search for a car in a lane, move a car from a lane to somewhere, and perhaps higher-level methods likearrive and depart and methods to handle your output. This is NOT a complete list of methods needed, so feel free to experiment and expand the class definitions as much as you like. You may find it easier to have a car class or structure that contains the license plate and a counter for the number of moves the car makes.
use this stack class, and need to creat Garage class.
/ file Stack.h
// array stack implementation
#ifndef Stackh
#define Stackh
#include <cstdlib>
template<class ParkingType>
class Parking {
// LIFO objects
public:
Parking(int MaxParkingSize = 10);
~Parking() { delete[] packing; }
bool IsEmpty() const { return top == -1; }
bool IsFull() const { return top == MaxTop; }
ParkingType Top() const;
void push(const ParkingType & x);
void pop();
private:
int top; // current top of stack
int MaxTop; // max value for top
ParkingType * parking; // element array
};
template<class ParkingType>
Stack< ParkingType>::Parking(int Max ParkingSize)
{
//Pre: none'
//Post: Array of size ParkingSaize to implement stack
// Parking constructor.
MaxTop = MaxParkingSize - 1;
parking = new ParkingType[MaxParkingSize];
top = -1;
}
template<class ParkingType>
ParkingType Packing<ParkingType>::Top() const
{
//Pre: Parking is not empty
// Post: Returns top element.
if (IsEmpty())
throw logic_error("Top fails: Parking is empty");// Top fails
return Parking[top];
}
template<class ParkingType>
void Parking<ParkingType>::push(const ParkingType & x)
{
//Pre: Parking is not full
//Post: Push x to Parking.
// Parking has one more element
if (IsFull()) throw logic_error("Push fails: full stack"); // Push fails
Parking[++top] = x;
}
template<class ParkingType>
void Packing<ParkingType>::pop()
{
//Pre: Parking is not Empty
//Post: Parking has one less element
if (IsEmpty()) {
throw logic_error("Pop fails: Parking is empty");
}; // Pop fails
top--;
}
#endif
i need to put in the text file, so i need the text file to prite out everything. I do not need to count the parking time. i need to use Dynamic Array implamatation of stack to move the car. also i can see it can print out in text file.
Explanation / Answer
#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
using namespace std;
struct car
{
char code;
string license;
int hour;
int min;
int num_moves;
};
class stack
{
public:
static const int CAPACITY = 10;
typedef car STACK_TYPE; ///MODIFIED from int to car
stack(); // constructor
void push(STACK_TYPE); // add element to the stack
STACK_TYPE pop(); // return top element
bool is_empty(); // is stack empty?
bool is_full();
private:
int top;
STACK_TYPE items[CAPACITY];
};
stack::stack()
{
top=-1;//nothing on stack initially
}
void stack::push(STACK_TYPE value)
{
assert(top !=CAPACITY-1);
top++;
items[top]=value;
}
stack::STACK_TYPE stack::pop()
{
STACK_TYPE value;
assert(top>=0);
value= items[top];
top--;
return(value);
}
bool stack::is_empty()
{
if (top== -1) return true;
else return false;
}
bool stack::is_full()
{
if (top==CAPACITY-1) return true;
else return false;
}
void arriving(string &a, int &b, int &c) //prints arriving car's license & time
{
cout<<"car has been parked in the garage."<<endl;
cout<<"license plate number: "<<a <<endl;
cout<<"current time:" << b<<":";
if (c>=10) cout<<c<<endl;
else cout<<"0"<<c<<endl;
cout <<"*********************"<<endl;
}
void departing(string &a, int&b, int &c)//prints departing car's license & time
{
//cout << "Another car must be moved out of the way!";
cout<<"License: "<<a<<endl;
cout<<"Time of departure: " <<b<<":";
if (c>=10) cout<<c<<endl;
else cout<<"0"<<c<<endl;
}
void time_parked(int &a, int &b, int &c, int &d)//prints time parked
{
int hour_diff;
int min_diff;
if (d<b)//if departing minutes is less than arriving minutes
{
c--;
}
hour_diff = c-a;
min_diff = d-b;
cout<<"Time Parked: "<<hour_diff<<":";
if (min_diff>=10) cout<<min_diff<<endl;
else cout<<"0"<<min_diff<<endl;
}
void car::parkin(const stack &garage)
{
++num_moves;
garage.push(*this);
}
void print_garage();
stack garage;
stack garage2;
stack street; ///GLOBAL
int main ()
{
// stack garage;
// stack street;
car cars[100];
car temp;
int new_hour;
int new_min;
int x=0;
fstream textfile;
textfile.open("lab4.txt");
while(!textfile.eof())
{
textfile>>cars[x].code;
textfile>> cars[x].license;
if (cars[x].code =='A')
{
if (garage.is_full())
{
cout<<"Garage is full."<<endl;
cout<<"License: "<<cars[x].license<<endl;
cout<<"Moving future cars to garage2!";
if (garage2.is_full())
{
cout<<"Garage is full."<<endl;
cout<<"License: "<<cars[x].license<<endl;
}
else{
textfile>>cars[x].hour;
textfile>>cars[x].min;
arriving(cars[x].license, cars[x].hour, cars[x].min);
garage2.push(cars[x]);
}
}
else
{
textfile>>cars[x].hour;
textfile>>cars[x].min;
arriving(cars[x].license, cars[x].hour, cars[x].min);
garage.push(cars[x]);
}
}
if (cars[x].code=='D')
{
textfile>>new_hour;
textfile>>new_min;
while (!garage.is_empty())
{
temp = garage.pop();
street.push(temp);
while (temp.license!=cars[x].license)
{//backing cars from garage to street until finding the matching license car
if(!garage.is_empty())
{
temp = garage.pop();
street.push(temp);
}
}
if (temp.license!=cars[x].license)
{
cout<<"Car not found"<<endl;
cout<<"License: "<<cars[x].license;
}
else
{
departing(cars[x].license, new_hour, new_min);
time_parked(cars[x].hour, cars[x].min, new_hour, new_min);
street.pop();
}
}
while(!street.is_empty())
{
temp = street.pop();
garage.push(temp);
}
print_garage();
}
}
}
void print_garage()
{
car temp;
while (!garage.is_empty())
{
temp = garage.pop();
cout<<temp.license<<endl;
street.push(temp);
}
while(!street.is_empty())
{
temp = street.pop();
garage.push(temp);
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.