课表管理系统(C++)

注意事项:

该管理系统分为两个独立的程序分别实现不同需求,这两个程序仅仅是为了好玩,同时具有一定的实用性(针对个人),当时写的时候由于实际操作的固定性完全采用模拟形式,格式也非常固定,现在由于实际操作的变化该程序已经废弃了,但当时还是觉得蛮好玩的,毕竟也是在课程之外自己动手实现的一个具有一定实用性的小程序。

在代码测试之前需要用到两个文件:
2019-2020学年第一学期北校区教室使用情况.xls
(课表管理系统测试用)3.xls

具体的测试效果可参考源代码(仅仅为了好玩,学习价值不大)和视频。

如有问题或错误敬请谅解,欢迎积极指出。

课表去重系统(周一到周五):

源代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;

struct Gai{
     //改课表
    string jiaoxuelou;
    string classname;
    int kaishi;
    int chixu;
}gaikebiao[201];

int main()
{
   
    //基础课表的储存设计:如果使用数组,删除之后改为字符串"0"过滤输出
    //如果使用vector可直接erase删除
    //如果使用map只有键值,没有实值
    //可以使用set(既可以自动排序,又可以使用find进行快速查找并结合erase删除)

    //由于后面涉及到查找匹配不是单纯的字符串查询,而是通过单个字符进行查询,因此find不再好用,这里继续采用vector进行遍历搭配字符串下标方式进行查询匹配

    //基础课表的输入:
    vector<string>jieci[10];    //一般建立5个vector存放教室基本信息
    vector<string>::iterator it;
    int jieciin[10];  //一般来说一共五个大节,每个大节输入所要统计的基础课表的教室数量
    for(int i=0;i<5;i++){
   
        cout<<"输入基础课表上筛选后第"<<i+1<<"大节空课教室的数量:"<<endl;
        cin>>jieciin[i];
        string count;
        cout<<"输入基础课表上筛选后第"<<i+1<<"大节空课教室的教室名称:"<<endl;
        jieci[i].clear();
        for(int j=0;j<jieciin[i];j++){
   
            cin>>count;
            jieci[i].push_back(count);
        }
    }

    //基础课表的输出:
    cout<<"基础课表教室信息:"<<endl;
     for(int i=0;i<5;i++){
   
        cout<<"第"<<i+1<<"大节共有"<<jieci[i].size()<<"个空课教室";
        cout<<"第"<<i+1<<"大节空课教室信息:"<<endl;
        for(int j=1;j<=jieci[i].size();j++){
   
            cout<<jieci[i][j-1]<<" ";
            if(j%7==0)  //下面%7处理更加直观的显示数据(由于%7,因此使用j=1而不是j=0)
                cout<<endl;
        }
        if(jieci[i].size()%7!=0)
            cout<<endl<<endl;
        else
            cout<<endl;
    }

    //改课表的输入:
    int gaikebiaoin;
    //int gaikebiaoin[10]; //五个大节的改课表的教室数量信息,现在直接对五个大节进行统计,不再一一筛选
    /* //对改课表的单节输入操作,后面改为所有一起输入 for(int i=0;i<5;i++) { cin>>gaikebiaoin[i]; for(int j=0;j<gaikebiaoin[i];j++){ cin>>gaikebiao[j].classname; } for(int j=0;j<gaikebiaoin[i];j++){ cin>>gaikebiao[j].kaishi; } for(int j=0;j<gaikebiaoin[i];j++){ cin>>gaikebiao[j].chixu; } } */

    //直接输入所有改课表教室数据,不再一一筛选统计
    cout<<"输入筛选后所有改课表的教室数量:"<<endl;
    cin>>gaikebiaoin;  //输入改课表基础信息
    cout<<"输入筛选后所有改课表上的教室信息:教学楼 教室名 开始节次 持续节次"<<endl;
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].jiaoxuelou;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].classname;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].kaishi;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].chixu;
    }

    //课表的查找与删除:
    //可优化:if条件后面的选择可直接用>=代替==(还可以直接排除一大节中只占一小节的情况)
    for(int i=0;i<gaikebiaoin;i++){
   
        string count=gaikebiao[i].classname;

        //第一大节:
        if(gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=1)){
   
            /* for(it=jieci[0].begin();it!=jieci[0].end();it++){ if(*it==count){ jieci[0].erase(it); //if((*it)[0]==count[0]) //test:OK } } */

            /* for(int j=0;j<jieci[0].size();j++){ //基础课表:5N201,改课表:N-201 if(jieci[0][j][1]==count[0]&&jieci[0][j][2]==count[2]&&jieci[0][j][3]==count[3]&&jieci[0][j][4]==count[4]); //查重后删除,继续考虑使用迭代器指针的形式 } */

            for(it=jieci[0].begin();it!=jieci[0].end();it++){
   
                if((gaikebiao[i].jiaoxuelou=="北校5号楼")&&((*it)[1]==count[0]&&(*it)[2]==count[2]&&(*it)[3]==count[3]&&(*it)[4]==count[4])){
   
                    jieci[0].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校12号楼")&&(*it)[3]==count[0]&&(*it)[4]==count[1]&&(*it)[5]==count[2]){
   
                    jieci[0].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校3号楼")&&(*it)[2]==count[0]&&(*it)[3]==count[1]&&(*it)[4]==count[2]){
   
                    jieci[0].erase(it);
                }
            }
        }

        //第二大节:
        if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=1))){
   
            for(it=jieci[1].begin();it!=jieci[1].end();it++){
   
                if((gaikebiao[i].jiaoxuelou=="北校5号楼")&&(*it)[1]==count[0]&&(*it)[2]==count[2]&&(*it)[3]==count[3]&&(*it)[4]==count[4]){
   
                    jieci[1].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校12号楼")&&(*it)[3]==count[0]&&(*it)[4]==count[1]&&(*it)[5]==count[2]){
   
                    jieci[1].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校3号楼")&&(*it)[2]==count[0]&&(*it)[3]==count[1]&&(*it)[4]==count[2]){
   
                    jieci[1].erase(it);
                }
            }
        }

        //第三大节:
        if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=5))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==5&&(gaikebiao[i].chixu>=1))){
   
            for(it=jieci[2].begin();it!=jieci[2].end();it++){
   
                if((gaikebiao[i].jiaoxuelou=="北校5号楼")&&(*it)[1]==count[0]&&(*it)[2]==count[2]&&(*it)[3]==count[3]&&(*it)[4]==count[4]){
   
                    jieci[2].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校12号楼")&&(*it)[3]==count[0]&&(*it)[4]==count[1]&&(*it)[5]==count[2]){
   
                    jieci[2].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校3号楼")&&(*it)[2]==count[0]&&(*it)[3]==count[1]&&(*it)[4]==count[2]){
   
                    jieci[2].erase(it);
                }
            }
        }

        //第四大节:
         if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=7))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=5))
                ||(gaikebiao[i].kaishi==5&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==7&&(gaikebiao[i].chixu>=1))){
   
            for(it=jieci[3].begin();it!=jieci[3].end();it++){
   
                if((gaikebiao[i].jiaoxuelou=="北校5号楼")&&(*it)[1]==count[0]&&(*it)[2]==count[2]&&(*it)[3]==count[3]&&(*it)[4]==count[4]){
   
                    jieci[3].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校12号楼")&&(*it)[3]==count[0]&&(*it)[4]==count[1]&&(*it)[5]==count[2]){
   
                    jieci[3].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校3号楼")&&(*it)[2]==count[0]&&(*it)[3]==count[1]&&(*it)[4]==count[2]){
   
                    jieci[3].erase(it);
                }
            }
        }

        //第五大节:
        if((gaikebiao[i].kaishi==1&&gaikebiao[i].chixu>=9)
                ||(gaikebiao[i].kaishi==3&&gaikebiao[i].chixu>=7)
                ||(gaikebiao[i].kaishi==5&&gaikebiao[i].chixu>=5)
                ||(gaikebiao[i].kaishi==7&&gaikebiao[i].chixu>=4)
                ||(gaikebiao[i].kaishi==9&&gaikebiao[i].chixu>=1)){
   
            for(it=jieci[4].begin();it!=jieci[4].end();it++){
   
                if((gaikebiao[i].jiaoxuelou=="北校5号楼")&&(*it)[1]==count[0]&&(*it)[2]==count[2]&&(*it)[3]==count[3]&&(*it)[4]==count[4]){
   
                    jieci[4].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校12号楼")&&(*it)[3]==count[0]&&(*it)[4]==count[1]&&(*it)[5]==count[2]){
   
                    jieci[4].erase(it);
                }
                else if((gaikebiao[i].jiaoxuelou=="北校3号楼")&&(*it)[2]==count[0]&&(*it)[3]==count[1]&&(*it)[4]==count[2]){
   
                    jieci[4].erase(it);
                }
            }
        }

    }

    //课表的最终结果输出:
    //可以实现,但是突然发现改课表是N-***的形式,而基础课表是5N***的形式,不是很匹配,另外查询方式可以使用set进一步优化
    cout<<"改课表教室信息:"<<endl;
    for(int i=0;i<5;i++){
   
        cout<<"第"<<i+1<<"大节共有"<<jieci[i].size()<<"个空课教室";
        cout<<"第"<<i+1<<"大节空课教室信息:"<<endl;
        for(int j=1;j<=jieci[i].size();j++){
   
            cout<<jieci[i][j-1]<<" ";
            if(j%7==0)  //下面%7处理更加直观的显示数据(由于%7,因此使用j=1而不是j=0)
                cout<<endl;
        }
        if(jieci[i].size()%7!=0)
            cout<<endl<<endl;
        else
            cout<<endl;
    }
    /* cout<<endl; for(int i=0;i<gaikebiaoin;i++){ cout<<gaikebiao[i].jiaoxuelou<<" "<<gaikebiao[i].classname<<" "<<gaikebiao[i].kaishi<<" "<<gaikebiao[i].chixu<<endl; } */
    system("pause");
    return 0;
}

课表增添系统(周末)

源代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
#include<set>
using namespace std;

struct Gai{
     //改课表(周六周末待增添)
    string jiaoxuelou;
    string classname;
    int kaishi;
    int chixu;
}gaikebiao[201];

int main()
{
   
    set<string>jieci[10];
    set<string>::iterator it;

    int jieciin[10];  //一般来说一共五个大节,每个大节输入所要统计的基础课表的教室数量
    for(int i=0;i<5;i++){
   
        cout<<"输入基础课表上筛选后第"<<i+1<<"大节有课教室的数量:"<<endl;
        cin>>jieciin[i];
        string count;
        cout<<"输入基础课表上筛选后第"<<i+1<<"大节有课教室的教室名称:"<<endl;
        jieci[i].clear();
        for(int j=0;j<jieciin[i];j++){
   
            cin>>count;
            jieci[i].insert(count);
        }
    }

    //基础课表的输出:
    cout<<"基础课表教室信息:"<<endl;
    for(int i=0;i<5;i++){
   
        cout<<"第"<<i+1<<"大节共有"<<jieci[i].size()<<"个有课教室";
        cout<<"第"<<i+1<<"大节有课教室信息:"<<endl;
        int count=1;
        for(it=jieci[i].begin();it!=jieci[i].end();it++){
   
            cout<<(*it)<<" ";
            if(count%7==0)  //下面%7处理更加直观的显示数据(由于%7,因此使用j=1而不是j=0)
                cout<<endl;
            count++;
        }
        if(jieci[i].size()%7!=0)
            cout<<endl<<endl;
        else
            cout<<endl;
    }

    int gaikebiaoin;
    cout<<"输入筛选后所有改课表的教室数量:"<<endl;
    cin>>gaikebiaoin;  //输入改课表基础信息
    cout<<"输入筛选后所有改课表上的教室信息:教学楼 教室名 开始节次 持续节次"<<endl;
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].jiaoxuelou;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].classname;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].kaishi;
    }
    for(int i=0;i<gaikebiaoin;i++){
   
        cin>>gaikebiao[i].chixu;
    }

     for(int i=0;i<gaikebiaoin;i++){
   
        string count=gaikebiao[i].classname;
        if(gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=1)){
   
            if(gaikebiao[i].jiaoxuelou=="北校5号楼"){
   
                count[1]=count[0];
                count[0]='5';
                jieci[0].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校12号楼"){
   
                /* //该方法行不通,不能实现字符串超出指定范围的情况,下面以加号对字符串连接进行替代 count[3]=count[0]; //顺序不用强制转换,因为0,1,2没有在赋值之前被替换 count[4]=count[1]; count[5]=count[2]; count[0]='1'; count[1]='2'; count[2]='#'; */
                count="12#"+count;
                jieci[0].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校3号楼"){
   
                count[4]=count[2];  //顺序较12号楼需作调整,因为count[2]可能会在赋值之前被替换(这里全都逆序)
                count[3]=count[1];
                count[2]=count[0];
                count[1]='#';
                count[0]='3';
                jieci[0].insert(count);

            }
        }

        //第二大节:
        count=gaikebiao[i].classname;  //为防止第一大节操作更改,重新赋值
        if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=1))){
   
           if(gaikebiao[i].jiaoxuelou=="北校5号楼"){
   
                count[1]=count[0];
                count[0]='5';
                jieci[1].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校12号楼"){
   
                count="12#"+count;
                jieci[1].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校3号楼"){
   
                count[4]=count[2];  //顺序较12号楼需作调整,因为count[2]可能会在赋值之前被替换(这里全都逆序)
                count[3]=count[1];
                count[2]=count[0];
                count[1]='#';
                count[0]='3';
                jieci[1].insert(count);

            }
        }

        //第三大节:
        count=gaikebiao[i].classname;
        if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=5))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==5&&(gaikebiao[i].chixu>=1))){
   
            if(gaikebiao[i].jiaoxuelou=="北校5号楼"){
   
                count[1]=count[0];
                count[0]='5';
                jieci[2].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校12号楼"){
   
                count="12#"+count;
                jieci[2].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校3号楼"){
   
                count[4]=count[2];  //顺序较12号楼需作调整,因为count[2]可能会在赋值之前被替换(这里全都逆序)
                count[3]=count[1];
                count[2]=count[0];
                count[1]='#';
                count[0]='3';
                jieci[2].insert(count);

            }
        }

        //第四大节:
        count=gaikebiao[i].classname;
         if((gaikebiao[i].kaishi==1&&(gaikebiao[i].chixu>=7))
                ||(gaikebiao[i].kaishi==3&&(gaikebiao[i].chixu>=5))
                ||(gaikebiao[i].kaishi==5&&(gaikebiao[i].chixu>=3))
                ||(gaikebiao[i].kaishi==7&&(gaikebiao[i].chixu>=1))){
   
            if(gaikebiao[i].jiaoxuelou=="北校5号楼"){
   
                count[1]=count[0];
                count[0]='5';
                jieci[3].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校12号楼"){
   
                count="12#"+count;
                jieci[3].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校3号楼"){
   
                count[4]=count[2];  //顺序较12号楼需作调整,因为count[2]可能会在赋值之前被替换(这里全都逆序)
                count[3]=count[1];
                count[2]=count[0];
                count[1]='#';
                count[0]='3';
                jieci[3].insert(count);

            }
        }

        //第五大节:
        count=gaikebiao[i].classname;
        if((gaikebiao[i].kaishi==1&&gaikebiao[i].chixu>=9)
                ||(gaikebiao[i].kaishi==3&&gaikebiao[i].chixu>=7)
                ||(gaikebiao[i].kaishi==5&&gaikebiao[i].chixu>=5)
                ||(gaikebiao[i].kaishi==7&&gaikebiao[i].chixu>=3)
                ||(gaikebiao[i].kaishi==9&&gaikebiao[i].chixu>=1)){
   
           if(gaikebiao[i].jiaoxuelou=="北校5号楼"){
   
                count[1]=count[0];
                count[0]='5';
                jieci[4].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校12号楼"){
   
                count="12#"+count;
                jieci[4].insert(count);
            }
            else if(gaikebiao[i].jiaoxuelou=="北校3号楼"){
   
                count[4]=count[2];  //顺序较12号楼需作调整,因为count[2]可能会在赋值之前被替换(这里全都逆序)
                count[3]=count[1];
                count[2]=count[0];
                count[1]='#';
                count[0]='3';
                jieci[4].insert(count);

            }
        }
    }

    cout<<"改课表教室信息:"<<endl;
    for(int i=0;i<5;i++){
   
        cout<<"第"<<i+1<<"大节共有"<<jieci[i].size()<<"个有课教室";
        cout<<"第"<<i+1<<"大节有课教室信息:"<<endl;
        int count=1;
        for(it=jieci[i].begin();it!=jieci[i].end();it++){
   
            cout<<(*it)<<" ";
            if(count%7==0)  //下面%7处理更加直观的显示数据(由于%7,因此使用j=1而不是j=0)
                cout<<endl;
            count++;
        }
        if(jieci[i].size()%7!=0)
            cout<<endl<<endl;
        else
            cout<<endl;
    }
    system("pause");
    return 0;
}

视频展示:

空课表检查

空课表结果.avi