课表管理系统(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