|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
×
新手,想分析这个代码的整个框架但是不太会,做的是一个窗口排队管理系统
#include <stdio.h>
#include "util.h"
typedef enum
{
TYPE_A, // 业务类型A
TYPE_B, // 业务类型B
TYPE_C, // 业务类型C
TYPE_D // 业务类型D
} WindowType;
typedef enum
{
STATUS_NORMAR, //正常0
STATUS_PAUSED //暂停1
} WindowStatus;
typedef struct
{
int windowId;
WindowType type;
WindowStatus zhuangtai;
int people;
int totalrating;
int totalCustomers;
}Window;
typedef struct WNode
{
Window data;//窗口数据
struct WNode *next;
}*WinList;
WinList WL;
void CreateWin()
{
WL=NULL;
}
//获取窗口链表最后一个窗口
WinList GetTail ( )
{
if ( WL == NULL ) { //链表为空
return NULL;
} else {
WinList node = WL;
while (node->next != NULL) {
node = node->next; //遍历链表
}
return node; //返回链表的尾节点
}
}
WinList GetTail ( );
void OnWinShow(void *para);
void OnWinNew(void *para);
void OnWinDel(void *para);
void OnWinPause(void *para);
void OnWinResume(void *para);
void OnCustomerArrive(void *para);
void OnCustomerLeave(void *para);
void OnWinManage(void *para)
{
SCmd acmd[] = {{"WinShow", "窗口状态", OnWinShow},
{"WinNew", "窗口新增", OnWinNew},
{"WinDel", "窗口删除", OnWinDel},
{"WinPause", "窗口业务暂停", OnWinPause},
{"WinResume", "窗口业务恢复", OnWinResume},
{"CustomerArrive", "取号排队", OnCustomerArrive},
{"CustomerLeave", "办结离队", OnCustomerLeave}
};
CmdLoop(acmd, numof(acmd), NULL);
}
void OnWinShow(void *para)
{
if(WL==NULL){
printf("没有文件\n\n");
}
printf ( "窗口编号\t业务类型\t排队人数\t窗口状态\t窗口评分\t总接待人数\n" );
WinList P = WL;
while(P!=NULL){
Window win = P->data;
printf ("%4d\t ", win.windowId);
switch ( win.type ) { // 根据窗口所属业务类型输出对应的字母
case TYPE_A:
printf ( "A-个人现金业务\t" );
break;
case TYPE_B:
printf ( "B-个人其他业务\t" );
break;
case TYPE_C:
printf ( "C-对公现金业务\t" );
break;
case TYPE_D:
printf ( "D-对公其他业务\t" );
break;
}
int length = win.people;
printf ( "%4d\t\t", length );
switch ( win.zhuangtai ) { // 根据窗口状态输出对应的文字
case STATUS_NORMAR:
printf ( " 正常\t\t" );
break;
case STATUS_PAUSED:
printf ( " 暂停\t\t" );
break;
}
int averageRating = 0;
if (win.totalCustomers > 0) {
averageRating = win.totalrating / win.totalCustomers;
}
printf ( "%4d\t\t", averageRating );
printf ( "%4d\t\t\n", win.people );
P=P->next;
}
printf("\n");
}
//窗口新增
void OnWinNew(void *para)
{
WinList winTail = GetTail ( );
printf("请输入窗口类型(A-个人现金业务,B-个人其他业务,C-对公现金业务,D-对公其他业务)\n");
char ch;
scanf(" %c", &ch);
getchar(); // 清除换行符
if( ch>'D' || ch<'A'){
printf ( "操作失误\n\n" );
return;
}
WinList newList = ( WinList ) malloc ( sizeof ( struct WNode ));
newList->data.type= (WindowType)(ch - 'A') ;
newList->data.zhuangtai=STATUS_NORMAR;
newList->data.people = 0; // 初始化排队人数为 0
newList->data.totalCustomers=0;
newList->data.totalrating=0;
newList->next = NULL;
if(winTail==NULL){
newList->data.windowId=1;
WL=newList;
}else{
newList->data.windowId=winTail->data.windowId+1;
winTail->next = newList;
}
printf("窗口编号 %d 创建成功\n", newList->data.windowId);
}
void OnWinDel(void *para)
{
// 读取窗口编号
printf("请输入要删除的窗口编号:\n");
int windowId;
scanf("%d", &windowId);
getchar(); // 清除换行符
// 遍历窗口链表,找到要删除的窗口
WinList prev = NULL;
WinList curr = WL;
while (curr != NULL) {
if (curr->data.windowId == windowId) {
// 找到窗口,删除窗口节点
if (prev == NULL) {
// 要删除的是头节点
WL = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
printf("窗口 %d 已删除\n", windowId);
return;
}
prev = curr;
curr = curr->next;
}
// 若未找到要删除的窗口
printf("未找到窗口编号为 %d 的窗口\n", windowId);
}
//窗口业务暂停
void OnWinPause(void *para)
{
// 读取窗口编号
printf("请输入窗口编号:\n");
int windowId;
scanf("%d", &windowId);
getchar(); // 清除换行符
// 遍历窗口链表,找到对应窗口
WinList P = WL;
while (P != NULL) {
if (P->data.windowId == windowId) {
// 找到窗口,将窗口状态设置为暂停
P->data.zhuangtai = STATUS_PAUSED;
printf("窗口 %d 业务已暂停\n", windowId);
break;
}
P = P->next;
}
}
//窗口业务恢复
void OnWinResume(void *para)
{
// 读取窗口编号
printf("请输入窗口编号:\n");
int windowId;
scanf("%d", &windowId);
getchar(); // 清除换行符
// 遍历窗口链表,找到对应窗口
WinList P = WL;
while (P != NULL) {
if (P->data.windowId == windowId) {
P->data.zhuangtai = STATUS_NORMAR;
printf("窗口 %d 业务已恢复\n", windowId);
break;
}
P = P->next;
}
}
void OnCustomerArrive(void *para)
{
int windowId;
printf("请输入窗口编号:");
scanf("%d", &windowId);
getchar(); // 清除换行符
WinList P = WL;
while (P != NULL) {
if (P->data.windowId == windowId) {
if (P->data.zhuangtai == STATUS_PAUSED) {
printf("窗口暂停服务,无法取号排队\n");
return;
}
P->data.people++; // 排队人数增加
printf("窗口编号 %d 的排队人数增加为 %d\n", windowId, P->data.people);
return;
}
P = P->next;
}
printf("窗口编号 %d 不存在\n", windowId);
}
void OnCustomerLeave(void *para)
{
// 读取窗口编号
printf("请输入窗口编号:\n");
int windowId;
scanf("%d", &windowId);
getchar(); // 清除换行符
// 遍历窗口链表,找到对应窗口
WinList P = WL;
while (P != NULL) {
if (P->data.windowId == windowId) {
if (P->data.zhuangtai == STATUS_PAUSED) {
printf("窗口暂停服务,无法办理离队\n");
return;
}
// 找到窗口,将排队人数减一
if (P->data.people > 0) {
P->data.people--;
P->data.totalCustomers++;
// 读取顾客评分
printf("请输入顾客评分(1-10):\n");
int rating;
scanf("%d", &rating);
getchar(); // 清除换行符
// 更新窗口评分总和
P->data.totalrating += rating;
printf("客户办理离队成功,当前排队人数:%d\n", P->data.people);
} else {
printf("窗口 %d 没有待办客户\n", windowId);
}
break;
}
P = P->next;
}
// 若未找到对应窗口
if (P == NULL) {
printf("未找到窗口编号为 %d 的窗口\n", windowId);
}
} |
|