《C++面向对象程序设计导论》-从抽象到编程 课件 08 课程成绩管理应用案例_第1页
《C++面向对象程序设计导论》-从抽象到编程 课件 08 课程成绩管理应用案例_第2页
《C++面向对象程序设计导论》-从抽象到编程 课件 08 课程成绩管理应用案例_第3页
《C++面向对象程序设计导论》-从抽象到编程 课件 08 课程成绩管理应用案例_第4页
《C++面向对象程序设计导论》-从抽象到编程 课件 08 课程成绩管理应用案例_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程成绩管理(分析设计)《C++面向对象程序设计导论:从抽象到编程》章节的内容目录8课程成绩管理应用案例(1)8.2教师录入成绩的视图8.3属性的抽象和关联的表示8.2教师录入成绩的视图8.1场景分析本节学习目标能够综合运用本书中的知识分析设计一个实际应用软件能够综合运用面向对象知识解释分析设计的步骤及任务能够针对每个步骤选择适当的UML工具来表达分析设计的过程及成果8.1场景分析课程成绩管理系统的相关人员及其期望教师期望录入成绩学生期望查询成绩教学管理教师期望对成绩进行统计分析,以评价教师的教学效果和学生的学习效果。教师、学生和教学管理教师在处理课程成绩过程中,还要从教务系统中获取教师、学生和课程,以及课程安排等基础数据

管理课程成绩的过程中,主要涉及教师、学生和教学管理教师,每类人员对课程成绩管理系统有不同的期望。

从这些期望中获取系统的需求,推导出系统的功能8.1场景分析

分析课程的组织实施场景,可发现学生、教师、教学管理教师、教学班、课程、课程成绩、任课教师、教授课程、成绩表、修读学生、考试、考试成绩、选课、及格、不及格、录入、查询等概念。排除不相关的概念合并相同的概念删除重复术语找到课程成绩管理中涉及的主要概念及其相互关系学校以教学班的形式组织课程教学每个教学班讲授一门课程,安排一名教师授课,这名教师称为任课教师(或主讲教师)。每个教学班有多个学生听课,这些学生称为修读学生。课程教学结束后,每名任课教师给本教学班中的每名修读学生评定一个课程成绩,形成这个教学班的成绩表,并录入到课程成绩管理系统。每名学生能够查询所有已修读课程的成绩,并形成自己的课程成绩表。教学管理教师也是教师,每名教学管理教师能够查询每个教学班的任课教师和教授的课程,也能够进行统计分析,评价学生的学习效果和教师的教学效果。8.1场景分析课程成绩管理中涉及的主要概念(教学班、教师、课程、学生、课程成绩、教学管理教师)及其相互关系。多个教学班对应一门课程8.2教师录入成绩的视图教师使用课程成绩管理系统的目的是录入成绩,主要关心的是课程成绩、学生及教学班。从教师的角度调整课程成绩管理的关系视图。去掉涉及不到的事物按照与录入成绩的紧密程度进行调整8.2教师录入成绩的视图将视图中的概念视为“类”,将概念的外延包含的事物视为类的对象Teacher类GradeOfCourse类Student类Course类TeachingClass类8.3属性的抽象和关联的表示将概念的内涵抽象出属性,本案例可使用前人在长期教学组织管理的过程总结抽象的属性。

其中“编号”类属性(学号、教师编号、教学班编号、课程编号)叫标识属性,其作用为:属性值用于唯一标识对象使用这些属性表示类之间的关联8.3属性的抽象和关联的表示对象的标识和关联的实现将教师录入成绩视图进行调整,加入类属性,到学生和教师的聚合关联调整为一般关联(它们是使用标识属性来实现关联),加入ManagerOfGrade类用来管理教学班。8.3属性的抽象和关联的表示对象属性course表示到Course类的多对一聚合关联容器属性gradeTbl表示到GradeOfCourse类的一对多组合关联标识属性studentID表示到Student类的一对一一般关联容器属性studentTbl表示到Student类的多对多一般关联标识属性teacherNo表示到Teacher类的多对一一般关联(分析设计一般采用自顶向下的顺序)练习场景分析使用用例图分析相关人员及其根本期望使用类图分析其中的主要事物及其关系教师录入成绩的视图涉及到的部分事物及其关系属性的抽象和关联的表示使用类的属性描述事物(设计)使用类的属性表示事物的关系(设计)按照如下的步骤,围绕用例“教师录入成绩”重新做分析设计围绕用例“学生查询成绩”重新做分析设计总结及进一步学习思维:概念抽象分析设计中的要素过程:分析设计的步骤及任务方法:每个步骤中所采用的方法工具:每个步骤中所选用的工具(图)8.4-9课程成绩管理(编码实现)进一步学习场景分析使用用例图分析相关人员及其根本期望使用类图分析其中的主要事物及其关系教师录入成绩的视图涉及到的部分事物及其关系属性的抽象和关联的表示使用类的属性描述事物(设计)使用类的属性表示事物的关系(设计)章节的内容目录8.1场景分析第8章课程成绩管理(编码实现)8.4-8.5相关关联的逻辑实现8.6录入成绩的实现8.7学生查询成绩的实现8.8进一步努力方向8.4多对一关联的逻辑实现8.5一对多关联的逻辑实现8.6录入成绩的实现8.7学生查询成绩8.8进一步努力方向8.9程序员成才之路学习目标能够综合运用本书中的编程技术设计实现方案能够使用C++语言编码实现所设计的实现方案能够综合运用本书中的编程知识解释实现方案及其编程方法8.4多对一关联的逻辑实现一般应按照与箭头相反的方向编写类的代码,并实现从这个类发出的关联。先编写Teacher、Course和Student三个类,再依次编写GradeOfCourse、TeachingClass,最后编写ManagerOfGrade(编码实现按照自底向上的顺序)。8.4多对一关联的逻辑实现使用标识属性编码实现多对一和一对一关联课程成绩GradeOfCourse的职责负责管理成绩grade负责维护到一个学生Student对象的连接8.4多对一关联的逻辑实现/*****使用成员函数访问标识属性****/intStudentBase::getStudentID(){returnstudentID;}voidStudentBase::setStudentID(int

newStudentID){ studentID=newStudentID;}/*****重载比较运算:用于排序****/boolStudentBase::operator==(constStudentBase&b)const{returnstudentID==b.studentID;}boolStudentBase::operator>(constStudentBase&b)const{returnstudentID>b.studentID;}boolStudentBase::operator<(constStudentBase&b)const{returnstudentID<b.studentID;}/*****重载类型转换int:用于按studentID查找****/StudentBase::operator

int(){ returnstudentID;}【例8.1】

学生StudentBase中排序和查找所需的运算和成员函数8.4多对一关联的逻辑实现#include

<algorithm>//Forsort()//省略后面的头文件

/*****使用成员函数访问属性****/floatGradeOfCourse::getGrade(void){returngrade;}voidGradeOfCourse::setGrade(float

newGrade){//增加检验功能

if(newGrade>100||newGrade<0){ grade=-1; cerr<<"成绩超出范围:"<<newGrade<<endl; }

else grade=newGrade;}StudentGradeOfCourse::getStudent(vector<Student>&StudentTbl){

vector<Student>::iteratorit=find(begin(StudentTbl),end(StudentTbl),studentID);

if(it==StudentTbl.end()){ cerr<<"没有连接到学生,创建失败!!:"<<studentID<<endl; Student*p=NULL;

return(*p); }

else

return*it;}【例8.2】课程成绩GradeOfCourse中存取连接的学生对象8.4多对一关联的逻辑实现课程成绩GradeOfCourse类的成员函数:setStudentintGradeOfCourse::setStudent(intnewStudentID,vector<Student>&StudentTbl){ vector<Student>::iteratorit=find(begin(StudentTbl),end(StudentTbl),newStudentID);

if(it==StudentTbl.end()){ studentID=0;//没有找到学生 cerr<<"没有连接到学生,创建失败!!"<<newStudentID<<endl; }

else studentID=newStudentID;

return

studentID}intGradeOfCourse::setStudent(Student&newStudent,vector<Student>&StudentTbl){ vector<Student>::iteratorit=find(begin(StudentTbl),end(StudentTbl),newStudent.getStudentID());

if(it==StudentTbl.end()){ cerr<<"没有找到学生:"<<newStudent.getStudentID()<<endl; studentID=0; }

else studentID=newStudent.getStudentID();

return

studentID}8.4多对一关联的逻辑实现#include

<algorithm>

//Forsort()#include

<functional>

//Forgreater<int>()//省略后面的头文件

voidmain(){ vector<Student>st;

intcnt=readData(st); cout<<"成功读取"<<cnt<<"个学生的信息"<<endl;

cout<<"对学生信息按学号降序排序"<<endl; sort(st.begin(),st.end(),greater<Student>());

GradeOfCoursegc1,gc2; cout<<endl<<"创建GradeOfCourse对象及其连接"<<endl; gc1.setStudent(st[0],st); gc1.setGrade(67); cout<<"创建对象:"<<gc1<<endl;

cout<<"取出连接的Student对象"<<endl; Students1=gc1.getStudent(st);

if(NULL==&s1)//判断是否连接到一个Student对象 cout<<"没有连接到学生!!"<<endl;

else cout<<s1<<endl;

cout<<"创建GradeOfCourse对象及其连接"<<endl; Students2; s2.setStudentID(123); gc2.setStudent(s2,st);}读入学号错误!成功读取33个学生的信息对学生信息按学号降序排序

创建GradeOfCourse对象及其连接创建对象:20215967

取出连接的Student对象202159文杰

创建GradeOfCourse对象及其连接没有找到学生:123

【例8.4】

教学班TeachingClass中维护课程成绩表的主要代码8.5一对多关联的逻辑实现使用容器存储管理连接的对象,编程实现多对多和一对多关联选择list存储管理GradeOfCourse对象选择vector存储管理Student对象8.5一对多关联的逻辑实现【例8.4】教学班TeachingClass中维护课程成绩表的主要代码TeachingClass::TeachingClass(vector<Student>&st):gradeTbl(0),course(){ studentTbl=st;}intTeachingClass::insertGrade(intstudentID,floatgrade){ GradeOfCoursegc;

if(gc.setStudent(studentID,*studentTbl))

return1;

else

if(gc.setGrade(grade))

return-1;

else{ gradeTbl.push_back(gc); gradeTbl.sort();

return0; }}intTeachingClass::modifyGrade(intstudentID,floatgrade){ deleteGrade(studentID);

returninsertGrade(studentID,grade);}intTeachingClass::deleteGrade(intstudentID){

intrt=0; list<GradeOfCourse>::iteratorit=find(gradeTbl.begin(),gradeTbl.end(),studentID);

if(!(NULL==*it)){ gradeTbl.erase(it); rt=1; }

returnrt;}

list<GradeOfCourse>&TeachingClass::getGradeTbl(void){

returngradeTbl;}GradeOfCourseTeachingClass::findGradeByID(intstudentID){ list<GradeOfCourse>::iteratorit=find(gradeTbl.begin(),gradeTbl.end(),studentID);

if(NULL==*it)

return*it;

else{ GradeOfCourse*p=NULL;

return*p; }}8.5一对多关联的逻辑实现【例8.5】录入一个教学班的学生成绩voidmain(){ vector<Student>st;

intcnt=readData(st); cout<<"成功读取"<<cnt<<"个学生的信息"<<endl;

//cout<<"对学生信息按学号降序排序"<<endl; sort(st.begin(),st.end(),greater<Student>());

cout<<endl<<"录入5个学生成绩"<<endl; TeachingClasstc(st);

for(inti=0;i<5;i++) tc.insertGrade(st[i].getStudentID(),80+i*2);

cout<<"录入两个错误的成绩"<<endl; tc.insertGrade(st[6].getStudentID(),-10); tc.insertGrade(1234,60);

cout<<endl<<"删除一个学生的成绩"<<endl; tc.deleteGrade(st[3].getStudentID());

cout<<"教学班中的学生成绩"<<endl; cout<<tc;}读入学号错误!成功读取33个学生的信息

录入5个学生成绩录入两个错误的成绩成绩超出范围:-10没有连接到学生,创建失败!!1234

删除一个学生的成绩教学班中的学生成绩20210680202107822021088420211388

8.6录入成绩的实现分析教师录入成绩的典型场景,抽象出录入成绩的步骤及任务,设计出类的成员函数典型场景:教师使用课程成绩管理系统录入成绩时,会先选择一个教学班,然后再录入这个教学班的所有学生成绩。8.6录入成绩的实现使用时序图设计出类MangerOfGrade的成员函数根据时序图,编码实现类MangerOfGrade的成员函数,最后编写主程序装入教师、课程、教学班信息readTeacher、readCourse、readTeachingClass创建教学班createTeachingClass录入一个教学班学生成绩的任务使用TeachingClass类中增删改查的成员函数加入到教学班表addTeachingClass8.7学生查询成绩学生使用课程成绩管理系统查询成绩时,可在类ManagerOfGrade中定义一个成员函数findByStudent,使用该函数循环找到已修读的课程成绩,得到一个学生的所有课程成绩表,用vector容器来表示。8.7学生查询成绩【例8.8】学生查询成绩的主要代码//查询学生成绩vector<GradeOfStudent>ManagerOfGrade::findByStudent(int

id){

vector<GradeOfStudent>gsTbl;

for(list<TeachingClass>::iteratorit=TeachClsTbl.begin();it!=TeachClsTbl.end();it++){

GradeOfCoursegc=it->findGradeByID(id);

if(NULL!=gc){

GradeOfStudentgs; gs.grade=gc.getGrade(); gs.courseNo=it->getCourseNo(); gs.title=it->getTitle(); gsTbl.push_back(gs); } }

returngsTbl;}voidmain(){

ManagerOfGrademg; loadInitData(mg); editGrade(mg);

cout<<endl<<"学生:202106成绩表"<<endl;

vector<GradeOfStudent>gsTbl=mg.findByStudent(202106);

for(vector<GradeOfStudent>::iteratorit=gsTbl.begin();it!=gsTbl.end();it++) cout<<it->courseNo<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论