1、1,第七章,VFP程序设计基础,2,#DEFINE PI 3.1415926 R=6 R=R/2 S=PI*R*R L=2*PI*R ?S ?L,引 言,3,程序 为了完成某一具体任务而编写的一系列指令 程序设计 编写程序的过程 优点 自动执行多条命令 可被修改,可多次运行 可调用其他程序,4,7.1 创建、修改和运行应用程序,创建 项目管理器 菜单“新建” MODIFY COMMAND VFP程序行的规则 一个命令行内只能写一条命令 一个命令行可由若干物理行组成 采用“缩进”格式书写,扩展名为.PRG,5,修改 “打开”/“修改”按钮 MODIFY COMMAND 运行“运行”按钮 DO &
2、扩展名为.prg,6,7.2 Visual FoxPro基本语法结构,7.2.1 常用命令 ?/? SAY 表达式 CLEAR NOTE/*/& STORE 表达式 TO 变量1,变量2,. WAIT WINDOWS TO 变量 INPUT TO 变量 ACCEPT TO 变量,7,例1: Use js Append blank Edit,7.2.2 顺序结构程序设计 按程序中的语句顺序执行,8,例2:交换两个变量的值 input “please enter a:” to a input “please enter b:” to b c=a a=b b=c ?a,b,9,例3:任意输入一个年份
3、,计算出对应的生肖,csx=“猴鸡狗猪鼠牛虎兔龙蛇马羊” csx=“猴鸡狗猪鼠牛虎兔龙蛇马羊“ input “please enter a:“ to a b=mod(a,12) c=substr(csx,2*b+1,2) ?str(a,4)+“对应的生肖是:“+c,10,7.2.3 分支结构程序设计 根据条件的测试结果执行不同的操作。IFELSEENDIFDO CASEENDCASE,格式1 IF 条件表达式命令组1 ENDIF,11,例1 CLEAR WAIT WINDOW “请按数字键09!” TO cnumkey IF VAL(cnumkey)=5?”按的数字键为:”+cnumkey E
4、NDIF,12,例2,input to x If x=0y=x+10?y endif if x-3y=2*x?y Endif,13,格式2 IF 条件表达式命令组1ELSE命令组2 ENDIF,14,例3.输入三角形的三边,求三角形的面积,input to a input to b input to c if a+bc and a+cb and b+cap=(a+b+c)/2s=sqrt(p*(p-a)*(p-b)*(p-c)?s else?”不能构成一个三角形” endif,15,例4. X (x=10),Input to x if x1 y=x elseif x10y=2*x-1elsey
5、=3*x-11endif endif ?y,16,DO CASEENDCASE DO CASECASE 条件表达式1命令组1CASE 条件表达式2命令组2 OTHERWISE其他命令组 ENDCASE,17,18,例.任意输入一个不超过5位的正整数,编程输出它是几位数,并分别打印它的每一位数,Input to x do casecase x=10000y=5case x=1000y=4case x=100y=3case x=10y=2otherwisey=1 endcase,19,a=int(x/10000) b=int(x-a*10000)/1000) c=int(x-a*10000-b*1
6、000)/100) d=int(x-a*10000-b*1000-c*100)/10) e=x-a*10000-b*1000-c*100-d*10 do case case y=5?“这是一个5位数:”,a,b,c,d,ecase y=1? “这是一个1位数:”,e endcase,20,1.求ax2+bx+c的根,其中a,b,c由键盘输入 2.键盘输入3个整数,按由小到大的顺序输出,21,Delta=b*b-4*a*c DO CASE CASE delta0?“方程有两个不等的实数根:”?(-b+sqrt(delta)/(2*a)? (-b-sqrt(delta)/(2*a)CASE del
7、ta=0 ?“方程有两个相等的实数根:”? b/(2*a) CASE delta0 ?“方程有两个复根:”real_part=-b/(2*a)img_part=sqrt(-delta)/(2*a) ?alltrim(str(real_part)+”+”+alltrim(str(img_part)+”I” ?alltrim(str(real_part)+”-”+alltrim(str(img_part)+”I” ENDCASE,22,7.2.4 循环结构程序设计 循环能重复执行一组语句 这组语句称为循环体,SCANENDSCAN FORENDFOR DO WHILEENDDO,23,SCANEN
8、DSCAN,SCAN FORWHILEENDSCAN,适用于对表中记录进行处理 自动将记录指针移到下一条满足条件的记录,24,例 显示JS表中全部记录的jsgh,jsxm Use js scan ?js.jsgh ,js.jsxm endscan use,25,例 显示JS表中记录号为偶数的jsgh,jsxm Use js scan for recno()%2=0?js.jsgh ,js.jsxm endscan use,26,FOR = TO STEP ENDFOR / NEXT适用于已知循环次数的场合,FORENDFOR,27,当步长为正时,即为大于 当步长为负时,即为小于,For i=1
9、 to 3 step 1?i endfor,1,2,3,28,1. For i=10 to 2 step -3?iendfor,2. For j=3 to 5 step -2?jendfor,29,例 计算1100之间所有的奇数和,s=0 for i=1 to 100 step 2s=s+i endfor ?s,30,例 计算10!,p=1 for i=1 to 10p=p*i endfor ?p,31,改错题1. 下列程序的功能是:将一个字符串中的各个单词的首字母组成其缩写形式(大写字母),其中,字符串由多个英文单词组成且各单词之间用一个空格分隔,例如,对于字符串“central proce
10、ssing unit”,生成其缩写形式“CPU”。 其基本算法为:字符串左边加一个空格,然后依次检查字符串的每一个字符,如果该字符串为字母且左边为空格,则该字母为首字母。,32,cString=“central processing unit“ cString=SPACE(1)+UPPER(cString) cResult=SPACE(0) FOR n=2 TO cString c=SUBSTR(cString ,n ,1)If between(c,“A“,“Z“) AND SUBSTR(cString ,n-1,1)=SPACE(1)cResult=cResult+n ENDIF ENDFO
11、R Wait windows “缩写形式为“+cResult,33,改错题2. 将二进制的数转换成十进数的表示。 nNumber=1011001 &认定它为二进制数 cNumber=ALLTRIM(STR(nNumber) nResult=0 FOR n=LEN(cNumber) TO 1c=LEFT(cNumber,1)IF c=“0“nResult=nResult*2+1ELSEnResult=nResult*2ENDIFcNumber=SUBSTR(cNumber,2) ENDFOR WAIT WINDOWS “十进制数表示为“+STR(nResult),34,改错题3.下列程序的功能是
12、计算分数数列2/1,3/2,5/3 ,8/5, m/n, m+n/m的前20项之和。,nSum=0 m=2 &数列中第一项的分子 n=1 &数列中第一项的分母 FOR x=1 to 20nSum=nSum+m/xy=mm=m+nn=y ENDDO Wait window前20项之和为 +str(nSum,10,2),35,改错题4下列程序的功能是统计所有的“水仙花数”的个数.(“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如153=13+33+53),ncount=1 for n=100 to 999n1=val(substr(str(n,3),3,1)n2=val(substr
13、(str(n,3),2,1)n3=val(substr(str(n,3),1,1)if n13+n23+n33=nncount=ncount+1endifendforwait windows ”水仙花数”的个数为+ncount,36,DO WHILEENDDO DO WHILE 条件表达式循环体ENDDO 适用于循环次数未知的情况,37,38,例:判断以下程序的运行结果s=0i=1do while i=100s=s+ii=i+1enddo?s,39,s=“ABCDEF” n=len(s) k=1 do while k=n?subs(s,k,n-k)k=k+1 enddo,40,例:设有一张足够
14、大的纸,厚0.09mm,问将它对折多少次以后可以达到珠穆朗玛峰(8848米)的高度?,x=0.09*10(-3) y=0 do while x=8848x=2*xy=y+1 enddo ?“对折后的高度是:“,x ?“对折了“,y,“次“,41,例:任意产生100个01之间的随机数,统计大于0.5和小于0.5的数的个数.,x=0 y=0 i=1 do while i0.5x=x+1elsey=y+1endifi=i+1enddo,?“大于0.5的个数:“,x ?“小于0.5的个数:“,y,42,例.统计一个字符串中包括多少个汉字 cString=“微软(Microsoft)的视窗(Window
15、s)操作系统“ nCount=0 Do while LEN (cString)0 If ASC(left(cString ,1)127nCount=nCount+1cString=SUBSTR(cString,3)ElsecString=SUBSTR(cString,2) Endif Enddo Wait windows “汉字个数为“+str(nCount),43,LOOP命令和EXIT命令,LOOP命令(短路语句) 求1100之间非3的倍数的所有奇数之和S=0FOR I=1 TO 100 STEP 2IF MOD(I,3)=0LOOPENDIFS=S+IENDFOR,44,EXIT命令(退
16、出语句)随机产生一个7080之间的数x=0do while .t.x=rand()*100if x70 and x80exitendifenddo,45,双重循环,计算 S=1!+2!+3!+20! s=0For i=1 to 20 p=1for j=1 to ip=p*jnext js=s+p next i (可以用单循环),46,S=0 P=1 FOR I=1 TO 20 P=P*I S=S+P NEXT I,47,编写打印乘法表的程序,CLEAR ?“ “ FOR A=1 TO 9FOR B=1 TO AS=A*B?STR(A,1)+“*“+STR(B,1)+“=“+STR(S,2)+“
17、 “ ENDFOR ?“ “ ENDFOR,48,求之间的素数,x=0 FOR M=3 TO 200 STEP 2N=INT(SQRT(M)FOR I=2 TO NIF M=INT(M/I)*IEXITENDIFENDFORIF IN?“ “+STR(M,4)ENDIF ENDFOR,49,利用循环打印图形,* *,For i=1 to 4i,50-i say ”*” endfor,*,For i=1 to 5for j=1 to 2*i-1i,50-i+j say “*”endfor endfor,50,数组的使用 由一系列被称为元素的有序数据值构成 用序号引用这些元素数组名下标 数组名下标
18、1,下标2数组必须先定义,后使用 1. 数组的定义 DECLARE 数组名空间大小 &定义私有数组 DIMENSION 数组名空间大小 &定义私有数组 PUBLIC 数组名空间大小 &定义全局数组 LOCAL 数组名空间大小 &定义局部数组,51,2. 数组的使用定义后的数组自动被赋予.F.值例如 DIMENSION A5,5A=25 &对所有元素赋值A2,2=4A2,3=“abc”A3,3=.T.A4,4=10/01/1949DISP MEMORY,52,产生50个随机数 DIMENSION A(50), B(5,10) FOR I=1 TO 50 A(I)=RAND() ENDFOR FO
19、R I=1 TO 5 FOR J=1 TO 10 B(I,J)=RAND() NEXT J NEXT I,53,产生10个(1050)之间的随机整数。 DIMENSION X(10) FOR I=1 TO 10 N=5 &赋初值 DO WHILE N50 N=INT(RAND()*100) ENDDO X(I)=N ENDFOR,54,求Fibonacci数列的前40项1,1,2,3,5,8,13,。dime a40a1=1a2=1?a1,a2for i=3 to 40ai=ai-1+ai-2?aiendfor,55,将数组A(10)中的10个元素按升序进行排序。(2,6,4,8,19,3,7
20、,5,20,13)FOR I=1 TO 10 FOR J=I+1 TO 10 IF A(I) A(J) T=A(I) A(I)=A(J) A(J)=T ENDIF ENDFOR ENDFOR 思考:降序如何处理?,56,打印杨辉三角11 11 2 11 3 3 1 1 4 6 4 1,57,clear DIME b10,10 FOR i=1 to 10bi,1=1bi,i=1 ENDFOR FOR i=3 to 10FOR j=2 to i-1bi,j=bi-1,j+bi-1,j-1ENDFOR ENDFOR,FOR i=1 to 10FOR j=1 to ii,47-3*i+6*j say
21、str(bi,j,6)ENDFOR ENDFOR,58,多次重复执行,有特定功能的一段代码 1. 过程的定义与调用 定义PROCEDURE 过程名PARAMETERS 参数列表语句序列RETURN 返回值ENDPROC 调用DO 过程名 WITH 参数列表 ,7.4 过程和用户自定义函数,59,例?“我是主程序!“do a1do a2proc a1?“我是子程序1!“endprocproc a2?“我是子程序2!“ endproc,60,例 s=0 a=3 b=4 do area with s,a,b ?s proc areapara s1,x,ys1=x*yreturn s1 endproc
22、,61,2. 自定义函数的定义与调用 定义FUNCTION 函数名PARAMETERS 参数列表语句序列RETURN 返回值ENDFUNC 调用=函数名(参数值),62,存储 独立的程序文件中或一般程序的底部 过程文件 数据库的存储过程若存于独立文件中,则SET PROCEDURE TO 程序名,63,例:编写程序p2 FUNCTION ntocPARAMETERS pDigitcString=“零一二三四五六七八九“RETURN substr(cString, pDigit*2+1, 2) ENDFUNCSet proc to p2 ?ntoc(4),64,求3!+5!+8!,Clear ?
23、jc(3)+jc(5)+jc(8) FUNCTION jcPARA ap=1FOR j=1 to ap=p*jendforreturn p ENDFUNC,65,例:求1100之间的孪生素数,Clear FOR i=3 to 100 step 2IF prime(i) and prime(i+2)?i,i+2ENDIF ENDFOR,FUNCTION primePARA aFOR j=2 to a-1IF mod(a,j)=0EXITENDIFENDFORIF ja-1RETURN .t.ELSERETURN .f.ENDIF ENDFUNC,66,参数传递的方式默认过程调用按引用传递参数函数调用按值传递参数 改变参数传递的方式 用括号括起一个变量,按值传递; 在一个变量前加 符号,按引用传递 SET UDFPARMS TO REFERENCE SET UDFPARMS TO VALUE,67,定义:function plusoneparameters aa=a+1return a Endfunc 调用:c=3 c=3 Plusone(c) set udfparms to reference?c plusone(c)?c,