❶ 操作系统模拟电梯调度算法c语言程序
这是数学建模的题目,太难了。
只能给点提示,希望有用。一,用到随机函数。二,调度算法为FIFO和电梯调度。参考操作系统。三,文件io用到#include
<fstream>头文件
❷ c语言电梯调度
为什么没人来回答呢??
❸ C语言一道编程题,关于电梯调度运行的。
这个问题主要还是一个物理题,相信都坐电梯,但没有仔细研究,它的运行过程就是一个需求:
1、按下X楼层,并记录按下的时间顺序;1.1、当前电梯不在此楼层;1.2、电梯在此楼层;
2、若电梯不在此楼层,先运行至此楼层开门,否则直接开门,消除请求信息;
3、电梯先加速,再匀速,再减速至X楼层;
4、如果去X楼层的途中,遇到有同向的楼层按下,则先停靠在该楼层,然后再进行步骤3;
5、运行至X楼层后,消除当前请求X楼层信息,如果有其他楼层已经按下,则转到最先按下的楼层的方向(中途有其他的请求,顺便带上),如果没有请求,则停止在X楼,等待!
6、两部电梯的话,主要考虑哪个有空闲,只要空闲就优先执行重复以上1~5步骤。
数据结构的话主要有:电梯当前所在楼层,目标楼层X,中途请求系列,是否已完成;
问题是属于比较复杂的那种,还是要自己多思考思考怎么写文档才是,越详细越好,想清楚了,实现应该是比较简单的!
❹ 20分!求助大神,帮忙编个小程序。。。电梯调度算法模拟(用c语言编写)
没那么简单
❺ 求C++版电梯调度算法源程序
http://www.pudn.com/downloads119/sourcecode/os/detail508607.html
❻ 有c语言模拟调度算法吗
/*本c程序为按优先数的进程调度*/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct pcb)
struct pcb
{ int pid;
struct pcb *next;
int time;
int priority;
char status;
};
int n,m;
struct pcb *head,*runpcb;
main()
{ struct pcb *pcbi;
char str;
struct pcb *cshlist();
void insertproc(struct pcb *insproc);
void pintlist(struct pcb *L);
void execproc();
void delproc();
m=0;
head=cshlist();
printf("first linelist is:\n");
pintlist(head);
while(head!=NULL)
{ scanf("%c",&str);
runpcb=head;
head=runpcb->next;
runpcb->status='Z';
printf("output linelist is:\n");
printf("%d\n",m);
printf("%2d %5d %5d %3c\n",runpcb->pid,runpcb->time,runpcb->priority,runpcb->status);
pintlist(head);
printf("\n");
printf("\n");
execproc();
m=m+1;
if(runpcb->time==0)
delproc();
else insertproc(runpcb);
}
}
void pintlist(struct pcb *L)
{
struct pcb *p;
int i;
p=L;
if(L!=NULL)
do
{ printf("%2d %5d %5d %3c\n",p->pid,p->time,p->priority,p->status);
p=p->next;
}while (p!=NULL);
}
struct pcb *cshlist()
{
struct pcb *ql;
n=0;
ql=(struct pcb *)malloc(LEN);
ql->pid=n+1;
ql->status='R';
printf("enter time and priority:\n");
scanf("%ld,%d",&ql->time,&ql->priority);
head=NULL;
while(ql->time!=0)
{
n=n+1;
insertproc(ql);
ql=(struct pcb *)malloc(LEN);
printf("enter timeand priority:\n");
ql->pid=n+1;
ql->status='R';
}
return(head);
}
void insertproc(struct pcb *insproc)
{
struct pcb *p0,*p1,*p2;
int pri;
p1=head;
p0=insproc;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
pri=p0->priority;
if(p1->priority<=pri)
{
p0->next=head;
head=insproc;
}
else
{
while((p1->next!=NULL)&&(p1->priority>pri))
{ p2=p1;
p1=p1->next;
}
if((p1->next!=NULL)||(p1->priority<=pri))
{
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
}
}
void execproc()
{
runpcb->time=runpcb->time-1;
runpcb->priority=runpcb->priority-1;
}
void delproc()
{
struct pcb *p;
p=runpcb;
p->status='E';
printf("process P");
printf("%d",p->pid);
printf(" is finish\n");
printf("\n");
free(runpcb);
}
优先数调度算法方面和时间片轮转调度算法(再给你个c++的)
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
int n;
class PCB
{
public:
int pri;//进程优先数
int runtime;//进程运行CPU时间
int pieceOftime;//轮转时间片
string procname;//进程名
string state;//进程状态
int needOftime;//还需要时间
int Counter;
PCB * next;
};
PCB * run = NULL;
PCB * ready = NULL;
PCB * finish = NULL;
PCB * tial = ready;
void Dtime(int t);
void Prinft(int a)
{
if(a==1)
{
cout<<"进程名称"<<"\t"<<"优先数"<<"\t"<<"还需要时间"<<"\ t"<<"已运行时间"<<"\t"<<"状态:"<<endl;
}
else
cout<<"进程名称"<<"\t"<<"已运行时间"<<"\t"<<"还需要时间"<< "\t"<<"计数器"<<"\t"<<"时间片"<<"\t"<<"状态"<<endl;
}
void Prinft(int b,PCB * p)
{
if(b==1)
{
cout<<p->procname<<"\t\t"<<p->pri<<"\t"<<p->needOftime<<"\t\t"<<p->runtime<<"\t\t"<<p->state<<endl;
}
else
cout<<p->procname<<"\t\t"<<p->runtime<<"\t\t"<<p->needOftime<<"\t\t"<<p->Counter<<"\t"<<p->pieceOftime<<"\t"<<p->state<<endl;
}
void display(int c)
{
PCB *p;
if(run!=NULL) /*如果运行指针不空*/
Prinft(c,run); /*输出当前正在运行的PCB*/
//Dtime(2);
p=ready; /*输出就绪队列PCB*/
while(p!=NULL)
{
Prinft(c,p);
p=p->next;
}
//Dtime(2);
p=finish; /*输出完成队列的PCB*/
while(p!=NULL)
{
Prinft(c,p);
p=p->next;
}
}
void insert(PCB *p)//插入就绪队列按Pri大小
{
PCB *S1,*S2;
if(ready==NULL)
{
p->next = NULL;
ready = p;
}
else
{
S1 = ready;
S2 = S1;
while(S1!=NULL)
{
if(S1->pri >= p->pri)
{
S2 = S1;
S1 = S1->next;
}
else
break;
}
if(S2->pri >= p->pri)
{
S2->next = p;
p->next = S1;
}
else
{
p->next = ready;
ready = p;
}
}
}
bool CTProcessOfPri()
{
PCB * Node;
cout <<"输入创建进程的数目:"<<endl;
cin >>n;
for(int j = 0;j < n; j++)
{
Node = new PCB;
if(Node==NULL)
return false;
else
{
cout <<"输入进程的名称,进程需CPU时间:"<<endl;
cin >>Node->procname>>Node->needOftime;
Node->runtime = 0;
Node->state ="就绪";
Node->pri =Node->needOftime;
cout <<"进程"<<Node->procname<<"创建完毕!"<<endl;
}
insert(Node);
}
return true;
}
void priority(int i)
{
run = ready;
ready = ready->next;
run->state = "运行";
Prinft(i);
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
{
run->runtime=run->runtime+1;
run->needOftime=run->needOftime-1;
run->pri=run->pri-1; /*每运行一次优先数降低1个单位*/
if(run->needOftime==0) /*如所需时间为0将其插入完成队列*/
{
run->state = "完成";
run->next = finish;
finish = run;
run=NULL; /*运行队列头指针为空*/
if(ready!=NULL) /*如就绪队列不空*/
{
run = ready;
run->state = "运行";
ready = ready->next;
}
}
else if((ready!=NULL)&&(run->pri<ready->pri))
{
run->state="就绪";
insert(run);
run = ready;
run->state = "运行";
ready = ready->next;
}
display(i); /*输出进程PCB信息*/
}
}
void queue(PCB *p)
{
if(ready==NULL)
{
p->next = NULL;
ready = p;
tial = p;
}
else
{
tial->next = p;
tial = p;
p->next = NULL;
}
}
bool CTProcessOfRuntime()
{
PCB * Node;
int m;
cout <<"输入创建进程的数目:"<<endl;
cin >>n;
cout <<"输入时间片:"<<endl;
cin >>m;
for(int j = 0;j < n; j++)
{
Node = new PCB;
if(Node==NULL)
return false;
else
{
cout <<"输入进程的名称,进程需CPU时间:"<<endl;
cin >>Node->procname>>Node->needOftime;
Node->runtime = 0;
Node->state ="就绪";
Node->Counter = 0;
Node->pieceOftime = m;
cout <<"进程"<<Node->procname<<"创建完毕!"<<endl;
}
queue(Node);
}
return true;
}
void Runtime(int c)
{
run = ready;
ready = ready->next;
run->state = "运行";
Prinft(c);
while(run!=NULL)
{
run->runtime=run->runtime+1;
run->needOftime=run->needOftime-1;
run->Counter = run->Counter + 1;
if(run->needOftime==0)
{
run->state = "完成";
run->next = finish;
finish = run;
run = NULL;
if(ready!=NULL)
{
run = ready;
ready = ready->next;
}
}
else if(run->Counter == run->pieceOftime)
{
run->Counter = 0;
run->state = "就绪";
queue(run);
run=NULL;
if(ready!=NULL)
{
run = ready;
run->state = "运行";
ready = ready->next;
}
}
display(c);
}
}
int main()
{
int i;
cout <<"*******************************************"<<endl;
cout <<"* 1 优先数调度算法 2 循环时间片轮转算法*"<<endl;
cout <<"*************** 0 退出 *******************"<<endl;
cin >>i;
switch(i)
{
case 1:
CTProcessOfPri();
priority(i);
break;
case 2:
CTProcessOfRuntime();
Runtime(i);
break;
default:
break;
}
return 0;
{
time(& current_time);
}while((current_time-start_time)<t);
}
}
void Dtime(int t)
{
time_t current_time;
time_t start_time;
time(&start_time);
do
❼ 求电梯控制c语言程序
原地址带图片 : http://www.elevator.salebinfo.com/bbs/Dispbbs.asp?ID=253743 1 前言 电梯的电气系统由拖动系统和控制系统两部分组成。传统的电气控制系统采用的继电器逻辑控制由于触点多、故障率高、可靠性差、体积大等缺点,正逐渐被淘汰。目前电梯设计使用可编程控制器(PLC),要求功能变化灵活,编程简单,故障少,噪音低。维修保养方便,节能省工,抗干扰能力强,控制箱占地面积少。当乘员进入电梯,按下楼层按钮,电梯门自动关闭后.控制系统进行下列运作:根据轿厢所处位置及乘员所处层数.判定轿厢运行方向,保证轿厢平层时减速。将轿厢停在选定的楼层上;同时,根据楼层的呼叫,顺路停车,自动开关门。另外在轿厢内外均要有信号灯显示电梯运行方向及楼层数。 MCGS(Monitor and Control Generated System,通用监控系统)是一套用于快速构造和生成计算机监控系统的组态软件,能够在Windows平台上运行。通过对现场数据的采集处理。以动画显示、报警处理、流程控制、实时曲线、历史曲线和报表输出等多种方式。向用户提供解决实际工程问题的方案。充分利用windows图形功能完备、界面一致性好、易学易用的特点。比以往使用专用机开发的工业控制系统更具通用性.在自动化领域有着更广泛的应用。本文利用MCGS组态软件检验电梯PLC控制系统的运行情况。 2 电梯PLC控制系统 S7-200可编程控制器是德国西门子公司研制的一种新型可编程控制器。它工作可靠,功能强,存储容量大,编程方便,输出端可直接驱动2A的继电器或接触器的线圈,抗干扰能力强。因此,能够满足电梯对电气控制系统的要求。S7-200系列小型PLC(Micro PLC)可应用于各种自动化系统。紧凑的结构。低廉的成本12.b~功能强大的指令集使得S7-200 PLC成为各种小型控制任务理想的解决方案。利用西门子S7-200可编程序控制器编写一个四层电梯的控制系统。分别完成轿内指令、厅外召唤指令、楼层位置指示、平层换速控制、开门控制等控制任务。 STEP 7-Micro/WIN 32是S7-200系列的PLC的编程软件.可以对S7-200的所有功能进行编程。该软件在WindOW8平台上运行。基本操作与omce等标准WindOWS软件相类似,简单、易学。其基本功能是协助用户完成应用软件任务。例如创建用户程序、修改和编辑过程中编辑器具有简单语法检查功能。还可以直接用软件设置PLC的工作方式、参数和运行监控。 2.1 电气控制系统 图l为本系统的组成框图。 图中。输出为:l、电动机;2、上下行接触器;3、快慢速接触器;4、位置指示;5、门锁。输入为:6、轿内指令;7、厅外指令;8、门区感应;9、手动开关门;10、楼层感应。 2.2 PLC系统部分 完成所设定的控制任务所需要的PLC规模主要取决于控制系统对输入,{禽出点的需求量和控制过程的难易程度。 (1)I/O点的估算: 系统的输入点有:门厅召唤按钮6个输入点;轿内指令按钮4个点;楼层感应器4个点;门区感应l点;手动开门l点:共计输入点16点。而输出点有:快慢速接触器2点;上下行接触器2点;楼层指示灯4点;门锁1个点;共计输出点9点。总计I/O点数为16/9; (2)可编程控制器S7-200的CPU226输入,输出点数为24/16。足以满足要求。 3 电梯PLC控制系统设计 因篇幅有限。仅将电梯指示及上下行程序列出说明。 3.1楼层状态指示设计 当电梯运行至某层有指令发出时.指示位置及指令。以二层为例: 3.2电梯下行程序设计 以电梯在三层下行情况为例。当电梯的一或二层有指令时,将三层下行位置1,同时无上行,驱动电梯下行。程序说明如下: 3.3电梯上行程序设计 以电梯在二层上行情况为例。程序说明如下: 3.4电梯到达时程序设计 电梯到达某层时。将已完成的指令信号复位。以电梯到达三层为例。程序ig明如下: 4 组态软件模拟电梯PLC控制系统显示设计 MCGsm态软件具有全中文、面向窗口的可视化操作界面。实时性强,有良好的并行处理性能和丰富生动的多媒体画面。MCGSm态软件的开放式结构拥有广泛的数据获取和强大的数据处理功能。同时。提供良好的安全机制,为多个不同级别用户设定不同的操作权限。MCGS组态软件支持多种硬件设备,实现"设备无关",用户不必因外部设备的局部改动,而影响整个系统。MCGS组态软件由"MCGS组态环境"和"MCGS运行环境"两个系统组成。两部分互相独立。又紧密相关。 本文利用MCGS组态软件设计。在设备组态窗口中选择适当的串口通讯设备.添加西门子S7-200PLC。正确设置其属性。正确设置组态软件中数据变量设备通道的连接,即可实现PLC与组态软件的通讯。将PLC中的串口驱动程序与组态软件的需求响应相结合,使电脑对PLC发出的信号有响应。在MCGS组态软件的用户窗口中,制作一个动画界面。在界面上设置各个控件的属性,使设置的控件按照真实的情况动作,检验和测试电梯PLC控制系统对电梯的运行状态的控制效果。MCGS用主控窗口、设备窗口和用户窗口来构成一个应用系统的人机交互图形界面.组态配置各种不同类型和功能的对象或构构。可以对实时数据进行可视化处理。组态过程如图2所示: 5 结语 针对这个四层电梯的控制系统.本文采用西门子S7-200可编程控制器设-H-电梯的控制系统完成电梯的轿内指令、厅外召唤指令、楼层位置指示、平层换速控制、开门控制等控制任务。利用MCGS组态软减设计模拟电梯PLC控制系统的运行。将PLC中的串口驱动程序与组态软件的需求响应相结合,加载驱动。使设置的控件能够按照真实的情况动作。检验和测试电梯PLC控制系统对电梯的运行状态的控制效果。实践证明。将PLC可编程控制器和MCGS组态软件结合可以非常好地模拟电梯控制系统的测试运行.有利于PLC控制系统的设-H-、检测,具有良好的应用价值。
❽ 用C语言编写一个关于电梯的程序
这是以前作的课程设计,是一个10层电梯的模拟,供楼主参考吧:
printf("上下选择:1-上楼,2-下楼\t");
scanf("%d",&input_direction);
fflush(stdin);
printf("输入该层的乘客想到达的楼层,以-1结束\n");
void check(liftor &myliftor) int flag1=0,flag2=0,flag3=0;
for(i=0;i<10;i++)
{
if(myliftor.stored_flare[i]!=0)
flag1=1;
if(myliftor.stored_flare[i]==1)
flag2=1;
if(myliftor.stored_flare[i]==2)
flag3=1;
}
if(!flag1) myliftor.set_direction(0);
else if(!flag2&&flag3) myliftor.set_direction(2);
else if(!flag3&&flag2) myliftor.set_direction(1);
int main(int argc, char *argv[])
liftor myliftor;
char flag;
int j;
myliftor.direction=1;
printf("**************************************\n");
printf("该程序用于模拟10(0-9)层的电梯控制\n");
printf("先输入按下电梯的层号及上下选\n择(类似电梯外的按钮)\n");
printf("每到一层时,输入乘客要到的楼\n层号(类似电梯内的按钮)\n");
❾ 操作系统模拟电梯调度算法C语言程序
多级反馈队列调度算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法。 多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最高的队列)的时间片一般很大(不需要考虑这个问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。 2、时刻1 J2到达。 由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。 5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。 6、时刻5 J3经过1个时间片,完成。 7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 8、时刻7 J1再经过一个时间片,完成了任务。于是整个调度过程结束。