1 / 46

程序设计基础

程序设计基础. 第 5 章 程序设计基础. 5.1 创建程序文件. 5.2 顺序结构程序设计. 5.3 选择结构程序设计. 5.4 循环结构程序设计. 5.5 过程和用户自定义函数. 5.6 小型案例实训. 5.7 习题. 教学目的与要求. 掌握创建、修改和运行程序的方法. 掌握分支语句 IF…ENDIF 和 DO CASE…ENDCASE 的用法. 掌握循环语句 FOR…ENDFOR 、 DO WHILE…ENDDO 和 SCAN…ENDSCAN 的用法. 掌握 EXIT 和 LOOP 在循环结构中的作用.

tessa
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. 第5章 程序设计基础 5.1 创建程序文件 5.2 顺序结构程序设计 5.3 选择结构程序设计 5.4 循环结构程序设计 5.5 过程和用户自定义函数 5.6 小型案例实训 5.7 习题

  3. 教学目的与要求 掌握创建、修改和运行程序的方法 掌握分支语句IF…ENDIF和DO CASE…ENDCASE的用法 掌握循环语句FOR…ENDFOR、DO WHILE…ENDDO 和SCAN…ENDSCAN的用法 掌握EXIT和LOOP在循环结构中的作用 掌握过程和用户自定义函数的创建和使用 了解参数传递的两种方式 了解变量的作用域

  4. 5.1 创建程序文件 VFP程序文件是由一系列命令或语句按照一定的顺序和规则组织起来的文本文件,其文件的扩展名为.PRG。 创建程序文件的三个步骤: 1.打开程序的编辑窗口 2. 程序文件的编辑与保存 3. 程序文件的运行 • 一行写一条语句,每条语句都以回车键结尾 • 若语句较长,可分成多行,续行符为分号 DO ProgramName 程序文件一旦运行,系统会自动地对程序文件进行编译,包括对程序的词法和语法检查,生成扩展名为.FXP的伪编译程序。运行程序时,系统实质是运行.FXP文件。

  5. 1. 键入字符串命令ACCEPT 5.2 顺序结构程序设计 5.2.1 简单的输入和输出命令 格式:ACCEPT [cMessageText] TO [VarName] 功能:暂停程序的运行,等待用户键入一个或多个字符,并将键入 的内容作为字符串赋给内存变量VarName。 说明: (1)cMessageText是指定显示在屏幕上的,用于提示用户的信息。 (2)如果只按回车键,则赋给内存变量的值将是一个空字符串。 例如:编写可以打开任一数据表文件的通用命令 ACCEPT “请输入要打开的表文件名:” TO bm USE &bm

  6. 2. 输入单字符命令WAIT 5.2 顺序结构程序设计 格式: WAIT [cMessageText] [TO VarName][WINDOW[AT nRow,nCol]] 功能:暂停程序的运行,等待用户键入单个字符后再恢复程序运行。 系统将输入的字符存入指定的内存变量VarName中, 如果省略TO VarName,输入的字符不保存。 例如:在屏幕第10行第12列的位置开设一个小窗口,显示提示信息“请输入一个键:”,等待用户从键盘输入一个字符。 WAIT “请输入一个键:” TO x WINDOW AT 10,12 说明:WAIT命令经常作为输出语句使用,如: x=”你好吗?” WAIT WINDOW x

  7. 3. 输入表达式命令INPUT 5.2 顺序结构程序设计 格式:INPUT [cMessageText] TO [VarName] 功能:暂停程序运行,等待用户键入表达式,并将表达式的值存入内存 变量VarName中。 说明:表达式的类型可以是字符型、数值型、日期型、日期时间型和 逻辑型。 示例:在命令窗口逐条执行下述命令。 INPUT “请输入姓名:” TO xm INPUT “请输入你的出生日期:” TO csrq ?xm+”的年龄:”,YEAR(DATE())-YEAR(csrq),”岁”

  8. 5.2 顺序结构程序设计 三条输入命令的区别: • ACCEPT命令只能接受字符型的数据,不需要定界符,输入完毕按回车键结束。 • WAIT命令只能输入单个字符,且不需要定界符,输入完毕无需按回车键。 • INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据;数据形式可以是常量、变量、函数和表达式,如果是字符型、逻辑型、日期型和日期时间型常量,需要定界符;输入完毕按回车键结束。

  9. 格式:@nRow,nColumn SAY eExp 5.2 顺序结构程序设计 4.定位输出命令 功能:在指定的行、列坐标位置输出表达式的值。 说明:表达式可以是各种类型的表达式。 示例:在屏幕第5行第6列输出当前日期。 @5,6 SAY DATE()

  10. 功能:是否显示Visual FoxPro命令执行的状态。系统默认显示。 5.2 顺序结构程序设计 5.2.2 其他命令 1. 系统状态设置命令SET TALK ON|OFF 说明:当人机会话方式开启时,很多命令执行后,系统会在状态栏自 动显示执行后的结果状态,因此影响了程序的运行速度,所以 往往程序的最开头有一条SET TALK OFF命令,关闭人机对 话,非输出命令不再显示相应输出,在程序结束前,应再放置 一条SET TALK ON命令,恢复人机会话。 示例:在SET TALK ON状态下,执行LOCATE FOR命令时,如果找 到符合条件的记录系统会在状态栏自动显示被找到的记录号, 否则会显示“已到文件尾”。

  11. 3. 返回命令RETURN 格式:RETURN [eExp][TO MASTER|TO FILEName] 功能:终止命令的执行,返回到上一层程序。 说明:表达式eExp用在当过程或用户自定义函数需要有返回值时。 TO MASTER选项,直接返回到最外层主程序; TO FILEName强制返回到指定的程序文件。 5.2 顺序结构程序设计 2. 终止程序执行命令CANCEL 格式:CANCEL 功能:终止程序的执行,释放程序在内存中的变量,返回命令窗口状态。 4. 注释命令NOTE 功能:起到解释说明程序的作用,在程序的运行过程中并不被执行。 示例:NOTE 本程序用于计算圆的面积 INPUT “r=” TO r && r:半径 ?3.14*r*r

  12. 5.2 顺序结构程序设计 5.2.3 顺序结构 顺序结构是在程序执行时,按照程序中语句排列的先后顺序依次执行,它是程序中最简单的一种基本结构。一个程序总体上是一个顺序结构,其中的某些部分可能是各种结构的组合和嵌套。 例1: 在图书(ts)表中根据书名(sm)查找该图书的相关信息。 CLEAR ACCEPT “请输入书名:” TO x USE ts LOCATE FOR sm=x DISPLAY USE 例2:根据一个人的生日,计算其年龄。 INPUT “请输入你的生日:” TO rq nl=YEAR(DATE())-YEAR(rq) ?”你今年”+ALLT(STR(nl))+”岁”

  13. 5.3 选择结构程序设计 在VFP中实现选择结构的语句有:IF…ENDIF和DO CASE…ENDCASE 1. IF…ENDIF语句 功能:判断所给定的条件,选择执行给出的两种操作之一。 格式: IF lExp Commands1 [ ELSE Commands2 ] ENDIF 注意:(1)若只有一个分支,ELSE子句可省。 (2)Commands1或Commands2中还可以包含IF语句 (3)IF和ENDIF子句必须成对出现。 (4)为了方便阅读,最好采用缩格(锯齿形)的书写方式。

  14. 例4:将2个数按由小到大 的顺序输出 5.3 选择结构程序设计 例3: 判断一个数的奇偶性 INPUT “输入一个数:” TO x IF x%2=0 ?STR(x)+”是偶数” ELSE ?STR(x)+”是奇数” ENDIF0 CLEAR INPUT “x=” TO x INPUT “y=” TO y IF x>y t=x x=y y=t ENDIF ?x,y

  15. X2+4X-1 (X≤0) 3X2-2X+1 (0<X≤10) X2+1 (X>10) Y= 5.3 选择结构程序设计 例5:计算下面分段函数的值 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 ?”分段函数值为:”,y

  16. 5.3 选择结构程序设计 2. DO CASE…ENDCASE语句 功能:多分支选择 格式: DO CASE CASE lExp1 Commands1 [CASE lExp2 Commands2 … CASE lExpN CommandsN] [OTHERWISE Commands] ENDCASE

  17. X2+4X-1 (X≤0) 3X2-2X+1 (0<X≤10) X2+1 (X>10) Y= 5.3 选择结构程序设计 说明: 例6:计算分段函数 (1)DO CASE与第一个CASE 之间不能有任何语句。 (2)当语句中任意一个命令序列 执行完后,都将跳过下一个 CASE与ENDCASE之间的所 有语句。 (3)若有多个条件同时满足,则 仅执行第一个满足条件的命令 序列。 (4)DO CASE 与ENDCASE语 句必须成对出现。 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)

  18. 5.4 循环结构程序设计 实现循环结构的语句有: DO WHILE…ENDDO、FOR…ENDFOR和SCAN…ENDSCAN 1. DO WHILE…ENDDO语句 功能:当满足某些条件时,重复执行某一操作 格式: DO WHILE lExp Commands ENDDO 注意: (1)在循环体内要设置修改循环条件的语句,避免死循环。 若出现死循环现象,可按<ESC>键中止程序的执行。 (2)DO WHILE和ENDDO子句必须成对出现。

  19. 5.4 循环结构程序设计 例7:求1到100之间偶数的和 例8 :统计图书(ts)表中 百元以上图书的数量 i=2 s=0 DO WHILE i<=100 s=s+i i=i+2 ENDDO ?” 100以内偶数的和为:”,s SET TALK OFF n=0 USE ts DO WHILE NOT EOF() IF dj>100 n=n+1 ENDIF SKIP ENDDO USE ?”百元以上图书的数量为:”,n SET TALK ON

  20. 5.4 循环结构程序设计 例9:将一个字符串中的各个单词的首字母组成其缩写形式(大写字母)。如:unidentified flying object,其缩写形式为“UFO”。 str1="unidentified flying object" && 赋初值 ?str1+”的缩写形式为:” str1=ALLT(str1) str2=SPACE(0) && 缩写形式的字符串 IF LEN(str1)<>0 DO WHILE LEN(str1)>0 str2=str2+UPPER(LEFT(str1,1)) n=AT(SPACE(1),str1) str1=ALLT(SUBSTR(str1,n)) ENDDO ENDIF ??str2

  21. 5.4 循环结构程序设计 2. FOR…ENDFOR语句 功能:实现已知循环次数下的重复。 格式: FOR nVar=nInitialValue TO nFinalValue [STEP nIncrement] Commands ENDFOR|NEXT 执行过程: (1)给循环变量nVar赋初值nInitialValue。 (2)判断循环变量的值是否超过终值nFinalValue,若没超过终值, 执行循环体(命令序列Commands),否则结束循环。 (3)计算循环变量的值,nVar = nVar + nIncrement(步长)。 (4)转到第2步骤继续执行。

  22. 5.4 循环结构程序设计 注意: (1)该语句在循环变量的控制 下,反复执行循环体。仅当 循环变量值超过终值 (步长 为正) 或循环变量值小于终值 (步长为负) 时,才跳出循环, 执行ENDFOR 后面的语句。 (2)可以在循环体内改变循环 变量的值,但会改变循环执行 的次数。 (3)步长缺省时,默认值是1。 (4)FOR和ENDFOR,或者 FOR和NEXT子句必须成对。 例10:统计一个字符串中汉字的个数 ACCEPT “输入一个字符串:” TO str1 str2=str1 n=LEN(str1) j=0 && 汉字的个数 FOR i=1 TO n m=ASC(LEFT(str2,1)) str2=SUBSTR(str2,2) IF m>127 j=j+1 str2=SUBSTR(str2,2) ENDIF NEXT ?汉字的个数为:"+ALLT(STR(j))

  23. 5.4 循环结构程序设计 例11:编程打印图案,图案共有5层。 CLEAR c="*" n=5 FOR i=1 TO n ??SPACE(n-i) FOR j=1 TO 2*i-1 ??c ENDFOR ? ENDFOR

  24. 5.4 循环结构程序设计 3. SCAN…ENDSCAN 功能:用于表记录的循环处理。 格式:SCAN [Scope] [FOR lExp| WHILE lExp] Commands ENDSCAN 说明: (1)Scope表示记录的范围,缺省值为ALL。 (2)语句执行时在范围中依次寻找满足FOR条件或WHILE条件的记录, 并对满足条件的记录执行命令系列Commands,每次遇到ENDSCAN 记录指针自动加1。 (3)FOR子句是对指定范围内所有满足条件的记录进行操作,WHILE 子句是从当前记录开始在指定范围内循环,一旦遇到不满足条件的记 录就结束循环,即使后面还有满足条件的记录。

  25. 5.4 循环结构程序设计 例12: 在图书(ts)表中查找最高的图书的书号、书名和单价。 USE ts max_dj=dj max_no=1 SCAN IF dj>max_dj max_dj=dj max_no=RECNO() ENDIF ENDSCAN GO max_no ?” 书号为”+ALLT(sh)+”,书名为”+ALLT(sm)+”,其单价:”,dj USE

  26. 5.4 循环结构程序设计 4. EXIT和LOOP语句 在循环体Commands中,可有两个特殊的语句:EXIT和LOOP。 EXIT:循环出口语句,遇到EXIT循环结束。 LOOP:短路语句,遇到LOOP回到循环的开始。 例13:查询出版图书“漫话手绘”的出版社出版的其他图书。 SCAN FOR cbsbh=x IF sm=”漫话手绘” LOOP ENDIF ?sh,ALLT(sm),cbsbh ENDSCAN USE SET TALK ON SET TALK OFF USE ts LOCATE FOR sm=”漫话手绘” IF FOUND() x=cbsbh ELSE ??”没有查到相关记录” RETURN ENDIF

  27. 5.4 循环结构程序设计 例14:查询500元最 多能买几本cbsbh 为“B004”出版社 出版的图书。 输出这些图书 的书号、书名和单 价,以及还会剩下 多少钱。 SET TALK OFF USE ts INDEX ON dj TAG xx FOR CBSBH="B004" SET ORDER TO xx s=0 SCAN s=s+dj IF s>=500 EXIT ENDIF ?sh,ALLT(sm),dj ENDSCAN ?"还剩"+STR(500-s+dj,5,1)+"元" USE SET TALK ON

  28. 5.5 过程和用户自定义函数 • 用户可以将经常执行的具有某种功能的一段代码独立出来,将其定义为过程(Procedure)或用户自定义函数(User Define Function)。在需要使用该功能的时候,调用这个过程或用户自定义函数。 • 过程和用户自定义函数在VFP中区别不大。它们都用于实现某一处理功能,二者调用方法也相同,但在定义方式上略有差别。 1. 过程或用户自定义函数的定义 过程定义的语法格式: [PROCEDURE ProcedureName] [PARAMETERS ParameterList] Commands [RETURN [eExp]] [ENDPROC] 用户自定义函数定义的语法格式: [FUNCTION FunctionName] [PARAMETERS ParameterList] Commands [RETURN [eExp]] [ENDFUNC]

  29. 5.5 过程和用户自定义函数 说明: (1)PARAMETERS语句作用是为过程或自定义函数进行参数定义 • PARAMETERS语句可省,如果过程(或用户自定义函数)中有PARAMETERS语句,该语句必须是在PROCEDURE或FUNCTION语句后面的第一条语句。 • PARAMETERS命令中的参数,最多不能超过27个,各参数之间用逗号分隔,并且被VFP默认为私有变量 (2)RETURN语句的作用是返回调用程序,并且指定过程或用户 自定义函数的返回值,eExp缺省时返回值为.T.。 例15:定义用户自定义函数tarea, 函数的功能是求梯形的面积。 FUNCTION tarea PARAMETERS x,y,h s=(x+y)*h/2 RETURN s ENDFUNC

  30. 5.5 过程和用户自定义函数 过程或用户自定义函数的存储方式: (1)存储在数据库的存储过程中。 (2)以一个程序文件保存。这时FUNCTION和PROCEDURE语句可省, 程序文件名可以作为过程名或函数名。 (3)放在调用程序之后。这时调用程序和过程(或用户自定义函数)的 定义保存在同一个程序文件中。 (4)存放在过程文件中。 • 过程文件是一个保存多个过程或用户自定义函数的程序文件。 • 过程文件不能用DO命令直接运行。 • 使用过程文件时必须先在程序中打开过程文件,然后才可以调用其中的过程或用户自定义函数。 • 打开过程文件的命令:SET PROCEDURE TO [FileName]

  31. 5.5 过程和用户自定义函数 2. 过程与用户自定义函数的调用 格式1:DO Procedure [IN FileName] [WITH ParameterList] • IN子句用于指定过程或用户自定义函数所在的过程文件 • WITH子句用于指定传递给过程或用户自定义函数的参数 如:DO tarea WITH 2,3,4 格式2:与系统函数的调用方式相同,这种调用方式有返回值。 如:tarea(2,3,4)

  32. 5.5 过程和用户自定义函数 3. 实参与形参 • 将在PARAMETERS语句ParameterList中的参数称为“形式参数” • 在调用语句中的参数称为“实际参数” 说明: (1)形参和实参的数目一般应一致,发生调用时对应位置的实参与形参 一一传递。 (2)也可以形参的数目多于实参,在这种情况下,剩余的形式参数就被 初始化为.F.。 (3)如果实参数目多于形参,运行程序时系统会提示出错。

  33. 5.5 过程和用户自定义函数 例16: 计算数列1/1!、1/3!、1/5!、…、1/n!的和,当某项的值小 于0.0001时停止计算。 FUNCTION jc PARA m && m为形参 ss=1 FOR i=1 TO m ss=ss*i ENDFOR RETURN ss ENDFUNC n=1 t=1/n s=0 DO WHILE t>0.0001 s=s+t n=n+2 t=1/jc(n) && n为实参 ENDDO ?”数列的和是:”,s

  34. 5.5 过程和用户自定义函数 参数传递: • 传值,即实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参将其内容传给形参,而不能由形参将其内容传回给实参。 • 传址,即实参变量对形参变量的数据传递是“地址传递”,即双向传递,将实参在内存中的地址传递给形参,形参的内容一经改变,实参的内容也跟着改变。 说明: (1)默认情况下,采用格式1方式调用时,数据传递是传址方式 (引用),而采用格式2方式调用时,是传值方式。 (2)如果实参是一个常数或一个表达式时,不管采用什么方式调用, 传递方式只能是传值。

  35. 5.5 过程和用户自定义函数 例17: 计算数列1/1!、1/3!、1/5!、…、1/n!的和,当某项的值小 于0.0001时停止计算。采用DO命令调用用户自定义函数jc n=1 t=1/n s=0 DO WHILE t>0.0001 s=s+t n=n+2 p=1 DO jc WITH n,p t=1/p ENDDO ?”数列的和是:”,s FUNCTION jc PARA m,ss FOR i=1 TO m ss=ss*i ENDFOR ENDFUNC

  36. 5.5 过程和用户自定义函数 SET UDFPARMS TO 命令 功能:用来改变参数传递的方式。 • 若要按值方式传递参数,在调用UDF之前,执行命令: • SET UDFPARMS TO VALUE • 若要按引用方式传递参数,在调用UDF之前,执行命令: • SET UDFPARMS TO REFERENCE 注意: (1)使用DO命令调用,用WITH子句传递参数时,不受 SET UDFPARMS 命令的影响。 (2)也可以不管SET UDFPARMS的设置,强制设定以值传递方式 或引用传递方式传递参数:如果用括号括起一个变量,设定按 值传递;在一个变量前加@符号,则设定引用传递方式。

  37. 5.5 过程和用户自定义函数 例18:分析以下2段程序的运行结果。 程序段2: SET UDFPARMS TO VALUE STORE 1 TO x ?”函数返回值:”+STR(j1(@x)) ?”变量x的值:”+STR(x) FUNCTION j1 PARAMETERS a a=a+1 RETURN a ENDFUNC 程序段1: SET UDFPARMS TO VALUE STORE 1 TO x ?”函数返回值:”+STR(j1(x)) ?”变量x的值:”+STR(x) FUNCTION j1 PARAMETERS a a=a+1 RETURN a ENDFUNC

  38. 5.5 过程和用户自定义函数 4.变量的作用域 内存变量可分为: 全局变量,私有变量和本地变量三类。 • 全局变量 • 在任何模块中都可使用的变量。建立全局变量的语法格式: • PUBLIC VarList 功能: 将内存变量设置为全局变量,并为这些变量赋初值.F.。 说明: (1)若下层模块中建立的内存变量要供上层模块使用,或某模块中 建立的内存变量要供并列模块使用,必须将这种变量说明成全 局变量。 (2)Visual FoxPro中,默认命令窗口中定义的变量都是全局变量。 (3)程序终止执行时全局变量不会自动清除,而只能用RELEASE或 CLEAR ALL命令来清除。

  39. 5.5 过程和用户自定义函数 • 私有变量 • 仅在定义它的模块及其下层模块中有效,而在定义它的模块运行结束时自动清除。声明私有变量的语法格式: • PRIVATE VarList • 功能: • 声明私有变量并隐藏上级模块的同名变量,直到声明它的程序、过程或自定义函数执行结束后,才恢复使用先前隐藏的变量。 • 说明: • (1)VFP默认程序中定义的变量是私有变量。 • (2)PRIVATE并不自动对变量赋值,仅是声明而已。 • (3)在程序模块调用时,参数接受命令PARAMETERS声明的参变量也是私有变量。

  40. 5.5 过程和用户自定义函数 • 本地变量 • 本地变量只能在建立它的模块中使用,而且不能在高层或低层模块使用,该模块运行结束时本地变量就自动释放。建立本地变量的语法格式: • LOCAL VarList • 功能: • 将内存变量表VarList中指定的变量设置为本地变量,并为这些变量赋初值.F.。

  41. 5.5 过程和用户自定义函数 例19:分析以下程序的运行结果。 x=”12” y=”34” DO sub ?”x,y,z=”,x,y,z ***sub.prg *** PRIVATE x PUBLIC z x=1 y=2 z=3 ?”x,y,z=”,x,y,z RETURN

  42. 本章要点总结 掌握创建、修改和运行程序的方法 掌握分支语句IF…ENDIF和DO CASE…ENDCASE的用法 掌握循环语句FOR…ENDFOR、DO WHILE…ENDDO 和SCAN…ENDSCAN的用法 掌握EXIT和LOOP在循环结构中的使用 掌握过程和用户自定义函数的创建和使用 参数传递:传值和传址 变量的作用域:全局变量、私有变量和本地变量

  43. 习题 15 1、执行以下程序段后,屏幕显示的运行结果为。 CLEAR    x=12    Do WHILE .T.     x=x+1     IF x=INT(x/4)*5       ??x     ELSE       LOOP     ENDIF     IF X>10       EXIT     ENDIF    ENDD0

  44. 2、运行下面的程序段后,屏幕显示的运行结果是。2、运行下面的程序段后,屏幕显示的运行结果是。 CLEAR SET TALK OFF STORE 3 TO n ?ss(n) FUNCTION SS PARAMETERS X y=1 p=0 FOR i=1 TO x y=y*i p=p+y ENDFOR RETURN P ENDFUNC 习题 9

  45. 习题 3、完善下列程序,其功能是显示如图所示的"九九乘法表" 1: 1 2: 2 4 3: 3 6 9 4: 4 8 12 16 5: 5 10 15 20 25 6: 6 12 18 24 30 36 7: 7 14 21 28 35 42 49 8: 8 16 24 32 40 48 56 64 9: 9 18 27 36 45 54 63 72 81 FOR m=1 TO 9 ? STR(m,2)+":" FOR n=1 TO m ??STR( 4) ENDFOR ENDFOR m*n ,

  46. 习题 4、完善下列自定义函数STR_RV(),其功能是将一个字符串(假设所有字符均为ASCII和GB2312字符集中的字符)进行"反序"。例如,STR RV("ABCD")的返回值为"DCBA"。 FUNCTION str_rv() PARAMETERS cStrl cStr2=" DO WHILE .T. c1=LEFT(cStrl,1) IF ASC(c1)>127 c1=LEFT(cStrl,2) ENDIF cStr2=___________ cStrl=RIGHT(cStr1,LEN(cStr1)-LEN(c1)) IF LEN(cStrl)<=0 ________ ENDIF ENDDO RETURN cStr2 ENDFUNCTION c1+cStr2 EXIT

More Related