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;

}

相关推荐
靠沿1 分钟前
【优选算法】专题十八——BFS解决拓扑排序问题
算法·宽度优先
cui_ruicheng4 分钟前
C++数据结构进阶:哈希表实现
数据结构·c++·算法·哈希算法·散列表
qingcyb5 分钟前
重复 id 对应的多个对象
开发语言·python
li星野15 分钟前
[特殊字符] 模拟试卷一:C++核心与系统基础(90分钟)答案版
开发语言·c++·算法
呆瑜nuage21 分钟前
【复习系列】高频C/C++库函数手写实现指南与自定义类型的理解指南
c语言·c++·面试
天下无贼!22 分钟前
【Python】2026版——FastAPI 框架快速搭建后端服务
开发语言·前端·后端·python·aigc·fastapi
AI+程序员在路上28 分钟前
CAN 总线与 Linux SocketCAN C 语言测试程序
linux·c语言·网络
二进制星轨29 分钟前
leecode-283-移动零-算法题解
算法
Irissgwe30 分钟前
c++特殊类设计
java·开发语言·c++
老鼠只爱大米36 分钟前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素