Моделирование банковской очереди с несколькими клиентами в c - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть это задание, в котором я должен составить программу очередей, которая подсчитывает, сколько клиентов, обслуживаемых каждым клиентом, в конце концов (эта программа имеет 2 обслуживания клиентов). Я пытаюсь с этим кодом, но когда я пытаюсь напечатать cs-> count, он ничего не дал на экран.

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

Первый код, который у меня есть, это структура adt

typedef struct{
  int ID;
  int time;
  int count;
  bool serving;
}employee;

typedef struct{
  char ID[3];
  int code;
  int arrivalTime;
  int timeNeeded;
  employee servedBy;
}nasabah;

, и модули для этого объявления:

nasabah inputNasabah(nasabah *n) // to initialize customer's data
{
  printf("Customer's ID : ");
  scanf("%s", (*n).ID);
  printf("Customer's need (type '1' for teller or '2' for Customer Service) : ");
  scanf("%d", &((*n).code));
  printf("Enter your arrvial time : ");
  scanf("%d", &((*n).arrivalTime));
  printf("Transaction time needed : ");
  scanf("%d", &((*n).timeNeeded));

  printf("\n");

  return *n;
}

edit: теперь я думаю, что проблема начинается здесь, я серьезно не знаю, почему она не работает так, как это должно быть ..

void csInit(employee *a, employee *b) //to initialize cs's data
{
   a->ID = 1;
   a->time = 0;
   a->count = 0;
   a->serving = false;

   b->ID = 2;
   b->time = 0;
   b->count = 0;
   b->serving = false;
}

и этот (тот, который, я думаю, создает проблему). Этот модуль используется для определения того, какие службы обслуживания клиентов обслуживаются и сколько клиентов обслуживается этой службой. Мои логики c означают, что самый первый клиент перейдет к «а» (обслуживание первого клиента), и a-> обслуживание будет выполнено, а следующий клиент будет на уровне «b» (обслуживание второго клиента), так как «а» пока недоступно (при условии, что первый и второй клиенты имеют одинаковое время прибытия), и b-> обслуживание будет также верно. И затем приходит третий клиент, который будет обслуживаться одним клиентом, который имеет наименьшее время (глядя на a-> time или b-> time)

void servedByCS(nasabah *n, employee *a, employee *b) 
{
  csInit(a, b);

  if(a->serving == false)
  {
    n->servedBy = *a;
    a->time = a->time + n->timeNeeded;
    a->count = a->count + 1;
    a->serving = true;
  }
  else if(a->serving == true)
  {
    if(a->time > b->time)
    {
        n->servedBy = *b;
        b->time = b->time + n->timeNeeded;
        b->count = b->count + 1;
        b->serving = true;
    }

    if(a->time < b->time)
    {
        a->serving = false;
        n->servedBy = *a;
        a->time = a->time + n->timeNeeded;
        a->count = a->count + 1;
        a->serving = true;
    }
   }

   if (b->serving == true)
   {
     if (b->time < a->time)
     {
        b->serving = false;
     }
   }    
}

и, наконец, мой основной драйвер содержит:

int main()
{
  nasabah *n;
  antre cs; //queue for customer 

  int i;
  int amount = 0;
  node a;

  employee *cs1, *cs2; //since there are two customer service

  printf("Input the queue lenghth : ");
  scanf("%d", &amount);

  n = (nasabah *) malloc(amount * sizeof(nasabah));

  cs = CreateQueue(); //creating queue 

  for(i = 0; i < amount; i++)
  {
      *n = inputNasabah(n + i);
      enQueue(cs, *n); //inputting customer's data into the queue
  }

  while(!isEmpty(cs))
  {
     a = deQueue(cs); //dequeue from the first customer so it can be proceed to see which customer service will be served.
     servedByCS(&a.info, cs1, cs2); //i think i got this one wrong so the program didn't work
  }

  printf("%d", cs1->count); //i try to print how many customers are served by the cs1 (first customer service), but it didn't work.

 return 0;
}

1 Ответ

0 голосов
/ 20 апреля 2020

Ваши основные проблемы:

  • сотрудники не распределены
  • serveByCS, если структура сложная и не работает 2 клиента одновременно, в противном случае отсутствует

Я добавил очередь, и nasabah вставлены в порядке их времени прибытия.

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

Отсутствует, проверьте значения из scanf, проверьте mallo c, освободите память mallo c

typedef struct{
    int ID;
    int time;
    int count;
}employee;

typedef struct nasabah nasabah;

struct nasabah{
    char ID[64];
    int code;
    int arrivalTime;
    int timeNeeded;
    employee *servedBy;
    nasabah *next;
};

static nasabah* inputNasabah(nasabah *n) // to initialize customer's data
{
    printf("Customer's ID : ");
    scanf("%s", n->ID);
    printf("Customer's need (type '1' for teller or '2' for Customer Service) : ");
    scanf("%d", &n->code);
    printf("Enter your arrival time : ");
    scanf("%d", &n->arrivalTime);
    printf("Transaction time needed : ");
    scanf("%d", &n->timeNeeded);
    printf("\n");

    return n;
}
static void employeeInit(employee *e, int id)
{
    e->ID = id;
    e->time = 0;
    e->count = 0;
}


static void serve(nasabah *n, employee *e) {
    n->servedBy = e;
    e->count++;
    if (n->arrivalTime > e->time) {
        /* if customer arrived after the employee has finished */
        e->time = n->arrivalTime + n->timeNeeded;
    } else {
        e->time += n->timeNeeded;
    }
}

static void servedByCS(nasabah *n, employee *a, employee *b)
{
    serve(n, a->time <= b->time ? a : b);
}

static void addNasabah(nasabah **root, nasabah *n) {
    nasabah *current = *root;
    if (!current || n->arrivalTime < current->arrivalTime) {
        n->next = current;
        *root = n;
        return;
    }
    while (current->next && current->next->arrivalTime < n->arrivalTime) {
        current = current->next;
    }
    n->next = current->next;
    current->next = n;
}
int main()
{
    int i;
    int amount = 0;
    nasabah *nasabahs = NULL;

    employee *cs1 = malloc(sizeof(employee));
    employee *cs2 = malloc(sizeof(employee));
    employeeInit(cs1, 1);
    employeeInit(cs2, 2);

    printf("Input the queue length : ");
    scanf("%d", &amount);

    for(i = 0; i < amount; i++)
    {
        nasabah *n = malloc(sizeof(nasabah));
        inputNasabah(n);
        addNasabah(&nasabahs, n);
    }
    for (nasabah *n = nasabahs; n; n=n->next) {
        servedByCS(n, cs1, cs2);
    }

    printf("%d\n", cs1->count);

    return 0;
}

Протестировано с

Input the queue length : 3
Customer's ID : 1
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 0
Transaction time needed : 10

Customer's ID : 2
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 1
Transaction time needed : 3

Customer's ID : 3
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 6
Transaction time needed : 5

1

И

Input the queue length : 5
Customer's ID : 1
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 0
Transaction time needed : 10

Customer's ID : 2
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 7
Transaction time needed : 2

Customer's ID : 3
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 2
Transaction time needed : 6

Customer's ID : 4
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 8
Transaction time needed : 5

Customer's ID : 5
Customer's need (type '1' for teller or '2' for Customer Service) : 1
Enter your arrival time : 9
Transaction time needed : 2

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