排课软件(拓扑排序)

要求:程序接收输入的课程总数,专业,以及每个课程的各种信息(课程号,课程名,任课老师名等),课程之间的先修关系,没门课程开始的开课时间。
根据拓扑排序后的课程先修关系进行排刻,使用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
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值