计算机程序设计综合实验报告.docx
《计算机程序设计综合实验报告.docx》由会员分享,可在线阅读,更多相关《计算机程序设计综合实验报告.docx(75页珍藏版)》请在冰点文库上搜索。
计算机程序设计综合实验报告
计算机程序设计综合实验报告
研究生管理系统设计
院系:
电控学院自动化系
班级:
自动化4班
姓名:
赵国宝
指导教师:
靳引利
2015年07月0日
摘要
通过这次计算机综合实验,要求学生掌握程序设计的思路,深入理解面向对象的思想方法,熟练掌握数据结构的基本内容,使用数据结构的算法解决应用问题,建立功能体系完善的视窗程序,掌握视窗程序的设计、编写、调试方法,使用文档/视窗,对话框,组件工具解决实际问题,通过视窗、文件的访问,记录过程数据,并对已经记录的数据进行再现和访问。
通过综合性的软件设计,经历需求分析、功能设计、算法设计、代码编写和调试、系统测试、软件安装运行、文档编写的全过程,建立软件工程的系统性概念,通过该实验,使学生掌握windows程序设计的基本方法。
掌握学籍管理的基本内容,熟练应用数据库技术和通用组件,实现研究生信息的增、删、改、查功能。
通过处理过程对计算机软件系统工作原理的进一步理解,促进对面向对象概念的系统理解以及面向对象方法的应用,为后续课程的学习和应用计算机技术解决专业学习中的程序设计问题奠定坚实的基础。
一、系统名称:
研究生管理系统设计
二、系统功能说明
1、研究生基本信息管理,可根据用户级别的不同设置登录账号和密码。
主要有研究生、导师、管理员、学校领导的登录。
2、一级菜单中包含教师管理、导师管理、课程管理、学籍管理等一级菜单。
当管理员登录进去时有教师管理、导师管理、课程管理、学籍管理等子菜单。
当学生进去时有查询个人、查询成绩、查询课表及修改密码。
当导师登录进去时有个人是信息查询、学生成绩查询、课表查询及密码修改。
当领导登录进去时主要是对学生成绩的相关操作。
3、导师管理二级菜单包括:
导师信息查询、增加、删除和导出导师信息库等功能。
导师信息包括姓名、性别、毕业院校、研究方向等相关信息。
导出信息的格式为excel文件。
4、学籍管理最少包括:
学生信息维护、学生信息查询、学生信息导出,导出文件格式同上。
5、成绩管理模块包括:
成绩维护、成绩查询、成绩导出,导出文件格式同上。
6、查询时支持多条件组合查询。
如查询导师的时候可以同时查询学院和职称。
7、以研究生主管领导身份登录,对成绩的分布情况进行分析。
比如查询某班级某科目的通过率及平均分。
8、以曲线图、饼图等方式展示查询结果。
三、系统设计
1、界面设计
2、数据库设计
数据库实现与应用程序实现是分离的,数据库的实现非常重要。
在研究生管理信息系统中,首先要创建学生管理信息系统数据库,然后在数据库中创建
需要的表和字段。
下面分别讲述本系统中数据库的设计。
本例采用Access数据库系统来进行数据库的实现。
(1)创建数据库
下面给出在Access中创建数据库的过程。
①运行Access应用程序,在“新建数据库”选项组中选取“空Access数据
库”单选,按钮,然后单击“确定”按钮。
②在“文件新建数据库”窗口指定数据库的存放位置与数据库文件名称,本
例为研究生信息管理系统.mdb,然后单击“创建”按钮。
注:
数据库的名字不能是system.mdb,否则会出错。
(2)创建表
下面给出在Access中创建表的过程。
①在创建数据库后进入主界面,单击“sys:
数据库”子窗口中的“设计”
按钮。
此时将会出出“表1:
表”窗口。
②在表的设计窗口“表1:
表”中按照下面属性图确定的数据库模型建立数
据字段,并指定字段的数据类型与相关属性。
③表中相关字段添加完后,我们还需要根据需要和逻辑分析为
数据库添加相应的约束:
如指定表的主键,外键约束,设定数据范围以及指
定初始,默认值等等,以确保数据操作的完整性与一致性。
3、算法设计
可以把整个系统划分为以下三个基本的功能模块:
登录模块算法如下
voidCGraduateManagementDlg:
:
OnEnter()
{UpdateData(true);
administrator.Open();
Teacher.Open();
Student.Open();
Leader.Open();
switch(i)
{
case0:
{Teacher.MoveFirst();
while(!
Teacher.IsEOF())
{
if(m_Password==Teacher.m_Password&&m_UserID==Teacher.m_Name)
{l=Teacher.m_Name;h=Teacher.m_Major;AfxMessageBox("登录成功");TecherDlg2;Dlg2.DoModal();break;}
else
{
Teacher.MoveNext();
if(Teacher.IsEOF())
{
AfxMessageBox("帐号或密码错误,请重新输入");}
}
}
}
case1:
{
if(m_Password==administrator.m_Password&&m_UserID==administrator.m_UserName)
{
AfxMessageBox("登录成功");Cnba1dlg;dlg.DoModal();}
//elseAfxMessageBox("密码错误");
break;
}
case2:
if(m_Password==Leader.m_Password&&m_UserID==Leader.m_Name)
{AfxMessageBox("登录成功");
LeaderGradedlg;
dlg.DoModal();
}
break;
case3:
{Student.MoveFirst();
while(!
Student.IsEOF())
{
if(m_UserID==Student.m_Name&&m_Password==Student.m_Password)
{j=Student.m_Number;f=Student.m_Major;AfxMessageBox("登录成功");StuMessageDlg2;Dlg2.DoModal();break;}
else
{
Student.MoveNext();
if(Student.IsEOF())
{AfxMessageBox("帐号或密码错误,请重新输入");}
}
}
}
}
administrator.Close();
Teacher.Close();
Student.Close();
Leader.Close();
//}
UpdateData(false);
}
学生信息管理模块:
学生可以进行的相关的操作,主要有:
登入系统:
输入姓名和密码,并选择用户为学生,点击登录,经系
统验证为合法用户后可进入系统查询并修改相关信息。
进入学生操作界面后,显示学生基本信息。
学生可以进行以下操作:
查看成绩:
显示学生成绩信息。
查看课表:
显示学生当前课表。
修改密码:
为了防止密码输入错误,在输入新密码时需要输入两次。
导师信息管理模块:
教师可以进行的相关操作,主要有:
登入系统,输入教师姓名和密码,并选择用户为导师,点击登录,经
系统验证为合法用户后可进入系统查询并修改相关信息。
进入教师操作界面后,显示教师基本信息。
教师可以进行以下操作:
查看所教课程信息:
教师可以查询所自己所教课程的上课时间,上
课地点等,以利于提前备课,并方便安排行程。
录入成绩:
点击录入成绩可以为学生录入成绩。
修改密码:
为了防止密码输入错误,在输入新密码时需要输入两次。
管理员模块:
系统管理员可以进行的相关操作,主要有:
登入系统,输入管理员姓名和密码,并选择用户为管理员,点击登录,经系统验证为合法用户后可进入系统查询并修改相关信息。
查询学籍信息:
管理员有权查询及导出学籍信息。
查询导师信息:
管理员有权查询及导出导师信息。
查询成绩信息:
管理员有权查询及导出成绩信息。
查询课程信息:
管理员有权查询及导出课程信息。
管理学籍信息:
管理员有权添加、修改以及删除一条学籍信息。
管理导师信息:
管理员有权添加、修改以及删除一条导师信息。
管理成绩信息:
管理员有权添加、修改以及删除一条成绩信息。
管理课程信息:
管理员有权添加、修改以及删除一条课程信息。
修改密码:
为了防止密码输入错误,在输入新密码时需要输入两次。
四、系统的流程图(不少于3幅图)
1、系统流程图
2、数据流程图
5、重点算法说明
voidCGraduateManagementDlg:
:
OnEnter()通过switch语句进行登录者的选择
{UpdateData(true);
administrator.Open();
Teacher.Open();
Student.Open();
Leader.Open();
switch(i)
{
case0:
{Teacher.MoveFirst();
while(!
Teacher.IsEOF())
{
if(m_Password==Teacher.m_Password&&m_UserID==Teacher.m_Name)
{l=Teacher.m_Name;h=Teacher.m_Major;AfxMessageBox("登录成功");TecherDlg2;Dlg2.DoModal();break;}
else
{
Teacher.MoveNext();
if(Teacher.IsEOF())
{
AfxMessageBox("帐号或密码错误,请重新输入");}
}
}
}
case1:
{
if(m_Password==administrator.m_Password&&m_UserID==administrator.m_UserName)
{
AfxMessageBox("登录成功");Cnba1dlg;dlg.DoModal();}
//elseAfxMessageBox("密码错误");
break;
}
case2:
if(m_Password==Leader.m_Password&&m_UserID==Leader.m_Name)
{AfxMessageBox("登录成功");
LeaderGradedlg;
dlg.DoModal();
}
break;
case3:
{Student.MoveFirst();
while(!
Student.IsEOF())
{
if(m_UserID==Student.m_Name&&m_Password==Student.m_Password)
{j=Student.m_Number;f=Student.m_Major;AfxMessageBox("登录成功");StuMessageDlg2;Dlg2.DoModal();break;}
else
{
Student.MoveNext();
if(Student.IsEOF())
{AfxMessageBox("帐号或密码错误,请重新输入");}
}
}
}
}
administrator.Close();
Teacher.Close();
Student.Close();
Leader.Close();
//}
UpdateData(false);
}
voidOutGradea:
:
OnBUTTONFind()在查找成绩时通过while循环对数据库进行遍历查找信息。
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
intk=0;
m_nLIST.DeleteAllItems();
switch(m)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
case1:
Grade.Open();
Grade.MoveFirst();
while(!
Grade.IsEOF())
{
if(m_Message==Grade.m_Class)
{
m_nLIST.InsertItem(k,Grade.m_StuNumber);
m_nLIST.SetItemText(k,1,Grade.m_Name);
m_nLIST.SetItemText(k,2,Grade.m_c__);
m_nLIST.SetItemText(k,3,Grade.m_chinese);
m_nLIST.SetItemText(k,4,Grade.m_english);
m_nLIST.SetItemText(k,5,Grade.m_math);
m_nLIST.SetItemText(k,6,Grade.m_music);
m_nLIST.SetItemText(k,7,Grade.m_pe);
m_nLIST.SetItemText(k,8,Grade.m_Class);
k++;
UpdateData(false);
}
Grade.MoveNext();
}
Grade.Close();break;
case3:
Grade.Open();
Grade.MoveFirst();
while(!
Grade.IsEOF())
{
if(m_Message==Grade.m_StuNumber)
{
m_nLIST.InsertItem(k,Grade.m_StuNumber);
m_nLIST.SetItemText(k,1,Grade.m_Name);
m_nLIST.SetItemText(k,2,Grade.m_c__);
m_nLIST.SetItemText(k,3,Grade.m_chinese);
m_nLIST.SetItemText(k,4,Grade.m_english);
m_nLIST.SetItemText(k,5,Grade.m_math);
m_nLIST.SetItemText(k,6,Grade.m_music);
m_nLIST.SetItemText(k,7,Grade.m_pe);
m_nLIST.SetItemText(k,8,Grade.m_Class);
k++;
UpdateData(false);
}
Grade.MoveNext();
}
Grade.Close();break;
case2:
Grade.Open();
Grade.MoveFirst();
while(!
Grade.IsEOF())
{if(m_Message==Grade.m_Name)
{m_nLIST.InsertItem(k,Grade.m_StuNumber);
m_nLIST.SetItemText(k,1,Grade.m_Name);
m_nLIST.SetItemText(k,2,Grade.m_c__);
m_nLIST.SetItemText(k,3,Grade.m_chinese);
m_nLIST.SetItemText(k,4,Grade.m_english);
m_nLIST.SetItemText(k,5,Grade.m_math);
m_nLIST.SetItemText(k,6,Grade.m_music);
m_nLIST.SetItemText(k,7,Grade.m_pe);
m_nLIST.SetItemText(k,8,Grade.m_Class);
k++;
UpdateData(false);
}
Grade.MoveNext();
}
Grade.Close();break;
case4:
Grade.Open();
Grade.MoveFirst();
while(!
Grade.IsEOF())
{
m_nLIST.InsertItem(k,Grade.m_StuNumber);
m_nLIST.SetItemText(k,1,Grade.m_Name);
m_nLIST.SetItemText(k,2,Grade.m_c__);
m_nLIST.SetItemText(k,3,Grade.m_chinese);
m_nLIST.SetItemText(k,4,Grade.m_english);
m_nLIST.SetItemText(k,5,Grade.m_math);
m_nLIST.SetItemText(k,6,Grade.m_music);
m_nLIST.SetItemText(k,7,Grade.m_pe);
m_nLIST.SetItemText(k,8,Grade.m_Class);
k++;
UpdateData(false);
//Teacher.MoveNext();
Grade.MoveNext();
}
Grade.Close();break;
}
6、设计过程遇到的问题及解决办法、解决效果
在编程过程中曾遇到过很多次这样的问题,最后发现是由于数据库没有打开或是数据库打开没有关闭而导致的错误,最后在仔细检查代码加以更改后这个问题得以解决。
在编程过程中经常出现期望为一的错误,strSQL1.Format("select*from成绩whereName='%s'",k);最后发现是where后面变量名称错误的问题导致。
采用ODBC方式连接数据库并不是很方便,在更改数据库文件存放位置后必须手动更改添加数据源,这对程序调试与封装产生了很大影响。
最后通过对网上例程的分析,我找到了它们对这种问题的相同解决方法,在入口函数的.CPP文件中添加响应的自动搜索数据库文件路径的代码即可解决这个问题,如今本程序的数据库文件位置不在影响程序的正常运行。
由于题目要求将数据库文件导出成EXECLE文件,而且这也符合程序的实际需求,所以必须想办法将其与MFC程序连接,以往都是将数据保存为文本文档,所以并不清楚怎样用MFC程序调用应用程序实现目的。
通过查阅相关MFC及数据库工具书,找到了一种调用EXECLE.EXE应用导出文件的方法,通过在MFC中添加对应的类文件,用代码操作就可以实现此项功能。
当你把某一个类想重新添加的时候可以把他的。
Cpp和。
H文件删除,然后按下Ctrl+w把原来的类进行remove之后就可以重新定义类了
在我把数据库里面的值调用出来求平均值的时间一直不成功,最后发现是由于数据库里定义的变量都是文本型的,不能进行计算,最后在网上查到CStringstr("1234");
int i= _ttoi(str);如这样的方法把文本型改为int型得以解决
在刚开始进行数据查找时我用的是while进行查找,最后发现这样弊端很大,不仅不够方便,有时候容易死循环。
最后我在网上查到了sql语句,如?
SQL?
?
SELECT * FROM stuscore WHERE ?
?
='111111'这样查找就极为方便。
七、对程序设计的认识
在大一C语言、计算机基础,大二c++、数据结构的基础上,我序设计也有了新的认识,下面是我在这次实训中收获的知识。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
LRC?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
开始?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
“?
?
?
?
?
?
?
”,?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
。
三、?
?
?
?
?
?
?
。
?
?
?
?
?
?
?
“?
?
”?
“?
?
”,?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
;“?
?
”?
?
?
?
?
?
?
?
?
?
?
?
?
——?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
比如?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
。
?
?
?
?
?
?
。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
...?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
“?
?
?
?
”“?
?
”?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
。
8、自己编写的程序代码
voidCGraduateManagementDlg:
:
OnEnter()登录界面选择主函数
{UpdateData(true);
administrator.Open();
Teacher.Open();
Student.Open();
Leader.Open();
switch(i)
{
case0:
{Teacher.MoveFirst();
while(!
Teacher.IsEOF())
{
if(m_Password==Teacher.m_Password&&m_UserID==Teacher.m_Name)
{l=Teacher.m_Name;h=Teacher.m_Major;AfxMessageBox("登录成功");TecherDlg2;Dlg2.DoModal();