C语言电梯模拟程序.docxC语言电梯模拟程序
一直以来我对电梯很感兴趣,起初认为用C语言不可能实现电梯模拟,需要多线程的支持,因此一直以来也没有想着做。最近数据结构****题书的这道题引起了我的注意,通过几天的努力终于实现了,先将程序的实现与大家分享出来。
在这个程序关键是处理好电梯运行状态转换与乘客进出的同步进行。好在题目要求每次输入时要输入下一个乘客到来的时间,使得程序变简单了。通过一个模拟时钟,根据模拟时钟判断该运行哪个函数。以下是模拟时钟的代码。
[cpp] view plaincopy
void DoTime(){
//此函数用于模拟时钟
while(1){
if(Time>MaxTime)
return;
TestPeople();//两个始终都会被调用的函数
Controler();
struct Activity* p=activ;
if(p==NULL){
Time=MaxTime;
}
if(p&&Time>=p->time){//取出活动队头的,检测定时是否到了
activ=p->next;
p->fn();
free(p);
}
Time++;
}
}
在这个先不管TestPeople()、Controler()是什么,其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。以下是Activity的具体定义。
[cpp] view plaincopy
typedef struct Activity{
int time;
void(*fn)(void);
struct Activity* next;
}Activity;
以及全局变量activity
[cpp] view plaincopy
Activity activity={0,NULL,NULL};
下面的代码用于将一个函数加入activity链表,这是根据时钟值从小到大插入activity的。
[cpp] view plaincopy
void AddAct(int time,void(*fn)(void)){//将一个活动加入定时器,时间到了会调用这个函数
time=Time+time; //这个函数参数必须是void,返回值也必须是void
struct Activity* act;
act=(struct Activity*)malloc(sizeof(struct Activity));
act->next=NULL;
act->fn=fn;
act->time=time;
struct Activity* p=&activity;
while(p->next!=NULL){
if(p->next->time>time)
break;
p=p->next;
}
act->next=p->next;
p->next=act;
}
一个简单的活动加入计时器。
[cpp] view plaincopy
void Input(void){//输入人员信息,这个需要手动调用一次,之后就根据定时器调用了
Person* p = (Person*)malloc(sizeof(Person));
int infloor,outfloor,giveuptime,intertime;
while(1){
printf("请输入用户的起始楼层:");
scanf("%d",&inflo
C语言电梯模拟程序 来自淘豆网www.taodocs.com转载请标明出处.