list:
:
iteratorp1;
for(p1=m_AllInformation.begin();p1!
=m_AllInformation.end();++p1)
{
writeFile<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)<<"";
writeFile<m_Grade.size()<<"";
list:
:
iteratorp2;
list:
:
iteratorp3;
for(p2=p1->m_Lessen.begin();p2!
=p1->m_Lessen.end();++p2)
{
writeFile<m_Lessen.GetBuffer(0)<<""<m_LessenTime.GetBuffer(0)<<"";
for(p3=p1->m_Grade.begin();p3!
=p1->m_Grade.end();++p3)
{
if(p3->m_Lessen==p2->m_Lessen)
{
writeFile<m_Grade.GetBuffer(0)<<"";
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++高级语言程序设计,人民邮电出版社,主编:
徐惠民