操作系统实验三设备管理

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中,这里认为在同一设备类中,相对号应该是唯一的,所以对输入略作修改

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值