排课软件(拓扑排序)
要求:程序接收输入的课程总数,专业,以及每个课程的各种信息(课程号,课程名,任课老师名等),课程之间的先修关系,没门课程开始的开课时间。
根据拓扑排序后的课程先修关系进行排刻,使用MFC界面显示排课信息,并使用MFC控件进行查询。
程序没写的不太完善,就以拓扑排序为中心写的。UI界面用的是VS的MFC写的,挺丑的,就不弄上来了。程序总体也就是3个函数,写的挺简单。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#define maxn 100
using namespace std;
struct node
{
char cno[maxn]; //课程编号
char cname[maxn];//课程名称
char tea[maxn];//任课老师
int wtime; //周学时数
int ttime; //指定开课学期
};
vector<node> course[maxn];
queue<int> s;
int view[maxn];
int ak[maxn];
int numbera;
void shuru()
{
int i,j;
// printf("专业 各学期所开课程数 课程编号 课程名称"
// 周学时数 先决条件\n");
printf("总课程数:\n");
cin>>numbera;
node ke;
printf("输入每个课程号,课程名,任课老师:\n");
for(i=1; i<=numbera; i++) //输入每个课程的信息
{
printf("第%d门课:",i);
cin>>ke.cno>>ke.cname>>ke.tea;//ke.wtime>>ke.ttime;
course[i].push_back(ke);
}
for(i=1; i<=numbera; i++)
{
printf(" %s的先修课程: \n", course[i][0].cno);
string a;
cin>>a;
while(a[0]!='#')
{
for(j=1; j<=numbera; j++)
{
if(a==course[j][0].cno)
break;
}
course[i].push_back(course[j][0]);
cin>>a;
}
}
}
void shuchu()
{
int i,j;
memset(view,0,sizeof(view));
printf("每个课程的极其先修课:\n");
for(i=1; i<=numbera; i++) printf("%s ",course[i][0].cno);
printf("\n");
for(i=1; i<=numbera; i++)
{
printf("%s",course[i][0].cno);
for(j=1; j<course[i].size(); j++)
printf("->%s",course[i][j].cno);
cout<<" "<<course[i].size()-1<<endl;
view[i]=course[i].size()-1;
}
}
void tuopu()
{
int num=1;
for (int i=1; i<=numbera; i++)
if(view[i]==0)
{
s.push(i);
view[i]=-1;
}
while(!s.empty())
{
int a=s.front();
s.pop();
ak[num]=a;
num++;
//cout<<a<<endl;
for(int i=1; i<=numbera; i++)
{
// printf("course[%d][0].cno=%s\n",a,course[a][0].cno);
for(int j=1; j<course[i].size(); j++)
{
// printf("course[%d][%d].cno=%s\n",i,j,course[i][j].cno);
string a1=course[i][j].cno;
string a2=course[a][0].cno;
if(a1==a2)
{
view[i]--;
}
}
}
for(int i=1; i<=numbera; i++)
if(view[i]==0)
{
s.push(i);
view[i]=-1;
}
}
printf("排课顺序:\n");
printf("课程号 课程名 授课老师\n");
for(int i=1; i<=numbera; i++)
{
cout<<course[ak[i]][0].cno<<" "<<course[ak[i]][0].cname<<" "<<course[ak[i]][0].tea<<endl;
}
}
int main()
{
freopen("1.txt","r",stdin);
shuru();
shuchu();
tuopu();
return 0;
}
freopen内容
12
c1 课程设计基础 teacherA
c2 离散数学 teacherB
c3 数据结构 teacherC
c4 汇编语言 teacherD
c5 语言的设计和分析 teacherE
c6 计算机原理 teacher12F
c7 编译原理 teacherG
c8 操作系统 teacherH
c9 高等数学 teacherI
c10 线性代数 teacherJ
c11 普通物理 teacherK
c12 数值分析 teacherL
#
c1 #
c1 c2 #
c1 #
c3 #
c11 #
c5 c3 #
c3 c6 #
#
c9 #
c9 #
c9 c10 c1 #
结果(多余的输出自己看情况修改)
排课顺序:
课程号 课程名 授课老师
c1 课程设计基础 teacherA
c9 高等数学 teacherI
c2 离散数学 teacherB
c4 汇编语言 teacherD
c10 线性代数 teacherJ
c11 普通物理 teacherK
c3 数据结构 teacherC
c12 数值分析 teacherL
c6 计算机原理 teacher12F
c5 语言的设计和分析 teacherE
c8 操作系统 teacherH
c7 编译原理 teacherG