1、运行平台:MyEclipse 使用方法:新建一个Distribution1类,粘贴代码即可 package mypackage; import javax.swing.JOptionPane; public class Distribution1 { int size=0; public int j;//用于记录内存分块数 int[] part=new int[1000];//用于记录内存分块的大小 int[] address=new int[1000];//用于记录内存分块的起始地址 int[] flag=new int[1000];//用于记录内存分块的分配
2、情况 String Suggestion; Distribution1(){ for(int i=0;i<1000;i++) { part[i]=0; address[i]=0; flag[i]=0; } }// end Distribution1() void Input(){ Suggestion=JOptionPane.showInputDialog("请输入可分配内存的大小:"); size=Integer.parseInt(Suggestion); }//end Input() voi
3、d Output(){ Suggestion="| "+"分区号"+" | "+"分区大小"+" | "+"起始地址"+" | "+"状态"+" |"; for(int k=0;k<=j;k++) { Suggestion+="\n| "+k+" | "; Suggestion+=part[k]+" | "; Suggestion+=address[k]+" | "; Suggestion+=flag[k]+" |"; } JOptionPane.showMessageDialog(
4、null, Suggestion,"内存分配情况",JOptionPane.INFORMATION_MESSAGE); }//end Output() void Begin(){ char s='y'; int i=0; int count=0; Suggestion=JOptionPane.showInputDialog("请输入内存的起始地址:"); address[i]=Integer.parseInt(Suggestion);//记录首地址 Suggestion=JOptionPane.showInputDialog("请输入第0块分区的大小
5、"); part[i]=Integer.parseInt(Suggestion);//记录第0块分区的大小 count=part[i]; flag[i]=1; i++; j++; Suggestion=JOptionPane.showInputDialog("是否继续分块,是请输入'y'或'Y',否请输入任意字符:"); s=Suggestion.charAt(0); while(s=='y'||s=='Y') { Suggestion=JOptionPane.showInputDialog("请输入第"+i+"块分区的大小"); part[i
6、]=Integer.parseInt(Suggestion);
if(size-count 7、意的字符:");
s=Suggestion.charAt(0);
}//while(s=='y'||s=='Y')
part[i]=size-count;
address[i]=address[i-1]+part[i-1];
flag[i]=0;
}//end Begin()
void Restore(){//可作改进,在Suggestion中输入所有要回收的内存块,再将其解析出来。
char s;
int i;
int k=0;
int count=0;
int tag=0;
int number[]= 8、{'0','1','2','3','4','5','6','7','8','9'};
Suggestion=JOptionPane.showInputDialog("是否要回收内存,是请输入'y'或'Y',否请输入任意的字符:");
s=Suggestion.charAt(0);
if(s=='y'||s=='Y'){
Suggestion=JOptionPane.showInputDialog("请输入要回收的内存块号,中间以空格相间并以空格结尾:");
for(i=0;i 9、Suggestion.charAt(i)!=' ')//
{
for(k=0;k<10;k++)
{
if(Suggestion.charAt(i)==number[k])
{
tag=k+tag*10;//提取字符串中的整数
}//if
}//for
}//if
else{
if(tag>j){
JOptionPane.showMessageDialog(null,"输入的内存号不存在,请重新输入!","Warning",JOptionPan 10、e.INFORMATION_MESSAGE);
continue;
}
else{
flag[tag]=0;
tag=0;
}
}
}//for
}//if
for(i=1;i<=j;i++)//合并连续的空闲空间
{
if(flag[i-1]==0&&flag[i]==0)
{
part[i-1]=part[i-1]+part[i];
count++;
for(k=i;k<=j;k++)
{
part[ 11、k]=part[k+1];
address[k]=address[k+1];
}//for
}//if
}//for
for(i=1;i<=j;i++)//移动flag数组的元素
{
if(flag[i-1]==0&&flag[i]==0)
{
for(k=i;k<=j;k++)
{
flag[k]=flag[k+1];
}//for
}//if
}//for
j=j-count;
}//end Restore()
public st 12、atic void main(String arg[]){
JOptionPane.showMessageDialog(null, "\t\t\t\t\t可变分区首次适应算法","Title",JOptionPane.INFORMATION_MESSAGE);
Distribution1 distribute=new Distribution1();
distribute.Input();
distribute.Begin();
distribute.Output();
distribute.Restore();
distribute.Output();
System.exit(0);
}
}






