1、程序设计基础第六章 本章要点本章要点6.1 程序6.2 选择结构6.3 循环结构程序设计的概念 VFP有两种工作方式:交互方式和程序方式。交互方式是在命令窗口中直接输入命令或通过选择菜单来执行VFP命令。但在实际应用中,许多任务是要执行一组命令来完成的。如果采用在命令窗口中逐条输入命令的方式进行,不仅效率不高,而且容易出错。特别是当该任务要反复执行,或者当处理的问题较复杂时,这种交互方式几乎是不可行的,应当采用程序方式。6.1 程序 程序是能够完成指定任务的命令序列。将这组命令序列以文件形式保存,该文件称为程序文件或命令文件。在运行程序时,系统将按照一定的次序自动执行其中的各条命令,从而实现通
2、过程序控制自动执行一系列操作,以完成指定任务。程序文件的基本操作程序文件的基本操作一、程序文件的建立和编辑一、程序文件的建立和编辑命令格式:命令格式:modi comm modi comm 功能:建立或修改指定的程序文件。功能:建立或修改指定的程序文件。说明:说明:(1 1)系统默认的程序文件扩展名为)系统默认的程序文件扩展名为.prg(2)若用户指定了)若用户指定了,执行该命令时,系,执行该命令时,系统首先检索磁盘文件,如果此文件存在,则打开该统首先检索磁盘文件,如果此文件存在,则打开该文件,若指定文件不存在,则建立一个新的空程序文件,若指定文件不存在,则建立一个新的空程序文件,其文件名即为
3、指定的文件,其文件名即为指定的。二、保存命令文件二、保存命令文件(ctrl+w)(ctrl+w)三、运行命令文件三、运行命令文件(do(do 文件名文件名)例如例如6.1 统计第一学期有考试成绩的学生人数与平均成绩统计第一学期有考试成绩的学生人数与平均成绩设置步骤设置步骤:(1 1)创建文件:)创建文件:modi comm MyProg1modi comm MyProg1(2)编写代码)编写代码(3)保存文件)保存文件(4)结束编程)结束编程(5)调试、运行程序,直到程序完全正确)调试、运行程序,直到程序完全正确8常用命令常用命令1.程序注释语句:格式一:格式一:NOTE 格式二:格式二:*格
4、式三:格式三:&92.RETURN命令格式:命令格式:return 功能:终止本程序的执行,把程序控制权返回给本功能:终止本程序的执行,把程序控制权返回给本程序的调用者。程序的调用者。如果一个程序中没有包含如果一个程序中没有包含return命令,当执行完本程命令,当执行完本程序最后一条命令后,系统同样也把程序控制权返回序最后一条命令后,系统同样也把程序控制权返回给本程序的调用者。给本程序的调用者。3 3、输入输出命令输入输出命令(交互式命令交互式命令)程序的正确运行,必然需要操作人员与内程序的正确运行,必然需要操作人员与内存变量之间进行信息交流。存变量之间进行信息交流。VFP提供了许多进提供了
5、许多进行这类数据交流的命令。行这类数据交流的命令。ACCEPT语句语句语句格式:语句格式:ACCEPT ACCEPT to to 执行该命令时,暂停程序的运行,显示命令中的执行该命令时,暂停程序的运行,显示命令中的字符表达式作为提示信息,等待用户从键盘输入字符字符表达式作为提示信息,等待用户从键盘输入字符串。系统将接受的字符串存入指定的内存变量,程序串。系统将接受的字符串存入指定的内存变量,程序继续运行。继续运行。功能说明:功能说明:系统将用户的输入一律作为字符串,输入时不必加系统将用户的输入一律作为字符串,输入时不必加定界符,以回车结束输入;定界符,以回车结束输入;可选的提示信息可以是字符型
6、常量、变量或表达式。可选的提示信息可以是字符型常量、变量或表达式。如果是字符串常量,则必须使用字符串定界符。如果是字符串常量,则必须使用字符串定界符。例如例如:查询指定学生的信息(文件名例查询指定学生的信息(文件名例6-1)INPUT语句语句语句格式:语句格式:INPUT INPUT to to 功能注释:功能注释:用户输入的数据可以是数值型、逻辑型、日期型、用户输入的数据可以是数值型、逻辑型、日期型、日期时间型或字符型,以回车结束输入;日期时间型或字符型,以回车结束输入;输入字符串时必须加定界符;输入逻辑型常量时输入字符串时必须加定界符;输入逻辑型常量时要用圆点定界,如(要用圆点定界,如(.
7、T.,.F.T.,.F.);输入日期型常量时要);输入日期型常量时要用大括号,如用大括号,如1962/06/121962/06/12;INPUTINPUT命令一般是用来输入数值型数据。命令一般是用来输入数值型数据。例如例如:查询指定年份出生的学生的信息查询指定年份出生的学生的信息(文件名例文件名例6-2)6-2)13常用命令常用命令4.4.设置是否输出非显示命令的执行结果设置是否输出非显示命令的执行结果 命令格式:命令格式:SETSETTALKTALKONONOFFOFF 功能:功能:VFPVFP在执行一些非显示命令(如在执行一些非显示命令(如SELESELE命令)命令)时,将把执行结果等信息
8、送到时,将把执行结果等信息送到VFPVFP主窗口、状态栏或主窗口、状态栏或用户自定义窗口里。可使用开关用户自定义窗口里。可使用开关SET TALK ON/OFF SET TALK ON/OFF 显示或关闭这些提示信息。显示或关闭这些提示信息。如在例如在例6.16.1的程序的第一行加上命令的程序的第一行加上命令 SET TALK SET TALK ONON,对比其运行结果。,对比其运行结果。结构化程序的基本结构结构化程序的基本结构一、顺序结构一、顺序结构 分析书例分析书例6.3(myprog2)6.3(myprog2)二、选择结构二、选择结构三、循环结构三、循环结构 6.2 6.2 选择结构选择
9、结构1 1、条件语句(、条件语句(IFIFENDIFENDIF)2 2、IFFIFF函数函数3 3、IFIF语句的嵌套语句的嵌套4 4、分支语句、分支语句(DO CASE(DO CASEENDCASE)ENDCASE)1 1、条件语句、条件语句语句格式:语句格式:IF IF 1 ELSE ELSE 2 ENDIF ENDIF是逻辑表达式。当程序执行到是逻辑表达式。当程序执行到IF语句时,语句时,首先判断首先判断是否成立。如果是否成立。如果为为“真真”时,时,则执行则执行语句,否则(即语句,否则(即为为“假假”)执行)执行。IF语句执行完毕后,再语句执行完毕后,再执行执行ENDIF后面的语句。后
10、面的语句。选择结构中可以没有选择结构中可以没有ELSE部分。这样的话,当程序部分。这样的话,当程序执行到执行到IF语句时,首先判断语句时,首先判断是否成立。如果是否成立。如果为为“真真”时,则执行时,则执行语句,否则直接语句,否则直接转向转向ENDIF后面的语句去执行。后面的语句去执行。IF和和ENDIF必须成对出现,必须成对出现,IF是该结构的入口,是该结构的入口,ENDIF是该结构的出口。是该结构的出口。IF语句只能在程序中使用,不能在命令窗口中使用语句只能在程序中使用,不能在命令窗口中使用为了使程序的结构层次清晰、减少编写错误,增加为了使程序的结构层次清晰、减少编写错误,增加程序的可读性
11、,一般按缩进程序的可读性,一般按缩进(锯齿形锯齿形)格式书写。即将该格式书写。即将该结构的入口和出口语句写在同一纵坐标位置上,而将结构的入口和出口语句写在同一纵坐标位置上,而将嵌套其中的其他结构语句向右缩若干格。嵌套其中的其他结构语句向右缩若干格。IF语句举例语句举例1CLEARinput 请输入一个数:请输入一个数:TO xIF MOD(x,2)=0 THEN y=是偶数。是偶数。ELSE y=是奇数。是奇数。ENDIF?STR(x)+yRETURN判断从键盘输入的任何一个整数的奇偶。若不是判断从键盘输入的任何一个整数的奇偶。若不是整数,则取整判断。整数,则取整判断。2 2、IFFIFF函数
12、函数格式:格式:IIF(IIF(,2)说明说明:是逻辑表达式。当是逻辑表达式。当为为“真真”时,时,该表达式的返回值为该表达式的返回值为,否则,否则,该表达式的该表达式的返回值为返回值为,。如:如:z=IIF(x=y,x,y),将返回将返回x与与y中的较大者中的较大者作为函数的返回值,并赋给作为函数的返回值,并赋给z。IIF函数的功能和函数的功能和IF-ELSE-ENDIF语句非常相似,可语句非常相似,可以用以用IF语句取代语句取代IIF函数,如函数,如IIF(x=y,x,y)可用如下可用如下IF语句取代。语句取代。IF x=y z=x ELSE z=y ENDIF有些有些IF语句也可以用语句
13、也可以用IIF函数代替,但不是所有的。函数代替,但不是所有的。如,判断数的奇偶性程序中的如,判断数的奇偶性程序中的IF语句语句 IF MOD(x,2)=0 THEN y=是偶数。是偶数。ELSE y=是奇数。是奇数。ENDIF 相当于相当于IIF(mod(x,2)=0,”是偶数是偶数”,“是奇数是奇数”)3 3、IFIF语句的嵌套语句的嵌套 VFP对选择结构中的命令或语句没有特别的规对选择结构中的命令或语句没有特别的规定或限制,只要是合法的定或限制,只要是合法的VFP命令或语句就行。命令或语句就行。IF语句也是合法的语句也是合法的VFP语句,因此,在语句,因此,在IF语句内部也语句内部也可以包
14、含可以包含IF语句,这就是语句,这就是IF语句的嵌套。语句的嵌套。IF的嵌套语句举例的嵌套语句举例CLEARinput 请输入一个数:请输入一个数:TO xIF INT(X)=X IF MOD(x,2)=0 THEN y=是偶数。是偶数。ELSE y=是奇数。是奇数。ENDIF?STR(x)+yELSE?输入的数不是整数。输入的数不是整数。ENDIFRETURN判断从键盘输入的任何一个数的奇判断从键盘输入的任何一个数的奇偶性。若不是整数,则显示偶性。若不是整数,则显示“输入输入的数不是整数的数不是整数”。4 4、分支语句、分支语句语句格式:语句格式:DO CASEDO CASE CASE CA
15、SE 1 1 CASE CASE 2 2 CASE CASE N N OTHERWISE OTHERWISE N+1 ENDCASE ENDCASE功能:功能:根据根据n个条件表个条件表达式的逻辑值,达式的逻辑值,选择执行选择执行n+1个个语句序列中的一语句序列中的一个。个。说明:说明:1当系统执行当系统执行DO CASEENDCASE语句时,依次判语句时,依次判断断CASE后面的条件是否成立,当发现某个后面的条件是否成立,当发现某个CASE条件条件成立时,就执行该成立时,就执行该CASE与下一个与下一个CASE之间的语句序之间的语句序列,然后跳出列,然后跳出DO CASE结构,转去执行结构,
16、转去执行ENDCASE后后面的语句。如果所有面的语句。如果所有CASE条件都不成立条件都不成立,则执行则执行OTHERWISE与与ENDCASE之间语句序列,然后执行之间语句序列,然后执行ENDCASE后面的语句。后面的语句。2DO CASE结构中可以没有结构中可以没有OTHERWISE部分。这样部分。这样的话,当所有的话,当所有CASE条件都不成立时,就直接跳出条件都不成立时,就直接跳出DO CASE结构,转去执行结构,转去执行ENDCASE后面的语句后面的语句.3不管有几个不管有几个CASE条件成立,只有最先成立的那条件成立,只有最先成立的那个个CASE条件后的语句序列被执行。条件后的语句
17、序列被执行。4DO CASE和和ENDCASE必须成对出现,必须成对出现,DO CASE是该结构的入口,是该结构的入口,ENDCASE是该结构的出口。是该结构的出口。DO CASE与第一个与第一个CASE项之间不能有任何语句。项之间不能有任何语句。5与与IF语句一样,语句一样,DO CASE语句只能在程序中使用,语句只能在程序中使用,不能在命令窗口中使用。不能在命令窗口中使用。6DO CASE结构一般按缩进格式书写。结构一般按缩进格式书写。CASE语句举例语句举例CLEARinput 请输入一个数:请输入一个数:TO xDO CASE CASE INT(X)!=X?输入的数不是整数输入的数不是
18、整数 CASE MOD(x,2)=0?该数是偶数。该数是偶数。CASE MOD(x,2)=0 y=该数是奇数。该数是奇数。ENDCASERETURN判断从键盘输入的任何一个数的奇判断从键盘输入的任何一个数的奇偶性。若不是整数,则显示偶性。若不是整数,则显示“输入输入的数不是整数的数不是整数”。6.3 循环结构循环结构 循环是程序设计中的一种重要的方法。循环就是循环是程序设计中的一种重要的方法。循环就是程序在执行的过程中,其中的某段代码被重复执行程序在执行的过程中,其中的某段代码被重复执行若干次。被重复执行的这段代码称为循环体。若干次。被重复执行的这段代码称为循环体。VFP中支持循环结构的语句包
19、括:中支持循环结构的语句包括:(1)DO WHILE-ENDDO (2)FOR-ENDFOR (3)SCAN-ENDSCANDO WHILE语句格式:语句格式:DO WHIL DO WHIL 1 LOOP LOOP 2 EXIT EXIT 3 ENDDO ENDDO 当系统执行进入当系统执行进入DO WHILE结构时,首先判结构时,首先判断循环条件是否成立。如果循环条件成立,则执行断循环条件是否成立。如果循环条件成立,则执行DO WHILE与与ENDDO之间语句序列(即循环体)。之间语句序列(即循环体)。当执行到当执行到ENDDO时,返回到时,返回到DO WHILE,再次判,再次判断循环条件是
20、否成立,以确定是否再次执行循环体,断循环条件是否成立,以确定是否再次执行循环体,如此循环,直到循环条件不成立,结束该循环语句,如此循环,直到循环条件不成立,结束该循环语句,执行执行ENDDO后面的语句。后面的语句。循环体中可以使用两条特殊的命令:循环体中可以使用两条特殊的命令:LOOP命命令和令和EXIT命令。命令。如果循环体包含有如果循环体包含有LOOP命令,那么当执行到命令,那么当执行到LOOP命令时,就结束本次循环(如同执行到命令时,就结束本次循环(如同执行到ENDDO一样),即不再执行一样),即不再执行LOOP到到ENDDO之之间的语句,返回间的语句,返回DO WHILE处再判断循环条
21、件是处再判断循环条件是否成立。否成立。如果循环体包含有如果循环体包含有EXIT命令,那么当执行到命令,那么当执行到EXIT命令时,就立即结束该循环语句,执行命令时,就立即结束该循环语句,执行ENDDO后面的语句。后面的语句。说明:说明:1ENDDO必须与必须与DO WHILE成对出现,缺一不可成对出现,缺一不可2LOOP命令和命令和EXIT命令只能用在循环结构中,通命令只能用在循环结构中,通常出现在循环体内嵌套的选择语句中。常出现在循环体内嵌套的选择语句中。3避免陷入避免陷入“死循环死循环”。循环体中必须包含能对。循环体中必须包含能对产生影响的命令,否则,若产生影响的命令,否则,若的值永远为的
22、值永远为真(真(.T.),循环将不会结束。这种现象称为),循环将不会结束。这种现象称为“死循死循环环”。4为了增加程序的可读性,一般按缩进格式书为了增加程序的可读性,一般按缩进格式书写。写。5与与IF语句一样,语句一样,DO WHILE语句只能在程序中语句只能在程序中使用,不能在命令窗口中使用。使用,不能在命令窗口中使用。DO WHILE语句举例语句举例1例例 计算计算1+2+3+1+2+3+100+100的结果的结果 clearclear s=0 s=0 i=1 i=1 do while i=100 do while i=100 s=s+i s=s+i i=i+1 i=i+1 enddo e
23、nddo?”s=”,s?”s=”,s return return循环过程的分析循环过程的分析:第第1次次:(条件条件i=1满足循环满足循环)S=1 i=2第第2次次:(条件条件i=2满足循环条件满足循环条件)S=3 i=3第第100次次:(条件条件i=100满足循环条件满足循环条件)S=5050 i=101第第101次次:(条件条件i=101,不满足循环条不满足循环条件件,退出退出)计算计算1+3+99clearclears=0s=0i=1i=1do while i=100do while i=100 s=s+i s=s+i i=i+2 i=i+2enddo enddo 二、二、FOR-END
24、FORFOR-ENDFOR循环语句循环语句 如果事先可以决定循环的次数如果事先可以决定循环的次数,使用使用FOR-ENDFOR语句更加清晰、方便。语句更加清晰、方便。语句格式:语句格式:FOR FOR=TO TO STEP STEP 1 LOOP LOOP 2 EXIT EXIT 3 ENDFOR/NEXT ENDFOR/NEXT 当系统执行进入当系统执行进入FOR循环结构时,首先将初值赋循环结构时,首先将初值赋给循环变量,再将循环变量的值与终值比较,判断循给循环变量,再将循环变量的值与终值比较,判断循环条件是否成立。如果循环变量的值在初值与终值范环条件是否成立。如果循环变量的值在初值与终值范
25、围内,表示循环条件成立,则执行围内,表示循环条件成立,则执行FOR与与ENDFOR之间的语句序列(即循环体),然后循环变量的值增之间的语句序列(即循环体),然后循环变量的值增加一个增量,并再次判断循环条件是否成立,以确定加一个增量,并再次判断循环条件是否成立,以确定是否再次执行循环体。若循环变量的值已超出初值与是否再次执行循环体。若循环变量的值已超出初值与终值范围,表示循环条件不成立,则结束该循环结构,终值范围,表示循环条件不成立,则结束该循环结构,执行执行ENDFOR后面的语句。后面的语句。说明:说明:1ENDFOR和和NEXT是等价的。是等价的。2FOR、ENDFOR或或NEXT成对出现,
26、缺一不可。成对出现,缺一不可。3、都可以是数值表达式都可以是数值表达式,但它们仅在控制进入循环结构时被计算一次但它们仅在控制进入循环结构时被计算一次,而在整而在整个循环语句的执行过程中不再改变。个循环语句的执行过程中不再改变。4是描述循环快慢的量,可以是正值,即递是描述循环快慢的量,可以是正值,即递增,也可以是负值,即递减。当增量为增,也可以是负值,即递减。当增量为1时,时,STEP可以省掉。若增量为正值,则当循环变量的值小于等可以省掉。若增量为正值,则当循环变量的值小于等于终值时,循环条件成立;若增量为负值,则当循环于终值时,循环条件成立;若增量为负值,则当循环变量的值大于等于终值时,循环条
27、件成立变量的值大于等于终值时,循环条件成立5可以在循环体内改变循环变量的值,但循环次数可以在循环体内改变循环变量的值,但循环次数也随之改变。也随之改变。FOR语句举例语句举例例例 计算计算1+2+3+1+2+3+100+100的结果的结果 clearclear s=0 s=0for i=1 to 100for i=1 to 100 s=s+i s=s+i endfor endfor?”s=”,s?”s=”,s return return循环过程的分析循环过程的分析:第第1次次:(i=1满足满足i100循环条件循环条件)S=1 i=2第第2次次:(i=2满足满足i100循环条件循环条件)S=3
28、i=3第第100次次:(i=100满足循环条件满足循环条件)S=5050 i=101第第101次次:i=101,不满足循环条件不满足循环条件,退退出循环出循环,执行执行?”s=”,s语句语句 三、循环语句三、循环语句SCAN-ENDSCANSCAN-ENDSCAN 如果需要对数据表指定的若干记录依次执行相同的如果需要对数据表指定的若干记录依次执行相同的操作,使用操作,使用SCAN-ENDSCAN语句更加清晰、方便。语句更加清晰、方便。语句格式:语句格式:SCAN SCAN FORFORWHILE WHILE (语句行序列)(语句行序列)LOOPLOOP (语句行序列)(语句行序列)EXITEX
29、IT (语句行序列)(语句行序列)ENDSCANENDSCAN 当系统执行进入当系统执行进入SCAN循环结构时,记录指针自循环结构时,记录指针自动、依次地在当前数据表的指定范围内满足条件的动、依次地在当前数据表的指定范围内满足条件的记录上移动,对每一条记录执行语句序列(即循环记录上移动,对每一条记录执行语句序列(即循环体)。体)。说明:说明:1的默认值为的默认值为ALL。2SCAN、ENDSCAN成对出现,缺一不可。成对出现,缺一不可。SCAN语句举例语句举例1例例 逐条显示教师表的每一条记录逐条显示教师表的每一条记录 clearclear use use 教师教师 scanscan disp
30、lay display endscan endscan use use return returnSCAN语句举例语句举例2例例 逐条显示教师表中女教师的每一条记录逐条显示教师表中女教师的每一条记录 clearclear use use 教师教师 scan for scan for 性别性别=女女 display display endscan endscan use use return return在在SCAN语句中加语句中加LOOP子句改写上述例子子句改写上述例子 clear clear use use 教师教师 scan scan if if 性别性别=女女 display displ
31、ay else else loop loop endif endif endscan endscan use use return return用用FOR语句改写上述例子语句改写上述例子例例 逐条显示每位女教师的记录逐条显示每位女教师的记录clearclearuse use 教师教师 sele count(sele count(*)from)from 教师教师 into arra into arra 记录总数记录总数 for i=1 to for i=1 to 记录总数记录总数 go igo i if if 性别性别=女女 disp disp endif endif endfor endfor use use return return用用DO WHILE语句改写上述例子语句改写上述例子例例 逐条显示每位女教师的记录逐条显示每位女教师的记录clearclearuse use 教师教师 do while.not.eof()if if 性别性别=女女 disp disp endif endif skip skip enddo enddo use use return return