操作系统实习C语言短作业的实现
#include<stdio.h>
struct sjf {
char name[10]; //进程名
float arrivetime; //到达时间
float servicetime;//服务时间
float starttime; //开始时间
float finishtime;//完成时间
float zztime;//周转时间
float dqzztime;//带权周转
};
sjf p[100]; //定义一个全局指针
void Sinput(sjf *p, int N) //输入函数
{
int i;
for (i = 0; i<N; i++)
{
printf("输入第%d进程的名称,到达时间,服务时间:", i+1);
scanf("%s%f%f", &p[i].name, &p[i].arrivetime, &p[i].servicetime); //循环输入名字,到达时间,服务时间
}
}
void Sprint(sjf *p, int N) //输出函数
{ int k;
printf("run order:");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("-->%s",p[k].name); //输出的顺序
}
printf("\nname\tarrive\tservice\tstart\tfinish\tzztime\tdqzztime\n");
for(k=0;k<=N-1;k++)
{
printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,
p[k].servicetime,p[k].starttime,p[k].finishtime,(p[k].finishtime-p[k].arrivetime),
((p[k].finishtime-p[k].arrivetime)/p[k].servicetime));
//周转时间等于结束时间减去到达时间,带权周转时间等于周转时间除服务时间
}
}
void Ssort(sjf *p, int N) //排序算法
{
for (int i = 1; i < N; i++) { //按冒泡算法排序
for (int j = 1; j <= i; j++)
{
if((p[i].arrivetime<=p[j].arrivetime)) //先排序到达时间,如果到达时间小于或等于下一个则看服务时间
{
if(p[i].servicetime<p[j].servicetime) //如果前一个的服务时间小于后一个则交换
{
sjf temp; //定义一个临时的指针方便交换
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
}
void Sdeal(sjf *p,int N,float arrivetime,float servicetime,float finishtime) //处理运行函数
{
int k;
for(k=0;k<=N;k++)
{
if(k==0){
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;} //将第一个数据写入
else{
if (p[k-1].finishtime<p[k].arrivetime) //当上一个进程结束后,还没到下一个执行的情况。
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].starttime+p[k].servicetime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;
}
} //结束时间等于前一个的完成时间(这个的开始时间)加服务时间
}
}
void SJF(sjf *p, int N) //函数调用函数
{
float arrivetime=0,servicetime=0,finishtime=0; //初始化定义
Ssort(p, N);
Sdeal(p,N,arrivetime,servicetime,finishtime);
Sprint(p, N);
}
int main()
{
int M;
printf("短作业优先调度算法\n");
printf("输入进程数:");
scanf("%d", &M);
Sinput(p, M);
SJF(p, M);
struct sjf {
char name[10]; //进程名
float arrivetime; //到达时间
float servicetime;//服务时间
float starttime; //开始时间
float finishtime;//完成时间
float zztime;//周转时间
float dqzztime;//带权周转
};
sjf p[100]; //定义一个全局指针
void Sinput(sjf *p, int N) //输入函数
{
int i;
for (i = 0; i<N; i++)
{
printf("输入第%d进程的名称,到达时间,服务时间:", i+1);
scanf("%s%f%f", &p[i].name, &p[i].arrivetime, &p[i].servicetime); //循环输入名字,到达时间,服务时间
}
}
void Sprint(sjf *p, int N) //输出函数
{ int k;
printf("run order:");
printf("%s",p[0].name);
for(k=1;k<N;k++)
{
printf("-->%s",p[k].name); //输出的顺序
}
printf("\nname\tarrive\tservice\tstart\tfinish\tzztime\tdqzztime\n");
for(k=0;k<=N-1;k++)
{
printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,
p[k].servicetime,p[k].starttime,p[k].finishtime,(p[k].finishtime-p[k].arrivetime),
((p[k].finishtime-p[k].arrivetime)/p[k].servicetime));
//周转时间等于结束时间减去到达时间,带权周转时间等于周转时间除服务时间
}
}
void Ssort(sjf *p, int N) //排序算法
{
for (int i = 1; i < N; i++) { //按冒泡算法排序
for (int j = 1; j <= i; j++)
{
if((p[i].arrivetime<=p[j].arrivetime)) //先排序到达时间,如果到达时间小于或等于下一个则看服务时间
{
if(p[i].servicetime<p[j].servicetime) //如果前一个的服务时间小于后一个则交换
{
sjf temp; //定义一个临时的指针方便交换
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
}
}
void Sdeal(sjf *p,int N,float arrivetime,float servicetime,float finishtime) //处理运行函数
{
int k;
for(k=0;k<=N;k++)
{
if(k==0){
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;} //将第一个数据写入
else{
if (p[k-1].finishtime<p[k].arrivetime) //当上一个进程结束后,还没到下一个执行的情况。
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].starttime+p[k].servicetime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;
}
} //结束时间等于前一个的完成时间(这个的开始时间)加服务时间
}
}
void SJF(sjf *p, int N) //函数调用函数
{
float arrivetime=0,servicetime=0,finishtime=0; //初始化定义
Ssort(p, N);
Sdeal(p,N,arrivetime,servicetime,finishtime);
Sprint(p, N);
}
int main()
{
int M;
printf("短作业优先调度算法\n");
printf("输入进程数:");
scanf("%d", &M);
Sinput(p, M);
SJF(p, M);
}