📄 os2final.c
字号:
//os2final.c
#include "stdio.h"
#define getjcb(type) (type*)malloc(sizeof(type))
#define NULL 0
int n=0,time=0;float eti,ewi;
struct jcb{ char name[10]; /* 作业名 */
char state; /* 作业状态 */
int ts; /* 提交时间 */
float super; /* 优先级 */
int tb; /* 开始运行时间 */
int tc; /* 完成时间 */
float ti; /* 周转时间 */
float wi; /* 带权周转时间 */
int ntime; /* 作业所需运行时间 */
char resource[10]; /* 所需资源 */
struct jcb *link; /* 结构体指针 */
} *p,*q,*head=NULL;
typedef struct jcb JCB;
inital(){//初始化输入作业
int i;
printf("\n输入作业数量:");
scanf("%d",&n);
//printf("Input\nname\tts\tntime\tresource\n");
for(i=0;i<n;i++){
p=getjcb(JCB);
printf("=======现在输入第 %d 个作业=======\n",i+1);
printf("作 业 名:");
scanf("%s",&p->name);
printf("作业提交时间:");
scanf("%d",&p->ts);
printf("作业运行时间:");
scanf("%d",&p->ntime);
printf("作业所需资源:");
scanf("%s",&p->resource);
p->state='W';
p->link=NULL;
if(head==NULL) head=q=p;//不考虑优先级别作业作业队列
else{
q->link=p;
q=p;
}
}
}
void print(JCB *pr,int m){//打印
JCB *p;
printf("\ntime=%d",time);
if(m==3){
printf("\nName\tState\tsubmitT\tNeedT\tSuper\tSource\tStartT\tFinishT\tTi\tWi\n");
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
}
else {
printf("\nName\tState\tsubmitT\tNeedT\tSuper\tSource\tStartT\tFinishT\tTi\tWi\n");
printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
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')
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource);
}
else{
printf("%s\t%c\t%d\t%d\t%s\n",
p->name,p->state,p->ts,p->ntime,p->resource);
}
p=p->link;
}while(p!=NULL);
p=head;
do{
if(p->state=='F')
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti,p->wi);
}
else{
printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
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("\n平均周转时间(Ti)=%7.3f\t平均带权周转时间(Wi)=%7.3f\n",eti,ewi);
}
super(){//设置优先级
JCB *padv;
padv=head;
do{
if(padv->state=='W'&&padv->ts<=time)
padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime;
padv=padv->link;
}while(padv!=NULL);
}
void hrn(m){//最高响应比
JCB *min;
int i,iden;
for(i=0;i<n;i++){
p=min=head;iden=1;
super();
do{
if(p->state=='W'&&p->ts<=time)
if(iden){
min=p;iden=0;
}
else if(p->super>min->super) min=p;
p=p->link;
}while(p!=NULL);
if(iden) {
i--;
time++;
printf("\ntime=%d:\t没有作业提交...等待中...",time);
if(time>1000){printf("\n运行时间过长...错误!");
time++;
getch();}
}
else{
running(min,m);
}
}
}
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)
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:\t没有作业提交...等待中...",time);
time++;
if(time>100){printf("\n运行时间过长...错误!");
getch();}
}
else{
running(min,m);
}
}
}
void fcfs(int m){//先来先服务
int i,iden;
printf("\n\n作业正在运行...");
for(i=0;i<n;i++){
p=head;iden=1;
do{
if(p->state=='W'&&p->ts<=time) iden=0;
if(iden)p=p->link;
}while(p!=NULL&&iden) ;
if(iden) {
i--;
printf("\ntime=%d:\t没有作业提交...等待中...",time);
time++;
if(time>100){printf("\n运行时间过长...错误!");
getch();}
}
else{
running(p,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("\n%s 作业已完成!\n按任意键继续...\n",p->name);
getch();
}
void runjcb(int m){
printf("\n\n开始运行...");
switch(m){
case 1:fcfs(m);break;
case 2:sjf(m);break;
case 3:hrn(m);break;
default:printf("\n运行错误...\n");exit();
}
}
start(){
int m;
char str[100]="\n请选择算法\n1.先来先服务--(FCFS)\n2.短作业优先--(SJF)\n3.最高响应比--(HRN)\n" ;
printf("%s",str);
m=getch()-48;
//fileway();
inital();
if(1<=m&&m<=3) runjcb(m);
else {
printf("\n选择有误,请重新选择...\n");
start();
}
last();
}
main(){
start();
printf("\n所有作业完成!\n");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -