面向对象技术与C++课程设计任务书一.系统总体方案:某学校每位教师都有教学工作量,教师对他所希望讲授的课程表达为一个期望值,1,2…,n,其中1是最高的期望值。
课程也有优先级,1,2…,n,用来决定将课程分给教师的顺序,其中1是最高的优先级。
设计一个程序针对某些课程给某些教师进行排课。
要求:(一)程序运行时,用户输入教师信息(姓名、教师号、工作量)、课程信息(课程名、课程号、周学时、总学时、优先级),教师对所希望讲授课程的期望值以及教学工作量等相关信息,所有信息应保存在文件中。
(二)程序根据课程的优先级以及教师对课程的期望值进行排课。
最后输出排课情况,即某位老师上某门课程,以及某位老师的工作量。
(三)可以实现对文件的修改。
(四)可以在各个界面中实现退出以及进入的循环。
(五)可以退出本系统。
(六)程序应能实现对不少于20门课和10个教师的排课,并且使每个教师的满意度达到最大,不存在工作量不满的教师以及未分配的课等情况。
方法:为了公平起见,程序随机分配课程,如果10门课程都有优先级1,程序以随机的顺序将这些课程分给教师,如果10位教师对某门课程的期望值为1,程序应从10位教师中随机选择一个。
2.设计思路和主要步骤:我们使用面向对象程序设计方法的思路进行分析,得出了整个系统应该涉及三个类的信息和操作,分别是教师类,课程类,排课类。
各类信息以文件方式的储存以及实现各种功能和界面的实现是在main函数中体现。
(一)教师类 teacher:包括私有数据成员姓名 name,编号 id ,工作量work_load ,已有工作量 total(方便判断是否排满课)。
成员函数包括设置和得到私有成员值的成员函数与输出教师信息的成员函数。
(2)课程类 course:私有成员有课程名 course_name,课程号 course_id,周课时 week_hour,总课时 total_hour,优先度 N。
(3)由于考虑到这应该是一个完整的排系统,加上我们希望这个系统的界面能够做到清晰、明了,我们经讨论后决定采用一个总操作界面,一个分操作界面。
总操作界面应该包括(分别对应 1.输入教师信息 2.输入课程信息 3输入教师对课程期望度 4.排课 5.输出排课结果 6.显示操作菜单 7.输出教师文件信息 8.输出课程文件信息 9.输出教师期望度文件信息 10.修改文件信息 0.退出)修改文件信息界面中又因该包括 1.修改教师文件 2.修改课程文件 3.修改教师期望度信息 0.退出3.各功能模块与流程图:说明:以下是对应上面系统功能模块实图的系统流程图,因为制图的不便,故只将成功完成一次操作的流程给出,而“各个流程中中途如果输入了菜单中没有的项以及数据保存文件中没有的数据而被强制退出”的流程因为过于复杂(每步都要进行判断)而没有给出,实际情况读者朋友一试便知。
在此我们对此表示深深的歉意,我们以后一定会努力完善我们各方面的工作的。
各功能模块:(五)程序代码: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,int i,int w,int t,int n);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;}Arrange.h:class arrange{private:int x;int y;public:arrange(void){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,arrange *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]<='`')||'{'<=na me[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]<='`')||'{'<=na me[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 >> 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,arrange *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_load() )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){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;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].ge t_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]*nn[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<<setw(10)<<dd<< endl;elsecourses<<c[j].get_course_name()<<setw(10)<<c[j].get_course_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++){ nums<<"第"<<i+1<<"名老师"<<setw(3);for(j=0;j<m;j++){//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();}6.总结、心得与体会通过这次课题设计,我觉得做好一个程序,灵活运用是关键。