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;

}

相关推荐
AI小老六2 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术3 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize3 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考17 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队20 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法