#include "string.h"
#include<string>
#include<iostream>
using namespace std;
#define n 20
//假定系统中可容纳的数量为n
typedef struct jcb
{
char name[5]; //名
int length; //作长度,所需主存大小
int printer; //执行所需打印机的数量
int tape; //执行所需磁带机的数量
int runtime; //估计执行时间
int waittime; //在系统中的等待时间
int next; //指向下一个控制块的指针
}JCB; //控制块类型定义
int head; //队列头指针定义
int tape, printer;
long memory;
JCB jobtable[n]; //表
int jobcount = 0; //系统内现有数量
void shedule()
//调度函数
{
float xk, k;
int p=0, q=0, s=0, t=0;
do
{
p = head;
q = s = -1;
k = 0;
while (p != -1)
{
if (jobtable[p].length <= memory && jobtable[p].tape <= tape && jobtable[p].printer <= printer)
{ //系统可用资源是否满足需求
xk = (float)(jobtable[p].waittime) / jobtable[p].runtime;
if (q == 0 || xk > k) //满足条件的第一个或者q的响应比小于p的响应比
{
k = xk; //记录响应比
q = p;
t = s;
}//if
}//if
s = p;
p = jobtable[p].next; //指针p后移
}//while
if (q != -1)
{
if (t == -1) //是队列的第一个
head = jobtable[head].next;
else
jobtable[t].next = jobtable[q].next;
//为q分配资源:分配主存空间;分配磁带机;分配打印机
memory = memory - jobtable[q].length;
tape = tape - jobtable[q].tape;
printer = printer - jobtable[q].printer;
printf("选中的名:%s\n", jobtable[q].name);
}
} while (q != -1);
}//调度函数结束
int main()
{
char name[4];
int size=0, tcount=0, pcount=0, wtime=0, rtime=0;
int p;
//系统数据初始化
memory = 65536;
tape = 4;
printer = 2;
head = -1;
printf("输入相关数据(以大小为负数停止输入):\n");
//输入数据,建立队列
printf("输入名、大小、磁带机数、打印机数、等待时
cin >> name>>size >> tcount >> pcount >> wtime >> rtime;
while (size != -1)
{//创建JCB
if (jobcount < n)
p = jobcount;
else {
printf("无法再创建\n");
break;
}
jobcount++;
//填写该相关内容
char* strcpy(jobtable[p].name, name);//错误在最后这个name下划线了
jobtable[p].length = size;
jobtable[p].printer = pcount;
jobtable[p].tape = tcount;
jobtable[p].runtime = rtime;
jobtable[p].waittime = wtime;
//挂入队列队首
jobtable[p].next = head;
head = p;
// 输入一个数据
printf("输入名、大小、磁带机数、打印机数、等待时间、估计执行时间\n");
cin>>name, &size, &tcount, &pcount, &wtime, &rtime;
}//while
shedule(); //进行调度
return 0;
}//main( )函数结束