用C语言如何描述电梯的运行机制

94次

问题描述:

电梯运行的逻辑

推荐答案

2023-10-25 07:47:14

#include#include

usingnamespacestd;

structpassenger

{charname;intstart;intend;intdir;

};typedefstructLNode

{undefined

passenger P;structLNode *next;

}LNode,*LinkList;

voidInsert(LNode *C, LNode *LN)

{undefined

LN->next= C->next;

C->next =LN;

}

void del(LNode *LN)

{undefined

LNode*next2 = LN->next;

LN->next = next2->next;free(next2);

}

void finddel(LNode *LN, LinkList C)

{for (LNode *p = C; p->next != NULL; p = p->next)

{if (p->next->P.name == LN->P.name)

{undefined

del(p);break;

}

}

}

boolisempty(LinkList L)

{if (L->next ==NULL)return 1;else

return 0;

}

void Insert2(LinkList A, LinkList B, LinkList C,intdir, intfloor)

{for (LNode *p = C->next; p != NULL; p = p->next)

{if (dir == 1 && p->P.start >= floor && p->P.dir == 1)

{//查找出C中方向相同且起始楼层在电梯上方的所有节点

LNode *r = (LNode*)malloc(sizeof(LNode));

LNode*s = (LNode*)malloc(sizeof(LNode));

r->P = p->P;

s->P = p->P;for (LNode *q = A; ; q = q->next)

{//将该节点插入A中,确保其起始楼层为升序的方式

if (q->next == NULL || q->next->P.start >= r->P.start)

{undefined

Insert(q, r);break;

}

}for (LNode *q = B; ; q = q->next)

{//将该节点插入B中,确保其目标楼层为升序的方式

if (q->next == NULL || q->next->P.end >= s->P.end)

{undefined

Insert(q, s);break;

}

}

}else if (dir == 0 && p->P.start <= floor && p->P.dir == 0)

{undefined

LNode*r = (LNode*)malloc(sizeof(LNode));

LNode*s = (LNode*)malloc(sizeof(LNode));

r->P = p->P;

s->P = p->P;for (LNode *q = A; ; q = q->next)

{if (q->next == NULL || q->next->P.start <= r->P.start)

{undefined

Insert(q, r);break;

}

}for (LNode *q = B; ; q = q->next)

{if (q->next == NULL || q->next->P.end <= s->P.end)

{undefined

Insert(q, s);break;

}

}

}

}

}int finds(int m, LinkList C, intdir)

{//确定出电梯行驶方向最后停留的楼层

if (dir == 1)

{for (LNode *p = C->next; p != NULL; p = p->next)

{if (mP.start)

m= p->P.start;

}

}else{for (LNode *p = C->next; p != NULL; p = p->next)

{if (m>p->P.start)

m= p->P.start;

}

}returnm;

}intmain()

{undefined

LinkList C= (LNode*)malloc(sizeof(LNode));

C->next = NULL;//C为存储所有的乘客信息的链表

LinkList A = (LNode*)malloc(sizeof(LNode));

A->next = NULL;//A为存储某个行驶方向上,上电梯的所有乘客信息

LinkList B = (LNode*)malloc(sizeof(LNode));

B->next = NULL;//B为A中乘客的按下电梯顺序排列

int floor;//记录电梯选择运行方向时所在的楼层

int dir;//记录电梯运行的方向

cout << "请输入电梯所在楼层:";while (cin >>floor)

{cout<< "请依次输入乘客代号、起始楼层、目标楼层、行驶方向:" <

dir= 0;while (cin >>a)

{undefined

LinkList x= (LNode*)malloc(sizeof(LNode));

x->P.name =a;

cin>> x->P.start >> x->P.end >> x->P.dir;

Insert(C, x);if (x->P.start >=floor)

dir= 1;

}cin.clear();

while (!isempty(C))

{//有乘客未乘坐电梯

Insert2(A, B, C, dir, floor);//将C中满足条件的乘客放入A、B中

if(isempty(B))

floor=finds(floor, C, dir);while (!isempty(B))

{//模拟电梯往某个特定方向行驶的过程

if (dir == 1)

{//当电梯是向上行驶时

if ((A->next == NULL) || (A->next->P.start > B->next->P.end))

{//出电梯的情况

cout << "当前楼层为" << B->next->P.end << ","

<< B->next->P.name << "出电梯" <

finddel(B->next, C);//删除C中对应的乘客信息

del(B);//删除链表中该乘客的信息

}else{//进电梯的情况

cout << "当前楼层为" << A->next->P.start << ","

<< A->next->P.name << "进电梯" <

del(A);//删除链表中该乘客的信息

}

}else{//当电梯是向下行驶时

if ((A->next == NULL) || (A->next->P.start < B->next->P.end))

{undefined

cout<< "当前楼层为" << B->next->P.end << ","

<< B->next->P.name << "出电梯" <

finddel(B->next, C);

del(B);

}else{undefined

cout<< "当前楼层为" << A->next->P.start << ","

<< A->next->P.name << "进电梯" <

del(A);

}

}if (B->next != NULL && B->next->next ==NULL)

{undefined

floor= finds(B->next->P.end, C, dir);

}

}

dir= !dir;//改变行驶方向

}cout<< endl <

cout<< "请输入电梯所在楼层:";

}

system("pause");

}

其他答案

2023-10-25 07:47:14

在C语言中,可以使用多线程和条件变量来描述电梯的运行机制。每个楼层和电梯都可以表示为一个线程,电梯线程负责接收乘客请求并根据优先级选择目标楼层,楼层线程负责检测乘客的请求并通知电梯线程。

通过条件变量实现线程之间的同步和通信,电梯线程根据当前状态和目标楼层进行运行、开关门等操作,直到达到目标楼层。

这样可以模拟电梯的运行机制,并实现多个乘客同时使用电梯的情况。

知道问答相关问答

(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6