VF课程设计点名系统VF课程设计VisualFoxPro课程设计VFP课程设计.docx
- 文档编号:5383929
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:26
- 大小:200.59KB
VF课程设计点名系统VF课程设计VisualFoxPro课程设计VFP课程设计.docx
《VF课程设计点名系统VF课程设计VisualFoxPro课程设计VFP课程设计.docx》由会员分享,可在线阅读,更多相关《VF课程设计点名系统VF课程设计VisualFoxPro课程设计VFP课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
VF课程设计点名系统VF课程设计VisualFoxPro课程设计VFP课程设计
点名系统方案设计
1、课程设计的目的
数据库基础及应用是一门实用性很强的学科,是进行软件开发的主要基础。
只有进行实际操作,才能将理论知识和实际应用有机地结合起来,锻炼学生分析解决问题得能力,提高学生实际运用的技能,为日后工作中的软件开发打下良好的基础。
VFP是微软公司推出的关系型数据库管理系统,它是一种地形的第四代计算机语言,VFP全面支持可视化编程和面向对象的编程,是最为使用的数据库管理系统和中小型数据库应用系统的软件开发之一,它为数据库结构和应用软件开发而设计,是功能强大的面向对象的软件。
本课程设计结合数据库内容,运用VFP设计,使学生掌握数据库基础内容。
2、需求分析
2.1需求
在大学课堂中,课堂提问是上课环节中不可缺少的部分,也是教师与学生课堂互动,交流,最直接的方式。
但在大学的课堂中缺存在一些问题。
对于学生来说,现在在大学生心理普遍的思想是:
“千万别点我!
”,一旦被老师点到则:
“哎呀妈呀!
今天点子真背!
那么多人,怎么就点到我了呢?
!
"。
还有一种情况就是,有些同学每节课都被提问,有些同学整个学期都得不到一次提问机会。
对于教师来说,同样存在一些提问上的问题。
老师每次提问之前都会拿着点名表看了又看:
“点谁好呢?
”面对几百人的课堂想在其中“公平的”选出回答问题的同学,这是令我们教师非常头疼的事情。
针对上述问题,提出程序设计需求如下:
(1)此程序可以公平的选出提问的同学
(2)此程序可以排除掉已经被提问过的同学
(3)此程序可以从提问次数少的同学中选一同学
(4)此程序可以为多个班级的同学提供点名服务
(5)此程序最后可以打印出一个学期整体提问次数和分数
(6)此程序可以提供最多的点名次数不少于15次
2.2分析
首先,内部程序需要班级名次表作为点名表;对于公平的提问这一需求,可以使用VF自带的随机数函数,随机数函数可以返回一个随机值,将这个随机值作为学号来进行提问。
每个班级每节课都配置一张提问表,这样就可以为多个班级多个课程提供点名服务。
其次,对于“排除提问过的同学”这一需求可以这样满足:
将点名表增加一个特殊的字段,把提问过的同学对应的字段做标记,用判断语句判断如果特殊字段已经做了标记则下次不在提问。
对于“从提问次数少的同学中选一个”需求可以这样满足:
在点名表中增加一个次数字段,每次点名到时,将次数字段增加1次,点名时先中表中找到次数字段最少的同学提问,在使用随机函数随机选出一名同学。
最后,在程序中增加报表功能,报表中包括次次数、总分等满足需求,对于“次数不少于15次”的需求,可以将表增加序列次数字段,每次提问都将获得的分数存放到相应的次数中。
3、设计方案论证
3.1系统结构
3.2核心算法
3.2.1随机数算法
在本程序中多次用到了随机函数,在VF中的rand()函数只能返回(0,1)之间的随机数,并不能返回我们需要的“学号”,因此我们必须对rand()函数做适当的操作,使其返回我们需要的“学号”。
分析,假如一个班级有40名同学,那么随机数算法给我们返回的数的范围一定是在0~40之间。
假如一个班级有100名同学,那么随机数算法给我们返回的数的范围一定是在0~100之间。
因此根据数学算法,将rand()进行变形。
X=int(10000*rand()%(max-mix)+mix)
其中,max为序列的最大值,mix为序列的最小值,X为返回的随机数。
如,一个班级有40人,则max的值就为40,mix的值就为1。
则X返回的随机数一定在0~40之间。
3.2.2随机查找算法
在随机输出“学号”时,有一种情况是我们没有考虑到的:
当2个或者很多个同学回答的都没被提问过。
换句话说,有n个同学的次数字段相同!
那么我们就需要从这些回答次数相同的同学中随机的选择一个!
具体算法程序如下,其中X为查找的次数字段。
locatedforcishu==X
iffound()
skipint(10000*rand()%(mixx-1)+1)
cont
endif
iffound()
显示此名同学的信息,定位指针
else
gotop
locatedforcishu==0
iffound()
显示此名同学的信息,定位指针
endif
endif
下面的流程图会帮助理解随机查找算法
图1:
随机查找算法流程图
3.2.3中介表思想
在需求中教师不只是教一个班级,还有很多个班级,很多课要教,对点名模块的设计绝对不能只对一个表操作,一定要有很多张表,且可以随意切换,用户选择哪张表,就点哪张表内的同学。
首先,将用户选择的表所对应的表名存进一张“中介表”中;点名时在从“中介表”中“拿”出对应的表名,再在点名模块中打开这张表进行操作,思想体现如下:
biao=thisform.text1.value
usemediatable
replacecwithbiao
其中,biao中存放的是用户想点名的表的名字;mediatable为“中介表”;将biao中的内容存放在mediatable的C字段中,每次在使用点名模块点名的时候,都必须打开所有对应的表。
usemediatable
biao=c
closemediatable
use&biao
点名主程序
3.2.4临时表和数据环境问题
在生成报表设计时,通过用户输入想生成报表的点名表的表名生成报表。
但点名表都是用户自行创建的,此表当然也不在数据环境中,报表操作时,表必须在当前的数据环境中,为了解决这一问题,可以将“临时表”、“中介表”思想联合到一起,首先新建一个名为“baobiao“的报表和一个叫“baobiao”的临时表,将表“baobiao“加入当前数据环境中,生成报表时运行如下代码:
settalkoff
setsafetyoff
biao=thisform.text1.value
usebaobiao
deleall&&逻辑删除所有记录
zap&&物理删除所有记录
appendfrom&biaofieldsxh,xm,cishu,zongfen&&追加表项
reportformbaobiaotoprintpreview&&浏览报表
thisform.release
use&biao
首先将表“baobiao“的内容删除,然后将用户选择的表中相关字段的内容加载到报
表“baobiao“中,并浏览报表“baobiao“中的内容。
3.3表结构设计
3.3.1Student
表1:
student表结构
字段名
类型
宽度
备注
xh
Xm
cishu
First
Secondd
fourth
zongfen
数值型
字符型
数值型
数值型
数值型
数值型
数值型
8
10
3
2
2
2
3
用于存放学生的学号
用于存放学生的姓名
用于存放回答次数
用于存放回答次数
用于存放回答次数
用于存放回答次数
用于存放总分
3.3.2Login
表2:
login表的结构
字段名
类型
长度
备注
name
password
字符
字符
10
10
用于存放用于的登录名
用于存放登录的密码
3.3.2mediatable
表3:
mediatable的结构
字段名
类型
长度
备注
A
B
C
D
字符
字符
字符
字符
10
10
10
10
用于存放中介变量的临时字段
用于存放中介变量的临时字段
用于存放中介变量的临时字段
用于存放中介变量的临时字段
3.4表单设计
3.4.1登录框
图2:
登录框的表单设计
其中的控件信息如下表所示:
表4:
登录框模块中的控件
控件名
属性名
属性值
备注
Label1
Label2
Text1
caption
Caption
用户名
密码
提示输入用户名
提示输入密码
Value
接收用户名
续表4:
Test2
Command1
Command2
Command2
value
Caption
Caption
登录
清除
接收用户密码
登录按钮
清除按钮
Caption
退出
退出按钮
以下是登录框各个按钮的click事件:
表5:
登录框代码表
登录
清除
退出
name=alltrim(thisform.text1.value)
password=alltrim(thisform.text2.value)
uselogin&&在login表里查找
locateforlogin.name==nameandlogin.password==password
iffound()
thisform.release
doform主页面&&打开主页面
else
messagebox("用户名或密码不正确","提示")
thisform.text2.value=""
thisform.text1.value=""
thisform.text1.setfocus
Endif
thisform.text1.value=""
thisform.text2.value=""
Thisform.release
3.4.2普通点名
图5:
普通点名的表单设计
单击“下一个”按钮,可以显示随机函数返回的随机数。
“下一个”按钮的click事件代码为:
usemediatable
gotop
a0=val(mediatable.a)&&将从中介表接收的值存进当前变量
b0=val(mediatable.b)
thisform.label1.caption=alltr(str(10000*rand()%(b0-a0)+a0))&&随机数算法
3.4.2普通设置
图6:
普通设计的表单设计
此表单可以将起始值,终止值存如程序中,单击“确定”按钮,完成设置。
“确定”按钮的click事件的代码为:
aa=thisform.text1.value
bb=thisform.text2.value
replaceawithaa&&将获得的初始值存进表中
replacebwithbb
messagebox("设置成功","提示")
thisform.release
3.4.3高级点名
图7:
高级点名的表单设计
单击“随便选一个”按钮可以随机挑选一名同学。
“随便选一个”按钮的click事件代码为:
usemediatable
biao=c
thisform.label6.caption="正在使用"+allt(mediatable.c)+"表"&&显示当前使用的表
usemediatable
xh=0
publX
use&biao&&利用宏替换打开表
mixx=recc()&&将表中的记录数赋给变量mixx
x=int(10000*rand()%(mixx-1)+1)&&随机产生随机数
locateforxh==x
iffound()
thisform.label1.caption="请"+allt(str(xh))+"号"+allt(xm)+"同学回答问题"
replacecishuwithcishu+1&&将表中的cishu字段+1
thisform.label2.caption="请为"+allt(str(xh))+"号同学打分"
thisform.label5.caption="未打分"
endif
pingjun=(first+secondd+third+fourth+fifth+sixth+seventh+…………+thirtieth)/30
int(pingjun)&&计算平均分
thisform.label3.caption="这名同学已经获得"+allt(str(cishu))+"次提问的机会,平均分为"+allt(str(pingjun))+"分"
单击“从没点到的同学选一个”按钮可以随机挑选出一个同学。
“从没点到的同学选一个”按钮的click事件代码为:
usemediatable
biao=mediatable.c
thisform.label6.caption="正在使用"+allt(mediatable.c)+"表"
usemediatable
xh=0
use&biao&&利用宏替换打开表
gotop
mixx=recc()&&将表中的记录数赋给变量mixx
str(10000*rand()%(mixx-1)+1)&&随机产生随机数
locaforcishu==0
iffound()
skipint(10000*rand()%(mixx-1)+1)&&向下条随机数个记录
cont
endif
iffound()
thisform.label1.caption="请"+allt(str(xh))+"号"+allt(xm)+"同学回答问题"
replacecishuwithcishu+1
thisform.label2.caption="请为"+allt(str(xh))+"号同学打分"
thisform.label5.caption="未打分"
else
endif
pingjun=(first+secondd+third+fourth+fifth+sixth+seventh+eighth…………+thirtieth)/30
int(pingjun)
thisform.label3.caption="这名同学已经获得"+allt(str(cishu))+"次提问的机会,平均分为"+allt(str(pingjun))+"分"
ifeof()==.T.&&如果指针定位到表尾,说明没有查找到
thisform.label3.caption="同学们至少被提问了一次,请选择左侧………提问一个次数少的同学"
thisform.label1.caption=""
endif
单击“从次数少的同学中选一个”按钮可以将随机挑选一个回答次数少的同学。
“从次数少的同学中选一个”按钮的click事件代码为:
usemediatable
biao=mediatable.c
thisform.label6.caption="正在使用"+allt(mediatable.c)+"表"
usemediatable
use&biao&&利用宏替换打开表
gotop
mixx=recc()&&将表中的记录数赋给变量mixx
mix=cishu
skip
dowhile.not.eof()&&利用while循环找到cishu字段最少的值
ifcishu mix=cishu endif skip enddo gotop locaforcishu==mix&&查找次数少的同学 iffound() skipint(10000*rand()%(mixx-1)+1)&&向下条随机数个指针 cont endif iffound() thisform.label1.caption="请"+allt(str(xh))+"号"+allt(xm)+"同学回答问题" replacecishuwithcishu+1 thisform.label2.caption="请为"+allt(str(xh))+"号同学打分" thisform.label5.caption="未打分" else gotop locaforcishu==mix iffound() thisform.label1.caption="请"+allt(str(xh))+"号"+allt(xm)+"同学回答问题" replacecishuwithcishu+1 thisform.label2.caption="请为"+allt(str(xh))+"号同学打分" thisform.label5.caption="未打分" endif endif pingjun=(first+secondd+third+fourth+fifth+sixth+seventh+eight……twentynint+thirtieth)/30 int(pingjun) thisform.label3.caption="这名同学已经获得"+allt(str(cishu))+"次提问的机会,平均分为"+allt(str(pingjun))+"分" “打分条”按钮组可以设置同学获得的分数。 “打分条”的click事件代码为: docase casethis.value==1 thisform.label5.caption="该同学将获得1分"&&每次点击时,在label5上显示状态 casethis.value==2 thisform.label5.caption="该同学将获得2分" casethis.value==3 thisform.label5.caption="该同学将获得3分" casethis.value==4 thisform.label5.caption="该同学将获得4分" casethis.value==5 thisform.label5.caption="该同学将获得5分" endcase “打分”按钮的click事件代码为: n=thisform.optiongroup1.value&&将选项按钮组的返回值赋给n docase casecishu==1&&将次数对应的字段值赋予对应的分数 replacefirstwithn casecishu==2 replaceseconddwithn (省略) casecishu==30 replacethirtiethwithn endcase thisform.label5.caption="打分成功" 3.4.4选择表 图8: 选择表的表单设计 单击“使用”按钮可以将想要点名的“表”输入进程序。 “使用”按钮的click事件代码为: biao=thisform.text1.value usemediatable replacecwithbiao&&将用户的表名传递给中介表 wait"选择成功"windowsat30,120timeout1 thisform.release closetables 3.4.5选择同学 图9: 打分的表单设计 点击“打分”按钮给同学打分。 “打分”按钮的click事件代码为: xx=val(thisform.text1.value) locateforxh==xx iffound() replacecishuwithcishu+1&&将当前cishu字段+1 else messagebox("未找到","提示") endif n=thisform.optiongroup1.value docase casecishu==1 replacefirstwithn casecishu==2 replaceseconddwithn casecishu==3 replacethirdwithn casecishu==4 replacefourthwithn casecishu==5 replacefifthwithn (省略) casecishu==30 replacethirtiethwithn endcase wait"打分成功"windowsat30,120timeout1 closetables thisform.release 3.4.6查询表 图10: 查询的表单设计 “查询”按钮的click事件代码为: thisform.grid1.recordsource=thisform.text1.value 3.4.7生成报表 图11: 生成报表的表单设计 “生成”按钮的click事件代码为: settalkoff&&关闭安全提示 setsafetyoff&&关闭安全提示 biao=thisform.text1.value usebaobiao deleall&&逻辑删除所有记录 zap&&物理删除所有记录 appendfrom&biaofieldsxh,xm,cishu,zongfen&&将用户所输入表中的内容追加到中介表中 reportformbaobiaotoprintpreview&&阅览中介表(报表) thisform.release use&biao 3.4.8修改表 图11: 编辑的表单设计 各个按钮的click事件如下: 代码表3.4.8 确定 添加 修改 删除 publbiao biao=alltrim(thisform.text1.value) thisform.grid1.recordsource=biao gobottom appendblank edit thisform.refresh edit thisform.refresh tempstr=messagebox("确定要删除这个同学吗? ",4+32+256,"删除记录") iftempstr=6 delete pack thisform.grid1.recordsource='学生' thisform.refresh endif 3.5菜单设计 表2: 主菜单 一级菜单 二级菜单 过程代码 文件 退出 Quit 点名 普通点名 高级点名 添加表 修改表 查询 生成报表 Doform普通点名 Doform高级点名 Doform添加表 Doform修改表 Doform查询 Doform生成报表 编辑 3.6表设计 3.6.1中介表 表3: mediatable A B C D 3.6.2登录表 表4: login Name password 王诗洋 123 admin 123 123 admin 3.6.3点名表 表5: student Xh Xm cishu First Secondd Thirth Fourth zongfen 1 李蕾 2 汤勤书 3 李纯漪 4 鞠振东 5 赵晓宇 6 赵海
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VF 课程设计 点名 系统 VisualFoxPro VFP
![提示](https://static.bdocx.com/images/bang_tan.gif)