欢迎来到天天文库
浏览记录
ID:34415953
大小:97.05 KB
页数:21页
时间:2019-03-05
《c语言电梯模拟程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C语言电梯模拟程序一直以来我对电梯很感兴趣,起初认为用C语言不可能实现电梯模拟,需要多线程的支持,因此一直以来也没有想着做。最近数据结构习题书的这道题引起了我的注意,通过几天的努力终于实现了,先将程序的实现与大家分享出来。在这个程序关键是处理好电梯运行状态转换与乘客进出的同步进行。好在题目要求每次输入时要输入下一个乘客到来的时间,使得程序变简单了。通过一个模拟时钟,根据模拟时钟判断该运行哪个函数。以下是模拟时钟的代码。[cpp] viewplaincopy1.void DoTime(){ 2. //此函数用于模拟时钟 3. while(1){ 4. i
2、f(Time>MaxTime) 5. return; 6. TestPeople();//两个始终都会被调用的函数 7. Controler(); 8. struct Activity* p=activity.next; 9. if(p==NULL){ 10. Time=MaxTime; 11. } 12. if(p&&Time>=p->time){//取出活动队头的,检测定时是否到了 13. activity.n
3、ext=p->next; 14. p->fn(); 15. free(p); 16. } 17. Time++; 18. } 1.} 在这个先不管TestPeople()、Controler()是什么,其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。以下是Activity的具体定义。[cpp] viewplaincopy1.typedef struct Activity{ 2. int time; 3.
4、 void(*fn)(void); 4. struct Activity* next; 5.}Activity; 以及全局变量activity[cpp] viewplaincopy1.Activity activity={0,NULL,NULL}; 下面的代码用于将一个函数加入activity链表,这是根据时钟值从小到大插入activity的。[cpp] viewplaincopy1.void AddAct(int time,void(*fn)(void)){//将一个活动加入定时器,时间到了会调用这个函数 2. time=Time+time;
5、 //这个函数参数必须是void,返回值也必须是void 3. struct Activity* act; 4. act=(struct Activity*)malloc(sizeof(struct Activity)); 5. act->next=NULL; 6. act->fn=fn; 7. act->time=time; 8. struct Activity* p=&activity; 9. while(p->next!=NULL){ 10. if(p->next->time>time) 11
6、. break; 12. p=p->next; 13. } 14. act->next=p->next; 15. p->next=act; 16.} 一个简单的活动加入计时器。[cpp] viewplaincopy1.void Input(void){//输入人员信息,这个需要手动调用一次,之后就根据定时器调用了 2. Person* p = (Person*)malloc(sizeof(Person)); 1. int infloor,outfloor,giveuptime,intertime; 2
7、. while(1){ 3. printf("请输入用户的起始楼层:"); 4. scanf("%d",&infloor); 5. printf("请输入用户的目标的楼层:"); 6. scanf("%d",&outfloor); 7. printf("请输入用户的最长容忍时间:"); 8. scanf("%d",&giveuptime);
此文档下载收益归作者所有