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

📄 大作业3.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;
///////////////

void 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;
	}
	
}
/////////////

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;                     //(没有科目没有被安排)或者(有科目没有被安排但没有老师有此专长)
}
/////////////////
void 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
}







//显示函数模块******************************************************************
void cout_s(int s,int D[]) {//输出科目编号 s , 当 D[s] 不足二位时前面输出0
	cout<<"│";
	if(D[s]>9)cout<<D[s];
	else cout<<"0"<<D[s];
}

void cout_t(int k) {//输出老师编号 k , 当 k 不足二位时前面输出0
	cout<<"│";
	if(k>9)cout<<k;
	else cout<<"0"<<k;
}

void print_list(int D[],int f,int n) {//输出数组D[f]至D[f+n-1]的所有元素

	int i,j,k,m,s;//m,s为开始位置,n为要输出的记录个数

	m=s=f;

	if(n>9) {//n>=10

	j=n%10;

	i=(n-j)/10;

	if(i>=1) {//输出表头cout<<"│0"<<m;

		cout<<"┏━━━━┯━┯━┯━┯━┯━┯━┯━┯━┯━┯━┓"<<endl;
		cout<<"┃老师编号";for(k=0;k<10;k++,m++)cout_t(m); cout<<"┃"<<endl;
		cout<<"┠────┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┨"<<endl;
		cout<<"┃所教课程";for(k=0;k<10;k++,s++)cout_s(s,D);cout<<"┃"<<endl;
		i--;
	}//while
	while(i!=0) {//输出表中间部分
		cout<<"┠────┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┨"<<endl;
		cout<<"┃老师编号";for(k=0;k<10;k++,m++)cout<<"│"<<m; cout<<"┃"<<endl;
		cout<<"┠────┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┨"<<endl;
		cout<<"┃所教课程";for(k=0;k<10;k++,s++)cout_s(s,D);cout<<"┃"<<endl;
		i--;
	}//while
	if(j==0)cout<<"┗━━━━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┛"<<endl;//输出表尾

		else {
		cout<<"┠────";for(k=0;k<=j;k++)cout<<"┼─";for(;k<10;k++)cout<<"┴─";cout<<"┨"<<endl;
		cout<<"┃老师编号";for(k=0;k<j;k++,m++)cout<<"│"<<m; cout<<"│";cout<<setw((10-k)*4);cout<<"┃"<<endl;
		cout<<"┠────";for(k=0;k<j;k++)cout<<"┼─";cout<<"┤";cout<<setw((10-k)*4);cout<<"┃"<<endl;
		cout<<"┃所教课程";for(k=0;k<j;k++,s++)cout_s(s,D);cout<<"│";cout<<setw((10-k)*4);cout<<"┃"<<endl;
		cout<<"┗━━━━";for(k=0;k<=j;k++)cout<<"┷━";for(;k<10;k++)cout<<"━━";cout<<"┛"<<endl;;
		}//else

	}//if
	else {
		cout<<"┏━━━━";for(k=0;k<n;k++)cout<<"┯━";cout<<"┓"<<endl;
		cout<<"┃老师编号";for(k=0;k<n;k++,m++)cout_t(m); cout<<"┃"<<endl;
		cout<<"┠────";for(k=0;k<n;k++)cout<<"┼─";cout<<"┨"<<endl;
		cout<<"┃所教课程";for(k=0;k<n;k++,s++)cout_s(s,D);cout<<"┃"<<endl;
		cout<<"┗━━━━";for(k=0;k<n;k++)cout<<"┷━";cout<<"┛"<<endl;
	}//else
}

void print_screen(int D[],int n) {//分屏输出所有元素
	int i=1;//因为D[0]没有放内容,所以从D[1]开始输出,输出D[1]至D[n]
	system("cls");
	while(n>50) {//每输出50个记录暂停一次,按任意键继续
		print_list(D,i,50);//输出D[1]~D[50]或D[51]~D[99]
		n-=50;
		i+=50;
		system("pause");
		system("cls");
	}//while
	if(n!=0) {
		print_list(D,i,n);
		system("pause");
		system("cls");
	}//if
	else return;
}//print_screen

void print_segment(int D[],int n) {//分段输出
	int f,l;
	system("cls");
	while(1) {
		cout<<"请输入第一个老师的编号:";
		cin>>f;
		cout<<"请输入要输出的记录的个数:";
		cin>>l;
		if(f+l+1>n)cout<<"输入大于记录总数,请重新输入"<<endl;
		else break;
	}
	system("cls");
	while(l>50) {//每输出50个记录暂停一次,按任意键继续
		print_list(D,f,50);//输出D[f]至D[f+49]
		l-=50;
		f+=50;
		system("pause");
		system("cls");
	}//while
	if(l!=0) {
		print_list(D,f,l);
		system("pause");
		system("cls");
	}//if
	system("cls");
	return;
}

void print_single(int D[],int n) {//单个输出
	int m;
	system("cls");
	while(1) {
		cout<<"请输入要输出的记录老师的编号:";
		cin>>m;
		if(m>n)cout<<"输入大于记录总数,请重新输入:"<<endl;
		else break;
	}//while
	system("cls");
	print_list(D,m,1);//输出D[m]
	system("pause");//按任意键继续
	system("cls");//回到主函数前清屏
	return;
}

void display(MGraph &G,int n)
{
	int c=0;//c选择用

	while(1)
	{
        
        cout<<"        ┏━━━━━━━━━━━━┓            "<<endl;
        cout<<"┏━━━━━┫   请选择要查看的内容   ┣━━━━━┓"<<endl;
        cout<<"┃       ┗━━━━━━━━━━━━┛     ┃"<<endl;
        cout<<"┃ 1 -----分屏输出            2 -----分段输出     ┃"<<endl;
        cout<<"┃ 3 -----单个输出            0 -----返回上级     ┃"<<endl;
        cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
	
	if(c>3||c<0)cout<<"输入错误,请重新输入: ";
	else cout<<"请选择: ";
	cin>>c;
//	else cout<<"输入错误,请重新输入: "<<flush;//有问题

//	ch=getchar();
//	cin.getline(s,1);
	switch(c)
	{
	case 1 : print_screen(G.D,n);break;
	case 2 : print_segment(G.D,n);break;
	case 3 : print_single(G.D,n);break;
	case 0 : return;
//	case '\n': system ("cls");break;
	default  : system ("cls"); //cout<<"输入错误,请重新输入"<<endl;
	}
//	cout<<ch<<endl;

	}

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



//显示模块结束

void main()
{
	MGraph G;
	int k[max],i=0,m=1,g=1,n=0;//n为0 用来表示还没//m检测某功能是否有运行
	char ch;
	


		cout<<"*******************欢迎进入教学任务安排系统******************"<<endl;
		

		cout<<endl<<"先输入课程数或教师人数n: "; cin>>n;
    	creat(G,k,n);        //初始化
	while(1)
	{
        cout<<"        ┏━━━━━━━━━━━━┓            "<<endl;
        cout<<"┏━━━━━┫欢迎使用教学任务安排系统┣━━━━━┓"<<endl;
        cout<<"┃       ┗━━━━━━━━━━━━┛     ┃"<<endl;
        cout<<"┃1 -----教师专长课程设定        2 -----课程安排  ┃"<<endl;
        cout<<"┃2 -----教师专长课程修改        0 -----退出系统 ┃"<<endl;
        cout<<"┃3------查看教学任务安排                 ┃"<<endl;
        cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

		cout<<"请选择功能  "<<ends;   cin>>ch;
		cout<<endl;
		switch(ch)
		{
			
		case '1': { 
			        if(i)
				  {  
					  cout<<"已作设定,是否重装设定,否-0:  ";
			          cin>>g;			  
					 if(g)
					 {
                       cout<<"重装输入课程数或教师或教师数n: "; cin>>n;
			           creat(G,k,n);i=techer_speciality( G,  n) ;m=1; break;
					 }break;
					}
                     i=techer_speciality(G,  n) ;break;
				  }
		case '2': {
			         if(!i){cout<<"还没输入设定!\n";break;}
					 else 
					 {
						 anpai( G, k, n);cout<<"安排完成!\n";m=0;break;
					 }
				  }
		case '3': {
			        if(m||!i)
					{
						cout<<"没有进行安排或没有输入设定!\n";break;
					}
					    display(G,n);            break;
				  }
		case '0': exit(1);//abort();
		default:  cout<<"请从新选择功能:"<<flush; 
			
			
			
		}
		
	}
}

⌨️ 快捷键说明

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