#include"stdio.h"
#include"stdlib.h"
#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100
struct{
float address/*已分分区起始地址*/
float length/*已分分区长度,单位为字节*/
int flag/*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[n]/*已分配区表*/
struct{
float address/*空闲区起始地址*/
float length/*空闲区长度,单位为字节*/
int flag/*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}free_table[m]/*空闲区表*/
void main( )
{
int i,a
void allocate(char str,float leg)//分配主存空间函数
void reclaim(char str)//回收主存函数
float xk
char J/*空闲分区表初始化:*/
free_table[0].address=10240
free_table[0].length=102400
free_table[0].flag=1
for(i=1i<mi++)
free_table[i].flag=0/*已分配表初始化:*/
for(i=0i<ni++)
used_table[i].flag=0
while(1)
{
printf("\n选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n")
printf("选择功项(0~3) :")
scanf("%d",&a)
switch(a)
{
case 0: exit(0)/*a=0程序结束*/
case 1: /*a=1分配主存空间*/printf("输入作业名J和作业所需长度xk: ")
scanf("%*c%c%f",&J,&xk)
allocate(J,xk)/*分配主存空间*/
break
case 2: /*a=2回收主存空间*/printf("输入要回收分区的作业名")
scanf("%*c%c",&J)reclaim(J)/*回收主存空间*/
break
case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n起始地址 分区长度 标志\n")
for(i=0i<mi++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag)
printf(" 按任意键,输出已分配区表\n")
getchar()
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n")
for(i=0i<ni++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag)
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag)
break
default:printf("没有该选项\n")
}/*case*/
}/*while*/
}/*主函数结束*/
int uflag//分配表标志
int fflag//空闲表标志
float uend_address
float fend_address
void allocate(char str,float leg)
{
uflag=0fflag=0
int k,ifloat ressize
for(i=0i<mi++)
{
if(free_table[i].flag==1 &&free_table[i].length>=leg)
{
fflag=1break
}
}
if(fflag==0)
printf("没有满足条件的空闲区\n")
else
{
ressize=free_table[i].length-leg
for(k=0k<nk++)
{
if(used_table[k].flag==0)
{
if(ressize<minisize)//剩余块过小
{
used_table[k].length=free_table[i].length
used_table[k].address=free_table[i].address
used_table[k].flag=str
free_table[i].length=0
free_table[i].flag=0
break
}
else
{
used_table[k].address=free_table[i].address+ressize
used_table[k].flag=str
used_table[k].length=leg
free_table[i].length=ressize
break
}
}
}//for结束
}
}
void reclaim(char str)
{
uflag=0fflag=0
int k,i
for(k=0k<nk++)
{
if(used_table[k].flag==str)
{
uflag=1break
}
}
if(uflag==0)
printf("\n找不到该作业!\n")
else
{
for(i=0i<mi++)
{
uend_address=used_table[k].address+used_table[k].length
fend_address=free_table[i].address+free_table[i].length
if(used_table[k].address==fend_address)//上邻
{
fflag=1
free_table[i].length=free_table[i].length+used_table[k].length
free_table[i].flag=1
used_table[k].flag=0
used_table[k].length=0
used_table[k].address=0
printf("\n已回收!\n")
break
}
else
{
if(free_table[i].address==uend_address)//下邻
{
fflag=1
free_table[i].address=used_table[k].address
free_table[i].length=free_table[i].length+used_table[k].length
free_table[i].flag=1
used_table[k].flag=0
used_table[k].length=0
used_table[k].address=0
printf("\n已回收!\n")
break
}
}
}//for结束
if(fflag==0)
{
i=0
for(i=0i<mi++)
{
if(free_table[i].flag==0)
{
free_table[i].address=used_table[k].address
free_table[i].length=used_table[k].length
free_table[i].flag=1
used_table[k].length=0
used_table[k].flag=0
used_table[k].address=0
break
}
}
printf("\n已回收!\n")
}
}
}
方法/步骤首先我们先去网上找到这个软件的安装包,然后安装到自己电脑上,在安装的过程中,W7系统可能会说软件与系统不兼容,这个没事的,继续安装就是
安装好后双击这个软件在桌面上的图标,打开软件后,我们需要建立c语言编写文件,点击文件新建一个C++source file,然后开始编写程序!
编写程序的过程中,要理清思路,先把头文件写上,该注释的地方还是要注释,这样以后看程序的时候不至于不懂!
把程序写好后,一定要保存,其实我们在写程序的时候就应该写一句保存一次,这是因为这个软件有时候运行不稳定!万一出现程序闪退,我们写的程序就没有了,这让人很抓狂的!
保存好程序后,我们可以开始编译执行链接程序了,如果一切无误的话,会生成一个exe文件,我们就可以实现编写的功能了,如果程序报错,那么我们需要找到错误的地方进行改正!
说了这么多,是时候自己动手验证了,这个软件使用起来很方便,功能也很强大,多练习几次就一定会使用的!