Я предполагаю смоделировать парковку, используя реализацию массива стека.
используя 3 базовые функции:
Push - возврат указателя на структуру.
Pop - возврат времени въезда на стоянку и вывоз автомобиля.
PopByNum - удаление автомобиля на основе идентификатора автомобиля и возврат суммы
Денег машину пришлось платить исходя из времени на стоянке. (при этом я должен использовать только pop и push).
и main будет включать цикл while, который будет имитировать рабочий день с 08:00 до 12:00, в то время как каждая запись в цикле составляет 10 минут.
каждые 10 минут приходит машина.
каждые 20 минут выходит машина.
в определенном месте в цикле автостоянка должна быть заполнена, я полагаю, что нужно подсчитать количество автомобилей, которые я отклонил, и сэкономить время первой машины, которую я отклонил.
Что в настоящее время является моей главной проблемой, моя парковка никогда не будет заполнена. Я полагаю, что проблема заключается в функции "PopByNum", я просто не могу ее найти.
Возможно, это большая перегрузка, но я подумал, что показывать только одну функцию без других было бы глупо, я также знаю, что может быть много других проблем с моим кодом, но сейчас я сосредоточен на этом только для того, чтобы понять, почему моя парковка никогда не заполняется.
В основном в «PopByNum» я пытался сделать следующее:
- найдите машину, которую мне нужно вывезти, и посчитайте расстояние до вершины массива.
- создать временную парковку и двигать машины, пока я не доберусь до машины.
- сохранить время въезда этого автомобиля, рассчитать сумму для оплаты.
- вернуть автомобили, которые я передал на временную парковку.
вернуть сумму для оплаты.
typedef struct TIME
{
int hours;
int minutes;
} Time;
typedef struct CAR
{
int id;
Time* entery_time;
} Car;
typedef struct PARKING_LOT
{
float rate_hour;
int size;
Car *stack;
int top;
} Parking_Lot;
int PLisFull(Parking_Lot* PL)
{
return PL->top == PL->size - 1;
}
int PLisEmpty(Parking_Lot* PL)
{
return PL->top == - 1;
}
Parking_Lot* PushCar(Parking_Lot* PL, int id, Time *time)
{
if (PLisFull(PL))
return PL;
Car* tmp = (Car*)malloc(sizeof(Car));
tmp->id = id;
tmp->entery_time = time;
PL->top += 1;
PL->stack[PL->top] = *tmp;
return PL;
}
Time* PopCar(Parking_Lot* PL)
{
if (PLisEmpty(PL))
return 0;
Car* tmp = (Car*)malloc(sizeof(Car));
Time *time = (Time*)malloc(sizeof(Time));
tmp[0] = PL->stack[PL->top];
time = tmp->entery_time;
PL->top -= 1;
return time;
}
float popByCarNum(Parking_Lot* PL, Time* CurrentTime, int CarID)
{
if (PLisEmpty(PL))
return 0;
int counter = 0;
for (int i = PL->top; i >= 0; i--)
{
if (PL->stack[i].id == CarID)
counter = i;
}
Parking_Lot *tmp = 0;
tmp = CreateParkingLot(tmp, PL->rate_hour,(PL->top - counter));
int id;
Time *time;
int i = PL->top;
for ( ; i > counter ; i--)
{
id = PL->stack[PL->top].id;
time = PopCar(PL);
tmp = PushCar(tmp, id, time);
}
Time* entery = 0;
entery = PopCar(PL);
float sum = CalculateRate(entery , CurrentTime, PL->rate_hour);
for (int i = (PL->top - counter); i>= 0 ; i--)
{
id = tmp->stack[tmp->top].id;
time = PopCar(tmp);
PL = PushCar(tmp, id, time);
}
return sum;
}
void main()
{
int SIZE = 3;
float rate = 30;
int timer = 800;
Time* timeOfday = timeToStruct(timer);
Time* pressure_time = timeToStruct(0);
Parking_Lot* PL = 0;
PL = CreateParkingLot(PL, rate, SIZE);
int counter = 0;
int rejected_cars = 0;
int num = 0;
int num1 = 0;
float sum = 0;
while (timeOfday->hours <= 12)
{
Time* currentTime = timeToStruct(0);
timeOfday->minutes += 10;
if (timeOfday->minutes >= 60)
{
timeOfday->hours += 1;
timeOfday->minutes -= 60;
}
if (1)
{
if (PL->top == (PL->size -1))
{
rejected_cars++;
if ((pressure_time->hours == 0) && (pressure_time->minutes == 0))
{
pressure_time->hours = timeOfday->hours;
pressure_time->minutes = timeOfday->minutes;
}
}
currentTime->hours = timeOfday->hours;
currentTime->minutes = timeOfday->minutes;
srand(time(NULL));
num1 = rand() % 9000 + 1000;
PL = PushCar(PL, num1 , currentTime);
}
if ((counter > 0) && (counter % 2 == 0))
{
srand(time(NULL));
num = rand() % (PL->top + 1);
sum += popByCarNum(PL, timeOfday, PL->stack[num].id);
}
counter++;
}
printf("The profit of the day is :%f\nThe total of rejected cars is :%d\nThe pressure start at :%0.4\n", sum, rejected_cars, TimeRepresent(pressure_time));
system("pause");
}