综合案例七 学生成绩管理系统【实验目的与要求】 1.熟练使用VFP的操作环境 2.熟练使用项目管理器管理各种文件 3.掌握数据库的设计方法和步骤 4.熟练掌握数据库表及其表之间关系的创建与使用 5.掌握查询与视图的创建与使用 6.掌握程序设计的基本方法 7.掌握表单及其表单中各种控件的设计与使用 8.掌握菜单的创建和使用
【实验要求】 根据实际需要,编写班级学生成绩管理系统,解决传统手工方式的成绩管理,达到减少工作量、方便进行成绩查询、实现自动的成绩统计,提高效率的目的。 具体如下: (1) 班级学生基本信息维护:包括班级学生基本信息的录入、修改、删除、查询等 (2) 班级学生成绩信息维护:包括班级学生成绩信息的录入、修改、删除等 (3) 成绩查询:包括按学号、姓名两种方式进行成绩查询 (4) 成绩统计:包括个人成绩、课程成绩、班级成绩统计
【系统功能模块】 本系统设计了一个简单的数据库,学生基本信息、学生成绩信息,即能基本满足班级成绩管理的要求。系统主要分为五个模块: (1) 学生基本信息维护模块:在此模块中,班级成绩管理员可以对学生基本信息如学号、姓名、性别等进行维护,可以新增、修改、删除或查询学生基本信息。 (2) 成绩录入模块:在此模块中,班级成绩管理员可以进行班级学生成绩的录入。 (3) 成绩查询模块:每个学生可以在此模块中通过学号或姓名来进行个人成绩的查询。 (4) 成绩修改模块:班级成绩管理员可以在此模块中进行学生成绩的修改。 (5) 成绩删除模块:班级成绩管理员在此模块中删除学生成绩信息。 (6) 成绩统计模块:每个学生可以在此模块中查看个人成绩、课程成绩、班级成绩的统计结果。
【实验内容】 1、 数据库结构设计 按照系统不同的功能模块,需要不同的表来存储信息,数据库设计如下: (1) 学生基本信息表STUINFO
(2) 学生成绩信息表SCORE
一、详细设计 1、 主界面模块
2、 学生基本信息维护 该模块实现学生基本信息的维护,包括增加、删除、修改等维护数据的操作。由于学生的基本信息仅仅是成绩管理系统中的辅助数据,信息内容简单,数据变动不大,维护操作较简单,故直接使用VFP中的表单向导生成该表单,运行界面如下:
3、 成绩录入 该模块实现班级学生成绩的录入。一个学生一条成绩记录。已录入成绩的学生不能再进行成绩的录入,只能做修改等其它操作。所以在录入成绩时,只能在学号下拉框中进行未曾录入成绩的学生学号的选择,同时在姓名文本框中确认是否待录入成绩的学生。确认该生后,录入其成绩数据。运行界面如下: 程序代码: Frmsr的Load事件代码: public dimension no(100) for i=1 to 100 no(i)=.f. endfor open data student select 1 use stuinfo select 2 use score select 1 i=1 scan select 2 locate for xh=a.xh if not found() no(i)=a.xh i=i+1 endif select 1 endscan
Frmsr的Init事件代码: thisform.combo1.clear i=1 do while type('no(i)')!='L' thisform.combo1.additem(no(i)) i=i+1 enddo
Frmsr的Release事件代码: select 1 use select 2 use close database
Cmdok的Click事件代码: select 2 append blank replace xh with thisform.combo1.value if len(alltrim(thisform.text3.value))>0 replace yuwen with val(thisform.text3.value) else replace yuwen with 0 endif if len(alltrim(thisform.text4.value))>0 replace shuxue with val(thisform.text4.value) else replace shuxue with 0 endif if len(alltrim(thisform.text5.value))>0 replace yingyu with val(thisform.text5.value) else replace yingyu with 0 endif replace pingjunfen with (yuwen+shuxue+yingyu)/3 thisform.release
Cmdcancel的Click事件代码: thisform.release
4、 成绩查询 该模块实现班级学生各门课程成绩的查询。可以按学号、姓名两种方式来进行查询。查询结果是不允许修改的,所有显示查询结果的文本框的ReadOnly属性均为.T.。运行界面如下: 程序代码: Frmxhcx1: Cmdok的Click事件代码: cxxh=alltrim(thisform.text1.value) open data student select 1 use score loca for alltrim(xh)==cxxh if found() do form newcx1 thisform.release else messagebox('没有此学号!',0+48+0,'错误') thisform.text1.setfocus endif
Cmdcancel的Click事件代码: thisform.release
Frmxhcx2: Text1到Text5的ControlSource属性要修改为相应数据表的字段名,将相应数据与文本框绑定在一起,可以在运行期间显示数据的值,修改文本框的值也会反应到数据表中。如:Text1.ControlSource=score.xh。 Frmxhcx2的Load事件代码: select 2 use stuinfo locate for xh=a.xh
Cmdok的Click事件代码: select 1 use select 2 use close data thisform.release 程序代码: Frmxmcx1: Cmdok的Click事件代码: cxxm=alltrim(thisform.text1.value) open data student select 1 use stuinfo loca for alltrim(xm)==cxxm if found() do form newcx2 thisform.release else messagebox('没有此姓名!',0+48+0,'错误') thisform.text1.setfocus endif
Cmdcancel的Click事件代码: thisform.release
Frmxmcx2: Text1到Text5的ControlSource属性同样要修改为相应数据表的字段名。 Frmxmcx2的Load事件代码: select 2 use score locate for xh=a.xh
Cmdok的Click事件代码: select 1 use select 2 use close data thisform.release
5、 成绩修改 该模块实现班级学生各门课程成绩数据的修改。可以按学号、姓名两种方式来进行修改,两种方式类似。以按学号进行修改为例,运行界面如下: Frmxhxg1: Cmdok的Click事件代码: cxxh=alltrim(thisform.text1.value) open data student select 1 use score loca for alltrim(xh)==cxxh if found() do form newxg1 thisform.release else messagebox('没有此学号!',0+48+0,'错误') thisform.text1.setfocus endif
Cmdcancel的Click事件代码: thisform.release
Frmxhxg2: Frmxmsc2的Load事件代码: 由于进行了数据绑定,对文本框内容的修改会直接反应到数据表中。确认修改无需做特别工作,但是取消修改需要恢复修改前的原值。故在此使用了数组a来保存修改前的原始值。在恢复修改中,使用gather from a恢复原值。 select 2 use stuinfo locate for xh=a.xh public declare a(4) select 1 scatter to a
Cmdok的Click事件代码: select 1 replace pingjunfen with (yuwen+shuxue+yingyu)/3 use select 2 use close data thisform.release
Cmdcancel的Click事件代码: select 1 gather from a use select 2 use close data thisform.release
6、 成绩删除 该模块实现班级学生各门课程成绩数据的删除。可以按学号、姓名两种方式来进行删除,两种方式类似。以按姓名进行删除为例,运行界面如下: Frmxmsc1: Cmdok的Click事件代码: cxxm=alltrim(thisform.text1.value) open data student select 1 use stuinfo loca for alltrim(xm)==cxxm if found() do form newsc2 thisform.release else messagebox('没有此姓名!',0+48+0,'错误') thisform.text1.setfocus endif
Cmdcancel的Click事件代码: thisform.release
Frmxmsc2: Frmxmsc2的Load事件代码: select 2 use score locate for xh=a.xh
Cmdok的Click事件代码: select 2 dele pack use select 1 use close data thisform.release
Cmdcancel的Click事件代码: select 1 use select 2 use close data thisform.release
7、 成绩统计 个人成绩统计中,使用了四个视图:YW、SX、YY、PJF,以取该生的语文、数学、英语及总分在班级中的排名次序。 Frmgrtj1: Cmdok的Click事件代码: xhxm=alltrim(thisform.text1.value) open data student select 2 use studscore loca for alltrim(xh)==xhxm if found() do form newgrtj2 thisform.release else loca for alltrim(xm)==xhxm if found() do form newgrtj2 thisform.release else messagebox('没有此学号或姓名!',0+48+0,'错误') thisform.text1.setfocus endif endif
Cmdcancel的Click事件代码: thisform.release
Frmgrtj2: Frmgrtj2的Activate事件代码: set talk off select 2 xuehao=studscore.xh thisform.text6.value=alltrim(studscore.xh) thisform.text7.value=alltrim(studscore.xm) thisform.text8.value=alltrim(str(studscore.yuwen)) thisform.text9.value=alltrim(str(studscore.shuxue)) thisform.text10.value=alltrim(str(studscore.yingyu)) thisform.text4.value=alltrim(str(studscore.pingjunfen)) select 3 use yw loca for xh=xuehao mc1=recno() thisform.text1.value=mc1 select 4 use sx loca for xh=xuehao mc2=recno() thisform.text2.value=mc2 select 5 use yy loca for xh=xuehao mc3=recno() thisform.text3.value=mc3 select 6 use pjf loca for xh=xuehao thisform.text5.value=recno()
Cmdok的Click事件代码: select 1 use select 2 use select 3 use select 4 use select 5 use select 6 use close data set talk on thisform.release
Frmkctj1: Cmdok的Click事件代码: public kcm kcm=alltrim(thisform.combo1.value) do form newkctj2 thisform.release
Cmdcancel的Click事件代码: thisform.release
Frmkctj2: Frmkctj2的Activate事件代码: set talk off do case case kcm='语文' kc='yuwen' case kcm='数学' kc='shuxue' case kcm='英语' kc='yingyu' endcase open data student use score count all to zrs count for &kc<60 to bjg1 count for &kc<70 and &kc>=60 to jg1 count for &kc<80 and &kc>=70 to zhong1 count for &kc<90 and &kc>=80 to liang1 count for &kc<=100 and &kc>=90 to you1 bjg2=str(bjg1/zrs*100,5,1)+'%' jg2=str(jg1/zrs*100,5,1)+'%' zhong2=str(zhong1/zrs*100,5,1)+'%' liang2=str(liang1/zrs*100,5,1)+'%' you2=str(you1/zrs*100,5,1)+'%' calculate max(&kc) all to zgf calculate min(&kc) all to zdf average &kc all to pjf1 pjf=str(pjf1,5,1)
Cmdok的Click事件代码: use close data thisform.release
Frmbjtj的Load事件代码: set talk off open data student drop table stuscore select 1 use stuinfo set order to xh select 2 use score join with a to stuscore for a.xh=b.xh fields a.xh,a.xm,yuwen,shuxue,yingyu,pingjunfen add table stuscore use stuscore sum yuwen to a sum shuxue to b sum yingyu to c count all to d zjf=str((a+b+c)/d/3,5,1) count for yuwen<60 to aa count for shuxue<60 to bb count for yingyu<60 to cc bjgrs=aa+bb+cc bjgl1=(aa+bb+cc)/3/d*100 bjgl=str(bjgl1,5,1)+'%' jgl=str(100-bjgl1,5,1)+'%' go top
Cmdok的Click事件代码: select 1 use select 2 use close data thisform.release
|