480 likes | 653 Views
第 6 章 结构化程序设计. 辽东学院 · 信息技术学院 崔晓斐. 本章基本内容. 6.1 程序文件 6.2 程序的基本控制结构 6.3 子程序、过程与自定义函数 6.4 程序的调试. 引: Visual foxpro 6.0 有两种命令: 交互命令:方便灵活,但不能解决复杂问题 程序命令:用于编写程序,解决复杂问题. 6.1 程序文件. 例 1 :编写一程序,设圆的半径为 5 ,求其面积 分析: 已知条件 R=5 求面积 公式 S=πR 2 编写程序
E N D
第6章 结构化程序设计 辽东学院·信息技术学院 崔晓斐
本章基本内容 • 6.1 程序文件 • 6.2 程序的基本控制结构 • 6.3 子程序、过程与自定义函数 • 6.4 程序的调试 信息技术学院 崔晓斐 制作
引: • Visual foxpro 6.0有两种命令: • 交互命令:方便灵活,但不能解决复杂问题 • 程序命令:用于编写程序,解决复杂问题 信息技术学院 崔晓斐 制作
6.1 程序文件 例1:编写一程序,设圆的半径为5,求其面积 • 分析: • 已知条件R=5 • 求面积 • 公式 S=πR2 • 编写程序 • *start.prg &&程序文件名字start.prg • Set talk off &&命令的操作结果是否显示或打印 • pi=3.1415926 &&设一个变量pi存放π的值 • R=5 &&对半径R赋值 • S=pi*R*R &&根据公式求出面积放到S中 • ?“圆面积S=: ”,S 从键盘输入R的值 Input “输入圆半径:” to R 信息技术学院 崔晓斐 制作
6.1.1 程序文件的建立、编辑与运行 1. 程序的概念 • 应用程序:为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,又称为程序文件。扩展名为 .PRG • 编写一次即可,需要时调出来执行 2. 程序文件的建立与编辑 • 命令方式:modify command [程序文件名] • 菜单方式:文件/新建/程序/新文件 • 项目管理器方式:代码/程序/新文件 • 保存:ctrl+w 或者点击 文件/保存或者 “保存”按钮 3. 程序文件的执行 • 命令方式:do 程序文件名 (扩展名可以省略不写) • 菜单方式:程序/运行 或者 工具栏上的“!” • 项目管理器方式:程序文件名/运行 信息技术学院 崔晓斐 制作
6.1.2 常用的交互命令 1. wait命令 • 格式:WAIT <提示信息>TO <内存变量> • 功能:暂停程序的运行,等待用户键入单个字符后再恢复程序运行。 例2:显示“学生信息”表的女同学记录 • *wait.prg • Use 学生信息 • List all for 性别=“女” • Wait “性别为女记录已显示” windows timeout 5 信息技术学院 崔晓斐 制作
2. accept命令 • 格式:ACCEPT <提示信息> TO <内存变量> • 功能:暂停程序的运行,等待用户键入字符串常量以赋给指定的内存变量。输入的字符串无需加定界符。 例3 :从查找学号是0511011402的学生,并显示此学生信息 第二种方法: Use 学生信息 Accept "请输入查找学生的学号:" to xsbh &&从键盘输入字符串存放到xsbh变量中 List for 学号=xsbh &&显示所有学号是xsbh变量值的学生记录 use 第一种方法 Use 学生信息 locate for 学号="0511011402" display use 信息技术学院 崔晓斐 制作
3. input命令 • 格式:INPUT [<提示信息>] TO <内存变量> • 功能:暂停程序运行,等待键入表达式并将其值赋给指定的内存变量,待按回车键后,继续运行程序。 • 表达式类型根据用户输入的类型确定。如果是字符型数据则必须加定界符 • 例4.1:从查找学号是0511011401的学生,并显示此学生信息 • Use 学生信息 • input “请输入要查找学生学号:”to xsbh • List for 学号=xsbh • Use • 从键盘输入:”0511011401” • 例4.2:请按出生日期来查找学生,并显示此学生信息 • Use 学生信息 • input “请输入某学生的生日”to sr • List for 出生日期=sr • Use • 从键盘输入:{^1987-05-04} 信息技术学院 崔晓斐 制作
4. 注释语句 • 注释:是为了提高程序的可读性 • NOTE:用于对程序段注释说明,用于每行的开头 • *:用于对程序段注释说明,用于每行的开头 • &&:用于对语句的注释说明,用于每行的结尾 例5:注释语句举例 • NOTE本程序为年终结算子程序 • *以下语句是用于显示数据库的结构及记录 • Use 学生信息 &&打开表学生信息 信息技术学院 崔晓斐 制作
程序的三种基本结构 6.2 程序的基本控制结构 真 假 假 条件 条件 A 真 B A A B 顺序结构 分支结构 循环结构 信息技术学院 崔晓斐 制作
顺序结构 A B 6.2.1 顺序结构 • 三种基本程序结构:顺序结构、分支结构、循环结构 • 顺序结构:自始自终按照语句序列的排列顺序,依次逐条执行的简单程序 • 例6.1:输入圆的半径,计算圆的面积 • CLEAR • pai=3.14159 • INPUT "请输入圆的半径:" TO r • carea=pai*r*r • ?"圆的面积为:",carea 信息技术学院 崔晓斐 制作
例6.2 键盘输入五个分数,去掉一个最高分,去掉一个最低分,求其余三个分数的平均分。 INPUT “请输入第一个数”TO A INPUT “请输入第二个数”TO B INPUT “请输入第三个数”TO C INPUT “请输入第四个数”TO D INPUT “请输入第五个数”TO E MD=MAX(A,B,C,D,E) MX=MIN(A,B,C,D,E) SUM=A+B+C+D+E AVER=(SUM-MD-MX)/3 ? "平均分为: ",ROUND(AVER,2) CANCEL 信息技术学院 崔晓斐 制作
语 句 行 F T 命令组 ENDIF后面的语句 条件表达式 6.2.2 分支程序设计 • 分支结构:就是按照一定的条件由判断语句或选择语句构成的双重或多重走向的程序 • 简单分支 • 格式1:If <条件表达式> • <命令组> • Endif • 注意:IF和ENDIF必须成对出现 • 例7.1:在“学生情况表”中查看“李兰兰”的基本情况。 • SET TALK OFF • CLEAR • USE 学生信息 • LOCATE FOR 姓名=”李兰兰” • IF FOUND() • DISP • ENDIF • USE • SET TALK ON 信息技术学院 崔晓斐 制作
.T. .F. 语 句 行 条件 命令组1 命令组2 ENDIF后面的语句 • 格式2:IF <条件表达式> • <命令组1> • ELSE • <命令组2> • ENDIF • 例7.2:计算变量var的绝对值并存入变量absvar • input "请输入数值:" to var • if var>=0 • absvar=var • else • absvar=-var • Endif • ?var,'的绝对值是',absvar 信息技术学院 崔晓斐 制作
例7.3:从键盘输入一个数,判断是奇数还是偶数例7.3:从键盘输入一个数,判断是奇数还是偶数 • *判断奇偶数 • *算法:能被2整除的数是偶数,不能被2整除的数是奇数 • set talk off • clear • input "请输入一个自然数:" to num • if int(num/2)=num/2 • ?str(num,6)+"是偶数" • else • ?str(num,6)+"是奇数" • endif • set talk on If mod(num,2)=0 信息技术学院 崔晓斐 制作
例7.4:判断某一年是否是闰年, • *算法:如是闰年,则能被4整除但不能被100整除,或者能被400整除 • set talk off • clear • input '请输入年份:' to y • if y/4=int(y/4) .and. y/100<>int(y/100) .or. y/400=int(y/400) • ?y,'是闰年' • else • ?y,'不是闰年' • endif • set talk on 信息技术学院 崔晓斐 制作
例7.5 从键盘输入a,b,c的值(设a≠0),求一元二次方程的两个实根。 SET TALK OFF INPUT "请输入a的值: " TO A INPUT "请输入b的值: " TO B INPUT "请输入c的值: " TO C D=B*B-4*A*C IF D=0 X=-B/(2*A) ? "方程有两个相等的实根: " ? "X1=X2=",X ELSE IF D>0 X1=(-B+SQRT(D))/(2*A) X2=(-B-SQRT(D))/(2*A) ? "方程有两个实根: " ? "X1=",STR(X1,6,2) ? "X2=",STR(X2,6,2) ELSE ? "方程无实根! " ENDIF ENDIF SET TALK ON CANCEL 信息技术学院 崔晓斐 制作
DO CASE T 条件1 F 命令组1 T 条件2 F ¨¨ 命令组2 T 条件n F 命令组n Otherwise与endcase 之间的命令 ENDCASE后面的语句 • 多分支:分支数目较多时使用 • 格式: • DO CASE • CASE <条件表达式1> • <命令组1> • CASE <条件表达式2> • <命令组2> • …… • CASE <条件表达式n> • <命令组n> • [OTHERWISE] • <命令组> • ENDCASE 信息技术学院 崔晓斐 制作
X2+4X-1 (X≤0) 3X2-2X+1 (0<X≤10) X2+1 (X>10) Y= • 例7.6:利用多分支实现四则运算 • 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 信息技术学院 崔晓斐 制作
If <条件1> If <条件2> If <条件1> If <条件1> <命令组1> If <条件2> <命令组1> Else If <条件2> Else If <条件3> <命令组2> <命令组2> If <条件3> <命令组3> Endif Else <命令组1> Else Else Else <命令组4> <命令组2> If <条件3> Endif Endif <命令组3> Else Else If <条件4> <命令组4> Endif <命令组3> Endif Endif Endif Endif Endif Endif 注意: (1)IF、ELSE(可不选)、ENDIF一一 对应、互相匹配 (2)允许简单判断和选择判断语句自我嵌套或相互嵌套,但层次必须清楚,不得交叉 (3)最好采用缩格(锯齿形)的书写方式 • 分支语句的嵌套:一个if语句中还可以再含有if语句 • 三种嵌套方式: 信息技术学院 崔晓斐 制作
X2+4X-1 (X≤0) 3X2-2X+1 (0<X≤10) X2+1 (X>10) Y= • 例7.7:用IF来做 • 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 信息技术学院 崔晓斐 制作
循环体 语句行序列 N 条件表达式 Y 循环体内语句 修改条件表达式 ENDDO后面的语句 6.2.3 循环程序设计 循环结构程序:按照一定条件重复进行某种特定操作的程序称为循环结构程序。 1. DO 循环语句 • 格式: • DO WHILE <条件表达式> • <命令组> • [LOOP] • [EXIT] • ENDDO • 说明:循环起始语句、循环体、循环终端语句 • 注意:在循环体内要设置修改循环条件的语句,避免死循环。 • LOOP:遇到loop,控制返回到do while,继续执行下一次循环 • EXIT:遇到exit,跳出循环,结束do while循环,执行enddo后面语句 信息技术学院 崔晓斐 制作
例8.1:利用do while循环语句编写求1~100和的程序(S=1+2+3+4+…..+100) • set talk off • s=0 &&求和变量s赋初值 • i=1 &&循环变量i赋初值 • do while i<=100 • s=s+i &&对i进行累加求和 • i=i+1 &&修改循环变量值 • enddo • ?"s=",s • set talk on 信息技术学院 崔晓斐 制作
例8.2:编程显示学生信息表中所有女生的记录。例8.2:编程显示学生信息表中所有女生的记录。 • SET TALK OFF • CLEAR • USE 学生信息 • DO WHILENOT EOF() • IF 性别=“女” • DISPlay • ENDIF • SKIP • ENDDO • USE • SET TALK ON • RETURN 信息技术学院 崔晓斐 制作
2. FOR循环语句 格式: FOR <循环控制变量>=<初值> TO <终值> [STEP <步长>] <命令组> [LOOP] [EXIT] ENDFOR/NEXT 说明: 根据循环变量的初值、终值和步长决定循环体内语句的执行次数 for循环适用于循环次数已知的情况 Endfor和next的作用相同 For和endfor/next必须成对出现 步长可为正值和负值 LOOP、EXIT的用法同前 信息技术学院 崔晓斐 制作
例8.3:用for…endfor,计算1+2+3…+100 • set talk off • s=0 • n=100 • for i=1 to n &&FOR循环,步长为1 • s=s+i • endfor • ?"s=",s • set talk on 信息技术学院 崔晓斐 制作
3. SCAN循环语句 • 格式: • SCAN [<范围>] [FOR <条件>] • <命令组> • [LOOP] • [EXIT] • ENDSCAN • 说明: • 在指定范围内查找符合指定条件的记录;scan语句将指针指向第一个满足条件的记录,执行一次循环体,再将指针自动移到下一条满足条件的记录,直到对数据库中的每一条记录都检查完毕 • 【范围】默认是ALL • Scan与endscan必须成对出现 • LOOP,EXIT用法同前 信息技术学院 崔晓斐 制作
例8.4:编程统计学生信息表中男学生的人数。 • SET TALK OFF • CLEAR • N=0 &&设变量N存放求的男生人数 • USE 学生信息 • SCAN FOR 性别=”男” • N=N+1 • ENDSCAN • ?”学生表中男学生的人数是:”,N • USE • SET TALK ON 信息技术学院 崔晓斐 制作
4. 循环嵌套 • 循环嵌套:是在一个循环程序的循环体内,又包含着另一个循环,又称多重循环 • DO WHILE 〈条件表达式1〉 • 〈命令组1〉 • DO WHILE 〈条件表达式2〉 • 〈命令组2〉 • DO WHILE 〈条件表达式3〉 • 〈命令组3〉 • …… • ENDDO • 〈命令组4〉 • ENDDO • 〈命令组5〉 • ENDDO √ √ × × 信息技术学院 崔晓斐 制作
do while n>0 &&输出n遍 • y=1 • ?" *" • do while y<=9 &&输出一行数字 • ??y • y=y+1 • enddo • ? &&换行 • x=1 • do while x<=9 &&x为行循环 • ?x • y=1 • do while y<=x &&y为列循环 • result =x*y • ??result • y=y+1 • enddo • ? • x=x+1 • enddo • ? • ? • n=n-1 • enddo • 例8.5:编写程序。输出n张“九-九”乘法表,输出格式见书P175 • set talk off • clear • input "输出几张九-九乘法表:" to n • set print on • set console off 信息技术学院 崔晓斐 制作
例8.6:逐条显示“学籍管理”数据库中的学生信息表中性别为“男”的记录例8.6:逐条显示“学籍管理”数据库中的学生信息表中性别为“男”的记录 • set talk off • clear • open database 学籍管理 • use 学生信息 • scan for 性别="男“ • display • Endscan • use • set talk on do while .not.eof() • locate for 性别=“男” • Display • Continue • enddo 信息技术学院 崔晓斐 制作
例8.7:编写 程序判断100-999之间的水仙花数(153=13+53+33) • set talk off • clear • a=1 • do while a<=9 • b=0 • do while b<=9 • c=0 • do while c<=9 • m=100*a+10*b+c • n=a**3+b**3+c**+ • if m=n • ?"水仙花数为:",m • endif • c=c+1 • enddo • b=b+1 • enddo • a=a+1 • enddo 信息技术学院 崔晓斐 制作
6.3 子程序、过程与自定义函数 • 子程序和过程的作用 • 将多次重复出现的程序段编写成子程序和过程,在使用的时候可以通过名字调用它,达到多次使用的目的 • 子程序和过程的区别 • 子程序是相对独立的程序,不能独立运行,需要由另一个程序调用 • 过程也就是子程序,但多个过程放于一个文件中,这个文件成为过程文件。执行程序时,先打开程序文件,再随意调用其中的过程 • 区别:当一个复杂的应用系统含有大量的子程序时,由于每调用一个子程序就访问一次磁盘,调用次数越多,访问磁盘的次数就越多,系统的运行速度自然会减慢,因此采用过程文件可以提高程序运行速度。 信息技术学院 崔晓斐 制作
6.3.1 子程序 • 子程序:可被调用的功能模块或能够完成某种特定功能的独立程序,又称过程 • 主程序和子程序之间的关系: 信息技术学院 崔晓斐 制作
c.prg 主程序 .a.prg b.prg … Do a … … Do b return … Do c return … … return 1、子程序的建立: MODIFY COMMAND <文件名> 2、子程序的调用 DO <子程序名> 3、子程序的返回命令 RETURN [TO MASETR] 4、子程序的嵌套:一个过程又调用了另一个过程 信息技术学院 崔晓斐 制作
例9.1:已知m和n,求 • 分析:分别编写m!, n!,(m-n)!,再计算公式 1!=1*1 2!=2*1=2*1! 3!=3*2*1=3*2! 4!=4*3*2*1=4*3! do while k<=n &&计算n! b=b*k k=k+1 enddo a=1 k=1 do while k<=(m-n) &&计算(m-n)! a=a*k k=k+1 enddo c=c/(b*a) ?c set talk on set talk off input "输入m的值" to m input "输入n的值" to n c=1 k=1 do while k<=m &&计算m! c=c*k k=k+1 enddo b=1 k=1 信息技术学院 崔晓斐 制作
例9.2:采用子程序方法设计 • 把阶乘部分单独拿出来作为一个子程序 set talk off input "输入m的值" to m input "输入n的值" to n x=m &&计算m! do sub result=x x=n &&计算n! do sub result=result/x x=m-n &&计算(m-n)! do sub result=result/x ?result set talk on *子程序:sub.prg store 1 to k,temp do while k<=x temp=temp*k k=k+1 enddo x=temp return 信息技术学院 崔晓斐 制作
过程1 过程2 过程n 6.3.2 过程 • 过程文件:过程的集合 • 过程文件的建立和修改 • MODIFY COMMAND <过程文件名> • 过程文件的一般结构 • PROCEDURE <过程名1> • <过程名1的语句行系列> • RETURN • PROCEDURE <过程名2> • <过程名2语句行序列> • RETURN • …… • …… • PROCEDURE <过程名N> • <过程N语句系列> • RETURN 信息技术学院 崔晓斐 制作
过程的定义 • Procedure <过程名> • …… • return • 过程文件的打开命令 • 格式:SET PROCEDURE TO <过程文件名> • 过程文件的关闭命令 • 格式I:SET PROCEDURE TO • 格式II:CLOSE PROCEDURE 信息技术学院 崔晓斐 制作
6.3.3 自定义函数 • 函数:标准函数、自定义函数 • 自定义函数的命令格式 • Function <函数名> • Parameters <形式参数表> • Return <表达式> • 说明: • 函数必须在return后面加上一个返回值 • Parameters命令用来接受调用程序传来的参数 • 调用函数时,函数名后面的“()”不能省略 信息技术学院 崔晓斐 制作
例9.4:利用自定义函数方法设计 *jc函数 function jc parameter k t=1 i=1 do while i<=k t=t*i i=i+1 enddo return t *main.prg set talk off clear input "m=" to m input "n=" to n c=jc(m)/(jc(n)*jc(m-n)) ?"c=",c 信息技术学院 崔晓斐 制作
6.3.4 变量的作用域和参数传递 • 利用参数语句传递参数 1、带参过程调用命令 格式:DO <过程名> WITH <参数表> 说明:参数表中的参数也称实参,可以为常量、已赋值的变量或数值表达式。 2、接收参数命令 格式:PARAMETERS <参数表> 说明:参数表中的参数也称形参 形参与实参的数量应相等、类型要一致 信息技术学院 崔晓斐 制作
例21:计算矩形面积 • *main.prg • set talk off • clear • area=0 • input "请输入矩形的长:" to length • input "请输入矩形的宽:" to width • do sub1 with length,width,area • ?"矩形面积为:" ,area • ======================= • *sub1.prg • parameters a,b,c • c=a*b • return 信息技术学院 崔晓斐 制作
Private a1 a1=45 a1=45 • 利用变量类型传递参数 • 局部变量 • 全局变量 • 例22:局部变量和全局变量 • *main.prg • public a1,a2,a3 • a1=100 • a2="abc" • a3=20 • do sub2 • list memory ??? • *sub2.prg • public b1,b2 • b1=1 • b2="y" • num=23 • list memory ??? • return 信息技术学院 崔晓斐 制作
6.4 程序调试 • 程序设计完成后,需要进行反复的调试,以保证程序的可靠运行 • 6.4.1 程序调试器 • 打开调试器: • 工具/调试器 • 命令方式:debug • 调试器组成: • 调试器窗口:打开程序文件进行调试 • 跟踪窗口:用于调试和观察程序的执行情况 • 监视窗口:用于设置监视表达式,并显示其当前值 • 局部窗口:用于显示模块程序中的所有变量、数组对象以及对象成员 • 调用堆栈窗口:用于显示当前处于执行状态的程序、过程或方法程序 • 调试输出窗口:安置调试输出命令dabugout<表达式>,会计算表达式的值并显示出来 信息技术学院 崔晓斐 制作
6.4.2 设置断点 • 在定位处中断 • 在程序代码中指定一行代码,当程序调试执行到该代码行时,中断程序的运行 • 如果表达式为真则在定位处中断 • 在程序代码中指定一代码行以及一个表达式,当程序调试执行到该代码行时,如果表达式为真则中断程序运行 • 当表达式为真时中断 • 在程序代码中,指定一个表达式,在程序调试执行过程中,当表达式值为真时发生中断 • 当表达式值改变时中断 • 在程序代码中指定一个表达式,在程序调试执行过程中,当表达式值发生改变时中断 信息技术学院 崔晓斐 制作
习 题 *本程序的功能为输入圆的半径,计算圆的面积。 *程序中有两处错误,请修改并执行程序。只能修改标有错误的语句行,不能修改其他语句。 CLEAR LOCAL carea LOCAL pai pai=3.14159 ACCEPT "请输入圆的半径:" TO r &&错误 carea=pai*r*r ?"圆的面积为:",carea END &&错误 信息技术学院 崔晓斐 制作
*统计“COURSE.DBF”表有几门课程学时为60。 *程序中有两处错误,请修改并执行程序。只能修改标有错误的语句行,不能修改其他语句。 OPEN COURSE &&错误 S=0 DO WHILE .NOT.EOF() IF 学时=60 S=S+1 ENDIF CONTINUE &&错误 ENDDO ?S USE RETURN 信息技术学院 崔晓斐 制作