找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1957|回复: 0
打印 上一主题 下一主题
收起左侧

电梯调度算法(源代码)

[复制链接]
跳转到指定楼层
楼主
ID:116719 发表于 2016-4-26 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct _proc
{
char name[32];           /*定义进程名称*/
int team;                /*定义柱面号*/
int ci;                  /*定义磁道面号*/
int rec;                 /*定义记录号*/
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));             /*选中进程*/
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()                        /*接受请求函数*/
{
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);                    /*输入请求进程信息*/
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;                       /*将此节点链入I/O请求表*/
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请求表输出*/
}
void qddd()                         /*驱动调度函数*/
{
PROC *out;
int min;
int max=g_head->next->team;
if (g_head->next==NULL);            /*若已全部调度,则空操作*/
else
{
switch (yi)
{
case 1:
   
{
min=g_head->next->team;out=g_head->next;          /*选出最小的team进程,模拟启动此进程*/
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 的对称过程*/
{
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)                      /*将选中的进程从I/O请求表中删除*/
{
out->prior->next=NULL;
free(out);
}
else
{
out->prior->next=out->next;
out->next->prior=out->prior;
free(out);
}
}/*else*/
}
void acceptnum()                             /*通过输入0~1选择‘驱动调度’或是‘接受请求’*/
{
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)                /*过滤不合法数据 注意:本程序其他输入数据可能未过滤*/
{
printf("number ERROR!Input again please!\nnum=?\n ");
scanf("%f",&num);
getchar();
}
if(num>0.5&&num!=2)                         /*驱动调度*/
{
if (g_head->next==NULL)
{
printf("\n\n");
printf("---------------------\n");
printf("I/O list is empty!!!\n");           /*请求表为空 无需调度*/
}
else
{
printf("qudong diaodu\n");
qddd();
                                 /*调用函数进行调度*/
}
}
else if (num<=0.5)                          /*接受请求*/
{
printf("accept request\n\n");
acceptreq();
}
else if (num==2)                           /*通过输入2显示当前请求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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表