📄 zyglcx.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 + -