视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VFP标准实验报告
2025-09-29 16:27:34 责编:小OO
文档
实验2.1  常量、变量、函数和表达式

一、实验要求

1.掌握各种类型常量的表示方法。

2.掌握变量的赋值方法。

3.掌握常用函数的功能、格式和使用方法。

4.掌握各种类型表达式的构造方法。

二、实验内容

注意事项:1、“命令”窗口中的命令可以重新利用;

          2、命令、函数中的系统关键字可仅输入前4个字符;

          3、注释命令和命令中的注释部分不必输入。

1、常量的表示

1)字符型常量

?[V‘F‘P]        && 界定符为方括号,其中的其他形式的界定符均为字符串的组成内容。

2)日期/日期时间型常量

?{^2003/10/01}     && 必须按照严格的日期输入格式输入

【结论】

●数值型常量的表示接近日常表示,不过应注意E后面的为指数,如2E3表示2×103。

●字符型常量须用界定符“”、‘’或[]界定。

●逻辑型常量只有两个,分别有两种表示方法,却都只有一种显示方法;

●VFP6.0以上版本的默认格式为严格的日期格式,故日期/日期时间型常量须按严格的格式输入,当然,是否进行严格的日期/时间检查,可通过SET STRICTDATE TO 0|1|2命令进行设置,其中0表示不进行严格的日期格式检查;1表示进行严格的日期格式检查;2表示进行严格的日期格式检查,并且对CTOD()和CTOT()函数也进行严格的日期格式检查。

●日期/时间的显示格式,可通过SET  DATE  TO  LONG|AMERICAN|ANSI等命令进行设置。

2、变量的赋值

(1)简单变量

用等号“=”可以给单个变量赋值,用“STORE  TO ”命令可以给多个变量赋值

(2)数组

●名为array1的数组中的所有元素都可看作名为array1的内存变量,故下述命令可用来显示array1数组中所有元素的值:

DISPLAY  MEMORY  LIKE  array1

●数组的引用:当要求显示数组变量,只给出数组名时,数组的值等于第1个元素的值。EG:DEMENSION  abc[3]   ; ?abc

●数组的定义:对已存在的数组再次定义,原数组元素的值会被继承,即再次定义的数组则是对原数组的扩展。同一数组的不同元素可以赋不同数据类型的值。

●数组的使用:二维数组可以作为一维数组使用,如对于一个2行3列的数组array1,其数组元数array1[2,1]相当于数组元素array1[4]。

3、常用函数

(1)数值函数                

【注意事项总结】

●SET  DECIMALS  TO  4

SET  FIXED  ON           &&设置固定显示小数位为4位;

●MOD()函数——取模函数规律:

MOD(a,b)= a-[INT(a/b)- IIF(a/b<0,1,0)]*b

●ROUND()函数返回圆整到指定小数位数的数值表达式,若指定小数位数的参数(第二个参数)为负,则整数位也要被圆整,如:若第二个参数为-2,则小数点左端的第一和第二个数字(个位和十位)均为零。

(2)字符函数     

【归类总结】

●截除字符串空格的函数:ALLTRIM()、TRIM()

●求字符串长度的函数:LEN()

●求子字符串首次出现的位置的函数:AT()、ATC()

●取子字符串的函数:SUBSTR()、LEFT()、RIGHT()

(3)日期/时间函数

显示当前系统的时间、日期:DATE()、TIME()、DATETIME()

返回参数日期中的年/月/日:DAY()、MONTH()、YEAR()

(4)数据类型转换函数

●字符      ASCII值:ASC()、CHR()

●数值      字符:VAL()、STR()

●字符      日期:DTOC()、CTOD()、TTOC()、CTOT()

【注意】

●日期型(D)和日期时间型(T)使用场合没有区别,可以混用,故无需DTOT()或TTOD()之类的函数。

●转换函数的参数不仅受数据类型的。如:VAL()中的字符参数只允许是数字的(E例外);CTOD()中的字符参数要类似yyyy/mm/dd表示,而不能是任意阿拉伯数字的组合。

●STR()函数的参数较多,要特别注意其用法。如:若总宽度缺省,默认宽度10;小数位数宽度缺省,默认为0。STR(),如果没有指定宽度和小数位数,默认宽度取10。

(5)其他常用函数

●BETWEEN()函数:判断一个值是否在某个范围内。该命令的参数若是字符型,则返回值受SET COLLATE 命令影响。

●TYPE()函数:显示值的类型,对于未定义的表达式类型,返回U(注意参数要加引号,且与字符界定符有所区别)。如:

?TYPE(‘ “12” ’)    &&显示C

?TYPE(‘ ‘12’ ’)    出错

?TYPE(‘!(3-2)’)       &&显示U

●IIF()函数:称为条件函数,根据逻辑表达式的值返回两个值中的一个。

?IIF(DOW(DATE())=1 OR DOW(DATE())=7,’今天休息’,’今天上班’)

?IIF(DAY(DATE())=1,’今天休息’,’今天上班’))

4、表达式

【注意】

●不同类型的数据,其运算符不同。即使所用的符号相同,其含义也不同,如“+”,对数值型数据执行加运算,而对字符型数据则起着连接作用。

●运算符及各种类型的常量表示要规范,不能与传统表示相混淆。如:已知x、y、z为数值型变量,考察下列表达式:

[(x-1)*y-5]/z       &&“[]”非法,应改为“()”

|x|+|y|           &&绝对值的表示非法,应该用ASC()函数。

x≤y AND y≤z     &&“≤”运算错,应改为“<=”

●表达式中数据类型要匹配。例如,若将数值型数据与字符型数据直接执行 “+”运算,系统将无法确定“+”的含义。如果有必要将不同类型的数据在一个表达式中表示,可以利用数据类型转换函数。如:

?”字符串”+cstring+”的长度为:”+ALLRIM(STR(LEN(cstring)))

●名称表达式、宏替换:

名称表达式和宏替换可以用来替换命令和函数中的名称,从而为VFP的命令和函数提供了灵活性。含有名称表达式的命令或函数的运行速度比含有宏替换的运行速度要快,但宏替换的使用范围更广些,有些地方只能使用宏替换而不能使用名称表达式。宏替换可以用以构成表达式,而名称表达式不能做为其他表达式的组成部分,且在使用名称表达式时,名称表达式不能出现在赋值语句的左边;在某些命令和函数中不能使用名称表达式。例如:

string1=”visual FoxPro”

cVar=’string1’

?&cVar      &&显示变量string1的值:visual FoxPro

?(cVar)      &&显示变量cVar的值:string1

?substr((cVar),1,6)    &&显示:string

?substr(&cVar,1,6)    &&显示:visual

(cVar)=’test2’        &&出错,不能赋值

store  (cVar) to ‘test2’   &&能成功给变量string1赋值

&cVar=‘test2’        &&能成功给变量string1赋值

三、实验体会

通过本次实验,我掌握了各种常量的表示、变量的赋值、常用函数的功能和使用、各种类型表达式的构造方法。实验过程中,我深刻地体会到,不仅要逐条运行指导书上的各条语句,更重要的是要看懂其运行结果,这样才会达到目的。有时为了掌握一个函数的用法,不得不多次改变参数,以观察返回值的变化情况。所以,我觉得完成本次实验不仅要有足够的耐性,而且要有创造力和想象力,当然还需要一定的归纳推理能力。因为VFP系统函数和命令较多,不可能通过本次实验全部熟练掌握。所以,我发现学会使用VFP帮助也很重要。

由于课堂练习时间紧迫,为了提高上机的效率,我以后还应该加强预习。并且课后还要找时间自己上机继续练习和推敲。

在实验中遇到的一些问题和注意点都总结在实验报告中。

实验2.2  程序控制和程序设计

一、实验要求

1.掌握创建、编辑 、运算程序的方法。

2.初步掌握条件语句、循环语句的功能和使用方法。

3.掌握程序调试的一般方法。

二、实验内容

1.创建程序文件

2.运行程序

命令方式:DO  ProgramName

注:在程序运行过程中,不可按键盘上的[ESC]键、[F1]~[F12]等功能键。

3.编辑程序文件

4.使用IF-ENDIF条件语句

       条件语句可以控制程序中部分命令是否被执行,即根据条件测试的结果执行不同操作。

       ************程序功能:显示所按键

       CLEAR

       WAIT WINDOWS  “请按键”  TO cKey

       IF BETWEEN(cKey,”0”,”9”)

           ?”按的键是数字键”+cKey

       ENDIF

       保存后运行,如果所按键为数字键,该程序运行结果会显示提示语“按的键是数字键*”

5.使用DO CASE-ENDCASE条件语句

在根据条件进行不同的处理时,如果需要处理两个以上的条件,使用IF-ENDIF条件语句时必须嵌套。为了增强程序的可读性,可以使用DO CASE-ENDCASE条件语句。例程如下:

***********程序功能:显示所按键

CLEAR

WAIT  WINDOWS  “请按键”  TO  cKey

DO  CASE

CASE  BETWEEN(cKey,“0”,“9”)

?”按的键是数字键”+cKey

CASE  BETWEEN(cKey,“a”,“z”)OR BETWEEN(cKey,“A”,“Z”)

?”按的键是字母键”+cKey

CASE  cKey=SPACE(0)

?”按的键是空格键”

CASE  ASC(cKey)=0

?”按的键是回车键”

OTHERWISE

?”按的键不是数字键、字母键、空格键、回车键!”

       ENDCASE

6.使用FOR-ENDFOR循环语句

*******程序功能:计算阶乘

CLEAR

m=15

nResult=1

FOR  n=1  TO  m

        nResult=nResult*n

?STR(n)+“!=”+ALLT(STR(nResult))

7.使用DO WHILE-ENDDO循环语句

*****程序功能:将非汉字字符组成的字符串反序显示(如将Microsoft显示为yfosorciM)

CLEAR

CString=“DO WHILE    ENDDO  Command ”

CResult=Cstring+“的反序显示为”

DO  WHILE  LEN(cString)>0

CResult=cResult+RIGHT(cString,1)

CString=SUBSTR(cString,1,LEN(cString)-1)

ENDDO

?cResult

程序运行后得到结果:DO WHILE    ENDDO  Command的反序显示为dnammoC  ODDNE  ELIH W  OD    

8.循环语句与条件语句混合使用

在实际应用中,经常需要循环语句与条件语句混合使用,特别是在循环语句中嵌套条件语句。如下结构:

DO  WHILE 

IF 

……

ENDIF 

ENDDO   

9.在循环语句中使用LOOP语句和使用EXIT语句

循环体中的LOOP语句用于将控制直接返回给FOR,即忽略此后的循环体语句而重新循环,可被置于循环体中的任意位置,循环体中的EXIT语句将控制传递给ENDFOR后的第一条语句,即“跳出”循环。

10.自定义函数的创建与使用

每个过程和自定义函数都可以作为的程序文件保存,或多个过程和自定义函数保存在一个称为“过程文件”的程序文件中,或位于一个程序的底部。

(1)在开发某一应用系统时,如仅需要创建一个自定义函数,则可以将其作为的程序文件保存。

(2)在开发某一应用系统时,如需要创建多个自定义函数,则可以将它们保存在一个程序文件中。

11.程序的调试

程序调试时的常见错误:

1、语法错误

2、逻辑错误

三、实验思考题

1、创建一个自定义函数ccdow(),其功能是:根据一个日期值返回用汉字表示的星期。例如,ccdow({^1999/03/01})的返回值为“星期一”(提示:利用DOW函数;利用DO CASE条件语句)。

Function  ccdow

Parameters  dat

S=space(3)

Do case

Case  dow(dat)=1

S=”星期天”

           Case   dow(dat)=2

                S=”星期一”

Case  dow(dat)=3

S=”星期二”

Case  dow(dat)=4

S=”星期三”

Case  dow(dat)=5

S=”星期四”

Case  dow(dat)=6

S=”星期五”

Case  dow(dat)=7

S=”星期六”

           Endcase

2、下面程序的功能是:将十进制数转换成二进制数表示,但该程序有错。请创建一个程序文件err10_0,将下面程序输入到其中并进行调试、修改(不允许修改程序的总体框架和算法,不允许增加或减少语句数目)

STORE 37 TO  nNumber

CResult=SPACE(0)

IF  nNumber!=0

DO WHILE nNumber>0

     N=MOD(nNumber,2)

     nNumber=INT(nNumber/2)

     Cresult=STR(n,1)+cResult

ENDDO

           ELSE

CResult=”0”

           ENDIF

           ?”二进制数表示为”+cResult

四、实验体会

通过本次实验,我掌握了创建、编辑、运算程序的方法,掌握了条件语句、循环语句的功能和使用方法。实验过程中,通过对程序的调试,我掌握了程序调试的一般方法。由于课堂练习时间紧迫,为了提高上机的效率,我以后还应该加强预习。并且课后还要找时间自己上机继续练习和推敲。

实验5.3   SELECT-SQL语句

一、实验要求

1.掌握查看查询的SELECT-SQL语句的方法。

2.掌握使用SELECT-SQL语句来创建查询的方法。

二、实验内容

1.查看一个查询的SELECT-SQL语句

2.SELECT-SQL语句的使用

(1) 指定查询中的列和用FROM子句指定数据基表。

例1 显示JS表中所有教师的工号和姓名。

SELECT  js.gh,js.xm  FROM  sjk!js

(2) 用WHERE子句筛选基表记录和确定基表之间的联接。

例2 显示xs表和cj表中学号以“99“开头的学生的学号、姓名、课程代号以及该课程的成绩。

SELECT  xs.xh,xs.xm,cj.kcdh,cj.cj  FROM  sjk!xs,sjk!cj;

WHERE  xs.xh=cj.xh  AND  LIKE(“99*”,xs.xh)       

(3) 用JOIN…ON子句确定基表间的联接。

例3 显示js表、rk表和kc表中工号以“A”开头的教师的工号、姓名、号、课程代号、课程名以及该课程的课时数。

SELECT  js.gh,js.xm,rk.zydh,rk.kcdh,kc.kcm,kc.kss;

FROM  sjk!js INNER JOIN sjk!rk  INNER JOIN  sjk!kc;

ON  rk.kcdh=kc.kcdh  ON  js.gh=rk.gh

WHERE  LIKE(“A*”,js.gh)

(4)用INTO子句和TO子句指定输出去向。

例4 显示js表和zy表中职称为“教授”的所有教师的工号、姓名、出生日期、工作日期和职称,并将结果保存到临时表jszctemp中。

SELECT  js.gh,js.xm,js.csrq,js.gzrq,zc.zc

FROM  sjk!js INNER JOIN  sjk!zc;

ON js.zcdh=zc.zcdh

WHERE zc.zc=”教授”

INTO  CURSOR  jszctemp

DIR jszctemp.dbf

SELECT jszctemp

BROWSE

(5) 用GROUP  BY 子句定义记录的分组依据

例5 查询cj表和kc表中每门课程的课程代号、课程名称、选课人数、总成绩和最高分,并把查询结果保存到kccj表文件中。

SELECT  cj.kcdh,kc.kcm,COUNT(cj.cj)  AS  选课人数,SUM(cj.cj) AS 总成绩,;

MAX(cj.cj) AS 最高分;

FROM sjk!cj INNER JOIN sjk!kc;

ON cj.kcdh=kc.kcdh;

INTO TABLE kccj.dbf;

GROUP BY cj.kcdh

(6) 用ORDER BY 子句指定查询结果的排列顺序。

将上例中的查询最终先按总成绩的降序,再按课程代号的升序来排序。代码如下所示:

   SELECT  cj.kcdh,kc.kcm,COUNT(cj.cj)  AS  选课人数,SUM(cj.cj)AS 总成绩,;

   MAX(cj.cj) AS  最高分;

   FROM  sjk!cj  INNER  JOIN  sjk!kc;

   ON  cj.kcdh=kc.kcdh;

   INTO TABLE  kccj.dbf;

   GROUP  BY  cj.kcdh;

   ORDER  BY  4  DESC,cj.kcdh

(7)  用HAVING子句筛选结果记录

例6  查询xim表、xs表和cj表中“信息管理系”学生的学号、姓名、系名、各门课程总分、平均成绩以及最低分,要求输出总分不低于480,最低分60分的所有学生学习情况,最终按学生学号进行排序。

SELECT  xs.xh,xs.xm,xim.ximing,SUM(cj.cj) AS 总成绩,AVG(cj.cj) AS 平均成绩,MIN(CJ.CJ) AS最低分;

FROM sjk!xim INNER JOIN sjk!xs INNER JOIN sjk!cj

ON xs.xh=cj.xh ON xim.xdh=xs.xdh;

WHERE xim.ximing=”信息管理系”

GROUP BY xs.xh;

HAVING 总成绩>=480 AND 最低分>=60

(8)  使用子查询

例7  查询js表中已担任课程的教师姓名和该教师所在系名。

   SELECT js.xm,xim.ximing;

   FROM  sjk!js  INNER  JOIN  sjk!xim  ON  js.xdh=xim.xdh;

WHERE  js.gh  IN  (SELECT  DISTINCT  rk.gh  FROM  sjk!rk)

例8  查询zy表中尚未招收学生的专业。

   SELECT  *  FROM  sjk!zy

   WHERE  zy.zydh   NOT  IN(SELECT DISTINCT  xs.zydh  FROM  sjk!xs)

三、实验体会

通过本次实验,我掌握了使用SELECT-SQL语句来创建查询的方法。下载本文

显示全文
专题