编程VFP.docx
《编程VFP.docx》由会员分享,可在线阅读,更多相关《编程VFP.docx(24页珍藏版)》请在冰豆网上搜索。
编程VFP
f(n)=f(n-2)+f(n-1) (n>1) 其中f(0)=0,f
(1)=1。
并写出相应主函数。
例:
(括号内为说明)
输入
10
输出
1
1
2
3
5
8
13
21
34
55
[codes=c]
#include
longfib(intn);
voidmain()
{
intn,i;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
printf(“%ld\n”,fib(i));
}
longfib(intn)
{
switch(n){
case0:
return(0);
case1:
case2:
return
(1);
}
return(fib(n-1)+fib(n-2));
}
[/codes]
再谈循环结构(FOR……ENDFOR,DOWHILE……ENDDO,SCAN……ENDSCAN)
1. FOR……ENDFOR 语句
格式:
FOR 循环变量=初值 TO 终值 [STEP 步长值]
循环体
ENDFOR 或 NEXT
执行过程:
① 将初值赋给循环变量;
② 判断循环变量的值是否超出终值;
③ 若超出终值,结束循环,执行NEXT后命令;
④ 若未超出终值,执行循环体;
⑤ 循环变量=循环变量+步长值;
⑥ 转到②,重复上述②~⑤步骤.
循环变量=初值
FOR
循环变量是否超过终值
语句组
循环变量=循环变量+步长
.F.
ENDFOR
.T.
当步长为正时,即为大于
当步长为负时,即为小于
例1 计算1~100之间所有的奇数和.
程序:
CLEAR
S=0
FOR I=1 TO 100 STEP 2
S=S+I
ENDFOR
S
例2 计算10!
.
程序1:
CLEAR
P=1
FOR I=1 TO 10
P=P*I
ENDFOR
P
程序2:
CLEAR
P=1
FOR I=10 TO 1 STEP -1
P=P*I
ENDFOR
P
例3 统计教师表中的男,女教师人数.
程序:
USE JS
STORE 0 TO M,W
FOR I=1 TO RECCOUNT()
IF XB="男"
M=M+1
ELSE
W=W+1
ENDIF
SKIP
ENDFOR
M,W
USE
说明:
FOR语句主要用于给定次数的循环.
循环开始语句为FOR,结束语句为ENDFOR.
通常,在循环体中不要改变循环变量的值,它将改变循环次数.
例:
FOR I=1 TO 10
I
I=I+1
ENDFOR
2. DO WHILE……ENDDO 语句
格式:
DO WHILE 条件表达式
循环体
ENDDO
说明:
当循环次数未知,需根据某一条件决定是否循环时使用.
循环体中一般须存在能改变循环条件的语句,用于正常退出循环.
DO WHILE
条件表达式
语句组
ENDDO
.F.
.T.
例 计算10!
.
程序:
N=1
P=1
DO WHILE N=20
REPLACE JBGZ WITH JBGZ+100
ELSE
REPLACE JBGZ WITH JBGZ+50
ENDIF
ENDSCAN
USE
例:
统计教师表中的男,女教师的人数.
程序:
USE JS
STORE 0 TO M,W
SCAN FOR XB="男"
M=M+1
ENDSCAN
W=RECCOUNT()-M
M, W
USE
4. EXIT命令和LOOP命令
EXIT语句是退出语句.
在循环体内,执行到它时,将退出循环,程序转到出口语句后执行.
LOOP语句称为短路语句.
在循环体内,执行到它时, 将跳过它和循环出口语句之间的所有命令,进入下一次循环.
………
EXIT
………
………
LOOP
………
例:
求1~100之间的非3的倍数的所有奇数和.
程序:
S=0
FOR I=1 TO 100 STEP 2
IF MOD(I,3)=0
LOOP
ENDIF
S=S+I
ENDFOR
S
例:
求10!
.
程序:
STORE 1 TO N,P
DO WHILE .T.
P=P*N
N=N+1
IF N>10
EXIT
ENDIF
ENDDO
P
编程.打印如右图形.
程序1:
clear
for i= 1 to 5
for j=1 to 7
"*"
endfor
endfor
*******
*******
*******
*******
*******
clear
for i= 1 to 5
for k=1 to 5-i
" "
endfor
for j=1 to 7
"*"
endfor
endfor
举例
例. 有一道趣味数学题:
有30个人在一家小饭店用餐,其中有男人,女人和小孩.每个男人花了3先令,每个女人花了2先令,每个小孩花了1先令,一共花去50先令.问男人,女人和小孩各有几人
分析:
设有男人,女人,小孩各x,y,z个.
则 x+y+z=30
3x+2y+z=50
它是不定方程.应采用"穷举法"去试根.
CLEAR
FOR X=1 TO 16
FOR Y=1 TO 24
Z=30-X-Y
IF 3*X+2*Y+Z=50
X,Y,Z
ENDIF
ENDFOR
ENDFOR
6.3 数 组(Array)
1. 将数据从表传送至数组
SCATTER
COPY TO ARRAY
SELECT-SQL
2. 将数据从数组传送至表
GATHER
APPEND FROM ARRAY
INSERT-SQL
数组的使用
例:
矩阵转置.即行列互换.
分析:
设数组a[2,3],
它的转置后的数组b[3,2].
如:
数组a:
1 2 3
4 5 6
转置后b:
1 4
2 5
3 6
CLEAR
PUBLIC A[2,3],B[3,2]
FOR I=1 TO 6
A[I]=I
ENDFOR
FOR I=1 TO 2
FOR J=1 TO 3
STR(A[ I,J ], 3)
ENDFOR
ENDFOR
"转置后的结果:
"
FOR I=1 TO 2
FOR J=1 TO 3
B[J,I]=A[I,J]
ENDFOR
ENDFOR
FOR I=1 TO 3
FOR J=1 TO 2
STR(B[I,J],3)
ENDFOR
ENDFOR
程序设计中,一个使用程序常有若干功能,编制程序时,需要将其模块化.每个模块完成不同功能.
一个模块常常是一个子程序.子程序是结构化程序设计的主要特点.
子程序可以是一个个独立的程序,过程或用户自定义函数,最后把它们组装到主程序中.
6.4 过程和用户自定义函数(UDF)
一,用户自定义函数创建和调用
① 用户自定义函数的创建
在项目管理器中创建
命令创建:
MODIFY COMMAND 文件名
② 用户自定义函数的存储
存储于独立的程序中或一般程序的底部
存储于过程文件中
存储于数据库的存储过程中
③ 用户自定义函数的格式
FUNCTION 函数名
[ PARAMETERS 形式参数 ]
语句序列
[ RETURN [返回值] ]
④ 用户自定义函数的调用
=函数名(实在参数值)
或 函数名(实在参数值)
例:
定义一个函数NC(),当传递给一个0~6之间的数时,返回对应的星期几.
FUNCTION NC
PARAMETER N
CLEAR
DO CASE
CASE N=0
M="星期日(Sunday) "
CASE N=1
M="星期一(Monday) "
CASE N=2
M="星期二(Tuesday) "
CASE N=3
M="星期三( Wednesday) "
CASE N=4
M="星期四(Thursday) "
CASE N=5
M="星期五(Friday) "
CASE N=6
M="星期六(Saturday) "
ENDCASE
RETURN M
二. 过程的创建和调用
过程的创建,存储同用户自定义函数操作.
过程的格式
PROCEDURE 过程名
[ PARAMETERS 形式参数 ]
语句序列
[ RETURN [返回值] ]
ENDPROC
过程的执行
DO 过程名 [ WITH 实在参数 ]
例:
编制一个过程,实现加1功能.
程序:
PROCEDURE PLUS
PARAMETER X
X=X+1
X
ENDPROC
调用:
DO PLUS WITH 4
或
PLUS(4)
说明:
1,用户自定义函数和过程在本质上是相同的,使用时主要看方便性.
2,系统默认过程调用按引用传递参数,
函数调用按值传递参数.
例:
在上例中,如果 N=4,则
执行:
DO PLUS WITH N
和
PLUS(N)
以后,N的结果不同.
三,子程序
子程序的调用命令为:
DO 子程序名 [ WITH 参数 ]
子程序还可以调用子程序,VFP中子程序的嵌套最多128层.
例:
x=3
y=5
s=0
do area with x,y,s
s
procedure area
parameter m,n,s1
s1=m*n
return
endpro
Exercise1.PRG Exercise2.PRG
USE JS USE JS
APPEND BLANK GO 5
BROWSE REPLACE GH WITH "B11111"
USE USE
S3.PRG S4.PRG
UPDATE JS SET ; A=3
JBGZ=JBGZ+100 B=4
C=A*B
A,B,C
F1.PRG Exercise3.PRG
C=3 USE JS
IF C%2=1 GO 3
"C是奇数" IF GL>20
ELSE REPLACE JBGZ WITH JBGZ+100
"C是偶数" ELSE
ENDIF REPLACE JBGZ WITH JBGZ+50
ENDIF
USE
……
D=B*B-4*A*C
DO CASE
CASE D>0
"方程有两个不等的实数根:
"
(-b+sqrt(d))/(2*a)
(-b-sqrt(d))/(2*a)
CASE D=0
"方程有两个相等的实数根:
"
(-b)/(2*a)
CASE D =90
"优秀"
CASE CJ>=80
"良好"
CASE CJ>=70
"中等"
CASE CJ>=60
"及格"
OTHERWISE
"不及格"
ENDCASE
USE
X3F.PRG X4F.PRG X5F.PRG
S=0 P=1 USE JS
FOR I=1 TO 100 STEP 2 FOR I=1 TO 10 N=0
S=S+I P=P*I M=0
ENDFOR ENDFOR FOR I=1 TO RECCOUNT()
S P IF XB="男"
N=N+1
ELSE
M=M+1
ENDIF
SKIP
ENDFOR
N,M
X6P.PRG
N=1
P=1
DO WHILE N=20 M=0
REPLACE JBGZ WITH JBGZ+100 SCAN FOR XB="男"
ELSE N=N+1
REPLACE JBGZ WITH JBGZ+50 ENDSCAN
ENDIF M=RECCOUNT()-N
ENDSCAN N,M
USE
X7D.PRG 求1~100之间的非3的倍数的所有奇数和.
N=1 S=0
P=1 FOR I=1 TO 100 STEP 2
DO WHILE .T. IF MOD(I,3)=0
P=P*N LOOP
N=N+1 ENDIF
IF N>10 S=S+I
EXIT ENDFOR
ENDIF S
ENDDO
P
程序设计语言一般都提供数组处理功能,VFP不仅提供了数组数据,而且还提供了数组和表之间传送数据等高级功能,可更方便地进行数据处理.
数组提供了一种快速排序信息的方法.如果信息保存在数组中,便可以很方便地对其进行检索,排序或其他的数据操作.
VFP对数组大小和类型不作任何限制,唯一限制就是可用内存空间的大小.和表不同,当使用程序结束时数组将不复存在.
SCATTER将一张表记录数据传送至数组;COPY TO ARRAY将一系列记录中的数据传至数组;SELECT—SQL可以传输查询结果到数组中.
SCATTER传送当前表当前记录的数据,而COPY TO ARRAY 可以传送当前表中多条记录的数据.
GATHER 将数组中数据传送至当前表的当前记录.Gather from …..
INSERT—SQL不需要打开表,新增一条记录,并将数组中的数据传送至此记录.
表达式已能很好地对VFP中的数据进行操作,若需进一步扩展处理数据的能力,通过使用自定义函数,数组,字段和记录,类和对象以及空值等可以进一步扩展VFP的数据操作能力.
用户自定义函数扩充VFP5.0语言,通过自定义来为自己的使用程序建立一些专用函数.这样就不必多次编写代码,只需调用这个过程即可.这样减少了代码量,也使程序更易读易维护.这正是结构化程序设计方法的精髓所在.
但,VFP支持OOP设计方法,其精髓是类和对象的使用.因此这种设计方法只能用于一般的程序文件或对象的事件和方法代码中.使用VFP5.0进行程序设计时,应尽量使用类的继承性来实现功能的重用.
在UDF 的末尾,即在用户自定义函数的格式中,RETURN返回一个值给调用程序, 省略了RETURN,则缺省的返回值为真.
例:
打开存储过程,将函数置入其中:
function ntoe
parameters pdigit
local cstring
cstring="ABCDEFGHIJ"
return substr(cstring,pdigit+1,1)
endfunc
调用时:
ntoe(3)
D
为了使自定义过程或函数具有一定的灵活性,可以向过程或函数传递一些参数,使得函数根据接收到的不同参数返回不同的值.
为了使一个UDF能够接受一定的参数,在PROCEDURE或FUNCTION命令后面的第一个可执行语句必须是PARAMETERS语句.参数指定接受数据的内存变量或数组的列表.其中的参数用逗号分隔,最多可传递27个参数.
当使用DO命令调用一个过程时,可以使用WITH子句传递参数;按函数方式调用时,则在括号内填写相应的参数.DO中的参数个数可和过程中个数相等或少于.
参数传递方式有两种:
按引用传递或按值传递.
按引用传递是将作为参数的变量和数组元素的地址传递给UDF,当参数的值在被调用过程中更改时,新值传递回调用程序中相关的变量或数组元素.
按值传递是把变量和数组元素的值直接传递给UDF,当UDF中参数的值发生变化时,原来的变量或数组元素的值不发生变化.
可以使用SET UDFPARMS TO 命令来改变参数传递方式:
SET UDFPARMS TO REFERENCE|VALUE
Set udfprams to value|reference function plusone
store 1 to n parameters z
plusone(n) z=z+1
n return z
2,1 2,2
子程序
一个使用程序的子模块功能可用子程序,过程或用户自定义函数实现,然后将它们组装到一个主程序中.
在一个程序中,可以用DO命令调用其他的程序.一个主程序可以调用任意多个子程序.子程序还可再调用其他的子程序,最多允许嵌套的DO调用层数为128层.
在学号的文本框1的lostfocus事件里写入
locate for thisform.文本框1.value = 学号
if found() = .t.
thisform.文本框2.value = 姓名
thisform.文本框3.value = 班级
else
thisform.文本框2.value = ""
thisform.文本框3.value = ""
messagebox("没有找到!
",0 + 16)
endif
测试编程,教教我
2.设计一个程序,它的功能是统计学生基本情况表中男生和女生的人数,并分别显示出来。
4.设计一个程序,他的功能是针对学生成绩表,计算数学英语语文的平均成绩填入综合成绩字段,总分填入总分成绩字段。
当用户输入学号时,显示该学生的学号,数学,英语,语文和总分成绩和综合成绩。
5.设计一个程序,他的功能是当用户输入一个四位数时,显示该数的千位数,百位数,十位数和个位数分别是什么。
第二题:
set talk off
set safety off
close all
clear
a=0
b=0
use 学生基本情况表
do while not eof()
if 性别="男"
a=a+1
else
b=b+1
endif
skip
enddo
?
"最后统计出的男生人数为:
"+str(a,2)
?
"最后统计出的女生人数为:
"+str(b,2)
use
set talk on
set safety on
这是我VFP的课程设计,数据表,表单,报表。
都有了,代码也有了,只是哪里不对,我也没查出来,无法顺利运行,有哪位大哥大姐能帮我看看,最好能修改下,在9号下午前就得交了,急啊,不甚感激啊!
我的QQ是84977809,,好的话请联系我
这是后面修改过的了,问题少了许多了,不过还是有问题,请再给我看下
第一张图显示,你程序设定路径为绝对路径,如果把你的程序放到非C盘都无法运行的。
do form frm_login
而你后一句是打开一个表单,但你的表单又放在FORMS文件夹内,所以是否应把路径设为:
Set Defa To (Sys(5)+Curdir())+"forms\"
[upload=jpg,2008-6-8 11:
54:
38,85.68K)
第二张图画圈处显示你这个控件绑定了一个叫SYS.DBF的表,但你的表单并没有打开这个表。
图片附件:
2-8741.jpg(2008-6-8 12:
02:
44,28.64K)
片附件:
2-8741.jpg(2008-6-8 12:
08:
06,46.24K)
如图所示:
COMBO1控件明明是绑定BH字段,你为什么会用XM字段去找呢?
单击"判断"(command2)按钮判断用户在TEXT3中输入的值是否是TEXT1和TEXT2的内容之和,若不是,则在LABEL3中显示"你的计算有误",若是,则判断TEXT3中的数是否为"水仙花数",若是,则在LABEL3中显示"是",否则显示"不是".
请大家帮帮忙!
谢谢!
在判断按钮的CLICK中写以下代码:
if thisform.text3.value<>thisform.text1.value+thisform.text2.value
thisform.label3.caption='你的计算有误'
else
if thisform.text3.value=水仙花数 &&水仙花数在这里应是数字
thisform.label3.caption='是'
else
thisform.label3.caption=''
endif
编程,要求从键盘输入10个数,把它们按照从大到小的顺序输出.
大胆的说出来,错了不要紧,呵呵
我试一下
deme n(10) 定义一个装10个数的数组
input "请输入第1个数:
" to a
n
(1)=a
for i=2 to 10
input "请输入第"+&(i)+"个数:
" to a
for j=1 to i-1
if n(j)>a
t=a(j)
a(j)=a
a(j+1)=t
else loop
end if
endf
endf
for i=1 to 10
?
n(i)
endf
&&表单位使用了 一个文本框 \两个命令按钮
&&
IF thisform.text1.Value='175311100' &&登陆用的密码
c_warr='注意:
本次操作要满足以下条件,请逐一核对,如有任何一项不满足,不得进行!
!
'+CHR(13)+CHR(13)
ki=MESSAGEBOX(c_warr,1+48+256+4096,"警告:
")
IF ki=1
m_hbsjk.Visible= .T.
ELSE
thisform.Release
RETURN
ENDIF
ELSE
thisform.text1.SetFocus
ENDIF
这是做好了界面第样子
1 在表单中添加2个标签,2个文本框和2个命令按扭.
2 caption属性名 设置为用户名
3 caption属性 就是在表单上添加的空间改名字
4 将确定按钮的default的属性设置为.T.
5 在设置文本框text2的inputmask属性值,在设置框中输入999999 (设置后密码只能输入数字)
6 接着设置文本框text2的passwordchar属性为"*"
7 选择"表单"下的"新建属性"命令,打开"新建属性"对话框,为表单添加新属性 NUMC 在"属性"窗口中 将NUMC的默认值设置为0
8 用鼠标双击"确定"按钮,打开编辑事件代码窗口,在click时间中输入下面代码:
if thisform.text1.value="xunxun"and thisform.text2.value="123456"
wait"欢迎使用VF……"
window timeout 2
else
thisform.numc=thisform.numc+1
if thisform.numc=3
wait"用户名或密码不对,登陆失败..2秒后自动退出程序!
!
"window timeout 2
thisform.release
else
wait"用户名或密码不对,请重新输入..!
!
"window timeout 2
endif
endif
ctlr+w存盘
9 用鼠标双击"退出"按钮,打开编辑事件代码窗口,在click时间中输入下面代码:
thisform.release
ctlr+w存盘
这样就搞定了..
do form 文件名.scx
S=2!
+4!
+6!
+8!
+.....N!
求S
input "输入数:
" to n
s=0
for a=2 to n step 2
c=1
for b=1 to a
c=c*b
endfor
s=s+c
endfor
?
"s=",s
从键盘输入N个数(N=10,10个数分别为2,-3,0,4,-1.5,0.8,3.95,-5.26,1,1.9)编程求最大数和最小