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; [i].fintime==0) a[j].arrtime=a[i].arrtime; a[i].no=n; [i].fintime==0) a[j].arrtime=a[i].arrtime; a[i].no=n; a[j].arrtime=a[i].arrtime; 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
{
l =a[j].arrtime;
h =a[j].sertime;
n =a[j].no;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
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
{
l =a[j].arrtime;
h =a[j].sertime;
n =a[j].no;
a[j].sertime=a[i].sertime;
a[j].no=a[i].no;
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].sertime=a[i].sertime;
a[j].no=a[i].no;
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;
}
}这个程序可以运行出来但是我想知道有什么错误,希望有人能看到我这篇帖子,指出我的错误和不足