Как упорядочить экземпляры структуры на основе значения члена - PullRequest
0 голосов
/ 16 апреля 2019

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

Вот пример кода того, что я делаю

int main(void)
{
    struct Cars{
        int priority;
    };

    struct Cars c1;
    struct Cars c2;
    struct Cars c3;
    struct Cars c4;

    c1.priority=2;
    c2.priority=1;
    c3.priority=3;
    c4.priority=0;

    int Priorities[4] = {c1.priority,c2.priority,c3.priority,c4.priority};

    int Order[4];
}

Что я пытаюсь сделатьdo пытается выяснить, как заполнить массив Order идентификатором автомобиля, который находится рядом с проходом.Как и в этом примере, я хочу, чтобы массив Order был [4,2,1,3].0 является наивысшим приоритетом, 3 - наименьшим

Хотя вы могли бы помочь мне еще больше, если бы вы могли выяснить, КАКОЙ АВТОМОБИЛЬ имеет какой приоритет, поэтому я мог бы написать несколько if, например:

if(the car with priority 0 has passed AND the car with priority 1 has passed)
{
    car with priority 2 can pass
}

1 Ответ

0 голосов
/ 16 апреля 2019

Возможно, вам будет лучше сначала с помощью переменной «пройдено» как части Cars, а на самом деле, возможно, переименовать Cars в Car, поскольку она представляет только одну машину.Это может помочь вам лучше представить проблему.

struct Car{
    int priority;
    int passed; // lets set this to 1 if passed
};

И структура пересечения

struct Intersection
{
    struct Car cars[4]; // let's give an intersection 4 cars
}

Установите структуру пересечения с некоторыми автомобилями, инициализируя их «переданную» переменную равной 0, что означает «не прошел'.

struct Intersection intersection;

// set the car priority
intersection.cars[0].priority = 2;
intersection.cars[1].priority = 1;
intersection.cars[2].priority = 3;
intersection.cars[3].priority = 0;

intersection.cars[0].passed = 0;
intersection.cars[1].passed = 0;
intersection.cars[2].passed = 0; /** Could do a loop here to initialize instead! */
intersection.cars[3].passed = 0;

Вы можете использовать цикл, цикл до тех пор, пока все автомобили не пройдут

Пример программы (не очень эффективный), так как я принимаю во внимание вероятность того, что вы новичок в C ивероятно, еще не выучили подобные списки или указатели и т. д.

#include <stdio.h>

int main()
{
    struct Car{
        int priority;
        int passed;
    };

    // four cars per intersection
    struct Intersection{
        struct Car cars[4];
    };

    struct Intersection intersection;

    // set the car priority
    intersection.cars[0].priority = 2;
    intersection.cars[1].priority = 1;
    intersection.cars[2].priority = 3;
    intersection.cars[3].priority = 0;

    intersection.cars[0].passed = 0;
    intersection.cars[1].passed = 0;
    intersection.cars[2].passed = 0;
    intersection.cars[3].passed = 0;

    // keep looping until all cars passed
    while (!intersection.cars[0].passed ||
        !intersection.cars[1].passed ||   /* <--- this could be improved !! */
        !intersection.cars[2].passed ||
        intersection.cars[3].passed)
    {

        int best_priority = -1;
        int best_car_index = -1;

        // look for next car that can pass
        for (int i = 0; i < 4; i++)
        {
            // this car hasn't passed yet -- check priority
            if (!intersection.cars[i].passed)
            {
                           // if not found a car yet to pass or this car is better, then choose this one so far...                  
                if ((best_priority == -1) || (intersection.cars[i].priority < best_priority))
                {
                    best_car_index = i;
                    best_priority = intersection.cars[i].priority;
                }
            }
        }

        if (best_car_index == -1)
            break; // nothing found
        else
        {
            // set the car with best priority to 'passed'
            intersection.cars[best_car_index].passed = 1;

            printf("Car ID %d with priority %d just passed the intersection!\r\n", best_car_index, best_priority);
        }
    }

    return 0;

}

Вывод программы

Car ID 3 with priority 0 just passed the intersection!
Car ID 1 with priority 1 just passed the intersection!
Car ID 0 with priority 2 just passed the intersection!
Car ID 2 with priority 3 just passed the intersection!

Программа, вероятно, не делает то, что вы хотите, но, надеюсь, вы будетев состоянии манипулировать им так, как вы хотите.

(Вы можете заполнить новый список вместо печати данных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...