1 / 64

第六章 程序设计基础

第六章 程序设计基础. 本章重点掌握 : ( 1) 熟练掌握程序文件的建立、编辑以及程序文件的调用; ( 2 ) 掌握三种程序结构:顺序结构、分支结构(单向、双向、多向分支)、循环结构( “ 当 ” 型、 “ 计数 ” 型、 “ 指针 ” 型循环控制语句),并能根据程序设计的要求正确使用; ( 3 ) 掌握 多模块程序的设计和调用方法(主程序和子程序),过程文件的建立和调用; ( 4 ) 掌握自定义函数的建立和调用方法; ( 5 ) 掌握定义变量作用域的方法(全局变量、局部变量和私有变量)。. 内容目录. 6.1 vfp 的工作方式

rafer
Download Presentation

第六章 程序设计基础

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. 第六章 程序设计基础

  2. 本章重点掌握: (1)熟练掌握程序文件的建立、编辑以及程序文件的调用; (2)掌握三种程序结构:顺序结构、分支结构(单向、双向、多向分支)、循环结构(“当”型、“计数”型、“指针”型循环控制语句),并能根据程序设计的要求正确使用; (3)掌握多模块程序的设计和调用方法(主程序和子程序),过程文件的建立和调用; (4)掌握自定义函数的建立和调用方法; (5)掌握定义变量作用域的方法(全局变量、局部变量和私有变量)。

  3. 内容目录 6.1 vfp的工作方式 6.2 程序文件的建立与编辑 6.2.1基本概念 6.2.2创建、修改、运行程序文件 6.2.3程序书写规则 6.3 程序文件中的专用命令 6.4 程序文件的控制结构 6.4.1程序基本结构 6.4.2分支结构 6.4.3循环结构

  4. 内容目录 6.5 多模块程序 6.5.1子程序 6.5.2自定义函数 6.5.3过程 6.6 变量的作用域 6.6.1公共变量 6.6.2本地变量 6.6.3私有变量 6.7 程序调试方法

  5. 6.1 VFP 6.0的工作方式 VFP提供三种工作方式: 命令方式、菜单方式和程序文件方式。前两种方式为 交互操作方式 1、命令方式 在命令窗口中输入命令并执行。输入一条,执行一条。 2、菜单方式 在系统菜单栏中,通过选择菜单项完成相应的操作。 3、程序文件方式 将完成特定任务的命令序列存在程序文件(.prg)中, 需要时执行该程序文件即可。 有结构化程序设计和面向对象程序设计两种 方法实现程序设计。

  6. 6.2 程序文件的建立与编辑 6.2.1 基本概念 • 程序是能够完成某一具体任务的命令的有序集合。这组命令被存放在程序文件中。 • 程序设计是利用系统所提供的设计工具,按照程序语言的规范,编写程序的过程。 • VFP包含了过程化程序设计与面向对象程序设计 程序文件的特点 • 程序自动执行多条命令 • 程序可被修改并重新运行,且可多次运行 • 一个程序可调用其他程序

  7. 6.2.2 创建、修改、运行程序文件(.PRG) • 创建: • “新建”按钮 • MODIFY COMMAND <程序文件名> • 修改: • “打开”/“修改”按钮 • MODIFY COMMAND <程序文件名> • 运行: • “运行”按钮 • DO <程序文件名>

  8. 6.2.3 程序书写规则 一行只能写一条命令,以回车结束; 一条命令可分为多行来写,但在行末要加续行符(分号)“;” 注释行以 “*” 号开头,指出这一行不是命令; 注释也可以写在行末,以 “&&”开头,直到行末都是注释

  9. 【例JX6-1】建立一个程序文件并执行它。 建立名为JX6-1.PRG的应用程序,使其能够打开表文件“\DATA\ STUDENT.DBF”,根据键入的学生姓名在该表文件中查找并输出该学生的基本情况,然后关闭该文件。 (本教学过程中,VFP6.0的默认路径设为e:\VFP教学\示例) 命令窗口:MODI COMM PROG\JX6-1.PRG 编辑窗口:*JX6-1.PRG SET TALK OFF USE DATA\STUDENT.DBF ACCEPT “请输入学生姓名:”TO XM LOCATE FOR 姓名=XM ?学号,姓名,性别,所在系 USE SET TALK OFF RETURN e:\VFP教学\示例\PROG\JX6-1.PRG e:\VFP教学\示例\ DATA\STUDENT.DBF

  10. 6.2.4 求解的基本逻辑与程序通用性 • 程序的逻辑性 要完成数据处理过程,通常应包括三个部分:(1)提出原始及其处理要求 → 输入 → r=3(2)按指定要求进行数据处理 → 处理 → s=3.1416*r*r(3)输入结果 → 输出 →“圆面积=”,S • 程序的通用性 程序应可反复执行,使程序的应用范围更广。通常可采用:(1) 参数传替 (2) 键盘输入

  11. 6.3 程序文件中的专用命令 命 令功 能 RETURN终止程序执行,并返回上级程序继续执行, 如无上级程序则返回命令窗口。 CANCEL使程序运行终止,清除程序的私有变量,并 返回到命令窗口 QUIT退出VFP系统。返回到Windows操作系统。 6.3.1 程序结尾命令

  12. ACCEPT 格式:ACCEPT [<提示信息>] TO <内存变量> 功能:从键盘上输入字符串并赋给内存变量。 6.3.2 格式化输入/输出语句 • INPUT 格式:INPUT [<提示信息>] TO <内存变量> 功能:从键盘上输入数据并赋给内存变量。 注:数据可是字符型、数值型、逻辑型,内存变量的类型由输入的数据类型决定。

  13. WAIT 格式:WAIT [<提示信息>] [TO <内存变量> ] 功能:从键盘上输入单字符,可赋给内存变量。 注:如命令中无选项[<提示信息>] 屏幕将显示“按任意键继续…” • 屏幕输入 格式: @<行,列> [SAY <提示信息>][GET <变量名>][DEFAULT <表达式2>] 功能:从指定的屏幕位置开始显示提示信息,并接受键盘上输入的数据赋给内存变量。 注:当执行了其后的第一个READ命令时赋值

  14. 6.4 程序的控制结构 VFP程序控制基本结构有3种: • 顺序(顺序结构由语句行组成,执行时语句顺序执行) • 分支(根据逻辑表达式的值选择执行不同程序语句) • IF……ELSE……ENDIF • DO CASE……ENDCASE • 循环(使得一组语句组重复执行若干次) • DO WHILE……ENDDO • FOR……NEXT/ENDFOR • SCAN……ENDSCAN 6.4.1 程序基本结构 6.4.2 分支结构

  15. 1、条件语句(带ELSE、不带ELSE) N 条件 条件 Y N Y 命令序列 命令序列2 命令序列1 ENDIF的下一条命令 ENDIF的下一条命令

  16. 【例JX6-2】从键盘上任意输入一个数,请判断是偶数还是奇数。【例JX6-2】从键盘上任意输入一个数,请判断是偶数还是奇数。 *jx6-2.prg Set talk off clear Input “请输入任意数” to nu Ifint(nu/2)=nu/2 ? “是偶数” Else ? “是奇数” Endif Set talk on

  17. 语句格式 DO CASE CASE <条件表达式1> <语句序列1> CASE <条件表达式2 > <语句序列12 > …………. CASE <条件表达式n> <语句序列 n > [OTHERWISE <其他语句序列>] ENDCASE 2、多分支语句

  18. 【例JX6-3】已知有3个数据表,分别是STUDENT、COURSE和SC,编写一个程序可在不同的选择下,使用这些数据表。【例JX6-3】已知有3个数据表,分别是STUDENT、COURSE和SC,编写一个程序可在不同的选择下,使用这些数据表。 编写程序代码如下:

  19. WAIT “请输入您的选择:(1~3)”TO choose DO CASE CASE choose=”1” USE data\student.dbf SHARED BROWSE LAST CASE choose=”2” USE data\course.dbf SHARED BROWSE LAST CASE choose=”3” USE data\sc.dbf SHARED BROWSE LAST ENDCASE use return

  20. 6.4.3 循环结构 1、条件循环 1)格式: DO WHILE <条件表达式> <循环体语句序列> ENDDO 2)功能: 该语句通过<条件表达式>的值来控制循环。执行语句时,反复判断<条件表达式>的值,当<条件表达式>的值为“真”时,执行<循环体语句序列>;否则,结束循环并执行ENDDO后面的第一个命令 N Y

  21. 【例JX6-4】修改职工工资表文件(GZ.DBF)的内容:对所有职工的工资按要求进行相应调整。【例JX6-4】修改职工工资表文件(GZ.DBF)的内容:对所有职工的工资按要求进行相应调整。 USEGZ DO WHILE.NOT.EOF() DO CASE case 工资<100 repl 工资 with 150 case 工资<300 repl 工资 with 工资+80 case 工资<500 repl 工资 with 工资+50 case 工资<700 repl 工资 with 工资+30 ENDCASE SKIPENDDOUSE Return

  22. FOR 循环变量=<初值> .T. 判断循环变量是否大于终值 .F. 语句组 循环变量=循环变量+<步长> ENDFOR 2、步长循环 语句格式 FOR <循环变量>=<初值> TO <终值> [STEP <步长>] <语句组> ENDFOR / NEXT

  23. 【例JX6-5】 计算100以内的奇数和S=1+3+5+……+99,100的阶乘P=1*2*3*……*100 *jx6-5.prg N=100 && 设置循环终值常量 s=0 && 累加器,初始化为0 p=1 && 累乘器,初始化为1 *** 以下循环计算n以内的奇数和 FOR i = 1 to N STEP 2 s = s + i ENDFOR ? N , “ 以内的奇数和S=” ,S ***以下循环计算N的阶乘 FOR I =1 TO N p = p * I ENDFOR ? N, “的阶乘=”, p

  24. 3、扫描循环 语句格式: SCAN[〈范围〉][FOR〈条件表达式1〉] 〈命令行序列〉 ENDSCAN 语句功能: 该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式1〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。

  25. 【例JX6-6】用“指针”型循环控制语句,统计“GZ”数据表中工资超过1000元的人数。【例JX6-6】用“指针”型循环控制语句,统计“GZ”数据表中工资超过1000元的人数。 编写程序代码如下: USE GZ.dbf EXCLUSIVE BROWSE LAST rc=0 SCAN ALL FOR工资>=1000 rc=rc+1 ENDSCAN CLEAR ? "工资在1000元以上的人数:" ?? rc USE

  26. 在各种循环语句的循环体中可以插入LOOP和EXIT语句,在各种循环语句的循环体中可以插入LOOP和EXIT语句, LOOP语句能使执行转向循环语句头部继续循环。EXIT语句用来立即退出循环,转去执行ENDDO,ENDFOR或 ENDSCAN后面的语句。 注意:在FOR循环语句中执行LOOP语句,将会先修改循环变量的值,然后转向循环语句头部。在SCAN循环语句中执行LOOP语句,将会先移动记录指针,然后转去判断循环条件。  4、循环辅助语句

  27. 【例jx6-7】编程计算S=1+2+3+…+100,并求l~100之间奇数之和。【例jx6-7】编程计算S=1+2+3+…+100,并求l~100之间奇数之和。 程序流程图如下:

  28. 编写程序代码如下: *jx6-7.prg STORE 0 TO i,s,t DO WHILE i<100 i=i+1 s=s+i && 累加i值 IF INT(i/2)<>i/2 && i为偶数时条件值为.T. t=t+i && 累加奇数 ENDIF ENDDO ?”1+2+3+…+100:”,s ?”1~100奇数和为:”,t 程序运行结果显示如下: 1+2+3+…+100:  5050 1~100奇数和为:   2500

  29. P136习题6:已知成绩.DBF含有学号、平时、考试、等级等字段,前三个字段已存有某班学生的数据,平时成绩、考试成绩均填入了百分制数。请以平时成绩20%、考试成绩80%的比例确定等级并填入等级字段。等级评定办法是:90分以上为优,75~89为良,60~74为及格.60分以下不及格。要求用条件、步长、扫描3种循环语句分别编出程序。 *--------------------------------------------------- * 程序 L6_6_1.prg (要求用条件循环语句编出程序。) *---------------------------------------------------- clear use e:\vfp6\test\成绩 do while .not. eof() cj=平时*0.2+考试*0.8 do case case cj>=90 replace 等级 with "优" case between (cj,75,89) replace 等级 with "良"

  30. case between (cj,60,74) replace 等级 with "及格" case cj<60 replace 等级 with "不及格" endcase skip enddo use

  31. *------------------------------------------------------------------------------*------------------------------------------------------------------------------ *程序 L6_6_2.prg(要求用步长循环语句编出程序。) *------------------------------------------------------------------------------ clear use e:\vfp6\test\成绩 for i=1 to reccount() cj=平时*0.2+考试*0.8 do case case cj>=90 replace 等级 with "优" case between (cj,75,89) replace 等级 with "良" case between (cj,60,74) replace 等级 with "及格" case cj<60 replace 等级 with "不及格" endcase skip endfor use

  32. *------------------------------------------------------------------------------*------------------------------------------------------------------------------ *程序 L6_6_3.prg(要求用扫描循环语句编出程序。) *------------------------------------------------------------------------------ clear use e:\vfp6\test\成绩 scan all cj=平时*0.2+考试*0.8 do case case cj>=90 replace 等级 with "优" case between (cj,75,89) replace 等级 with "良" case between (cj,60,74) replace 等级 with "及格" case cj<60 replace 等级 with “不及格” endcase endscan use

  33. FOR I=1 TO 9 FOR J=I+1 TO 10 IF A(I) > A(J); 比较T=A(I)A(I)=A(J)A(J)=T ENDIF ENDFOR ENDFOR 【例jx6-8】(排序):将数组A(10)中的10个元素按升序进行排序。(降序如何处理?) 交换 后一个数比前一个数小,则两个数调换位置,否则位置不变。为此使得小数在前,大数在后。I=1时,挑出最小的一个数,并把它放在最前一个位置; I=2时……

  34. 排序比较过程(冒泡比较法)

  35. 完整的程序

  36. 5、多重循环结构 格式(以条件循环结构为例): DO WHILE 〈条件表达式1〉 〈语句行序列11〉 DO WHILE 〈条件表达式2〉 〈语句行序列21〉 DO WHILE 〈条件表达式3〉 〈语句行序列31〉 …… ENDDO3 〈语句序列22〉 ENDDO2 〈语句行序列12〉 ENDDO1

  37. 【例jx6-9】试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。【例jx6-9】试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。

  38. SET TALK OFF CLEAR FOR Y=1 TO 9 FOR X=1 TO Y Z= X * Y ??STR(X,1)+“*”+STR(Y,1)+“=”+STR(Z,2)+“” ENDFOR ? ENDFOR SET TALK ON RETURN 思考题:如果要输出倒梯形乘法表,其程序代码如何编写?

  39. 6.5 多模块程序 在程序设计中,常把重复书写的一段程序独立设计,这种具有 相对独立性和通用性的程序段称为子程序。 子程序能被程序多次调用,而调用子程序的程序称为主程序。使用子程序设计,大大简化程序设计和调试过程。使程序结构 化,即模块化 6.5.1 子程序 1、概念

  40. 子程序 C.prg …. ….. Return 子程序 B.prg …. DoC ….. Return 主程序 A.prg …. Do B ….. ….. 2、子程序的调用与返回 调用子程序: DO <子程序名> 返回上级调用程序: RETURN 返回最顶层主程序:RETURN TO MASTER

  41. 格式:DO <程序名> [WITH <参数表>] 说明:<参数表>中参数为实际参数(实参),可以是表达式,但须为确切值。 调用子程序时参数表中的参数要传送给子程序,被调用的子程序的第一条语句也必须设置相应的参数接收语句PARAMETERS。 格式:PARAMETERS <参数表> 功能:指定内存变量以接收DO命令发送的参数值,返主时把内存变量值回送给调用程序中相应的内存变量。 说明: (1) <参数表>中参数为形式参数(形参),默认为私有变量,返主时回送参数值后即被清除。 (2) 命令中的参数依次与调用命令WITH子句中的参数相对应,故两者参数个数必须相同。 3、带参数子程序的调用与返回

  42. 主程序: * E6-7.prg ymj=0 INPUT “bj=” to bj DO js WITH bj,ymj ?"ymj=",ymj RETURN 【例jx6-10】设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。 子程序: * js.prg PARAMETERS r,s s=PI()*r*r RETURN 当实参传给对应形参后,实参又随形参的变化而变化,这种传递称为引用

  43. 输入n .F. n>0 ? .T. 输入m 求最大公约数 打印最大公约数 【例jx6-11】循环从键盘输入两个正整数n,m,求两者的最大公约数,直到输入的n小于等于0。 *主程序 jx6-11.prgcleardo while .t. input "n=" to n if n<=0 exit endif input "m=" to m k=1 do maxGys with n,m,k ? kenddo *子程序 maxGys.prgparameters n,m,kdo while .t. if n>m t=n n=m m=t endif r=m%n if r=0 exit else m=n n=r endifenddok=nreturn

  44. 思考题: 编程计算S=1!+2!+3!+……+100!,并显示计算结果。

  45. 6.5.2 自定义函数 1、自定义函数的建立 格式:[FUNCTION <函数名>] [PARAMETERS <参数表>] <语句序列>RETURN <表达式> 调用方式:<函数名>(<参数表>) 说明:自定义函数与子程序概念基本相同,但其执行结束后必须要 返回一个函数值。自定义函数不能与系统函数和内存变量重名。 默认的参数传递方式为传值,即形参的变化不影响实参;而过程的参数传递方式为引用

  46. 1)将函数作为一个独立的文件主程序funmain.prgclearset default to e:\vfp教学\示例 input “请输入第一条边的长度:”to ainput “请输入第二条边的长度:”to binput “请输入第三条边的长度:”to cresult=Fmj(a,b,c)&&调用计算三角形面积的函数 ?"面积为:",resultreturn*计算三角形面积的自定义函数:Fmj.prgPARA A,B,CP=(A+B+C)/2S=SQRT(P*(P-A)*(P-B)*(P-C))RETURN S 2、函数的使用

More Related