窗口排队管理系统是一种常见的应用,用于帮助管理窗口服务、排队等待和用户评分等操作。本文将深入解析一段使用C语言实现的窗口排队管理系统代码,并对其各个功能进行详细介绍。
1. 代码结构和主要功能
1.1 窗口结构体:代码中定义了一个名为`Window`的结构体,用于表示每个窗口的属性。该结构体包含以下属性:
- 窗口编号:用于唯一标识每个窗口。
- 业务类型:指示窗口提供的服务类型。
- 队列大小:用于控制排队等待的最大用户数量。
- 员工编号:指示当前服务该窗口的员工编号。
- 暂停状态:标识窗口是否处于暂停状态。
- 评分:记录用户对该窗口服务的评分。
1.2 初始化和配置
- 业务类型数组:代码中初始化了一个业务类型的数组,用于定义不同窗口的服务类型。
- 读取配置文件:提供了一个函数`readWindowConfigurationFromFile`,用于从配置文件中读取窗口的配置信息。通过使用`fopen`函数打开文件,然后逐行读取文件内容,再使用`strtok`函数以逗号为分隔符解析每个字段,并将解析后的字段值赋给窗口结构体的相应属性。
2. 窗口管理功能
2.1 新增窗口:通过`addWindow`函数,用户可以新增一个窗口。该函数会要求用户输入窗口的相关属性,然后将窗口添加到窗口数组中。
2.2 删除窗口:通过`removeWindow`函数,用户可以删除一个窗口。用户需输入要删除的窗口编号,函数会遍历窗口数组查找匹配的窗口,并将其从数组中删除。
2.3 暂停/恢复窗口:通过`toggleWindowPauseStatus`函数,用户可以暂停或恢复一个窗口的服务。用户需输入要操作的窗口编号,函数会找到该窗口并切换其暂停状态。
2.4 用户排队和业务完成:通过`enqueueUser`和`completeService`函数,实现用户排队和完成业务的功能。`enqueueUser`函数将用户添加到窗口的服务队列中,而`completeService`函数将当前服务用户的窗口状态更新,并将其从队列中移除。
3. 窗口评分功能
- 通过`rateWindowService`函数,用户可以为指定窗口进行评分。函数会提示用户输入评分值,并对输入值进行有效性检查。如果评分值在有效范围内,函数将保存评分值到文件,并更新窗口结构体的评分属性。
4. 窗口排序功能
- 代码中提供了按照评分和总服务用户数排序的功能。排序使用冒泡排序算法,通过比较相邻两个窗口的属性值,并根据需要进行交换,实现窗口的排序。排序结果可用于显示窗口的排名信息。
5. 用户交互和主菜单
- `mainMenu`函数实现了主菜单的显示和用户输入的处理。用户根据主菜单中的命令号选择相应的功能,代码使用`switch`语句根据用户选择调用相应的函数进行处理。
完整代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_WINDOWS 100 #define MAX_BUSINESS_TYPES 5 #define MAX_QUEUE_SIZE 10 //定义窗口结构体 typedef struct { int number; char businessType[50]; int queue[MAX_QUEUE_SIZE]; int queueSize; int staffNumber; int suspended; float ratings; } Window; //定义窗口数组以及业务类型数组并进行初始化 Window windows[MAX_WINDOWS]; int numWindows = 0; char businessTypes[MAX_BUSINESS_TYPES][50]; int numBusinessTypes = 0; void initializeBusinessTypes() { strcpy(businessTypes[numBusinessTypes++], "type1"); strcpy(businessTypes[numBusinessTypes++], "type2"); strcpy(businessTypes[numBusinessTypes++], "type3"); strcpy(businessTypes[numBusinessTypes++], "type4"); } //配置文件读取函数 void readWindowConfigurationFromFile(const char* filename) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("无法打开配置文件。\n"); return; } char line[100]; while (fgets(line, sizeof(line), file)) { line[strcspn(line, "\r\n")] = '\0'; char* token = strtok(line, ","); if (token != NULL) { Window window; window.number = atoi(token); token = strtok(NULL, ","); strcpy(window.businessType, token); token = strtok(NULL, ","); window.suspended= atoi(token); token = strtok(NULL, ","); window.queueSize=atoi(token); windows[numWindows++] = window; } } fclose(file); } void read(const char* filename) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("无法打开配置文件。\n"); return; } char line[100]; while (fgets(line, sizeof(line), file)) { line[strcspn(line, "\r\n")] = '\0'; char* token = strtok(line, ","); if (token != NULL) { Window window; window.number = atoi(token); token = strtok(NULL, ","); window.ratings = atof(token); windows[numWindows++] = window; } } fclose(file); } void rateWindowService(Window* window) { float ratings; printf("请输入分数(0-10):"); scanf("%f", &ratings); if (ratings < 0 || ratings > 10) { printf("无效的评分值。评分必须在0到10之间。\n"); return; } window->ratings = ratings; FILE* file = fopen("ratings.txt", "a"); if (file == NULL) { printf("无法打开评分文件。\n"); return; } fprintf(file, "%d,%.2f\n", window->number, ratings); fclose(file); printf("感谢您为窗口 %d 提供评分,评分为 %.2f。\n", window->number, ratings); } void sortByRating() { for (int i = 0; i < numWindows - 1; i++) { for (int j = 0; j < numWindows - i - 1; j++) { if (windows[j].ratings < windows[j + 1].ratings) { Window temp = windows[j]; windows[j] = windows[j + 1]; windows[j + 1] = temp; } } } } void displayWindowsByRating() { read("ratings.txt"); sortByRating(); printf("按评分排序的窗口:\n"); for (int i = 0; i < numWindows; i++) { printf("窗口 %d ,评分:%.2f\n", windows[i].number, windows[i].ratings); } } Window* findWindowByBusinessType(char* businessType) { for (int i = 0; i < numWindows; i++) { if (strcmp(windows[i].businessType, businessType) == 0 && !windows[i].suspended) { return &windows[i]; } } return NULL; } void addUserToWindowQueue(Window* window) { if (window->queueSize == MAX_QUEUE_SIZE) { printf("窗口 %d 的队列已满。\n", window->number); return; } } void processBusinessCompletion(Window* window) { if (window->queueSize == 0) { printf("窗口 %d 的队列为空。\n", window->number); return; } int customerId = window->queue[0]; printf("用户 %d 在窗口 %d 完成业务。\n", customerId, window->number); // 移动队列以删除第一个顾客 for (int i = 0; i < window->queueSize - 1; i++) { window->queue[i] = window->queue[i + 1]; } window->queueSize--; } void printQueueStatus() { for (int i = 0; i < numWindows; i++) { printf("窗口 %d - 业务类型:%s,队列大小:%d\n", windows[i].number, windows[i].businessType, windows[i].queueSize); } } void sortByQueueSize() { for (int i = 0; i < numWindows - 1; i++) { for (int j = 0; j < numWindows - i - 1; j++) { if (windows[j].queueSize < windows[j + 1].queueSize) { Window temp = windows[j]; windows[j] = windows[j + 1]; windows[j + 1] = temp; } } } } void displayWindowsByTotalCustomersServed() { sortByQueueSize(); printf("按总服务用户数排序的窗口:\n"); for (int i = 0; i < numWindows; i++) { printf("窗口 %d - 业务类型:%s,队列大小:%d\n", windows[i].number, windows[i].businessType, windows[i].queueSize); } } //主菜单 void mainMenu() { printf(" << 窗口排队管理系统 >>\n"); printf("****************************************\n"); printf("命令号 功能 \n"); printf(" 1. 窗口新增 \n"); printf(" 2. 窗口删除\n"); printf(" 3. 窗口业务暂停/恢复\n"); printf(" 4. 取号排队\n"); printf(" 5. 办结离队\n"); printf(" 6. 窗口状态\n"); printf(" 7. 评价窗口服务\n"); printf(" 8. 按总服务用户数显示窗口\n"); printf(" 9. 按评分显示窗口\n"); printf(" \n"); printf(" 10. 清屏 \n "); printf("11. 帮助 \n"); printf(" 0. 退出\n"); printf("==============================================\n"); printf("请输入您的选择:"); } //用于添加窗口服务 void addWindow() { if (numWindows >= MAX_WINDOWS) { printf("已达到最大窗口数。\n"); return; } Window window; printf("请输入窗口号码:"); scanf("%d", &window.number); printf("请输入业务类型:"); scanf("%s", window.businessType); printf("请输入员工编号:"); scanf("%d", &window.staffNumber); window.queueSize = 0; window.suspended = 0; window.ratings = 0.0; windows[numWindows++] = window; printf("窗口添加成功。\n"); } //用于移除指定窗口服务 void removeWindow() { int windowNumber; printf("请输入要移除的窗口号码:"); scanf("%d", &windowNumber); int windowIndex = -1; for (int i= 0; i < numWindows; i++) { if (windows[i].number == windowNumber) { windowIndex = i; break; } } if (windowIndex == -1) { printf("未找到窗口。\n"); return; } if (windows[windowIndex].queueSize > 0) { printf("无法移除具有活动队列的窗口。\n"); return; } for (int i = windowIndex; i < numWindows - 1; i++) { windows[i] = windows[i + 1]; } numWindows--; printf("窗口移除成功。\n"); } //用于暂停或恢复指定窗口服务 void suspendResumeWindow() { int windowNumber; printf("请输入要暂停/恢复的窗口号码:"); scanf("%d", &windowNumber); int windowIndex = -1; for (int i = 0; i < numWindows; i++) { if (windows[i].number == windowNumber) { windowIndex = i; break; } } if (windowIndex == -1) { printf("未找到窗口。\n"); return; } windows[windowIndex].suspended = !windows[windowIndex].suspended; if (windows[windowIndex].suspended) { printf("窗口已暂停。\n"); } else { printf("窗口已恢复。\n"); } } //向指定窗口队列中添加用户 void addUserToQueue() { int windowNumber; printf("请输入要将用户添加到队列的窗口号码:"); scanf("%d", &windowNumber); int windowIndex = -1; for (int i = 0; i < numWindows; i++) { if (windows[i].number == windowNumber) { windowIndex = i; break; } } if (windowIndex == -1) { printf("未找到窗口。\n"); return; } if (windows[windowIndex].suspended) { printf("窗口已暂停,无法向队列中添加用户。\n"); return; } if (windows[windowIndex].queueSize >= MAX_QUEUE_SIZE) { printf("窗口队列已满。\n"); return; } int userID; printf("请输入用户ID:"); scanf("%d", &userID); windows[windowIndex].queue[windows[windowIndex].queueSize++] = userID; printf("用户已添加到窗口 %d 的队列。\n", windowNumber); } float ratings; //处理窗口业务完成 void processBusinessCompletion() { int windowNumber; printf("请输入要处理业务完成的窗口号码:"); scanf("%d", &windowNumber); int windowIndex = -1; for (int i = 0; i < numWindows; i++) { if (windows[i].number == windowNumber) { windowIndex = i; break; } } if (windowIndex == -1) { printf("未找到窗口。\n"); return; } if (windows[windowIndex].queueSize == 0) { printf("窗口队列为空。\n"); return; } int userID = windows[windowIndex].queue[0]; for (int i = 0; i < windows[windowIndex].queueSize - 1;i++) { windows[windowIndex].queue[i] = windows[windowIndex].queue[i + 1]; } windows[windowIndex].queueSize--; printf("用户 %d 在窗口 %d 完成业务。\n", userID, windowNumber); } void a(){ int windowNumber; printf("请输入要评分的窗口号码:"); scanf("%d", &windowNumber); int windowIndex = -1; for (int i= 0; i < numWindows; i++) { if (windows[i].number == windowNumber) { windowIndex = i; break; } } if (windowIndex == -1) { printf("未找到窗口。\n"); return ; } rateWindowService(&windows[windowIndex], ratings); return ; } int main() { readWindowConfigurationFromFile("window_config.txt"); initializeBusinessTypes(); int choice; do { mainMenu(); scanf("%d", &choice); switch (choice) { case 1: addWindow(); break; case 2: removeWindow(); break; case 3: suspendResumeWindow(); break; case 4: addUserToQueue(); break; case 5: processBusinessCompletion(); break; case 6: printQueueStatus(); break; case 7: a(); break; case 8: displayWindowsByTotalCustomersServed(); break; case 9: displayWindowsByRating(); break; case 10: system("cls"); break; case 11: printf("iPhone number is 1xxxxxxxxxx\n"); break; case 0: printf("程序已退出。\n"); break; case 15: read("ratings.txt"); default: printf("无效的选项,请重试。\n"); break; } printf("\n"); } while (choice != 0);//exit(0); }