VF基础教程参考模板_第1页
VF基础教程参考模板_第2页
VF基础教程参考模板_第3页
VF基础教程参考模板_第4页
VF基础教程参考模板_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、菜鸟学习VFP前言大学的暑假是珍贵的,像我这样暑假呆在家里面,整天无所事事的同学不在少数,为了应付枯燥乏味的暑假,我决定在暑假学习一些知识,挑来挑去还是觉得选VFP比较有意义,因为这门科需要过二级,相信许多看到这篇文章的朋友也要过二级,那么我们大家就从今天开始共同学习吧。所以从今天起,我的网上VFP学习课程便开张了,希望我能写完。说起为什么会开这个专题,我相信很多读者都有疑问,学习就学习是了,干嘛还将自己的学习成果放到网上来?我在这里要澄清一下,之所以我会选择这样做,是因为我觉得一个人在家里面学习太没有那种气氛了,我希望能够放到网上来,大家看着想着,遇到问题大家可以在一起讨论,在一起互相提意见

2、,还有就是希望能够帮到有心学习VFP,但是却觉得枯燥乏味而放弃的朋友。在更新期间,我将在我的QQ空间(首先要说明的是本文仅针对上机考试编写,让你能够在计算机上完成初级的数据库程序开发。关于理论的请多阅读教材。另外是针对VFP的初学者,也就是菜鸟级人物来学习,为了应付随之而来的省和国家二级VFP考试的同学使用,如果是VFP数据库专业人员来这里的话,希望多提提意见,不要见笑,错误之处,还请指正,就此拜谢!呵呵。VFP是microsoft公司开发的一款数据库管理系统(DBMS),全称是Visual FoxPro。作为二级考试科目的是采用关系数据库系统Visual FoxPro 6.0 (为了区分版本

3、,在以后的文章中简称为VF6),VF6是小型数据库管理系统的杰作,它以强大的性能,完整而又丰富的工具,较高的处理速度,友好的界面以及较完备的兼容性等特点,备受广大用户的欢迎。(注:该段内容来自国家二级考试VFP课本前言高等教育出版社出版)好了,套话到此结束,本来上面的那一段话不想写的,然后又觉得至少把出处点明,在吹吹牛,说VFP多好多好,毕竟人家公司开发这系统也不容易。由于VF6毕竟作为一门课程来学习,枯燥乏味在所难免,但在这里,我尽量用友好,和谐,幽默的语言来面对大家,希望给赏光的读者带来一个愉快又充实的暑假。第一次写前言,写的不好,大家请多多海涵,不要留言骂我1 / 109第一天:VF6编

4、程基础(一) VFP程序安装简要说明在正式写这一课之前,我想先讲一下VF6程序安装说明,当然看到这儿的读者的电脑里面可能已经安装了VF6,那么本节可以略去直接看下一节。其实正版的图书里面大都是说买什么microsoft visual studio 套件包含有四个编程软件什么的,总的来说,在我们国家的情况下,这些在我看来纯属废话,就让写这句话的人自己去买,他都不一定干。归根究底还是咱国家的盗版太猖獗了,网络管制虽说最近见好,但是哪有那么容易彻底呢,所以大家可以利用你的网络优势,马上去百度吧,这里需要说明的是一般done下来的压缩包解压后是一个文件夹,我相信以你的电脑能够达到安装VF6的最低配置要

5、求,双击SETUP安装,写序列号的那儿都填1吧,如图所示。然后直接点“下一步”,选择典型安装就行,最后会提示安装MSDN,直接不睬他,我们不需要,安装好之后便可以进入课程学习了。对于盗版,我也无语了,知识产权在我们国家很难受保护,是政府的打击力度不够大吗?怪不得游戏市场在中国没有盗版就没有市场是一条铁定法则了。2.VF6编程基础纵观VF6,只有这一部分可以独立出来学习了,咱们现在关于什么是数据库,什么是二维表,什么是表单,等不懂没有关系,先通过学习编程来了解一下程序设计语言,这对以后的SQL语言学习,面向对象程序设计,菜单,报表等设计都有很大的好处。既然是基础,那就是从变量,常量开始说起,这两

6、个概念,相信学过数学的人都懂,但是在计算机程序语言关于常量的概念中加入了数据类型这么个要素,相信这也不难理解,以下的,我们死记硬背:VF6中的常量有:数值型(N),字符型(C),货币型(Y),日期型(D),日期时间型(T),逻辑型(L)。在这里不要把表的记录形式弄混了,表的记录类型中还有浮点型(F),双精度型(B),整型(I),备注型(M)和通用型(G)。我在这儿点出来了,希望读者能够给予注意。关于常量的类型,我觉得没啥好说的,书上讲了一大堆,其实只要看常量名就能知道数据的大致内容了,这里有必要说一下逻辑型的数据只有”.T.”和” .F.”两种,即是和否,然后说一下,在程序中将这些常量数据赋给

7、变量的时候必须加定界符,下面举例说明:(1)将数值型赋给变量:store 23 to x 即直接赋值,无需加定界符。(2)将字符型赋给变量:store “你好” to y ,即需要在数据两边加上一对引号,可以是双引号,也可以是单引号,一般也可以以括号的形式赋值,如x = 你好.(3)将货币型赋给变量:store $100 to z ,即在数字前面加上”$”.其他的细节参阅书本,在此不做详细介绍(不是我懒,实在没这必要)。 (4)将日期型赋给变量:store 1990-08-20 to w ,即在数据上加一对大括号,然后数据前方加上“”,这是严格的日期格式,还有传统的日期格式:08/20/90

8、08-20-199008 20 1990 等。然后日期的显示格式都是可调的,比如年份的位数,月日年,年月日,日期间隔符号等。比如:set century on/off set date to ymd (year month date ) set mark to “-“ 这容易套吧?以后所有的语句我都是通过举例的方式来让读者套用,而不像书上直接把公式写出来,很是晦涩。 (5)日期时间型赋给变量:store 1990-08-20,02:38a to r /将时间02:38 AM赋给变量。 (6)前面讲过了,我不讲了。其实这么多,我觉得也不是太重要,当然这是针对上机,理论中还是要掌握的,见教材第二章

9、前面。常量说了这么多,相信大家也能够了解个大概了,有的教材上说了很多,没关系,现在只要把上面所说的背下就OK,等你编程有一定基础了回来看就会觉得简单多了。下面说说变量,变量名要求啦,等等见书本,咱们上机之需要一个字母搞定!然后就是数组,再下看来数组这玩意比普通变量稍微复杂,不过也就稍微那么一点点,看我通过举例道来Dimension x(3) 这样就定义了一个一维数组,包含三个变量,即x(1),x(2),x(3).Dimension x(2,2) 这样便定义了一个二维数组,包含四个变量,即x(1,1), x(1,2), x(2,1), x(2,2)。整个数组的数据类型为A(array)array

10、为英文数组的说法。实际在编程中经常会遇到一维数组的使用,二维数组较复杂,编程题中较罕见,有兴趣去翻一些专业的教材。在后面的编程题中,我会通过举例的方式来使用一维数组。下面我们共同学习程序中的表达式,先学习最简单的数学表达式。加,减,乘,除分别对应于“+”,“-”,“*”,“/” 次方是数字前面加一个”,然后加上幂数。或者是数后面用两个乘号,如 6的三次方为 63 或者 6*3 ,根号同样可以写成幂指数。最后是求余公式“%” 如:8%3=2 ,还有括号的用法和数学类似括起来就是将某个表达式单独运算,如:6(1/2)=2.45 (默认保留两位小数), 其他的我们菜鸟暂时不用掌握。怎么样?简单吧,数

11、学公式中用上面的几个符号就可以表达出来了。还有字符表达式,等在高等教育出版社出版的二级VFP教程上第56页有详细的介绍,先去翻课本。翻完后再继续回来看。下面将所学的内容复习一下,以上所说的内容实例见下图,大家在看完后,最好也先能实际操作一下,(所有标点符号用西文状态下的!)好了,大家书本上的知识都看完了吧,相信我们都对常量,变量,表达式有了初步的了解,下面进入程序的基本组成元素,函数。函数分为数值函数,字符函数,日期时间函数,数据类型转换函数,测试函数,在教材的61页,再去看书吧(真的不是我懒,实在是不需要,我写的这玩意只是教程,不是教才,这些基础的必须要通过书本来掌握,如果这些我都写那整个暑

12、假都是不够的,所以关于函数,在程序中遇到,就会有详细的解释)今天是第一天,说的内容不多,其实也没啥好说的,希望读者能够把常量的几种类型,变量,以及数组,表达式,函数,等牢记于心,明天我们正式讲简单的VFP程序编写。哦,很晚了呢,我想去困觉了,今晚开始准备写这玩意,希望我能一直写下去,如果大家支持的话,我会很高兴的,如果没有人支持,我也要一直坚持下去。第二天:VF6编程基础(二)昨天较为简单的说明了程序语言中常量,变量,以及函数表达式等程序体的基本元素,今天我们正式说明在VF6中最基本的面向过程程序语言编写。其实在我看来,程序语言就是许多个表达式连在一起而组成的特定的格式的文本,例如我们在小学里

13、经常会遇到这样的数学题:小明在二个小时走了8km的路程,问你小明家离学校有2km,需要多少时间才能到?我们现在可能会直接就写出答案了,说来惭愧,那个时候我上小学的时候最怕遇到此类应用题,当时我们会先写出公式算出每小时走多远,然后在拿2除以这个每小时走的路程。得到的就是我们想要的答案:具体写出来就是: 8÷2=4(千米)2÷4=0.5(小时)这个就是我们当时的解题步骤,最后不要忘了答一下,呵呵。当然这个比较简单,今天我们想要说的是程序,就假设我们来编程算这个应用题,我们的思路和上面的一样,只是用VFP的程序语言,首先,我们在程序语言里面经常会先清除窗口内容,即clear ,所

14、以我们在做编程题的时候,这个一般不重要,这个clear可要可不要,在程序结束处还有个RETURN,这在我们平时的编程里面也是可有可无的,它的作用是返回调用它的上级程序,在一些大的程序里面那就必须引起足够的重视。我们在编程的过程中我们得到了另外的常量4和最后的结果,因此我们需要两个变量来存储它们,意思就是给它找个代号,在表达式中引用它。最后要说明的是输出号是“?”和“?”前一个是在主程序中换行输出,后一个是不换行输出。一次性可以同时输出多个结果,将这些变量和常量之间用“,”号或空格隔开。当然在输出常量的时候记得加上定界符!下面我们把上面的转换成为VFP程序语言。双击打开VF6,然后点文件-新建-

15、程序-新建文件,或者在命令窗口中输入modi command然后输入程序语言,输入完毕后点程序-运行,或者直接点工具栏上的感叹号,首先系统会提示你先保存,这里说一下,在以后的程序文件和数据库文件中,我的位置是在E盘vfp文件夹,建议大家使用同样的文件名,文件路径和文件夹。*cx1ClearT=8/2 &&算出中间值,用T存储S=2/t &&得出结果,存储在变量s中?”需要”,s,”小时”Return说明一下,这里以*号开头的一行,以及每行&&后面的部分均为解释说明,不参与运行,因此读者在输入程序时可以把这些忽略掉。程序及其运行结果如图所示:好了,

16、这就是我今晚要说明的第一个程序,虽然非常简单(简单到什么程度呢?没有用到函数,没有用到程序语言,甚至表达式一步就能搞定:s=2/(8/2),呵呵。),我却花了很多的文字,目的是希望大家都能看懂,这样我也会倍感欣慰,有必要说明一下,在以后的程序编写中,如果大家有更好的方法,希望你能以留言的方式告知与我,感激不尽)上面只是为程序开了个头,下面我们继续,这次我们来编这个老掉牙的程序,给你一个半径,算出圆的周长与面积:圆的周长为:C=2r 圆的面积为:s=r2 这里我们需要用到一个函数,圆周率函数,相信我们在昨天已经记得这个函数了:PI() 它就是得到圆周率的函数可以直接当一个常量来使用。然后我们需要

17、从键盘接受一个值作为半径,我们用r来存储这个值。然后接收数据在VF6中有两种input 和 accept 前一种可以接收任何类型的常量,但需要加上定界符,后一个不管输入什么都是当成字符型(C)常量来对待。好了,下面看程序体:*cx2ClearInput “请输入圆的半径” to r &&接收圆的半径值。引号里面的内容显示在主窗口。C=2*pi()*r &&算出圆的周长S=pi()*r2 &&算出圆的面积?”圆的周长是:”,c,”圆的面积是:”,sReturn在这里啰嗦一句,大家在试验这些程序的时候最好自己敲,不要复制,因为敲程序也是一项技术活。好

18、了,程序及其运行结果如图所示:下面我们引进一个程序体里面的判断语句,通俗一点讲就是如果这样我该干哪些事,如果不是这样是那样我又该哪些事,如果不是这样又不是那样是其他的样子,我又该干哪些事这个语句就是if语句和case语句,本人看来其实还是case语句要简单的多,但其实二者都不难理解,只不过在条件比较多的时候,if显的要麻烦一点。下面我通过举例的方式来说明程序中这两条语句的使用。从键盘接收一个数据,判断这个数据的类型,并输出。我们在前面已经讲过了,VFP常量有六种基本类型,vartype函数可以返回这些数据的类型,其中有一个.null.值比较特殊,空值在普通的情况下返回的是X表明是空值如vart

19、ype(.null.)=”X”,但如果在函数后面加上一个.t.的逻辑表达式,如vartype(.null.,.t.)则会返回L表明该数据为逻辑型,vartype函数返回的是字符型,因此在程序中必须将vartype返回的值加上定界符引号,此外此函数还可以返回通用型,未定义型等,这些可以不用掌握,如感兴趣可以上网搜索。下面我们先用if语言做:*cx3clearInput”请键入数据:” to aIf vartype(a)=”C” &&表面输入的数据是字符型,下同 ?”这个数据是字符型”Else If vartype(a)=”N” ?”这个数据是数值型” Else If vartyp

20、e(a)=”L” or vartype(a)=”X” ?”这个数据是逻辑型” Else If vartype(a)=”D” ?”这个数据是日期型” Else If vartype(a)=”T” ?”这个数据是日期时间型” Else ?”这个数据是货币型” Endif Endif Endif EndifEndifReturnIf 与endif 是成对出现的,也就是从里向外一一配对,在程序体中,我将各级语言之间空了两个字符格,这也是笔试部分对程序语言的书写要求,然后我来随便解释一下,if就是如果是这样,else就是如果不是这样,else里面的if就是如果不是这样但是那样,if下面的else就是如果

21、不是这样也不是那样,else 下面的if是如果不是这样也不是那样,而是另一个样子的意思好了,简单吧,还有更简单的,那就是用case语句来写,case语言必须先有个头DO CASE,意思就是从现在开始做选择,然后case 这样,case 那样,最后都不是那就是OTHERWISE ,然后别忘了,下个结束命令 ENDCASECASE语言的程序体如下:*cx4ClearInput “请输入数据:” to aDo case Case vartype(a)=”C” ?”这个数据是字符型”Case vartype(a)=”N”?”这个数据是数值型”Case vartype(a)=”L” or vartype

22、(a)=”X” ?”这个数据是逻辑型”Case vartype(a)=”D” ?”这个数据是日期型” Case vartype(a)=”T”?”这个数据是日期时间型”Otherwise ?”这个数据是货币型”EndcaseReturn好了,这就是VF6中的条件语句,简单吧,在很多的情况下,二者可以相互替代,主要就是看哪个要简单一些,相信读者对关于什么情况下使用什么样的语句已经胸有成竹了吧?下图给出上面两个程序的输出结果现在我相信我们对程序语言已经有了一定的认识和了解了,下面我们继续学习程序语句中的精华部分,循环语句。循环语句包含三种 即DO WHILE FOR 和 SCAN ,其中SCAN 语

23、句是浏览表文件记录的程序语言,而且思想方法很容易掌握,以后在介绍表之后在讲,暂时我们不管。先从DO WHILE 语句来开始,记得以前上课的时候,我们的老师向我们说过DO WHILE 和FOR 语句的区别:前者不知道循环了多少次,而后者在知道循环的次数的情况下使用。感谢老师!其实DO WHILE 语句看字面上挺容易理解的,就是当什么什么的情况下做,就是这样,然后在DO WHILE 最后一定要有个enddo 来结尾,如果在这期间希望程序能够跳出循环的话,或是回到循环的开始处继续的情况下分别在语句里面加上EXIT和LOOP,这两个单词不难背,很好掌握,当程序执行到EXIT时就会之间跳出循环体去执行E

24、NDDO后面的程序语句,如果碰到LOOP语句时便会回到DO WHILE下一句执行。大家在编程的时候一定要注意循环语句会不会碰到死循环的情况,如果是死循环那就要考虑这两条语句了,这里顺便插一句,当我们编了死循环的语句后,VF6便无限的执行下去,当你想关闭VF6时,上面会提示“无法关闭”,晕!其实这是有解决的办法的,想当初我第一次碰到的时候,我是直接把计算机给关闭了,汗呀,浪费了多少人力物力呀,其实有较为简便的方法,在windows XP操作系统下,我们可以按住ctrl+alt+delete调出windows的任务管理器,然后在应用程序选项卡上选中正在运行的VF6,点击结束任务,强制退出VF6,然

25、后在重新启动VF6即可。下面我们来通过第一个例子,这个例子还是很普通的例子:判断一个数是否是同构数,即输入一个三位数,如果这个三位数的三个数字的立方和等于本身,那么它就是同构数。这个思想方法是先判断输入的数字是否为三位数,如果不是三位数,那么要求重新输入,并在屏幕上出现提示,(VF6中在屏幕上出现提示的语句是WAIT “字符” window ,即在屏幕上显示字符内容,任意键消失,还可以在上述语句后加上timeout 数字 ,表示经过多少秒后,如果用户没有击键,窗口自动消失。)这里就需要用到循环语句和判断语句了。然后在得到各个位上的数字有两种方法,一种是通过数学的方法,例如百分位上的数字,可以拿

26、这个数除以100然后取整,例如int(345/100)=3 十位上的数字是将该数字减去百位上的数字乘以100后除以10再取余,例如int((345-300)/10)=4,同理个位上的数字是将这个数先减去百位上的数字乘以100,然后在减去十位上的数字乘以10,得到各位上的数字;除了用数学的方法外,还可以用截取字符串的方法来截取数字,本例采用后者,前者在教科书上面貌似已经有答案了下面给出该程序的代码:*cx5Do while .t. &&任何情况下,都循环,这就要求后面有一个EXIT语句来跳出循环 Input”请输入一个三位数” to x If len(allt(str(x) &l

27、t;> 3 &&如果输入的数不是三位数*上面是先将数字转化为字符型,去空格后,在算长度。一般转化字符型才能返回长度 Wait “请按要求输入数字“ window timeout 3 &&出现请按要求输入3秒后自动消失Loop &&回去,重来 Else A=val(left(str(x,3),1) &&截取百位数字,先转化为字符型,截取后在转化成数值型, B=val(substr(str(x,3),2,1) &&下同 C=val(right(str(x,3),1) If x=a3+b3+c3 &&

28、;即这个数是同构数 ?x,”这个数是同构数”Exit &&跳出循环体Else ?x,”这个数不是同构数” Endif Endif &&别忘了,前面的条件语句Enddo &&循环结束Return好了,这个程序写完了,大家现在对DO WHILE 以及IF 语句有了一定的了解了吧?现在继续举个例子说明一下FOR 语句的意思。For I =1 to 10 意思就是,I从1开始运行当运行到ENDOR 或者NEXT I 的语句时,回到起点,此时I=2 一直到最后一个i=10,循环完毕,如果在for I =1 to 10 step 2 那就表示i=1后紧接着i

29、=3,然后i=5 懂得套了吧?亲爱的读者们。下面继续举例来说明该循环语句的使用:从键盘接收一个数n ,计算1+2+n的值 我们先用Do while 语句来做。这个思想方法是用一个变量先存储1,然后存储1+2,然后慢慢一直加到n,这里我们变量名取作i 程序体如下:*cx6ClearInput “请输入一个数:” to ns=0 &&先将s赋0值i=1 &&记录循环的次数,决定该次循环应该加上的数的值Do while i<=nS=s+I I=i+1 Enddo?sreturn解释一下该程序语言吧,接收数字之后,先用S存储部分累加的和,i用来存储循环的次数,即相

30、当与数列中的a1,a2,an 第一次i=1,然后s=0+1,i=1+1=2,回去继续循环,第二次循环s=1+2=3,i=2+1=3,然后第三次循环,s=3+3=6,这样一直到I>n时 不满足i所满足的条件时,循环结束。此时s的值即为所求值。下面我们用for 语言来做,*cx7ClearInput “请输入一个数” to nS=0 &&和上面一样,存储部分和For I =1 to n S=s+IEndfor?sreturn好了,这个就是for 语句做的结果,先从i=1开始,第一次i=1,s=0+1=1,第二次循环,i=2,s=1+2=3,第三次循环i=3,s=3+3=6直到

31、最后一次s=s+n时,循环结束,s为所求值。这个简单吧?比DO WHILE 要简洁一点。下面给出此程序的运行结果:如果读者有兴趣的话可以分别用do while 和for 语句编这个计算n!的程序,提示一下:这里的s初值要赋为1,不能为零,否则,只能结果只能是0.其实这些程序循环语句看着挺复杂,实际上只要我们弄懂了计算机读的方法也就简单多了,曾经和一个朋友开玩笑,当你看到循环语句时,就把自己的脑子变成死脑筋,学着计算机那样一遍又一遍的循环,如果次数少你可以直接就把结果算出来了,如果次数多,你可以运用“公鸡归纳法“(不完全归纳法,呵呵,一个典故)将结果归纳出来。更为复杂的是循环的嵌套,例如看下面的

32、例子 从键盘接收一个数N,计算1!+2!+3!+n!的值。该题我们首先肯定要把这N个阶乘的数分别算出来,然后把它们相加,故一般情况下,我们就可以考虑用嵌套语句来做。先用do while 语句来做 *cx8ClearInput “请输入一个数” to nI=1K=0 &&k 用来存储部分和Do while i<=n &&外层循环存储部分和 L=1&& L 用来存储部分积 J=1 Do while j<=I && 内层循环计算每个数的阶乘,并利用外层循环将它们相加 L=L*j J=j+1 Enddo K=k+L i=i+1

33、Enddo?kReturn好了,这就是嵌套循环,我们把脑筋变死来看这个程序,i=1时,j=1,然后L=1*1=1,然后j=1+1=2>I,跳出内层循环,k=k+L=0+1=1,然后i=2,j=1,L=1*1=1 , j=2时,L=1*2=2,J=3时大于2,跳出内层循环,i=3直到循环结束。这一段写的比较拗口,大家多看看多想想,一定能够想通的,呵呵,因为我都能看懂嘛!其实这样的程序可以不用嵌套,下面我们用for 语句来写这个, FOR不用嵌套,可以边积边加,即乘以一个数,得到的结果加上中间变量。*cx9ClearInput”请输入一个数” to nS=0K=1For I =1 to nK

34、=k*iS=s+kEndfor?sReturn好了,大家用同样的方法来读这个程序。即可,下面给出这两个程序的运行结果。好了,VF6的基本程序语句说道这里基本上算是结束了,不知道诸位看的怎么样,在明天我将大量的举例来使大家能够熟练的掌握程序语言读以及写,并且简单的介绍一下程序模块调用以及自定义函数。下面我们运用所学知识编个恶搞游戏,呵呵!该游戏的目的是测试两个人之间的缘分,当然纯属骗人的把戏,好了,我先说一下思想,我们先随机产生一个0100之间的数,这里需要一个产生随机数的函数,rand(),该函数的功能是随机产生一个0到1之间数,我们将其放大100倍,即可得到1到100之间的随机数。然后我们可

35、以通过产生的数的范围不同用if语句来表述不同的缘分。由于人的姓名都是字符型,所以我们不用input语句,不然需要加上字符型的定界符,很麻烦,所以我们这里就可以用专门接收字符型常量语句accept。下面请看程序体*cx10clearaccept "请输入你的姓名"to aaccept "请输入他(她)的姓名" to bx=rand()*100if x>0 and x<50?a+"和"+b+"有很高的缘分,所以努力大胆的去追"+b+"吧!"else ?a+"和"+b+

36、"没有缘分,努力的清醒过来忘掉"+b+"吧!"endifreturn该恶搞程序,我编得很简陋,其实可以更加复杂化,例如将产生的随机数显示出来当成缘分指数,然后多分几个数字段分别加上评语等等。最后提醒一下,千万不要将该程序用在自己和自己喜欢的人上面,不然不幸产生了不好的随机数,那岂不是太打击人了嘛,呵呵。不知不觉时间又很晚了呢,我两眼开始想闭上了,拜拜,明天继续!最后给出上面游戏的运行结果。顺便爆料一下我的电脑桌面,呵呵呵。 第三天:VF6编程基础(三)昨天介绍了VF6程序中三种基本语言的格式,今天我将通过举例的方式来让我们大家一起熟练的掌握VF6基本程序

37、语言编写。编写一个程序,使其满足以下的功能,可以解一个一元二次方程,要求输入aX2+bX+c=0中的三个数a,b,c.然后求解该方程的根。(方程为复数根的情况下,显示无解)这一题比较简单的方法就是通过用数学的公式,x=(-b±(b2-4*a*c)(1/2)/(2*a),考虑到方程的根有三种不同的情况,需要对其进行分组,用if语句或者case语句。以下程序仅供参考:*cx11ClearInput”请输入a的值” to aInput”请输入b的值”to bInput”请输入c的值”to cIf b2-4*a*c > 0 ?”x1=”, (-b+(b2-4*a*c)(1/2)/(2*

38、a) ?”x2=”, (-b-(b2-4*a*c)(1/2)/(2*a)Else If b2-4*a*c=0 ?”x1=x2=”,(-b)/(2*a) Else ?”方程无解” EndifEndifReturn再看下一个程序,编写一个程序求解三阶行列式的值。我们知道三阶行列式有9个数字,a11.a12,a13,a21,a22,a23,a31,a32,a33,我们利用公式求解,其公式是a11*A11-a12*A12+a13*A13,于是,我们可以建立一个数组x(3,3)方便描述,然后算出其每个代数余子式的值,用循环语句加上。参考程序如下:*cx12 clear dimension x(3,3)

39、&&建立一个二维数组,包含9个变量。 input "请输入a11的值:"to x(1,1) input"请输入a12的值:" to x(1,2) input"请输入a13的值:" to x(1,3) input"请输入a21的值:" to x(2,1) input"请输入a22的值:" to x(2,2) input"请输入a23的值:" to x(2,3) input"请输入a31的值:" to x(3,1) input"请输入

40、a32的值:" to x(3,2) input"请输入a33的值:" to x(3,3) t=0 for i = 1 to 3   do case   case i=1     r=2     s=3   case i=2      r=1     s=3    case i=3     

41、 r=1     s=2    endcase   r=(-1)(i+1)*x(1,i)*(x(2,r)*x(3,s)-x(2,s)*x(3,r)   t=t+r endfor ?"行列式的值是",t Return 上面程序中,我们还可以之前将公式写出来,不用循环语句,在这里只是练习一下循环语句,所以我们编程有很多种方法。这就要求我 们用最简单的方法编出程序。继续看下面的程序:编一个程序在屏幕上显示倒三角形,(要求有5行,每行按从9个星到1个星递减),VF6为了向上与以前的版

42、本相兼容,在屏幕上可以显示的语句是 坐标 say 字符,这里的坐标是指,坐标原点在vf6界面窗口的左上角,没有负坐标。例如 3,1 say “*”,就在屏幕上横坐标3,纵坐标1处显示一个”*”,该程序的考虑方法是利用等差数列,然后每行的数目有相差两个,每行的起始位置相差1,所以参考程序如下:*cx13ClearFor i =1 to 5 &&按行处理,总共五行 For k=1 to 2*i-1 &&按列处理,每列的数目与行有关 6- i,6-i+k say “*” &&从第五行,第8列开始显示。以后每到上一行,其列数要减一。EndforEndfo

43、r此程序还有一个方法,那就是用?输出的方式来输出*,程序如下。clearFor i=1to 5 ?space(i+5) &&换行,并决定首个*的位置 For k =1to 11-2*i ?"*" EndforEndforReturn 编写一个程序使其完成下述功能:在屏幕上有序的滚动显示“河海大学文天学院”从左到右显示5次,先给出参考程序体:*cx14Clearfor i=1 to 5 for k=1 to 100 1,k say "河海大学文天学院" wait timeout 0.01 clear endfor clearendfor显示

44、五次,在上面的程序第一行的语言就是循环5次,也即显示5次。第二句循环一百次的含义就是显示100次河海大学文天学院,并且每次显示的起始位置不同,每次显示后,先要消除屏幕的内容,用clear,再显示下一个,由于VFP本身速度较快,我们需要给它“减速”,所以我们就可以在上面用wait语言,要其自动完成,只需用在后面加上timeout 因为我们看滚动需要较快的速度,我在程序里面用的间隔是 0.01s,这样便可以有效的形成字幕滚动效果。这个屏幕的效果图无法做成,不好意思,就不放效果图了。其实利用这一题原理,我相信聪明的读者们肯定可以想起各种更为有情调的滚动方式,如按照某种规律滚动,轨迹可以是一个图形,或

45、是一个简单的汉字。在看下一个程序:编一个程序,先从键盘输入一个数,(为了简化程序,仅限五位数以内,且各位数字均不为零)然后转换成大写汉字的形式表述出来:如:输入123,程序运行后结果为“壹佰贰拾叁”这个程序由于是几位数并不确定,因而从低位向高位显示,这就要求程序必须以语言输出,由于数字并不确定,所以取变量明并不方便,故采用建立数组的方式,如果是i为数,那我们就建立数组x(i),刚好能和我们需要的变量匹配,先将数字截取出来,数字可以从前截,也可以从后截,为了简化起见我是从后截,截的方法是先用right函数,从1到i逐个截取,在分别用left 函数截取刚刚截到的第一个字符即可,参考下面的程序(这里

46、再提醒一下,截取字符一定先转化成字符型常量),并且利用循环语言将这些数字转化后显示出来,每个汉字占两个坐标,汉字与汉字之间有单位,故每个数字输出后的间隔是4个坐标,然后利用数列的通项公式从后向左输出,先输出字符,在输出单位,单位同样的道理,建立数组y(5),这样就包含了5个元素,且为了不重新编通项公式,只需要将数组y的数字安小到高,单位也按低到高,这样只需在原单位减去2,这样就和原来的数字刚好错开,供参考的程序体如下:*cx15clearinput "请输入一个数字" to ni=allt(str(n) &&为了方便起见,先将数字转化为字符型存储在变量i中j

47、=len(i) &&判断数字的位数dimension x(j)dimension y(5)y(1)="拾"y(2)="佰"y(3)="仟"y(4)="万"y(5)=""for k=1 to j x(k) = left(right(i,k),1) &&截取各位数字上数字,注意截取后的数字是字符型 do case case x(k)="1" x(k)="壹" case x(k)="2" x(k)="

48、贰" case x(k)="3" x(k)="叁" case x(k)="4" x(k)="肆" case x(k)="5" x(k)="伍" case x(k)="6" x(k)="陆" case x(k)="7" x(k)="柒" case x(k)="8" x(k)="捌" case x(k)="9" x(k)="

49、;玖" case x(k)="0" x(k)="零" endcase 2,(2*j-1)*2-1-4*(k-1) say x(k) &&显示转换后的数字,从后向左显示。 2,(2*j-1)*2-3-4*(k-1) say y(k) &&显示单位endforreturn结果如图所示:相信大家将这上面的15个程序弄懂的话,对VFP程序的编程题应该有一定的基础了,其实程序是变化万千的,只要得到的结果是正确的,那么这个程序就是正确的,然后能够熟练的编程或是读程序还需要对VF6的函数能够有熟练的掌握,具体在高等教育出版社出

50、版的vfp二级考试教程里有详细的说明,我就不多此一举了,这些函数如果能够巧妙的运用的话,能得到许许多多种有趣的小程序,正应验了那句关于计算机的话:“只有你想不到的,没有它做不到的。”呵呵呵,如果读者觉得我在上述的例题中有更好的解题方法的话,希望你能以留言的方式告知与我,大家相互交流,相互促进。 然后也欢迎大家将一些有趣的源程序代码发上来供大家学习交流。我们遇到的一般都是小程序,但是在实际生活中,我们更多的还是遇到模块化程序设计,模块可以是一个程序文件,也可以是一个过程,调用程序文件之接用 do +程序名,一般来说,这两个程序文件要放在vfp的默认路径下,为了以后的方便,我们现在将vf6的默认路

51、径设置为e盘vfp文件夹。具体的过程是这样,点击菜单栏上的工具选项在选项对话框中选中文件位置选项卡,选中默认目录,点击下面的修改,在更改文件位置的对话框上先勾选使用默认目录,然后将路径定位至e盘vfp文件夹,如图其实调用程序没什么好说的,如果我们在笔试部分看到这样的调用程序,那么遇到调用语句时,就先看调用的子程序,这就相当于将子程序塞到主程序调用子程序的那个位置处连在一起,现在我随便说一下过程,程序中的过程还有一个说法叫做自定义函数,也就是在程序的结尾处,相当于是一个子程序,但它涉及到参数传递问题。这是VFP编程的难点,但是好在,考试对这部分的要求较低,一般都没有什么复杂的程序,所以在这里我通

52、过举个例子来让大家对按值传递和按引用传递有个大致的了解。请先看这个例子,Store 3 to nDo p1 with n &&这种方式引用被成为按引用传递。?nFunction p1 &&也可以是procedure p1,但是前面的单词容易记,后面的只要认识就行Parameters x &&定义形参,这个单词也较陌生,但记前四个字母就行,paraX=x2Endfunc&&如果是procedure ,这里应该是endproc在上面的程序第二句中的n,要将其传给下面的过程,在vf中被称为是实参变量,明显这里的实参是变量,下面的过程中的

53、x需要从主程序中接收值,被称为形参变量,形参需要从实参接收值,可以是常量也可以是变量,如果是常量,那就是按值传递,如果是变量那就是按引用传递。在这里,由于接收的n是变量,所以是按引用传递,当过程执行完毕后,再将x的值赋给实参,也可以这样理解按引用传递,形参和实参为同一个变量,即上题中,x和n一起变化。最后的结果n的值就是x的值是9,如果是按值传递,那么x从程序中接收到的是n的值即是3,当x变化时,n的值不变,所以如果上题中要按值传递,那么第二句的表述是,do p1 with (n) ,即给n 加个括号即可,然后程序运行后,x的值是9,n的值仍是3.此外,按值传递也可以这样表示,仍然是第二句;P

54、1(n) ,默认的情况下是按值传递,但是我们可以通过设置方式让此语句也按引用传递,设置方式是:set udfparms to reference ,在英语中,reference是引用的意思,udfparms不知道是啥意思,如果我们自己写,那就用第一种语言吧,因为这个单词实在难记,只要我们看到知道是啥意思即可,多记几个单词吧,呵呵,当然如果我们再想设置回来,那就是set udfparms to value , value这个单词较常见,有值的意思,这个不难记。当然如果用此语言的话,在引用传递的情况下,这样表示p1(n),即给n加个括号,那还是按值传递,总之这样记即可,不管什么情况下,只要给传递的

55、实参加括号了,那就是值传递,程序结束处问实参的值,那就是不变,不管过程文件是什么。为了不至于混淆,下面我将这几种方式一起写下来。N=3Do p1 with n?”按引用传递,n的值是:”,nN=3Do p1 with (n)?”按值传递,n的值是:”,nN=3P1(n)?”按值传递,n的值是:”,nSet udfp to referenceP1(n)?”按引用传递,n的值是:”,nN=3P1(n)?”按值传递,n的值是:”,nFunction p1Para xX=x2endfunc 这就是大致的参数传递了,但在实际编程中,可能遇到多个过程,那也是将过程写在程序结尾处,当然我们也可以将过程以文件

56、的形式存储在磁盘上,调用的时候必须先打开这些过程文件,具体的语法是 set procedure to 过程文件名,可以是多个,逗号隔开,然后在语句的后面加上additive 不关闭其他已经打开的过程文件,如果不加这个单词,那就是关闭其他已经打开的过程文件,当我们想关闭过程文件时,只需用set procedure to 即可,一次性关闭所有已经打开的过程文件,就像打开表那样,用use 不加文件名,意即关闭所有已经打开的表文件,当然如果想关闭某一个已经打开的过程文件,那就是release procedure 过程文件名,可以是多个,逗号隔开。这些在上机中不会遇到,因为实际运用中,可以不需要这些,直

57、接把过程放程序结尾处即可,多么省事。但还是需要了解一下,毕竟笔试题也要过嘛!还有一个想说明的就是关于过程文件的参数传递问题,刚刚举得例子只是传递一个变量,但在实际应用中,往往需要传递多个变量,甚至是整个数组,当然二级考试题中都是传递一个,最多两个。只要记下面一句话应付笔试的选择题即可,当要传递的实参变量数目比形参变量数目多,即过程的形参变量数目不够的情况下,那么程序将会显示出错信息,就像是十二个糖分给10个人,要求每个人最多只有一个,糖要发完,怎么可能呢!当要传递的实参变量数目少于接收的形参变量数目时,多余的形参变量用.f.填充,就像是拿8个糖分给10个人,要求每个人最多一个糖,糖要分完,这是

58、可能办到的,而且有人拿不到糖,没有拿到的人那就只有用逻辑假填充喽,呵呵,虽然比喻很土,但我相信,看到这儿,应该都能理解了,这样应该就会很难忘记了吧?最后想说的是变量的作用域,变量的作用域不难理解:它分为全局变量,私有变量,局部变量。这里全局变量的权限最高,一旦建立,将在程序各个部分均有限,当程序运行结束之后,返回到命令窗口后,仍然有效,比如,我们在命令窗口中建立的变量均是全局变量,在程序中,我们就不需要事先定义,而能直接引用。在程序中建立全局变量的命令是public 加变量名。看着单词我相信意思不难理解。私有变量的作用域是指建立该变量的当前模块及其下属模块,我们在程序之间定义的变量(没有用public 和local建立)全部属于私有变量,这里有必要提一下,在大型的模块程序中,子程序与主程序的变量名可能有冲突,如果不采取措施,这样子程序的变量一旦建立,那么主

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论