1 / 74

本 章 内 容

第七章 程序设计基础. 本 章 内 容. §7.1  程序文件的建立与运行 §7.2  结构化程序设计初步 §7.3  程序设计基本语句 §7.4  顺序结构 §7.5  选择结构 §7.6  循环结构. §7.7  过程 §7.8  参数传递与变量作用域 §7.9  自定义函数. Visual FoxPro 的工作方式分为 交互方式 和 程序方式 两大类 命令 1       程序 .prg 响应 1 命令 2 响应 2 …… …… …… 命令 n 响应 n. 命令 1 命令 2 命令 3 …… …… …… 命令 n.

zelda
Télécharger la présentation

本 章 内 容

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第七章 程序设计基础 本 章 内 容 §7.1 程序文件的建立与运行 §7.2 结构化程序设计初步 §7.3 程序设计基本语句 §7.4 顺序结构 §7.5 选择结构 §7.6 循环结构 §7.7 过程 §7.8 参数传递与变量作用域 §7.9 自定义函数

  2. Visual FoxPro的工作方式分为交互方式和程序方式两大类 命令1      程序.prg 响应1 命令2 响应2 …… …… …… 命令n 响应n 命令1 命令2 命令3 …… …… …… 命令n 单命令工作方式 程序工作方式(批命令)

  3. §7.1 程序文件的建立与运行 1.程序  程序是为完成某一特定任务而编写的命令序列。 2.程序文件 VFP的程序文件是文本文件,其扩展名是.prg,编译后的程序文件的扩展名为.fxp。程序文件可用VFP内置的文本编辑器编写,也可以使用其他文本编辑器编写。   程序文件的内容是VFP命令,在程序中,习惯将命令称作语句。VFP程序的语句分为两大类:普通语句(包括VFP语句和SQL语句)和专用于程序中的程序流程控制语句。

  4. §7.1.1 程序文件的建立与修改 1.程序文件的建立 (1)打开程序编辑窗口  打开程序编辑窗口有以下3种方法: 1)在“项目管理器”中打开程序编辑窗口  “项目管理器”窗口→ “程序”选项→ “新建”按钮→程序编辑窗口。 2)使用“新建”对话框打开程序编辑窗口  单击“新建”按钮→弹出“新建”对话框→选择“程序”选项→单击“新建文件”按钮→打开程序编辑窗口。

  5. 3)使用命令打开程序编辑窗口  在命令窗口中键入以下命令,然后按回车键执行。  命令格式1:MODIFY COMMAND [<文件名>]  命令格式2:MODIFY FILE [<文件名>]  功能:在文本编辑窗口中打开指定的文件。  说明: 1)在命令格式1中,若缺省扩展名,则默认程序文件(.PRG);在命令格式2中,若缺省扩展名,则默认文本文件(.TXT)。 2)在命令格式1中,若指定扩展名为.TXT,则编辑文本文件;在命令格式2中,若指定扩展名为.PRG,则编辑程序文件。 3)若指定的文件已存在,则打开已存在的文件;否则为新建文件。

  6.  (2)在程序编辑窗口中输入程序的内容(语句)。 (2)在程序编辑窗口中输入程序的内容(语句)。  (3)保存程序文件   程序的内容输入完毕。单击工具栏中的“保存”按钮,打开“另存为”对话框。在此对话框中,指定程序文件存放的位置,输入程序文件的名称,然后单击“保存”按钮。

  7. 2.程序文件的修改 要修改程序文件,先要打开程序文件。程序文件的修改与新建一样,也是在程序编辑窗口中进行。 (1)打开程序文件  打开程序文件有以下3种方法: 1)若程序文件建立在某个项目中,则在“项目管理器”中选定该程序,然后单击“修改”按钮,在程序编辑窗口中打开要修改的程序。 2)使用“打开”对话框打开程序文件  单击工具栏中的“打开”按钮,弹出“打开”对话框。在“查找范围”文本框中输入程序存放的位置;在“文件类型”列表框中选择“程序”;在“文件名”文本框中输入要打开的程序文件的名称,然后单击“确定”按钮。

  8. 3)使用命令打开程序  在命令窗口中执行以下命令: MODIFY COMMAND [<盘符>][<路径>][<程序文件名>]  说明:若缺省盘符和路径,则默认当前文件夹。 (2)修改程序文件  在程序编辑窗口中,修改程序的语句内容。 (3)保存或放弃修改  若要保存修改的结果,则单击工具栏中的“保存”按钮  ,或选择“文件”菜单中的“保存”命令,或按快捷键Ctrl+W写盘。  若要放弃修改,则选择“文件”菜单中的“还原”命令,或按ESC键。

  9. §7.1.2 程序文件的运行 1.在“项目管理器”中运行程序  被运行的程序必须属于项目,才能在该项目中运行。具体操作方法如下:  在“项目管理器”窗口中,选定要运行的程序文件名,单击“运行”按钮  ,即运行该程序。 2.使用“程序”菜单运行程序  “程序”菜单→ “运行”命令→ “运行”对话框→选择要运行的程序文件→ “运行”按钮。

  10. 3.使用命令运行程序  命令格式:DO [<盘符>][<路径>]<文件名>  功能:运行指定的程序。 说明: (1)该命令既可以在命令窗口中执行,也可以作为程序中的一个语句。 (2)若缺省扩展名,程序执行的顺序是:.EXE(VFP可执行文件)→.APP(VFP应用程序)→.FXP(编译文件)→.PRG(源程序文件)。 (3)DO命令除了可以运行程序文件之外,还可以运行其他文件,例如查询文件(.qpr),菜单程序文件(.mpr),应用程序文件(.app)。

  11. §7.2 结构化程序设计初步 §7.2.1 算法与流程图 1.算法的概念  程序设计一般分为以下两个大步骤:  第一步:根据问题的要求拟定用计算机进行求解的方法和步骤,称之为算法。  第二步:根据拟定的算法,按照编程语言约定的规则,编写程序代码,即通常所说的编程。 2.算法的描述(表示)  描述算法的方式是多种多样的,可以用自然语言、流程图、伪代码等方式描述算法。不论用哪一种方式,描述算法应满足两个要求:一是简练,二是容易转化为程序代码。

  12. 3.算法的流程图描述  在程序设计中,常用流程图描述算法。它用一些简单的几何框图表示各种类型的操作,然后用带有箭头的有向流线将各个框图连接起来,以表示执行的先后顺序,就构成了描述算法的流程图。用流程图描述算法,直观形象,易于理解。流程图中用到的符号如下所示: 半圆框称为起止框,用于表示程序运行的开始和结束。   平行四边形框称为输入输出框,用于表示数据输入和输出的操作。   矩形框称为处理框,用于表示数据加工操作。   菱形框称为判断框,用于表示条件判断。   箭头线称为指向线,用于表示程序运行的流向和路径。

  13. §7.2.2 结构化程序设计的方法 1.结构化程序的基本结构  结构化程序由顺序结构、选择结构和循环结构组成。在结构化程序中,任何复杂的算法都可以用顺序结构、选择结构、循环结构这3种基本结构表示。 2.结构化程序设计的要点  结构化程序要点是:自顶向下、逐步求精和模块化设计。  (1)自顶向下逐步求精  自顶向下逐步求精的含义是:从全局出发,通盘考虑。把整个问题分解成若干个相对独立的小问题,然后再把小问题分解成若干个相对独立的更小的问题,直到能表示为程序为止。  (2)模块化设计  将一个大问题分解为若干个相对独立的小问题,每个小问题称为一个功能模块。各个功能模块相对独立且功能单一,这样便于模块的编写与调试和多人协作完成一个大型的程序开发。程序的模块结构图就像一棵倒挂树。

  14. §7.3 程序设计基本语句 §7.3.1 环境设置语句 1.清屏语句 命令格式:CLEAR 功能:清除VFP主窗口中的内容。 2.会话开关语句 命令格式:SET TALK ON|OFF 功能:打开或关闭会话开关。 说明: 1)VFP初态默认SET TALK ON。 2)一般整个程序只需要一个总的输出结果,而不需要输出程序的每一条语句的结果,因此程序的第一条语句通常是SET TALK OFF。

  15. 3 . 安全开关 命令格式:SET SAFETY ON|OFF 功能:打开或关闭安全开关。 说明: 1)VFP初态默认SET SAFETY ON,即改写数据时系统弹出提示框。 2)若程序中要对数据进行改写,则应在程序的开始设置SET SAFETY OFF。

  16. 4.注释语句  命令格式1:* <注释文本>  命令格式2:NOTE <注释文本>  命令格式3:&&<注释文本>  功能:在编辑程序时显示注释的内容,以提高程序的可读性。  说明: 1)注释语句是非执行语句,是写给编程人员看的,目的是为了提高程序的可读性。在程序运行时,计算机不产生任何操作。 2)作为注释的文本不必加字符定界符。 3)* <注释文本>通常写在程序的开始或者中间,作为整个程序的说明或者一段程序的说明。 4)&&<注释文本>通常写在语句的结尾,作为该语句的注释。其常用的格式为:<语句> &&<注释文本>

  17. §7.3.2 输入输出语句 1.交互语句 (1)INPUT命令 命令格式:INPUT [<字符表达式>] TO <内存变量> 功能:执行该语句时,暂停程序运行,等待用户从键盘输入数据,按回车键结束输入,并将输入的数据存入指定的内存变量,继续运行程序。 说明: 1)可输入除M和G型之外的各种类型的数据。 2)<字符表达式>的值作为提示。 【例7-3】编程查询基本工资大于等于指定数额的职工的情况。 操作步骤如下: ①打开程序编辑窗口。 ②输入如下程序的内容:

  18. CLEAR &&清屏 USE Zgjk &&打开职工简况表 INPUT "请输入基本工资:" TO gz&&从键盘输入一个基本工资值 LIST FOR 基本工资>=gz &&显示满足条件的职工的记录内容 ③单击工具栏中的“保存”按钮,打开“另存为”对话框,输入程序文件名,然后单击“保存”按钮。 ④单击工具栏中的“运行”按钮,程序运行结果如图7-4所示。 图7-4 例7-3的程序运行结果

  19. (2)ACCEPT命令 命令格式:ACCEPT [<字符表达式>] TO <内存变量> 功能:执行该语句时,暂停程序运行,等待用户从键盘输入数据,按回车键结束输入,并将输入的数据存入指定的内存变量,继续运行程序。 说明: 1)只能输入C型数据。 2)输入的字符串不必加定界符。 3)直接按回车键,则输入空串。

  20. (3)WAIT命令 命令格式:WAIT [<字符表达式>] [TO <内存变量>] [WINDOW] [TIMEOUT <数值表达式>] 功能:执行该语句时,暂停程序运行,等待用户从键盘输入字符(不必按回车键)或单击鼠标,并将输入的字符或空串存入指定的内存变量,继续运行程序。 说明: 1)只能输入单个C型字符。 2)输入的单个字符不必加定界符。 3)若缺省提示,则显示默认的提示“按任意键继续…”。 4)若缺省WINDOW子句,则提示信息显示于VFP主窗口;若选用WINDOW子句,则提示信息显示于WAIT提示框中。 5)若选用TIMEOUT子句,当等待时间超过<数值表达式>设定的秒数时,自动执行后继语句。

  21. 【例7-4】打开职工简况表,从键盘输入某职工的姓名,查询该职工的信息。如果找到,则显示该职工的职工号、姓名、出生日期和基本工资;如果没有找到,则在提示框中显示“查无此人!”的提示信息,并延时5秒钟。【例7-4】打开职工简况表,从键盘输入某职工的姓名,查询该职工的信息。如果找到,则显示该职工的职工号、姓名、出生日期和基本工资;如果没有找到,则在提示框中显示“查无此人!”的提示信息,并延时5秒钟。 程序内容如下: CLEAR CLOSE ALL &&关闭所有文件 USE Zgjk ACCEPT “请输入待查职工的姓名:” TO NAME&&输入姓名不必加定界符 LOCATE FOR 姓名=NAME &&查找目标记录 IF !EOF() &&假如在表的记录区域找到目标记录 ?“职工号:”+职工号 &&前者是字符串常量,后者是字符型字段变量 ?"姓名:"+姓名 ?“出生日期:”+DTOC(出生日期) &&构造表达式时要保证数据类型统一 ?"基本工资:"+STR(基本工资,7,2) ELSE WAIT "查无此人!" WINDOW TIMEOUT 5 &&提示信息显示于窗口,延时5秒 ENDIF

  22. 程序运行结果如图7-5所示。 图7-5 例7-4的程序运行结果 请思考:为什么只输入“李”字,就找到了“李成华” ?

  23. 2.无格式输出语句  命令格式:? | ?? [<表达式表>]  功能:先计算表达式的值,然后输出。  说明: 1)若使用?,则换行输出表达式的值。 2)若使用??,则从光标当前位置输出表达式的值。 3)若?后不跟表达式,则另起一行。 【例7-5】修改[例7-4]的程序,要求分两行显示找到职工的职工号、姓名与出生日期、基本工资。

  24. 操作步骤如下: (1)打开[例7-4]的程序,以新的程序名将其另存,[例7-5]的程序成为当前程序。 (2)在程序编辑窗口中,修改程序的内容如下: CLEAR USE Zgjk ACCEPT "请输入待查职工的姓名:" TO NAME &&输入姓名不必加定界符 LOCATE FOR 姓名=NAME &&查找目标记录 IF !EOF() &&假如在表的记录区域找到目标记录 ?"职工号:"+职工号 &&前者是字符串常量,后者是字段变量 ??“姓名:”+姓名 &&不换行,直接在当前位置输出表达式的值 ?"出生日期:"+DTOC(出生日期) &&构造表达式时要保证数据类型统一 ??"基本工资:"+STR(基本工资,7,2)&&不换行直接在当前位置输出表达式值 ELSE WAIT "查无此人!" WINDOW TIMEOUT 5&&提示信息显示于窗口,延时5秒 ENDIF

  25. (3)单击工具栏中的“保存”按钮,保存程序修改的结果。(3)单击工具栏中的“保存”按钮,保存程序修改的结果。 (4)单击工具栏中的“运行”按钮,程序运行结果如图7-6所示。 图7-6 例7-5的程序运行结果

  26. §7.3.3 结束程序运行的语句 1.返回语句 命令格式:RETURN 功能:结束当前程序的执行,返回调用点。 说明: 1)子程序的结尾必须是RETURN语句,否则系统无法返回调用点。 2)主程序的结尾也可以用RETURN语句,程序运行结束返回命令窗口。 2.退出VFP语句 命令格式:QUIT 功能:退出VFP系统,关闭VFP窗口,返回操作系统。

  27. §7.3.4 消息框函数 命令格式: MessageBox(<提示信息> [,<按钮类型>] [,<对话框标题>]) 功能:暂停程序运行,弹出对话框,显示提示信息,等待用户单击按钮,返回一个整数,以表示所单击的按钮。 说明:<按钮类型>由3个数码相加产生,即: <按钮类型码>+<图标类型码>+<默认按钮码>。 MessageBox函数的按钮类型码及其含义见表7-2,

  28. MessageBox函数的返回值及其对应的图标见表7-3。MessageBox函数的返回值及其对应的图标见表7-3。

  29. 表7-4MessageBox函数举例

  30. §7.4 顺序结构 1.顺序结构的定义 编写程序时,按处理过程的先后顺序排列语句;程序执行时,按语句排列的先后顺序逐条执行的结构称为顺序结构。它是最基本、最常用的结构。其流程图如图7-7所示。 图7-7 顺序结构流程图

  31. 2.顺序结构的实例 【例7-6】设2001年我国的国民经济产值为一个单位,若每年增长8%,求2010年的产值。 程序内容如下: Clear N=2010-2001 V=1*(1+0.08)^N ?"2010年产值为:",V Return 程序运行结果为: 2010年产值为:2.00 这说明国民经济产值翻了一翻。

  32. §7.5 选择结构 选择结构只有一个入口和一个出口,但在结构内部根据条件有两条或者多条路径可供选择。选择结构分为二分支选择结构(IF语句)和多分支选择结构(CASE语句)。 §7.5.1 二分支选择结构 1.单向二分支结构  命令格式:IF <条件> <语句序列1> ENDIF 功能:若条件为真,则执行语句序列1,然后执行ENDIF的后继语句;若条件为假,则直接执行ENDIF的后继语句。其流程图如图7-7所示。 图7-7 选择结构流程图

  33. 【例7-7】从键盘输入任意两个数,然后按从小到大顺序输出。【例7-7】从键盘输入任意两个数,然后按从小到大顺序输出。  程序内容如下: CLEAR INPUT "X=" TO X &&不能使用ACCEPT语句或WAIT语句 INPUT "Y=" TO Y IF X>Y T=X X=Y Y=T ENDIF ? "X=",X ? "Y=",Y 程序运行结果如图7-8所示。 图7-9 例7-7的程序运行结果

  34. 2.双向二分支结构 命令格式: IF <条件> <语句序列1> [ ELSE <语句序列2>] ENDIF 功能:若条件为真,则执行语句序列1,然后执行ENDIF的后继语句;若条件为假,则执行语句序列2,然后执行ENDIF的后继语句。其流程图如图7-10所示。 图7-10 含ELSE的选择结构流程图

  35. 【例7-8】编写一个程序,其功能是:输入职工号,在表文件Zgjk2.dbf中查找职工的记录。若找到了,则将基本工资低于1000元的增加50元,否则增加30元;若没有找到,则显示“查无此人!”。【例7-8】编写一个程序,其功能是:输入职工号,在表文件Zgjk2.dbf中查找职工的记录。若找到了,则将基本工资低于1000元的增加50元,否则增加30元;若没有找到,则显示“查无此人!”。 程序内容如下: * 这是一个双向分支问题,且需要分支嵌套。 CLEAR USE Zgjk2 LIST ACCEPT "请输入职工号:" TO Zgh LOCAT FOR 职工号=Zgh IF FOUND( ) IF 基本工资<1000 REPLACE 基本工资 WITH 基本工资+50 ELSE REPLACE 基本工资 WITH 基本工资+30 ENDIF DISPLAY ELSE MESSAGEBOX("查无此人!") ENDIF

  36.  程序运行结果如图7-11所示。 图7-11 例7-8的程序运行结果 【例7-9】编写一个程序,其功能是:输入职工号,在“职工业绩.dbc”数据库中查找。若找到了,则显示该职工的全部工资信息;若没有找到,则显示“查无此人!”。

  37. 程序内容如下: * 这是一个双向分支的问题,且使用到两个数据库表内联查询的SQL语句。 CLEAR ACCEPT "请输入职工号:" TO Zgh OPEN DATABASE 职工业绩 USE Zgjk LOCATE FOR 职工号= Zgh IF FOUND( ) SELECTGz.职工号,姓名,基本工资,岗位工资,津贴,奖金,住房公积金,工会费,实发工资; FROM Zgjk, Gz; WHERE Zgjk.职工号= Zgh AND Zgjk.职工号=Gz.职工号 ELSE MESSAGEBOX("查无此人!") ENDIF CLOSE DATABASE

  38. 程序运行结果如图7-12所示。 图7-12 例7-9的程序运行结果

  39. §7.5.2 多分支选择结构 多分支选择结构是通过情况语句实现的。情况语句的格式如下: 命令格式:DO CASE CASE <条件1> <语句序列1> CASE <条件2> <语句序列2> …… CASE <条件n> <语句序列n> [OTHERWISE <语句序列>] ENDCASE

  40. 功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行OTHERWISE的语句序列,然后执行ENDCASE的后继语句。功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行OTHERWISE的语句序列,然后执行ENDCASE的后继语句。 说明: 1)不论有几个CASE条件成立,只有最先成立的那个CASE条件对应的语句序列被执行。 2)OTHERWISE子句用于容错。 多分支选择结构其流程图如图7-13所示。 图7-13 多分支选择结构流程图

  41. 【例7-10】编写一个程序,其功能是:打开表文件Zgjk.dbf,用户输入部门号,然后显示指定部门的职工的信息;若输入的部门号不存在,则显示“无此部门!”。【例7-10】编写一个程序,其功能是:打开表文件Zgjk.dbf,用户输入部门号,然后显示指定部门的职工的信息;若输入的部门号不存在,则显示“无此部门!”。 CLEAR USE Zgjk INPUT "输入部门号(家电为1,服装为2,文具为3):" TO Bmh DO CASE CASE Bmh =1 BM="家电" CASE Bmh =2 BM="服装" CASE Bmh =3 BM="文具" OTHERWISE ? "无此部门!" RETURN ENDCASE LIST FOR 部门=BM

  42. 程序运行结果如图7-14所示 图7-14 例7-10的程序运行结果

  43. §7.6 循环结构 循环结构也称为重复结构,是指程序在执行过程中,某段语句被重复执行若干次。被重复执行的语句称为循环体。在VFP中有当型循环、计数循环和扫描循环3种循环结构。 1.DO WHILE-ENDDO语句  命令格式:DO WHILE <条件> &&循环起始句 <语句序列>&&循环体 ENDDO&&循环终端句 §7.6.1 当型循环

  44.  功能:执行循环起始句DO WHILE <条件>时,先计算条件表达式,判断循环的条件。若条件表达式的值为真,则执行DO WHILE与ENDDO之间称为循环体的语句序列,执行到循环终端句ENDDO时,返回循环起始句DO WHILE,再次判断环的条件。若条件表达式的值为真,则重复上述过程;若条件表达式的值为假,则结束循环,执行ENDDO后继语句。 循环语句的流程图如图7-15所示。 图7-15 当循环结构

  45. 【例7-11】编程计算S=1+2+3+…+100 程序内容如下: * 计算S=1+2+3+…+100 CLEAR S=0 &&累加变量的初值应设为0 K=1 &&循环变量的初值为1 DO WHILE K<=100 S=S+K &&累加 K=K+1 &&循环变量增加1 ENDDO ? "S=",S 程序运行结果为:S=5050

  46. 在循环过程中各变量变化如下: S K S=S+K K=K+1 ========================== 01 S=0+1 K=1+1 0+1 2 S=0+1+2 K=2+1 0+1+2 3 S=0+1+2+3 K=3+1 ………… 0+1+2+3+…+99100S=0+1+2+3+…+99+100 K=100+1

  47. 【例7-12】编程求阶乘20!=1*2*3*…*20的值。 程序内容如下: * 求20!=1*2*3*…*20 Clear S=1 &&累乘变量的初值设为1 K=1 &&K为循环变量 Do While K<=20 S=S*K &&累乘 K=K+1 &&循环变量增加1 Enddo ? "S=" , S 程序运行结果为:S=2432902008176640000

  48. 在循环过程中各变量变化如下: S K S=S*K K=K+1 =========================== 1 1 S=1*1 K=1+1 1*1 2 S=1*1*2 K=2+1 1*1*2 3 S=1*1*2*3 K=3+1 ………… 1*1*2*3*…*19 20 S=1*1*2*3*…*19*20 K=20+1

  49. 【例7-13】逐条显示职工简况表Zgjk.dbf记录。 程序内容如下: * 逐条显示表记录 CLEAR USE Zgjk DO WHILE ! EOF( ) DISPLAY WAIT "按任意键显示下一条记录…" SKIP ENDDO

More Related