📄 caozouxitong.txt
字号:
# include <iostream>
# include<string>
# include<stdlib.h>
using namespace std;
int n;//进程的个数
struct JC
{
double td;//进程到达时间即提交时间
double ty;//进程运行时间
char name;//进程名
double T;//进程周转时间
double W;//进程带权周转时间
double Te;//进程完成时间
//double TQ;//进程平均周转时间
//double WQ;//进程平均带权周转时间
JC *next;
};
JC *create(JC *head)//输入进程信息
{
JC *p;
head=new JC;
p=head;
p->next=NULL;
JC *p1;
cout<<"请输入您的进程数:";
cin>>n;
cout<<"请依次输入进程名,到达时间和运行时间:"<<endl;
for(int i=0;i<n;i++)
{
p1=new JC;
p1->next=NULL;
cin>>p1->name>>p1->td>>p1->ty;
p->next=p1;
p=p->next;
}
return head;
}
void print(JC *head)//打印出进程信息
{
JC *p;
p=head;
cout<<"进程名:"<<"到达时间:"<<"运行时间:"<<endl;
while(p->next!=NULL)
{
cout<<p->next->name<<" "<<p->next->td<<" "<<p->next->ty<<endl;
p=p->next;
}
}
JC *copy(JC *head)//复制链表
{
JC *p1,*p2,*p3,*PHead;
p2 =new JC;
p2->next=NULL;
PHead=p2;
p1=head;
while(p1->next!=NULL)
{
p3=new JC;
p3->next=NULL;
p3->name=p1->next->name;
p3->td=p1->next->td;
p3->ty=p1->next->ty;
p2->next=p3;
p2=p2->next;
p1=p1->next;
}
return PHead;
}
void SljPZ(JC *head)//时间片轮转法计算平均周转时间和平均带权周转时间
{
double TQ=0.0;//进程平均周转时间
double WQ=0.0;//进程平均带权周转时间
JC *p,*q,*p1,*p2;
q=head;
p2=p1=p=copy(head);
double t=p->next->td;//系统时间
double a=0.5;//时间片的大小,是可以调整大小的
double count=0.0;
while(p->next!=NULL)
{
p=p->next;
}
p->next=p1->next;
p1=p->next;
//p=p->next;
while(p!=NULL)
{
if(p1->td>t)
{
p2=p1;//保存p1上一个节点
p1=p1->next;
}
if(p1->ty>0 && p1->td<=t)
{
if(p1->ty<=a)
{
cout<<"在时间:"<<t<<" "<<p1->name<<"运行"<<endl; //p1固定为执行的位置
t=t+p1->ty;
p1->ty=0;
cout<<"在时间:"<<t<<" "<<p1->name<<"运行完毕"<<endl;
p1->Te=0;
p1->Te=t;
q=head;
q=q->next;
while(q->name!=p1->name)
{
q=q->next;
}
q->Te=p1->Te;
p2=p1;//保存p1上一个节点
p1=p1->next;
}
else
{
cout<<"在时间:"<<t<<" "<<p1->name<<"运行"<<endl; //p1固定为执行的位置
t=t+a;
p1->ty=p1->ty-a;
p2=p1;//保存p1上一个节点
p1=p1->next;
}
}
if(p1->ty==0)
{
if(p2==p1)
p=NULL;
else
{
p2->next=p1->next;
delete p1;
p1=p2->next;
}
}
}
cout<<"所有进程都执行完毕!"<<endl;
q=head;
q=q->next;
while(q!=NULL)
{
q->T=0;
q->T=q->Te-q->td;
count=count+q->T;
q=q->next;
}
TQ=count/n;//时间片轮转法进程平均周转时间
count=0.0;
q=head;
q=q->next;
while(q!=NULL)
{
q->W=0;
q->W=q->T/q->ty;
count=count+q->W;
q=q->next;
}
WQ=count/n;//时间片轮转法进程平均带权周转时间
cout<<"平均周转时间为:"<<TQ<<endl;
cout<<"平均带权周转时间为:"<<WQ<<endl;
}
void QdPZ(JC *head)//强占式短进程优先算法计算平均周转时间和平均带权周转时间
{
double TQ=0.0;//进程平均周转时间
double WQ=0.0;//进程平均带权周转时间
JC *p,*q;
q=head;
q=q->next;
p=copy(head);
p=p->next;
double count=0.0;
double t=p->td;//系统时间
JC *p1,*p2,*p3;
p1=p2=p3=p;
while(p!=NULL)
{
p1=p2=p3=p;
while((p2->next!=NULL)&&(p2->next->td<=t))//选择当前时间已提交的进程中运行时间最短的执行
{
if(p2->next->ty<p1->ty)
{
p3=p2;//保存p1上一个节点
p1=p2->next;
}
p2=p2->next;
}
if(t<p1->td) t=p1->td;
cout<<"时间:"<<t<<" "<<p1->name<<" 运行!\n"; //p1固定为执行的位置
if(p2->next!=NULL&&(p2->next->td<(t+p1->ty)))
{
p1->ty=p1->ty-(p2->next->td-t);
t=p2->next->td;
cout<<"时间:"<<t<<" "<<p1->name<<"暂停,剩余运行时间('"<<p1->ty<<"') "<<p2->next->name<<"就绪,此时产生中断"<<endl;
}
else
{
p1->Te=0;
t=t+p1->ty;
p1->Te=t;
cout<<"时间:"<<t<<"时刻程序"<<p1->name<<"运行完毕"<<endl;
p1->ty=0;
q=head;
q=q->next;
while(q->name!=p1->name)
{
q=q->next;
}
q->Te=0;
q->Te=p1->Te;
}
if(p1->ty==0)
{
if(p3==p1)
p=p1->next;
else{
p3->next=p1->next;
delete p1;}
}
}
cout<<"此时所有进程都以执行完毕!"<<endl;
q=head;
q=q->next;
while(q!=NULL)
{
q->T=0;
q->T=q->Te-q->td;
count=count+q->T;
q=q->next;
}
TQ=count/n;//强占式短进程优先算法进程平均周转时间
cout<<"平均周转时间为:"<<TQ<<endl;
count=0.0;
q=head;
q=q->next;
while(q!=NULL)
{
q->W=0;
q->W=q->T/q->ty;
count=count+q->W;
q=q->next;
}
WQ=count/n;//强占式短进程优先算法进程平均带权周转时间
cout<<"平均带权周转时间为:"<<WQ<<endl;
}
void ZPrint(JC *head)
{
JC *p;
p=head;
int b;
int c=1;
while(c==1)
{
cout<<"*******************************"<<endl;
cout<<"* 选择您要进行的操作序号 *"<<endl;
cout<<"*1. 时间片轮转法: *"<<endl;
cout<<"*2.抢占式进程优先算法: *"<<endl;
cout<<"*3.重新输入进程信息: *"<<endl;
cout<<"*4.退出: *"<<endl;
cout<<"*******************************"<<endl;
cin>>b;
system("cls");
if(b!=1&&b!=2&&b!=3&&b!=4)
cout<<"您输入有误,请重试"<<endl;
else if(b==1)SljPZ(p);
else if(b==2)QdPZ(p);
else if(b==3)
{
JC *head;
head=NULL;
head=create(head);
print(head);
p=head;
}
else {c=b;break;}
c=1;
}
}
int main()
{
double count;
JC *head;
head=NULL;
head=create(head);
print(head);
ZPrint(head);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -