排课软件(拓扑排序)

要求:程序接收输入的课程总数,专业,以及每个课程的各种信息(课程号,课程名,任课老师名等),课程之间的先修关系,没门课程开始的开课时间。
根据拓扑排序后的课程先修关系进行排刻,使用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