700 likes | 899 Views
第 7 章 程序设计基础. 第 7 章 结构化程序设计. 7-1 程序的建立与维护 7-2 程序的流程控制 7-3 模块结构程序设计 7-4 MESSAGEBOX() 函数的使用 7-5 调试程序 7-6 小结. 7-1 程序的建立与维护.
E N D
第7章 结构化程序设计 • 7-1 程序的建立与维护 • 7-2 程序的流程控制 • 7-3 模块结构程序设计 • 7-4 MESSAGEBOX()函数的使用 • 7-5 调试程序 • 7-6 小结
7-1 程序的建立与维护 Visual FoxPro程序文件,是一个以(.PRG)为扩展名的文本文件。任何可以建立、编辑文本文件的工具,都可以创建和编辑Visual FoxPro程序文件。这些文本编辑工具,可以是Visual FoxPro系统提供的内部编辑器,也可以是其它常用文本编辑软件。在文本编辑环境下,不仅可以对程序文件进行输入和修改,还可以实现字符串查找、替换、删除和编辑功能。 7-1-1 用菜单选择方式建立及维护程序 1.创建与修改程序文件 • 命令方式 MODIFY COMMAND 〈程序文件名〉 • 菜单方式 打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”;在“程序文件”编辑窗口,输入程序文件,并保存,此时建立程序文件的操作结束。
2.运行程序文件 调用程序文件,即运行程序文件,是程序文件建立的最终目的。在Visual FoxPro系统中,调用程序文件有很多方法,在这里仅介绍其中两种方法。 • 菜单方式 以菜单方式调用程序文件,操作方法如下: (1)在Visual FoxPro系统主菜单下,打开“程序”菜单,选择“运行”。 (2)在“运行”窗口,输入被调用的程序文件名即可。 • 命令方式 在Command 窗口中,输入如下命令,则程序文件被调用。 DO 〈程序文件名〉
3.维护程序 修改程序文件时,可以从菜单“文件”中选择“打开”命令,从屏幕显示的“打开”对话框中选择要修改的文件,在文件编辑器窗口中进行编辑修改程序。 7-1-2 用命令方式建立及维护程序 1.创建程序 在Visual FoxPro“命令”窗口中直接输入命令来建立和运行程序,更方便简捷。在命令窗口中输入: MODIFY COMMAND <程序文件名> 打开在文本编辑器窗口中,等待用户输入新文件的内容。
2.保存程序 • 在编辑过程中,按Ctrl+Q或Esc键,中止程序的编辑,按Ctrl+W键,保存编辑的程序,并返回到“命令”窗口中。程序文件名默认的扩展名为.PRG。如果省略“程序文件名”,系统会自动以“程序1”为程序文件名存盘。 3.维护程序 在编辑过程中,如果内存空间足够大,可以同时打开多个文本编辑窗口编辑多个文件,在一个文件或多个文件之间对文本进行剪切、复制、粘贴等操作。为了便于维护程序和提高编程效率,系统提供了丰富的编程环境。可以在程序窗口中单击鼠标右键,在弹出的快捷键中选择所需要的功能命令按钮 。
4.运行程序 在命令窗口中键入: D0(程序文件名) 执行一个Visual FoxPro程序,程序文件名前根据需要可以加上路径。如: DO d:\VFP\程序1 该命令可以在命令窗口发出,也可以出现在某个程序文件中,这样就使得一个程序在执行的过程中还可以调用执行另一个程序。 当程序被执行时,文件中包含的命令被依次执行,直到程序执行完毕,或遇到以下命令:
① CANCAL:终止程序运行,清除所有私有变量,返回命令窗口。 ② DO:转去执行另一个程序。 ③ RETURN:结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回到命令窗口。 ④ QUIT:退出VFP系统,返回到操作系统。 Visual FoxPro程序文件通过编译、连编,可以产生不同的目标代码文件。如果没有对程序进行编译,而且程序中存在错误,则在执行程序过程中Visual FoxPro会指出程序中存在的错误,出现错误提示对话框。此时,可以取消操作,中止程序的运行,修改后再运行。
7-1-3 程序的编译 在运行程序时,系统提供了两种方式:先编译后执行和一边编译一边执行。 先编译后执行是在编辑窗口打开要编译的程序,然后在菜单“程序”中选定“编译”。 7-1-4 编程时的一般规则 • 1.每行只能写一条命令,每条命令以回车换行作为结束标志; • 2.条命令一行写不下时,可以分多行输入,在未输入完的数据后加分号,然后回车换行,系统会把此行作为前一行的续行; • 3.“*”,“&&”,“NOTE”用来作为程序的说明的符号和命令;“*”及“NOTE”只能放在一行的前面,而“&&”可以放在前面或后面。
7-1-5 简单的输入输出命令 1.键盘输入语句 (1). ACCEPT命令 • 格式 :accept [<提示信息>] to <内存变量> • 功能:在屏幕上显示提示信息,等待用户输入一个字符串,赋值给一个内存变量 • 注意:该命令只能接受字符型常量,输入一个字符串(不必加引号)且按回车键后,程序继续执行 (2). INPUT命令 • 格式:input [<提示信息>] to <内存变量>
功能:与accept相似,不同的是能接受字符型、数字型、日期型和逻辑型数据。功能:与accept相似,不同的是能接受字符型、数字型、日期型和逻辑型数据。 • 说明:除输入数值型数据外,其他几种类型的数据一律使用定界符;输入的信息可以是表达式,input命令有计算功能 (3). WAIT命令 【格式】WAIT [<提示符表达式>] [T0 <内存变量>][Windows[Nowait]][CLEAR] [TIMEOUT<数值表达式>] 【功能】等待用户从键盘上输入一个字符存入指定变量中。
2.格式输出语句 无论是内存变量还是字段变量都可以使用?或??命令输出,这种输出方式简单,但是不能按照用户指定的位置输出。格式输出语句能按用户的要求来设计屏幕格式,使之美观、方便。 【格式】 @ <行号,列号> SAY <表达式> 【功能】 从指定的行、列号开始输出表达式的值。 【说明】 1.<表达式>可以是常量、字段变量及由它们组成的表达式。 2. 定位输出时,一次只能输出一个表达式。
3.程序设计辅助语句命令 (1) CLEAR 语句: 【格式】CLEAR 【功能】清除屏幕信息语句 (2) SET TALK ON/OFF语句: 【格式】SET TALK ON / OFF 【功能】命令执行的结果传送/不传送到屏幕上 (3) 程序运行结束命令: lQUIT && 返回操作系统 lCANCEL && 返回Visual FoxPro 6.0“命令”窗口 lRETURN && 返回调用处
7-2 程序的流程控制 Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。 Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。常见的控制结构如下:
程序的3种基本结构 • 任何一种计算机语言程序主体是由3种基本结构组成:顺序结构、选择结构和循环结构。 顺序结构 选择结构 循环结构
7-2-1 顺序结构 在结构化程序设计方法中,程序基本控制结构有三种,即顺序结构、分支结构和循环结构。顺序结构是一种线形结构,是最基本的程序结构,它是按照命令或语句的排列顺序,依次执行。 7-2-2 选择结构 分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。
选择结构的基本形式 有三种基本形式: 1、 单条件选择结构 • 单分支结构 是一种IF-ENDIF分支结构 格式: IF<条件表达式> <语句序列> EDNIF 功能:条件表达式的值为真(.T.)则执行“语句序列”,否则为假(.F.)则直接执行EDNIF后续语句 条件 假 真 语句序列
例1:从键盘输入一个数,若为正数则输出,若为非正数则结束。例1:从键盘输入一个数,若为正数则输出,若为非正数则结束。 此题学生自己分析。 • 例2:求一元二次方程AX2+BX+C=0的实根。 分析:用根的判别式:D=B2-4AC进行判别, 如果:D≥0,说明有实根,如果:D<0,则 说明无实根。
双向分支结构 双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。是一种IF-ELSE-ENDIF选择结构 格式: IF<条件表达式> <语句序列1> ELSE <语句序列2> ENDIF 功能:表达式为真,则执行“语句序列1”,再执行EDNIF的后续语句;为假,则执行“语句序列2”,再执行EDNIF的后续语句。 条件 假 真 语句序列1 语句序列2
例:用IF-ELSE-ENDIF方法,再做一次求解一元二次方程的根,若有实根,则输出实根,否则输出“无实根”。例:用IF-ELSE-ENDIF方法,再做一次求解一元二次方程的根,若有实根,则输出实根,否则输出“无实根”。 • 例:从键盘输入一个自然数,若是偶数则输出“偶数”,否则输出“奇数”。
y 条件1 语句 序列1 2、多分支条件选择语句(多路选择) • 是一种DOCASE-ENDCASE分支结构 • 格式: • DOCASE • CASE<条件表达式1> • <语句序列1> • CASE<条件表达式2> • <语句序列2> • …… • CASE<条件表达式n> • <语句序列n> • [OTHERWISE • <语句序列n+1>] • ENDCASE • 功能:依次判断条件1-n的表达式,当遇到第一个条件为真时,则执行该表达式对应的语句序列,然后转去执行ENDCASE的后续语句,若前几个表达式都为假,则执行OTHERWISE的语句序列,然后执行ENDCASE的后续语句。 N 。。。 y 条件n 语句 序列n N OTHERWISE
使用分支语句应注意的几点 (1)IF…… ENDIF和DO CASE…… ENDCASE 必须配对使用,DO CASE与第一个CASE〈条件表达式〉之间不应有任何命令。 (2)〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值。 (3)〈命令行序列〉可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。 (4)DO CASE…… ENDCASE 命令,每次最多只能执行一个〈命令行序列〉。在多个CASE项的〈条件表达式〉值为真时,只执行第一个〈条件表达式〉值为真的〈命令行序列〉,然后执行ENDCASE的后面的第一条命令。
例:从键盘输入一个学生的成绩,按下述规定输出:90分-100分 输出“优秀”例:从键盘输入一个学生的成绩,按下述规定输出:90分-100分 输出“优秀” 80分-89分 输出“良好” 70分-79分 输出“中等” 60分-69分 输出“及格” 0分— 59分 输出“不及格” 参考P135【例7-10】
练习 • 编写程序,输入一个数,判断这个数能否被6整除。 • 编写一正整数存于变量X中,判断它是几位数。
7-2-3 循环结构 常用的循环语句有以下三种形式: 1. DO WHlLE…ENDDO循环 “当”型循环控制语句,即根据条件表达式的值,决定循环体内语句的执行次数。 语句格式: DO WHILE 〈条件表达式〉 〈命令行序列〉 ENDDO 语句功能: 该语句通过〈条件表达式〉的值来控制循环。执行语句时,反复判断〈条件表达式〉的值,当〈条件表达式〉的值为“真”时,执行〈命令行序列〉;否则,结束循环,并执行ENDDO 后面的第一条命令。
举例 • 例1计算S=1+2+3+……+99+100的值。 • 例2从键盘输入一组数据,分别计算出正负数的个数,输入“0”时程序结束。 • 例3逐条输出1982年出生的学生记录
2.FOR…ENDFOR循环 FOR…ENDFOR循环,即根据用户设置的循环变量的初值、终值和步长,决定循环体内语句的执行次数据。 语句格式: FOR〈循环变量〉=〈循环变量初值〉TO〈循环变量终值〉 [STEP〈循环变量步长〉] 〈命令行序列〉 ENDFOR|NEXT 语句功能: 该语句用〈循环变量〉来控制〈命令行序列〉的执行次数。执行语句时,首先将〈循环变量初值〉赋给〈循环变量〉,然后判断〈循环变量〉是否大于或小于〈循环变量终值〉,若结果为“真”,则结束循环,执行ENDFOR 后面的第一条命令;否则,执行〈命令行序列〉,〈循环变量〉自动按〈循环变量步长〉增加或减少,再重新判断〈循环变量〉当前的值是否大于或小于〈循环变量终值〉,直到其结果为真。
举例 • 例1计算1到100中所有奇数之和。 • 例2找出100~999之间的所有“水仙花数”(三位数中各位数的立方和等于该数本身)。 • 例3从键盘输入10个数,找出其中最大和最小数。
3.SCAN...ENDSCAN循环 SCAN...ENDSCAN循环,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。 语句格式: SCAN[〈范围〉][FOR〈条件表达式1〉 [ WHILE 〈条件表达式2〉]] 〈命令行序列〉 ENDSCAN 语句功能: 该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式1〉或〈条件表达式2〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。
举例 • 例1统计“学生”数据表专业代码为03的男、女生人数。 • 例2编写对“学生”数据表按任意条件查询的程序。Ck.prg
4.三种循环的比较 (1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必须配对使用。 (2)〈命令行序列〉可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。 (3)〈循环变量〉应是数值型的内存变量或数组元素。 (4)EXIT和LOOP命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改变〈命令行序列〉中部分命令的执行次数。EXIT、LOOP可以出现在〈命令行序列〉的任意位置。
7-3 模块结构程序设计 应用程序一般都是多模块程序,可包含多个程序模块。模块是可以命名的一个程序段,可指主程序、子程序和自定义函数。 7-3-1 子程序的调用 1.子程序的建立、调用与返回 对于两个具有调用关系的程序文件,常称调用程序为主程序,被调用程序为子程序。在VFP中,子程序与主程序享有相同的“待遇”,即可以用“MODIFY COMMAND”命令来建立和修改,具有相同的扩展名.prg,并以同样的文件格式存储在磁盘上。所不同的是:在每个子程序中至少要有一个返回语句RETURN(或RETURN MASTER)。
例:试编写一程序求解 W=X!+Y!+Z!(其中:X,Y,Z的值均为一位正常数)。 主程序: * MAIN_1.PRG SET TALK OFF INPUT ”X=” TO X INPUT “Y=” TO Y INPUT “Z=” TO Z N=X DO SUB_2 A=T N=Y DO SUB_2 B=T N=Z
DO SUB_2 W=A+B+T ?”W=”+STR(W,7) SET TALK ON *SUB_2.PRG PUBLIC T T=1 && 给T赋初值1 FOR I=1 TO N T=T*I ENDFOR RETURN 由此例可以得出以下结论: l主程序在调用子程序之前,要先为子程序中的某些变量赋值,例如,N=X,N=Y,N=Z,以做好调用子程序的准备; 子程序执行完毕返回主程序时,要及时保存其运算结果,例如,A=T,B=T,以免再次调用子程序时将其破坏。
2.子程序嵌套 主程序与子程序的概念是相对的,子程序还可调用它自己的子程序,即子程序可以嵌套调用。VFP的返回命令包含了因嵌套而引出的多种返回方式。 命令格式: RETURN [TO MASTER/TO <程序文件名>] 命令格式中的[TO MASTER]选项,使返主时直接返回到最外层主程序;可选项TO <程序文件名>强制返回到指定的程序文件。
7-3-2 过程及过程调用 Visual FoxPro与其他高级语言一样,支持结构化程序设计方法,允许将若干命令或语句组合在一起作为整体调用,这些可独立存在并可整体调用的命令语句组合称为过程 。 1.外部过程 外部过程也叫子程序,和主程序一样是以程序文件(.PRG)的形式单独存储在磁盘上。子程序是指能被其他程序调用的程序。通常情况下,被调用的称为子程序,调用它的称为主程序。 子程序中必须使用的—条命令是返回命令RETURN,格式为: RETURN[<表达式>|TO MASTER|TO<程序文件名>] 功能是返回到调用该子程序的上级程序
2.内部过程: 把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。 Visual FoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。即过程文件的建立。
3.过程文件的建立 【格式】 *过程文件名. PROCEDURE <过程名1> <命令序列1> RETURN … PROCEDURE <过程名n> <命令序列n> RETURN 过程文件中的每个子过程必须以PROCEDURE语句开头,后面跟过程名,每个子过程以RETURN语句结束。
4.过程文件的打开 调用过程文件前,应先打开相应的过程文件。 【格式】SET PROCEDURE TO[<过程文件名1>.PRG,[文件名2…]]ADDITIVE 【功能】打开过程文件。 在调用过程前,过程文件一旦被打开,过程文件中所有的子过程都被打开,可以随时被调用。在Visual FoxPro中,如果要同时打开两上以上的过程文件,可以在过程文件名之间用逗号分开。如果分别打开多个过程文件,则后打开的过程文件将会关闭先前所打开的过程文件,为避免这种情况发生,在SET PROCEDURE命令中加入ADDITIVE参数。 调用过程和调用于程序一样,使用D0<过程名>命令来调用指定的子过程。
5.过程文件的调用 【格式】 DO 〈过程名〉 WITH <参数表> 【功能】 执行以〈过程名〉为名的过程,即执行已有的过程。 6.过程文件的返回 【格式】 RETURN[TO MASTER|TO〈过程名〉] 【功能】将控制返回到调用程序中调用命令的下一语句,即返回过程的调用处。 7.过程文件的关闭 当过程文件调用结束后,应及时关闭过程文件。使用下列命令关闭过程文件: • SET PROCEDURE TO • CLOSE PROCEDURE
7-3-3 过程调用中的参数传递 过程可以没有或有多个参数,多个参数由逗号隔开。带参程调用命令在主程序中的调用格式: 1.有参过程中的形式参数定义 有参过程中的形式参数定义语句为: 【格式】 PARAMETERS <参数表> 【功能】 该语句必需是过程中第一条语句。<参数表>中的参数可以是任意合法的内存变量名。 2.程序与被调用过程间的参数传递 程序与被调用过程间的参数传递是通过过程调用语句DO <过程名> WITH <参数表>中WITH <参数表>子句来实现的。 【格式】 DO<文件名>|<过程名> WITH <参数表>
【说明】 1.DO命令<参数表>中参数称为实际参数,PARAMATERS命令<参数表>中的参数称为形式参数。两个<参数表>中的参数必须相容,即个数相同,类型和位置一一对应; 2.实际参数可以是任意合法表达式,形式参数是过程中的局部变量,用来接收对应实际参数的值; 3.参数的传递模式: l按值传递 按值传递时,传递给被调用过程(子过程)参数的是调用过程(父过程)调用时所使用的值。一般实参是一个变量或是一个表达式。 l按地址传递 如果实参是一个变量 (而不是表达式), 则传递给形参的是该变量的地址。 这是形参和实参是同一个变量,在过程中改变形参的值,会同时改变实参的值。默认模式下,变量按地址传递方式向过程传递,按值传递方式向函传递。
练习 例1、 对任意给的正整数A、B、C,编写程序计算S=A!+(3/5)B!+(C!/2) 例2、已知组合数的公式为: • C mn可写为C(m,n) • 求8!+c(9,4)-c(10,5)的值 说明:写阶乘和组合数两个过程,用主程序调用这两过程。
7-3-4 变量的作用域 程序设计离不开变量,如果以变量的作用来分,内存变量分为公共变量、私有变量和局部变量。 1.公共变量 公共变量是指在所有程序模块中都可以使用的内存变量。公共变量要先建立后使用。 【格式】PUBLIC <内存变量表> 【功能】该命令的功能是建立公共的内存变量,并为它们赋初值逻辑假.F.
2.局部变量 局部变量是指在建立它的程序以及被此程序调用的程序中有效的内存变量。 【格式】LOCAL <内存变量表> 【功能】该命令的功能是建立指定的内存变量,并为它们赋初值逻辑假.F. 3.私有变量 在程序中直接使用而由系统自动隐含建立的变量都是私有变量。私有变量的作用域是建立它的模块及其下属的各层模块。一旦建立它的模块程序运行结束,这些私有变量将自动清除。 【格式】 PRIVATE [<内存变量表>] [ALL[LIKE|EXCEPT<通配符>]]
7-3-5 自定义函数 Visual FoxPro为用户提供了几百个内部标准函数,但是并不能完全符合每个用户的需要,因此,为了程序设计的需要,必须自行设计函数,用户按一定规则来定义的函数,这种函数称为自定义函数。 自定义函数的格式如下: 【格式】 FUNCTION<函数名称>(变量名称) <语句序列> RETURN [<返回值>] ENDFUNC
【功能】用户自己定义一个函数。 定义了函数之后,可将它保存在单独的程序文件中,也可放在一般程序的底部,但不能将可执行的主程序放在函数之后。调用自定义函数与一般内部函数相同,函数执行后返回一个数据给调用程序,<返回值>可以是常数、变量或表达式等。如果没在RETURN命令后加入返回值,Visual FoxPro将自动返回.T.。当程序或用户自定义函数执行到RETURN命令就会立刻返回到调用程序中。
【例】利用自定义函数,求X!+ Y! CLEAR INPUT "输入X的值:" TO X U=JC(X) &&调用函数JC INPUT "输入Y的值:" TO Y V=JC(Y) ?"SUM=",U+V FUNCTION JC PARAMETERS N S=1 IF N>=1 FOR I=1 TO N S=S*I NEXT ENDIF RETURN (S) ENDFUNC 在该例中定义了一个求阶乘的函数。函数名为JC,X!的求法是在主程序内从键盘输入X的值,再调用JC函数求得X!后将值带回主程序。最后将两个阶乘值相加。