📄 chenqi.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<iostream.h>
#include<conio.h>
struct kongkuai
{
int startaddr;
int size;
int flag;
}kongxq[];
kongkuai kongxq[6]={ //初始化空闲区表
{10,30,1},
{80,40,1},
{160,80,1},
{300,100,1},
{450,120,1},
{650,150,1}
};
int allocate(int jobsize) //空闲区分配函数
{
int i;
int t=0;
for(i=0;i<6;i++)
if(kongxq[i].flag==1&&kongxq[i].size>jobsize)
{
kongxq[i].startaddr+=jobsize;
kongxq[i].size-=jobsize;
t=1;
return kongxq[i].startaddr-jobsize;
}
else
if(kongxq[i].flag==1&&kongxq[i].size==jobsize)
{
kongxq[i].flag=0;
t=1;
return kongxq[i].startaddr;
}
if(t==0)
return false;
return 1;
}
circle()
{
int i,j;
struct kongkuai temp;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(kongxq[j].size>kongxq[j+1].size)
{
temp.startaddr=kongxq[j].startaddr;
temp.size=kongxq[j].size;
temp.flag=kongxq[j].flag;
kongxq[j].startaddr=kongxq[j+1].startaddr;
kongxq[j].size=kongxq[j+1].size;
kongxq[j].flag=kongxq[j+1].flag;
kongxq[j+1].startaddr=temp.startaddr;
kongxq[j+1].size=temp.size;
kongxq[j+1].flag=temp.flag;
}
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(kongxq[j].flag==0&&kongxq[j+1].flag==1)
{
temp.startaddr=kongxq[j].startaddr;
temp.size=kongxq[j].size;
temp.flag=kongxq[j].flag;
kongxq[j].startaddr=kongxq[j+1].startaddr;
kongxq[j].size=kongxq[j+1].size;
kongxq[j].flag=kongxq[j+1].flag;
kongxq[j+1].startaddr=temp.startaddr;
kongxq[j+1].size=temp.size;
kongxq[j+1].flag=temp.flag;
}
return 1;
}
callback() //空闲区回收函数
{
int s,len,t1=0,t2=0,t3=0,i,j;
printf("\n请输入回收区的起始地址:\n");
scanf("%d",&s);
printf("请输入回收区的大小:\n");
scanf("%d",&len);
for(i=0;i<6;i++)
{
if((kongxq[i].startaddr==s+len)&&(kongxq[i].flag==1))
{
len+=kongxq[i].size;
t1=1;
for(j=0;j<6;j++)
{
if((kongxq[j].startaddr+kongxq[j].size==s)&&(kongxq[j].flag==1))
{
kongxq[i].flag=0;
kongxq[j].size=kongxq[j].size+len;
t2=1;
break;
}
if(t2==0)
{
kongxq[i].startaddr=s;
kongxq[i].size=len;
break;
}
}
}
}
if(t1==0)
{
for(i=0;i<6;i++)
{
if((kongxq[i].startaddr+kongxq[i].size==s)&&(kongxq[i].flag==1))
{
kongxq[i].size+=len;
t3=1;
break;
}
if(t3==0)
for(j=0;j<6;j++)
if(kongxq[j].flag==0)
{
kongxq[j].startaddr=s;
kongxq[j].size=len;
kongxq[j].flag=1;
break;
}
}
}
return 1;
}
void print() //空闲区状态打印函数
{
int i;
printf("\n 起始地址 | 大小 | 标记 \n\n");
for(i=0;i<6;i++)
{
printf(" %3d | %3d | %3d \n",
kongxq[i].startaddr,kongxq[i].size,kongxq[i].flag);
}
printf("\n");
}
int main()
{
int jobsize,start;
char end;
int sa,sz,i;
printf("初始化空闲区:\n");
for(i=1;i<=6;i++)
{
cout<<"请输入第"<<i<<"个空闲区的首地址和空闲区大小:"<<endl;
cin>>sa>>sz;
kongxq[i-1].startaddr=sa;
kongxq[i-1].size=sz;
}
printf("初始空闲区状态:\n");
circle();
print();
while(true)
{
printf("\n请输入你想进行的操作:\n\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" $ 1.请求空闲区 2.回收空闲区 3.退出 $\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
end=getch();
if(end=='1')
{
printf("\n请输入请求空闲区的作业大小:");
scanf("%d",&jobsize);
start=allocate(jobsize);
circle();
printf("分配后空闲区状态:\n");
print();
if(!start)
printf("没有适合的空闲区大小!\n");
else
printf("作业起始地址:%d\n",start);
printf("作业大小:%d\n",jobsize);
}
else if(end=='2')
{
callback();
circle();
printf("回收后空闲区状态:\n");
print();
}
else if(end=='3')
{
printf("\n");
break;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -