Что-то не так с реализацией массива стека - PullRequest
0 голосов
/ 12 апреля 2019

Я предполагаю смоделировать парковку, используя реализацию массива стека. используя 3 базовые функции:

Push - возврат указателя на структуру.

Pop - возврат времени въезда на стоянку и вывоз автомобиля.

PopByNum - удаление автомобиля на основе идентификатора автомобиля и возврат суммы Денег машину пришлось платить исходя из времени на стоянке. (при этом я должен использовать только pop и push).

и main будет включать цикл while, который будет имитировать рабочий день с 08:00 до 12:00, в то время как каждая запись в цикле составляет 10 минут. каждые 10 минут приходит машина. каждые 20 минут выходит машина.

в определенном месте в цикле автостоянка должна быть заполнена, я полагаю, что нужно подсчитать количество автомобилей, которые я отклонил, и сэкономить время первой машины, которую я отклонил.

Что в настоящее время является моей главной проблемой, моя парковка никогда не будет заполнена. Я полагаю, что проблема заключается в функции "PopByNum", я просто не могу ее найти.

Возможно, это большая перегрузка, но я подумал, что показывать только одну функцию без других было бы глупо, я также знаю, что может быть много других проблем с моим кодом, но сейчас я сосредоточен на этом только для того, чтобы понять, почему моя парковка никогда не заполняется.

В основном в «PopByNum» я пытался сделать следующее:

  1. найдите машину, которую мне нужно вывезти, и посчитайте расстояние до вершины массива.
  2. создать временную парковку и двигать машины, пока я не доберусь до машины.
  3. сохранить время въезда этого автомобиля, рассчитать сумму для оплаты.
  4. вернуть автомобили, которые я передал на временную парковку.
  5. вернуть сумму для оплаты.

    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");
            }
    
...