?? 大作業(yè)排課5.cpp
字號:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>//setw()
#include <stdlib.h>
#include <time.h>
#define max 100
typedef struct {
int s[max][max];//用二維數(shù)組存放教師專業(yè)特長
int D[max]; //用一維數(shù)組存放安排的教學(xué)任務(wù)
}MGraph;
///////////////
int creat(MGraph &G,int *k,int &n,int b) //初始化,將二維數(shù)組s和一維數(shù)組D全部賦值為0
{
int i,j;
if(!b)//定義b是為edit()執(zhí)行后判斷是否把二維數(shù)組s全部賦值為0
{
cout<<"請確定課程數(shù)或教師人數(shù)(1-"<<max-1<<") ";cin>>n;
if (n<=0||n>max-1)
{cout<<"數(shù)字無效"<<endl;return (0);}//輸入失敗返回結(jié)束
cout<<endl;
cout<<"科目數(shù)成功確定為 "<<n<<endl;
}
for(i=1;i<=n;i++)//二維數(shù)組s和一維數(shù)組D全部賦值為0
{
G.D[i]=0;
k[i]=0;
for(j=1;j<=n&&!b;j++)
G.s[i][j]=0;
}//for
return(1);
}
/////////////
int techer_speciality(MGraph &G, int n)
{
int k;
cout<<"請輸入教師專業(yè)特長編號(1-"<<n<<") 0表示結(jié)束輸入:\n";
for(int i=1;i<=n;i++)
{
cout<<"輸入教師編號為 "<<i<<" 的特長專業(yè)號:";
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)//查找老師的專長科目;返回專長科目的代碼(i為老師j為科目)
{
for(;j<=n;j++)
if(G.s[i][j]==1)break;
return(j);
}
/////////
int serch_error(MGraph &G,int *k,int n)//在所有老師都有被進(jìn)行安排過的情況下運行
{
int t;static int b=0; //b檢測是否有兩個或兩個以上的專業(yè)只有一個老師可授
for(int j=1;j<=n;j++)
if(k[j]==0) //存在有科目沒有老師授課
for(int i=1;i<=n;i++) //哪個老師可以授此科目且此科目當(dāng)前還沒有老師授課
if(G.s[i][j]==1)
{
if(b!=i)b=i;else return 0; //if(b!=i)b=i記錄第一個沒有授課的科目但有老師可以授課的老師下標(biāo)
//若再次運行這個函數(shù)且另一個沒有授課的科目也是這位老師可授,即有
//多個科目只有此老師可授,即調(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; //(沒有科目沒有被安排)或者(有科目沒有被安排但沒有老師有此專長)
}
/////////////////
/////////////////
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 list(MGraph &G,int n)
{
int i,j,k;//k=0 記錄輸出個數(shù)
for (i=1;i<=n;i++)
{
k=0;
cout<<setw(3)<<i<<" 號教師的專業(yè)特長有: ";
for(j=1;j<=n;j++)
if (G.s[i][j]){
k++;
cout<<j<<setw(4); if((k%12)==0) {cout<<endl;cout<<setw(25);}
}//打印15個換一行
cout<<endl;
}
}
//*****************************************
void edit(MGraph &G, int n,int*k) //教師專業(yè)修改
{int s,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(s=1;s<=n;s++)
{if(G.s[i][s]==1)
{
cout<<s<<setw(3);
j++;
}
}
if(j==0)
cout<<"沒有專長科目"<<endl;
cout<<endl<<"輸入你要修改的科目(輸入0結(jié)束):"<<endl;
do {
cin>>s;
if(s>n) {cout<<"超出范圍,重新輸入: ";continue;}
else if(G.s[i][s]==1)
G.s[i][s]=0;
else G.s[i][s]=1;
}while(s);
cout<<"修改后第"<<i<<"個老師的專長科目有 :";
for(s=1;s<=n;s++)
{if(G.s[i][s]==1)
{cout<<s<<setw(3);
m++;
}
}
if(m==0)
cout<<"沒有專長科目"<<endl;
cout<<endl;
creat(G,k,n,1);//修改后把數(shù)組D和k全部賦值為0
anpai(G,k,n);//重新排列
}
///////////////////////////////////////////
void sjcount(MGraph &G, int n,int*k)//隨機(jī)生成老師專長
{
srand((unsigned int)time((time_t *)NULL));//srand() 來初始化偽隨機(jī)數(shù)發(fā)生器的種子,(當(dāng)前時間)
for (int i=1;i<=n;i++){
for (int s=1;s<=n;s++)
{G.s[i][s]=rand() % 2;
}
}
creat(G,k,n,1);//修改后把數(shù)組D和k全部賦值為0
}
/////////////////////////////////////////////////////
//顯示函數(shù)模塊******************************************************************
void cout_s(int s,int D[]) {//輸出科目編號 s , 當(dāng) D[s] 不足二位時前面輸出0
cout<<"│";
if(D[s]>9)cout<<D[s];
else cout<<"0"<<D[s];
}
void cout_t(int k) {//輸出老師編號 k , 當(dāng) k 不足二位時前面輸出0
cout<<"│";
if(k>9)cout<<k;
else cout<<"0"<<k;
}
void print_list(int D[],int f,int n) {//輸出數(shù)組D[f]至D[f+n-1]的所有元素
int i,j,k,m,s;//m,s為開始位置,n為要輸出的記錄個數(shù)
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]沒有放內(nèi)容,所以從D[1]開始輸出,輸出D[1]至D[n]
system("cls");//清屏
while(n>50) {//每輸出50個記錄暫停一次,按任意鍵繼續(xù)
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<<"請輸入第一個老師的編號(1~"<<n<<"):";
while(1) {//檢查輸入
cin>>f;
if(f<=0||f>n)cout<<"老師編號超出范圍,請重新輸入老師的編號:";
else break;
}//while
cout<<"請輸入要輸出的記錄的個數(shù):";
cin>>l;
if(f+l-1>n)cout<<"輸入大于記錄總數(shù),請重新輸入"<<endl;
else break;
}
system("cls");//按任意鍵繼續(xù)
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");
cout<<"請輸入要輸出的記錄老師的編號(1~"<<n<<"):";
while(1) {//檢查輸入
cin>>m;
if(m<=0||m>n)cout<<"老師編號超出范圍,請重新輸入老師的編號:";
else break;
}//while
system("cls");
print_list(D,m,1);//輸出D[m]
system("pause");//按任意鍵繼續(xù)
system("cls");//回到主函數(shù)前清屏
return;
}
void display(MGraph &G,int n)
{
int c=0;//c選擇用
while(1)
{
cout<<" ┏━━━━━━━━━━━━┓ "<<endl;
cout<<"┏━━━━━┫ 請選擇要查看的內(nèi)容 ┣━━━━━┓"<<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;
}
//顯示模塊結(jié)束
void main()
{
MGraph G;int k[max],i=0, n=0,w=0,a=0,b=0;//n 用來表示科目數(shù) w 檢查是否科目數(shù)設(shè)定
//i 檢查是否專長課程設(shè)定 a檢查是否課程安排
char cx,ch;
while(1)
{
cout<<" ┏━━━━━━━━歡迎進(jìn)入教學(xué)任務(wù)安排系統(tǒng)━━━━━━━━┓"<<endl;
cout<<" § §"<<endl;
cout<<" § 1 -----確定科目數(shù) 2 -----教師專長課程設(shè)定 §"<<endl;
cout<<" § 3 -----課程安排 4 -----教師專長瀏覽 §"<<endl;
cout<<" § 5 -----教師專長課程修改 6------查看教學(xué)任務(wù)安排 §"<<endl;
cout<<" § 7 -----隨機(jī)生成老師專長 0 -----退出系統(tǒng) §"<<endl;
cout<<" └────────────────────────────┘"<<endl;
cout<<" 請選擇功能 "<<ends; cin>>ch;
cout<<endl;
switch(ch)
{
case '1': {
if (!w){ w=creat(G,k, n,b); ;break; } //初始化
else {
cout<<"你已經(jīng)確定了課程數(shù) ,是否要從新確定(是:Y/y 否:其余鍵 )";cin>>cx;
if(cx=='Y'||cx=='y') { w=creat(G,k, n,b); a=0;i=0;}
break;
}
}
case '2': {
if (!w)cout<<"教師專長課程設(shè)定前,請先確定科目數(shù)!"<<endl<<endl;
else if(i){
cout<<"你已經(jīng)教師專長課程設(shè)定 ,是否要從新設(shè)定(是:Y/y 否:其余鍵 )";cin>>cx;
if(cx=='Y'||cx=='y')
{ i=techer_speciality(G, n);break; a=0; }
else break;
}
else i=techer_speciality(G, n);
break;
}
case '3': {
if (!w)cout<<"課程安排前,請先確定科目數(shù)!"<<endl<<endl;
else if(!i)cout<<"課程安排前,請先教師專長課程設(shè)定!"<<endl;
else {anpai(G,k,n); a=1; cout<<"教師專長課程安排成功!"<<endl; }
break;
}
case '4': {
if (!w) cout<<"教師專長瀏覽前,請先確定科目數(shù)和 教師專長課程設(shè)定!"<<endl<<endl;
else if(!i)cout<<"教師專長瀏覽前,請先教師專長課程設(shè)定!"<<endl;
else list(G, n);//教師專長瀏覽函數(shù)
break;
}
case '5':{
if (!w) cout<<"教師專長課程修改前,請先確定科目數(shù)!"<<endl;
else if(!i)cout<<"教師專長課程修改前,請先教師專長課程設(shè)定!"<<endl;//教師專長課程修改函數(shù)
else edit(G,n,k) ; //修改函數(shù)
break;
}
case'6':{
if (!w) cout<<"查看教學(xué)任務(wù)安排前,請先確定科目數(shù)!"<<endl<<endl;
else if(!i)cout<<"查看教學(xué)任務(wù)安排前,請先教師專長課程設(shè)定!"<<endl;//查看教學(xué)任務(wù)安排函數(shù)
else if (!a)cout<<"查看教學(xué)任務(wù)安排前,請先選擇課程安排!"<<endl;
else display(G, n) ;//查看教學(xué)任務(wù)安排函數(shù);
break;
}
case '7': {if (!w) { cout<<"隨機(jī)生成老師專長前,請先確定科目數(shù)!"<<endl<<endl;break;}
sjcount(G,n,k);
i=1;
cout<<"生成完畢"<<endl;
break;
}
case '0': {
cout<<" ************************************************************ "<<endl;
cout<<" * * * * * * * * * * * 謝謝使用 * * * * * * * * * * * * * *"<<endl;
cout<<" ************************************************************"<<endl;
return;
}
default: system("cls"); cout<<"選擇錯誤,重新選擇功能!"<<endl; break;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -