找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2382|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

電梯調(diào)度算法(源代碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:116719 發(fā)表于 2016-4-26 09:11 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct _proc
{
char name[32];           /*定義進(jìn)程名稱*/
int team;                /*定義柱面號(hào)*/
int ci;                  /*定義磁道面號(hào)*/
int rec;                 /*定義記錄號(hào)*/
struct _proc *prior;
struct _proc *next;
}PROC;
PROC *g_head=NULL,*g_curr=NULL,*local;
int record=0;
int yi=1;
void init()
{
PROC *p;                                               /*初始化鏈表(初始I/O表)*/
g_head = (PROC*)malloc(sizeof(PROC));
g_head->next = NULL;
g_head->prior = NULL;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P1");
p->team=100;
p->ci=10;
p->rec=1;
p->next = NULL;
p->prior = g_head;
g_head->next = p;
g_curr=g_head->next;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P2");
p->team=30;
p->ci=5;
p->rec=5;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P3");
p->team=40;
p->ci=2;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P4");
p->team=85;
p->ci=7;
p->rec=3;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=p;
p = (PROC*)malloc(sizeof(PROC));
strcpy(p->name, "P5");
p->team=60;
p->ci=8;
p->rec=4;
p->next = NULL;
p->prior = g_curr;
g_curr->next = p;
g_curr=g_head->next;
local = (PROC*)malloc(sizeof(PROC));             /*選中進(jìn)程*/
strcpy(local->name, "P0");
local->team=0;
local->ci=0;
local->rec=0;
local->next=NULL;
local->prior=NULL;
}
void PrintInit()                                 /*打印I/O*/
{
    PROC *t = g_head->next;
printf("-------------------------------------\n");
printf("   ---------I/O LIST---------\n");
printf(" process    team     ci    rec   \n");
while(t!=NULL)
{
printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec );
   t = t->next;
}
printf("\n\nCurrent process is :\n");
printf("------------------------------\n\n");
printf(" process    team     ci    rec   \n");
printf("%4s %8d %8d %5d\n", local->name, local->team, local->ci, local->rec );
switch(yi)
{
case 1:{printf("current direction is UP\n");break;}
case 0:{printf("current direction is down\n");break;}
}
}
void acceptreq()                        /*接受請(qǐng)求函數(shù)*/
{
PROC *p;
p = (PROC*)malloc(sizeof(PROC));
printf("please input the information of the new process\nprocess-name:\nprocess-team\nprocess-ci\nprocess-rec\n");
printf("1.name\n");
scanf("%s",p->name);
printf("2.team 0-199\n");
scanf("%d",&p->team);                    /*輸入請(qǐng)求進(jìn)程信息*/
printf("3.ci 0-19\n");
scanf("%d",&p->ci);
printf("4.rec 0-7\n");
scanf("%d",&p->rec);
getchar();
g_curr=g_head;                       /*將此節(jié)點(diǎn)鏈入I/O請(qǐng)求表*/
while(g_curr->next!=NULL)
g_curr=g_curr->next;
p->next=NULL;
p->prior=g_curr;
g_curr->next=p;
g_curr=g_head->next;
printf("NEW I/O LIST\n\n");
PrintInit();                      /*將新的I/O請(qǐng)求表輸出*/
}
void qddd()                         /*驅(qū)動(dòng)調(diào)度函數(shù)*/
{
PROC *out;
int min;
int max=g_head->next->team;
if (g_head->next==NULL);            /*若已全部調(diào)度,則空操作*/
else
{
switch (yi)
{
case 1:
   
{
min=g_head->next->team;out=g_head->next;          /*選出最小的team進(jìn)程,模擬啟動(dòng)此進(jìn)程*/
strcpy(local->name,out->name);
local->team=out->team;
local->ci=out->ci;
local->rec=out->rec;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (g_curr->team > record)
{ min = g_curr->team;break;}
}
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (min>=g_curr->team&&g_curr->team>record)
{
min=g_curr->team;
out=g_curr;
strcpy(local->name,out->name);
local->team=out->team;
local->ci=out->ci;
local->rec=out->rec;
}
}
printf("\n-----------------------\n");
printf("the process choosed :\n");
printf(" process    team     ci    rec   \n");
printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );
record = local->team;
printf("%d",record);
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (max<g_curr->team)
max=g_curr->team;
}
if(max==record)
{
yi=0;
record=1000;
break;
}
break;
}/*case 1*/
case 0:                                    /*case 1 的對(duì)稱過(guò)程*/
{
max=g_head->next->team;out=g_head->next;      
strcpy(local->name,out->name);
local->team=out->team;
local->ci=out->ci;
local->rec=out->rec;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (g_curr->team < record)
{ max = g_curr->team;break;}
}
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (max<=g_curr->team&&g_curr->team<record)
{
max=g_curr->team;
out=g_curr;
strcpy(local->name,out->name);
local->team=out->team;
local->ci=out->ci;
local->rec=out->rec;
}
}
printf("\n-----------------------\n");
printf("the process choosed :\n");
printf(" process    team     ci    rec   \n");
printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );
min=g_head->next->team;
for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)
{
if (min>g_curr->team)
min=g_curr->team;
}
record = local->team;
if(min==record)
{
yi=1;
record=0;
break;
}
break;
}
default : return -1;
}/*switch*/
if (out->next==NULL)                      /*將選中的進(jìn)程從I/O請(qǐng)求表中刪除*/
{
out->prior->next=NULL;
free(out);
}
else
{
out->prior->next=out->next;
out->next->prior=out->prior;
free(out);
}
}/*else*/
}
void acceptnum()                             /*通過(guò)輸入0~1選擇‘驅(qū)動(dòng)調(diào)度’或是‘接受請(qǐng)求’*/
{
float num;
char c;
while(1)
{
printf("----------------------------------------------\n");
printf("please input a number between 0 and 1\nnum<=0.5:accept request\nnum>0.5:qudong diaodu\n\nnum==2:I/O LIST\n\nnum=?\n");
scanf("%f",&num);
getchar();
while((num<0||num>1)&&num!=2)                /*過(guò)濾不合法數(shù)據(jù) 注意:本程序其他輸入數(shù)據(jù)可能未過(guò)濾*/
{
printf("number ERROR!Input again please!\nnum=?\n ");
scanf("%f",&num);
getchar();
}
if(num>0.5&&num!=2)                         /*驅(qū)動(dòng)調(diào)度*/
{
if (g_head->next==NULL)
{
printf("\n\n");
printf("---------------------\n");
printf("I/O list is empty!!!\n");           /*請(qǐng)求表為空 無(wú)需調(diào)度*/
}
else
{
printf("qudong diaodu\n");
qddd();
                                 /*調(diào)用函數(shù)進(jìn)行調(diào)度*/
}
}
else if (num<=0.5)                          /*接受請(qǐng)求*/
{
printf("accept request\n\n");
acceptreq();
}
else if (num==2)                           /*通過(guò)輸入2顯示當(dāng)前請(qǐng)求I/O*/
{
printf("I/O LIST;");
printf("-------------------\n");
PrintInit();
printf("\n");
}
printf("-----------------------\n");
printf("choose 'n' to quit else to continue\n");                  /*輸入n離開本程序*/
if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0)
{
//clrscr();
printf("\n\n\n\n\n\n");
printf("thank you for testing my program!\n");
printf("     ---by   01\n");
sleep(2);
printf("\n\nBYEbye!!");
sleep(2);
return -1;
}
else
{
//clrscr();
}
}
}
main ()                           /*主程序*/
{
init();
PrintInit();
acceptnum();
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表