您好,欢迎访问三七文档
VF程序实例基本(十一大类):一、多工作区、Replace、copyto.二、累加、累乘三、双重循环:金字塔问题等四、排序五、循环查询:locate\seek六、循环插入新记录七、子程序和参数传递\变量的作用域八、@行,列say...get...default...read字幕问题九、scatter/gather十、数组(结合排序)十一、综合题*******************************************************************************一、多工作区、Replace、copyto.例题1:涉及setrelationto有如下表:(1)XS.DBF(学号C(8),姓名C(8),性别C(2),班级C(9),出生日期D,走读L)(2)CJ.DBF(学号C(8),课程名C(20),成绩N(5,1))说明:一个学生可以选择多门课程。请编写一个完整的程序,该程序能完成以下功能:1、将表XS.DBF和表CJ.DBF建立关联,并显示出所有男同学的姓名以及他们所选课程的课程名2、将XS.DBF表中所有班级为“2002级2班”的同学信息拷贝到新表STUDENT.DBF中,STUDENT.DBF只含有学号、姓名、性别、走读四个字段3、将姓名为“王小平”的同学的所有成绩提高10%CLEARCLOSEALLSELE2USECJINDEXON学号TOXHSELE1USEXSSETRELATIONTO学号INTOBSETSKIPTOBLISTFOR性别='男'FIELDS姓名,B.课程名COPYTOSTUDENTFOR班级='2002级2班'FIELDS学号,姓名,性别,走读replaceb.成绩withb.成绩*1.1fora.姓名=王小平例题2:涉及update下面有两张表:总分表:ZF.DBF学号姓名语文数学总分110张三114李四119王二成绩表:CJ.DBF学号语文数学110676511489671197895按照成绩表的成绩修改总分表的成绩,并计算出总分表的总分字段参考答案:CLOSEALLSELE2USECJINDEXON学号TAGXHCJSELE1USEZFINDEXON学号TAGXHZFUPDAON学号FROMBREPL语文WITHB.语文,数学WITHB.数学REPLALL总分WITH语文+数学LIST例题3:涉及joinwith:将STUDENT.DBF和学生成绩.DBF连接成新文件NEW.DBF表1:student(学号c(4),姓名c(8),性别L,出生日期D,高考成绩N(5,2))表2:学生成绩(学号c(4),课程号C(3),分数N(2))SELECT1USESTUDENTSELECT2USE学生成绩JOINWITHATONEWFOR学号=A.学号;FIEL学号,A.姓名,A.性别,A.出生日期,课程号,分数USENEWLIST如果再增加一张表,三表相连:表3:课程(课程号C(3),课程名称C(10))SELECT1USESTUDENTSELECT2USE学生成绩JOINWITHATONEWFOR学号=A.学号SELE1USENEWSELE2USE课程JOINWITHATOSTUFOR课程号=A.课程号USESTULIST*******************************************************************************二、累加、累乘例1:累加:求1~100的和SUM=0FORI=1TO100SUM=SUM+IENDFOR?’1~100的总和为:’,SUM使用DOWHILE实现:SUM=0I=1DOWHILEI101SUM=SUM+II=I+1ENDDO?’1~100的总和为:’,SUM例2:累乘:求n!clearINPUT求n!,请输入n的值:TONMUL=1FORI=1TOnMUL=MUL*IENDFOR?n,’的值为:’,MUL例3:输入n的值,求1+1/2!+1/3!+1/4!+….+1/n!(阶乘n!=1*2*3*4....*(n-1)*n)CLEARSUM=_①_MUL=_②_INPUT请输入n的值:TONFORi=1TONFORj=1TOiMUL=MUL*__③__ENDFORSUM=SUM+____④_____ENDFOR?'求得的总和为:',SUM答案:1:02:13:j4:1/mul注意:外循环是累加,内循环是累乘*******************************************************************************三、双重循环:金字塔问题等看书阅读:1、P159页:例4.392、P160页:例4.403、求1-100间所有的质数CLEAR?’2、3是质数’FORI=4TO100FORJ=2TOINT(SQRT(I))IFMOD(I,J)=0EXITENDIFENDFORIFJINT(SQRT(I))?I,’是质数’ENDIFENDFOR4、运行XY.PRG程序后,将在屏幕上显示如下乘法表:1)12)243)3694)4812165)5101520256)612182430367)71421283542498)8162432404856649)91827364554637281请对下面的程序填空:***计算乘法XY.PRG***CLEARFORJ=1TO9?STR(J,2)+')'FOR______________??______________ENDFOR?ENDFORRETURN第一空K=1TOJ第二空STR(J*k,6)5、排序问题*******************************************************************************四、排序输入10个数,将它们从小到大排列分析:用i代表趟数,j代表次数(1)10个数要比较9趟(2)每趟要比较的次数为:10-趟数(3)每次比较:如果当前数a(j)大于本次比较的最后一个数a(10+1-i)那么就交换,否则不交换cleardimea(10)?'输入10个数:'fori=1to10input请输入:toa(i)endforfori=1to9forj=1to10-iifa(j)a(10-i+1)t=a(10-i+1)a(10-i+1)=a(j)a(j)=tendifendforendforlistmemolikea另外可以参看书:P162-163页例4.45*******************************************************************************五、查询:locate\seek有下列表:book(书名C(20),作者C(8),出版日期D,内容简介M)编写程序:查询关于foxpro的图书.USEBOOKLOCATEFOR‘foxpro’$书名IF!FOUND()?’没有关于foxpro的图书’ELSEDOWHILE!EOF()CLEAR?书名,作者,出版日期?内容介绍WAIT“是否继续查找?(Y/N)”TOMIFM$’nN’EXITENDIFCONTINUEENDDO?”全部显示完成”ENDIF注意:关键地方在于1、什么地方用locate,什么地方用continue2、if..exit..endif3、dowhilenot的条件使用Locate查找出所有入校总分在580及以上的所有同学信息clearuse学生locatefor入校总分=580dowhile.not.eof()dispcontinuenddo?'结束'cancel*******************************************************************************六、循环插入新记录编写程序,对于学生.dbf能够在程序末尾循环插入新记录CLEARCLOSEALLUSE学生DOWHILE.T.APPEBLANK@5,20SAY'学号'GET学号@5,40SAY'姓名'GET姓名@7,20SAY'性别'GET性别@7,30SAY'出生年月'GET出生年月@9,20SAY'入校总分'GET入校总分READWAIT'你想继续插入新记录吗?(Y/N):'TOXIFX='N'ORX='n'EXITENDIFCLEARENDDOCLEARLISTCLOSEALL类似:编写程序,该程序能够顺序修改表学生.DBF中的所有数据。(要求:必须使用@行,列say...get..进行数据修改)CLEARCLOSEALLUSE学生DOWHILE.T.@5,20SAY'学号'GET学号@5,40SAY'姓名'GET姓名@7,20SAY'性别'GET性别@7,30SAY'出生年月'GET出生年月@9,20SAY'入校总分'GET入校总分READWAIT'你想继续修改记录吗?(Y/N):'TOXIFX='N'ORX='n'EXITENDIFCLEARSKIPENDDOCLEARLISTCLOSEALL*******************************************************************************七、参数传递\变量的作用域&&MAIN.PRG&&P1.PRGX1=1PARAW1,W2X2=2PRIVATEW1DOP1WITHX1,X2W1=W1*3?’X1=’+STR(X1,1)W2=W2*4??’X2=’+STR(X2,1)RETURNX1=1X2=2DOP1WITHX1,X1+X2?’X1=’+STR(X1,1)??’X2=’+STR(X2,1)RETURN(1)第一次显示X1,X2的值是()A.1,8B.3,8C.1,1D.8,8(2)第二次显示X1,X2的值是()A.1,2B.3,1C.3,2D.1,3参考答案:BC下面看第二个实例:主程序MCX2.PRGcleapublici,jstore1toi,j,kdoscx2.prg?主程序的输出结果:?i=+str(i,2)+j=+str(j,2)+k=+str(k,2)cancel子程序scx2.prgcleaprivatej,ki=i*2j=j+1k=j+1?子程序中输出的结果:?i=+str(i,2)+j=+str(j,2)+k=+str(k,2)return执行结果是:子程序中输出的结果:i=2j=3k=4主程序的输出结果:i=2j=1k=1看等级考试中的题.(2003年10月笔试)*******************************************************************************八、@行,列say...get...default...read字幕问题:1、有如下程序段,其功能是显示汉字“2008年北京申奥成功!”从屏幕的顶部移至底部,请填空补充该程序CLEARCH='2008年北京申奥成功!'R=1DOWHILER=23@R,26SAYSPACE(60)@__________,26SAYCHT=INKEY(0.2)_______________ENDDORETURN答案为:R+1R=R+1答案说明:@R,26SAYSPACE(60)的作用是将上一行显示的'2008年北京申奥成功!'清除掉,然后@R+1,26SAYCH显示新一行的数据R=R+1是保证dowhile不是死循环2、从左到右显示同志们,要到期末了,努力奋斗吧!!两次clears=space(80)+同志们,要到期末了,努力奋斗吧!!+space(40)fornn1=1to2&&显示两次fornn2=1to110step2&&110=80+30,30是那个字符串的宽度@20,0saysubstr(s,nn2,80)inkey(2,'H')endforendfor*********************************
本文标题:VF程序实例
链接地址:https://www.777doc.com/doc-5327288 .html