#include
#include
#include
#define false 0
#define true 1
#define n 4 /*宏定義,用於修改設備類型數目*/
#define m 10 /*宏定義,用於修改設備數目*/
struct /*該結構體用於定義設備類表各信息*/
{ char type[10]; /*設備類型名*/
int count; /*擁有的設備總台數*/
int remain; /*現存的可用設備台數*/
int address; /*該類設備在設備表中的起始地址*/
}
equiptype[n]; /*系統設備類型為n*/
struct /*該結構體用於定義設備表各信息*/
{
int number; /*設備絕對編號*/
int lnumber; /*設備相對編號*/
int status; /*設備好壞狀態*/
int remain; /*設備是否已被分配*/
char jobname[4]; /*占有設備的作業名*/
}
equipment[m]; /*系統設備數為m*/
/**********************子函數:作業設備分配*****************************/
allocate(char J,char *type,int cc)
{
int i,t,j;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0) /查找欲申請分配的設備類型,strcmp函數用於比較equiptype[i].type與type的大小,若相等則返回0*/
i++;
if(i>=n) /*若沒有找到欲申請設備*/
{
printf("沒有找到欲分配的設備,分配失敗!");
return(false);
}
if(equiptype[i].remain<1) /*欲申請設備現存可用台數不足*/
{
printf("該類設備數量不足,分配失敗!");
break;
}
t=equiptype[i].address; /* 取出該類設備在設備表中的起始地址賦給t*/
while(!(equipment[t].status==1 && equipment[t].remain==0))
t++; /*該設備類型起始地址加一*/
equiptype[i].remain--; /*剩余設備數減一*/
equipment[t].remain=1; /*狀態改為已分配*/
strcpy(equipment[t].jobname,J);/*strcpy為字符串拷貝函數,把J中的字符串拷貝到equipment[t].jobname中*/
equipment[t].lnumber=cc; /*設備相對號寫入cc*/
}
/**********************子函數:作業設備回收*****************************/
reclaim(char J,char *type)
{
int i,t,j,k,nn;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0) /查找欲申請歸還的設備類型,strcmp函數用於比較equiptype[i].type與type的大小,若相等則返回0*/
i++;
if(i>=n) /*若沒有找到該類設備*/
{
printf("無該類設備,設備回收失敗!");
return(false);
}
t=equiptype[i].address; /*取出該類設備在設備表中的起始地址賦給t*/
j=equiptype[i].count; /*取出該類設備的數量賦給j*/
k=0;
nn=t+j;
for(;t<nn;t++)
if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1) /*若占用某個設備的作業與欲回收的作業相同且狀態為已分配*/
{
equipment[t].remain=0; /*則將其狀態改為未分配*/
k++; /*回收設備計數*/
}
equiptype[i].remain= equiptype[i].remain+k; /*該類設備剩余設備數加k*/
if(k==0) /*若回收設備計數值k為0,*/
printf("本作業沒有占用這類資源!/n");
}
/**********************主函數*****************************/
void main( )
{
char J[4];
int i,mm,a;
char type[10];
printf("設備類初始化\n ");
strcpy(equiptype[0].type,"a");
equiptype[0].count=3;
equiptype[0].remain=3;
equiptype[0].address=0;
strcpy(equiptype[1].type,"b");
equiptype[1].count=2;
equiptype[1].remain=2;
equiptype[1].address=3;
strcpy(equiptype[2].type,"c");
equiptype[2].count=4;
equiptype[2].remain=4;
equiptype[2].address=5;
strcpy(equiptype[3].type,"d");
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):");
scanf("%d",&a);
switch(a)
{
case 0 : /*a=0程序結束*/
exit(0);
case 1 : /*a=1分配設備*/
for(i=0;i<3;i++) /*輸入設備類表初始信息*/
{
printf("請輸入作業名、作業所需設備類型和設備相對號\n");
scanf("%s%s%d",J,type,&mm);
printf("請輸入作業名、作業所需設備類型和設備相對號\n");
scanf("%s%s%d",J,type,&mm);
printf("請輸入作業名、作業所需設備類型和設備相對號\n");
scanf("%s%s%d",J,type,&mm);
}
allocate(J,type,mm); /*分配設備*/
break;
case 2: /*a=2回收設備*/
printf("請輸入作業名和作業歸還的設備類\n");
scanf("%s%s",J,type); /*輸入要回收的作業名及對應的設備類*/
reclaim(J,type); /*回收設備*/
break;
case 3: /*a=3 輸出設備類表和設備表的內容*/
printf("輸出設備類表!\n"); /*輸出設備類表內容*/
printf(" 設備類型 設備總量 空閒好設備 起始地址\n");
for(i=0;i<n;i++)
printf("%9s%16d%22d%14d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain,equiptype[i].address);
printf("輸出設備表:\n"); /*輸出設備表內容*/
printf("絕對號 好/壞 已/未分配 占用作業名 相對號\n");
for(i=0;i<m;i++)
printf("%3d%11d%15d%15s%9d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber);
}
}
}
已解決,差不多范正式可以了