#include<stdio.h>
#define Time int
#define M 100
typedef struct process{
char name[M];//进程名
int priority;//优先数
int reachtime;//到达时间
int needtime;//需要时间
int usedtime;//已用时间
int completetime;//完成时间
int time1;//周转时间内
int time2;//带权周转时间
int state;//进程状态
int Ptime;//时间片大小
}PCB; //进程控制块
int n;
PCB pcb[M];
int pTime;
void print(int n){
int i;
printf("################################最短作业优先进程调度############################\n");
printf("--------------------------------------------------------------------------------\n");
printf("进程名 需要时间 到达时间 完成时间 周转时间 带权周转时间\n");
for(i=0;i<n;i++){
printf("%s\t %d\t \t %d\t\t%d\t\t%d\t %d\n",pcb[i].name,pcb[i].needtime,pcb[i].reachtime,pcb[i].completetime,pcb[i].time1,pcb[i].time2);
}
printf("--------------------------------------------------------------------------------\n");
}
void SJsort(int n){
int i;
int j;
int a=0;
int b;
PCB temp;
//判断
for(b=0;b<n;b++){
a=a+pcb[b].needtime;
if(a>=pcb[n-1].reachtime){
printf("%d\n",b+1);
break;
}
}
for(i=b+1;i<n;i++){
for(j=i;j<n;j++){
if(pcb[i].needtime>pcb[j].needtime){
temp=pcb[j];
pcb[j]=pcb[i];
pcb[i]=temp;
}
}
}
}
void main(){
int i;
int j;
float avertime1=0.00;
float avertime2=0.00;
PCB temp;
printf("请输入进程数:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("\n请输入进程名:");
scanf("%s",&pcb[i].name);
printf("请输入需要的时间:");
scanf("%d",&pcb[i].needtime);
printf("请输入到达的时间:");
scanf("%d",&pcb[i].reachtime);
}
SJsort(n);
print(n);
for(i=0;i<n;i++){
while(pcb[i].needtime!=0){
printf("\n请按任意键继续......\n");
printf("\n");
fflush(stdin);
getchar();
printf(" 当前运行的程序是:\n");
printf("--------------------------------------------------------------------------------\n");
printf("进程名 需要时间 到达时间 完成时间 周转时间 带权周转时间\n");
if(i==0){
pcb[i].completetime=pcb[i].needtime+pcb[i].reachtime;//计算完成时间
}
else{
pcb[i].completetime=pcb[i-1].completetime+pcb[i].needtime;//计算完成时间
}
pcb[i].time1=pcb[i].completetime-pcb[i].reachtime;//计算周转时间
pcb[i].time2=pcb[i].time1/pcb[i].needtime;//计算带权周转时间
printf("%s\t %d\t \t %d\t\t%d\t\t%d\t %d\n",pcb[i].name,pcb[i].needtime,pcb[i].reachtime,pcb[i].completetime,pcb[i].time1,pcb[i].time2);
printf("--------------------------------------------------------------------------------\n");
pcb[i].needtime=0;
printf("\n");
print(n);
}
}
for(i=0;i<n;i++){
avertime1=avertime1+pcb[i].time1;
avertime2=avertime2+pcb[i].time2;
}
printf("该进程的平均周转时间是:");
printf("%.2f\n",avertime1/n);
printf("该进程的平均带全周转时间是:");
printf("%.2f\n",avertime2/n);
printf(" 提示:最短作业优先进程调度结束!\n");
}