#include <iostream>
using namespace std;
const int MaxNumber=100;
int FreePartition[MaxNumber];
int ProcessNeed[MaxNumber];
int n,m;
int i,j,k,x,y,z;
int b[MaxNumber];
int p[MaxNumber];
int q[MaxNumber];
int r[MaxNumber];
int t[MaxNumber];
char a[MaxNumber][3];
char w;
//char Partition[MaxNumber];
char Process[MaxNumber];
void input(){
cout<<"=========================="<<endl;
cout<<"=====动态分区分配算法====="<<endl;
cout<<"**************************"<<endl;
cout<<"请输入内存中空闲分区个数为n:";
cin>>n;
cout<<endl;
cout<<"请输入需要分配的进程个数为m(必须满足:n>=m):";
cin>>m;
cout<<endl;
cout<<"请输入空闲分区大小,单位(k):"<<endl;
for(i=0;i<n;i++){
cin>>FreePartition[i];
}
cout<<"请输入进程名:"<<endl;
for(i=0;i<m;i++){
cin>>Process[i];
}
cout<<"输入各个进程需要空间大小,单位(k):"<<endl;
for(i=0;i<m;i++){
cin>>ProcessNeed[i];
}
}
void First(){
cout<<endl;
cout<<"首次适应算法(First):"<<endl;
for(i=0;i<n;i++){
p[i]=FreePartition[i];
}
for(i=0;i<n;i++)
for(j=0;j<3;j++){
a[i][j]='*';
}
for(i=0;i<m;i++)
for(j=0;j<n;j++){
if(ProcessNeed[i]<=p[j]){
p[j]-=ProcessNeed[i];
if(a[j][0]!='*'){
if(a[j][1]!='*')
a[j][2]=Process[i];
else
a[j][1]=Process[i];
}
else
{
a[j][0]=Process[i];
}
break;
}
}
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
cout<<a[i][j];
}
cout<<" ||";
}
cout<<endl;
}
void Circle(){
cout<<endl;
cout<<"循环首次算法(Circle):"<<endl;
for(i=0;i<n;i++){
p[i]=FreePartition[i];
}
for(i=0;i<n;i++)
for(j=0;j<3;j++){
a[i][j]='*';
}
j=0;
for(i=0;i<m;i++)
for(;j<n;j++){
if(ProcessNeed[i]<=p[j]){
p[j]-=ProcessNeed[i];
if(a[j][0]!='*'){
if(a[j][1]!='*')
a[j][2]=Process[i];
else
a[j][1]=Process[i];
}
else
{
a[j][0]=Process[i];
}
break;
}
}
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
cout<<a[i][j];
}
cout<<" ||";
}
cout<<endl;
}
void Best(){
cout<<endl;
cout<<"最佳适应算法(Best):"<<endl;
for(i=0;i<n;i++){
p[i]=FreePartition[i];
r[i]=0;
}
for(i=0;i<n;i++)
for(j=0;j<3;j++){
a[i][j]='*';
}
for(i=0;i<m;i++){
for(k=0;k<n;k++){
if(r[k]!=2){
r[k]=0;
}
}
for(j=0;j<n;j++){
if(ProcessNeed[i]<=p[j]){
p[j]-=ProcessNeed[i];
r[j]=1;
}
}
for(k=0;k<n;k++){
q[k]=p[k];
}
for(k=0;k<n;k++)
{
if(r[k]==1){
x=q[k];
}
}
for(k=0;k<n;k++)
{
if(r[k]==1){
if(x>q[k])
{
x=q[k];
}
}
}
for(k=0;k<n;k++){
if(p[k]==x)
{
if(a[k][0]!='*'){
if(a[k][1]!='*')
a[k][2]=Process[i];
else
a[k][1]=Process[i];
}
else
{
a[k][0]=Process[i];
}
y=k;
r[k]=2;
break;
}
}
for(k=0;k<n;k++){
if(k!=y&&r[k]!=2){
p[k]=FreePartition[k];
}
}
}
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
cout<<a[i][j];
}
cout<<" ||";
}
cout<<endl;
}
void Worst(){
cout<<endl;
cout<<endl;
cout<<"最坏适应算法(Worst):"<<endl;
for(i=0;i<n;i++){
p[i]=FreePartition[i];
b[i]=FreePartition[i];
r[i]=0;
t[i]=0;
}
for(i=0;i<n;i++)
for(j=0;j<3;j++){
a[i][j]='*';
}
for(i=0;i<m;i++){
for(k=0;k<n;k++){
if(t[k]!=2){
r[k]=0;
}
}
for(j=0;j<n;j++){
b[j]=p[j];
}
for(j=0;j<n;j++){
if(ProcessNeed[i]<=p[j]){
p[j]-=ProcessNeed[i];
r[j]=1;
}
}
for(k=0;k<n;k++){
q[k]=p[k];
}
for(k=0;k<n;k++)
{
if(r[k]==1){
x=q[k];
}
}
for(k=0;k<n;k++)
{
if(r[k]==1){
if(x<q[k])
{
x=q[k];
}
}
}
for(k=0;k<n;k++){
if(p[k]==x)
{
for(j=0;j<n;j++){
p[j]=b[j];
}
p[k]-=ProcessNeed[i];
if(a[k][0]!='*'){
if(a[k][1]!='*')
a[k][2]=Process[i];
else
a[k][1]=Process[i];
}
else
{
a[k][0]=Process[i];
}
r[k]=2;
y=k;
t[k]=2;
break;
}
}
}
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
cout<<a[i][j];
}
cout<<" ||";
}
cout<<endl;
}
void main(){
input();
cout<<"============================="<<endl;
cout<<endl;
cout<<"输入1_首次适应算法。"<<"输入2_循环首次算法。"<<endl;
cout<<"输入3_最佳适应算法。"<<"输入4_最坏适应算法。"<<endl;
cout<<"输入5_所有都打印出来。"<<"输入0退出系统!"<<endl;
cout<<"请输入:";
cin>>w;
while(w!='0')
{
switch(w){
case '1':
for(i=0;i<n;i++){
cout<<"第"<<i<<"区"<<"||";
}
cout<<endl;
for(i=0;i<n;i++){
cout<<" "<<FreePartition[i]<<" ";
}
First();
break;
case'2':
for(i=0;i<n;i++){
cout<<"第"<<i<<"区"<<"||";
}
cout<<endl;
for(i=0;i<n;i++){
cout<<" "<<FreePartition[i]<<" ";
}
Circle();
break;
case'3':
for(i=0;i<n;i++){
cout<<"第"<<i<<"区"<<"||";
}
cout<<endl;
for(i=0;i<n;i++){
cout<<" "<<FreePartition[i]<<" ";
}
Best();
break;
case'4':
for(i=0;i<n;i++){
cout<<"第"<<i<<"区"<<"||";
}
cout<<endl;
for(i=0;i<n;i++){
cout<<" "<<FreePartition[i]<<" ";
}
Worst();
break;
case'5':
for(i=0;i<n;i++){
cout<<"第"<<i<<"区"<<"||";
}
cout<<endl;
for(i=0;i<n;i++){
cout<<" "<<FreePartition[i]<<" ";
}
First();
Circle();
Best();
Worst();
break;
}
cout<<endl;
cout<<"输入1_首次适应算法。"<<"输入2_循环首次算法。"<<endl;
cout<<"输入3_最佳适应算法。"<<"输入4_最坏适应算法。"<<endl;
cout<<"输入5_所有都打印出来。"<<"输入0退出系统!"<<endl;
cout<<"请输入:";
cin>>w;
}
}