课程设计论文题目:用c++设计一个排课程序学院:专业名称:电子科学与技术班级学号:学生姓名:指导教师:2013年 6月目录一、课题背景 (3)1.1选题的意义 (3)二、课题要求 (4)2.1设计功能要求 (4)2.2 报告要求 (5)三、系统总体方案: (5)3.1方案描述 (5)3.3各功能模块: (6)四、源程序代码 (7)五、测试数据及结果 (24)六、总结 (25)参考书籍 (26)致谢 (26)摘要:随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。
随着经济文化水平的显著提高,人们对生活质量及工作环境的要求也越来越高。
如何通过计算机为我们完成更多的事情,进而达到办公自动化和优化日常工作的目的,也就成了一个大众化的课题。
作为计算机应用的一部分,使用计算机对信息进行管理,具有与手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
关键词:计算机 c++程序语言排课系统一、课题背景1.1实际应用的需要近几年来,随着各高校办公自动化工作的推进,教务管理自动化也被摆上了日程。
在教务工作中占有很大比重的一项就是每学期的课程排定工作。
由于教工、教室和设备的相对紧张,如何进行合理地安排和分配,从而充分利用教学资源是我们不得不面对的问题。
而人工进行排课不仅任务重,效率低,而且易出错,难于维护,想要排出一张各方面都满意的课表非常困难。
并且随着高校规模的扩大手工排课的难度和工作量呈几何级数增长。
学校教务的管理作为高校教育信息化工作中的一项重要工作,如何构建一个具有开放性、实用性和灵活性的平台,是一个值得探讨的课题。
其中,作为学校教务重点环节之一的排课系统也尤为重要。
1.1选题的意义排课系统正是为了减轻教务人员的工作量,实现教务工作自动化,解决排课这一老大难问题的教务办公软件。
尤其针对高校的排课一直都没有很好的解决方法,但是此问题又是每个学校在每个学期都会碰到的必要行政作业。
本文在相关理论的指导下,在分析以往一些排课软件的基础上,提出一个高校通用排课系统的设计方法,并对一些具体的问题给出相应解决方案。
但是,由于技术、经验的有限和数据量过大,目前我们很难做出一个满足所有需要的排课系统。
因为它不仅要考虑到教室冲突问题和教师冲突问题,还要考虑到分段课、单双周课时的资源利用问题;另外由于高校的教学特点,还要处理合班课、分班课、体育课与选修课等特殊课程。
针对这些问题,在此专门对数据库设计作了一些探索,并于架构的选择和模块的划分上经过精心调整,在菜单的设计上也体现了人性化的操作。
该设计贴近用户需求,功能完整,架构合理,并用大量的框图模型体现了系统的规划。
该系统实现上机时间的安排,课程的安排,教室的安排,以及它们之间的不冲突和资源的高效利用;这更切合学院教学需要,降低了排课管理工作的工作量和节省了时间,同时课程安排完成后,学院可迅速获得课表情况信息,为教学工作带来方便。
本系统界面友好,操作简单,使用方便。
二、课题要求2.1设计功能要求程序运行时,用户输入教师信息(姓名、教师号、工作量)、课程信息(课程名、课程号、周学时、总学时、优先级)、教师对所希望讲授课程的期望值以及教学工作量等相关信息,所有信息应保存在文件中,程序根据课程的优先级以及教师对课程的期望值进行排课。
为了公平起见,程序随机分配课程,如果10门课程都有优先级,程序以随机的顺序将这些课程分给教师,如果10位教师对某门课程的期望值为1,程序应从10位教师中随机选择一个。
最后输出排课情况,即某位老师上某门课程,以及某位老师的工作量。
测试数据:程序应能实现对不少于20门课和10个教师的排课,并且使每个教师的满意度达到最大,不存在工作量不满的教师以及未分配的课等情况。
2.2 报告要求1.封面2.课程设计报告:3.⑴系统总体方案⑵设计思路和主要步骤⑶各功能模块和流程图⑷设计代码⑸心得体会和参考资料三、系统总体方案:3.1方案描述某学校每位教师都有教学工作量,教师对他所希望讲授的课程表达为一个期望值,1,2…,n,其中1是最高的期望值。
课程也有优先级,1,2…,n,用来决定将课程分给教师的顺序,其中1是高的优先级。
设计一个程序针对某些课程给某些教师进行排课。
要求:(一)程序运行时,用户输入教师信息(姓名、教师号、工作量)、课程信息(课程名、课程号、周学时、总学时、优先级),教师对所希望讲授课程的期望值以及教学工作量等相关信息,所有信息应保存在文件中。
(二)程序根据课程的优先级以及教师对课程的期望值进行排课。
最后输出排课情况,即某位老师上某门课程,以及某位老师的工作量。
(三)可以实现对文件的修改。
(四)可以在各个界面中实现退出以及进入的循环。
(五)可以退出本系统。
(六)程序应能实现对不少于20门课和10个教师的排课,并且使每个教师的满意度达到最大,不存在工作量不满的教师以及未分配的课等情况。
3.2系统设计框图:3.3各功能模块:命令对应函数功能描述1 input_teacher 输入数据并写入文件2 input_course 输入数据并写入文件3 input_num 输入数据并写入文件4 arranging 排课5 print 输出排课结果6 print_help 帮助7 print_teacher 输出文件信息8 print_course 输出文件信息9 print_num 输出文件信息10 change 修改文件信息四、源程序代码Teacher.h:#include<iostream.h>#include<string.h>class teacher{ private:char name[11];int id;int work_load;int total;public:teacher();void set_teacher(char *pn,int i,int w);void set_total(int t){ total=t; }char *get_name(){return name;}int get_id(){return id;}int get_work_load(){return work_load;}int get_total(){return total;}void print();};teacher::teacher(){ strcpy(name,"无");id=0;work_load=0;total=0; }void teacher::set_teacher(char *pn,int i,int w) { strcpy(name,pn);id=i;work_load=w; }void teacher::print(){ cout<<"姓名:"<<name<<endl;cout<<"编号:"<<id<<endl;cout<<"工作量:"<<work_load<<endl;}Course.h:#include<string.h>class course{ private:char course_name[15];int course_id;int week_hour;int total_hour;int N;public:course(void);void set_course(char *pname,inti,int w,int t,intn) char *get_course_name(){return course_name;}int get_course_id(){return course_id;}int get_week_hour(){return week_hour;}int get_total_hour(){return total_hour;}int get_N(){return N;}void print();};course::course(void){ strcpy(course_name,"无");course_id=0;week_hour=0;total_hour=0;N=0; }void course::set_course(char *pname,int i,int w,int t,int n){ strcpy(course_name,pname);course_id=i;week_hour=w;total_hour=t;N=n; }void course::print(){ cout<<"课程名:"<<course_name<<endl; cout<<"编号:"<<course_id<<endl;cout<<"周学时:"<<week_hour<<endl; cout<<"总学时:"<<total_hour<<endl; cout<<"优先级:"<<N<<endl; }void course::print(){ cout<<"课程名:"<<course_name<<endl; cout<<"编号:"<<course_id<<endl;cout<<"周学时:"<<week_hour<<endl; cout<<"总学时:"<<total_hour<<endl; cout<<"优先级:"<<N<<endl;}{ x=0;y=0; }void set_x(int a){ x=a; }void set_y(int b){ y=b; }int get_x(){return x;}int get_y(){return y;}};排课.cpp:#include<iostream.h>#include <stdlib.h>#include<fstream.h>#include<iomanip.h>#include<stdio.h>#include"teacher.h"#include"course.h"#include"arrange.h"#include <time.h>//using namespace std;void input_teacher(teacher *t,int n,int m);void input_course(course *c,int m);void input_num(int **num,int n,int m);void arranging(int **num,teacher *t,course *c,arrang e *a,int n,int m);void print(teacher *t,course *c,arrange *a,int m); void print_help();void print_teacher();void print_course();void print_num();void change(int **num,teacher *t,course *c,arrange *a,int n,int m);void change_teacher(teacher *t,int n);void change_course(course *c,int m);void change_num(teacher *t,course *c,int **num,int n,int m);void main(){ int i,n,m;cout<<"==========================教师排课系统==========================="<<endl;cout<<"教师人数:";cin >>n;cout<<"课程数:";cin>>m;int** num=new int*[n];for(i=0; i<n; ++i){ num[i]=new int[m]; }teacher *t;course *c;arrange *a;t=new teacher[n];c=new course[m];a=new arrange[m];if(t==NULL||c==NULL||a==NULL){ cout<<"内存分配失败"<<endl;return}cout<<" 1. 输入教师基本数据\n";cout<<" 2. 输入课程基本数据\n";cout<<" 3. 输入教师对课程满意度\n";cout<<" 4. 排课\n";cout<<" 5. 输出排课结果\n";cout<<" 6. 帮助\n";cout<<" 7. 输出教师信息\n";cout<<" 8. 输出课程信息\n";cout<<" 9. 输出教师对课程满意度\n";cout<<" 10.修改文件数据\n";cout<<" 0. 退出\n";cout<<"\n 输入你的选择:";int ch;Do{ //cout<<"\n\n 请选择:\n";//cout<<" 1. 输入教师基本数据\n";//cout<<" 2. 输入课程基本数据\n";//cout<<" 3. 输入教师对课程满意度\n"; //cout<<" 4. 排课\n";//cout<<" 5. 输出排课结果\n";//cout<<" 6. 帮助\n";//cout<<" 0. 退出\n";//cout<<"\n 输入你的选择:";cin>>ch;switch(ch){ case 1 : input_teacher(t,n,m);break;case 2 : input_course(c,m);break;case 3 : input_num(num,n,m);break;case 4 : arranging(num,t,c,a,n,m);break; case 5 : print(t,c,a,m);break;case 6 : print_help();break;case 7 : print_teacher();break;case 8 : print_course();break;case 9 : print_num();break;case 10: change(num,t,c,a,n,m);break;case 0 : break;}}while(ch);for(i=0; i<n; ++i){ delete[] num[i]; }delete[] num;delete []t;delete []c;delete []a; }void input_teacher(teacher *t,int n,int m){ fstream teachers("d:\\teachers.txt",ios::out); teachers<<"姓名"<<setw(20)<<"编号"<<setw(20)<<"工作量<<endl;int i,j,work,id;char name[11],nn[11];cout<<"\n 请输入教师基本数据:"<<endl;while(1){ int total=0;for(i=0;i<n;i++){ cout<<"第"<<i+1<<"个教师:\n";cout<<"编号:";while(1){ if (cin >> id) break;else{ cout<<"编号应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();}}cout<<"姓名:";while(1){ cin>>name;for(j=0;j<11;j++){ if( ('!'<=name[j]&&name[j]<='@')||('['<=name[j]&&name[j] <='`')||'{'<=name[j]&&name[j]<='~' )nn[j]=0;elsenn[j]=1; }if(nn[0]*nn[1]*nn[2]*nn[3]*nn[4]*nn[5]*nn[6]*nn[7]*nn[8] *nn[9]*nn[10]==1) break;else{cout<<"姓名应为字母,请重新输入”<<endl;cin.clear();cin.ignore();} }cout<<"工作量:";while(1){ if (cin >> work) break;else{ cout<<"工作量应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }total=total+work;if(total>m) {cout<<"总工作量大于课程数,请重新输入:"<<endl;break;}t[i].set_teacher(name,id,work);teachers<<name<<setw(20)<<id<<setw(20)<<work<<endl;}if(total==m) break;if(total>m) continue;}teachers.close(); }void input_course(course *c,int m){ fstream courses("d:\\courses.txt",ios::out);courses<<"课程名"<<setw(10)<<"课程号"<<setw(10)<<" 周学时"<<setw(10)<<"总学时"<<setw(10)<<"优先级 "<<endl;int week_hour,total_hour,d1,id,i,j;char name[11];char nn[11];for(i=0;i<m;i++){ cout<<"第"<<i+1<<"门课:\n";cout<<"课程号:";while(1){ if (cin >> id) break;else{ cout<<"课程号应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"课程名:";while(1){ cin>>name;for(j=0;j<11;j++){ if( ('!'<=name[j]&&name[j]<='@')||('['<=name[j]&&name [j]<='`')||'{'<=name[j]&&name[j]<='~' )nn[j]=0;elsenn[j]=1;}if(nn[0]*nn[1]*nn[2]*nn[3]*nn[4]*nn[5]*nn[6]*nn[7]*nn[8]*nn[9]*nn[10]==1) break;else{ cout<<"课程名应为字母,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"周学时:";while(1){ if (cin >> week_hour ) break;else{ cout<<"周学时应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"总学时:";while(1){ if (cin >> week_hour ) break;else{ cout<<"周学时应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"总学时:";while(1){ if (cin >> total_hour ) break;else{ cout<<"总学时应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"优先级:";while(1){ if (cin>>d1) break;else{ cout<<"优先级应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }c[i].set_course(name,id,week_hour,total_hour,d1);courses<<name<<setw(10)<<id<<setw(10)<<week_hour<< setw(10)<<total_hour<<setw(10)<<d1<<endl;}courses.close(); }void input_num(int **num,int n,int m) //教师对课程满意度输入{ fstream nums("d:\\hope.txt",ios::out);nums<<setw(4)<<"满意度"<<setw(6);int nu,i,j,k;for(k=0;k<m;k++) {nums<<"第"<<k+1<<"门课程"<<setw(5);}nums<<endl;for(i=0;i<n;i++){ nums<<"第"<<i+1<<"名老师"<<setw(3);for(j=0;j<m;j++) {cout<<"第"<<i+1<<"位老师对第"<<j+1<<"门课程的满意度"<<endl;//cin>>nu;while(1){ if (cin >> nu) break;else{ cout<<"满意度应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();}}num[i][j]=nu;nums<<nu<<setw(13);}nums<<endl;}nums.close();}void arranging(int **num,teacher *t,course *c,ar range *a,int n,int m) //排课{ int h,s,i,j,b,k=1,min,min1,q=0;min=c[0].get_N();srand((unsigned)time(NULL));for(s=0;s<m;s++){ if(c[s].get_N()<min)min=c[s].get_N();}while(h){for(i=0;i<m;i++){if(c[i].get_N()==min) //判断课程优先级{ min1=num[0][i];for(j=0;j<n;j++){ if( num[j][i]<min1&&t[j].get_total()<t[j].get_work_lo ad() )min1=num[j][i];}while(1>0){ b=rand()%n;if(b>n)continue;else if(t[b].get_total()>t[b].get_work_load()) continue;else if(num[b][i]!=min1)continue;else{ a[q].set_x(b);a[q].set_y(i);q++;int w=t[b].get_total()+1;t[b].set_total(w);//k=0;cout<<"第"<<q<<"次排课"<<endl; }break; }}//if(i=m-1) min++;}min++;if(q<m) h=1;else h=0;} }void print(teacher *t,course *c,arrange *a,int m) //输出排课结果{ int i,a1,b1;for(i=0;i<m;i++){ a1=a[i].get_x();b1=a[i].get_y();cout<<"第"<<a1+1<<"位老师上第"<<b1+1<<"门课"<<endl;t[a1].print();c[b1].print();} }void print_help() //帮助函数{cout<<" 1. 输入教师基本数据\n";cout<<" 2. 输入课程基本数据\n";cout<<" 3. 输入教师对课程满意度\n";cout<<" 4. 排课\n";cout<<" 5. 输出排课结果\n";cout<<" 6. 帮助\n";cout<<" 7. 输出教师信息\n";cout<<" 8. 输出课程信息\n";cout<<" 9. 输出教师对课程满意度\n";cout<<" 10.修改文件数据\n";cout<<" 0. 退出\n"; }void print_teacher() //输出教师信息{ ifstream fin("d:\\teachers.txt",ios::nocreate);if(!fin){ cout<<"File open error!\n";return;}char c[80];while(!fin.eof()) //判断文件是否读结束{ fin.read(c,80);cout.write(c,fin.gcount());}fin.close();}void print_course() //输出课程信息{ ifstream fin("d:\\courses.txt",ios::nocreate); if(!fin){ cout<<"File open error!\n";return;}char c[80];while(!fin.eof()){ fin.read(c,80);cout.write(c,fin.gcount());}fin.close(); }void print_num() //输出教师对课程的满意度{ ifstream fin("d:\\hope.txt",ios::nocreate);if(!fin){ if(!fin){ cout<<"File open error!\n";return;}char c[80];while(!fin.eof()) //判断文件是否读结束}fin.read(c,80);cout.write(c,fin.gcount()); }fin.close(); }void change(int **num,teacher *t,course *c,arrange *a,int n,int m) //修改文件信息{ int ch;do {cout<<"\n\n 请选择:\n";cout<<" 1. 修改教师基本数据\n";cout<<" 2. 修改课程基本数据\n";cout<<" 3. 修改教师对课程满意度\n";cout<<" 0. 退出\n";cout<<"\n 输入你的选择:";cin>>ch;switch(ch){ case 1 : change_teacher(t,n);break;case 2 : change_course(c,m);break;case 3 : change_num(t,c,num,n,m);break;case 0 : break; } }while(ch); }void change_teacher(teacher *t,int n){ int i,aa,bb,k,j,ii;char na[11];char nn[11];cout<<"请输入要修改教师编号:";cin>>ii;for(i=0;i<n;i++)if(t[i].get_id()==ii){ cout<<"此教师原信息:"<<endl;t[i].print();k=i;}cout<<"请输入此教师新信息:"<<endl;cout<<"编号:";while(1){ if (cin >> aa) break;else{ cout<<"编号应为数字,请重新输入:"<<endl;cin.clear();cin.ignore(); }}cout<<"姓名:";while(1){ cin>>na;for(j=0;j<11;j++){ if( ('!'<=na[j]&&na[j]<='@')||('['<=na[j]&&na[j]<='`' )||'{'<=na[j]&&na[j]<='~' )nn[j]=0;elsenn[j]=1; }if(nn[0]*nn[1]*nn[2]*nn[3]*nn[4]*nn[5]*nn[6]*nn[7] *nn[8]*nn[9]*nn[10]==1) break;else{ cout<<"姓名应为字母,请重新输入:"<<endl;"<<endl;cin.clear();cin.ignore();} }cout<<"工作量:";while(1){ if (cin >> bb) break;else{ cout<<"工作量应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }t[k].set_teacher(na,aa,bb);fstream teachers("d:\\teachers.txt",ios::out);teachers<<"姓名"<<setw(20)<<"编号"<<setw(20)<<"工作量"<<endl;for(j=0;j<n;j++){ if(j==k)teachers<<na<<setw(20)<<aa<<setw(20)<<bb<<endl;elseteachers<<t[j].get_name()<<setw(20)<<t[j].get_id()<< setw(20)<<t[j].get_work_load()<<endl;}teachers.close();}void change_course(course *c,int m) //修改课程信息{ int i,aa,bb,cc,dd,k,j,ii;char na[11]; char nn[11];cout<<"请输入要修改课程编号:";cin>>ii;for(i=0;i<m;i++)if(c[i].get_course_id()==ii){ cout<<"此课程原信息:"<<endl;c[i].print();k=i; }cout<<"请输入此课程新信息:"<<endl;cout<<"课程号:";while(1) {if (cin >>aa) break;else{ cout<<"课程号应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"课程名:";while(1){ cin>>na;for(j=0;j<11;j++){ if ( ('!'<=na[j]&&na[j]<='@')||('['<=na[j]&&na[ j]<='`')||'{'<=na[j]&&na[j]<='~' )nn[j]=0;elsenn[j]=1; }if(nn[0]*nn[1]*nn[2]*nn[3]*nn[4]*nn[5]*nn[6]*nn[7]*n n[8]*nn[9]*nn[10]==1) break;else{ cout<<"课程名应为字母,请重新输入:"<<endl;cin.clear();cin.ignore(); } }cout<<"周学时:";while(1){ if (cin >> bb ) break;else{ cout<<"周学时应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"总学时:";while(1){ if (cin >> cc ) break;else{ cout<<"总学时应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }cout<<"优先级:";while(1){ if (cin >> dd) break;else{cout<<"优先级应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }c[k].set_course(na,aa,bb,cc,dd);fstream courses("d:\\courses.txt",ios::out);courses<<"课程名"<<setw(10)<<"课程号"<<setw(10)<<"周学时"<<setw(10)<<"总学时"<<setw(10)<<"优先级"<<endl;for(j=0;j<m;j++){ if(j==k)courses<<na<<setw(10)<<aa<<setw(10)<<bb<<setw(10)<<cc<<s etw(10)<<dd<<endl;elsecourses<<c[j].get_course_name()<<setw(10)<<c[j].get_cour se_id()<<setw(10)<<c[j].get_week_hour()<<setw(10)<<c[j]. get_total_hour()<<setw(10)<<c[j].get_N()<<endl;}courses.close();}void change_num(teacher *t,course *c,int **num,int n,int m){ int ii,jj,i,j,k,nn,a1,b1,c1;cout<<"请输入要修改的教师的编号:";while(1){if (cin >> ii) break;else{ cout<<"满意度应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }for(i=0;i<n;i++){ if(t[i].get_id()==ii) a1=i; }cout<<"请输入要修改的课程的编号:";while(1){ if (cin >> jj) break;else{ cout<<"满意度应为数字,请重新输入:"<<endl;cin.clear();cin.ignore(); }}for(i=0;i<m;i++){ if(c[i].get_course_id()==jj) b1=i; } cout<<"请输入要修改的满意度:";while(1){ if (cin >> nn) break;else{ cout<<"满意度应为数字,请重新输入:"<<endl;cin.clear();cin.ignore();} }fstream nums("d:\\hope.txt",ios::out); nums<<setw(4)<<"满意度"<<setw(6);for(k=0;k<m;k++){ nums<<"第"<<k+1<<"门课程"<<setw(5); } nums<<endl;for(i=0;i<n;i++){ //cout<<"第"<<i+1<<"位老师对第"<<j+1<<"门课程的满意度"<<endl;//cin>>nu;if(i==a1&&j==b1){nums<<nn<<setw(13);num[a1][b1]=nn;}else{ c1=num[i][j];nums<<c1<<setw(13);} }nums<<endl; }nums.close();}五、测试数据及结果六、总结1、通过这次创新实践,锻炼了动手能力,同时也让我们把理论与实践结合起来对以后的学习及工作都有很大的帮助。