1、输入3回车,显示设备原始信息。
2、输入1回车,然后再输入“aa input 99”回车,连续进行三次,然后显示设备信息,观察运行结果。
3、输入2回车,然后再输入“aa input”回车,连续进行三次,进行设备回收,观察运行结果。
4、在前3步的基础上,输入1回车,然后再输入“aa cpu”回车,观察运行结果。
要求每个实验步骤输出图,结果分析自行完成。
#include"stdio.h"
#include"string.h"
#include <iostream>
#define n 4 //4类设备
#define m 10 //10个设备
using namespace std;
struct
{
char type[10]; //设备类名
int count ; //拥有设备台数
int remain; //现存的可用设备台数
int address; //该类设备在设备表中的起始地址
}equiptype[n]; //设备类表定义,假定系统有n个设备类型
struct
{
int number; //设备绝对号
int status; //设备好坏状态 1-好、0-坏
int remain; //设备是否已分配 1-已分配、0-空闲
char jobname[4];//占有设备的作业名
int lnumber; //设备相对号
}equipment[m]; //设备表定义,假定系统有m个设备
void allocate(char J[],char type[],int mm)//设备分配函数
{
//自行编写
for(int i = 0; i < n; i++)
{
if(strcmp(equiptype[i].type, type) == 0)
{
if(equiptype[i].remain == 0)
{
cout << "分配失败,现存的可用设备台数不足!" << endl;
return;
}
else
{
int number = equiptype[i].address;
int count = equiptype[i].count + number - 1;
for(; number < count + 1; number++)
{
if(equipment[number].lnumber == mm)
{
cout << "分配失败,设备相对号已占用!" << endl;
return;
}
}
number = equiptype[i].address;
while(equipment[number].remain == 1 || equipment[number].status == 0)
{
number++;
if(number > count)
{
cout << "分配失败,不存在好设备!" << endl;
return;
}
}
equipment[number].remain = 1;
strcpy(equipment[number].jobname,J);
equipment[number].lnumber = mm;
equiptype[i].remain--;
cout << "分配成功!" << endl;
}
break;
}
else
{
if(i==3)
{
cout << "分配失败,设备类名不存在!" << endl;
return;
}
}
}
}
void reclaim(char J[],char type[])//设备回收函数
{
//自行编写
for(int i = 0; i < n; i++)
{
if(strcmp(equiptype[i].type, type) == 0)
{
int number = equiptype[i].address;
int count = equiptype[i].count + number - 1;
while(equipment[number].remain == 0 && strcmp(equipment[number].jobname, J) != 0)
{
number++;
if(number > count)
{
cout << "回收失败,不存在该设备!" << endl;
return;
}
}
equipment[number].remain = 0;
strcpy(equipment[number].jobname, "");
equipment[number].lnumber = 0;
equiptype[i].remain++;
cout << "回收成功!" << endl;
break;
}
else
{
if(i==3)
{
cout << "回收失败,设备类名不存在!" << endl;
return;
}
}
}
}
int main()
{
char J[4];
int i, mm, a;
char type[10];
//设备类表初始化
strcpy(equiptype[0].type,"input");//输入机
equiptype[0].count=2;
equiptype[0].remain=2;
equiptype[0].address=0;
strcpy(equiptype[1].type,"printer");//打印机
equiptype[1].count=3;
equiptype[1].remain=3;
equiptype[1].address=2;
strcpy(equiptype[2].type,"disk");//磁盘机
equiptype[2].count=4;
equiptype[2].remain=4;
equiptype[2].address=5;
strcpy(equiptype[3].type,"tape");//磁带机*/
equiptype[3].count=1;
equiptype[3].remain=1;
equiptype[3].address=9;
//设备表初始化
for(i=0;i<10;i++)
{
equipment[i].number=i;
equipment[i].status=1;
equipment[i].remain=0;
}
while(1)
{
printf("\n0-退出,1-分配,2-回收,3-显示");
printf("\n选择功能项(0-3):");
cin >> a;
switch(a)
{
case 0://程序结束*/
return 0;
case 1://a=1分配设备
printf("输入作业名、作业所需设备类和设备相对号:");
scanf("%s%s%d",J,type,&mm);
allocate(J,type,mm);
break;
case 2://a=2回收设备
printf("输入作业名和作业归还的设备类:");
scanf("%s%s",J,type);
reclaim(J,type);
break;
case 3://a=3输出设备类表和设备表的内容
printf("\n输出设备类表\n");
printf(" 设备类型 设备总量 空闲好设备\n");
for(i=0;i<n;i++)
printf("%9s%6d%9d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain);
printf("输出设备表:\n");
printf("绝对号 好/坏 已/未分配 占用作业名 相对号\n");
for(i=0;i<m;i++)
printf("%3d%8d%9d%12s%8d\n",equipment[i].number,
equipment[i].status,equipment[i].remain,equipment[i].jobname,
equipment[i].lnumber);
default:
cout << "输入错误!" << endl;
}
}
}
步骤2中,这里认为在同一设备类中,相对号应该是唯一的,所以对输入略作修改