专升本VF教材.docx
《专升本VF教材.docx》由会员分享,可在线阅读,更多相关《专升本VF教材.docx(40页珍藏版)》请在冰点文库上搜索。
专升本VF教材
专升本VF教材
VFO程序设计复习
1程序设计概述
一、程序的概念
概念:
具有一定功能的计算机能执行的指令的集合。
例1:
显示表XSDA可编写成如下命令序
SETDEFATOF:
\表
USEXSDA
LIST
CLOSEALL
例2:
求a=3,b=2,c=5求a+b-c=?
程序test.prg代码如下:
a=3
b=2
c=5
x=a+b-c
?
x
二、常见的程序设计方法
1、 结构化程序设计(模块化)
结构化程序设计是一个面向过程的概念。
把一个实际问题分为两部分,即数据和过程。
经过动态的程序执行过程来对静态的数据进行处理,得出正确的结果。
由VFP命令和程序设计命令的组合,需编制和调试;
2、 面向对象的程序设计
3、结构化程序设计
它是面向过程程序设计的另一种描述,面向过程程序设计有如下特点:
①整个程序分为若干个模块,模块之间相衔接,且相对独立。
②第个模块只有一个入口和一个出口。
③第个模块都能单独执行,且在有限时间内执行完。
④采用自顶向下、逐步求精的方法。
三、程序三大基本结构
1、顺序结构:
执行是按命令出现的先后顺序执行。
2、分支结构:
按给定的条件成立与否来决定程序起向,分单向选择分支、双向选择分支和多路分支。
有以下两种
IF语句DOCASE
ENDIFENDCASE
3、循环结构:
程序的执行发生了自下而上的往复,某一程序段将重复执行。
有以下三种
DoWhileForSCAN
ENDDOENDFORENDSCAN
四、算法和流程图
算法:
解决某一问题的方法与步骤。
见教材例。
流程图:
算法的描述,除用自然语言描述外,计算机领域常见流程图(ANSI图和N-S图)描述。
见教材例。
例如:
乐山到成都怎么去?
1、 解一元二次方程的算法。
Ax2+bx+c=0,求x
2、 求出1-100之间的质数。
X/=>2到SQRT(X)
2程序的建立和执行
一、程序的扩展名:
PRG
实质:
文本文件(ASCII编码)执行时,会产生编译文件FXP后让计算机执行。
二、程序文件的建立和编辑
1、命令方式:
MODICOMM程序名.PRG(.PRG可省)
2、菜单方式;
文件=>新建=>程序
3、项目管理器中建立的方法:
建立项目管理器=>新建程序
4、其它方法:
其它可编辑文本的软件:
记事本\写字板\WORD\其它程序编辑器
注意:
希望编写程序之前事先设置好默认目录(setdefato……)然后我们编写的程序就会自动存储在那个目录中。
例如:
setdefatod:
\ks
modicommTest(相当于是:
modicommD:
\ks\test.prg)
三、程序的执行
1、命令方式
命令格式:
DO[盘符][路径]程序名
2、菜单方式:
“程序”菜单->“运行”命令
在“运行”窗口中输入被运行的程序文件名,即可运行程序。
四、VFP程序的分类:
数学类程序、涉及到表操作的程序
如果本程序是涉及到表操作的程序,那么:
1、在程序开始部分能够先加语句CLEAR和CLOSEALL
2、程序最后能够使用命令CLOSEALL
3、然后使用RETURN或CANCEL或QUIT
例:
找出并显示所有三好生
CLEAR
CLOSEALL
USE学生
LOCATEFOR三好生
DOWHILENOTEOF()
DISP
CONTINUE
ENDDO
CLOSEALL
RETUREN
3顺序程序设计与常见语句
一、程序设计中的常见语句
1、输入命令
(1)赋值命令
命令一:
STORE<表示式>TO<内存变量>
命令二:
<内存变量>=<表示式>
(2)交互式输入命令(注意:
输入数据是在程序执行的时候)
INPUT[提示信息]TO<内存变量>
ACCEPT[提示信息]TO<内存变量>
WAIT[提示信息][TO<内存变量>][TIMEOUT<等待时间>
说明:
①提示信息是C型,它会在屏幕上原样输出.
②WAIT命令的功能:
暂停程序执行,显示提示信息等待用户按键。
Wait命令中输入的只能是一个字符(C型)。
③Input适用于全部类型内存变量,输入时需要加定界符
④Accept只适用于C型,而且C型不加定界符
注意:
Input和accept在编写程序时语句都一样,只是执行程序(do)时,主屏幕上要求输入的类型和格式不同。
例1:
输入a、b、c的值,对2ax+b=c求x的值。
Clear
Input“现在计算2ax+b=c,请输入a的值:
”toa
Input“请输入b的值:
”tob
Input“请输入c的值:
”toc
x=(c-b)/(2*a)
?
’x的值为:
’,x&&比较使用?
’x的值为:
’+str(x,3)有何区别
return
例2、查找学生.dbf中的指定记录
clear
closeall
use学生
list
accept“请输入您想查找的姓名:
”toxm
Locatefor姓名=XM&&或命令SEEKXM
iffound()
DISP
else
?
’对不起,没有找到此人’
endif
list
closeall
Return
思考:
如果accept换成input,输入的时候该怎么输入?
例3、删除学生.dbf中的指定记录
clear
closeall
use学生
list
input“请输入您想删除的记录号:
”tox
delerecox
wait“你想彻底删除这条记录吗?
(y/n)”toask
ifask=’Y’orask=’y’
pack
endif
list
closeall
注意区分交换方式和程序方式:
有的命令能够在两种状态下执行(例如:
刚才的输入命令),但有些命令只能在程序方式下执行(例如:
循环语句和分支语句)
(3)格式输入命令
格式一:
@行,列say提示信息
格式二:
@行,列say提示信息get变量
……
READ
格式三:
@行,列say提示信息get变量default常量
功能:
在屏幕指定的坐标位置上显示提示信息,然后经过READ命令激活GET子句的变量值。
说明:
①GET后的变量能够是内存变量或当前打开的数据文件中的字段变量,若是内存变量,应在执行该命令前对内存变量赋值,否则就必须使用default参数赋初值。
②输入的值类型应该与初值类型相同。
③READ命令与GET命令必须配合使用。
多个GET命令能够只用一个READ命令配合。
如果没有read则表示只显示内容,不输入值。
例1:
编写程序完成在学生.DBF中追加记录
CLEAR
USE学生
APPENDBLANK
@5,20SAY“学号”GET学号
@5,40SAY“姓名”GET姓名
@7,20SAY“性别”GET性别
@7,40SAY“出生年月”GET出生年月
@9,20SAY“入校总分”GET入校总分
@9,40SAY“三好生”GET三好生
READ
CLEAR
LIST
CLOSEALL
RETURN
例2:
编程求长方形的面积。
CLEAR
X=0&&X为内存变量,赋初值
Y=0
@1,5SAY“计算长方形的面积”
@2,5SAY“输入长方形的长:
”GETX&&第2行5列显示提示信息并等待输入
@3,5SAY“输入长方形的宽:
”GETY&&第3行5列显示提示信息并等待输入
READ&&从键盘输入X,Y的值
S=X*Y&&计算长方形的面积
?
“长方形的面积:
”,S&&显示长方形的面积
CANCEL
思考题1:
如将上述例1程序改为按照指定学号来修改记录应该怎样做?
(答案见课件后)
3、输出命令
⑴:
非格式输出命令
?
和?
?
⑵:
格式化输出命令
@行,列say表示式
说明:
行和列都能够是表示式,常常能够使用函数ROW()和COL()
ROW()表示返回当前行的行号COL()表示返回当前列的列号
例1:
N=1
CH=“VF程序设计”
@N,26SAYSPACE(60)
@N+1,26SAYCH
例2:
循环输入值
clear
dimexh(10)
store0toxh
@10,10say'请输入数字:
'getxh
(1)
i=2
dowhilei<=10
@row()+1,10say'请输入数字:
'getxh(i)
i=i+1
enddo
read
listmemolikexh
4、其它程序运行命令
(1)终止程序执行命令
CANCEL、QUIT和RETURN
QUIT:
退出程序运行而且退出VisualFoxpro
CANCEL:
退出程序运行
RETURN:
返回上级程序调用点,如果是主程序就表示退出程序。
主程序可缺省此命令返回(结束),即默认使用了return
注意:
上述命令执行完后都会自动clearmemory。
可是如果有数据库和表打开不会自动关闭,因此使用数据库和表后在程序结束时我们常常需要加命令:
closeall
(2)清屏命令
CLEAR
(3)注释命令( NOTE、*和&&)
注释的含义:
程序员对程序语句功能的说明,执行程序的时候不执行注释中的内容,注释只起到一个对语句说明的目的。
一般复杂程序中应有30%以上的注释。
(4)TEXT语句:
原样输出(参考书143例4.15)
(5)系统设置命令
set…on/off或者是set…to
1、设置会话状态
SETTALKON/OFF
2、设置跟踪状态
SETECHOON/OFF
3、设置打印状态
SETPRINTERON/OFF
4、设置定向输出状态
SETDEVICETOSCREEN
5、设置精确比较状态
SETEXACTTOON/OFF
6、设置日期格式
SETDATEANSI
7、色绘制系统提供的保护状态
SETSAFETYON/OFF
8、设置删除记录标记状态(掌握)
SETDELETEDON/OFF
功能:
屏蔽或处理有删除标记的记录
说明:
在命令格式中选择ON时,各命令当不对有删除标记的记录进行操作,但索引除外。
系统默认值为OFF
思考题1答案:
CLEAR
USE学生
ACCEPT"请输入需修改记录的学号:
"TONUM
LOCATEFOR学号=NUM
@5,20SAY"学号"GET学号
@5,40SAY"姓名"GET姓名
@7,20SAY"性别"GET性别
@7,40SAY"出生年月"GET出生年月
@9,20SAY"入校总分"GET入校总分
@9,40SAY"三好生"GET三好生
READ
CLEAR
LIST
CLOSEALL
RETURN
4顺序结构和分支结构
一、顺序结构
例1:
求圆的面积(公式S=ΠR2)
CLEAR
INPUT“请输入半径R的值:
”TOR
S=3.1416*R*R
?
”圆面积为:
”,S
CANCEL
二、分支结构(选择结构)
1、IF语句
(1)单向选择:
双向选择:
IF条件IF条件
执行语句执行语句
ENDIFELSE
执行语句
ENDIF
(2)单向选择分支
例如:
求任意一个数值的绝对值
CLEAR
SETTALKOFF
INPUT“请输入数值:
”TON
IFN<0
N=-N
ENDIF
?
”|N|的绝对值为:
”,N
CANCEL
(3)双向选择分支
例1:
用户输入数据表文件名,判断它存在否,如果存在则打开数据表文件并显示表中的全部记录
clear
accept'请输入数据库文件名:
'toheng&&想想为什么不用input
iffile(heng+‘.dbf’)&&了解file()的使用方法
use&heng&&想想这儿为什么要用&代换
list
else
?
'sorry,文件不存在:
('
endif
closeall&&关闭所有打开的表,如果不涉及多工作区,能够只使用use
例2:
判断输入的整数为奇数还是偶数。
CLEAR
INPUT“请输入整数:
”TON
IFN%2=0&&该表示式还可用MOD(N,2)=0来表示
?
STR(N,4)+”是偶数”
ELSE
?
STR(N,4)+”是奇数”
ENDIF
CANCEL
(4)IF语句的嵌套
例如:
将用户输入的小写英文字母转化成大写
CLEAR
ACCEPT“请输入1个字母:
”TOSTR1
IFSTR1>=’a’ANDSTR1<=’z’
STR1=UPPER(STR1)
?
SPACE(40)+STR1
ELSE
IFSTR1>=’A’ANDSTR1<=’Z’
?
SPACE(40)+STR1
ELSE
?
’您输入的不是英文字母’
ENDIF
ENDIF
2、多向选择
DOCASE
CASE<条件表示式1>
<命令序列1>
CASE<条件表示式2>
<命令序列2>
……
OTHERWISE&&其它情况
<命令序列>
ENDCASE
说明:
OTHERWISE能够没有.
例1:
比较A、B的大小
CLEAR
INPUT“请输入A的值:
”TOA
INPUT“请输入B的值:
”TOB
DOCASE
CASEA>B
?
”A大于B”
CASEA
?
”A小于B”
CASEA=B
?
”A等于B”
ENDCASE
例2:
邮局负责邮购小物品规则如下:
50公里及以内收取额外金额5元,50-100公里收取10元,100-200公里收取20元,200-500公里收取40元,其余一律收取50元。
CLEAR
INPUT“请输入您想邮购物品的路程(公里数):
”TOX
DOCASE
CASEX<=50
Y=5
CASEX>50ANDX<=100
Y=10
CASEX>100ANDX<=200
Y=20
CASEX>200ANDX<=500
Y=40
OTHERWISE
Y=50
ENDCASE
?
’对不起,您需要付款:
’,Y,’元人民币’
5循环程序设计
1、条件循环
格式一:
DOWHILE条件
命令序列
ENDDO
格式二:
DOWHILE条件
语句序列
[LOOP]
语句序列
[EXIT]
语句序列
ENDDO
要退出循环,需要条件为假的时候(条件=.F.时)
说明:
(1)LOOP和EXIT命令一般放在IF条件中,也能够出现在循环体内的任何位置。
若执行循环体时遇到LOOP命令,则直接返回执行DO命令,测试条件以决定是否继续循环。
若遇到EXIT命令,则不执行下面的命令序列,直接跳出循环,执行ENDDO后面的命令。
(2)条件表示式的值确定了循环是否继续,当条件表示式的值始终为真(即永真循环),则应使用EXIT命令来控制循环结束
例1:
将字符“欢迎进入乐山师范学院”从屏幕的顶部移至底部
CLEAR
CH=“欢迎进入乐山师范学院”
N=1
DOWHILEN<=23
@N,26SAYSPACE(60)
@N+1,26SAYCH
T=INKEY(0.2)&&等待0.2秒
N=N+1
ENDDO
RETURN
注:
INKEY([<数值表示式>])
功能:
等待用户按键或鼠标输入,等待时间由数值表示式确定(单位为秒)返回由按键而产生的一个整数值.
例2:
实现显示出全部的男生
CLEAR
CLOSEALL
USE学生
DOWHILENOTEOF()
IF性别=’男’
DISP
ENDIF
SKIP
ENDDO
CLOSEALL
LOOP循环实例
例1:
I=0
DOWHILEI<10
I=I+1
IFINT(I/2)=I/2
LOOP
ENDIF
?
”*”
ENDDO
例2:
CLOSEALL
CLEAR
USE学生
DOWHILENOTEOF()
DISP
WAIT‘你想修改本记录吗?
(Y/N)’TOX
IFX=’N’ORX=‘n’
SKIP
LOOP
ENDIF
EDIT
SKIP
ENDDO
CLOSEALL
程序执行到WAIT语句后,如果用户输入的是’N’或’n’,那么就LOOP
(也就跳过本次循环,不执行后面的EDIT)
永真循环
DOWHILE.T.DOWHILE.T.
IFY>0IFY>0
EXITQUIT
ENDIFENDIF
ENDDOENDDO
如果Y>0,则退出本循环如果Y>0,则退出程序,退出VF
DOWHILE.T.DOWHILE.T.
IFY>0IFY>0
RETURNCANCEL
ENDIFENDIF
ENDDOENDDO
如果Y>0,则退出程序返回上层如果Y>0,则退出程序,回到VF中
上述语句LOOP、EXIT、QUIT、RETURN、CANCEL等也能够在后面讲的其它循环语句中使用。
例1:
经过键盘输入三角形的边长,若边长正确,立即在屏幕上显示三角形的面积,若边长不正确,重新输入边长,若输入的边长中任意一边为0则程序立即结束。
CLEAR
?
”现在计算三角型的面积,如果想退出程序请输入0。
”
DOWHILE.T.
INPUT“请输入边长a:
”TOA
INPUT“请输入边长b:
”TOB
INPUT“请输入边长c:
”TOC
IFA=0ORB=0ORC=0
?
’结束’
RETURN
ENDIF
IFA+B<=CORA+C<=BORB+C<=A
?
’错误的三角型,请重新输入!
’
LOOP
ENDIF
S=(A+B+C)/2
AREA=SQRT(S*(S-A)*(S-B)*(S-C))
?
’该三角型的面积是:
’,area
ENDDO
例2:
有下列表:
book(书名C(20),作者C(8),出版日期D,内容简介M)编写程序:
查询关于foxpro的图书.
USEBOOK
LOCATEFOR‘foxpro’$书名
IF!
FOUND()
?
’没有关于foxpro的图书’
ELSE
`
DOWHILE!
EOF()
CLEAR
?
书名,作者,出版日期
?
内容介绍
WAIT“是否继续查找?
(Y/N)”TOM
IFM$’nN’
EXIT
ENDIF
CONTINUE
ENDDO
?
”全部显示完成”
ENDIF
2、计数循环
FOR循环变量=初值TO终值[STEP步长]
语句序列
ENDFOR
说明:
(1)当省略步长值时,系统默认步长值为1.当初值小于终止值时,步长值为正值,当初值大于终值时,步长值为负值.步长值不能为0,否则会造成死循环.
(2)可在循环体内嵌入[LOOP]和[EXIT]命令,功能和用法与条件循环中该命令的用法相同.
例1:
求1~100的和
SUM=0
FORn=1TO100
SUM=SUM+n
ENDFOR
?
’1~100的总和为:
’,SUM
使用DOWHILE实现:
SUM=0
n=1
DOWHILEn<=100
SUM=SUM+n
n=n+1
ENDDO
?
’1~100的总和为:
’,SUM
FOR和IF语句嵌套
例2:
求1到N之间能被3整除的数的和
CLEAR
M=0
INPUT“请输入N的值:
”TON
FORX=1TON
IFMOD(X,3)=0
M=M+X
ENDIF
ENFOR
?
”M的值为:
”,M
RETURN
例3:
找出2-100之间所有的质数
算法研究:
FORI=1TO100
如果此数是质数
显示这个数
ENDFOR
判断一个数是不是质数,应该看它是否能被其它数整除.
当一个数I,从I从2到SQRT(X)都没有数能被整除,那么它就是
FORJ=2TOINT(SQRT(I))
IFIMODJ=0
EXIT
ENDIF
ENDFOR
IFJ>INT(SQRT(I))
?
I,’是质数’
ENDIF
特别:
2是个质数.
综上所叙述:
完成程序为:
CLEAR
?
’2是质数’
FORI=3TO10
FORJ=2TOINT(SQRT(I))
IFMOD(I,J)=0
EXIT
ENDIF
ENDFOR
IFJ>INT(SQRT(I))
?
I,’是质数’
ENDIF
ENDFOR
3、库文件扫描循环
SCAN范围FOR/WHILE条件
语句序列
ENDSCAN
例1:
查询所有入校总分在570以上的人.
CLEAR
CLOSEALL
USE学生
SCANFOR入校总分>570
DISP
ENDSCAN
CLOSEALL
例2:
用户能够循环输入并查找入校总分,直到输入的是负数就退出.
CLEAR
CLOSEALL
USE学生
INPUT“请输入你要查找的入校总分,输入负数则退出:
”TOX
DOWHILEX>=0
SCANFOR入校总分=X
DISP
ENDSCAN
INPUT“请输入你要查找的入校总分:
”TOX
ENDDO
例3:
编写程序,对于学生.dbf能够在程序末尾循环插入新记录(掌握)
CLEAR
CLOSEALL
USE学生
DOWHILE.T.
APPEBLANK
@5,20SAY'学号'GET学号
@5,40SAY'姓名'GET姓名
@7,20SAY'性别'GET性别
@7,30