⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pk06.c

📁 dos下的排课软件。 学校使用可以自动排课程表。
💻 C
📖 第 1 页 / 共 4 页
字号:


   /************  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 + -