第十二章循环结构程序设计
一、利用DO WHILE ……ENDDO语句构造循环
1.计算S=1+2+3+……+100累加和
SET TALK OFF
CLEAR
SUM=0
COUNTER=1
DO WHILE COUNTER<=100
SUM=SUM+COUNTER
COUNTER=COUNTER+1
ENDDO
?"S=",SUM
SET TALK ON
RETURN
运行结果为:
2.计算S=1+1/3+1/5+1/7……+1/99
SET TALK OFF
CLEAR
SUM=0
COUNTER=1
DO WHILE COUNTER<=99
SUM=SUM+1/COUNTER
COUNTER=COUNTER+2
ENDDO
?"S=",SUM
SET TALK ON
RETURN
运行结果为:
3.显示STUDENT表中入学成绩在540分以上的记录
CLEAR
USE STUDENT
DO WHILE NOT EOF()
IF 入学成绩>=540
DISPLAY
WAIT "按任意键继续"
SKIP
ELSE
SKIP
ENDIF
ENDDO
USE
RETURN
运行结果为:
3.在员工表中查找员工信息
SET TALK OFF
CLEAR
USE Rsda.dbf
DO WHILE .T.
CLEAR
ACCEPT "请输入员工编号:" TO ZHGNO
LOCATE FOR 编号=ZHGNO
IF .NOT.EOF()
DISPLAY 编号,姓名,部门代码,职称,基本工资
ELSE
?"查无此人!"
ENDIF
WAIT "" TO P
IF UPPER(P)<>"Y"
USE
EXIT
ENDIF
ENDDO
SET TALK ON
RETURN
运行结果为:
二、利用FOR…ENDFOR语句构造循环
1.求出100~999之间的所有水仙花数
SET TALK OFF
CLEAR
FOR I=100 TO 999
a=MOD(I,10)
b=MOD(I-a,100)/10
c=(I-a-10*b)/100
IF I=a^3+b^3+c^3
?I
ENDIF
ENDFOR
SET TALK ON
RETURN
运行结果为:
2.将给定字符串反序输出显示
CLEAR
STORE "DCBA4321" TO X
Y=SPACE(0)
FOR I=LEN(X) TO 1 STEP -1
Y=Y+SUBSTR(X,I,1)
ENDFOR
?X+"的反序为:"+Y
RETURN
运行结果为:
3.计算1!+2!+3!+……10!的计算
SET TALK OFF
CLEAR
SUM=0
FOR I=1 TO 10
X=1
FOR J=1 TO I
X=X*J
ENDFOR
SUM=SUM+X
ENDFOR
?"1!+2!+……+10!=",SUM
SET TALK ON
RETURN
运行结果为:
单层循环实现:
CLEAR
JC=1
S=0
I=1
DO WHILE I<=10
JC=JC*I
S=S+JC
I=I+1
ENDDO
?"1!+2!+……+10!=",S
RETURN
运行结果为:
4.输入10个数,将其按由小到大的顺序排序
CLEAR
DIMENSION A(10)
FOR I=1 TO 10
INPUT "请输入数据:" TO A(I)
ENDFOR
FOR I=1 TO 9
FOR J=I+1 TO 10
IF A(I)>A(J)
T=A(I)
A(I)=A(J)
A(J)=T
ENDIF
ENDFOR
ENDFOR
?"排序后数据的顺序:"
FOR I=1 TO 10
??A(I)
ENDFOR
RETURN
运行结果为:
三、用SCAN……ENDSCAN设计循环
SET TALK OFF
CLEAR
USE 员工
SCAN FOR 性别="女"
DISPLAY 编号,姓名,性别,部门代码,基本工资
WAIT
ENDSCAN
USE
SET TALK ON
RETURN
运行结果为:
思考与练习
2.关于EXIT与LOOP的说明:
执行LOOP命令时结束本次循环,进入下一循环。
执行EXIT命令时结束循环,执行END ** 下面命令。
4.输入一个年号,判断其是否为闰年。
SET TALK OFF
CLEAR
INPUT "请输入一个年号:" TO YEAR_NUM
DO CASE
CASE MOD(YEAR_NUM,4)=0 AND MOD(YEAR_NUM,100)<>0
?STR(YEAR_NUM)+"是闰年"
CASE MOD(YEAR_NUM,400)=0
?STR(YEAR_NUM)+"是闰年"
OTHERWISE
?STR(YEAR_NUM)+"不是闰年"
ENDCASE
SET TALK ON
RETURN
运行结果为:
5.编写程序计算e
SET TALK OFF
CLEAR
e=1
X=1
Z=1
DO WHILE 1/Z>=0.000001
Y=1
Z=1
DO WHILE Y<=X
Z=Z*Y
Y=Y+1
ENDDO
e=e+1/Z
X=X+1
ENDDO
?"e的值为:",e
SET TALK ON
RETURN
运行结果为:
6.编写程序产生20项斐波那契数列
CLEAR
DIMENSION F(20)
FOR I=1 TO 20
IF I=1 OR I=2
F(I)=1
??STR(F(I))+SPACE(2)
ELSE
F(I)=F(I-1)+F(I-2)
??STR(F(I))+SPACE(2)
ENDIF
ENDFOR
RETURN
运行结果为:
7.求1到100之间所有整数的平方和并输出结果
CLEAR
S=0
X=1
DO WHILE X<=100
S=S+X^2
X=X+1
ENDDO
?"1到100之间所有整数的平方和为:",S
RETURN
运行结果为:
8.STORE 1 TO X
STORE 0 TO Y
DO WHILE X<=20
IF INT(X/2)<>X/2
X=X+1
Y=Y+1
LOOP
ELSE
X=X+1
ENDIF
ENDDO
?X,Y
解析:X=1时,INT(X/2)=0,X/2=0.5,两者不相等,X=X+1=2,Y=Y+1=1,进入下次循环;
X=2时,INT(X/2)=1,X/2=1,两者相等,仅执行X=X+1=3,Y仍为1;
X=3时,INT(X/2)=1,X/2=1.5,两者不相等,X=X+1=4,Y=Y+1=2,进入下次循环;
X=4时,INT(X/2)=2,X/2=2,两者相等,仅执行X=X+1=5,Y仍为2;
X=5时,INT(X/2)=2,X/2=2.5,两者不相等,X=X+1=6,Y=Y+1=3,进入下次循环;
X=6时,INT(X/2)=3,X/2=3,两者相等,仅执行X=X+1=7,Y仍为2;
X=7时,INT(X/2)=3,X/2=3.5,两者不相等,X=X+1=8,Y=Y+1=3,进入下次循环;
X=8时,INT(X/2)=4,X/2=4,两者相等,仅执行X=X+1=9,Y仍为3;
X=9时,INT(X/2)=4,X/2=4.5,两者不相等,X=X+1=10,Y=Y+1=4,进入下次循环;
X=10时,INT(X/2)=5,X/2=5,两者相等,仅执行X=X+1=11,Y仍为4;
以此类推,此时Y在计数的是1-20之间奇数的个数。
故X=21,Y=10
运行结果为:
9.STORE 0 TO N,S
DO WHILE .T.
N=N+1
S=S+N
IF N>=10
EXIT
ENDIF
ENDDO
?"S="+STR(S,2)
解析:计算S=1+2+3+4+5+6+7+8+9的和
运行结果为:
10.成绩表SCORE中课程编号是0001且成绩为80分以上的人数的统计(浏览了表格之后发现没有编号为0001的课程,临时改成了10004)
USE SCORE
S=0
DO WHILE NOT EOF()
IF 课程编号="10004" AND 成绩>80
S=S+1
ENDIF
SKIP
ENDDO
?"课程编号为10004且成绩高于80分的有"+STR(S)+"人"
RETURN
运行结果为: