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

📄 大作业5.cpp

📁 简易教学任务安排 假设有n门课程需要n个教师去授课
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>//setw()
#define max 100
typedef struct {
        int s[max][max];//用二维数组存放教师专业特长
		int D[max];      //用一维数组存放安排的教学任务
}MGraph;
///////////////

int creat(MGraph &G,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;
	}
	cout<<endl;
	cout<<"科目数成功确定为  "<<n<<endl;
	return(1);
	
}


/////////////

int techer_speciality(MGraph &G, int n)
{
	
	int k;
	cout<<"请输入教师专业特长编号(1-"<<n<<")  0表示结束输入:\n";

	for(int i=1;i<=n;i++)
	{
		cout<<"输入教师编号为 "<<i<<" 的特长专业号:";
		do {
			cin>>k;
			if(k>n) {cout<<"超出范围,重新输入:   ";continue;}
			else G.s[i][k]=1;
		}while(k);
	}
	cout<<"设定成功!"<<endl;
	return (1);//设定成功!
}
//////////////

int serch(MGraph &G,int i,int j,int n)
{
	for(;j<=n;j++)
		if(G.s[i][j]==1)break;
		
		return(j);
}
/////////

int serch_error(MGraph &G,int *k,int n)//在所有老师都有被进行安排过的情况下运行
{
	int t;static int b=0;              //b检测是否有两个或两个以上的专业只有一个老师可授
	for(int j=1;j<=n;j++)
		if(k[j]==0)                    //存在有科目没有老师授课
			for(int 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(MGraph &G,int *k,int n)
{
	int c[max]={0},j, js, p=0,t;
	for(int i=1;i<=n;i++)
		if(G.D[i]==0)
		{j=1;
		while(1)
		{
			js=serch(G,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 {
				//if(js>n)if(p>1)p=p-2;else p=p-1;
				p=0;	
				t=k[c[p]];
				j=c[p]+1;
				while(1)
				{
					js=serch(G,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(G,k,n))anpai(G,k,n); break;
						}

					t=c[p];j=c[p]+1;
					}//while
				}
				break;
			}
		}//while
		}//if
		cout<<"教师专长课程设定成功!"<<endl;
		return (1);

}
/////////////////

void display(MGraph &G,int n)
{
	int ch;
/*	while(1)
	{
	cout<<"…………查看菜单……………"<<endl;
	cout<<" * 1  全部教学安排      "<<endl;
	cout<<" * 2  单个教师安排  "<<endl;
	cout<<" * 3  单个科目安排      "<<endl;
	cout<<" * 4  未安排的教师      "<<endl;
	cout<<" * 5  未安排的科目      "<<endl;
	cout<<" * 0  返回上级菜单      "<<endl;
	
	cout<<"选择功能: ";cin>>ch;
	switch(ch)
	{
	case '1':       ;break ;
	case '2':           ;break ;
	case '3':          ;break ;
	case '4':             ;break ;
	case '5':             ;	break ;
	case '0':            ;	break ;
	default: ;

	}
	}


*/
	cout<<" 教师编号"<<setw(12)<<"课程编号"<<endl;
	for(int i=1;i<=n;i++)
		cout<<setw(5)<< i<<setw(13)<<G.D[i]<<endl;
}


void list(MGraph &G,int n)
{
	int i,j;
	for (i=1;i<=n;i++)
	{
		cout<<setw(3)<<i<<" 号教师的专业特长有:";
		for(j=1;j<=n;j++)
			if (G.s[i][j]) cout<<j<<setw(5);
			cout<<endl;
	}
	

}

void edit(MGraph &G, int n)
{int k,i=0,m=0,j=0;
cout<<"请输入要修改的老师:";
while(i==0||i>n){
cin>>i;
if(i>0&&i<=n)
cout<<"第"<<i<<"个老师的专长科目有: ";
else cout<<"没这个老师!请重新输入:"<<endl;
}

for(k=1;k<=n;k++)
{if(G.s[i][k]==1)
{
cout<<k<<setw(3);
j++;
}
}
if(j==0)
cout<<"没有专长科目"<<endl;

cout<<endl<<"输入你要修改的科目(输入0结束):"<<endl;

		do {
cin>>k;
if(k>n) {cout<<"超出范围,重新输入:   ";continue;}
else if(G.s[i][k]==1)
G.s[i][k]=0;
else G.s[i][k]=1;
		}while(k);

cout<<"修改后第"<<i<<"个老师的专长科目有 :";
for(k=1;k<=n;k++)
{if(G.s[i][k]==1)
{cout<<k<<setw(3);
m++;
}
}
if(m==0)
cout<<"没有专长科目"<<endl;
cout<<endl;
}









void main()
{
	MGraph G;int k[max],ch,i=0, n=0,w=0,a=0;//n为0 用来表示还没  i 检查是否专长课程设定  w 检查是否科目数设定  a检查是否课程安排
	char cx;


	while(1)
	{

        cout<<" ┏━━━━━━━━欢迎进入教学任务安排系统━━━━━━━━┓"<<endl;
		cout<<" §                                                        §"<<endl;
		cout<<" § 1 -----确定科目数            2 -----教师专长课程设定   §"<<endl;
		cout<<" § 3 -----课程安排              4 -----教师专长浏览       §"<<endl;
		cout<<" § 5 -----教师专长课程修改      6------查看教学任务安排   §"<<endl;
		cout<<" § 0 -----退出系统                                        §"<<endl;
		cout<<" └────────────────────────────┘"<<endl;

		cout<<"请选择功能  "<<ends;   cin>>ch;
		cout<<endl;
		switch(ch)
		{
			
		case 1: { 
			if (!w){cout<<"请确定课程数或教师人数 ";  cin>>n;   w=creat(G,k, n);  break;  } //初始化
			else {
				cout<<"你已经确定了课程数 ,是否要从新确定(是:Y/y   否:其余键 )";cin>>cx;
				if(cx=='Y'||cx=='y')  

				{cout<<" 重新输入课程数: ";cin>>n;  w=creat(G,k, n); break;  } 

				else  break;
			}
				  
				  }


		case 2: {
			if (!w)cout<<"请先确定科目数!"<<endl<<endl;
			else if(i){
				cout<<"你已经教师专长课程设定 ,是否要从新设定(是:Y/y   否:其余键 )";cin>>cx;
				if(cx=='Y'||cx=='y')  

				{ i=techer_speciality(G,  n);break;  } 
				else break;
			}

		    else i=techer_speciality(G,  n);
			   break;
				  
			}


		case 3:	{  
			if (!w)cout<<"请先确定科目数!"<<endl<<endl;
			else if(!i)cout<<"请先教师专长课程设定!"<<endl;
			else anpai(G,k,n);
			   break;
			}
		
		case 4: {
			if (!w)  cout<<"请先确定科目数和 教师专长课程设定!"<<endl<<endl;
			else if(!i)cout<<"请先教师专长课程设定!"<<endl;
			else list(G, n);//教师专长浏览函数
				break;
			
			 }
		case 5:{
			if (!w)  cout<<"暂无确定科目数!"<<endl;
			else if(!i)cout<<"教师专长课程暂无设定"<<endl;//教师专长课程修改函数
			else edit(G, n) ; //修改函数
				break;
				 
				 
				 
				 }


		case 6:{
			if (!w)  cout<<"请先确定科目数!"<<endl<<endl;
			else if(!i)cout<<"请先教师专长课程设定!"<<endl;//查看教学任务安排函数
				else if (!a)cout<<"请先选择课程安排!"<<endl;
				else   ;//查看教学任务安排函数;
					break;
				
				}

		case 0: {cout<<" **************  谢谢使用  ************"<<endl;return;}
		default:  cout<<"从新选择功能:"<<endl; 
			
			
			
		}
		
	}
}


/*
	cout<<"请输入课程数n:\n";
	cin>>n;	
	creat(s,D,n);
	cout<<"请输入教师专业特长编号(1-"<<n<<")输入0结束:\n";

	for(int i=1;i<=n;i++)
	{
		cout<<"教师编号"<<i<<":";
		do {
			cin>>k;
			s[i][k].adj=1;//techer_speciality(s,i,k);for(k=1;k<=n;k++)cout<<s[i][k].adj<<"    ";	
		}while(k);
	}

	anpai(D,n,s);

	display(D,n);

}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -