510 likes | 733 Views
第 8 章 程序设计基础. 8-1 程序文件 157 8-2 程序的基本结构 163 8-3 多模块程序 173 8-4 程序调试 182. 8-1 程序文件 157. 8-1-1 什么是程序 157 8-1-2 程序文件的建立与编辑 158 8-1-3 程序文件的执行 160 8-1-4 程序文件中的专用命令 160. 8-1-1 什么是程序. 在实际应用中,当任务非常复杂,需要反复执行时,采用命令方式逐条输入或采用菜单方式逐个执行,不仅麻烦,而且也是不可行的,这时只有采用程序文件的方式,通过编写命令文件来解决。
E N D
第8章程序设计基础 8-1 程序文件157 8-2 程序的基本结构163 8-3 多模块程序173 8-4 程序调试182
8-1 程序文件157 • 8-1-1 什么是程序 157 • 8-1-2 程序文件的建立与编辑 158 • 8-1-3 程序文件的执行 160 • 8-1-4 程序文件中的专用命令 160
8-1-1 什么是程序 • 在实际应用中,当任务非常复杂,需要反复执行时,采用命令方式逐条输入或采用菜单方式逐个执行,不仅麻烦,而且也是不可行的,这时只有采用程序文件的方式,通过编写命令文件来解决。 • 程序是能够完成一定任务的命令的有序集合。这些命令被存放在称为程序文件或命令文件的文本文件中。当运行此程序文件时,系统会按照一定的次序自动执行包含在程序文件中的命令。
8-1-2 程序文件的建立与编辑 1.以命令方式建立、编辑程序文件 命令格式: MODIFY COMMAND <程序文件名> 【例8.2】编写【例8.1】的程序文件“LIST1.PRG”逐条显示数据表“学生情况表.DBF”的记录。
2.以菜单方式建立、编辑程序文件 • 【例8.3】将【例8.2】的程序文件“LIST1.PRG”以菜单方式重新编辑,使其只逐条显示数据表“学生情况表”中“大四”年级学生的记录。
8-1-3 程序文件的执行 程序文件的执行, 即运行程序文件, 也可以说是调用程序文件, 是程序文件建立的最终目的。程序文件的执行可以有多种方式,下面是两种常用的方式。
1.以菜单方式执行程序 【例8.4】以菜单方式执行经【例8.3】修改后的程序文件“LIST1.PRG”。
2.以命令方式执行程序文件 命令格式: DO <程序文件名>
8-1-4 程序文件中的专用命令 1.程序终止的专用命令 程序中常用的终止命令有: (1)QUIT:退出VFP系统,返回到操作系统。 (2)RETURN:结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回到命令窗口。 (3)CANCEL:终止程序运行,清除所有的私有变量,返回命令窗口。 (4)DO:转去执行另一个程序。
2.输入输出专用命令 (1)INPUT 命令 (2)ACCEPT命令 (3)定位输入输出命令 (4)WAIT命令
8-2 程序的基本结构163 • 8-2-1 顺序结构 163 • 8-2-2 分支结构 163 • 8-2-3 循环结构 167
8-2-1 顺序结构 顺序结构的程序运行时按照语句排列的先后顺序,一条接一条地依次执行,它是程序中最基本的结构。 【例8.6】编写一程序“Q1.PRG”,能根据姓名来查询数据表“教师表”中的教师的基本信息。
8-2-2 分支结构 分支结构是VFP程序的基本结构之一。分支结构由条件语句和分支语句组成,其基本形式有如下3种。
1.单向分支 语句格式: IF 〈条件表达式〉 〈命令行序列〉 ENDIF
2.双向分支 语句格式: IF 〈条件表达式〉 〈命令行序列1〉 ELSE 〈命令行序列2〉 ENDIF
3.多向分支 语句格式: DO CASE CASE 〈条件表达式1〉〈命令行序列1〉 CASE 〈条件表达式2〉〈命令行序列2〉 …… CASE 〈条件表达式N〉〈命令行序列N〉 [OTHERWISE 〈命令行序列N+1〉] ENDCASE
8-2-3 循环结构 • 在处理实际问题的过程中,往往需要重复执行相同的操作,即对一段程序进行循环操作,这种重复的语句序列称为循环体。 • 循环结构是VFP程序的基本结构之一。循环体中的语句可以被重复执行若干次或执行到某种条件不满足为止,或使数据库文件循环操作到文件尾。 • 常用的循环结构有条件循环、步长循环和扫描循环等。
1.条件循环 语句格式: DO WHILE <条件表达式> <命令行序列> ENDDO
2.步长循环 语句格式: FOR <循环变量>=<循环变量初值> TO <循环变量终值> STEP <命令行序列> ENDFOR│NEXT
3.扫描循环 语句格式: SCAN [<范围>] [FOR <条件表达式1>] [WHILE <条件表达式2> <命令行序列> ENDSCAN
4.循环辅助语句 在各种循环语句的<命令行序列>中可以插入LOOP和EXIT语句,前者能使程序的执行转向循环语句开始处继续循环;后者则用来立即退出循环,转去执行ENDDO、ENDFOR或ENDSCAN后面的语句。
5. 多重循环 多重循环,又称循环嵌套,是指一个循环语句的<命令行序列>内包含其他循环。对于有些复杂的问题往往要用多重循环来处理。
8-3 多模块程序173 • 8-3-1 子程序 173 • 8-3-2 过程 176 • 8-3-3 定义函数 179 • 8-3-4 变量的作用域180
8-3-1 子程序 1.调用与返回 对于两个具有调用关系的程序文件,通常称调用程序为主程序,被调用程序为子程序。 调用子程序命令格式: DO <子程序名> 返回主程序的命令格式: [RETURN]
2.参数子程序的调用与返回 命令格式: DO <程序名1> [WITH <参数表>] IN <程序名2> VFP接受参数和回送参数值的命令格式为: PARAMETERS <参数表>
3.子程序嵌套 在VFP中主程序与子程序是相对的,子程序也可调用它自己的子程序,也就是说子程序可以嵌套调用。针对多级嵌套,VFP有如下的命令返回方式。 命令格式: RETURN [TO MASTER|TO <程序文件名>]
8-3-2 过程 VFP允许在一个程序文件中设置多个程序模块,并将主程序以外的每个模块定义为一个过程。这样就避免了在多模块程序中(每个模块分别保存为一个.PRG文件)为执行一个模块就要打开一次文件,从而减少了总的运行时间。
1.过程的定义 过程定义的命令格式: PROCEDURE <过程名> <命令行序列> [RETURN [〈表达式〉]] [ENDPROC]
2.过程的调用 命令格式:DO <过程名> 功能:执行以<过程名>为名的过程。
3.过程文件的打开 如果过程保存在单独的过程文件中,调用之前则必须先打开过程文件。 打开过程文件的命令格式: SET PROCEDURE TO [<过程文件1>[,<过程文件2>,…] [ADDITIVE]
4.过程文件的关闭 关闭所有打开的过程文件的命令格式: SET PROCEDURE TO
8-3-3 定义函数 VFP除提供了许多的系统函数外,还可以由用户来定义函数。
1.自定义函数 自定义函数的命令格式: [FUNCTION <函数名>] [PARAMETERS <参数表>] <命令行序列> [RETURN <表达式>]
2.自定义函数的调用: 调用命令格式: 函数名[<参数表>]
8-3-4 变量的作用域 变量的作用域指的是变量在什么范围内是有效或能够被访问的。在VFP中,若以变量的作用域来分,内存变量可分为公共变量、私有变量和局部变量。
1.公共变量 公共变量指的是在任何模块中都可以使用的变量。公共变量要先建立后使用。 建立公共变量的命令格式: PUBLIC <内存变量表>
2.私有变量 私有变量允许与上层模块的变量同名,为分清两者是不同的变量,需要采用暂时屏蔽上级模块变量的方法。下述命令声明的私有变量就能起这样的作用。 声明命令格式: PRIVATE [<内存变量表>] [ALL [LIKE|EXCEPT<通配符>]]
3.局部变量 局部变量只能在建立它的模块中使用, 而且不能在高层或底层模块使用。当建立它的模块程序运行结束时,局部变量自动释放。局部变量要先建立后使用。 建立局部变量的命令格式: LOCAL <内存变量表>
8-4 程序调试182 • 8-4-1 程序中常见的错误 182 • 8-4-2 调试器 183 • 8-4-3 设置断点 184 • 8-4-4 调试菜单187
8-4-1 程序中常见的错误 语法错误 系统执行命令时都要进行语法检查, 不符合语法规定就会提示出错信息。常见的语法错误有:
l命令动词拼写错、命令格式写错; • l遗漏关键字和变量之间的空格; • l遗漏定界符; • l关键字、变量名和文件名拼写错误; • l内存变量没有初始化; • l表达式和函数中的数据类型不匹配; • l控制语句嵌套错误; • l控制语句缺少结束语句; • l不合法的循环结构等; • 逻辑错误指程序设计的错误, 例如计算或处理逻辑错误。
8-4-2 调试器 • 1.打开“调试器”窗口
2.“调试器”窗口的组成 (1)跟踪窗口 (2)监视窗口 (3)局部窗口 (4)调用堆栈窗口 (5)调试输出窗口
8-4-3 设置断点 在VFP中有4种类型的断点,在实际的程序调试过程中,应根据具体情况来设置断点,以便程序尽快调试成功。下面分别介绍这4种类型断点的设置。
类型1:在定位处中断 该类型是指在程序代码中,指定一代码行,当程序调试执行到该代码行时中断程序运行。 【例8.20】在“调试器”窗口中调试【例8.14】中的程序“Q2.PRG”,在此程序代码中设置类型1断点,即当程序调试执行到第14行处中断程序运行。
类型2:如果表达式值为真则在定位处中断 该类型是指在程序代码中,指定一代码行以及一个表达式,当程序调试执行到该行代码时,如果表达式的值为真,就中断程序运行。 【例8.21】在“调试器”窗口中调试程序“Q2.PRG”。在用调试器打开此程序之前,先在程序的第21行处添加调试输出语句“DEBUGOUT 课程号”,然后在此程序代码中设置类型2断点,即当程序调试执行过程中,当程序中的表达式:!EOF()值为真时,程序执行到第21行处(“DEBUGOUT 课程号”)时中断程序运行,并在调试输出窗口输出课程号。
类型3:当表达式值为真时中断 该类型是指在程序代码中,指定一个表达式,在程序调试执行过程中,当该表达式的值为真时,就中断程序运行。 【例8.22】在“调试器”窗口中调试程序“Q2.PRG”。在调试之前,在此程序代码中设置类型3断点,即当程序中的表达式:.NOT. EOF()值为真时,则中断程序运行。
类型4:当表达式值改变时中断 该类型是指在程序代码中,指定一个表达式,在程序调试执行过程中,当该表达式的值改变时,就中断程序运行。 【例8.23】在“调试器”窗口中调试程序“Q2.PRG”,在此程序代码中的表达式:学号=XH上设置类型4“断点”,即当程序中的表达式:学号=XH值改变时,则中断程序运行。
8-4-4 调试菜单 在“调试器”窗口中的“调试”主菜单,包含了用于程序执行、修改和终止的命令以及调整程序执行速度等命令,如图所示。
【例8.24】在“调试器”窗口中调试【例8.14】中的程序“Q2.PRG”,已知在调试器打开此程序之前,已在程序代码的第21行处添加了调试输出语句“DEBUGOUT 课程号”,在【例8.20~8.23】中已在此程序代码中设置了4个不同类型的断点。现要求在程序调试执行过程能够监视表达式<学号=XH.AND.课程号=教师表.课程号>和变量I的值的变化。