程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> char-怎麼用隊列完成程序的先進先出,實現先來先服務分配算法,模擬實現對獨占設備的分配和回收

char-怎麼用隊列完成程序的先進先出,實現先來先服務分配算法,模擬實現對獨占設備的分配和回收

編輯:編程綜合問答
怎麼用隊列完成程序的先進先出,實現先來先服務分配算法,模擬實現對獨占設備的分配和回收

#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);
       }
     }

}

最佳回答:


已解決,差不多范正式可以了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved