#include "stdio.h"
#define getjcb(type) (type*)malloc(sizeof(type))
#define NULL 0
int n=0,time=0,resource=100;float eti,ewi;
struct jcb{
char uname[10]; /* 用户名 */
char name[10]; /* 作业名 */
char state; /* 作业状态 */
int ts; /* 提交时间 */
float super; /* 优先权 */
int tb; /* 开始运行时间 */
int tc; /* 完成时间 */
float ti; /* 周转时间 */
float wi; /* 带权周转时间 */
int ntime; /* 作业所需运行时间 */
int resource; /* 所需资源 */
struct jcb *link; /* 结构体指针 */
} *p,*q,*head=NULL;
typedef struct jcb JCB;
inital(){
int i;
printf("\nInput jcb num\n");
scanf("%d",&n);
printf("Input\nuname\tname\tts\tntime\tresource\n");
for(i=0;i<n;i++){
p=getjcb(JCB);
scanf("%s\t%s\t%d\t%d\t%d",&p->uname,&p->name,&p->ts,&p->ntime,&p->resource);
p->state='W';
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
}
fileinput(){
FILE *fp;
int i;
if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;
fscanf(fp,"%d\n",&n);
for(i=0;i<n;i++){
p=getjcb(JCB);
fscanf(fp,"%s%s%d%d%d",&p->uname,&p->name,&p->ts,&p->ntime,&p->resource);
p->state='W';
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
fclose(fp);
}
void print(JCB *pr,int m){
JCB *p;
printf("\ntime=%d",time);
printf("\nuname\tname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");
printf("%s\t%s\t%c\t%d\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\n",pr->uname,
pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
p=head;
do{
if(p->state=='W')
{
printf("%s\t%s\t%c\t%d\t%d\t%d\n",
p->uname,p->name,p->state,p->ts,p->ntime,p->resource);
}
p=p->link;
}while(p!=NULL);
p=head;
do{
if(p->state=='F')
{
printf("%s\t%s\t%c\t%d\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\n", p->uname,
p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p->ti,p->wi);
}
p=p->link;
}while(p!=NULL);
}
void last(){
eti/=n;ewi/=n;
printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);
}
void sjf(int m){
JCB *min;
int i,iden;
for(i=0;i<n;i++){
p=min=head;iden=1;
do{
if(p->state=='W'&&p->ts<=time&&p->resource<=resource)
if(iden)
{
min=p;
iden=0;
}
else if(p->ntime<min->ntime) min=p;
p=p->link;
}while(p!=NULL) ;
if(iden)
{
i--;
printf("\ntime=%d:\tno JCB submib...wait...",time);
time++;
if(time>100)
{
printf("\nruntime is too long...error");
getch();
}
}
else
{
running(min,m);
}
}
}
fcfs(int m)
{
int i,iden;
JCB *min;
printf("\n\nthe jcb is runing...");
for(i=0;i<n;i++)
{
p=min=head;iden=1;
do{
if(p->state=='W'&&p->ts<=time&&p->resource<=resource)
if(iden)
{
min=p;
iden=0;
}
else if(p->ts<min->ts) min=p;
p=p->link;
}while(p!=NULL) ;
if(iden)
{
i--;
printf("\ntime=%d:\tno JCB submib...wait...",time);
time++;
if(time>100)
{
printf("\nruntime is too long...error");
getch();
}
}
else
{
running(min,m);
}
}
}
running(JCB *p,int m){
p->tb=time;
p->state='R';
p->tc=p->tb+p->ntime;
p->ti=(float)(p->tc-p->ts);
p->wi=(float)(p->ti/p->ntime);
eti+=p->ti;
ewi+=p->wi;
print(p,m);
time+=p->ntime;
p->state='F';
printf("\nuname:%s,name:%s has been finished!\npress any key to continue...\n",p->uname,p->name);
getch();
}
void runjcb(int m){
printf("\n\nstart running jcb...");
switch(m){
case 1:fcfs(m);break;
case 2:sjf(m);break;
default:printf("\nrunjcb error...\n");exit();
}
}
fileway(){
printf("\nadopts the file way to input the datas...y/n:") ;
if(getch()=='y') fileinput();
else inital();
}
start(){
int m;
char str[100]="\nselect algorithm\n1.FCFS\n2.SJF\n" ;
printf("%s",str);
m=getch()-48;
fileway();
if(1<=m&&m<=3) runjcb(m);
else {
printf("\nselect error!try again...\n");
start();
}
last();
}
main(){
start();
printf("\nfinished!");
getch();
}
附:其中os.txt的内容如下:
5
A ZYA 1 3 15
B ZYB 3 5 60
C ZYC 8 1 50
D ZYD 9 4 10
E ZYE 2 1 30