[VFP课程设计]_学生成绩管理系统

学生成绩管理系统

1.需求分析

需求分析简单的说就是分析用户的要求,通过调查、收集与分析,获得用户对数据库的如下要求:

1.1信息要求:指用户需要从数据库中获得信息的内容与性质。

本系统需要的输入数据:学生信息(学号,姓名,班级,性别,出生日期)、课程信

息(课程名,满分)、考生成绩;输出数据:学生成绩报表、学生信息报表、课程报表、成绩报表。

1.2处理要求:指用户要完成什么处理功能。

本系统功能需求可归纳如下:

①数据登记

登记功能用于把各种手填的数据及时登记系统定义表中,还能修改这些数据(学

生信息、课程信息、成绩)。

②数据浏览

能浏览学生信息、课程信息、成绩。

③数据打印

能打印学生信息表、课程信息表、成绩表(单课成绩和总分成绩)。

④数据统计

能统计各班学生总数和男女人数,统计各班学生的总分、排名,及各单课的排名。

2.3 性能要求:维护数据的安全性.

设定密码,限制非法用户的使用;还能修改密码,维护系统的安全性。

2.数据库设计

数据库设计的任务是确定系统所需的数据库。数据库是表的集合,通常一个系统只需一个数据库。建立本系统的数据库数据data\test.dbc

2.1逻辑设计:确定数据库所含表及字段

学生信息表:xs(学号,姓名,班级,性别,出生日期)

课程信息表:kc(课程号,课程名,满分)

考生成绩表:cj(学号,姓名,班级,课程名,成绩,名次)

括号外字符号是表名,括号内是字段名,有下划线的字段为关联关键字

2.2物理设计

学生信息表:(data\xs.dbf) xs(xh c(7),xm c(8),bj c(10),xb c(2),csrq

d)

课程信息表:(data\kc.dbf) kc(kch c(5),kcm c(20),mf n )

考生成绩表:(data\cj.dbf) cj(xh c(7),xm c(8),bj c(10),kcm c(20),

cj n(5,1) ,mc n)

自由表: (data\pass.dbf) pass(pass c(10))

3.总体设计

按功能分类是总体设计的常用方法,用层次图(Hierarchy Chart 简称HC图)表示,自上而下分层

3.1数据维护模块

包括对学生信息表、课程信息表、考生成绩表的插入、修改、删除、搜索等。

3.2数据浏览模块

包括对学生信息表、课程信息表、考生成绩表的选择浏览、打印。

3.3成绩管理模块

包括对学生成绩的输入,总分和单课的统计和排名,分析各分数段人数的分布情况。

4.初始用户界面设计

系统层对应菜单文件,子系统层对应菜单标题,功能层对应子菜单项

5.1主文件(data\main.prg) 设计系统环境,调用登录表单

代码如下:

SET TALK off

set sysmenu off *关闭系统菜单

set cent on *年份的世纪部分用4位输出

_screen.windowstate=2

_screen.icon="icons\happy.ico" *系统图标

_screen.maxbutton=0

_screen.minbutton=1

_screen.closable=.f.

_screen.picture="picture\jjfz.jpe" *系统背景画

MODIFY WINDOW SCREEN TITLE " 学生成绩管理系统今天是:"+dtoc(date())+" "+cdow(date())

ZOOM WINDOW SCREEN MAX

open database data\数据test.dbc

do form forms\pass

read even *建立事件循环

quit

5.2菜单程序(mpr\menu.mpr)的建立

往命令窗口键入命令modi menu menu 出现菜单设计窗口

①“退出”菜单项命令 clear events *停止事件循环,

转去执行read event后的命令

②调用各表单命令如调用修改密码表单(forms\xiu.scx) do form

forms\xiu.scx

③插入分隔符菜单名称 \- 结果菜单项#

④设计快捷键

对于菜单项在菜单命令后加(\<字母)如系统功能(\

对于子菜单项单击选项 ->提示选项对话框,在键标签中键入CTRL+字母(J除外)。

5.3 数据库中的数据需要以表单的形式显示,本系统需建立以下表单:

a.系统登陆表单

b.密码修改表单

c.维护学生信息表单

d.维护课程信息表单

e.维护考生成绩表单

f.浏览学生信息表单

g.浏览课程信息表单

h.浏览成绩表单

i.成绩输入表单 j.总分成绩统计表单 k.单课成绩统计表单 l.成绩统计表单

设计表单步骤:

①在项目管理器中,文档->表单->新建。

②设计表单属性重要属性有 Caption AutoCenter Height Width WindowType Icon

③添加各标签、文本框,设定文本框与源表中源字段的绑定有代码的写代码

如属性InteractiveChange Event 当用鼠标或键盘修改控件的值时发生的事件

④创建命令按钮

详细介绍:

a.系统登陆表单 forms\pass.scx

功能:用户名和密码三次输入错误,自动退出系统;

限制了非法用户的使用,维护了系统数据的安全。

构成:三个标签(工作人员登录,用户名,密码)两个文本框

两个命令按钮(取消登录)

命令按钮登录

use data\pass

go top

if https://www.360docs.net/doc/ca3998597.html,er.value="guan" and thisform.pass.value=pass.pass

do menu\menu.mpr*若用户名和密码正确,则进入本系统。

thisform.release

else

#define missmatch_loc "用户或口令错,请重新登录!"

wait window missmatch_loc timeout 1 *系统延时

https://www.360docs.net/doc/ca3998597.html,er.value=''

thisform.pass.value=''

https://www.360docs.net/doc/ca3998597.html,er.setfocus

numcount=numcount+1

if numcount=4 *表单初始化事件有:public numcount numcount=0

mess =messagebox("三次口令错,将退出程序!",4+16+2,"退出")

clear event

release thisform

endif

endif

b.密码修改表单

功能:可以随时修改密码,维护系统安全。

构成:四个标签(请输入,旧密码,新密码,确认新密码)三个文本框

两个命令按钮(修改,退出)

c.维护成绩表单 forms\cj.scx

功能:能查询到某位学生成绩,可以对它修改,删除,

还可以清空整个cj.dbf的数据。

属性设计如图1

命令按钮删除

use data\cj excl *以独占的方式打开cj.dbf

locate for xh=this.parent.text1.value .and.kcm=this.parent.text4.value delete

mess=messagebox('彻底删除吗?',4+16+0,'删除') *弹出信息对话框

if mess=6

pack *如果确定,则彻底删除

else

recall *否则恢复

endif

thisform.refresh

下一个 skip 1

if eof() *如果到了末记录

=messagebox("已是末记录!",48,"信息窗口")

skip -1

this.enabled=.f.

else

this.enabled=.t.

endif

if !bof()

https://www.360docs.net/doc/ca3998597.html,mand3.enabled=.t.

else

https://www.360docs.net/doc/ca3998597.html,mand3.enabled=.f.

endif

thisform.refresh

d.维护学生信息表单

功能:根据学号能快捷查询到某个学生,对其进行修改,删除操作,

还能添加学生记录。

构成:六个标签(学号,姓名,班级,出生日期,性别)四个文本框

一个选项按钮(性别)命令按钮同图1

e.维护课程信息表单

功能:根据课程号能快捷查询到某门课程,对其进行修改,删除操作,还能添加课程记录。

构成:四个标签(课程号,课程名,满分,课程表)

四个文本框命令按钮同图1

f.浏览学生信息表单

功能:统计出全体学生人数,男女人数和各班级人数和男女人数;

打印出各班级学生信息

构成:一个页框(全体学生,各班学生)一个退出按钮每页一个表格全体学生页:三个标签(学生总数,男生总数,女生总数)

三个文本框打印按钮

各班学生页:四个标签(班级,学生总数,男生总数,女生总数)

三个文本框打印按钮一个组合框(班级)

组合框combo1.Interactivechange 代码

set filt to bj=allt(https://www.360docs.net/doc/ca3998597.html,bo1.value) count to thisform.pageframe1.page2.text1.value

count for xb="男" to thisform.pageframe1.page2.text2.value

count for xb="女" to thisform.pageframe1.page2.text3.value thisform.pageframe1.page2.grid1.refresh

g.浏览课程信息表单

功能:可以浏览、打印课程信息。

构成:一个标签(课程名)一个组合框两个命令按钮(打印,退出)一个表格h.浏览成绩表单 forms\scj.scx

功能:能够根据学号,姓名,课程名,班级,浏览学生成绩;还能浏览优秀学生成绩(成绩>满分*0.85)不及格学生成绩(成绩<满分*0.6)

并且能打印出选择的记录。

构成:一个含三页的页框(学号姓名查询,班级课程查询,高级查询)学号姓名查询页:两个标签(学号,姓名)两个文本框一个表格

四个命令按钮(两个查询,两个导出文本文件,一个打印)班级课程查询页:一个文本框(班级)一个组合框(课程名)

两个标签(班级,课程)一个表格

三个命令按钮(查询,打印,导出文本文件)高级查询页:五个命令按钮(全体学生,成绩优秀者,不及格者,

两个导出文本文件,打印)一个表格

查询代码:set filter to <逻辑表达式>

导出文本文件代码:copy to <文件名>[<范围>][fields<字段名>][for<条件>]

[while<条件>] sdf

i.成绩输入表单 forms\incj.scx

功能:方便的输入学生的成绩,下一个按钮可实现学号+1;如果没选课程,学号不存在,学生该门课的成绩已存在,都会给出错误提示;

右表格显示该门课全体学生的成绩。

构成:如下图

命令按钮输入

if empty(https://www.360docs.net/doc/ca3998597.html,bo1.value)

mess=messagebox("课程名不能为空!",0+48+0,"警告")

else

locate for cj.xh=allt(thisform.text2.value) ;

and cj.kcm=allt(https://www.360docs.net/doc/ca3998597.html,bo1.value) if recno()>reccount() *若符合输入条件,则输入记录。

insert into data\cj (xh,xm,bj,kcm,cj,mc);

allt(thisform.text3.value),allt(thisform.text1.value),;

allt(https://www.360docs.net/doc/ca3998597.html,bo1.; value),thisform.text4.value,reccount()+1)

go top

set filter to cj.kcm=allt(https://www.360docs.net/doc/ca3998597.html,bo1.value)

thisform.grid1.refresh

thisform.grid1.setfocus *表格标题改变

thisform.grid1.column3.header1.caption=allt(https://www.360docs.net/doc/ca3998597.html,bo1.value) https://www.360docs.net/doc/ca3998597.html,mand1.enabled=.f.

https://www.360docs.net/doc/ca3998597.html,mand3.enabled=.t.

https://www.360docs.net/doc/ca3998597.html,mand4.enabled=.t.

else

mess=messagebox("此记录已存在!",0+48+0,"警告")

endif

endif

命令按钮定位

https://www.360docs.net/doc/ca3998597.html,mand1.enabled=.t.

if empty(thisform.text2.value)

mess=messagebox("学号不能为空!",48,"警告")

else

go top

locate for xs.xh=allt(thisform.text2.value)

if recno()>reccount()

mess=messagebox("该学号不存在!",48,"警告")

https://www.360docs.net/doc/ca3998597.html,mand1.enabled=.f.

else

thisform.text1.value=xs.bj

thisform.text3.value=xs.xm

endif

endif

thisform.refresh

命令按钮下一个(主要代码)

thisform.text2.value=str(val(thisform.text2.value)+1) *实现学号自动加一j.总分成绩统计表单forms\tscj.scx

功能:求出选择班级学生的总分,并且统计出排名(相同成绩,名次相同)构成:三个标签(总分成绩排名,班级,参考人数)组合框(班级)

文本框(参考人数)一幅图像

六个命令按钮(统计总分,成绩排名,文本文件,打印,浏览,退出)https://www.360docs.net/doc/ca3998597.html,bo1 的 InteractiveChange Event 代码

use data\cj

https://www.360docs.net/doc/ca3998597.html,mand2.enabled=.f.

https://www.360docs.net/doc/ca3998597.html,mand3.enabled=.f.

https://www.360docs.net/doc/ca3998597.html,mand5.enabled=.f.

https://www.360docs.net/doc/ca3998597.html,mand6.enabled=.f.

erase sort1.dbf *删除文件sort1.dbf

use

命令按钮打印调用程序 do prg\sprt.prg sprt.prg的代码在后面

命令按钮统计总分

use

use data\cj

set safe off *重写文件,系统不给提示信息

total to sum1 on xh fields cj for bj=https://www.360docs.net/doc/ca3998597.html,bo1.value

set safe on *按学号统计各班学生总分,生成文件sum1.dbf

https://www.360docs.net/doc/ca3998597.html,mand5.enabled=.t.

t=1 ?

use

use sum1

this.parent.text1.value=reccount() *统计各班级参加考试的人数

use

命令按钮成绩排名

use

use sum1 excl

set safety off

sort to sort1 on cj desc fields xh,bj,xm,cj,mc *生成排名文件sort1.dbf set safety on

use

erase sum1.dbf

use sort1 excl

repl all mc with recno() *能够对相同分数的考生得出相同的名次

go top

do while .not.eof()

t=cj

p=mc *定义临时变量p

skip 1

if t=cj

repl mc with p

endif

enddo

use

https://www.360docs.net/doc/ca3998597.html,mand2.enabled=.t.

https://www.360docs.net/doc/ca3998597.html,mand3.enabled=.t.

https://www.360docs.net/doc/ca3998597.html,mand6.enabled=.t.

use

k.单课成绩统计表单 data\tdcj.scx

功能:统计出全年级、各班级学生各门课排名。

构成:三个标签(单课成绩统计表单,学科,班级)文本框(学科)

组合框(学科)选项按钮组(班级排名年级排名)一幅图像

四个按钮(统计,文本文件,打印,退出)

l.成绩分析表 data\cjfx.scx

功能:通过输入班级、课程名和分数段值,统计出各分数段的人数,

并求出最高分、最低分。

构成:11个标签(课科名,班级,满分,分数段,最高分,最低分,

分数段一~分数段五)一个组合框(班级)两个按钮(设定,退出)命令按钮设定

m=thisform.text2.value

n=thisform.text3.value

p=https://www.360docs.net/doc/ca3998597.html,bo1.value

q=thisform.text1.value

count to thisform.text4.value for cj.cj<=m and cj.cj>=(m-n) and cj.kcm=allt(p) and cj.bj=allt(q) *求出第一分数段的人数

count to thisform.text5.value for cj.cj<(m-n) and cj.cj>=(m-2*n) and cj.kcm=allt(p) and cj.bj=allt(q) *求出第二分数段的人数

count to thisform.text6.value for cj.cj<(m-2*n) and cj.cj>=(m-3*n) and cj.kcm=allt(p) and cj.bj=allt(q) *求出第三分数段的人数

count to thisform.text7.value for cj.cj<(m-3*n) and cj.cj>=(m-4*n) and cj.kcm=allt(p) and cj.bj=allt(q) *求出第四分数段的人数

count to thisform.text8.value forcj.cj<(m-4*n) and cj.kcm=allt(p) and cj.bj=allt(q) *求出第五分数段的人数

https://www.360docs.net/doc/ca3998597.html,bel4.caption=allt(str(m))+'--'+allt(str(m-n))

*改变label4的标题

https://www.360docs.net/doc/ca3998597.html,bel5.caption=allt(str(m-n))+'--'+allt(str(m-2*n))

https://www.360docs.net/doc/ca3998597.html,bel6.caption=allt(str(m-2*n))+'--'+allt(str(m-3*n))

https://www.360docs.net/doc/ca3998597.html,bel7.caption=allt(str(m-3*n))+'--'+allt(str(m-4*n))

https://www.360docs.net/doc/ca3998597.html,bel8.caption='<'+allt(str(m-4*n))

go top

max1=0 *以下求出最高分数和最低分数

min1=m

locate for cj.kcm=allt(p) and cj.bj=allt(q)

do while recno()<=reccount()

if cj.cj>max1

max1=cj.cj

endif

if cj.cj

min1=cj.cj

endif

continue

enddo

thisform.text9.value=max1

thisform.text10.value=min1

5.4 打印总分成绩排名的程序 prg\sprt.prg

功能:针对产生的排名数据表sort1dbf,不用建立报表,可方便打印出数据

set talk off

set safe off

set console off &&关闭到屏幕的输出

use sort1

lin=1

zt="font '宋体',14"

set print on &&传送输出结果到打印机打印

?bj+"学生成绩单"font '黑体',20 && 设计表头

?" ====================================="

?""

?" 学号姓名总分名次 "&zt && 采用宏代换

do while not eof()

?"│"+xh+"│"+xm+"│"++str(cj,5)+"│"+str(mc,4)+"│"&zt

lin=lin+1

skip

if lin>30

eject &&打印机输出命令

?" 学号姓名总分名次 "&zt

lin=1

endif

enddo

eject

set print off

use sort1

set console on &&打开到屏幕的输出

set safe on

set talk on

return

5.5学生成绩报表 frx\cj.frx

①创建报表 modify report cj 打开报表设计器

②设计标题学生成绩表报表表达式 date()

③设计页标头学号姓名成绩名成绩班级

④添加数据环境 data\cj.scx

⑤在细节中,添加域控件xh,xm,kcm,cj,bj

⑥在页注脚中,添加"页码 " + ALLTRIM(STR(_PAGENO))

课程信息报表 frx\kc.frx 学生信息报表 frx\xs.frx

制造过程与学生成绩报表的相同

6.结束语

连编生成可执行程序,在windowsXP,visual foxfro6.0环境下,调试成功。它实现了学生基本信息的管理,成绩的输入、浏览、统计、打印和维护。它可以按班级统计学生的总分,并对其排名,还可以对单课成绩排名,通过编写总分成绩排名的程序,实现打印成绩排名表。如果能把总分成绩和单课成绩组成一个报表,就更好了。

相关文档
最新文档