第4章结构化程序设计4.1程序与程序文件4.1.1程序的概念程序是能够完成一定任务的命令的有序集合。一组构成程序的命令被存放的文件称为程序文件或命令文件。4.1.2程序文件的建立、修改与运行程序文件建立、修改与运行方法有多种,下面介绍常用的三种。1、命令方式(1)程序文件的建立和修改命令格式:MODIFYCOMMAND[<程序文件名>|?功能:打开一个编辑窗口,从中可以修改或创建程序文件。(2)程序的运行命令格式:DO<文件名》功能:运行已建立的程序文件。说明:该命令除了可以从命令窗口调用程序外,还可以在程序中使用,可以从一个程序调用子程序。2、通过项目管理器(1)程序文件建立首先打开已建立的项目文件,选择“全部”选项卡中“代码”,并在“代码”中选择“程序”,单击“新建”按钮,在程序编辑窗口中逐条输入程序内容,编辑完按下“保存”按钮。(2)程序文件的运行在“管理项目器”的“代码”选项卡中的“程序”项中,选择程序,按下“运行”按钮,该程序的结果即显示于VFP的主窗口里。3、菜单方式(1)程序文件的建立执行“文件”丨“新建”命令,在对话框中选取择“程序”文件,出现程序编辑窗口,在程序编辑窗口逐条输入程序内容,保存程序文件。(2)程序文件的运行选择菜单“程序”中的“运行”命令,出现“运行”对话框,在“运行”对话框中选择程序文件后单击“运行”按钮。如要运行在程序编辑窗口的当前正在编辑的程序,可单击常用工具栏上的“运行”按钮。4.1.3程序设计中常用的输入输出命令1、ACCEPT命令格式:ACCEPT[<字符表达式>】TO<内存变量>功能:在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。说明:①如果选用<字符表达式>,那么系统会首先显示该表达式的值,作为提示信息,并将输入的字符串赋值给<内存变量>。②该命令只能接收字符串,而不需加定界符,否则系统将把定界符作为字符串的一部分。③若不输入任何字符而直接按回车键,系统将把空串赋值给指定的内存变量。【例4-1】编程从键盘输入学生姓名,在XSDA中查找并显示其内容
第 4 章 结构化程序设计 4.1 程序与程序文件 4.1.1 程序的概念 程序是能够完成一定任务的命令的有序集合。一组构成程序的命令被存放的文件称为程 序文件或命令文件。 4.1.2 程序文件的建立、修改与运行 程序文件建立、修改与运行方法有多种,下面介绍常用的三种。 1、命令方式 (1)程序文件的建立和修改 命令格式:MODIFY COMMAND [<程序文件名>|?] 功能:打开一个编辑窗口,从中可以修改或创建程序文件。 (2) 程序的运行 命令格式:DO <文件名> 功能:运行已建立的程序文件。 说明:该命令除了可以从命令窗口调用程序外,还可以在程序中使用,可以从一个程序 调用子程序。 2、通过项目管理器 (1)程序文件建立 首先打开已建立的项目文件,选择“全部”选项卡中“代码”,并在“代码”中选择“程 序”,单击“新建”按钮,在程序编辑窗口中逐条输入程序内容,编辑完按下“保存”按钮。 (2)程序文件的运行 在“管理项目器”的“代码”选项卡中的“程序”项中,选择程序,按下“运行”按钮, 该程序的结果即显示于 VFP 的主窗口里。 3、菜单方式 (1)程序文件的建立 执行“文件”|“新建”命令,在对话框中选取择“程序”文件,出现程序编辑窗口, 在程序编辑窗口逐条输入程序内容,保存程序文件。 (2)程序文件的运行 选择菜单“程序”中的“运行”命令,出现“运行”对话框,在“运行”对话框中选择 程序文件后单击“运行”按钮。如要运行在程序编辑窗口的当前正在编辑的程序,可单击常 用工具栏上的“运行”按钮。 4.1.3 程序设计中常用的输入输出命令 1、ACCEPT 命令 格式:ACCEPT [<字符表达式>] TO <内存变量> 功能: 在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。 说明: ①如果选用<字符表达式>,那么系统会首先显示该表达式的值,作为提示信息,并将输 入的字符串赋值给<内存变量>。 ②该命令只能接收字符串,而不需加定界符,否则系统将把定界符作为字符串的一部分。 ③若不输入任何字符而直接按回车键,系统将把空串赋值给指定的内存变量。 【例 4-1】编程从键盘输入学生姓名,在 XSDA 中查找并显示其内容
*程序文件名1x4_1.prg。SETTALK OFFCLEARUSE XSDAACCEPT”请输入要查找的学生名:”TOXMLOCATEFOR姓名=XMDISPUSESET TALK ONRETURN2、INPUT命令格式:INPUT[<字符表达式>】TO<内存变量>功能:在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量。说明:如果选用<字符表达式>,那么系统会首先显示该表达式的值,作为提示信息,并将输入的数据赋值给<内存变量>。②可以输入字符型、数值型、逻辑型、日期型等类型数据,而且可以是常量、变量或表达式等形式,按回车键结束输入。③输入非数值型数据要加定界符。如输入逻辑型常量时要用圆点定界(.T.)、输入日期型常量要用大括号(2004-05-10)、输入字符型加””或,,等。【例4-2】编写程序,查找指定籍贯和出生日期以后的学生。*程序文件名1x4_2.prgSET TALK OFFCLEARUSE XSDAINPUT”请输入学生籍贯:”TOJGINPUT"请输入出生日期:”TOCSRQDISPFOR 籍贯=JGAND出生日期>CSRQQ&&结果显示在查询窗口里SET TALK ONUSERETURN在命令窗口输入D0LX43,然后输入”浙江”(字符定界符不可少)和(1980/1/1)(日期定界符不可少),程序运行结果如下图所示。一回文MicrosoftVisualFoxPro文件(E编罐(E)显示V)格式(O)工具(D程序(P)窗口(W)帮助(H)Deaayaa一口国##际?请输入学生籍贯:“浙工”请输入出生日期:(1980/1/1)是否团员糖质器片记次号姜器,榮满炎性别出生日期嘉经10/01/86.T.Gen3、WAIT命令格式:WAIT「<字符表达式>】TO<内存变量>】「WINDOWS】「TIMEOUT<数值表达式》>功能:显示信息并暂停程序执行,当按下任意键或单击鼠标后继续执行。说明:①若字符表达式,系统将先显示字符表达式的值作为提示信息,并将输入的单字符赋值给<内存变量》。若不选用提示信息,则显示默认的提示信息“按任意键继续………”②<内存变量>用来保存用户键入的单字符,其类型只能是字符型。若不选TO<内存变量>短语,键入的单字符不保留。③如果指定WINDOW子句,则会出现一个WAIT提示窗口,在窗口中显示提示信息。提示窗口一般定位于WINDOW子句
*程序文件名 lx4_1.prg。 SET TALK OFF CLEAR USE XSDA ACCEPT "请输入要查找的学生名:" TO XM LOCATE FOR 姓名=XM DISP USE SET TALK ON RETURN 2、INPUT 命令 格式:INPUT [<字符表达式>] TO <内存变量> 功能:在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量。 说明: ①如果选用<字符表达式>,那么系统会首先显示该表达式的值,作为提示信息,并将输 入的数据赋值给<内存变量>。 ②可以输入字符型、数值型、逻辑型、日期型等类型数据,而且可以是常量、变量或表 达式等形式,按回车键结束输入。 ③输入非数值型数据要加定界符。如输入逻辑型常量时要用圆点定界(.T.)、输入日 期型常量要用大括号{^2004-05-10}、输入字符型加”或’’等。 【例 4-2】编写程序,查找指定籍贯和出生日期以后的学生。 *程序文件名 lx4_2.prg SET TALK OFF CLEAR USE XSDA INPUT "请输入学生籍贯:" TO JG INPUT "请输入出生日期:" TO CSRQ DISP FOR 籍贯=JG AND 出生日期>CSRQ &&结果显示在查询窗口里 SET TALK ON USE RETURN 在命令窗口输入 DO LX4_3,然后输入”浙江”(字符定界符不可少)和{^1980/1/1}(日 期定界符不可少),程序运行结果如下图所示。 3、WAIT 命令 格式:WAIT [<字符表达式>] [ TO <内存变量>] [WINDOWS] [TIMEOUT<数值表达式>] 功能:显示信息并暂停程序执行,当按下任意键或单击鼠标后继续执行。 说明: ①若字符表达式,系统将先显示字符表达式的值作为提示信息,并将输入的单字符赋值 给<内存变量>。若不选用提示信息,则显示默认的提示信息“按任意键继续.”。 ②<内存变量>用来保存用户键入的单字符,其类型只能是字符型。若不选 TO <内存变 量>短语,键入的单字符不保留。 ③如果指定 WINDOW 子句,则会出现一个 WAIT 提示窗口,在窗口中显示提示信息。提示 窗口一般定位于 WINDOW 子句
④TIMEOUT选项指在中断WAIT命令之前,等待键盘或鼠标输入的秒数,一旦超时就不再等待用户按键,自动向下执行。【例4-3】用WAIT命令在信息提示窗口显示:谢谢使用VisualFoxPro!WAIT“谢谢使用VisualFoxPro!”WINDOWSTIMEOUT104、格式输入输出命令格式:@<行,列》[SAY《字符表达式》][GET<内存变量》]-.READ功能:在指定的行、列位置显示或打印输出结果,也可接受数据的输入。说明:①行、列指定显示信息的起始位置(屏幕上的行、列号)。②SAY<字符表达式>在指定的起始位置显示信息。③GET<内存变量》等待输入变量的值,GET子句的变量必须用READ命令激活(即GET子句必须与READ命令配合使用),在多个GET子句后,仅用一个READ命令即可。4.2程序的结构在结构化程序设计中,程序的基本结构有三种:顺序结构、分支结构和循环结构。4.2.1顺序结构顺序结构是最简单的程序结构,它按命令在程序中出现的先后次序依次执行。绝大多数问题仅用顺序结构是无法解决的,还要用到分支结构和循环结构。4.2.2分支结构分支结构是指程序流程发生了分支,程序执行时根据条件选择其中某一分支执行的程序结构。VisualFoxPro6.0的分支结构按分支多少分为单分支、双分支和多分支三类。1、单分支结构格式:IF(条件表达式)《语句序列》ENDIF功能:首先计算《条件表达式》的值,当《条件表达式》的值为真时,执行《语句序列》:否则,跳过“语句序列”,直接执行ENDIF后面的第一条语句。【例4-4】输入货物重量,计算该货物的托费,记费标准每公斤为0.1元,当超过50公斤后,超出数为0.2元。*程序文件名LX4_4.prgINPUT“请输入货物重量:”TOwIFw<=50f=w*0.1&货物重量没有超过50公斤时的计算公式ENDIFIFw>50f=50*0.1+(w-50)*0.2&&货物重量超过50公斤时的计算公式ENDIF?”托运费为:”,f2、双分支结构格式:IF<条件表达式》<语句序列A>ELSE
④TIMEOUT 选项指在中断 WAIT 命令之前,等待键盘或鼠标输入的秒数,一旦超时就不 再等待用户按键,自动向下执行。 【例 4-3】用 WAIT 命令在信息提示窗口显示:谢谢使用 Visual FoxPro! WAIT “谢谢使用 Visual FoxPro!” WINDOWS TIMEOUT 10 4、格式输入输出命令 格式:@<行,列> [ SAY <字符表达式> ] [ GET <内存变量>] . READ 功能:在指定的行、列位置显示或打印输出结果,也可接受数据的输入。 说明: ①行、列指定显示信息的起始位置(屏幕上的行、列号)。 ②SAY <字符表达式>在指定的起始位置显示信息。 ③GET <内存变量> 等待输入变量的值,GET 子句的变量必须用 READ 命令激活(即 GET 子句必须与 READ 命令配合使用),在多个 GET 子句后,仅用一个 READ 命令即可。 4.2 程序的结构 在结构化程序设计中,程序的基本结构有三种:顺序结构、分支结构和循环结构。 4.2.1 顺序结构 顺序结构是最简单的程序结构,它按命令在程序中出现的先后次序依次执行。绝大多数 问题仅用顺序结构是无法解决的,还要用到分支结构和循环结构。 4.2.2 分支结构 分支结构是指程序流程发生了分支,程序执行时根据条件选择其中某一分支执行的程序 结构。Visual FoxPro 6.0 的分支结构按分支多少分为单分支、双分支和多分支三类。 1、单分支结构 格式: IF〈条件表达式〉 〈语句序列〉 ENDIF 功能:首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈语句序列〉; 否则,跳过“语句序列”,直接执行 ENDIF 后面的第一条语句。 【例 4-4】输入货物重量,计算该货物的托费,记费标准每公斤为 0.1 元,当超过 50 公斤后,超出数为 0.2 元。 *程序文件名 LX4_4.prg INPUT “请输入货物重量:” TO w IF w<=50 f=w*0.1 &&货物重量没有超过 50 公斤时的计算公式 ENDIF IF w>50 f=50*0.1+(w-50)*0.2 &&货物重量超过 50 公斤时的计算公式 ENDIF ?”托运费为:”,f 2、双分支结构 格式: IF <条件表达式> <语句序列 A> ELSE
<语句序列B>ENDIF功能:根据计算得到<条件表达式>的值是“真”还是“假”,决定是执行<语句序列A>,还是执行<语句序列B>。若<条件表达式>是“真”(.T.),执行<语句序列A>;如<条件表达式>的值是“假”(.F.),则执行<语句序列>。说明:①IF和ENDIF必须配对使用,缺一不可,即双分支结构以IF开始,以ENDIF结束。②<条件表达式>为关系表达式或逻辑表达式,也可用逻辑常量,结果不是“真”(.T.)就是“假”(.F.)。③各语句序列由一至多条语句组成。④IF-ENDIF可以嵌套使用,即语句序列中可以包含新的IF-ENDIF,IF要与ENDIF配对。【例4-5】在XSDA表中查找给定姓名的学生记录,若找到该记录则显示,若未能找到则显示“查无此人!”。*程序文件名LX4_5.prgUSE XSDAACCEPT"请输入待查姓名:”TOXMLOCATEFOR姓名=XMIF.NOT.EOFO?”姓名:”+姓名?”性别:”+性别?”出生日期:”+DTOC(出生日期)&&出生日期为日期型,需用DTOC(函数转换ELSE?”查无此人!”ENDIFUSERETURN3、多分支结构格式:DOCASECASE<条件1><语句序列1>CASE<条件2><语句序列2>.CASE<条件n><语句序列n>[OTHERWISE<语句序列n+1>]ENDCASE功能:依次判断各条件表达式,直至某条件表达式成立,就执行该CASE和下一个CASE之间的语句序列,然后转向执行ENDCASE后继语句。说明:①不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应语句序列被执行。②若所有条件都不成立,如有OTHERWISE项,则执行该项后的语句序列n+1:若无OTHERWISE项,则直接执行ENDCASE后的语句
<语句序列 B> ENDIF 功能:根据计算得到<条件表达式>的值是“真”还是“假”,决定是执行<语句序列 A>, 还是执行<语句序列 B>。若<条件表达式>是“真”(.T.),执行<语句序列 A>;如<条件表达 式>的值是“假”(.F.),则执行<语句序列>。 说明: ①IF 和 ENDIF 必须配对使用,缺一不可,即双分支结构以 IF 开始,以 ENDIF 结束。 ②<条件表达式>为关系表达式或逻辑表达式,也可用逻辑常量,结果不是“真”(.T.) 就是“假”(.F.)。 ③各语句序列由一至多条语句组成。 ④IF-ENDIF 可以嵌套使用,即语句序列中可以包含新的 IF-ENDIF,IF 要与 ENDIF 配对。 【例 4-5】在 XSDA 表中查找给定姓名的学生记录,若找到该记录则显示,若未能找到 则显示“查无此人!”。 *程序文件名 LX4_5.prg USE XSDA ACCEPT"请输入待查姓名: " TO XM LOCATE FOR 姓名=XM IF .NOT. EOF() ?”姓名:”+姓名 ?”性别:”+性别 ?”出生日期:”+DTOC(出生日期) &&出生日期为日期型,需用 DTOC()函数转换 ELSE ?”查无此人!” ENDIF USE RETURN 3、多分支结构 格式:DO CASE CASE <条件 1> <语句序列 1> CASE <条件 2> <语句序列 2> . CASE <条件 n> <语句序列 n> [OTHERWISE <语句序列 n+1>] ENDCASE 功能:依次判断各条件表达式,直至某条件表达式成立,就执行该 CASE 和下一个 CASE 之间的语句序列,然后转向执行 ENDCASE 后继语句。 说明: ①不管有几个 CASE 条件成立,只有最先成立的那个 CASE 条件的对应语句序列被执行。 ②若所有条件都不成立,如有 OTHERWISE 项,则执行该项后的语句序列 n+1;若无 OTHERWISE 项,则直接执行 ENDCASE 后的语句
③DOCASE和ENDCASE必须成对出现,DOCASE是本结构的入口,ENDCASE是本结构的出口。【例4-6】编程计算分段函数值[2x-1(x<0)f(x)=)3x+5 (0≤x<10)Vx+1(x≥10)*程序文件名LX4_6.prgSET TALK OFFINPUT”输入X值:”TOXDO CASECASE x<Of=2*x-1CASE x<10f=3*x+5OTHERWISE x>=10f=SQRT (x+1)ENDCASE?'结果:,fSET TALK ONRETURN4.2.3循环结构当某程序段需要反复执行若干次,或者反复执行到某个条件成立(或不成立)时止,这种根据条件来决定是否重复执行某段程序的结构称为循环结构。1、DOWHILE-ENDDO语句格式:DOWHILE<条件>《语句序列1[LOOP]《语句序列2》[EXIT]<语句序列3>ENDDO功能:执行该语句时,先判断DOWHILE处的循环条件是否成立,如果条件为真,则执行DOWHILE与ENDDO之间的命令序列(循环体)。当执行到ENDDO时,返回到DOWHILE再次判断循环条件是否为真,以确定是否再次执行循环体。若条件为假,则结束该循环语句,执行ENDDO后面的语句。说明:①如果一开始执行循环时条件值就为假,则循环体一次都不执行:若每次判断时条件值都为真,则该循环无休止进行,称为“死循环”。②如果循环体包含LOOP命令,那么当遇到LOOP时,就结束循环体的本次执行,不再执行其后面的语句,而是转回DOWHILE处重新判断条件。③如果循环体包含EXIT命令,那么当遇到EXIT时,就结束该语句的执行,转去执行ENDDO后面的语句。通常LOOP或EXIT出现在循环体内嵌套的选择语句中,这两条命令只能用在循环体中,适用于三种不同的循环语句。根据条件来决定从LOOP回去,还是从EXIT退出循环体
③DO CASE 和 ENDCASE 必须成对出现,DO CASE 是本结构的入口,ENDCASE 是本结构的 出口。 【例 4-6】编程计算分段函数值 + + − = x 1 ( 10) 3 5 (0 x 10) 2 1 ( 0) ( ) x x x x f x *程序文件名 LX4_6.prg SET TALK OFF INPUT ”输入 x 值:” TO x DO CASE CASE x<0 f=2*x-1 CASE x<10 f=3*x+5 OTHERWISE x>=10 f=SQRT(x+1) ENDCASE ?’结果:’,f SET TALK ON RETURN 4.2.3 循环结构 当某程序段需要反复执行若干次,或者反复执行到某个条件成立(或不成立)时止,这 种根据条件来决定是否重复执行某段程序的结构称为循环结构。 1、DO WHILE-ENDDO 语句 格式:DO WHILE <条件> <语句序列 1> [LOOP] <语句序列 2> [EXIT] <语句序列 3> ENDDO 功能:执行该语句时,先判断 DO WHILE 处的循环条件是否成立,如果条件为真,则执 行 DO WHILE 与 ENDDO 之间的命令序列(循环体)。当执行到 ENDDO 时,返回到 DO WHILE 再 次判断循环条件是否为真,以确定是否再次执行循环体。若条件为假,则结束该循环语句, 执行 ENDDO 后面的语句。 说明: ①如果一开始执行循环时条件值就为假,则循环体一次都不执行;若每次判断时条件值 都为真,则该循环无休止进行,称为“死循环”。 ②如果循环体包含 LOOP 命令,那么当遇到 LOOP 时,就结束循环体的本次执行,不再执 行其后面的语句,而是转回 DO WHILE 处重新判断条件。 ③如果循环体包含 EXIT 命令,那么当遇到 EXIT 时,就结束该语句的执行,转去执行 ENDDO 后面的语句。 ④通常 LOOP 或 EXIT 出现在循环体内嵌套的选择语句中, 这两条命令只能用在循环体 中,适用于三种不同的循环语句。根据条件来决定从 LOOP 回去,还是从 EXIT 退出循环体