⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianti.txt

📁 对操作系统里的电梯调度算法进行的仿真
💻 TXT
📖 第 1 页 / 共 2 页
字号:

仿真电梯系统
#include"stdio.h"
#include"bios.h"
#include"ctype.h"
#include"dos.h"
#include"time.h"
#include"graphics.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"
#include"string.h"
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
int keyx=120,keyy=180;
time_t first;           /**/
int key;
int POSETION;  /*电梯位置*/
int PAUSE;  /*是否停止(1:停;2:不停)*/
int DIRECTION;  /*运行方向(1:向下;2:向上;0:无方向)*/
int AIMFLOOR;  /*目标楼层*/
int EXIT=0;  /*是否退出(0:不退出;1:退出)*/
int size;
int K1;
int K2;
void *buf;
struct req {int callin[10]; 
int callup[10]; 
int calldown[10];
}request;
int arw[18][16]=
   {{10,180,10,170,5,170,15,165,25,170,20,170,20,180,10,180}
   ,{10,190,10,200,5,200,15,205,25,200,20,200,20,190,10,190}
   ,{140,10,140,15,135,15,145,20,155,15,150,15,150,10,140,10}
   ,{140,45,140,40,135,40,145,35,155,40,150,40,150,45,140,45} 
   ,{140,55,140,60,135,60,145,65,155,60,150,60,150,55,140,55} 
   ,{140,80,140,75,135,75,145,70,155,75,150,75,150,80,140,80}  
   ,{140,90,140,95,135,95,145,100,155,95,150,95,150,90,140,90} 
   ,{140,115,140,110,135,110,145,105,155,110,150,110,150,115,140,115}  
   ,{140,125,140,130,135,130,145,135,155,130,150,130,150,125,140,125}  
   ,{140,150,140,145,135,145,145,140,155,145,150,145,150,150,140,150}  
   ,{140,160,140,165,135,165,145,170,155,165,150,165,150,160,140,160}  
   ,{140,185,140,180,135,180,145,175,155,180,150,180,150,185,140,185}  
   ,{140,195,140,200,135,200,145,205,155,200,150,200,150,195,140,195} 
   ,{140,220,140,215,135,215,145,210,155,215,150,215,150,220,140,220}  
   ,{140,230,140,235,135,235,145,240,155,235,150,235,150,230,140,230}  
   ,{140,255,140,250,135,250,145,245,155,250,150,250,150,255,140,255}  
   ,{140,265,140,270,135,270,145,275,155,270,150,270,150,265,140,265} 
   ,{140,300,140,295,135,295,145,290,155,295,150,295,150,300,140,300}  
   };

int arr_upcoordinate[9][2]={{0,0},{145,295},{145,250},{145,215},{145,180},{145,145},{145,110},{145,75},{145,40}};
int arr_downcoordinate[10][2]={{0,0},{0,0},{145,270},{145,235},{145,200},{145,165},{145,130},{145,95},{145,60},{145,15}};
int arr_instructioncoordinate[2][2]={{15,170},{15,200}};
Initialize();
Lift_status();
Lift_status_xl();
Input();
Input_xl();
Tactics();
Tactics_xl();
void drawarrow();
void drawfloor();
void drawinlift();
void drawlift();
void directionlight_control();
void instructionlight_control();
void movelift();
void buttonon_control();
void buttonoff_control();
void Output();
void drawball(int,int,int);
void menu();

void drawball(int x,int y,int color)
  {
   setcolor(color);
   circle(x,y,10);
   setfillstyle(SOLID_FILL,color);
   floodfill(x,y,color);
  }

Initialize()    /*初始化*/
{
int i;
int gdriver=DETECT,gmode,errorcode;  
POSETION=10;    /*电梯位置为一层*/
PAUSE=0;    /*不停止*/
DIRECTION=2;    /*方向向上*/
AIMFLOOR=10;   
K1=1;
K2=1;
for(i=0;i<10;i++)   /*无呼叫*/
    {
     request.callin[i]=0;
     request.callup[i]=0;
     request.calldown[i]=0;
    }
initgraph(&gdriver,&gmode,""); 
errorcode=graphresult(); 
if(errorcode!=grOk) 
{ 
   printf("Graphics error: %s\n",grapherrormsg(errorcode)); 
        printf("Press any key to halt:"); 
       getch(); 
       exit(1);             
} 
cleardevice();
setbkcolor(BLACK);
drawlift();
size=imagesize(60, 280, 120, 310);
buf=malloc(size);
getimage(60,280,120,310,buf);
putimage(60,280,buf,COPY_PUT); 
drawinlift();
drawarrow();
drawfloor();
drawlift();
directionlight_control();
instructionlight_control();
}

Input()         /*输入(顺便服务)*/
{
int m,n,o,a;
char b;
if(PAUSE==0)sleep(1);       /*未到达目标楼层,停一秒*/
if(PAUSE==1)sleep(5);       /*到达目标楼层,停五秒*/
while(1)
{
a=bioskey(1);        /*等待输入*/
if(a==0)goto p;       /*若无输入,跳出循环*/
if(a!=0)        /*若有输入,继续*/
{
  b=getch();       /*将刚输入的字符保存*/
  if(b==27){EXIT=1;break;}     /*判断是否退出*/
  if(b>='1'&&b<='9')      /*判断是否为电梯内呼叫*/
  {
   n=b-48;
   request.callin[n]=1;     /*记录对应楼层呼叫*/
  }
  if(POSETION%10!=0&&(n==POSETION/10||n==(POSETION/10+1)))
   request.callin[n]=2;     /*安全策略,若电梯与呼叫位置相隔不到一层,暂时不响应*/
  switch(b)       /*判断是否为电梯外向上呼叫*/
   {
   case 'q':m=1;request.callup[m]=1;break;
   case 'w':m=2;request.callup[m]=1;break;
   case 'e':m=3;request.callup[m]=1;break;
   case 'r':m=4;request.callup[m]=1;break;
   case 't':m=5;request.callup[m]=1;break;
   case 'y':m=6;request.callup[m]=1;break;
   case 'u':m=7;request.callup[m]=1;break;
   case 'i':m=8;request.callup[m]=1;break;
  }
  if(POSETION%10!=0&&(m==POSETION/10||m==(POSETION/10+1)))
   request.callup[m]=2;
  switch(b)       /*判断是否为电梯外向下呼叫*/
   {
   case 'a':o=2;request.calldown[o]=1;break;
   case 's':o=3;request.calldown[o]=1;break;
   case 'd':o=4;request.calldown[o]=1;break;
   case 'f':o=5;request.calldown[o]=1;break;
   case 'g':o=6;request.calldown[o]=1;break;
   case 'h':o=7;request.calldown[o]=1;break;
   case 'j':o=8;request.calldown[o]=1;break;
   case 'k':o=9;request.calldown[o]=1;break;
  }
  if(POSETION%10!=0&&(o==POSETION/10||o==(POSETION/10+1)))
   request.calldown[o]=2;
}
}
p:;
}


Input_xl()  /*输入(先来先服务)*/
{
int m,n,o,a;
char b;
if(PAUSE==0)sleep(1);
if(PAUSE==1)sleep(5);
while(1)
{
a=bioskey(1);
if(a==0)goto p;
if(a!=0)
{
  b=getch();
  if(b==27){EXIT=1;break;}
  if(b>='1'&&b<='9')
  {
   n=b-48;
   request.callin[n]=K1++;
  }
  switch(b)
   {
   case 'q':m=1;request.callup[m]=K1++;break;
   case 'w':m=2;request.callup[m]=K1++;break;
   case 'e':m=3;request.callup[m]=K1++;break;
   case 'r':m=4;request.callup[m]=K1++;break;
   case 't':m=5;request.callup[m]=K1++;break;
   case 'y':m=6;request.callup[m]=K1++;break;
   case 'u':m=7;request.callup[m]=K1++;break;
   case 'i':m=8;request.callup[m]=K1++;break;
  }
  switch(b)           
   {
   case 'a':o=2;request.calldown[o]=K1++;break;
   case 's':o=3;request.calldown[o]=K1++;break;
   case 'd':o=4;request.calldown[o]=K1++;break;
   case 'f':o=5;request.calldown[o]=K1++;break;
   case 'g':o=6;request.calldown[o]=K1++;break;
   case 'h':o=7;request.calldown[o]=K1++;break;
   case 'j':o=8;request.calldown[o]=K1++;break;
   case 'k':o=9;request.calldown[o]=K1++;break;
  }
}
}
p:;
}


Lift_status()            /*电梯状态(顺便服务)*/
{
int i;
Tactics();            /*执行策略*/
if(AIMFLOOR==10)goto p;          /*若无请求,跳出*/
if((AIMFLOOR==POSETION/10)&&(POSETION%10==0))goto change;      /*若当前为目标楼层,跳过改变位置*/
if(DIRECTION==2) POSETION+=2;          /*改变电梯位置*/
if(DIRECTION==1) POSETION-=2;
change: if((AIMFLOOR==POSETION/10)&&(POSETION%10==0))       /*判断是否到达目标楼层*/
{
  request.callin[AIMFLOOR]=0;                   /*删除已完成的请求*/
  if(DIRECTION==2)
  {
   request.callup[AIMFLOOR]=0;
   if(request.calldown[AIMFLOOR]==1)       /*判断当前楼层是否有向下请求*/
    {
    Tactics();
       request.calldown[POSETION/10]=0;
    if((AIMFLOOR>POSETION/10)&&(AIMFLOOR<10))request.calldown[POSETION/10]=1; /*判断但前楼层之上是否还有请求*/
   }
  }
  if(DIRECTION==1)
  {
   request.calldown[AIMFLOOR]=0;
   if(request.callup[AIMFLOOR]==1)
   {
    Tactics();
    request.callup[POSETION/10]=0;
    if((AIMFLOOR<POSETION/10)&&(AIMFLOOR>0))request.callup[POSETION/10]=1;
   }
  }
  PAUSE=1;           /*暂停*/
  save();
         for(i=1;i<10;i++)          /*到达目标楼层后,响应因安全策略暂时未被响应的呼叫*/
  {
   if(request.callin[i]==2)request.callin[i]=1;
   if(request.callup[i]==2)request.callup[i]=1;
   if(request.calldown[i]==2)request.calldown[i]=1;
  }
}
else PAUSE=0;
p:;
}


Lift_status_xl()      /*电梯状态(先来现服务)*/
{
int i;
Tactics_xl();       /*执行策略*/
if(AIMFLOOR==10)goto p;     /*若无请求,跳出*/
if(DIRECTION==0)goto o;     /*若无方向,跳过改变位置*/
if(DIRECTION==2) POSETION+=2;     /*改变电梯位置*/
if(DIRECTION==1) POSETION-=2;
o: if((AIMFLOOR==POSETION/10)&&(POSETION%10==0))
{ PAUSE=1;  /*若到达目标楼层,暂停*/   save();}
else PAUSE=0;
p:;
}



void drawarrow()
{
   int i;
   setcolor(RED);
   for(i=0;i<18;i++)
   drawpoly(8,arw[i]);
}

void drawfloor()
{
   int i;
   setcolor(RED);
   line(55,0,55,320);
   line(125,0,125,320);
   line(55,320,125,320);
   for(i=0;i<9;i++)
   rectangle(60,35*i,120,30+35*i);
}

void drawinlift()
{
    int m;
    setcolor(WHITE);
    rectangle(200,20,250,320);
    setfillstyle(SOLID_FILL,GREEN);
    bar(210,40,220,70);bar(230,40,240,70);
    setcolor(RED);
    rectangle(210,90,220,110);
    rectangle(230,90,240,110);
    rectangle(210,130,220,150);
    rectangle(230,130,240,150);
    rectangle(210,170,220,190);
    rectangle(230,170,240,190);
    rectangle(210,210,220,230);
    rectangle(230,210,240,230);
    rectangle(210,250,220,270);


    setcolor(GREEN);
    settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
    outtextxy(212,100,"1");
    outtextxy(232,100,"2");
    outtextxy(212,140,"3");
    outtextxy(232,140,"4");
    outtextxy(212,180,"5");
    outtextxy(232,180,"6");
    outtextxy(212,220,"7");
    outtextxy(232,220,"8");
    outtextxy(212,260,"9");
outtextxy(282,80,"CALLIN: ");   
outtextxy(282,100,"1-1  2-2  3-3  4-4  5-5  6-6  7-7  8-8  9-9");
outtextxy(282,140,"CALLUP:");
outtextxy(282,160,"q-1  w-2  e-3  r-4  t-5  y-6  u-7  i-8");
outtextxy(282,200,"CALLDOWN:");
outtextxy(282,220,"a-2  s-3  d-4  f-5  g-6  h-7  j-8  k-9");
outtextxy(282,260,"ESC---back  to  menu");
   
    
    setcolor(YELLOW);
    settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
    switch(AIMFLOOR)
    {
     case 1:outtextxy(212,50,"1");break;
     case 2:outtextxy(212,50,"2");break;
     case 3:outtextxy(212,50,"3");break;
     case 4:outtextxy(212,50,"4");break;
     case 5:outtextxy(212,50,"5");break;
     case 6:outtextxy(212,50,"6");break;
     case 7:outtextxy(212,50,"7");break;
     case 8:outtextxy(212,50,"8");break;
     case 9:outtextxy(212,50,"9");break;
     case 10:setfillstyle(SOLID_FILL,GREEN);floodfill(212,50,GREEN);
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -