第6章结构化程序设计基础在VFP交互方式下,除了通过命令窗口、系统菜单和工具对VFP进行操作外,还可以通过程序方式执行较复杂的数据处理任务。VFP程序设计包括结构化程序设计和面向对象程序设计。结构化程序设计是传统的程序设计方法,是面向对象程序设计的基础。6.1结构化程序样例分析程序是指能够完成一定任务的一组有序命令的集合。程序中的命令也称为语句。程序以文件形式保存在外部存储器中。与命令方式相比,程序方式有如下优点:便于保存、编辑和运行:以程序文件形式保存一组语句;每次启动VFP后,不需要重复输入程序中的语句,只要打开程序文件就可以对其进行修改;运行相应的程序文件就是执行程序中的相关语句,并且可以多次执行一个程序。层次清晰、功能模块化:允许在一个程序中调用其他子程序,构成程序系统,以便完成更复杂的处理任务。【例6.1】编写求数N的阶乘程序,存于文件E6_1.PRG中。操作步骤为:首先,在命令窗口中输入:ModifyCommandE6_1命令打开程序编辑器。然后,输入下列语句(不输入行号),如图6.1。1)*求数N的阶乘,即S=1×2×……×(N-1)×N2)Input”输入整数:”ToN&&执行程序时,用户输入的数保存在变量N中3)IfN1&&若N小于1,则执行第4和5行语句;否则,转到第7行继续执行4)?'输入的数:',N,'不能小于1'5)Cancel6)EndIf7)Store1ToM,S8)DoWhileM=N&&当M小于或等于N时,执行第9和第10行语句&&直到M大于N时,转到第12行继续执行9)S=S*M10)M=M+111)EndDo12)?N,”的阶乘是:”,S图6.1程序编辑器最后,单击“运行”常用工具。程序说明:第1行:注释语句。它是非执行语句,并不影响程序的执行结果。编程时可以增加一些说明信息作为注释,为人们阅读程序提供参考信息。在语句的末尾也可以用“&&”开头的注释,如第2行的注释。第2行:程序运行时,通过键盘输入数据,并将输入数据保存在变量N中。第3行:分支结构的开始语句,若N的值小于1,则先执行第4、5行,再执行第7行及后面的语句;否则,直接执行第7行及后面的语句。第5行:结束程序的执行。第6行:分支结构的结束语句,与第3行语句一起构成分支结构。第8行:循环结构的开始语句,当M的值小于或等于N时,执行第9、10行语句,直到M大于N时,转去执行第12行语句。第11行:循环结构的结束语句,与第8行语句一起构成循环结构。执行到此语句时,转去执行对应的(第8行)循环开始语句。由此可见,在执行程序的过程中,是否执行某些语句,取决于条件是否满足。如:当变量N小于1时,会执行第4和第5行;而当变量N大于或等于1时,越过第4和第5行从第7行继续向下执行,这种程序结构称为分支结构。执行程序中,有些语句也可能重复执行多次。如:只要M小于或等于N,就执行1次第9和第10行语句,这种程序结构称为循环结构。6.2程序的建立与执行VFP源程序由VFP命令或程序中的专用语句组成,可以用Windows的“记事本”或VFP的专用程序编辑器进行建立或修改VFP源程序,它是一种文本文件,其扩展名是PRG。当用户要完成某项任务时,就可以执行对应的程序。6.2.1VFP专用程序编辑器通过VFP专用程序编辑器,可以建立和编辑程序,系统默认文件的扩展名为PRG。1.建立源程序文件方法一:“文件”菜单→“新建”→选择“程序”→“新建文件”。进入程序编辑器,VFP默认程序文件名为“程序1”,在保存程序时,可以为其改名。方法二:“新建”常用工具,其它操作同方法一。方法三:在命令窗口中执行命令。命令格式:ModifyCommand[程序文件名]命令说明:用于建立和编辑程序文件:(1)ModifyCommand:其运行过程同方法一。(2)ModifyCommand程序文件名:在命令中指定程序文件名。若文件已存在,则进入程序编辑器时将打开文件,供用户编辑;否则,按指定的文件名创建一个程序文件。方法四:项目管理器→“代码”选项卡→选择“程序”项→“新建”。【例6.2】建立例6.1中的程序文件E6_1.PRG。ModifyCommandE6_12.保存程序文件在VFP的程序编辑器下,应该用下列方法保存程序:方法一:“文件”菜单→“保存”,保存文件,不关闭程序编辑器。方法二:“保存”常用工具,其它操作同方法一。方法三:按Ctrl+W键,保存文件的同时关闭程序编辑器。方法四:关闭程序编辑器窗口时,系统将提示用户是否保存文件。如果在建立程序文件时没给文件命名,则保存文件时,系统将打开“另存为”对话框,允许用户指定文件保存位置和文件名。6.2.2打开源程序文件打开已有的源程序文件进行编辑的方法有:方法一:“文件”菜单→“打开”→选择“文件类型”为“程序”→选择或键入程序文件名→“确定”。方法二:“打开”常用工具,其它操作同方法一。方法三:在命令窗口中执行命令:ModifyCommand程序文件名|?。使用“?”,将弹出“打开”文件对话框,选择要打开的程序文件名。方法四:项目管理器→“代码”选卡→展开“程序”项→选择程序文件名→“修改”。6.2.3程序的编译与执行执行程序就是按照程序的内部控制结构执行文件中的相关语句序列。1.程序文件类型在VFP中,可以执行源程序(PRG)、编译程序(FXP)、应用程序(APP)和可执行程序(EXE)4种程序文件。(1)源程序(PRG):源程序(PRG)是文本文件,可以对其内容进行修改。只要有源程序文件,就可以生成其他3种程序文件。在执行源程序文件时,系统自动生成相同文件主名的编译程序文件(FXP)。(2)编译程序(FXP):每个源程序文件(PRG)都有对应的编译程序文件(FXP),如:源程序E6_1.PRG对应的编译程序文件是E6_1.FXP。执行编译程序(FXP)比执行源程序(PRG)的速度快。(3)应用程序(APP):由多个文件(包括程序、表单和菜单等)连接成一个应用程序文件(扩展名为APP),此文件便于程序的运行和管理。这三种文件都是在VFP环境下运行,即必须安装VFP系统才能运行程序。适用于调试和维护程序阶段。(4)可执行程序(EXE):将多个文件(包括程序、表单和菜单等)连接成一个可执行程序文件(EXE),此种文件可以脱离VFP环境运行,以便程序发行。2.编译程序当执行一个源程序(PRG)时,系统自动将其编译为编译程序(FXP)。在VFP中允许只编译而不执行程序,即由源程序文件(PRG)生成编译程序(FXP)文件。操作方法如下:方法一:在程序编辑器中,“程序”菜单→“编译”。方法二:“程序”菜单→“编译”→选择“文件类型”为“程序”→选择程序文件名→“编译”。3.执行程序在VFP中,执行源程序文件(PRG)和编译程序文件(FXP)的方法如下:方法一:在程序编辑器中,“程序”菜单→“执行”或“运行”常用工具“!”。方法二:“程序”菜单→“运行”→选择“文件类型”为“程序”→选择或输入程序文件名→“运行”。方法三:在程序或命令窗口中执行VFP命令。命令格式:Do程序文件名命令说明:当源程序(PRG)和编译程序(FXP)文件同时存在时,系统将执行距当前时间最近的程序文件。程序文件扩展名可以省略。6.3输入/输出语句程序中经常涉及到数据的输入和输出操作。数据输入指在运行程序时临时输入数据并赋值给变量。数据输出是将表达式的值输出到显示器和打印机等输出设备上。6.3.1输入字符串语句Accept命令格式:Accept[字符表达式]To内存变量命令说明:当程序执行到此语句时,系统先输出字符表达式的值,然后,等待输入字符串。此语句将输入的符号都作为字符型数据存储到内存变量中。若输入数据时包含字符常数定界符,则系统将定界符也作为字符串的一部分。(1)字符表达式:将字符表达式的值作为执行到此语句时的提示信息。无此项,则不输出任何信息。(2)内存变量:当用户按回车键结束输入时,系统将输入的字符串赋值给内存变量,然后程序继续执行后面的语句;若不输入任何字符,直接按回车键,则将空字符赋值给内存变量。【例6.3】E6_3.PRG:Accept”请输入学号:”ToXH?”输入的学号是:”+XH执行此程序后,首先在屏幕上显示“请输入学号:”,然后等待用户键入数据。若用户键入:102,按回车键后,则系统将字符串“102”赋值给内存变量XH。6.3.2等待语句Wait命令格式:Wait[字符表达式][To内存变量][Window[At行,列]][Nowait][Clear|Noclear][Timeout数值表达式]命令说明:执行到此语句时,程序暂停执行,直到按某个键或单击鼠标后才继续执行执行后面的语句。(1)字符表达式:其值作为执行到此语句时的提示信息。若省略此项,则系统提示“按任意键继续……”。(2)To内存变量:当键入一个字符后,该字符作为字符型数据赋值给内存变量。若只按回车键或单击鼠标,则将空字符赋给内存变量。省略To内存变量,则不保留输入的字符。(3)WindowAt行,列:省略Window,提示信息显示在VFP主窗口或应用程序窗口;使用Window项,则在VFP主窗口的右上角弹出提示信息窗口。也可以使用At行,列指定提示信息窗口的开始位置。(4)Window和Nowait:弹出提示窗口后,程序不暂停,即不等用户按键,就继续执行后面的语句。(5)Window和Noclear:在执行下一条WaitWindow或WaitClear语句之前,系统不关闭提示信息窗口。(6)Timeout数值表达式:用于设定等待的秒数(由数值表达式值确定)。在等待时间内按任意键或等待超时,程序将继续向下执行;当数值表达式值为0时,相当于省略了Timeout项。当数值表达式值小于0时,将立即结束此语句。【例6.4】E6_4.PRG:Wait显示时间:Timeout3??Time()执行程序时如果用户没按任何键,3秒后将显示系统时间。6.3.3输入表达式语句Input命令格式:Input[字符表达式]To内存变量命令说明:执行此语句时,系统先输出字符表达式的值,然后,等待键入一个表达式,按回车键表示结束输入,系统会将表达式的值赋给内存变量。允许输入任何类型的表达式。与Accept命令直接输入字符串不同,Input输入的字符串必须加上定界符。若只按回车键或输入非法的表达式,则系统要求重新输入数据。字符表达式:其值作为提示信息。省略此项,则不输出任何信息。【例6.5】E6_5.PRG:N=2Input请输入数据:ToM?M在执行此程序过程中,当显示“请输入数据:”时,可以键入一个表达式。例如,输入:’教师’,则输出是:教师;输入:3*N+4,则输出是:10。6.3.4定位输入输出语句Accept、Input和Wait、?或??语句,输入/输出数据的位置都与当前光标的位置有关。而使用如下语句可以在指定的位置输入/输出数据。命令格式:@行,列[Say表达式][Get变量][Default初值]……[Read]命令说明:此语句可以在VFP主窗口或应用程序窗口的指定位置输入/输出数据。(1)@行,列Say表达式:在指定的行号和列号位置开始输出表达式的值。(2)@行,列[Say表达式]Get变量:若没选Say表达式,则从(行号和列号)指定的位置开始显示变量的值;否则,在指定位置先输出表达式的值,然后空开一格后显示变量的值。执行此语句时,Get后面的内存变量必须具有初值或由Default指定初值,以便指明变量的类型和长度;Get后面若是字段变量,则显示当前记录的字段值。(3)Read:一个Read语句可以与多个@…Get变量语句结合。@…Get变量语句必须与Read语句一起使用才可以修改变量的值。当执行到Read时,光标自动停在第一个@…Get变量语句的变量值上,可以修改其值(数据类型必须与初值相同)。按回车键后,光标停在第二个@…Get