当前位置:   article > 正文

C Primer Plus(第六版)17.12 编程练习 第4题

C Primer Plus(第六版)17.12 编程练习 第4题

// mall.c -- use the Queue interface
// compile with queue.c
#include <stdio.h>
#include <stdlib.h>    // for rand() and srand()
#include <time.h>      // for time()
#include "queue.h"     // change Item typedef
#define MIN_PER_HR 60.0

bool newcustomer(double x);   // is there a new customer?
Item customertime(long when); // set customer parameters

int main(void)
{
    Queue line,line1;
    Item temp;                // new customer data
    int hours;                // hours of simulation
    int perhour;              // average # of arrivals per hour
    long cycle, cyclelimit;   // loop counter, limit
    long turnaways = 0;       // turned away by full queue
    long customers = 0;       // joined the queue
    long served = 0,served1 = 0;          // served during the simulation
    long sum_line = 0,sum_line1 = 0;        // cumulative line length
    int wait_time = 0,wait_time1 = 0;        // time until Sigmund is free
    double min_per_cust;      // average time between arrivals
    long line_wait = 0,line_wait1 = 0;       // cumulative time in line 
    
    InitializeQueue(&line);
    InitializeQueue(&line1);
    srand((unsigned int) time(0)); // random initializing of rand()
    puts("Case Study: Sigmund Lander's Advice Booth");
    puts("Enter the number of simulation hours:");
    scanf("%d", &hours);
    cyclelimit = MIN_PER_HR * hours;
    puts("Enter the average number of customers per hour:");
    scanf("%d", &perhour);
    min_per_cust = MIN_PER_HR / perhour;
    
    for (cycle = 0; cycle < cyclelimit; cycle++)
    {
        if (newcustomer(min_per_cust))
        {
            if (QueueIsFull(&line)&&QueueIsFull(&line1))
                turnaways++;
            else
            {
                customers++;
                temp = customertime(cycle);
                if (QueueItemCount(&line) < QueueItemCount(&line1))
                    EnQueue(temp, &line);
                else
                    EnQueue(temp, &line1);
            }
        }
        if (wait_time <= 0 && !QueueIsEmpty(&line))
        {
            DeQueue (&temp, &line);
            wait_time = temp.processtime;
            line_wait += cycle - temp.arrive;
            served++;
        }
        if (wait_time1 <= 0 && !QueueIsEmpty(&line1))
        {
            DeQueue (&temp, &line1);
            wait_time1 = temp.processtime;
            line_wait1 += cycle - temp.arrive;
            served1++;
        }
        if (wait_time > 0)
            wait_time--;
        if (wait_time1 > 0)
            wait_time1--;
        sum_line += QueueItemCount(&line);
        sum_line1 += QueueItemCount(&line1);
    }
    
    if (customers > 0)
    {
        printf("customers accepted: %ld\n", customers);
        printf("         turnaways: %ld\n", turnaways);
        printf("  line:\n");       
        printf("  customers served: %ld\n", served);
        printf("average queue size: %.2f\n",(double) sum_line / cyclelimit);
        printf(" average wait time: %.2f minutes\n",(double) line_wait / served);
        printf("  line1:\n");
        printf("  customers served1: %ld\n", served1);
        printf("average queue1 size: %.2f\n",(double) sum_line1 / cyclelimit);
        printf(" average wait time1: %.2f minutes\n",(double) line_wait1 / served1);
    }
    else
        puts("No customers!");
    EmptyTheQueue(&line);
    


    puts("Bye!");
    
    return 0;
}

// x = average time, in minutes, between customers 
// return value is true if customer shows up this minute
bool newcustomer(double x)
{
    if (rand() * x / RAND_MAX < 1)
        return true;
    else
        return false;
}

// when is the time at which the customer arrives
// function returns an Item structure with the arrival time
// set to when and the processing time set to a random value
// in the range 1 - 3
Item customertime(long when)
{
    Item cust;
    
    cust.processtime = rand() % 3 + 1;
    cust.arrive = when;
    
    return cust;
}
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/181988
推荐阅读
相关标签
  

闽ICP备14008679号