用数据结构中的队列和C语言编写某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围内的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。从本地text.txt文件中读取每位客户到达时间和需要办理业务的时间。
时间: 2023-06-23 13:08:29 浏览: 136
以下是基于队列的C语言程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_QUEUE_SIZE 100 // 队列最大长度
#define MAX_SERVICE_TIME 10 // 最大业务办理时间
#define MIN_SERVICE_TIME 1 // 最小业务办理时间
// 客户结构体
typedef struct {
int arrive_time; // 到达时间
int service_time; // 业务办理时间
int start_time; // 开始办理时间
int end_time; // 结束办理时间
} Customer;
// 队列结构体
typedef struct {
Customer data[MAX_QUEUE_SIZE];
int front; // 队头指针
int rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = queue->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(Queue *queue) {
return queue->front == queue->rear;
}
// 判断队列是否已满
int isQueueFull(Queue *queue) {
return (queue->rear + 1) % MAX_QUEUE_SIZE == queue->front;
}
// 入队
int enQueue(Queue *queue, Customer customer) {
if (isQueueFull(queue)) {
return 0;
}
queue->data[queue->rear] = customer;
queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE;
return 1;
}
// 出队
int deQueue(Queue *queue, Customer *customer) {
if (isQueueEmpty(queue)) {
return 0;
}
*customer = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_QUEUE_SIZE;
return 1;
}
int main() {
Queue queue;
initQueue(&queue);
int total_idle_time = 0; // 总空闲时间
int total_wait_time = 0; // 总等待时间
int total_serve_time = 0; // 总办理时间
int total_customer = 0; // 客户总数
int current_time = 0; // 当前时间
int service_start_time = 0; // 当前业务开始时间
int service_end_time = 0; // 当前业务结束时间
srand(time(NULL)); // 初始化随机种子
FILE *fp = fopen("text.txt", "r"); // 打开文件
if (fp == NULL) {
printf("File open failed!\n");
return -1;
}
while (!feof(fp)) {
int arrive_time, service_time;
fscanf(fp, "%d %d", &arrive_time, &service_time); // 从文件中读取数据
Customer customer = {arrive_time, service_time, 0, 0};
if (customer.arrive_time >= current_time) { // 业务人员空闲
total_idle_time += customer.arrive_time - current_time;
service_start_time = customer.arrive_time;
} else { // 业务人员忙碌
service_start_time = current_time;
}
service_end_time = service_start_time + customer.service_time; // 计算业务结束时间
customer.start_time = service_start_time;
customer.end_time = service_end_time;
enQueue(&queue, customer); // 将客户加入队列
total_serve_time += customer.service_time; // 更新总办理时间
current_time = customer.arrive_time; // 更新当前时间
while (!isQueueEmpty(&queue)) {
Customer front;
if (deQueue(&queue, &front)) {
total_wait_time += current_time - front.arrive_time; // 更新总等待时间
current_time = front.end_time; // 更新当前时间
total_customer++; // 更新客户总数
} else {
break;
}
}
}
fclose(fp); // 关闭文件
printf("Total idle time: %d\n", total_idle_time);
printf("Average waiting time: %.2f\n", (float)total_wait_time / total_customer);
return 0;
}
```
程序中使用了两个结构体,一个是客户结构体,包括客户到达时间、业务办理时间、开始办理时间和结束办理时间;另一个是队列结构体,包括队列数据和队头、队尾指针。程序中使用了队列来模拟客户排队等待办理业务的过程。
程序中先从文件中读取客户到达时间和需要办理业务的时间,然后判断业务人员是否空闲,计算业务开始时间和结束时间,并将客户加入队列。接着,程序从队列中取出客户进行业务办理,更新总等待时间、客户总数和当前时间。最后统计总空闲时间和平均等待时间,并输出结果。
程序中使用了随机数生成客户的业务办理时间,为了使结果更加真实,可以根据实际情况调整最大和最小业务办理时间。
阅读全文