這是晚上圖書館回來時花的一些時間寫的,代碼的可讀性和效率實在差,但是絕對保證正確性。呵呵。如果你能看懂My Code那麼你一定閱讀代碼的頂級高手了啊 。呵呵。
下面是c代碼:
//你只要關注 FUCSEG,CYCTIM ,TimeSpaceDram//把他們初始化就好了啊。 #include<stdio.h>#include <conio.h> #include <stdlib.h> #define FUCSEG 5//這是你要關注的地方這是預約表中的 功能段 #define CYCTIM 9//這是你要關注的地方這是預約表中的 時間 #define STATESIZE 50#define STACKSIZE 44void dispather(int);int pushconflict(int *stack,int *p,int c);int pop(int *stack,int *p);int empty(int *stack,int *p);void push(int *stack,int*p,int elem) ;int pushconflict1(int *stack,int *p,int c);void stategy(int c1,int c2,int c0);int main(){ int temp0=0; int c0=0; int temp1=1; /*下面是你可以初始化的預約表啊。呵呵*/ int TimeSpaceDram[FUCSEG][CYCTIM]={{1,0,0,0,0,0,0,0,1}, {0,1,1,0,0,0,0,1,0}, {0,0,0,1,0,0,0,0,0}, {0,0,0,0,1,1,0,0,0}, {0,0,0,0,0,0,1,1,0}};//矩陣的時空圖,printf("\n下面是預約表\n") ; for(int ye=0;ye<FUCSEG;ye++){ printf("\n"); for(int wu=0;wu<CYCTIM;wu++) printf(" %d ",TimeSpaceDram[ye][wu]);} printf("\n"); /// int Conflict[CYCTIM]={0}; // matrix initionalization for(int i=0;i<FUCSEG;i++){ temp0=0; int Assitance[CYCTIM]={0}; for(int j=0;j<CYCTIM;j++){ if(TimeSpaceDram[i][j]!=0){ Assitance[temp0]=j; temp0++; } } for(int k=temp0-1;k>0;k--) for(int m=0;m<k;m++) Conflict[Assitance[k]-Assitance[m]]=1; } for(int ii=1;ii<CYCTIM;ii++){ c0+=Conflict[ii]*temp1; temp1*=2; } dispather(c0); getchar(); return 0; }void dispather(int c0){ int statecurse=1; int statec=0; int definestate=c0; int stack[STACKSIZE]={0}; int curse=0; int dispath[34]={0}; int dispathcurse=0; int ccc=0;//位元c0相同的值為全一的 int state[STATESIZE]={0};//這個是用來儲存狀態的 for(int ppp=1;definestate>0;definestate/=2,ppp*=2)//計算值為全1的數 ccc+=ppp;statec=pushconflict(stack,&curse,c0); state[0]=c0; state[statecurse]=statec+2; printf("\n下面是調度策略\n"); printf("格式:衝突向量--->(時間(若有兩個則表示或的關係即你可以任選一個繼續))--->衝突向量\n"); printf("下面的每一行都是一個調度策略,即是狀態轉移示意圖中的一個閉合迴路\n");while((empty(stack,&curse))!=0){int j=0;int ci=0;int discard;int operat=pop(stack,&curse);j=pop(stack,&curse);ci=(operat>>j)|c0;if(ci==ccc) ; else{ if(ci==c0){ char s[10]; for(int j=0;state[j]>0;j+=2) { itoa(state[j], s, 2); //轉換成字串,進位基數為2 printf( "%s--->(",s); //輸出 if(state[j+2]!=0) stategy(state[j],state[j+2],c0); else stategy(state[j],c0,c0); } itoa(state[0], s, 2); //轉換成字串,進位基數為2 printf( "%s \n",s); //輸出 }else{ for(int j=0;j<STATESIZE;j+=2) { if(ci==state[j]) goto YE; }statec=pushconflict(stack,&curse,ci); state[statecurse+1]=ci; state[statecurse+2]=statec; statecurse+=2; YE: ; }}WU:if(--(state[statecurse])<0){state[statecurse]=0;state[statecurse-1]=0;statecurse-=2; state[statecurse]--; if(state[statecurse]<0) goto WU; }}} void push(int *stack,int*p,int elem){ stack[*p]=elem; (*p)++; }int pop(int *stack,int *p){int temp;(*p)--;temp=stack[*p]; stack[*p]=0; return temp; }int empty(int *stack,int *p){if( *p==0)return 0;return 1; }int pushconflict(int *stack,int *p,int c){ int t=1; int pp=0; int kk=c; while(c>0) { if(c%2==0) { push(stack,p,t); push(stack,p,kk); pp++;} t++; c/=2; } return pp;} int pushconflict1(int *stack,int *p,int c){ int t=1; int pp=0; while(c>0) { if(c%2==0) { push(stack,p,t); pp++;} t++; c/=2; } return pp;} void stategy(int c1,int c2,int c0){int stack[CYCTIM]={0};int curse=0;int operat=0;int j=0;int t= pushconflict1(stack,&curse,c1); for(;t>0;t--) { j=pop(stack,&curse); //printf("j=%d",j); operat=c1; if( c2==((operat>>j)|c0)) printf("%d,",j); } printf(")--->"); }
呵呵。你只要更改以上提示的地方就可以了啊。
我們再舉一個例子