?? 大作業(yè)5.cpp
字號(hào):
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>//setw()
#define max 100
typedef struct {
int s[max][max];//用二維數(shù)組存放教師專業(yè)特長(zhǎng)
int D[max]; //用一維數(shù)組存放安排的教學(xué)任務(wù)
}MGraph;
///////////////
int creat(MGraph &G,int *k,int n) //初始化,將二維數(shù)組s和一維數(shù)組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<<"科目數(shù)成功確定為 "<<n<<endl;
return(1);
}
/////////////
int techer_speciality(MGraph &G, int n)
{
int k;
cout<<"請(qǐng)輸入教師專業(yè)特長(zhǎng)編號(hào)(1-"<<n<<") 0表示結(jié)束輸入:\n";
for(int i=1;i<=n;i++)
{
cout<<"輸入教師編號(hào)為 "<<i<<" 的特長(zhǎng)專業(yè)號(hào):";
do {
cin>>k;
if(k>n) {cout<<"超出范圍,重新輸入: ";continue;}
else G.s[i][k]=1;
}while(k);
}
cout<<"設(shè)定成功!"<<endl;
return (1);//設(shè)定成功!
}
//////////////
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)//在所有老師都有被進(jìn)行安排過的情況下運(yùn)行
{
int t;static int b=0; //b檢測(cè)是否有兩個(gè)或兩個(gè)以上的專業(yè)只有一個(gè)老師可授
for(int j=1;j<=n;j++)
if(k[j]==0) //存在有科目沒有老師授課
for(int i=1;i<=n;i++) //哪個(gè)老師可以授此科目且此科目當(dāng)前還沒有老師授課
if(G.s[i][j]==1)
{
if(b!=i)b=i;else return 0; //if(b!=i)b=i記錄第一個(gè)沒有授課的科目但有老師可以授課的老師下標(biāo)
//若再次運(yùn)行這個(gè)函數(shù)且另一個(gè)沒有授課的科目也是這位老師可授,即有
//多個(gè)科目只有此老師可授,即調(diào)用此函數(shù)的老師沒有科目可授。
t=G.D[i];
if(G.D[i]==0)return 0; //可能有后面老師還沒受到安排,返回等所有老師都有被進(jìn)行安排過才進(jìn)行
G.D[i]=j;k[j]=i;k[t]=0;return 1;//有,讓此老師授此課,原來所授的課取消,重新安排過。
}return 0; //(沒有科目沒有被安排)或者(有科目沒有被安排但沒有老師有此專長(zhǎng))
}
/////////////////
/////////////////
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里返回的教師專長(zhǎng)
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<<"教師專長(zhǎng)課程設(shè)定成功!"<<endl;
return (1);
}
/////////////////
void display(MGraph &G,int n)
{
int ch;
/* while(1)
{
cout<<"…………查看菜單……………"<<endl;
cout<<" * 1 全部教學(xué)安排 "<<endl;
cout<<" * 2 單個(gè)教師安排 "<<endl;
cout<<" * 3 單個(gè)科目安排 "<<endl;
cout<<" * 4 未安排的教師 "<<endl;
cout<<" * 5 未安排的科目 "<<endl;
cout<<" * 0 返回上級(jí)菜單 "<<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<<" 教師編號(hào)"<<setw(12)<<"課程編號(hào)"<<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<<" 號(hào)教師的專業(yè)特長(zhǎng)有:";
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<<"請(qǐng)輸入要修改的老師:";
while(i==0||i>n){
cin>>i;
if(i>0&&i<=n)
cout<<"第"<<i<<"個(gè)老師的專長(zhǎng)科目有: ";
else cout<<"沒這個(gè)老師!請(qǐng)重新輸入:"<<endl;
}
for(k=1;k<=n;k++)
{if(G.s[i][k]==1)
{
cout<<k<<setw(3);
j++;
}
}
if(j==0)
cout<<"沒有專長(zhǎng)科目"<<endl;
cout<<endl<<"輸入你要修改的科目(輸入0結(jié)束):"<<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<<"個(gè)老師的專長(zhǎng)科目有 :";
for(k=1;k<=n;k++)
{if(G.s[i][k]==1)
{cout<<k<<setw(3);
m++;
}
}
if(m==0)
cout<<"沒有專長(zhǎng)科目"<<endl;
cout<<endl;
}
void main()
{
MGraph G;int k[max],ch,i=0, n=0,w=0,a=0;//n為0 用來表示還沒 i 檢查是否專長(zhǎng)課程設(shè)定 w 檢查是否科目數(shù)設(shè)定 a檢查是否課程安排
char cx;
while(1)
{
cout<<" ┏━━━━━━━━歡迎進(jìn)入教學(xué)任務(wù)安排系統(tǒng)━━━━━━━━┓"<<endl;
cout<<" § §"<<endl;
cout<<" § 1 -----確定科目數(shù) 2 -----教師專長(zhǎng)課程設(shè)定 §"<<endl;
cout<<" § 3 -----課程安排 4 -----教師專長(zhǎng)瀏覽 §"<<endl;
cout<<" § 5 -----教師專長(zhǎng)課程修改 6------查看教學(xué)任務(wù)安排 §"<<endl;
cout<<" § 0 -----退出系統(tǒng) §"<<endl;
cout<<" └────────────────────────────┘"<<endl;
cout<<"請(qǐng)選擇功能 "<<ends; cin>>ch;
cout<<endl;
switch(ch)
{
case 1: {
if (!w){cout<<"請(qǐng)確定課程數(shù)或教師人數(shù) "; cin>>n; w=creat(G,k, n); break; } //初始化
else {
cout<<"你已經(jīng)確定了課程數(shù) ,是否要從新確定(是:Y/y 否:其余鍵 )";cin>>cx;
if(cx=='Y'||cx=='y')
{cout<<" 重新輸入課程數(shù): ";cin>>n; w=creat(G,k, n); break; }
else break;
}
}
case 2: {
if (!w)cout<<"請(qǐng)先確定科目數(shù)!"<<endl<<endl;
else if(i){
cout<<"你已經(jīng)教師專長(zhǎng)課程設(shè)定 ,是否要從新設(shè)定(是: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<<"請(qǐng)先確定科目數(shù)!"<<endl<<endl;
else if(!i)cout<<"請(qǐng)先教師專長(zhǎng)課程設(shè)定!"<<endl;
else anpai(G,k,n);
break;
}
case 4: {
if (!w) cout<<"請(qǐng)先確定科目數(shù)和 教師專長(zhǎng)課程設(shè)定!"<<endl<<endl;
else if(!i)cout<<"請(qǐng)先教師專長(zhǎng)課程設(shè)定!"<<endl;
else list(G, n);//教師專長(zhǎng)瀏覽函數(shù)
break;
}
case 5:{
if (!w) cout<<"暫無確定科目數(shù)!"<<endl;
else if(!i)cout<<"教師專長(zhǎng)課程暫無設(shè)定"<<endl;//教師專長(zhǎng)課程修改函數(shù)
else edit(G, n) ; //修改函數(shù)
break;
}
case 6:{
if (!w) cout<<"請(qǐng)先確定科目數(shù)!"<<endl<<endl;
else if(!i)cout<<"請(qǐng)先教師專長(zhǎng)課程設(shè)定!"<<endl;//查看教學(xué)任務(wù)安排函數(shù)
else if (!a)cout<<"請(qǐng)先選擇課程安排!"<<endl;
else ;//查看教學(xué)任務(wù)安排函數(shù);
break;
}
case 0: {cout<<" ************** 謝謝使用 ************"<<endl;return;}
default: cout<<"從新選擇功能:"<<endl;
}
}
}
/*
cout<<"請(qǐng)輸入課程數(shù)n:\n";
cin>>n;
creat(s,D,n);
cout<<"請(qǐng)輸入教師專業(yè)特長(zhǎng)編號(hào)(1-"<<n<<")輸入0結(jié)束:\n";
for(int i=1;i<=n;i++)
{
cout<<"教師編號(hào)"<<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);
}*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -