[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环境下,调试成功。它实现了学生基本信息的管理,成绩的输入、浏览、统计、打印和维护。它可以按班级统计学生的总分,并对其排名,还可以对单课成绩排名,通过编写总分成绩排名的程序,实现打印成绩排名表。如果能把总分成绩和单课成绩组成一个报表,就更好了。