From 8e8b5ec6f33f9bed8cf16b78ec65f34fcbab3ddc Mon Sep 17 00:00:00 2001 From: pm6z2e7b3 <3431655916@qq.com> Date: Tue, 31 Dec 2024 17:32:12 +0800 Subject: [PATCH] ADD file via upload --- 1.txt | 297 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 1.txt diff --git a/1.txt b/1.txt new file mode 100644 index 0000000..9598984 --- /dev/null +++ b/1.txt @@ -0,0 +1,297 @@ +#include +#include +#include +#include + +#define M 5 // 进程数 +#define N 3 // 资源数 +#define TRUE 1 +#define FALSE 0 + +int MAX[M][N] = {{5, 5, 9}, {5, 3, 6}, {4, 0, 11}, {4, 2, 5}, {4, 2, 4}}; // 最大需求矩阵 +int AVAILABLE[N] = {17, 5, 13}; // 系统可用资源数 +int ALLOCATION[M][N] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; // 已分配矩阵 +int NEED[M][N] = {{5, 5, 9}, {5, 3, 6}, {4, 0, 11}, {4, 2, 5}, {4, 2, 4}}; // 需求矩阵 +int Request[N] = {0, 0, 0}; // 请求向量 + +void showdata(); // 显示系统状态 +void changdata(int); // 更改资源分配 +void rschangedata(int); // 回滚更改 +int safecheck(); // 检查系统安全性 +void inize(); // 初始化数据 +int isbigneed(int); // 检查需求 +int isbigavailable(int); // 检查可用资源 + +// 主程序 +int main() +{ + int i = 0, j = 0; + char flag; + inize(); + showdata(); + while (1) + { + while (1) + { + { + printf("请输入申请资源的进程号(从0到%d): ", M - 1); + scanf("%d", &i); + } + if (i < 0 || i >= M) + { + printf("输入的进程号不存在,请重新输入!\n"); + } + else + break; + } + // printf("请输入进程号"); + // printf("%d",i); + printf("请输入进程 %d 申请的资源数量\n", i); + for (j = 0; j < N; j++) + { + if (j == 0) + printf("请输入申请A类资源的数量:"); + if (j == 1) + printf("请输入申请B类资源的数量:"); + if (j == 2) + printf("请输入申请C类资源的数量:"); + scanf("%d", &Request[j]); + } + + if (isbigneed(i) && isbigavailable(i)) + { + changdata(i); + if (safecheck()) + { + rschangedata(i); + showdata(); + } + else + { + showdata(); + } + } + printf("\n"); + printf("按“Y”或‘y’继续操作,否则退出:"); + getchar(); + scanf("%c", &flag); + if (flag != 'y' && flag != 'Y') + { + printf("\n谢谢使用!\n"); + break; + } + printf("\n"); + } +} + +// 检查是否超过需求 +int isbigneed(int i) +{ + int j; + for (j = 0; j < N; j++) + { + if (Request[j] > NEED[i][j]) + { + printf("%d", i); + printf("号进程"); + printf("申请的资源数>进程"); + printf("%d", i); + printf("还需要"); + if (j == 0) + printf("A"); + if (j == 1) + printf("B"); + if (j == 2) + printf("C"); + printf("类资源的资源量!申请不合理,出错!\n"); + printf("\n\n请输入任意键继续\n"); + getch(); + return 0; + break; + } + } + return 1; +} + +// 检查是否超过可用资源 +int isbigavailable(int i) +{ + int j; + for (j = 0; j < N; j++) + { + if (Request[j] > AVAILABLE[j]) + { + printf("进程"); + printf("%d", i); + printf("申请的资源数大于系统可用"); + if (j == 0) + printf("A"); + if (j == 1) + printf("B"); + if (j == 2) + printf("C"); + printf("类资源的资源量!申请不合理,出错!\n"); + printf("\n\n请输入任意键继续\n"); + getch(); + return 0; + break; + } + } + return 1; +} + +// 初始化数据 +void inize() +{ + printf("\n\n\t\t**************************************************************************************************\t\t\n"); + printf("\t\t\t\t实验二 银行家算法实验\n"); + printf("\n\n\t\t**************************************************************************************************\t\t\n"); + printf("\t\t\t\t计算机科学与技术2402班\n"); + printf("\t\t\t\t姓名:黄明艳\n"); + printf("\t\t\t\t学号:202404130209\n"); + printf("\t\t\t\t完成时间:2024年11月12日\n"); + printf("\t\t\t\t请输入任意键进入演示过程\n"); + _getch(); + system("cls"); +} + +// 显示系统状态 +void showdata() +{ + int i, j; + printf("当前可用资源:\n"); + printf("* * *Available* * *:\n"); + printf("资源类别:A\tB\tC\n"); + printf("资源数目:\n"); + for (j = 0; j < N; j++) + { + printf("%d\t", AVAILABLE[j]); + } + printf("\n"); + printf("\n"); + printf("\n\n各进程还需要的资源:\n"); + printf("* * * * * * * * Nedd * * * * * * * * \n"); + printf("资源类别:A\tB\tC\n"); + for (i = 0; i < M; i++) + { + // printf(""); + // printf("%d", i); + // printf("号进程:"); + printf("%d号进程:", i); + for (j = 0; j < N; j++) + { + printf("%d\t", NEED[i][j]); + } + printf("\n"); + } + printf("\n\n各进程已分配的资源:\n"); + printf("* * * * * * Allocation * * * * * * \n"); + printf("资源类别:A\tB\tC\n"); + for (i = 0; i < M; i++) + { + // printf(""); + // printf("号进程:"); + printf("%d号进程:", i); + for (j = 0; j < N; j++) + { + printf("%d\t", ALLOCATION[i][j]); + } + printf("\n"); + } + printf("\n"); +} + +// 系统对进程请求响应,资源的暂时改变 +void changdata(int k) +{ + int j; + for (j = 0; j < N; j++) + { + AVAILABLE[j] = AVAILABLE[j] - Request[j]; + ALLOCATION[k][j] = ALLOCATION[k][j] + Request[j]; + NEED[k][j] = NEED[k][j] - Request[j]; + } +} + +// 系统资源状态回滚 +void rschangedata(int k) +{ + int j; + for (j = 0; j < N; j++) + { + AVAILABLE[j] = AVAILABLE[j] + Request[j]; + ALLOCATION[k][j] = ALLOCATION[k][j] - Request[j]; + NEED[k][j] = NEED[k][j] + Request[j]; + } +} + +// 安全性检查 +int safecheck() +{ + int WORK[N], FINISH[M], temp[M], WORK1[N]; // 工作向量 + int i, j, n, m = 0, k = 0, p, l; + + // 初始化工作向量和完成向量 + for (i = 0; i < M; i++) + FINISH[i] = FALSE; + for (i = 0; i < N; i++) + { + WORK[i] = AVAILABLE[i]; + WORK1[i] = AVAILABLE[i]; + } + // 查找系统是否有安全序列 + for (n = 0; n < M; n++) + { + for (i = 0; i < M; i++) + { + m = 0; + for (j = 0; j < N; j++) + { + if (FINISH[i] == FALSE && NEED[i][j] <= WORK[j]) + { + WORK[j] = WORK[j] + ALLOCATION[i][j]; + m++; + } + } + if (m == 3) + { + FINISH[i] = TRUE; + temp[k] = i; + k++; + for (l = 0; l < N; l++) + WORK1[l] = WORK[l]; + } + else + { + for (p = 0; p < N; p++) + WORK[p] = WORK1[p]; + } + } + } + for (i = 0; i < M; i++) + { + if (FINISH[i] == FALSE) + { + printf("\n"); + printf("系统不安全!本次资源申请不成功!\n"); + printf("\n\n请输入任意键继续\n"); + getch(); + printf("\n"); + return 1; + } + printf("\n"); + printf("经安全性检查,系统安全,本次分配成功!\n"); + printf("\n"); + printf("本次安全序列:\n"); + printf("进程依次为"); + for (i = 0; i < M; i++) // 输出安全序列 + { + printf("%d", temp[i]); + printf("->"); + } + printf("\n\n请输入任意键继续! \n"); + getch(); + printf("\n"); + return 0; + } +} \ No newline at end of file