第九章程序二.docx
《第九章程序二.docx》由会员分享,可在线阅读,更多相关《第九章程序二.docx(15页珍藏版)》请在冰豆网上搜索。
![第九章程序二.docx](https://file1.bdocx.com/fileroot1/2023-2/2/f3dd9e42-4955-4fe3-b7da-281d61c24237/f3dd9e42-4955-4fe3-b7da-281d61c242371.gif)
第九章程序二
第九章程序设计基础
(二)
三种基本结构
顺序、分支、循环
一、分支语句:
1、IF语句
单向选择:
IF条件双向选择:
IF条件
执行语句执行语句
ENDIFELSE
执行语句
ENDIF
例1:
用户输入数据表文件名,判断它存在否,如果存在则打开数据表文件并显示表中的全部记录。
clear
accept'请输入数据表文件名:
'toheng&&想想可不可以用input
iffile(heng+'.dbf')&&了解file()的使用方法
use&heng&&想想这儿为什么要用&代换
list
else
?
'sorry,文件不存在.'
endif
closeall&&关闭所有打开的表,如果不涉及多工作区,可以只使用use
IF语句的嵌套:
例2:
将用户输入的小写英文字母转化成大写
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
二、多向选择:
(多路选择)
DOCASE
CASE<条件表达式1>
<命令序列1>
CASE<条件表达式2>
<命令序列2>
……
[OTHERWISE//其它情况
<命令序列>]
ENDCASE
说明:
OTHERWISE可以没有.
例3:
邮局负责邮购小物品规则如下:
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,’元人民币’
三、循环语句:
1、DOWHILE条件
语句序列
LOOP&&提前结束本次循环
语句序列
EXIT&&退出循环体
ENDDO
要退出循环,需要条件为假的时候(条件=.F.时)
执行过程:
例4
clear
n=1
sum1=0
dowhilen<=100
sum1=sum1+n
n=n+1
enddo
?
”1+2+3+…..100的和为:
”,str(sum1,4)
cancel
例5
clear
i=1
dowhilei<=5
?
?
space(6-i)
?
?
"*******"
?
i=i+1
enddo
cancel
2、计数循环:
FOR循环变量=初值TO终值[STEP步长]
语句序列
LOOP&&提前结束本次循环
语句序列
EXIT&&退出循环
ENDFOR/NEXT
执行过程:
例6:
求1~100的和
SUM=0
FORI=1TO100
SUM=SUM+I
ENDFOR
?
’1~100的总和为:
’,SUM
使用DOWHILE实现:
SUM=0
I=1
DOWHILEI<101
SUM=SUM+I
I=I+1
ENDDO
?
’1~100的总和为:
’,SUM
3、指针循环:
SCAN范围FOR/WHILE条件
语句序列
LOOP&&提前结束本次循环
语句序列
EXIT&&退出循环
ENDSCAN
执行过程:
首先判断EOF()的值,为真则结束循环;否则结合FOR/WHILE子句执行循环体部份,记录指针移到指定范围和条件内的下一条记录,重新判断EOF()的值,直到为真则结束循环.
另外:
若语句中有QUIT、RETURN、CANCEL等命令也可以退出
例如:
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中
例7:
三种方法实现显示出全部的男生。
使用DOWHILE循环:
CLEAR
CLOSEALL
USE学生
DOWHILENOTEOF()
IF性别=’男’
DISP
ENDIF
SKIP
ENDDO
CLOSEALL
使用FOR循环:
CLEAR
CLOSEALL
USE学生
COUNTTOX
GOTOP
FORI=1TOX
IF性别=’男’
DISP
ENDIF
SKIP
ENDFOR
CLOSEALL
使用SCAN循环:
CLEAR
CLOSEALL
USE学生
SCANFOR性别=’男’
DISP
ENDSCAN
CLOSEALL
例8(LOOP语句的使用方法:
提前结束本次循环)
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)
例9:
通过键盘输入三角形的边长,若边长正确,立即在屏幕上显示三角形的面积,若边长不正确,重新输入边长,若输入的边长中任意一边为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
例10:
有下列表:
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
例题11:
fork=1to10
ifk%2=0
loop
endif
?
”OK”
endfor
请问显示了多少个OK?
例题12:
在学生表里查询所有入校总分在570以上的人.
CLEAR
CLOSEALL
USE学生
SCANFOR入校总分>570
DISP
ENDSCAN
CLOSEALL
例13:
用户可以循环输入并查找入校总分,直到输入的是负数就退出.
CLEAR
CLOSEALL
USE学生
INPUT“请输入你要查找的入校总分,输入负数则退出:
”TOX
DOWHILEX>=0
SCANFOR入校总分=X
DISP
ENDSCAN
INPUT“请输入你要查找的入校总分:
”TOX
ENDDO
实验:
循环插入新记录,并输入数据。
答案见210.41.166.233中省等级考试辅导资料:
VF程序部分。
例14:
现有表STUDENT.DBF和学生成绩.DBF,编写程序,对两张表建立关联,用户可以循环查询:
输入某个同学的姓名后,该程序能够修改关于他所选课程的分数.(此题仅理解)
其中STUDENT.DBF信息如下:
(学号C(6),姓名C(8),性别C
(2),出生日期D,高考成绩N(6,1))
学生成绩.DBF信息如下:
(学号C(6),课程号C(3),分数N
(2))
思路:
先建立好关联,因为STUDENT对学生成绩是一对多的关系,所有最好将STUDENT做子表,就不用SETSKIPTO命令了.然后通过STUDENT中的姓名获得学号,再在表学生成绩.dbf中进行查找和课程分数的修改.
CLEAR
CLOSEALL
SELE2
USESTUDENT
INDEXON学号TAGXH
SELE1
USE学生成绩
SETRELATO学号INTOB&&建立关联,学生成绩作为父表
DOWHILE.T.
ACCEPT“请输入你想查询的人姓名”TONAME
SELE2
LOCATEFOR姓名=NAME&&先在表STUDENT中查找姓名
IFFOUND()
NUM=学号&&获得姓名对应的学号
SELE1&&转换到表学生成绩中
LOCATEFOR学号=NUM&&根据刚才姓名对应的学
&&学生成绩中循环找,因为一个学生可能有几个课程成绩
DOWHILENOTEOF()
@4,8SAY学号
@4,20SAYB.姓名
@4,34SAY课程号
@6,10SAY‘分数’GET分数
READ
CLEAR
CONTINUE
ENDDO
ELSE
?
’SORRY,NOFIND.’
ENDIF
WAIT“你想继续查询修改数据吗?
(Y/N):
”TOASK
IFASK=’n’ORASK=’N’
CLEAR
LIST学号,B.姓名,课程号,分数
CLOSEALL
CANCEL
ENDIF
CLEAR
ENDDO
编写程序,对于学生.dbf能够在程序末尾循环插入新记录
(要求:
必须使用@行,列say...get..输入数据)
CLEAR
CLOSEALL
USE学生
DOWHILE.T.
APPEBLANK
@5,20SAY'学号'GET学号
@5,40SAY'姓名'GET姓名
@7,20SAY'性别'GET性别
@7,30SAY'出生年月'GET出生年月
@9,20SAY'入校总分'GET入校总分
READ
WAIT'你想继续插入新记录吗?
(Y/N):
'TOX
IFX='N'ORX='n'
EXIT
ENDIF
CLEAR
ENDDO
CLEAR
LIST
CLOSEALL
编写程序,该程序能够顺序修改表学生.DBF中的所有数据。
(要求:
必须使用@行,列say...get..进行数据修改)
CLEAR
CLOSEALL
USE学生
DOWHILE.T.
ifeof()
exit
endif
@5,20SAY'学号'GET学号
@5,40SAY'姓名'GET姓名
@7,20SAY'性别'GET性别
@7,30SAY'出生年月'GET出生年月
@9,20SAY'入校总分'GET入校总分
READ
WAIT'你想继续修改记录吗?
(Y/N):
'TOX
IFX='N'ORX='n'
EXIT
ENDIF
CLEAR
SKIP
ENDDO
CLEAR
LIST
CLOSEALL
例4.39打印九九表(嵌套循环)
clear
settalkoff
forI=1to9
?
?
str(I,2)
endfor
?
forj=1to9
fork=1toj
?
?
str(j*k,2)
endfor
?
endfor
cancel