430 likes | 565 Views
第六章. 结构化程序设计. 6.1 程序的建立与编辑. 6.1.1 基本概念 程序 : 程序是一组能够完成特定任务的命令序列 , 这些命令按照一定的结构有机地组合在一起 , 并以文件的形式存储在磁盘上 , 故又称为程序文件 . Visual FoxPro 程序文件 , 是一个以 (.PRG) 为扩展名的文本文件 . 执行程序时 , 从第一条命令开始按照程序结构连续执行 , 直至结束 . 6.1.2 建立编辑运行程序文件
E N D
第六章 结构化程序设计
6.1 程序的建立与编辑 6.1.1基本概念 程序:程序是一组能够完成特定任务的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,故又称为程序文件. Visual FoxPro 程序文件,是一个以(.PRG)为扩展名的文本文件.执行程序时,从第一条命令开始按照程序结构连续执行,直至结束. 6.1.2建立编辑运行程序文件 在Visual FoxPro 系统环境下,建立、编辑程序文件有三种方式:项目管理器方式、菜单方式、命令方式。
6. 2 程序设计常用命令 6.2.1基本命令 注释命令 (1):note注释内容 (2):* (3)&&注释内容
6.2.2输入/输出命令 1.基本输出命令 ? ?? 例:有如下一个程序 ?"今天是:",DATE( ) ??"现在的时间是:",TIME( ) ?"HAPPY BIRTHDAY TO YOU !"
2.单字符输入命令 格式:WAIT [字符串] [TO 内存变量] [WINDOWS] [ TIMEOUT 数值表达式] 功能:暂停程序的执行,等待用户键入单个字符后再继续程序的执行。 例:有如下一个程序 wait "谢谢使用Visual FoxPro 6.0!" ; windows timeout 3
3. 字符串输入命令 格式:accept 字符串表达式 to 内存变量 注意:此命令只限于输入字符型数据。输入时内容不需要加定界符。 例:有如下一个程序 accept "请输入姓名:" to cname ?cname
4. 表达式输入命令 格式:input 字符串表达式 to 内存变量 注意:该命令可用于各种类型数据的输入。 输入字符型数据需要加定界符。 例:有如下一个程序 input “请输入姓名:” to cname input “请输入年龄:" to nage input “请输入出生日期:” to ddate ?cname,nage,ddate
5.格式输入输出命令 @行号,列号 SAY 表达式 例: clear cnum="01010105" n=19 da={^1981-12-23} @2,10 say cnum @3,10 say "我叫王小力" @4,10 say "学号是:"+cnum @5,10 say "年龄是:"+str(n) @6,10 say "出生日期是:"+dtoc(da)
6. 3 程序的基本控制结构 顺序,选择,循环三种基本结构 一.顺序结构 按照程序语句一条一条的顺序的往下执行。 二.分支结构 根据不同的条件,选择执行不同的程序语句,用来解决有选择,有转移的诸多问题。 三.循环结构 使一些语名重复地执行若干次。
6.3.1顺序结构 [新例]:解方程组求X,Y的值. AX+BY=C DX+EY=F 分析得: Y=(CD-FA)/(BD-EA) X=(C-BY)/A
程序语句如下: input "请输入A的值" TO A input "请输入B的值" TO B input "请输入C的值" TO C input "请输入D的值" TO D input "请输入E的值" TO E input "请输入F的值" TO F Y=(C*D-F*A)/(B*D-E*A) X=(C-B*Y)/A ?X,Y
[书例6.1]:查找学生表中有没有叫于莉丽这个人,显示有关信息。[书例6.1]:查找学生表中有没有叫于莉丽这个人,显示有关信息。 程序语句如下: clear use 学生 loca for 姓名="于莉丽" disp 学号,姓名,性别,出生日期,系别 use return
书例程序流程图: 开始 清除屏幕 打开学生表 查找名为张杰的记录 显示该学生的情况 关闭学生表 结束
顺序结构练习: 编写一个程序,程序功能是:任意输入四个数,找出四个数的最大值和最小值。 提示:可利用max( ),min( )函数。 例如:?max(4,5,6,2)值为6
6.3.2分支结构 它是非常重要的语名,基本形式有三种。 1.单分支结构 语句格式: if 条件表达式 命令行序列 endif 功能:若条件表达式的值为真,则顺序执行命令序列;否则跳过命令序列,直接执行endif后面的命令。
[书例6.2]:查找学生表某同学的信息。 clear use 学生 accept "请输入学生姓名:" to cname loca for 姓名=cname if found( ) ?"学号"+学号 ?"姓名"+姓名 ?"出生日期:"+dtoc( 出生日期) endif use return
2.双分支结构 if 条件表达式 命令行序列1 else 命令行序列2 endif 语句格式: 功能:即根据用户设置的条件表达式的值,选择两个操作中的一个来执行.
例6.3:编写一个程序,程序功能是:任意查询一个人,找到则显示其信息,找不到则显示无此人.例6.3:编写一个程序,程序功能是:任意查询一个人,找到则显示其信息,找不到则显示无此人. clear use 学生 accept "请输入学生姓名:" to cname locate for 姓名=cname if found( ) ?"学号"+学号 ?"姓名"+姓名 ?"出生日期:"+dtoc( 出生日期) else ?"无此人" endif use return
开始 书例程序流程图: 清除屏幕 打开学生表 输入学生姓名 找到否? 显示该学生信息 显示提示信息 关闭学生表 结束
IF语名嵌套 例6.4:根据输入的X值,计算下面分段函数的值,并显示结果。 input "请输入X的值" to x if x<1 y=2*x-5 else if x<10 y=2*x else y=2*x+5 endif endif ?y
多分支结构 即根据多个条件表达式的值,选择执行多个操作中的一个对应执行。 input "请输入X的值" to x do case case x<1 y=2*x-5 casex>=1.and.x<10 y=2*x case x>=10 y=2*x+5 endcase ?y
语句格式: DO CASE CASE 条件表达式1 命令行序列1 CASE 条件表达式2 命令行序列2 …… CASE 条件表达式N 命令行序列N [OTHERWISE 命令行序列N+1] ENDCASE
例6.5:输入某学生成绩,并判断其成绩等级: (见书160页)。 DO CASE 语句练习: 计算y的值: 当x<0时, y=2*x 当x>=0.and.x<2时,y=x**2 当x>=2.and.x<3时,y=1-x 当x>=3.and.x<6时,y=(x+5)**2 当x>=6时, y=x*(x+5)
6.3.3循环结构 DO WHILE <条件表达式> <命令序列1> [LOOP] <命令序列2> [EXIT] <命令序列3> ENDDO
DO WHILE型循环也叫当型循环.即根据条件表达式的值,决定循环体内的执行次数.最简单的循环格式为: DO WHILE <条件表达式> <命令行序列> ENDDO
新例:读程序写出结果。 x=1 do while x<50 ?x x=x*3 enddo
例6.6:计算1+2+…+100 • s=0 • i=1 • do while i<=100 • s=s+i • i=i+1 • enddo • ?s 注意:S=S+i,i=i+1 在这里等号是赋值的作用, 先计算等式右边的表达式,然后把结果赋给等号左边的变量。 练习计算100以内的奇数和。 练习计算100以内的偶数和。
练习1:读程序写结果: y=0 do while y<=40 y=y+1 if y/7=int(y/7) ?y endif enddo Int为取整函数,对括号中的表达式取出整数部分。
练习2:读程序写结果: t=“abcdefg” i=1 do while i<6 ?substr(t,6-i,1) i=i+1 enddo substr(t,6-i,1)意思是:对字符 串t取子串,从第6-i个位置取, 取1个字符串。
Exit命令在程序当中的应用。 • 例: • i=0 • do while .t. • ?"同学们你们好" • i=i+1 • if i=10 • exit • endif • enddo Exit :退出DO WHILE 循环。
loop命令在程序当中的应用。 • i=1 • s=0 • do while i<=100 • if i/2=int(i/2) • i=i+1 • loop • endif • s=s+i • i=i+1 • enddo • ?s LOOP :返回DO WHILE 循环,重新判断条件是否正确。
例6.7:统计学生表中男女生人数。 • use 学生 • store 0 to s1,s2 • do while !eof( ) • if 性别="男" • s1=s1+1 • else • s2=s2+1 • endif • skip • enddo • ?"男生人数"+STR(s1) • ?"女生人数"+STR(s2) • use
书例6.8: store "Y" to cans use 学生 do while .t. accept "请输入学生姓名" to cname loca for 姓名=cname if found( ) ?"学号:"+学号 ?"姓名"+姓名 ?"出生日期"+DTOC(出生日期) else ?"没有"+cname+"这个学生" endif wait "是否继续查找(YN)?" TO cans if upper(cans)="Y" ? loop else exit endif enddo ?"程序结束,谢谢使用" use
2.计数循环控制语句 • 语句格式: • FOR 循环变量=循环变量初值 TO 循环变量终值 STEP 循环变量步长 • 命令行序列 • ENDFOR/NEXT 使用DO WHILE循环: i=1 s=0 do while i<=100 s=s+i i=i+1 enddo ?s • 例:计算1+2+…+100 • s=0 • for i=1 to 100 • s=s+i • endfor • ?s
例:计算100以内的偶数和. • for i=2 to 100 step 2 • s=s+i • endfor • ?s
编程练习:判断一个数是否为素数。 input "请输入一个数:" to n flag=1 for i=2 to n-1 if mod(n,i)=0 flag=0 exit endif endfor if flag=1 ?"这个数是素数" else ? "这个数不是素数" endif
SCAN 循环结构 专用于处理数据表中的记录 格式:scan for 条件 命令序列1 [loop 命令序列2] [exit 命令序列3] endscan 功能:在当前表的指定范围内自动地逐条移动记录指针,直到条件为假或到达文件尾部。
例6.10:用scan统计学生表中男女生人数。 use 学生 store 0 to s1,s2 scan if 性别="男" s1=s1+1 else s2=s2+1 endif endscan ?"男生人数"+str(s1) ?"女生人数"+str(s2) use
4.多重循环 例6.11打印九九乘法口诀表。 clea for i =1 to 9 for j=1 to i ??space(3)+ str(j,1)+"*"+str(i,1)+"="+str(j*i,2) endfor ? endfor
例:输入10个数,找出最小值。 dime a(10) for i=1 to 10 input "请输入数据" to a(i) endfor for i=2 to 10 if a(1)>a(i) a(1)=a(i) endif endfor ? a(1)
课后练习1:任意输入20个数,统计其中正数、负数、零的个数。课后练习1:任意输入20个数,统计其中正数、负数、零的个数。 store 0 to x1,x2,x3 dime a(20) for i=1 to 20 input "请输入数据" to a(i) endfor for i=1 to 20 do case case a(i)>0 x1=x1+1 case a(i)=0 x2=x2+1 case a(i)<0 x3=x3+1 endcase endfor ?x1,x2,x3
课后练习:182页上机练习的第四题。 计算∏的值 s=0 for n=1 to 1000 s=s+(1/(4*n-3)-1/(4*n-1)) endfor ?s