⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zyglcx.cpp

📁 作业管理程序,利用C语言编写的作业管理程序 模拟可变分区存储空间的分配回收算法。要求菜单式操作
💻 CPP
字号:




#define n 10 
#define m 10 
#define area 1000 
#define  minisize 50 
#include <stdio.h>
#include <stdlib.h> 
struct 
{
float address;  /*分区起始地址*/ 
float lenth;    /*空闲长度,单位为块*/ 
int flag;       /*空闲表登记栏标志,用"0"表示空栏目,"1"表示未分配*/ 
} table[n];     /*空闲表*/ 
void select()
{
system("cls");  /*输出功能提示*/
system("title 王琦的课程设计!");
system("color 5e");
printf("┏━━━━━━━━━━┓\n");
printf("┃请选择服务类型      ┃\n"); 
printf("┣━━━━━━━━━━┫\n");
printf("┃1 调入新的文件      ┃\n"); 
printf("┃2 收回文件磁盘空间  ┃\n"); 
printf("┃3 打印磁盘分配情况表┃\n"); 
printf("┃4 退出              ┃\n");  /*输出功能提示*/ 
printf("┗━━━━━━━━━━┛\n");
printf("请选择服务类型:"); 
}
void main() 
{struct 
{
float address;  /* 已分分区起始块号*/ 
float length;   /* 已分分区长度,单位为字节*/ 
int flag;       /*已分配区表登记栏标志,用"0"表示空栏目,已分配用文件名表示*/ 
}used_table[n]; /*已分配区表*/ 
struct 
{
float address;  /*分区起始块号*/ 
float length;   /*空闲区长度,单位为块*/ 
int flag;       /*空闲表登记栏标志,用"0"表示空栏目,"1"表示未分配*/ 
}table[n];      /*空闲表*/ 
int i,a,name,j=0,flag=0,right=0,h; 
float length,head,tail; 
for(i=0;i<n;i++) 
used_table[i].flag=0; /*已分配区表初始化*/ 
table[0].address=0.0; 
table[0].length=1000.0; 
table[0].flag=1; /*空闲表初始化*/ 
for(i=1;i<m;i++) 
table[i].flag=0; 
select();
scanf("%d",&a); /*读入选择的服务 */ 
while(a!=4) 
{   
if(a==1) /*若为1则分配磁盘空间*/ 
{
system("color 2e");
printf("输入文件名:"); 
scanf("%d",&name); 
printf("输入所需磁盘大小:"); 
scanf("%f",&length); /*读入文件名字和所需磁盘大小*/ 
i=0; 
while(i<n&&right==0) 
{ if(table[i].flag==1&&table[i].length>=length) 
{ break; 
}i++; 
}              /*找到一个合适的空间,分配给文件*/ 
if(i>=n) 
printf("无足够磁盘空间\n"); /*若磁盘不足,则给于相应的提示*/ 
else 
{while(used_table[j].flag!=0) 
j++; 
used_table[j].address=table[i].address; 
used_table[j].length=length; /*对磁盘取表和已分配区表进行调整*/ 
used_table[j].flag=name; 
table[i].address=table[i].address+length; 
table[i].length-=length; 
} 
} 
else if(a==2) 
{ 
system("color 4e");
printf("输入想删除的文件名: "); 
scanf("%d",&name); 
h=0; 
for(i=0;i<n;i++) 
if(used_table[i].flag==name) 
{
head=used_table[i].address; 
tail=used_table[i].address+used_table[i].length; 
used_table[i].flag=0;} 
while(table[h].flag!=0) h++; 
for(i=0;i<m;i++) 
if((table[i].address==tail)&&(table[i].flag==1)) 
{
tail=tail+table[i].length; 
table[i].flag=0;} /*若收回磁盘区域后续磁盘未分配,则将其合并*/ 
for(j=0;j<m;j++) 
if(head==(table[j].address+table[j].length)&&(table[j].flag==1)) 
{
table[j].length+=(tail-head); 
flag=1; 
}  /*若收回磁盘区域前部未分配,则将其合并*/ 
if(flag==0) 
{
table[h].address=head; 
table[h].length=tail-head; 
table[h].flag=1;flag=0;} 
} 
else if(a==3)               /*若选择3则打印磁盘分配表*/ 
{   
system("color 1e");
printf("┏━━━━━━━━━━━━━━━━━┓\n");
printf("┃用户表                            ┃\n"); 
printf("┣━━━━━━━━━━━━━━━━━┫\n");
printf("┃起始块号   \t长度        \t标志┃\n"); 
for(i=0;i<n;i++) 
{
if(used_table[i].flag!=0) 
printf("┃%d %f\t%f\t%d   ┃\n",i,used_table[i].address,used_table[i].length,used_table[i].flag); 
} 
printf("┗━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
printf("┏━━━━━━━━━━━━━━━━━┓\n");
printf("┃系统表                            ┃\n"); 
printf("┣━━━━━━━━━━━━━━━━━┫\n");
printf("┃起始块号   \t长度        \t标志┃\n"); 
for(i=0;i<n;i++) 
{
if(table[i].flag==1) 
printf("┃%d %f\t%f\t%d   ┃\n",i,table[i].address,table[i].length,table[i].flag); 
} 
printf("┗━━━━━━━━━━━━━━━━━┛\n");
} 
system("pause");
select();
scanf("%d",&a); 
} 
}/*结束*/ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -