教学任务安排系统

教学任务安排系统:

[cpp:firstline[0]] view plain copy print ?
  1. #include "stdlib.h"   
  2. #include "stdio.h"   
  3. #define MAX 100      
  4. typedef struct  
  5. {     
  6.     int s[MAX][MAX];//用二维数组存放教师专业特长      
  7.     int D[MAX]; //用一维数组存放安排的教学任务      
  8. }MGraph;  
  9. MGraph G;  
  10. int creat(int *k,int n) //初始化,将二维数组s和一维数组D的adj全部赋值为0      
  11. {     
  12.     int i,j;     
  13.     for(i=1;i<=n;i++)  
  14.     {     
  15.         G.D[i]=0;     
  16.         k[i]=0;     
  17.         for(j=1;j<=n;j++)  
  18.             G.s[i][j]=0;    
  19.     }  
  20.     printf("/n");     
  21.     printf("科目数成功确定为 %d/n",n);     
  22.     return 1;  
  23. }  
  24.   
  25. int techer_speciality(int n)     
  26. {     
  27.   
  28.     int k,i;     
  29.     printf("请输入教师专业特长编号(1-%d) 0表示结束输入:/n",n);     
  30.     for(i=1;i<=n;i++)     
  31.     {     
  32.         printf("输入教师编号为 %d 的特长专业号:",i);     
  33.         do  
  34.         {  
  35.             scanf("%d",&k);     
  36.             if(k>n)  
  37.             {  
  38.                 printf("超出范围,重新输入: ");  
  39.                 continue;  
  40.             }     
  41.             else  
  42.                 G.s[i][k]=1;  
  43.         }while(k);     
  44.     }     
  45.     printf("设定成功!/n");;     
  46.     return 1;//设定成功!      
  47. }     
  48.   
  49. int serch(int i,int j,int n)     
  50. {     
  51.     for(;j<=n;j++)  
  52.     {  
  53.         if(G.s[i][j]==1)  
  54.             break;  
  55.     }  
  56.     return j;     
  57. }  
  58.   
  59. int serch_error(int *k,int n)//在所有老师都有被进行安排过的情况下运行      
  60. {     
  61.     int t,i,j;  
  62.     static int b=0; //b检测是否有两个或两个以上的专业只有一个老师可授      
  63.     for(j=1;j<=n;j++)     
  64.         if(k[j]==0) //存在有科目没有老师授课      
  65.             for(i=1;i<=n;i++) //哪个老师可以授此科目且此科目当前还没有老师授课      
  66.                 if(G.s[i][j]==1)     
  67.                 {     
  68.                     if(b!=i)  
  69.                         b=i;  
  70.                     else  
  71.                         return 0; //if(b!=i)b=i记录第一个没有授课的科目但有老师可以授课的老师下标      
  72.                     //若再次运行这个函数且另一个没有授课的科目也是这位老师可授,即有      
  73.                     //多个科目只有此老师可授,即调用此函数的老师没有科目可授。      
  74.                     t=G.D[i];     
  75.                     if(G.D[i]==0)  
  76.                         return 0; //可能有后面老师还没受到安排,返回等所有老师都有被进行安排过才进行      
  77.                     G.D[i]=j;  
  78.                     k[j]=i;  
  79.                     k[t]=0;  
  80.                     return 1;//有,让此老师授此课,原来所授的课取消,重新安排过。      
  81.                 }  
  82.                 return 0; //(没有科目没有被安排)或者(有科目没有被安排但没有老师有此专长)      
  83. }  
  84. int anpai(int *k,int n)     
  85. {     
  86.     int c[MAX]={0},i,j, js, p=0,t;     
  87.     for(i=1;i<=n;i++)  
  88.     {  
  89.         if(G.D[i]==0)     
  90.         {  
  91.             j=1;     
  92.             while(1)     
  93.             {     
  94.                 js=serch(i,j,n);     
  95.                 if(js<=n)     
  96.                 {     
  97.                     c[p++]=js;//保存从serch里返回的教师专长      
  98.                     if(k[js]<=0)     
  99.                     {     
  100.                         G.D[i]=js;k[js]=i;p=0;break;     
  101.                     }     
  102.                     else  
  103.                     {  
  104.                         j=js;  
  105.                         j++;  
  106.                     }     
  107.                 }     
  108.                 else  
  109.                 {     
  110.                     p=0;     
  111.                     t=k[c[p]];     
  112.                     j=c[p]+1;     
  113.                     while(1)     
  114.                     {     
  115.                         js=serch(t,j,n);     
  116.                         if(k[js]<=0 && js<=n)     
  117.                         {     
  118.                             k[c[p]]=0; G.D[t]=js; k[js]=t; G.D[i]=c[p]; k[c[p]]=i; p=0; break;     
  119.                         }     
  120.                         else if(js<=n)  
  121.                             j++;     
  122.                         else  
  123.                         {     
  124.                             p++;  
  125.                             if(c[p]==0)     
  126.                             {     
  127.                                 G.D[i]=0;  
  128.                                 if(serch_error(k,n))  
  129.                                     anpai(k,n);  
  130.                                 break;     
  131.                             }  
  132.                             t=c[p];j=c[p]+1;     
  133.                         }    
  134.                     }     
  135.                     break;     
  136.                 }     
  137.             }    
  138.         }  
  139.     }  
  140.     printf("教师专长课程设定成功!/n");  
  141.     return 1;  
  142. }   
  143.   
  144. void display(int n)     
  145. {  
  146.     int ch,i;  
  147.     printf(" 教师编号         课程编号/n");   
  148.     for(i=1;i<=n;i++)  
  149.         printf("%5d  %13d/n",i,G.D[i]);     
  150. }     
  151.   
  152.   
  153. void list(int n)     
  154. {     
  155.     int i,j;     
  156.     for (i=1;i<=n;i++)     
  157.     {  
  158.         printf("%3d号教师的专业特长有:",i);    
  159.         for(j=1;j<=n;j++)     
  160.             if (G.s[i][j])  
  161.                 printf("%3d/n",j);  
  162.         printf("/n");     
  163.     }     
  164.   
  165.   
  166. }     
  167.   
  168. void edit(int n)     
  169. {  
  170.     int k,i=0,m=0,j=0;  
  171.     printf("请输入要修改的老师:");  
  172.     while(i==0||i>n)  
  173.     {  
  174.         scanf("%d",&i);  
  175.         if(i>0 && i<=n)  
  176.             printf("第%d个老师的专长科目有: ",i);  
  177.         else  
  178.             printf("没这个老师!请重新输入:/n");  
  179.     }     
  180.   
  181.     for(k=1;k<=n;k++)     
  182.     {  
  183.         if(G.s[i][k]==1)     
  184.         {  
  185.             printf("%3d/n",k);    
  186.             j++;     
  187.         }     
  188.     }     
  189.     if(j==0)  
  190.         printf("没有专长科目/n");  
  191.     printf("/n输入你要修改的科目(输入0结束):/n");  
  192.     do  
  193.     {  
  194.         scanf("%d",&k);     
  195.         if(k>n)  
  196.         {  
  197.             printf("超出范围,重新输入: ");  
  198.             continue;  
  199.         }     
  200.         else if(G.s[i][k]==1)     
  201.             G.s[i][k]=0;     
  202.         else G.s[i][k]=1;     
  203.     }while(k);     
  204.     printf("修改后第%d个老师的专长科目有 :",i);  
  205.     for(k=1;k<=n;k++)     
  206.     {  
  207.         if(G.s[i][k]==1)     
  208.         {  
  209.             printf("%3d/n",k);  
  210.             m++;     
  211.         }     
  212.     }     
  213.     if(m==0)  
  214.         printf("没有专长科目/n");  
  215.     printf("/n");  
  216. }  
  217. int main(void)     
  218. {     
  219.     int k[MAX],ch,i=0, n=0,w=0,a=0;//n为0 用来表示还没 i 检查是否专长课程设定 w 检查是否科目数设定 a检查是否课程安排      
  220.     char cx;  
  221.     while(1)     
  222.     {  
  223.         printf(" ┏━━━━━━━━欢迎进入教学任务安排系统━━━━━━━━┓/n");  
  224.         printf(" § §/n");  
  225.         printf(" § 1 -----确定科目数 2 -----教师专长课程设定 §/n");  
  226.         printf(" § 3 -----课程安排 4 -----教师专长浏览 §/n");  
  227.         printf(" § 5 -----教师专长课程修改 6------查看教学任务安排 §/n");  
  228.         printf(" § 0 -----退出系统 §/n");  
  229.         printf(" └────────────────────────────┘/n");  
  230.         printf("请选择功能  ");  
  231.         scanf("%d",&ch);  
  232.         printf("/n");     
  233.         switch(ch)     
  234.         {     
  235.         case 1:  
  236.             {  
  237.                 if(!w)  
  238.                 {  
  239.                     printf("请确定课程数或教师人数 ");  
  240.                     scanf("%d",&n);  
  241.                     w=creat(k, n);  
  242.                     break;  
  243.                 } //初始化      
  244.                 else  
  245.                 {     
  246.                     printf("你已经确定了课程数 ,是否要从新确定(是:Y/y 否:其余键 )");  
  247.                     scanf("%c",&cx);  
  248.                     if(cx=='Y'|| cx=='y')     
  249.                     {  
  250.                         printf(" 重新输入课程数: ");  
  251.                         scanf("%d",&n);  
  252.                         w=creat(k, n);  
  253.                         break;  
  254.                     }     
  255.                     else break;     
  256.                 }  
  257.             }  
  258.         case 2:  
  259.             {     
  260.                 if (!w)  
  261.                     printf("请先确定科目数!/n/n");     
  262.                 else if(i)  
  263.                 {     
  264.                     printf("你已经教师专长课程设定 ,是否要从新设定(是:Y/y 否:其余键 )");  
  265.                     scanf("%c",&cx);   
  266.                     if(cx=='Y'|| cx=='y')  
  267.                     {  
  268.                         i=techer_speciality(n);  
  269.                         break;   
  270.                     }     
  271.                     else break;     
  272.                 }     
  273.                 else  
  274.                     i=techer_speciality(n);     
  275.                 break;  
  276.             }  
  277.         case 3:  
  278.             {     
  279.                 if (!w)  
  280.                     printf("请先确定科目数!/n/n");     
  281.                 else if(!i)  
  282.                     printf("请先教师专长课程设定!/n");     
  283.                 else  
  284.                     anpai(k,n);  
  285.                 break;     
  286.             }  
  287.         case 4:  
  288.             {     
  289.                 if (!w)  
  290.                     printf("请先确定科目数和 教师专长课程设定!/n/n");     
  291.                 else if(!i)  
  292.                     printf("请先教师专长课程设定!/n");     
  293.                 else  
  294.                     list(n);//教师专长浏览函数      
  295.                 break;  
  296.             }     
  297.         case 5:  
  298.             {     
  299.                 if (!w)  
  300.                     printf("暂无确定科目数!/n");     
  301.                 else if(!i)  
  302.                     printf("教师专长课程暂无设定/n");   //教师专长课程修改函数   
  303.                 else  
  304.                     edit(n) ; //修改函数      
  305.                 break;     
  306.             }  
  307.         case 6:  
  308.             {     
  309.                 if (!w)  
  310.                     printf("请先确定科目数!/n/n");     
  311.                 else if(!i)  
  312.                     printf("请先教师专长课程设定!/n");   //查看教学任务安排函数    
  313.                 else if (!a)  
  314.                     printf("请先选择课程安排!/n");    
  315.                 else ;//查看教学任务安排函数;      
  316.                 break;  
  317.             }     
  318.         case 0:  
  319.             {  
  320.                 printf(" ************** 谢谢使用 ************/n");  
  321.                 return ;  
  322.             }  
  323.         default:  
  324.             printf("从新选择功能:/n");  
  325.         }  
  326.     }  
  327.     system("pause");  
  328.     return 0;  
  329. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值