学生学习成绩管理程序课程设计报告.docx
- 文档编号:27605665
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:25
- 大小:189.08KB
学生学习成绩管理程序课程设计报告.docx
《学生学习成绩管理程序课程设计报告.docx》由会员分享,可在线阅读,更多相关《学生学习成绩管理程序课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。
学生学习成绩管理程序课程设计报告
课程设计
学生学习成绩管理系统
自动化11-5班
2013年11月8日
课程设计任务书
设计
题目
学生学习成绩管理系统
成绩
主
要
内
容
以VisualC++为开发平台,完成综合应用程序的设计,使学生掌握面向对象程序设计的方法。
通过课程设计的教学过程,使学生掌握运用VisualC++设计应用程序的方法及步骤、获得软件设计的初步锻炼。
为今后实际工作中运用计算机解决实际问题打下良好的基础。
以设计一个学生学习成绩管理为题,内容涉及面向对象应用程序设计的各个方面,具体包括:
VisualC++开发控制台应用程序的方法;控制台窗口的界面设计方法;以类、类的继承与派生、运算符重载等面向对象的知识解决实际问题的方法以及运用文件流实现数据的保存和提取等。
完成用文件和类的方式管理学生成绩数据;能进行数据记录的增加、删除、查找、排序及修改等功能;完成应用程序的调试、编译并运行。
按时进行设计的考核验收,打印课程设计报告及设计材料的整理、上交。
指
导
教
师
意
见
签名:
20年月日
课程设计报告
一.设计任务
以VisualC++为开发平台,运用VisualC++开发控制台应用程序的方法、控制台窗口的界面设计方法、类及类的继承与派生、运算符重载等面向对象的知识,设计一个学生学习成绩管理程序;用文件和类的方式管理学生成绩数据;能进行成绩数据记录的增加、删除、查找、排序及显示。
二.具体设计
1.设计思想
1)程序结构
如下图所示。
2)数据结构
程序使用一维数组作为数据结构,数组元素是自定义类,类的数据成员包括:
charstrName[20],存储姓名;charstrID[20],存储学号;floatfScore[3],存储三门课成绩;floatfAve,存储平均成绩。
如下图所示。
3)主要算法思想
(1)ListAllDataRecs()显示所有学生成绩的算法
①显示表头;
②将存储学生成绩数据的数组m_stuData[]的下表标示变量i初始化为0;
③调用m_stuData[]的第i个元素的成员函数print()显示该学生的数据记录;
④如果已经显示满一屏,等待;提示按任意键清屏,重新显示表头;
⑤i加1;
⑥重复③、④、⑤步,直到i的值与当前学生数m_nStuNum的值相等。
⑦等待,提示按任意键返回
(2)InputStuRec(CStudentData&stu)输入学生数据记录的算法
①显示输入窗口
②输入学生数据
③在已有记录中查找刚输入的学号
④如果不存在,则增加刚输入的新纪录
⑤否则,放弃刚输入的数据,不增加记录
(3)DeleteStuRec()删除学生数据记录的算法
①显示输入学号的窗口
②输入学号
③在已有记录中查找刚输入的学号
④如果不存在,给出提示,终止程序
⑤否则,若学号位于m_stuData[]的第i个元素,则依次将i后的记录替换其前一条记录,直到第m_nStuNum-1条记录。
⑥将学生数m_nStuNum减去1.
(4)SortStuRec()学生数据记录排序的算法
①将变量i初始化为0;
②将m_stuData[]的第i个元素的平均成绩与其后面的所有元素的平均成绩进行比较,遇到较大的就将两个元素的数据互换,最终第i个元素的平均成绩大于或等于其后面的所有元素的平均成绩;
③将i加1;
④重复②、③步,直到i的值与当前学生数m_nStuNum的值相等。
(5)FindStuRec()学生数据记录查找的算法
①显示输入学号的窗口
②输入学号
③在已有记录中查找刚输入的学号
④如果不存在,给出提示,终止程序
⑤否则,显示找到的学生数据记录。
2.设计表示
类名
作用
数据成员及作用
成员函数及功能
CstudentData
学生成绩数据的存储、显示、平均成绩计算、赋值。
charstrName[20]存储姓名
Print()显示成绩数据
charstrID[20]存储学号
CalAverage()计算平均值
floatfScore[3]存储三门课成绩
CStudentData&operator=(CStudentData&stu)赋值运算符重载
floatfAve存储平均成绩
CStudent
学生数据的存储,当前学生数的存储,学生成绩的输入、删除、显示、查找。
CStudentDatam_stuData[100];存储100名学生数据
InputStuRec(CStudentData&stu)输入学生成绩数据
DeleteStuRec()删除学生成绩数据
SortStuRec()对学生成绩排序
intm_nStuNum存储当前学生数
DispListHead(intnRow=0)显示学生成绩表头
ListAllDataRecs()显示所有学生成绩
FindStuRec()查找并显示学生成绩
3.实现注释
按照任务要求,以VisualC++为开发平台,运用VisualC++开发控制台应用程序的方法、控制台窗口的界面设计方法、类及类的继承与派生、运算符重载等面向对象的知识,开发了学生学习成绩管理程序,用类的方式管理学生成绩数据;能进行数据记录的增加、删除、查找、排序及显示。
设计后期,不断对程序进行优化,对各项操作的成功与失败都以窗口形式显示了提示信息,使操作界面更加友好
遗憾的是,由于文件操作知识的欠缺,没能实现用文件的方式管理学生成绩数据。
4.详细设计
主要算法的框架及实现此算法的成员函数接口如下图所示。
三.调试及测试
1.调试过程中遇到的问题及解决办法
在增加学生数据记录时,能正确打开输入窗口,输入数据后,通过测试,也执行了向数组m_stuData的第m_nStuNum个元素,拷贝数据的程序,但执行显示所有记录的功能时,却看不到刚刚添加的记录。
起初挺疑惑,明明添加了3条记录,为什么只显示两条呢,单独编程显示第三条记录,数据确实正确。
又对显示记录的循环控制变量进行追踪,发现第三条记录没显示就退出了循环,再看循环条件i 有了这个教训,在编写删除记录程序时,就对当前学生数做了正确处理。 2.设计和编码分析及改进设想 课程设计上交后,又对以下的记录添加代码作了仔细分析。 boolCStudent: : InputStuRec(CStudentData&stu){ boolbRes=false; char*str[5]={"Name: ","StudentID: ","Score1: ","Score2: ","Score3: "}; bRes=_InputMultiBox(str,0,0,20,str,5); if(strcmp(str[1],"")==0){ _MessageBox("Warning","StudentIDisempty,failedtoadd! ",2); bRes=false; } if(bRes){ for(inti=0;i if(strcmp(str[1],m_stuData[i].strID)==0)break;; if(i==m_nStuNum) { strncpy(stu.strName,str[0],20); strncpy(stu.strID,str[1],20); for(inti=0;i<3;i++) stu.fScore[i]=(float)atof(str[i+2]); stu.CalAverage(); _MessageBox("prompt","Recordaddedsuccessfully! ",0); } else { _MessageBox("Warning","StudentIDalreadyexists,failedtoadd! ",2); bRes=false; } } returnbRes; } 应该说,对于输入界面的设计还是比较满意,对学号这个关键字也作了非空和不允许重复的限制。 但在细节上,还有很多地方需要优化,比如,姓名应限制非空,三个成绩输入框中输入的内容应进行检测,不能包含除小数点外的非数字字符,成绩应限制在某个范围内等等。 3.测试数据集 Name studentID Score1 Score2 Score3 1 1 1 1 1 2 22 23 24 2 2 2 2 3 1 4 4 4 4 4 aa aa aa 5 5 23aaa 44bbb 33 4.经验和体会 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 面向对象使编程与实际的世界更加接近,所有的对象被赋予属性和方法,结果编程就更加富有人性化。 封装将对象有关的数据和行为封装成整体来处理,使得对象外部不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。 面向对象编程代码重用率高,容易扩展,在大框架不变的情况下很容易就开发出适合自己的功能,实现简单,可有效地减少程序的维护工作量,软件开发效率高。 四.使用说明 1.启动程序 在VisualC++开发平台上打开源程序student.cpp,编译并运行,打开如下图所示的程序菜单。 2.菜单选择 在程序菜单窗口中,按上下箭头键,移动黑色光条至要选择的功能,按回车键运行该功能。 3.添加记录 在程序菜单窗口中,按上下箭头键,移动黑色光条至“Addastudentdatarecord”,按回车键打开如下所示的输入界面。 向name框中输入姓名,不超过20字符;向StudentID框中输入学号,不超过20字符;分别向Score1、Score2、Score3框中输入三门课的成绩,可以是整数或小数,不要超过100,不能输入负数。 如果记录添加成功,则显示如下的提示框。 如果输入的学号已经存在,则显示如下的警告框。 4.删除记录 在程序菜单窗口中选择“Deleteastudentdatarecord”功能,按回车键打开如下所示的学号输入界面。 输入要删除的学号,按回车键,如果学号存在,则显示如下图所示的成功删除提示窗口。 如果学号不存在,则显示如下图所示的学号不存在提示窗口。 5.记录排序 在程序菜单窗口中选择“Sortalldatarecords”功能,按回车键开始按平均成绩由大到小排序,排序完成后,显示如下提示。 6.显示所有记录 在程序菜单窗口中选择“Listalldatarecords”功能,按回车键显示所有学生的成绩,如下图所示。 7.查询记录 在程序菜单窗口中选择“Findastudentdatarecord”功能,按回车键打开如下所示的学号输入界面。 输入要查询的学号,按回车键,如果学号存在,则显示找到的学生成绩,如下图所示。 如果学号不存在,则显示如下图所示的学号不存在提示窗口。 8.退出程序 在程序菜单窗口中选择“Exit”功能,按回车键,退出程序。 五.运行实例 图1程序菜单 图2学生数据输入窗口 图3学号重复警告窗口 图4删除、查询功能的学号输入窗口 图5记录排序完成提示窗口 图6学生成绩显示列表 六.设计小结 经过几天的努力,终于将学生学习成绩管理程序设计完成,通过课程设计,巩固了所学知识,锻炼了动手能力,并有些许感悟,感觉学习编程最好的方法之一就是阅读大量的源代码,针对问题学知识;要把课本上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码,不断实践会使自己熟能生巧;要把在课本中看到的有意义的例子进行扩充,在扩充过程中会促使自己不断应用新知识,积累新的工作经验;要经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;每学到一个难点的时候,尝试对别人讲解这个知识点并让他理解,如果你能讲清楚说明你真的理解了;我认为学习编程的秘诀是: 编程,编程,再编程。 课程设计基本完成了要求的功能,但在细节上,还有很多地方需要优化,比如,在数据输入模块,姓名应限制非空,三个成绩输入框中输入的内容应进行检测,不能包含除小数点外的非数字字符,成绩应限制在某个范围内等等。 另外,由于对文件操作编程不熟,没能实现用文件管理学生成绩数据,目前设计的程序还不能永久保留输入的数据。 以后,打算进一步学习相关编程知识,对程序进行改进、完善,使其更加符合实际需要。 附录 主要源程序清单: #include #include #include #include #include #include"console.h" classCStudentData { public: charstrName[20];//姓名 charstrID[20];//学号 floatfScore[3];//三门课成绩 floatfAve;//平均分 voidPrint(void)//输出 { cout.setf(ios: : left); cout< cout.precision(5); for(inti=0;i<3;i++) cout< cout< cout.flush(); } voidCalAverage(void) { floatsum=0.0; for(inti=0;i<3;i++)sum+=fScore[i]; fAve=(float)(sum/3.0); } CStudentData&operator=(CStudentData&stu)//赋值运算符重载 { strncpy(strName,stu.strName,20); strncpy(strID,stu.strID,20); for(inti=0;i<3;i++)fScore[i]=stu.fScore[i]; fAve=stu.fAve; return*this; } }; classCStudent: publicCConUI { public: boolInputStuRec(CStudentData&stu); boolDeleteStuRec(void); voidSortStuRec(void); voidDispListHead(intnRow=0); voidListAllDataRecs(void); voidFindStuRec(void); CStudent(); CStudentDatam_stuData[100]; intm_nStuNum; }; voidDoAdd(void); voidDoDelete(void); voidDoSort(void); voidDoList(void); voidDoFind(void); CStudenttheStu; voidmain() { char*strItem[11]={"LoadDatafromthefile", "Writetothefile","-","Addastudentdatarecord", "Deleteastudentdatarecord","Sortalldatarecords","-", "Listalldatarecords","Findastudentdatarecord","-","Exit" }; theStu._SetOptionsTitle("MainMenu"); intnIndex; for(;;) { theStu._ClearWindow(); nIndex=theStu._GetOptions(strItem,0,0,11); switch(nIndex) { case0: //LoadDatafromthefile break; case1: //Writetothefile break; case2: //Addastudentdatarecord DoAdd(); break; case3: //Deleteastudentdatarecord DoDelete(); break; case4: //Sortalldatarecords DoSort(); break; case5: //Listalldatarecords DoList(); break; case6: //Findastudentdatarecord DoFind(); break; case7: //Exit return; } } } voidDoAdd(void) { CStudentDatastu; if(theStu.InputStuRec(stu)){ theStu.m_stuData[theStu.m_nStuNum]=stu; theStu.m_nStuNum++; } } voidDoDelete(void) { if(theStu.DeleteStuRec())theStu.m_nStuNum--; } voidDoSort(void) { theStu.SortStuRec(); } voidDoList(void) { theStu.ListAllDataRecs(); } voidDoFind(void) { theStu.FindStuRec(); } //类CStudent的实现代码 CStudent: : CStudent() : m_nStuNum(0) { } voidCStudent: : ListAllDataRecs() { intnSizeX,nSizeY; _GetConwinSize(&nSizeX,&nSizeY);//获得控制台窗口的大小 _ClearWindow();//清屏 intposX=0,posY=1,temp; DispListHead();//显示列表头 _SetCursorPos(posX,posY); for(inti=0;i m_stuData[i].Print(); _GetCursorPos(&temp,&posY); if(posY>(nSizeY-2)){ cout<<"\tPressanykeytocontinue..."; cout.flush(); _getch(); _ClearWindow(); DispListHead(); posY=1; _SetCursorPos(posX,posY); } } cout<<"TotalRecordsis: "< cout<<"Pressanykeytocontinue..."< cout.flush(); _getch(); } voidCStudent: : DispListHead(intnRow) { intnSizeX,nSizeY; _GetConwinSize(&nSizeX,&nSizeY);//获得控制台窗口的大小 _SaveSettings();//保存当前的设置 _SetBackColor(3);//背景色为青色 _SetForeColor(15);//文本色为白色 _FillBox(0,nRow,nSizeX,1,false);//画背景水平条 _SetCursorPos(0,nRow); cout.setf(ios: : left); cout< cout< cout<<"Average"< cout.flush(); _LoadSettings();//恢复 } boolCStudent: : InputStuRec(CStudentData&stu) { boolbRes=false; char*str[5]={"Name: ","StudentID: ","Score1: ","Score2: ","Score3: "}; bRes=_InputMultiBox(str,0,0,20,str,5); if(strcmp(str[1],"")==0){ _MessageBox("Warning","StudentIDisempty,failedtoadd! ",2); bRes=false; } if(bRes){ for(inti=0;i if(strcmp(str[1],m_stuData[i].strID)==0)break;; if(i==m_nStuNum){ strncpy(stu.strName,str[0],20); strncpy(stu.strID,str[1],20); for(inti=0;i<3;i++) stu.fScore[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 学习成绩 管理程序 课程设计 报告