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;

}

相关推荐
贾斯汀玛尔斯8 小时前
每天学一个算法--LSM-Tree(Log-Structured Merge Tree)
java·算法·lsm-tree
bzmK1DTbd9 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
Rust研习社9 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
kyriewen119 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
SunnyByte11 小时前
C语言——贪吃蛇的实现
c语言·单链表·贪吃蛇
其实防守也摸鱼11 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河11 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
AlunYegeer12 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
浅念-12 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先