程序设计实践报告实验信息管理系统.docx
- 文档编号:8670148
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:187.39KB
程序设计实践报告实验信息管理系统.docx
《程序设计实践报告实验信息管理系统.docx》由会员分享,可在线阅读,更多相关《程序设计实践报告实验信息管理系统.docx(18页珍藏版)》请在冰豆网上搜索。
程序设计实践报告实验信息管理系统
程序设计实践
设
计
报
告
课题名称:
_学生信息管理系统_______
学生姓名:
__________________
班级:
_____________
班内序号:
____________________
学号:
____________
日期:
_2014年5月26日________
1.
课题概述
1.1课题目标和主要内容
基于对MFC应用程序编程原理的掌握,以及学生管理系统的基本构架,用其实现一个学生管理系统的简单基本功能,在第一次实验的基础上,对基于MFC原理的编程有更深一步的探究,熟悉掌握MFC编程的消息响应机制,独立完成程序的设计,更深一步理解和熟悉程序设计的思想。
实验的开发平台:
vs2010
1.2系统的主要功能
(1)在主对话框上进入三个子对话框
(2)在子对话框1上能够添加、删除、编辑和查询学生信息;
(3)在子对话框2上输入班号时能显示全班学生平均成绩并进行排名
(4)在子对话框3上能够增加、删除、编辑和查询学生的选课信息并录入成绩;
(5)在程序中实现text文件中数据的读取和写入
2.系统设计
2.1系统总体框架
设计思想:
1.
(1)MFC是用来编写Windows应用程序的C++类集,它具有以下特点
以层次结构组织
封装了大部分API函数
提供了图形环境下应用程序的框架
提供了创建应用程序的组件
提供大量的基类便于不同的应用环境进行扩充
允许自定义和扩展应用程序中的类
较好的移植性,可移植于众多的平台
很好地保持了程序的向下兼容性
(2)MFC程序中的窗口产生及运行流程
设计注册窗口类
产生窗口
显示窗口
更新窗口
消息循环
2.此次实验与基于MFC实验通讯录的思想相似,比较复杂的是工程内数据之间的传递,因此工程用了三个类分别存储学生,课程与成绩的相关信息,分别为:
学生类CStudent(姓名、学号、性别、班级、院系);
课程类CLesson(课程名称、课程开设时间);
成绩类CGrade(学号、课程名称、成绩)
最后定义了一个CAllInfor类存储所以学生信息并在此类中实现每个学生平均成绩的计算,解决了数据传递这一难点。
2.2系统详细设计
编程步骤:
(1)定义并初始化存储数据的三个类:
学生类CStudent(姓名、学号、性别、班级、院系);
课程类CLesson(课程名称、课程开设时间);
成绩类CGrade(学号、课程名称、成绩)
(2)建立主对话框
添加所需的控件:
列表控件,静态文本,动态文本等,定义相关变量及函数名,并实现相关函数,主要函数有:
CMyDlg:
:
OnStudent()调用子对话框1
CMyDlg:
:
OnClassInfor()调用子对话框2
CMyDlg:
:
OnClassGrade()调用子对话框3
CMyDlg:
:
OnOK()将工程中的数据写入text文件
(3)建立子对话框1
主要函数有:
CBStudentInfor:
:
OnInitDialog()实现数据的初始化并将输入的数据读取到列表控件
CBStudentInfor:
:
OnAdd()添加操作
CBStudentInfor:
:
OnClickStudentList(NMHDR*pNMHDR,LRESULT*pResult)选中列表中的某一行数据
CBStudentInfor:
:
OnEdit()编辑操作
CBStudentInfor:
:
OnDelete()删除操作
(4)建立子对话框2
主要函数:
CClassSort:
:
OnInitDialog()将数据显示到列表控件
CClassSort:
:
OnOK()查询功能
(5)建立子对话框3
主要函数:
CLessen_Grade:
:
OnAdd()添加操作
CLessen_Grade:
:
OnInitDialog()数据显示到列表控件
CLessen_Grade:
:
OnEdit()编辑操作
CLessen_Grade:
:
OnDelete2()删除操作
CLessen_Grade:
:
OnSearch()查询操作
程序流程图:
2.3关键算法分析
算法1:
readFile.open("test.txt",ios:
:
in);
算法功能:
从文本文件中读取相关信息到对话框
算法基本思想:
打开文件,按照顺序逐一读取
关键代码:
readFile.open("test.txt",ios:
:
in);//读文件
if(!
readFile.eof())
{
intStuCount,LessenCount,j,k;
readFile>>StuCount;
CAllInfor*p=newCAllInfor[StuCount];
for(k=0;k { m_AllInformation.push_back(p[k]); } list : iteratorp1; for(p1=m_AllInformation.begin();p1! =m_AllInformation.end();++p1) { stringSchoolId,Name,Sex,Class,College; readFile>>SchoolId>>Name>>Sex>>Class>>College; CStudentstudent(Name.c_str(),Sex.c_str(),Class.c_str(),SchoolId.c_str(),College.c_str()); p1->m_Stu=student; readFile>>LessenCount; for(j=0;j { stringLessen,LessenTime,grade; readFile>>Lessen>>LessenTime>>grade; CGradegra(SchoolId.c_str(),Lessen.c_str(),grade.c_str()); p1->m_Grade.push_back(gra); CLessenlessen(Lessen.c_str(),LessenTime.c_str()); p1->m_Lessen.push_back(lessen); } } delete[]p; } 算法2: voidCMyDlg: : OnOK() 算法功能: 将数据写入到文本文件 算法基本思想: 单击确定按钮后将数据按顺序逐一写入文件 关键代码: voidCMyDlg: : OnOK() { //TODO: Addextravalidationhere ofstreamwriteFile; writeFile.open("test.txt"); writeFile< list : iteratorp1; for(p1=m_AllInformation.begin();p1! =m_AllInformation.end();++p1) { writeFile< <<""< writeFile< list : iteratorp2; list : iteratorp3; for(p2=p1->m_Lessen.begin();p2! =p1->m_Lessen.end();++p2) { writeFile< for(p3=p1->m_Grade.begin();p3! =p1->m_Grade.end();++p3) { if(p3->m_Lessen==p2->m_Lessen) { writeFile< break; } } } } CDialog: : OnOK(); } 算法3: voidCBStudentInfor: : OnAdd() 算法功能: 实现数据的添加 算法基本思想: 输入的学号若不存在则进行其它数据输入,否则弹出数据存在窗口,最后单击添加按钮后将数据显示到列表控件 关键代码: voidCBStudentInfor: : OnAdd() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); list : iteratorp; booljudge=true; for(p=m_AllInformation.begin();p! =m_AllInformation.end();++p) { if(p->m_Stu.m_School_Id==m_SchoolId) { judge=false; } } if(judge) { CStudentStu(m_Name,m_Sex,m_Class,m_SchoolId,m_College); CAllInforobj(Stu); m_AllInformation.push_back(obj); for(inti=0;;i++) { if(m_list.GetItemText(i,0)=="") { intnRow=m_list.InsertItem(i,m_Name);//插入行 m_list.SetItemText(nRow,1,m_Sex);//设置数据 m_list.SetItemText(nRow,2,m_Class);//设置数据 m_list.SetItemText(nRow,3,m_SchoolId);//设置数据 m_list.SetItemText(nRow,4,m_College);//设置数据 break; } } } else { MessageBox("学号重复,请重新输入! "); } m_SchoolId=""; m_Sex=""; m_Name=""; m_College=""; m_Class=""; UpdateData(FALSE); } 算法4: voidCBStudentInfor: : OnEdit() 算法功能: 编辑修改学生信息 关键代码: voidCBStudentInfor: : OnEdit() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); list : iteratorp; CStringsname=m_list.GetItemText(m_SelectRow,0); for(p=m_AllInformation.begin();p! =m_AllInformation.end();++p) { if(p->m_Stu.m_Name==sname) { p->m_Stu.m_Name=m_Name; p->m_Stu.m_Sex=m_Sex; p->m_Stu.m_Class=m_Class; p->m_Stu.m_School_Id=m_SchoolId; p->m_Stu.m_College=m_College; break; } } for(intj=0;j<5;j++) { switch(j) { case0: m_list.SetItemText(m_SelectRow,0,m_Name); break; case1: m_list.SetItemText(m_SelectRow,1,m_Sex); break; case2: m_list.SetItemText(m_SelectRow,2,m_Class); break; case3: m_list.SetItemText(m_SelectRow,3,m_SchoolId);//设置数据 break; case4: m_list.SetItemText(m_SelectRow,4,m_College);//设置数据 break; } } m_SchoolId=""; m_Sex=""; m_Name=""; m_College=""; m_Class=""; UpdateData(FALSE); } 算法5: voidCBStudentInfor: : OnDelete() 算法功能: 删除学生信息 算法基本思想: 鼠标点击某行数据并再单击删除按钮时,信息被删除 关键代码: voidCBStudentInfor: : OnDelete() { //TODO: Addyourcontrolnotificationhandlercodehere CStringsname=m_list.GetItemText(m_SelectRow,0); list : iteratorp; for(p=m_AllInformation.begin();p! =m_AllInformation.end();++p) { if(p->m_Stu.m_Name==sname) { m_AllInformation.erase(p); break; } } m_list.DeleteItem(m_SelectRow); m_SchoolId=""; m_Sex=""; m_Name=""; m_College=""; m_Class=""; UpdateData(FALSE); } 算法6: voidCClassSort: : OnOK() 算法功能: 班级学生信息查询 算法基本思想: 当输入班级号时,列表中显示全班学生平均成绩并按名次排列 关键代码: voidCClassSort: : OnOK() { //TODO: Addextravalidationhere UpdateData(TRUE); inti,j; list : iteratorp; for(p=m_AllInformation.begin();p! =m_AllInformation.end();++p) { if(p->m_Stu.m_Class==m_Class_Num) { ClassSorttemp(p->m_Stu.m_Name,p->GetAveGrade()); Stu.push_back(temp); } } ClassSort*pSort=newClassSort[Stu.size()]; list : iteratorptr; for(i=0,ptr=Stu.begin();ptr! =Stu.end();++ptr,++i) { pSort[i]=*ptr; } InsertSort(pSort,Stu.size()); for(j=0;j { m_list.InsertItem(j,pSort[j].Name); CStringaveGrd,Amount; aveGrd.Format("%f",pSort[j].aveGrade); m_list.SetItemText(j,1,aveGrd); Amount.Format("%d",j+1); m_list.SetItemText(j,2,Amount); } } 算法7: voidCLessen_Grade: : OnSearch() 算法功能: 查询某学号学生的选课情况 算法基本思想: 输入某学生学号时,在列表中显示该学生所有的选课情况 关键代码: voidCLessen_Grade: : OnSearch() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); list : iteratorp1; inta; booljudge=true; for(p1=m_AllInformation.begin();p1! =m_AllInformation.end();++p1) { if(p1->m_Stu.m_School_Id==m_SchoolId) { judge=false; list : iteratorp2; for(p2=(p1->m_Grade).begin(),a=0;p2! =(p1->m_Grade).end();++p2,++a) { CStringli=p2->m_Lessen; intnRow=m_list.InsertItem(a,p2->m_Lessen);//插入行 m_list.SetItemText(nRow,2,p2->m_Grade);//设置数据 list : iteratorp3; for(p3=(p1->m_Lessen).begin();p3! =(p1->m_Lessen).end();++p3) { if(p2->m_Lessen==p3->m_Lessen) { m_list.SetItemText(a,1,p3->m_LessenTime); break; } } } } } if(judge) { MessageBox("没有此学号的学生,请重新输入! "); m_SchoolId=""; UpdateData(false); } } 3.程序运行结果 主对话框: 子对话框1: 子对话框2: 子对话框3: 4.总结 4.1课题的难点和关键点 难点: 本实验的难点为各对话框中数据的传递,其次学生平均成绩的计算并排名也是一难点 遇到的问题及解决方法: 遇到一些琐碎的问题比如说变量名未定义,不可用的标识符等通过相应方法比较容易解决,但工程中存在的一个不足是在修改学生相关信息时在列表中有显示被修改,但在调用写入文件函数后文件中的数据未被修改。 还遇到的问题是: 解决方法是将工程属性的启用浏览信息改为无后错误就解决了。 4.2本课题的评价 因为第一次实验做的是通讯录,所以相对于第一次实验来说对对话框的控件添加及消息响应机制比较熟悉,在结构布局上做起来更加得心应手,遇到一些简单的错误也知道该怎样解决,但是由于编程技巧掌握得不是很透彻,实验的相关功能代码语句只能通过查阅资料等方式来获得,因此函数实现的过程中常常遇到很多错误,耗时比较多,对程序设计只是有个设计框架该怎样依次去实现功能,这是完成实验中比较棘手的事。 其次程序的数据保存是在工程内建了一个文本文件,将数据存储到文本文件中,但是理论上数据的存储应该与数据库相连接,那样不会出现数据混乱等情况,期间也尝试过连接到数据库,查阅资料了解了方法并尝试后发现问题比较多,实现起来比较困难,于是便用了文本文件这一方法,下一步的改进是尝试将其连接到数据库,实现程序的完整性 4.3心得体会 通过本次实验,对MFC基于对话框的编程有了更加透彻的了解,掌握了主对话框与子对话框之间的调用,以及各对话框之间数据的传递方法,对MFC编程又有了更深一步的认识,因为这次试验和上次的通讯录实现比较相像,有了第一次实验的基础,所以不会像第一次一样无从下手,同时也认识到程序设计在生活中的无处不在,通过两次实验后在动手能力及算法思想上都有所提高,而且实验是在考试周期间,也是锻炼我们对时间的有效管理,两次实验以后,也算收获颇多吧! 5.参考文献 [1]C++高级语言程序设计,人民邮电出版社,主编: 徐惠民
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 实践 报告 实验 信息管理 系统