案例库
您当前的位置: 澳门新葡京app>案例库

综合案例七
学生成绩管理系统

发布时间: 2019-01-16      信息来源:       阅读次数:

综合案例七  学生成绩管理系统

【实验目的与要求】  

1.熟练使用VFP的操作环境

2.熟练使用项目管理器管理各种文件

3.掌握数据库的设计方法和步骤

4.熟练掌握数据库表及其表之间关系的创建与使用

5.掌握查询与视图的创建与使用

6.掌握程序设计的基本方法

7.掌握表单及其表单中各种控件的设计与使用

8.掌握菜单的创建和使用

【实验要求】

根据实际需要,编写班级学生成绩管理系统,解决传统手工方式的成绩管理,达到减少工作量、方便进行成绩查询、实现自动的成绩统计,提高效率的目的。

具体如下:

1 班级学生基本信息维护:包括班级学生基本信息的录入、修改、删除、查询等

2 班级学生成绩信息维护:包括班级学生成绩信息的录入、修改、删除等

3 成绩查询:包括按学号、姓名两种方式进行成绩查询

4 成绩统计:包括个人成绩、课程成绩、班级成绩统计

【系统功能模块】

   本系统设计了一个简单的数据库,学生基本信息、学生成绩信息,即能基本满足班级成绩管理的要求。系统主要分为五个模块:

(1) 学生基本信息维护模块:在此模块中,班级成绩管理员可以对学生基本信息如学号、姓名、性别等进行维护,可以新增、修改、删除或查询学生基本信息。

(2) 成绩录入模块:在此模块中,班级成绩管理员可以进行班级学生成绩的录入。

(3) 成绩查询模块:每个学生可以在此模块中通过学号或姓名来进行个人成绩的查询。

(4) 成绩修改模块:班级成绩管理员可以在此模块中进行学生成绩的修改。

(5) 成绩删除模块:班级成绩管理员在此模块中删除学生成绩信息。

(6) 成绩统计模块:每个学生可以在此模块中查看个人成绩、课程成绩、班级成绩的统计结果。

/xcxxgc_jpkc/upload/images/2019/1/1610839520.jpg

【实验内容】

1 数据库结构设计

按照系统不同的功能模块,需要不同的表来存储信息,数据库设计如下:

(1) 学生基本信息表STUINFO

名称

字段名称

数据类型

主键

非空

学号

XH

Char3

Yes

Yes

姓名

XM

Char8

No

Yes

性别

XBr

Char2

No

(2) 学生成绩信息表SCORE

名称

字段名称

数据类型

主键

非空

学号

XH

Char3

Yes

Yes

语文

YUWEN

Numeric3,0

NO

Yes

数学

SHUXUE

Numeric3,0

NO

Yes

英语

YINGYU

Numeric3,0

NO

Yes

平均分

PINGJUNFEN

Numeric5,1

NO

一、详细设计

1 主界面模块

/xcxxgc_jpkc/upload/images/2019/1/1610839832.jpg

 

2 学生基本信息维护

该模块实现学生基本信息的维护,包括增加、删除、修改等维护数据的操作。由于学生的基本信息仅仅是成绩管理系统中的辅助数据,信息内容简单,数据变动不大,维护操作较简单,故直接使用VFP中的表单向导生成该表单,运行界面如下:

/xcxxgc_jpkc/upload/images/2019/1/1610839926.jpg

3 成绩录入

该模块实现班级学生成绩的录入。一个学生一条成绩记录。已录入成绩的学生不能再进行成绩的录入,只能做修改等其它操作。所以在录入成绩时,只能在学号下拉框中进行未曾录入成绩的学生学号的选择,同时在姓名文本框中确认是否待录入成绩的学生。确认该生后,录入其成绩数据。运行界面如下:

/xcxxgc_jpkc/upload/images/2019/1/161084019.jpg

程序代码:

FrmsrLoad事件代码:

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

FrmsrInit事件代码:

thisform.combo1.clear

i=1

do while type('no(i)')!='L'

thisform.combo1.additem(no(i))

i=i+1

enddo

FrmsrRelease事件代码:

select 1

use

select 2

use

close database

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

4 成绩查询

   该模块实现班级学生各门课程成绩的查询。可以按学号、姓名两种方式来进行查询。查询结果是不允许修改的,所有显示查询结果的文本框的ReadOnly属性均为.T.。运行界面如下:

/xcxxgc_jpkc/upload/images/2019/1/1610840128.jpg/xcxxgc_jpkc/upload/images/2019/1/1610840175.jpg

程序代码:

Frmxhcx1

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

Frmxhcx2

Text1Text5ControlSource属性要修改为相应数据表的字段名,将相应数据与文本框绑定在一起,可以在运行期间显示数据的值,修改文本框的值也会反应到数据表中。如:Text1.ControlSource=score.xh

Frmxhcx2Load事件代码:

select 2

use stuinfo

locate for xh=a.xh

CmdokClick事件代码:

select 1

use

select 2

use

close data

thisform.release

/xcxxgc_jpkc/upload/images/2019/1/1610840222.jpg

程序代码:

Frmxmcx1

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

Frmxmcx2

Text1Text5ControlSource属性同样要修改为相应数据表的字段名。

Frmxmcx2Load事件代码:

select 2

use score

locate for xh=a.xh

CmdokClick事件代码:

select 1

use

select 2

use

close data

thisform.release

5 成绩修改

该模块实现班级学生各门课程成绩数据的修改。可以按学号、姓名两种方式来进行修改,两种方式类似。以按学号进行修改为例,运行界面如下:

/xcxxgc_jpkc/upload/images/2019/1/1610840316.jpg

Frmxhxg1

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

Frmxhxg2

Frmxmsc2Load事件代码:

由于进行了数据绑定,对文本框内容的修改会直接反应到数据表中。确认修改无需做特别工作,但是取消修改需要恢复修改前的原值。故在此使用了数组a来保存修改前的原始值。在恢复修改中,使用gather from a恢复原值。

select 2

use stuinfo

locate for xh=a.xh

public declare a(4)

select 1

scatter to a

CmdokClick事件代码:

select 1

replace pingjunfen with (yuwen+shuxue+yingyu)/3

use

select 2

use

close data

thisform.release

CmdcancelClick事件代码:

select 1

gather from a

use

select 2

use

close data

thisform.release

6 成绩删除

该模块实现班级学生各门课程成绩数据的删除。可以按学号、姓名两种方式来进行删除,两种方式类似。以按姓名进行删除为例,运行界面如下:

/xcxxgc_jpkc/upload/images/2019/1/1610840409.jpg

Frmxmsc1

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

Frmxmsc2

Frmxmsc2Load事件代码:

select 2

use score

locate for xh=a.xh

CmdokClick事件代码:

select 2

dele

pack

use

select 1

use

close data

thisform.release

CmdcancelClick事件代码:

select 1

use

select 2

use

close data

thisform.release

7 成绩统计

/xcxxgc_jpkc/upload/images/2019/1/1610840503.jpg

/xcxxgc_jpkc/upload/images/2019/1/1610840565.jpg

个人成绩统计中,使用了四个视图:YWSXYYPJF,以取该生的语文、数学、英语及总分在班级中的排名次序。

Frmgrtj1

CmdokClick事件代码:

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

CmdcancelClick事件代码:

thisform.release

Frmgrtj2

Frmgrtj2Activate事件代码:

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()

CmdokClick事件代码:

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

/xcxxgc_jpkc/upload/images/2019/1/1610840612.jpg/xcxxgc_jpkc/upload/images/2019/1/1610840659.jpg

Frmkctj1

CmdokClick事件代码:

public kcm

kcm=alltrim(thisform.combo1.value)

do form newkctj2

thisform.release

CmdcancelClick事件代码:

thisform.release

Frmkctj2

Frmkctj2Activate事件代码:

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)

CmdokClick事件代码:

use

close data

thisform.release

/xcxxgc_jpkc/upload/images/2019/1/1610840721.jpg

FrmbjtjLoad事件代码:

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

CmdokClick事件代码:

select 1

use

select 2

use

close data

thisform.release