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