SJF短作业优先 HRRN高响应比优先 FCFS先来先服务
源代码 #include
#include
#define LEN sizeof(struct process)
#define MAX 99
struct process{//结构体进程
int no;
float pri;
float arrtime;
float sertime;
float strtime;
float fintime;
//=arr+ser
float roundtime;
//=fin-arr
float aroundtime;
//roun/ser
process *next;
};
void LISTtime(struct process a[],int count){
float l,h,n;
for(int i=0;
i
for(int j=i+1;
j
if(a[j].arrtime < a[i].arrtime||a[j].arrtime==0)
{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
}
process *creat(){ //进程构造函数
process *head;
head=(process*)malloc(LEN);
//head为头指针
process *p1,*p2;
//p1为新建指针,p2对尾指针
head->next=NULL;
p2=head;
p1=(process*)malloc(LEN);
printf("请输入进程号:\n");
scanf("%d",&p1->no);
printf("请输入进程到达时间:\n");
scanf("%f",&p1->arrtime);
printf("请输入进程需要时间:\n");
scanf("%f",&p1->sertime);
p1->fintime=0;
p1->pri=0;
while(p1->sertime!=0){
p1->next=p2->next;
p2->next=p1;
p2=p1;
p1=(process*)malloc(LEN);
printf("请输入进程号:\n");
scanf("%d",&p1->no);
printf("请输入进程到达时间:\n");
scanf("%f",&p1->arrtime);
printf("请输入进程需要时间:\n");
scanf("%f",&p1->sertime);
p1->fintime=0;
p1->pri=0;
}
free(p1);
return head;
}
void PrintFS(struct process a[],int count){//FCFS和SJF输出
int i;
printf("|到达时间|服务时间|开始时间|完成时间|周转时间|带权周转时间\n");
for(i=0;
i
}
}
void printPf(process a[],int count){//HRRN输出
printf("");
printf("进程号|到达时间|需要时间|开始时间|完成时间|周转时间|带权周转时间|进程优先级\n");
for(int i=0;
i
[i].aroundtime,a[i].pri);
}
printf("");
}
void copy(process a[],process b[],int count){//复制进程组
for(int i=0;
i
b[i].arrtime=a[i].arrtime;
b[i].sertime=a[i].sertime;
b[i].fintime=a[i].fintime;
}
}
void SJF(process a[],int count){//先来先服务
int i,st=0,zero=0;
float l,h,n;
int time=0;
for(i=0;
i
a[i].fintime=0;
a[i].aroundtime=0;
a[i].pri=0;
a[i].roundtime=0;
}
for( i=0;
i
for(int j=i+1;
j
if(a[j].arrtime{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
time=a[0].arrtime;
for( i=0;
i
for(int j=i+1;
j
if(a[j].sertime{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
while(st
a[i].fintime=time+a[i].sertime;
a[i].strtime=time;
a[i].roundtime=a[i].fintime-a[i].arrtime;
a[i].aroundtime=a[i].roundtime/a[i].sertime;
time=a[i].fintime;
st++;
for(int i=st-1;
i
for(int j=i+1;
j
if(a[j].sertime[i].fintime==0)
{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
}
if(a[i+1].arrtime>=time&&a[i+1].fintime==0){
time=a[i+1].arrtime;
for(int i=st-1;
i
for(int j=i+1;
j
if(a[j].sertime[i].fintime==0)
{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
}
}
}
}
void HRRN(struct process a[],int count){//高响应比优先
//p为指针头 及只记录队列首地址的指针
float time=0,m=0;
//m为优先级标志
int i=0;
float l,h,n;
float ap[99];
//记录优先级
int count1=count;
//记录优先级参数
int ai=count;
//未完成进程数标志
for(i=0;
i
a[i].aroundtime=0;
a[i].pri=0;
a[i].roundtime=0;
}
for( i=0;
i
for(int j=i+1;
j
if(a[j].arrtime{
l=a[j].arrtime;
h=a[j].sertime;
n=a[j].no;
a[j].arrtime=a[i].arrtime;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
a[i].no=n;
a[i].arrtime=l;
a[i].sertime=h;
}
}
}
time=a[0].arrtime;
for(i=0;
i
a[i].pri=(time+a[i].sertime)/a[i].sertime;
ap[i]=a[i].pri;
}
}
for( i=0;
i
float l;
for(int j=i+1;
j
if(ap[j]<=ap[i])
{
l =ap[j];
ap[j]=ap[i];
ap[i]=l;
}
}
}
m=ap[count-1];
//记录最大优先级
while(ai>0){//有无未完成进程
for(i=0;
i
if(time{
a[i].fintime=time+a[i].sertime;
a[i].strtime=time;
a[i].roundtime=a[i].fintime-a[i].arrtime;
a[i].aroundtime=a[i].roundtime/a[i].sertime;
time=a[i].fintime;
ai--;
break;
}
}
}
for( i=0;
i
ap[i]=0;
}
for(i=0;
i
a[i].pri=(time-a[i].arrtime+a[i].sertime)/a[i].sertime;
ap[i]=a[i].pri;
}
if(a[i+1].fintime==0&&a[i+1].arrtime>=time&&a[i].fintime!=0){//如果当前进程已完成
//下一个应该到达的进程的到达时间大于当前时间
a[i+1].pri=(a[i+1].sertime)/a[i+1].sertime;
ap[i+1]=a[i+1].pri;
}
}
for( i=0;
i
float l;
for(int j=i+1;
j
if(ap[j]<=ap[i])
{
l =ap[j];
ap[j]=ap[i];
ap[i]=l;
}
}
}
m=ap[count-1];
//记录最大优先级
}
}
void FCFS(struct process a[],int count){//先来先服务
int i;
a[0].fintime=a[0].arrtime+a[0].sertime;
a[0].strtime=a[0].arrtime;
a[0].roundtime=a[0].fintime-a[0].arrtime;
a[0].aroundtime=a[0].roundtime/a[0].sertime;
for(i=1;
i
a[i].strtime=a[i-1].fintime;
a[i].roundtime=a[i].fintime-a[i].arrtime;
a[i].aroundtime=a[i].roundtime/a[i].sertime;
}
else{
a[i].fintime=a[i].arrtime+a[i].sertime;
a[i].strtime=a[i].arrtime;
a[i].roundtime=a[i].fintime-a[i].arrtime;
a[i].aroundtime=a[i].roundtime/a[i].sertime;
}
}
}
void main(){
int count=0;
int flag=0;
process af[MAX];
//fcfs
process bs[MAX];
//sjf
process ch[MAX];
//hrrn
process *head;
printf("请输入进程 服务时间为0停止\n");
head=creat();
{
process *p;
int i=0;
p=head->next;
while(p!=NULL){
af[i].no=p->no;
af[i].arrtime=p->arrtime;
af[i].sertime=p->sertime;
af[i].fintime=p->fintime;
p=p->next;
i++;
count++;
}
}
copy(af,bs,count);
copy(af,ch,count);
while(flag!=4){
printf("请选择算法: 1 FCFS 2 SJF 3 HRRN 4退出 \n");
scanf("%d",&flag);
switch(flag){
case 1:{LISTtime(af,count);
FCFS(af,count);
PrintFS(af,count);
break;
}
case 2:{SJF(bs,count);
PrintFS(bs,count);
break;
}
case 3:{HRRN(ch,count);
printPf(ch,count);
break;
}
case 4: break;
default :printf("输入错误!");
break;
}
}
【SJF|SJF HRRN FCFS 算法】}
这个程序可以运行出来但是我想知道有什么错误,希望有人能看到我这篇帖子,指出我的错误和不足