数据结构课程设计---教学任务安排系统

教学任务安排系统:

#include "stdlib.h" #include "stdio.h" #define MAX 100 typedef struct { int s[MAX][MAX];//用二维数组存放教师专业特长 int D[MAX]; //用一维数组存放安排的教学任务 }MGraph; MGraph G; int creat(int *k,int n) //初始化,将二维数组s和一维数组D的adj全部赋值为0 { int i,j; for(i=1;i<=n;i++) { G.D[i]=0; k[i]=0; for(j=1;j<=n;j++) G.s[i][j]=0; } printf("/n"); printf("科目数成功确定为 %d/n",n); return 1; } int techer_speciality(int n) { int k,i; printf("请输入教师专业特长编号(1-%d) 0表示结束输入:/n",n); for(i=1;i<=n;i++) { printf("输入教师编号为 %d 的特长专业号:",i); do { scanf("%d",&k); if(k>n) { printf("超出范围,重新输入: "); continue; } else G.s[i][k]=1; }while(k); } printf("设定成功!/n");; return 1;//设定成功! } int serch(int i,int j,int n) { for(;j<=n;j++) { if(G.s[i][j]==1) break; } return j; } int serch_error(int *k,int n)//在所有老师都有被进行安排过的情况下运行 { int t,i,j; static int b=0; //b检测是否有两个或两个以上的专业只有一个老师可授 for(j=1;j<=n;j++) if(k[j]==0) //存在有科目没有老师授课 for(i=1;i<=n;i++) //哪个老师可以授此科目且此科目当前还没有老师授课 if(G.s[i][j]==1) { if(b!=i) b=i; else return 0; //if(b!=i)b=i记录第一个没有授课的科目但有老师可以授课的老师下标 //若再次运行这个函数且另一个没有授课的科目也是这位老师可授,即有 //多个科目只有此老师可授,即调用此函数的老师没有科目可授。 t=G.D[i]; if(G.D[i]==0) return 0; //可能有后面老师还没受到安排,返回等所有老师都有被进行安排过才进行 G.D[i]=j; k[j]=i; k[t]=0; return 1;//有,让此老师授此课,原来所授的课取消,重新安排过。 } return 0; //(没有科目没有被安排)或者(有科目没有被安排但没有老师有此专长) } int anpai(int *k,int n) { int c[MAX]={0},i,j, js, p=0,t; for(i=1;i<=n;i++) { if(G.D[i]==0) { j=1; while(1) { js=serch(i,j,n); if(js<=n) { c[p++]=js;//保存从serch里返回的教师专长 if(k[js]<=0) { G.D[i]=js;k[js]=i;p=0;break; } else { j=js; j++; } } else { p=0; t=k[c[p]]; j=c[p]+1; while(1) { js=serch(t,j,n); if(k[js]<=0 && js<=n) { k[c[p]]=0; G.D[t]=js; k[js]=t; G.D[i]=c[p]; k[c[p]]=i; p=0; break; } else if(js<=n) j++; else { p++; if(c[p]==0) { G.D[i]=0; if(serch_error(k,n)) anpai(k,n); break; } t=c[p];j=c[p]+1; } } break; } } } } printf("教师专长课程设定成功!/n"); return 1; } void display(int n) { int ch,i; printf(" 教师编号 课程编号/n"); for(i=1;i<=n;i++) printf("%5d %13d/n",i,G.D[i]); } void list(int n) { int i,j; for (i=1;i<=n;i++) { printf("%3d号教师的专业特长有:",i); for(j=1;j<=n;j++) if (G.s[i][j]) printf("%3d/n",j); printf("/n"); } } void edit(int n) { int k,i=0,m=0,j=0; printf("请输入要修改的老师:"); while(i==0||i>n) { scanf("%d",&i); if(i>0 && i<=n) printf("第%d个老师的专长科目有: ",i); else printf("没这个老师!请重新输入:/n"); } for(k=1;k<=n;k++) { if(G.s[i][k]==1) { printf("%3d/n",k); j++; } } if(j==0) printf("没有专长科目/n"); printf("/n输入你要修改的科目(输入0结束):/n"); do { scanf("%d",&k); if(k>n) { printf("超出范围,重新输入: "); continue; } else if(G.s[i][k]==1) G.s[i][k]=0; else G.s[i][k]=1; }while(k); printf("修改后第%d个老师的专长科目有 :",i); for(k=1;k<=n;k++) { if(G.s[i][k]==1) { printf("%3d/n",k); m++; } } if(m==0) printf("没有专长科目/n"); printf("/n"); } int main(void) { int k[MAX],ch,i=0, n=0,w=0,a=0;//n为0 用来表示还没 i 检查是否专长课程设定 w 检查是否科目数设定 a检查是否课程安排 char cx; while(1) { printf(" ┏━━━━━━━━欢迎进入教学任务安排系统━━━━━━━━┓/n"); printf(" § §/n"); printf(" § 1 -----确定科目数 2 -----教师专长课程设定 §/n"); printf(" § 3 -----课程安排 4 -----教师专长浏览 §/n"); printf(" § 5 -----教师专长课程修改 6------查看教学任务安排 §/n"); printf(" § 0 -----退出系统 §/n"); printf(" └────────────────────────────┘/n"); printf("请选择功能 "); scanf("%d",&ch); printf("/n"); switch(ch) { case 1: { if(!w) { printf("请确定课程数或教师人数 "); scanf("%d",&n); w=creat(k, n); break; } //初始化 else { printf("你已经确定了课程数 ,是否要从新确定(是:Y/y 否:其余键 )"); scanf("%c",&cx); if(cx=='Y'|| cx=='y') { printf(" 重新输入课程数: "); scanf("%d",&n); w=creat(k, n); break; } else break; } } case 2: { if (!w) printf("请先确定科目数!/n/n"); else if(i) { printf("你已经教师专长课程设定 ,是否要从新设定(是:Y/y 否:其余键 )"); scanf("%c",&cx); if(cx=='Y'|| cx=='y') { i=techer_speciality(n); break; } else break; } else i=techer_speciality(n); break; } case 3: { if (!w) printf("请先确定科目数!/n/n"); else if(!i) printf("请先教师专长课程设定!/n"); else anpai(k,n); break; } case 4: { if (!w) printf("请先确定科目数和 教师专长课程设定!/n/n"); else if(!i) printf("请先教师专长课程设定!/n"); else list(n);//教师专长浏览函数 break; } case 5: { if (!w) printf("暂无确定科目数!/n"); else if(!i) printf("教师专长课程暂无设定/n"); //教师专长课程修改函数 else edit(n) ; //修改函数 break; } case 6: { if (!w) printf("请先确定科目数!/n/n"); else if(!i) printf("请先教师专长课程设定!/n"); //查看教学任务安排函数 else if (!a) printf("请先选择课程安排!/n"); else ;//查看教学任务安排函数; break; } case 0: { printf(" ************** 谢谢使用 ************/n"); return ; } default: printf("从新选择功能:/n"); } } system("pause"); return 0; }

转载于:https://www.cnblogs.com/newthing/archive/2011/06/27/2157488.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值