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;

}

相关推荐
大胖丫15 分钟前
vue 学习-vite api.js
开发语言·前端·javascript
遇见很ok16 分钟前
js中 ES6 新特性详解
开发语言·javascript·es6
陈浩源同学16 分钟前
学习 TypeScript 栈和队列数据结构
前端·算法
没有晚不了安24 分钟前
1.13作业
开发语言·python
布谷歌28 分钟前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
被程序耽误的胡先生34 分钟前
java中 kafka简单应用
java·开发语言·kafka
刀客12334 分钟前
python小项目编程-中级(1、图像处理)
开发语言·图像处理·python
卷卷的小趴菜学编程39 分钟前
c++之多态
c语言·开发语言·c++·面试·visual studio code
冷琴19961 小时前
基于Python+Vue开发的反诈视频宣传管理系统源代码
开发语言·vue.js·python
夏末秋也凉1 小时前
力扣-回溯-491 非递减子序列
数据结构·算法·leetcode