用C语言实现窗口排队管理系统

该文章详细介绍了使用C语言编写的窗口排队管理系统,包括窗口结构体定义、初始化配置、窗口管理功能(如新增、删除、暂停/恢复)、用户排队和服务完成、窗口评分以及窗口排序功能。系统支持用户交互和主菜单操作,允许用户对窗口服务进行评分并按评分和总服务用户数排序窗口。
摘要由CSDN通过智能技术生成

窗口排队管理系统是一种常见的应用,用于帮助管理窗口服务、排队等待和用户评分等操作。本文将深入解析一段使用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); 
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值