610 likes | 908 Views
第 6 章 面向过程程序设计. 6.1 应用程序基本操作. 6.2 应用程序中的常用命令. 6.3 顺序结构程序设计. 6.4 分支结构程序设计. 6.5 循环结构程序设计. 6.6 过程结构程序设计. 6.7 数组变量的应用. 6.8 结构化程序设计举例. 退出. 6.1 应用程序基本操作. 6.1.1 应用程序的建立. 6.1.2 应用程序的运行. 6.1.3 应用程序的修改. 退出. 1 )应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,又称为命令文件。
E N D
第6章 面向过程程序设计 6.1 应用程序基本操作 6.2 应用程序中的常用命令 6.3 顺序结构程序设计 6.4 分支结构程序设计 6.5 循环结构程序设计 6.6 过程结构程序设计 6.7 数组变量的应用 6.8 结构化程序设计举例 退出
6.1 应用程序基本操作 6.1.1 应用程序的建立 6.1.2 应用程序的运行 6.1.3 应用程序的修改 退出
1)应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,又称为命令文件。1)应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,又称为命令文件。 2)应用程序的组成: 前言:注释语句 设置区:设置程序的运行环境,多由SET命令实现 程序体:所有命令序列,一般包括数据的输入输出、数据的处理以及结果输出等命令 整理部分:如关闭各种文件 程序的退出:设置有关命令关闭文件返回到命令窗口状态或操作系统状态
6.1.1 应用程序的建立 (1)菜单方式 (2)命令方式:MODIFY COMMAND <程序名> 说明:<程序名>为主文件名,其扩展名的默认值为.PRG 示例:建立名为L1.PRG的应用程序,使其能够打开表文件“\VFP\ 学生表.DBF”,根据键入的学生姓名在该表文件中查找并输出该学生的基本情况,然后关闭该文件。 命令窗口:MODI COMM VFP\L1.PRG 编辑窗口:*L1.PRG SET TALK OFF USE VFP\ZGDA.DBF ACCEPT “请输入学生姓名:” TO XM LOCATE FOR 姓名=XM ?学号,姓名,性别,班级 USE SET TALK OFF RETURN
6.1.2 应用程序的运行 1. 菜单方式 2. 命令方式:DO 〈应用程序名〉 WITH <参数表> 说明:1)在程序运行过程中执行到下述命令时将会中断运行而退出,它们退出后返回的系统状态分别是: CANCEL:命令窗口状态。 QUIT:操作系统状态。 RETURN:调用点或命令窗口状态。 2)在程序运行过程中,若按下ESC键可使运行强行中断。这时系统显示警告,并给用户三种选择: 取消:中断程序的运行。此为缺省选项。 继续执行:忽略ESC的中断作用,继续程序的执行。 挂起:暂时中断程序的运行,返回命令窗口。当再次运行时可以从中断处继续运行。 6.1.3 应用程序的修改 1)菜单方式 2)命令方式: MODIFY COMMAND <程序名>
6.2 应用程序中的常用命令 6.2.1 交互输入命令 6.2.2 常用辅助命令 退出
6.2.1 交互输入命令 1. 键入字符串命令 格式:ACCEPT <提示信息> TO <内存变量> 说明:1)暂停程序的运行,等待用户键入字符型常量以赋给指定的内存变量。 2)<提示信息>是显示在屏幕上的、用于提示说明的字符型表达式。 3)如果不键入任何字符而只按回车键,则赋给内存变量的值将是一个空字符串。 示例:编写可以打开任一数据表文件的通用命令。 ACCEPT “请输入要打开的表文件名:” TO BM USE &BM
2. 输入单字符命令 格式:WAIT <提示信息>TO <内存变量> 功能:暂停程序的运行,等待用户键入单个字符后再恢复程序运行。 说明:1)<提示信息>为可选项,其格式、功能与要求同ACCEPT命令。如果命令中无此选项,则系统默认的提示信息是:PRESS ANY KEY TO CONTINUE…… 2)TO <内存变量>也为可选项,选用时,则键入的单个字符均作为字符型数据赋给内存变量。如果只是按下回车键,则只将一个空字符存入内存变量。 示例:试编写一个VFP程序,能够根据键入的系别代号(单字符)在不同系的档案表文件中查找某一职工的情况。 *L2.PRG SET TALK OFF CLEAR
2. 输入单字符命令 WAIT “请输入系的代号:” TO DH XH=“DH”+DH USE &XH ACCEPT “请输入职工姓名:” TO XM LOCATE FOR 姓名=XM ?“职工姓名:”+姓名 ?“性别:”+性别 ?“年龄:”+STR(年龄,2) ……… WAIT ?“职称:”+职称 ?“任教课程:”+任教课程 ?“教研室:”+教研室 ……… WAIT SET TALK ON RETURN
3. 键入表达式命令 格式:INPUT [<提示信息>] TO <内存变量> 功能:暂停程序运行,等待键入表达式并将其值赋给指定的内存变量,待按回车键后,继续运行程序。 说明: 1)<提示信息>为可选项,其格式、功能与要求同ACCEPT命令。 2)命令中的<内存变量>的类型决定于键入数据的类型,但不得为M型数据。 3)若键入的是表达式,本命令将先计算出表达式的值,然后把其结果赋给<内存变量>。 4)若键入字符型常量或逻辑型常量时应带有定界符。 5)在响应该命令时,若键入了无效表达式或只按下回车键,系统将会给出“句法错”的提示信息。 示例:试运行下述交互输入命令。 INPUT “请输入学生姓名:” TO XM INPUT “请输入其班级:” TO BJ INPUT “该人性别为:” TO XB
6.2.2 常用辅助命令 1. 注释命令 格式I:NOTE <注释内容> 格式II:*<注释内容> 格式III:……&&<注释内容> 说明:1)注释命令为非执行语句 2)注释内容最后一个字符是分号(;),系统默认下一行内容仍为注释内容。 示例1:NOTE 打开学生表 USE 学生表.DBF …… 示例2: SET CONSOLE OFF &&取消窗口的输出显示 ……
2. 环境设置命令 SET TALK ON/off 设置是否在主窗口的状态栏中 显示所有命令的执行结果。 SET CONSOLE ON/off 设置是否把输出信息在窗口上 显示。 SET PRINTER on/OFF 设置是否在打印机上输出信息。 SET SAFETY ON/off 设置在改写文件时,VFP是否 显示对话框以确认改写有效。 SET HEADING ON/off 设置在执行LIST、DISPLAY等 命令时是否显示字段名。 SET STATUS ON/off 设置是否显示状态行。 SET DEFAULT TO〈盘符〉 指定默认的驱动器。 SET DEVICE TO SCREEN 把输出信息发送到VFP的窗口 /PRINTER 屏幕或打印机。
3. 清除命令 格式I:CLEAR 说明:清除当前屏幕上的所有信息 格式II:CLEAR ALL 说明:关闭所有文件,清除所有内存变量 格式III:CLEAR TYPEAHEAD 说明:清除键盘缓冲区 4. 关闭文件命令 格式I:CLOSE ALL 说明:关闭所有的数据库、表以及索引文件 格式II:CLOSE <文件类型> 说明:文件类型 DATABASE 数据库文件、索引文件、格式文件 INDEX 当前工作区的索引文件 FORMAT 当前工作区的格式文件 PROCEDURE 当前工作区的过程文件 ALTERNATE 文本输出文件
5. 运行中断和结束命令 格式I:QUIT 说明:退出VFP,返回到操作系统状态 格式II:CANCEL 说明:结束本次程序的运行,返回到命令窗口状态 格式III:RETURN [TO MASTER] 说明:返回到调用点处。 6. 文本显示命令 格式:TEXT <文本内容> ENDTEXT 说明:将文本内容原样输出 7. 定位输出命令 格式:@ <行,列> SAY <数据> 说明:在指定的行、列处输出数据
条件 条件 A B A A B 6.3 顺序结构程序设计 1)程序设计的过程:分析问题、确定任务、划分模块、建立模型、组织数据、描述操作步骤、编写程序、上机调试、分析运行结果、写出程序说明书。 2)流程图:就是运用一些特定的图形符号和必要的文字来描述解题步骤的图示。 3)三种基本程序结构流程图: 顺序结构 分支结构 循环结构
6.3 顺序结构程序设计 4)顺序结构程序:自始至终严格按照程序中语句的先后顺序逐条执行,是最基本、最普遍的结构形式。 5)示例1:试在表文件中查看某学生的有关情况。 *L3.PRG SET TALK OFF CLEAR USE 学生表.DBF LOCATE FOR 姓名=“林天力” DISPLAY USE SET TALK ON 示例2:编程,根据输入的半径值,计算出相应的圆的周长。 SET TALK OFF CLEAR INPUT “请输入圆的半径:” TO R L=2*3.1416*R @10,10 SAY “圆的周长是:”+STR(L,6,3) SET TALK ON
6.4 分支结构程序设计 6.4.1 两分支结构 6.4.2 多分支结构 退出
语 句 行 N Y 语句行序列 ENDIF后面的语句 条件表达式 分支结构:就是按照一定的条件由判断语句或选择语句构成的双重或多重走向的程序 6.4.1 两分支结构 1. 简单分支 1)简单分支的格式: IF <条件表达式> <语句行序列> ENDIF 注意:IF和ENDIF必须成对出现 例:在“学生表”中查看“李尚清”的基本情况。 SET TALK OFF CLEAR USE 学生表 LOCATE FOR 姓名=”李尚清”
语 句 行 语句行序列2 语句行序列1 ENDIF后面的语句 条件 IF FOUND() DISP ENDIF USE SET TALK ON 2. 选择分支 格式:IF <条件表达式> <语句行序列1> ELSE <语句行序列2> ENDIF
例1:求解一元二次方程AX2+BX+C=0,系数A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出“方程无实根!”例1:求解一元二次方程AX2+BX+C=0,系数A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出“方程无实根!” SET TALK OFF CLEAR INPUT “A=” TO A INPUT “B=” TO B INPUT “C=” TO C D=B*B-4*A*C IF D>=0 X1=(-B+SQRT(D))/(2*A) X2=(-B-SQRT(D))/(2*A) ?“方程的两根是:”+STR(X1,2)+SPACE(4)+STR(X2,2) ELSE ?”方程无实根!” ENDIF SET TALK ON RETURN
例2:在表文件“分数.DBF”中查找学号为99020203的学生成绩,若其成绩满60分则显示其学号、课程号和成绩;否则显示此人的学号、课程号并通知其补考。例2:在表文件“分数.DBF”中查找学号为99020203的学生成绩,若其成绩满60分则显示其学号、课程号和成绩;否则显示此人的学号、课程号并通知其补考。 • *L6.PRG • SET TALK OFF • USE 分数.DBF • CLEAR • LOCATE FOR 学号=“99020203” • IF 成绩>=60 • ?“学号:”+学号 • ?“课程号:”+课程号 • ?“成绩:”+STR(成绩,6,2) • ELSE • ?“学号为”+学号+“的学生应参加补考的课程号为:”+课程号 • ENDIF • USE • SET TALK ON
3. 判断语句嵌套 IF语句多重嵌套示意结构如下: IF<条件表达式1> <语句行序列1> ELSE IF<条件表达式2> <语句行序列2> ELSE IF<条件表达式3> <语句行序列3> ELSE ……… ENDIF3 ……… ENDIF2 ……… ENDIF1 注意: (1)IF、ELSE(可不选)、ENDIF一一 对应、互相匹配 (2)允许简单判断和选择判断语句自我嵌套或相互嵌套,但层次必须清楚,不得交叉 (3)最好采用缩格(锯齿形)的书写方式
X2+4X-1 (X≤0) 3X2-2X+1 (0<X≤10) X2+1 (X>10) Y= 例:根据键入X的值,计算下面分段函数的值,并显示结果。 程序如下: SET TALK OFF CLEAR INPUT “X=” TO X IF X>0 IF X>10 Y=X*X+1 ELSE Y=3*X*X-2*X+1 ENDIF ELSE Y=X*X+4*X-1 ENDIF ?”分段函数值为:”+STR(Y,10,2) SET TALK ON RETURN
6.4.2 多分支结构 格式: DO CASE <条件表达式1> <语句行序列1> CASE <条件表达式2> <语句行序列2> …… CASE <条件表达式2> <语句行序列2> [OTHERWISE <语句行序列N+1> ENDCASE[注释内容]
例:用DO CASE语句修改上面计算分段函数的例子。 SET TALK OFF CLEAR INPUT “X=” TO X DO CASE CASE X<=0 Y=X*X+4*X-1 CASE X>0.AND.X<=10 Y=3*X*X-2*X+1 CASE X>10 Y=X*X+1 ENDCASE ?”分段函数值为:”+STR(Y,10,2) SET TALK ON RETURN
6.5 循环结构程序设计 6.5.1 当型循环结构 6.5.2 固定次数的循环结构 6.5.3 表扫描循环结构 6.5.4 多重循环结构 退出
语句行序列 N 条件表达式 Y 循环体内语句 修改条件表达式 ENDDO后面的语句 循环结构程序:按照一定条件重复进行某种特定操作的程序称为循环结构程序。 6.5.1 当型循环结构 格式:DO WHILE <条件表达式> <语句行序列1> [LOOP] <语句行序列2> [EXIT] <语句行序列3> ENDDO 说明: 结构组成:循环起始语句、循环体、循环终端语句 注意:在循环体内要设置修改循环条件的语句,避免死循环。
死循环示例:X=1 • S=0 • DO WHILE X>=1 • S=S+X • X=X+1 • ENDDO • 例1:编程求和S=1+2+3+…+100。 • SET TALK OFF • CLEAR • STORE 0 TO N,S • DO WHILE N<=100 • S=N+S • N=N+1 • ENDDO • ?”累加和S=”,S • SET TALK ON • RETURN
例2:编程显示学生表中所有女生的记录。 SET TALK OFF CLEAR USE 学生表 INDEX ON 性别 TO 学生表_性别 SEEK “女” DO WHILE性别=”女” DISP SKIP ENDDO USE SET TALK ON RETURN
例3:令计算机从0开始计数,每计一个数,便判断该数是否为偶数,若是偶数则接着计下一个数;若是奇数则将其累加,若累加和大于250,则计数结束;若累加和不大于250则继续计数,编写程序。例3:令计算机从0开始计数,每计一个数,便判断该数是否为偶数,若是偶数则接着计下一个数;若是奇数则将其累加,若累加和大于250,则计数结束;若累加和不大于250则继续计数,编写程序。 SET TALK OFF CLEAR STORE 0 TO X,Y DO WHILE .T. X=X+1 DO CASE CASE INT(X/2)=X/2 LOOP CASE X+Y>250 EXIT OTHERWISE Y=X+Y ?”Y=”,Y ENDCASE SET TALK ON ENDDO RETURN
例4:编写程序能根据键盘输入的姓名,从学生表中查找该生的信息。例4:编写程序能根据键盘输入的姓名,从学生表中查找该生的信息。 SET TALK OFF CLEAR ACCEPT “请输入姓名:” TO XM USE 学生表 DO WHILE .NOT.EOF() IF 姓名=XM DISP EXIT ELSE SKIP ENDIF ENDDO USE SET TALK ON
6.5.2 固定次数的循环结构 格式: FOR <循环控制变量>=<初值> TO <终值> [STEP <步长>] <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDFOR/NEXT 注意:步长可为正值和负值 例1:编程求和S=1+2+3+…+100。 SET TALK OFF CLEAR S=0 FOR N=1 TO 100 ?”S=”,S S=S+N SET TALK ON ENDFOR RETURN
例2:用下列级数的前21项之和计算自然对数之底e的近似值。例2:用下列级数的前21项之和计算自然对数之底e的近似值。 • *L10.PRG • SET TALK OFF • STORE 1 TO E,T • FOR X=1 TO 20 • T=T*X • E=E+1/T • ENDFOR • ?“该级数前21项之和是:”+STR(E,7,5) • SET TALK ON • RETURN
6.5.3 表扫描循环结构 格式: SCAN [<范围>] [FOR <条件>] [WHILE <条件>] <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDSCAN
例1:编程统计学生表中男学生的人数。 SET TALK OFF CLEAR N=0 USE 学生表 SCAN FOR 性别=”男”(WHILE 性别=“男”) N=N+1 ENDSCAN ?”学生表中男学生的人数是:”,N USE SET TALK ON RETURN
例2:统计表文件“学生表.DBF”中各个班级的人数。例2:统计表文件“学生表.DBF”中各个班级的人数。 • *L1.PRG • SET TALK OFF • STORE 0 TO A,B • CLEAR • USE 学生表.DBF • SCAN • DO CASE • CASE 班级=“注会” • A=A+1 • CASE 班级=“金融二” • B=B+1 • ENDCASE • ENDSCAN • ?“注会班的人数为:”+STR(A,3) • ?“金融二的人数为:”+STR(B,3) • USE • SET TALK ON
6.5.4 多重循环结构 格式(以当型循环结构为例): DO WHILE 〈条件表达式1〉 〈语句行序列11〉 DO WHILE 〈条件表达式2〉 〈语句行序列21〉 DO WHILE 〈条件表达式3〉 〈语句行序列31〉 …… ENDDO3 〈语句序列22〉 ENDDO2 〈语句行序列12〉 ENDDO1
例1:试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。例1:试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。 • SET TALK OFF • CLEAR • FOR Y=1 TO 9 • FOR X=1 TO 9 • Z= Y * X • ??STR(Y,1)+“*”+STR(X,1)+“=”+STR(Z,2)+“ ” • ENDFOR • ? • ENDFOR • SET TALK ON • RETURN
例2:编写程序打印如下的图形 ******** ******** ******** ******** ******** ******** ******** SET TALK OFF CLEAR A=1 DO WHILE A<=7 B=1 DO WHILE B<=8 @A,B+A SAY “*” B=B+1 ENDDO A=A+1 ENDDO SET TALK ON RETURN
例3:编程打印如下图形: * *** ***** ******* ********* *********** ************* SET TALK OFF CLEAR A=1 DO WHILE A<8 B=1 DO WHILE B<=2*A-1 @A,40-B+A SAY “*” B=B+1 ENDDO ENDDO SET TALK ON A=A+1 RETURN
6.6 过程结构程序设计 6.6.1 过程的建立与调用 6.6.2 过程文件 6.6.3 内存变量作用域 6.6.4 过程的带参调用 退出
过程:可被调用的功能模块或能够完成某种特定功能的独立程序。过程:可被调用的功能模块或能够完成某种特定功能的独立程序。 6.6.1 过程的建立与调用 • 1、过程的建立: • MODIFY COMMAND <文件名> • 2、过程的调用 • DO <过程名> • 3、过程中的返回命令 • RETURN [TO MASETR] • 4、过程的嵌套:一个过程又调用了另一个过程
例1:用过程编写一个求和与乘积的程序。 *AA.PRG调用过程BB *过程BB SET TALK OFF M=3 S=1 N=5 P=1 S=M+N DO BB P=S*N ?”S=”,S RETURN ?”P=”,P SET TALK ON RETURN
例2:试编写一程序求解W=X!+Y!+Z!(其中:X,Y,Z的值均为一位正整数)。例2:试编写一程序求解W=X!+Y!+Z!(其中:X,Y,Z的值均为一位正整数)。 • 主程序 过程 • *MAIN_1.PRG *SUB_1.PRG • SET TALK OFF T=1 • INPUT “X=” TO X FOR I=1 TO N • INPUT “Y=” TO Y T=T*I • NPUT “Z=” TO Z ENDFOR • N=X RETURN • DO SUB_1 • A=T • N=Y • DO SUB_1 • B=T • N=Z • DOU SUB_1 • W=T+A+B • ?“W=”+STR(W,7) SET TALK ON
例3:有一个名为SCORE的数据表,具有如下的字段:学号(C,5),姓名(C,8),政治(N,3),数学(N,3),外语(N,3),总分(N,3),平均分(N,6,2)。编写一程序,分别求出政治课、数学课和外语课的总分。例3:有一个名为SCORE的数据表,具有如下的字段:学号(C,5),姓名(C,8),政治(N,3),数学(N,3),外语(N,3),总分(N,3),平均分(N,6,2)。编写一程序,分别求出政治课、数学课和外语课的总分。 *主程序CLASS.PRG SET TALK OFF *计算单科总分的过程JSZF.PRG USE SCORE GO TOP KCM=”政治” DO WHILE .NOT.EOF() T=0 T=T+&KCM DO JSZF SKIP T1=T ENDDO KCM=”数学” RETURN T=0 DO JSZF T2=T KCM=”外语” T=0 ?”政治课,数学课,外语课的总分分别是:”,T1,T2,T3 DO JSZF USE T3=T SET TALK ON
6.6.2 过程文件 • 1、过程文件:过程的集合 • 2、过程文件的建立和修改 • MODIFY COMMAND <过程文件名> • 3、过程文件的一般结构 • PROCEDURE <过程名1> • <过程名1的语句行系列> • RETURN • PROCEDURE <过程名2> • <过程名2语句行序列> • RETURN • …… • …… • PROCEDURE <过程名N> • <过程N语句系列> • RETURN
4、过程文件的打开命令 格式:SET PROCEDURE TO <过程文件名> 5、过程文件的关闭命令 格式I:SET PROCEDURE TO 格式II:CLOSE PROCEDURE 例1:编写程序,调用过程文件中的过程,并显示结果。 过程文件PROC.PRG PROCEDURE PROC1 ?”I am from proc1.” ?”* 10 11 12 13 14 15” ?”平方 100 121 144 169 196 225” RETURN PROCEDURE PROC2 ?”I am from proc2.” ?”** 10 11 12 13 14 15” ?”立方 1000 1331 1728 2179 2774 3375” DO PROC3 RETURN
PROCEDURE PROC3 • ?”------------------------------------------------” • ?”I am from proc3.” • RETURN • 主程序MAIN.PRG • CLEAR • SET PROCEDURE TO PROC • DO PROC1 • ?”========================” • DO PROC2 • ?”========================” • CLOSE PROCEDURE • RETURN • 例2:试求3~100之间的所有素数并显示之。 • 算法:每产生一个M的值则依次除以3到M的算术平方根之间的所有奇数,若均不能被整除,则M即为素数,然后将其显示输出,否则,M就不是素数。
主程序 过程文件 • *MAIN_2.PRG *SUB_2.PRG • SET TALK OFF PROCEDURE JC • SET PROCEDURE TO SUB_2 …… • FOR M=3 TO 100 STEP 2 RETURN • I=3 PROCEDURE QS • N=INT(SQRT(M)) FOR I=3 TO N STEP 2 • DO QS IF INT(M/I)=M/I • ENDFOR RETURN • SET PROCEDURE ENDIF • ENDFOR • ??M • RETURN • …… • ……
6.6.3 内存变量作用域 作用域:内存变量的作用范围。 1、全局变量 1)全局变量:指在程序的任何嵌套中及在程序执行期间始终有效的变量。 2)格式:PUBLIC <内存变量表> 例:在过程调用中,运用全局变量传递数据。 主程序 过程 *MAIN_3.PRG *SUB_3.PRG SET TALK OFF PUBLIC B,C CLEAR B=2 PUBLIC A D=3 A=1 ?“在过程中:A,B,C,D=”,A,B,C,D DO SUB_3 RETURN ?“返回主程序:A,B,C,D=”,A,B,C,D SET TALK ON