📄 pk06.c
字号:
/************ sub pk(int kbpx[yutc]) ******/
void pk(int kbpx[yutc])
{int *px,ii,jj,kk=0,x,ik,wanbiao;
char hezi[8],zjsum,f1,f2,y,z;
px=kbpx;
cls();
for(i=0;i<tcnumber;i++)
{for(j=0;j<7;j++)
{for(k=0;k<6;k++)
{tcbk[i][j][k]=kong; /* 清空教师表课号 */
tcbb[i][j][k]=kong;} /* 清空教师表班号 */
}
}
for(i=0;i<clnumber;i++)
{for(j=0;j<7;j++)
{for(k=0;k<6;k++)
{clb[i][j][k]=kong;
clbt[i][j][k]=kong;}
}
}
for(i=0;i<yutc;i++)
{for(j=0;j<4;j++)
yushu[i][j]=kong;
}
for(i=0;i<yutc;i++)
{for(j=0;j<yubk;j++)
banke[i][j][2]=0;}
/*取得随机序列数*/
for(i=0;i<8;i++)
{for(j=0;j<8;j++)
hezi[j]=j;
for(j=6;j>0;j--)
{
/*randomize();*/
x=rand()%(j+1);
suiji[i][j]=hezi[x];
for(k=x;k<j;k++)
hezi[k]=hezi[k+1];
}
suiji[i][0]=hezi[0];
}
printf("\n随机序列数:\n");
for(i=0;i<8;i++)
{for(j=0;j<7;j++)
printf("%d ",suiji[i][j]);
printf("\n");
}
paidings=0;
/*以下为排固定课*/
for(tt=0;tt<kenumber;tt++)
{if(kedai[tt]!='y')
continue;
for(k=0;k<3;k++)
{x=zhoujie[tt][k];
if(x!=1)
break;
for(i=0;i<clnumber;i++)
{if(yer[i]-1!=k)
continue;
r=youxian[tt][0]-1;
jie=youxian[tt][1]-1;
clb[i][jie][r]=tt;
paidings++;
} /* i */
} /*k*/
} /*tt*/
/***************************************/
for(i=0;i<tcnumber;i++)
{wanbiao=0;
for(j=0;j<yubk;j++)
{bx=banke[i][j][0];
if(bx==kong)break;
kx=banke[i][j][1];
if(kx>2)continue;
for(r=0;r<6;r++)
{for(ii=0;ii<3;ii++)
{do
jie=rand()%3;
while(jie>2);
if(clb[bx][jie][r]!=kong)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie][r]!=kong)continue; /* tcb(教师表)不空,排下一节*/
if(clb[bx][jie+1][r]!=kong)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie+1][r]!=kong)continue; /* tcb(教师表)不空,排下一节*/
if(clb[bx][jie+2][r]!=kong && clb[bx][jie+2][r]<3)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie+2][r]!=kong && tcbk[bx][jie+2][r]<3)continue; /* tcb(教师表)不空,排下一节*/
if(jie>1)
{
if(clb[bx][jie-1][r]!=kong && clb[bx][jie-1][r]<3)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie-1][r]!=kong && tcbk[bx][jie-1][r]<3)continue; /* tcb(教师表)不空,排下一节*/
}
y=spaiding();
jie++;
y=spaiding();
banke[i][j][2]++;
banke[i][j][2]++;
wanbiao=1;
break;
} /* end jie */
if(wanbiao==1)break;
} /* end r */
} /* end j */
} /*end for i */
for(i=0;i<tcnumber;i++)
{wanbiao=0;
for(j=0;j<yubk;j++)
{bx=banke[i][j][0];
if(bx==kong)break;
kx=banke[i][j][1];
if(kx>2)continue;
if( banke[i][j][2]!=0)continue;
for(r=0;r<6;r++)
{for(jie=0;jie<3;jie++)
{if(clb[bx][jie][r]!=kong)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie][r]!=kong)continue; /* tcb(教师表)不空,排下一节*/
if(clb[bx][jie+1][r]!=kong)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie+1][r]!=kong)continue; /* tcb(教师表)不空,排下一节*/
if(clb[bx][jie+2][r]!=kong && clb[bx][jie+2][r]<3)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie+2][r]!=kong && tcbk[bx][jie+2][r]<3)continue; /* tcb(教师表)不空,排下一节*/
if(jie>1)
{
if(clb[bx][jie-1][r]!=kong && clb[bx][jie-1][r]<3)continue; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie-1][r]!=kong && tcbk[bx][jie-1][r]<3)continue; /* tcb(教师表)不空,排下一节*/
}
y=spaiding();
jie++;
y=spaiding();
banke[i][j][2]++;
banke[i][j][2]++;
wanbiao=1;
break;
} /* end jie */
if(wanbiao==1)break;
} /* end r */
} /* end j */
} /*end for i */
for(ii=0;ii<tcnumber;ii++)
{ i=px[ii]; /* i 教师序号 */
zjsum=0;
printf("\nteachher no. %d",i);
for(j=0;j<yubk;j++)
{bx=banke[i][j][0];
if(bx==kong)break;
kx=banke[i][j][1];
x=yer[bx]-1;
y=zhoujie[kx][x];
zjsum=zjsum+y;
}
ripin=zjsum/5+1;
for(j=0;j<yubk;j++) /* i号教师的任课表行号 */
{bx=banke[i][j][0];
if(bx==kong)break;
kx=banke[i][j][1];
x=yer[bx]-1;
kezhouj=zhoujie[kx][x];
if(kezhouj==0)
{printf("\n警告:不应该排 %s 教师上 %d 年级 %d 班的 %s 课。\n",name[i],yer[bx],clno[bx],kemu[kx]);
printf("\n警告:这个班没有 %s 课。",kemu[kx]);
break;
}
kezhouj=kezhouj-banke[i][j][2];
wanbiao=0;
for(jj=0;jj<1;jj++) /* jj---ke zhou jie shu */
{
f1=youxian[kx][0]-1;
f2=youxian[kx][1]-1;
z=spk1(0,f1,f2);
if(z==0)break; /* z==0 ke pai hao yi jie, */
z=spk1(1,f1,f2);
if(z==0)break;
z=spk1(0,f1,f2);
if(z==0)break; /* z==0 ke pai hao yi jie, */
z=spk1(1,f1,f2);
if(z==0)break;
for(ik=0;ik<4;ik++)
{if(f1==0 && f2==6)
{z=1;
break;}
if(f1!=0)
{f1--;
z=spk3(f1);
if(z==0) break;
}
if(f2!=6)
{f2++;
z=spk3(f2);
if(z==0) break;
}
} /* end for ik 11111*/
if(z==0) break;
/* printf("\n 99999999999 ke biao quan sou suo \n");*/
for(jie=0;jie<7;jie++)
{z=spk3(jie);
if(z==0) break;
} /* end for jie 22222*/
if(z==0) break;
/*** 该科按周节计划没办法排完,登记下来。 **/
/* printf("\n警告: %s 教师上 %d 班的 %s 课 ,",name[i],clno[bx],kemu[kx]);
printf("按周节计划没办法排完,剩余 %d 节",kezhouj);*/
/* if(getch()=='x')return;*/
yushu[kk][0]=i;
yushu[kk][1]=bx;
yushu[kk][2]=kx;
yushu[kk][3]=kezhouj;
wanbiao=1;
kk++;
} /* end for jj */
} /* end for j */
if(wanbiao==0)
{
printf(" ok!!!");
}
} /* end for ii */
printf("\nauto pk, ok!!!\ncontinue???(y/n)");
sound1();
/* do
;
while(getch()!='y');*/
/* lisyushu();*/
cls();
} /**** end sub pk(int kbpx[yutc]) */
int spk1(int x, char f1,char f2)
{int j;
char y;
for(r=x;r<6;r=r+2) /* 天 循环 */
{y=rand()%8;
for(j=0;j<7;j++) /*节 循环 */
{
/*randomize();*/
jie=suiji[y][j];
if(jie>=f1 && jie<=f2)
{if((r==5) && jie>3)break; /* 排下一天 */
y=schb1();
if(y==0)return 0; /* 该科 yi jie 排 hao 返回。 */
if(y==2 || y==3)break; /* 排下一天 */
}
} /* end for j 排下一节 */
} /* end for r 排下一天 */
return 1; /* 天 循环结束,该科 yi jie 没排 hao ,返回。 */
} /* end sub spk1 */
/****************** sub spk3() ******/
int spk3(char f1)
{char y;
for(r=0;r<6;r++) /* 天 循环 */
{
if((r==5) && f1>3)return 1; /* 该科没排完,排下一天 */
jie=f1;
y=schb1();
if(y==0)return 0; /* 该科排完 返回。 */
} /* end for r 该科没排完,排下一天 */
return 1; /* 天 循环结束,该科没排完返回。 */
} /* end sub spk3 */
/************ schb1() ************/
int schb1()
{int y;
y=spkno();
if(y!=0)return y; /**** 排不定处理 *****/
y=spaiding();
return y;
} /* end sub schb1() */
/**** 排定处理 *****/
int spaiding()
{
clb[bx][jie][r]=kx;
clbt[bx][jie][r]=i;
tcbk[i][jie][r]=kx;
tcbb[i][jie][r]=bx;
kezhouj--;
paidings++;
if(kezhouj==0) return 0;
return 2;
}
/************ spkno() ***********/
int spkno()
{ int chai,chaj,tmp;
if(clb[bx][jie][r]!=kong)return 1; /* clb(班表)不空,排下一节 */
if(tcbb[i][jie][r]!=kong)return 1; /* tcb(教师表)不空,排下一节*/
tmp=0;
for(chai=0;chai<7;chai++)
{if(tcbb[i][chai][r]!=kong)tmp++;}
if(tmp>=ripin)return 3;
if(tmp==0)return 0;
tmp=0;
for(chai=0;chai<6;chai++)
{if(tcbb[i][jie][chai]!=kong & bx==tcbb[i][jie][chai])tmp++;}
if(tmp>=3)return 1;
for(chai=0;chai<7;chai++)
{if(tcbb[i][chai][r]!=bx)continue;
if((chai+1==jie) || (chai-1==jie))
return 1;
if(clb[bx][chai][r]==kx)return 3;
}
return 0;/* 可排 */
} /* end sub spkno */
void pcr()
{printf("\n");
putch(0x0d);
}
/************ sub disclb() ******/
void disclb()
{int clber=0;
char x;
do
{
disclbs1(clber);
clber++;
if(clber==clnumber)
{sound1();
clber=0;}
if(getch()=='x')return;
}
while(clber<clnumber);
}/*end sub disclb()*/
/************ sub distcb() ******/
void distcb()
{int tcber=0;
char x;
do
{
distcbs1(tcber);
tcber++;
if(tcber==tcnumber)
{sound1();
tcber=0;}
if(getche()=='x')return;
}
while(tcber<tcnumber);
}/*end sub distcb()*/
/*********** disclbs1() **********/
void disclbs1(int clber)
{int i;
char cl4;
if(clber<0)clber=clber+256;
window(x1,yy1,lieshu1,hangshu2);
clrscr();
textbackground(7); /* hui色(7) green(10) zi(13)*/
textcolor(5); /* 黑色(0) red(5) */
gotoxy(x1,yy1);
pcr();
pcr();
printf(" %d班课表:",clno[clber]);
pcr();
for(i=0;i<lieshu1;i++)printf("_");
pcr();
printf(" 一 二 三 四 五 六");
pcr();
for(i=0;i<7;i++)
{printf("%d",i+1);
for(j=0;j<6;j++)
{x=clb[clber][i][j];
if(x==kong)
{printf(" ");continue;}
printf(" %s",kejian[x]);
}
pcr();
if(i==3)pcr();
}
for(i=0;i<lieshu1;i++)printf("=");
}
void distcbs1(int tcber)
{int i,blie=37,ix;
char x,ky;
x2=x1+lieshu1+2;
y2=yy1;
z2=x2+lieshu1+2;
window(x2,y2,z2+12,hangshu2);
clrscr();
textbackground(6); /* 淡兰色(10) blue-1*/
textcolor(0); /* 黑色 */
gotoxy(x2,y2);
pcr();
ix=tcber;
if(tcber<0)tcber=256+tcber;
cprintf("%s:(%d)--->(%d)",name[tcber],ix,tcber);
pcr();
x=0;
for(i=0;i<yubk;i++)
{x=banke[tcber][i][0];
if(x==kong)break;
ky=banke[tcber][i][1];
cprintf(" %d%s",clno[x],kejian[ky]);
x++;
if(x==5)
{x=0;pcr();}
}
pcr();
for(i=0;i<blie;i++)cprintf("_");
pcr();
cprintf(" 一 二 三 四 五 六");
pcr();
for(i=0;i<7;i++)
{cprintf("%d",i+1);
for(j=0;j<6;j++)
{x=tcbb[tcber][i][j];
if(x==kong)
{cprintf(" ");continue;}
ky=tcbk[tcber][i][j];
ix=x;
cprintf(" %3d%s",clno[ix],kejian[ky]);
}
pcr();
if(i==3)pcr();
}
for(i=0;i<blie;i++)cprintf("=");
}
/*tttttttttttttttttttttt*/
void tishi()
{gotoxy(1,17);
printf("\n");
printf(" n,调整下一班课表. g,删除这一节.\n");
printf(" m,调整上一班课表. c,复制这一节.\n");
printf(" b,调整某一班课表. p,粘贴这一节.\n");
printf(" w, ^ . h,交换两节课.\n");
printf(" s, v . k,检查课表的错误。\n");
printf(" a,<---. t,菜单提示(洗脸).\n");
printf(" d,--->.\n");
printf(" x,退出,返回上一菜单.\n");
printf("请选择:");
}
void qingtishi()
{int i;
for(i=0;i<11;i++)
printf("\n");
}
/************ sub tk() ***7777777777***/
void tk()
{char jg,bx3;
int xg,yg,xg2=3,yg2=6;
xg=xg2;
yg=yg2;
bx=0;
bx3=clnumber;
jie=0;
r=0;
cls();
chuxian3();
tishi();
do
{
i=clbt[bx][jie][r];
kx=clb[bx][jie][r];
z02=0;
tc4=i;
bx4=bx;
if(guken!=0)
{for(j=0;j<guken;j++)
{if(kx==gukexu[j])
{z02=1;break;}}}
if(kx!=kong && z02==0)
distcbs1(tc4);
disclbs1(bx4);
gotoxy(xg,yg);
select2:
jg=getch();
if( jg<'0'|| (jg>'9' && jg<'a') || jg>'z') goto select2;
sound1();
if(tc4<0)tc4=256+tc4;
if(bx4<0)bx4=bx4+256;
if(jg=='n')
{bx++;
if(bx==bx3)bx=0;
xchbiao=0;
sound1();
}
else if(jg=='m')
{bx--;
if(bx==-1)bx=bx3-1;
xchbiao=0;
sound1();
}
else if(jg=='b')
{do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -