#include<iostream>
#include<cstdio>
using namespace std;
//定义一些全局变量
int FreePartition[100];//空闲分区块数组
int FirstPartition[100];//首次适应算法数组
int BestPartition[100];//最佳适应算法数组
int WorstPartition[100];//最坏适应算法数组
int JobSize[100];//每个作业的大小
int FreePartitionNum,JobNum;//分区块数,作业数
//首次适应算法
void First()
{
int i,j;
char str;
for(i=0;i<FreePartitionNum;i++)
FirstPartition[i]=FreePartition[i];
for(i=0;i<JobNum;i++)//找出第一块满足作业的分区
{
str='A'+i;
for(j=0;j<FreePartitionNum;j++)
{
if(FirstPartition[j]>=JobSize[i]) //有空闲内存块可以存储该进程
{
FirstPartition[j]-=JobSize[i];//找到后把分区大小减去作业的大小
printf("作业%c在第%d块分区中\n",str,j+1);
break;
}
else //整个内存都不能满足情况
{
if(j==FreePartitionNum-1)
printf("作业%c不能装入到分配的内存中!\n",str);
}
}
}
printf("\n");
printf("分配之后剩余的情况:\n");
for(i=0;i<FreePartitionNum;i++)
printf("%d ",FirstPartition[i]);
printf("\n\n");
}
//最佳适应算法
void Best()
{
int i,j,k=0,n;
char str;
for(i=0;i<FreePartitionNum;i++)
{
BestPartition[i]=FreePartition[i];
}
for(i=0;i<JobNum;i++)
{
str='A'+i;
for(j=0;j<FreePartitionNum;j++)
{
if(BestPartition[j]>=JobSize[i])//有空闲内存块可以存储该进程
{
k=j;
for(n=0;n<FreePartitionNum;n++) //寻找最小的满足条件的空闲块
{
if(BestPartition[n]<BestPartition[k] && BestPartition[n]>=JobSize[i])//找最佳的
k=n;
}
BestPartition[k]-=JobSize[i];
printf("作业%c在第%d块分区中\n",str,k+1);
break;
}
else //整个内存都不能满足情况
if(j==FreePartitionNum-1)
{
printf("作业%c不能装入到分配的内存中!\n",str);
break;
}
}
}
printf("\n");
printf("分配之后剩余的情况:\n");
for(i=0;i<FreePartitionNum;i++)
printf("%d ",BestPartition[i]);
printf("\n\n");
}
//最坏适应算法
void Worst()
{
int i,j,k=0;
char str;
for(i=0;i<FreePartitionNum;i++)
{
WorstPartition[i]=FreePartition[i];
}
for(i=0;i<JobNum;i++)
{
str='A'+i;
for(j=0;j<FreePartitionNum;j++) //寻找最大的空闲内存块
{
if(WorstPartition[k]<WorstPartition[j])
k=j;
}
if(WorstPartition[k]>=JobSize[i]) //只需要比较一次,若不满足则不能存储
{
WorstPartition[k]-=JobSize[i];
printf("作业%c在第%d块分区中\n",str,k+1);
}
else //整个内存都不能满足的情况
printf("作业%c不能装入到分配的内存中!\n",str);
}
printf("\n");
printf("分配之后剩余情况:\n");
for(i=0;i<FreePartitionNum;i++)
printf("%d ",WorstPartition[i]);
printf("\n\n");
}
void scanfmenu()
{
int i;
printf("输入分区块数:\n");
scanf("%d",&FreePartitionNum);
printf("输入每个分区的大小:\n");
for(i=0;i<FreePartitionNum;i++)
scanf("%d",&FreePartition[i]);
printf("输入作业数:\n");
scanf("%d",&JobNum);
printf("输入每个作业的大小:\n");
for(i=0;i<JobNum;i++)
scanf("%d",&JobSize[i]);
}
void mainmenu()
{
printf("\n\n\n");
printf("----------------------请输入你想选用的算法!-----------------\n");
printf("------------------------1.首次适应算法-----------------------\n");
printf("------------------------2.最佳适应算法-----------------------\n");
printf("------------------------3.最坏适应算法-----------------------\n");
printf("------------------------4.重新输入信息-----------------------\n");
printf("------------------------0.退出-------------------------------\n");
printf("\n");
}
void printmenu()
{
int n=1; //设置选择变量n
while(n!=0) //除0的循环
{
mainmenu(); //主菜单
scanf("%d",&n);
switch(n) //switch选择
{
case 0:
break;
case 1:
printf("------------首次适应算法-----------------\n");
First(); //首次适应算法函数
break;
case 2:
printf("------------最佳适应算法-----------------\n");
Best(); //最佳适应算法函数
break;
case 3:
printf("------------最坏适应算法-----------------\n");
Worst(); //最坏适应算法函数
break;
case 4:
printf("----请重新输入你想要准备分配的作业!--\n");
scanfmenu();
break;
default:
break;
}
}
}
int main()
{
scanfmenu(); //调用输入菜单函数
printmenu(); //带用输出菜单函数
return 0;
}
操作系统实验课设-三种适应算法
最新推荐文章于 2023-12-31 16:30:00 发布