这是晚上图书馆回来时花的一些时间写的,代码的可读性和效率实在差,但是绝对保证正确性。呵呵!如果你能看懂我的代码那么你一定阅读代码的顶级高手了啊 !呵呵!
下面是c代码:
//你只要关注 FUCSEG,CYCTIM ,TimeSpaceDram //把他们初始化就好了啊! #include<stdio.h> #include <conio.h> #include <stdlib.h> #define FUCSEG 5//这是你要关注的地方这是预约表中的 功能段 #define CYCTIM 9//这是你要关注的地方这是预约表中的 时间 #define STATESIZE 50 #define STACKSIZE 44 void 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(")--->"); }
呵呵!你只要更改以上提示的地方就可以了啊!
我们再举一个例子
版权声明:本文为zhouyelihua原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。