62程序结构文档格式.docx
《62程序结构文档格式.docx》由会员分享,可在线阅读,更多相关《62程序结构文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
①DOCASE,ENDCASE必须配对使用,且各占一行。
DOCASE是本结构的入口,ENDCASE是本结构的出口。
②DOCASE后面紧接着CASE,且各占一行,中间不能有任何语句。
③不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应命令会执行。
④语句序列里可以出现各种类型的语句,如果又出现多选择结构,则是本语句的嵌套形式。
例:
计算分段函数值:
Y=-1(X<
=0)
1(0<
X<
=10)
2(10<
=20)
3(X>
20)
1(0<
=10)并根据X的奇偶性输出“奇数”或者“偶数”
(4)选择嵌套
语句中的IF和ENDIF,DOCASE-ENDCASE等必须成对出现,嵌套不能出现交叉。
在嵌套中,为了使程序清晰易于阅读,可按缩进格式写。
IF<
IF<
IF<
条件2>
DOCASE
语句序列1CASE<
ELSE语句序列1
语句序列2……
ENDIFCASE<
……语句序列N
ELSE[OTHERWISE
语句序列3语句序列N+1
ENDIFENDCASE
ELSE
……
ENDIF
双选套双选双选套多选
6.2.3.循环结构
在一个大程序段中,常常会重复使用某一段相同的程序段。
在编制程序时,不必重复编写这个程序段,可以用循环结构来代替它。
如对表的操作和计算问题。
VFP6.0提供了三种循环结构的形式,以适应不同情况的应用.
(1)当型循环DOWHILE…ENDDO结构
DOWHILE<
语句序列
[LOOP]
语句序列
[EXIT]
ENDDO
①语句含义(如何执行)
②选择项LOOP和EXIT的含义
③循环条件的设置
第一种:
计数形式
A=1&
&
循环变量初值
DOWHILEA<
=10&
循环变量终值
…
A=A+1&
在循环体中修改变量的值
ENDDO
例:
求1-100的和。
SETTALKOFF
CLEAR
Y=0
X=1
DOWHILEX<
=100
Y=Y+X
X=X+1&
在循环体中修改变量的值
?
’1-100的和为:
’,Y
SETTALKON
CANCEL
思考:
1.退出循环结构后X,Y的值分别是多少?
2.循环结构中的两个语句调换位置后是什么结果?
3.X=X+1改成X=X-1后是什么结果?
求1-100的奇数和。
求1-100之间的非3的倍数的所有奇数之和.
STOR0TOY
DOWHILEX<
IFINT(X/3)<
>
X/3
Y=Y+X
X=X+2
ENDDO
?
’100以内非3的倍数的奇数和为:
’,Y
SETTALKON
CANCEL
求
例:
求1×
2×
3×
4×
…×
99×
100=?
求10!
12+42+72+102+…直到和超过1000为止。
求和为多少,项数为多少。
引入:
计数循环FOR—ENDFOR/NEXT结构(一般在已知循环次数的情况下使用)
FOR<
循环变量>
=<
初值>
TO<
终值>
[STEP<
步长>
]
语句序列
ENDFOR/NEXT
执行过程:
遇到FOR语句时,首先将循环变量的值与终值比较,若超过终值,则结束循环.执行ENDFOR/NEXT后面的语句;
若没有超过终值,则执行循环体.
每执行一次循环,循环变量的值都要自动加上增量(步长值),从而控制循环执行的次数.
说明:
①步长值可正可负。
即超过的含义是:
若步长为正,控制变量递增,直到大于终值停止循环。
若步长为负,控制变量递减,直到小于终值停止循环。
默认步长为1。
②循环次数=INT((终值-初值)/步长)+1
③在此循环体中,循环变量每次加步长是自动加的,不需再加语句,
如果人为的修改控制变量的值,会影响循环的执行次数。
④LOOP语句,EXIT语句在SCAN,FOR结构的功能与在DOWHILE结构中相同.
求1+2+3+……+9+10的和
SETTALKOFF
CLEAR
S=0
FORX=1TO10STEP1*STEP1缺省,默认为1
S=S+X
ENDFOR
’S=’,S
SETTALKON
宰相的麦子:
相传古印度宰相达依尔,是国际象棋的发明者。
有一次,国王因为他的贡献要奖励他,问他想要什么。
达依尔说:
“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:
第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。
”国王一想,这还不容易,于是就答应了宰相,结果在兑现他的承诺时,发现全印度的粮食都不够奖赏的。
请计算国王总共需要奖赏宰相多少粒米。
请分别用For循环和dowhile循环实现。
编程求P=1*2+3*4+5*6+7*8+……+21*22
算法分析:
S=0
FORI=1TO21STEP2
S=S+I*(I+1)
’和是:
’,S或者?
’+STR(S)
RETURN
找出100-999之间的所有“水仙花数”。
所谓水仙花数是指一个三位数,各位数字的立方和等于该数本身。
(如153=13+53+33)
如何分离出一个三位数中的各位数字。
解1:
CLEA
FORI=100TO999
A=INT(I/100)
B=INT((I-100*A)/10)
C=I-INT(I/10)*10
IFI=A^3+B^3+C^3
I
ENDFOR
SETTALKON
RETURN
解2:
S=STR(I,3)
A=VAL(LEFT(S,1)
B=VAL(SUBS(S,2,1))
C=VAL(RIGHT(S,1)
求1-100之间的自然数之和,偶数之和,奇数之和。
LOOP和EXIT的含义和使用方法:
给程序填空:
程序的功能是求1到100之间的奇数和。
Y=0
FORX=1TO100
IFMOD(X,2)=0
-------------
-------------
Y
读程序,写结果:
SETTALKOFF
N=0
DOWHILE.T.
IFN>
=98
EXIT
ENDIF
N=N+2
ENDDO
?
"
N="
+STR(N,3)
RETURN
CLEAR
STORE0TOM,N
DOWHILEM<
6
M=M+1
IFMOD(M,2)=1
LOOP
ELSE
N=N+M
ENDIF
ENDDO
"
N
RETURN
读懂程序:
一个密码校对程序:
密码为字符串‘12345‘。
用户从键盘上输入密码,如果输入的密码正确,则显示“身份正确,欢迎使用本系统”;
如果输入的密码不正确,则显示“请重新输入密码”。
只给用户3次机会,若用户连续3次输入的密码均不正确,则显示“你是非法用户,本系统拒绝你进入!
”
I=0
ACCEPT‘请输入密码:
’TOM
DOWHILEI<
=2
IFM=’12345’
WAIT‘身份正确,欢迎您使用本系统’WINDOWSAT12,30TIMEOUT2
EXIT
ELSE
IFI=2
WAIT‘你是非法用户,本系统拒绝你进入!
’WINDOWSAT12,30
ACCEPT‘请重新输入密码’TOM
I=I+1
ENDDO
编写程序,判断一个大于或等于3的自然数是否为素数。
(思考:
FOR循环结束后循环变量的值)
素数:
除2之外的其他质数,又称素数。
算法分析:
判断M是否为素数,即用2到M-1的每一个整数去除M,如果都除不尽,就是素数,否则不是。
实际证明,不需除到M-1,只需除到INT(SQRT(M)),或者M/2即可。
即只要用从2到INT(SQRT(M))依次去除M,如果都除不尽,即为素数,否则不是。
INPUT[请输入一个大于或等于3的自然数:
]TOM
N=INT(SQRT(M))
FORI=2TON
IFMOD(M,I)=0
EXIT&
退出循环结构(只有条件MOD(M,I)=0成立才能执行到这个语句)
IFI>
N
M,'
是素数'
M,'
不是素数'
输入一个字符串,按其倒序输出。
ACCEPT‘请输入一个字符串’TOA
L=LEN(A)
FORX=LTO1STEP-1
SUBSTR(A,X,1)
第二种:
键盘输入数据
ANS=’Y’
DOWHILEUPPER(ANS)=’Y’
WAIT‘是否继续(Y/N)?
’TOANS&
循环体中输入Y或N,决定是
ENDDO否再次执行循环体
例:
完善程序:
查找表中指定姓名的学生记录.此程序可以实现多次查找,只要输入Y就可以继续查找,输入N停止查找.
第三种:
直接用.T.作为条件,用EXIT退出循环。
DOWHILE.T.&
条件永远成立
EXIT&
只可能在循环体中退出循环
ENDDO
第四种文件头或文件尾的测试
USE<
表文件>
……&
这儿不要出现让指针移动的语句,如果需要在循环之前要把指针移回第一条记录
DOWHILE.NOT.EOF()&
指针没到文件尾,即为真,执行循环体,否则退出
……
SKIP&
每执行一次循环体,指针下移一条记录。
列出XSDA表中1979年以后出生的学生人数,并统计出学生人数。
USEXSDA
N=0
DOWHILENOTEOF()
IF出生日期>
={^1979/01/01}
DISPLAY
N=N+1
SKIP
USE
CANCEL
扫描循环SCAN…ENDSCAN结构
SCANDOWHILENOTEOF()
…………
ENDSCANSKIP
对打开的表指定范围内符合条件的记录逐条进行语句序列中规定的操作.该循环中语句序列每执行一次,表中记录指针下移一条记录.直到表文件记录结束为止.
缺省范围和条件时上面左右两种结构是等同的。
SCAN后如果加条件表示只对符合条件的记录循环。
试着用SCAN……ENDSCAN改写上面的例子(SCAN后可以加指定条件)
对于给定的表XSCJ,增加一个字段,等级C(6),编程实现填充表中的等级字段,如果其计算机成绩<
60分,等级字段填充'
不合格'
如果在60到70之间(不包括70分),填充'
合格'
如果在70到85之间(不包括85分),填充'
良好'
如果在85分到100分之间(包括100分),填充'
优秀'
.
2005上第二套求阶乘
求两个整数M和N的最大公约数和最小公倍数。
最大公约数:
将两个数中大的数给A,小的数给B(用除法取余的方法来求)
(1)求A/B的余数N.
(2)若N=0,,则B为最大公约数
若N<
0,则执行(3)
(3)将B放入A,N放入B,然后再求A/B的余数,回到
(2)
最小公倍数:
两个数的乘积除以最大公约数。
INPUT'
请输入M值'
TOA
请输入N值'
TOB
C=A*B
N=MOD(A,B)
DOWHILEN<
A=B
B=N
'
最大公约数是:
+STR(B)
最小公倍数是:
+STR(C/B)
把此题和表联系起来。
(2005下第四套)
考生文件夹下已有数据表F01.DBF和空数据表
F02.DBF,表结构如下:
F01(数据1(N,4),数据2(N,4))
F02(最大公约数(N,4))
请在考生文件夹下编写程序PROG1.PRG,其功能是:
1)先根据数据表F02.DBF复制一个同结构的空数据表F03.DBF;
2)求F01中“数据1”和“数据2”两字段的最大公约数,并将结果保存到F03的“最大公约数”字段中。
(注:
使用DOWHILE循环编程)(同时操作两张表)
USEF02
COPYTOF03
USEF01&
一号工作区打开F01,F02自动关闭
USEF03IN2&
二号工作区打开F03
SCAN&
在F01所在的1号工作区
A=数据1
B=数据2
N=MOD(A,B)
DOWHILEN<
A=B
B=N
SELE2
APPEBLANK
REPL最大公约数WITHB
SELE1
ENDSCAN
LIST
把素数题和表联系起来:
考生文件夹下已有数据表W1.DBF,表结构如下:
W1(数据(N3))
1.先根据数据表W1.DBF复制一个同结构的空数据表W2.DBF;
2.找出表W1.DBF中的素数,并添加到W2中;
3.对W2中数据按从大到小进行排序,将排序结果存入W3表中。
注:
使用SCAN循环编程)(同时操作两张表)
USEW1
COPYSTRUTOW2
USEW2
SCAN
FORI=2TOINT(SQRT(数据))
IFMOD(数据,I)=0
ENDFOR
IFI>
INT(SQRT(数据))
REPL数据WITHA.数据
ENDSAN
SORTTOW3ON数据/D
USEW3
从键盘输入10个数,然后找出其中的最大值和最小值。
算法:
程序首先读入一个数,一个数的最大值和最小值就是它本身,放入MA,MI两个变量中,然后进入循环语句,依次读入其它9个数。
每读入一个数,就让该数分别与MA,MI相比较。
如果该数大于MA,就放入MA,如果该数小于MI,就放入MI。
即MA和MI总是保存着到目前为止的最大值和最小值。
INPUT‘请输入一个数:
’TOA
STOREATOMA,MI
FORI=2TO10
IFA>
MA
MA=A
IFA<
MI
MI=A
ENDIF
’最大值:
’,MA
’最小值:
’,MI
考生文件夹下已有数据表F01.DBF和空数据表F02.DBF,表结构如下:
F01(数据(N3))
F02(最大数(N3),最小数(N3))
1.先根据数据表F02.DBF复制数据表F03.DBF,在F03中添加一条空白记录;
2.求出表F01中所有数据的最大值和最小值;
3.将结果分别存入F03中的“最大数”和“最小数”字段中。
(注:
使用DOWHILE循环编程)
USEF02
USEF03
APPEBLAN
USEF01
MIN=数据
MAX=数据
SCAN
IF数据<
MIN
IF数据>
MAX
MAX=数据
ENDSCAN
REPL最大数WITHMAX,最小数WITHMIN
USE
XSCJ表中数学,英语,计算机的平均值大于等于80分的计算总分,否则不计算总分
错误的做法:
USEXSCJ
A=(数学+英语+计算机)/3
=80
REPLACE总分WITH数学+英语+计算机
ENDSAN
正确的做法:
USEXSCJ
找出XSCJ表中数学成绩最高的那个学生的学号和数学成绩。
MA=数学
XH=学号
SCAN
IF数学>
ENDSCAN
MA,XH
(4)循环嵌套
在循环体中又包含循环,通常称为多重循环或循环嵌套.
循环中也可以嵌套选择结构。
注意是嵌套,不能交叉。
问题一:
打印图形
打印如下图形
问题2穷举法:
穷举法就是通过把需要解决问题的所有可能情况逐一试验来找出符合条件的解的方法。
这种方法特点是盲目性较大,解决时间可能时间较长。
例.有一道趣味数学题:
有30个人在一家小饭店用餐,其中有男人、女人和小孩。
每个男人花了3块,每个女人花了2块,每个小孩花了1块,一共花去50块。
问男人、女人和小孩各有几人?
•分析:
设有男人、女人、小孩各X,Y,Z个。
则X+Y+Z=30
3X+2Y+Z=50
它是不定方程。
应采用“穷举法”去试根。
FORX=1TO16
FORY=1TO24
Z=30-X-Y
IF3*X+2*Y+Z=50
X,Y,Z
有表D1
把D1复制成DD1。
有若干鸡和兔放在同一个笼子里,H表示共有多少个头,F表示共有多少只脚,在DD1中填充每条记录里鸡和兔的个数。
分析:
对于每一条记录设有鸡和兔各X,Y个。
则X+Y=H
2X+4Y=F
CLOSETABLESALL
USED1
COPYTODD1
USEDD1
SCAN
FORX=1TOH-1&
X表示鸡的个数,Y表示兔的个数
Y=H-X
IFX*2+Y*4=F
REPLACE鸡WITHX
REPLACE兔WITHY
(5)数组问题
1.给一维数组赋值
给一维数组C(10)赋值
(1)赋有规律的数
DIMENSIONC(10)
C
(1)=1
C
(2)=3
C(3)=5
C(9)=17
C(10)=19
(2)由用户自己给值
(3)从表中取值(两种方法)
表M1中只有一个字段XN(5)
方法1:
USEM1
M=RECCOUNT()&
如果改成COUNTTOM下面循环之前还需要加一句:
GO1
DIMENSIONC(M)
N=1
C(N)=X
方法2: