#include #include <string.h> #include <stdlib.h> #include <stdio.h> using namespace std;

int map[100][100];

typedef struct file { char fileName[30]; /* 文件名字 / int length; / 文件长度 / int start; / 文件存储时的初始位置 */ }file;

file File[60]; int line, column; /* 行 列 / int fileTotalNum = 0; / 总文件数 */

/*

  • *函数名:mapInit()
  • *描述: 对位示图进行初始化
  • *参数: 无
  • *返回值: 无 **/ void mapInit() { int i, j; printf( "请输入行和列:" ); scanf( "%d%d", &line, &column ); for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { map[i][j] = 0; printf( "%3d", map[i][j] ); } printf( "\n" ); } }

/*

  • *函数名:allocation(int fileNum, bool isContinuous)
  • *描述: 分配空间给文件,采用连续分配方式或离散分配方式
  • *参数: fileNum 第几个文件 isContinuous 是否采用连续分配方式
  • *返回值: 无 */ void allocation( int fileNum, bool isContinuous ) { int length = File[fileNum].length; int b[60]; int i, j; int x = 0; if (isContinuous) { // 连续分配方式 for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { if (map[i][j] == 0) { b[x] = i * column + j; x++; if (x == length) break; / 这个 break ,跳出 j 循环 / } else x = 0; } if (x == length) break; / 这里 break, 跳出整个 for循环体 / } } else { // 离散分配方式 for (i = 0; i < length; i++) { int x, y; printf("请输入第%d个盘块的行列坐标:", i + 1); scanf("%d%d", &x, &y); if (x >= 0 && x < line && y >= 0 && y < column && map[x][y] == 0) { b[i] = x * column + y; } else { printf("输入的坐标不合法或该盘块已被占用,请重新输入\n"); i--; } } } if (length > x) printf( "空间不足,无法分配\n" ); else { File[fileNum].start = b[0]; for (int i = 0; i < x; i++) { int x1 = b[i] / column; int y1 = b[i] % column; map[x1][y1] = 1; / 置1 代表使用 过 */ } } for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { printf("%3d", map[i][j]); } printf("\n"); } }

/*

  • *函数名:recovery(char s[])
  • *描述: 通过文件名回收文件占用空间,并将位示图中对应标志位重新初始化为0
  • *参数: char s[] 文件名
  • *返回值: 无 */ void recovery( char s[] ) { int cnt = -1; for ( int i = 0; i < fileTotalNum; i++ ) { if ( strcmp( s, File[i].fileName ) == 0 ) { cnt = i; / 记录下 第几个 文件 */ break; } } if ( cnt == -1 ) { printf( "没有此文件,请重新输入!\n" ); } int start = File[cnt].start; int length = File[cnt].length; for ( int i = start; i < start + length; i++ ) { int x1 = i / column; int y1 = i % column; map[x1][y1] = 0; } for ( int i = cnt + 1; i < fileTotalNum; i++ ) /*删除文件后 将其后面的文件前移 覆盖原来文件 */ { strcpy( File[i - 1].fileName, File[i].fileName ); File[i - 1].start = File[i].start; File[i - 1].length = File[i].length; } printf( "回收成功\n" ); for ( int i = 0; i < line; i++ ) { for ( int j = 0; j < column; j++ ) { printf( "%3d", map[i][j] ); } printf( "\n" ); } }

/*

  • *函数名:printMap()
  • *描述: 输出位示图
  • *参数: 无
  • *返回值: 无 **/ void printMap() { for ( int i = 0; i < line; i++ ) { for ( int j = 0; j < column; j++ ) { printf( "%3d", map[i][j] ); } printf( "\n" ); } }

/*

  • *函数名:menu()
  • *描述: 菜单函数,提供用户选择操作
  • *参数: 无
  • 返回值: 无 / void menu() { printf( "\n" ); printf( " 1. 初始化磁盘位示图 \n" ); printf( " 2. 文件分配(连续) \n" ); printf( " 3. 文件分配(离散) \n" ); printf( " 4. 回收文件占用 \n" ); printf( " 5. 查看位示图 \n" ); printf( " 6. 退出程序 \n" ); printf( "***\n" ); }

int main() { int choice; bool isContinuous = true; while ( 1 ) { menu(); printf( "请输入您的选择: " ); scanf( "%d", &choice ); switch ( choice ) { case 1: { mapInit(); break; } case 2: { char fileName[30]; int length; printf( "请输入文件名和文件长度:" ); scanf( "%s%d", fileName, &length ); File[fileTotalNum].length = length; strcpy( File[fileTotalNum].fileName, fileName ); fileTotalNum++; allocation( fileTotalNum - 1, isContinuous ); break; } case 3: { char fileName[30]; int length; printf( "请输入文件名和文件长度:" ); scanf( "%s%d", fileName, &length ); File[fileTotalNum].length = length; strcpy( File[fileTotalNum].fileName, fileName ); fileTotalNum++; isContinuous = false; allocation( fileTotalNum - 1, isContinuous ); break; } case 4: { char s[30]; printf( "请输入要回收的文件名:" ); scanf( "%s", s ); recovery( s ); break; } case 5: { printMap(); break; } case 6: { return 0; } default: { printf( "您输入的选项不存在,请重新输入!\n" ); break; } } } return 0; }

磁盘文件分配模拟系统:连续分配和离散分配

原文地址: https://www.cveoy.top/t/topic/owFg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录