13级电子信息工程班VFP实验报告11
注:1、一个实验题目编写一个实验报告,每个报告至少占用1页。
2、报告内容必须具体、详实,不得笼统、简单。
第二篇:VFP标准实验报告
实验2.1 常量、变量、函数和表达式
一、实验要求
1. 掌握各种类型常量的表示方法。
2. 掌握变量的赋值方法。
3. 掌握常用函数的功能、格式和使用方法。
4. 掌握各种类型表达式的构造方法。
二、实验内容
注意事项:1、“命令”窗口中的命令可以重新利用;
2、命令、函数中的系统关键字可仅输入前4个字符;
3、注释命令和命令中的注释部分不必输入。
1、 常量的表示
1) 字符型常量
?[V‘F‘P] && 界定符为方括号,其中的其他形式的界定符均为字符串的组成内容。
2) 日期/日期时间型常量
?{^2003/10/01} && 必须按照严格的日期输入格式输入
【结论】
l 数值型常量的表示接近日常表示,不过应注意E后面的为指数,如2E3表示2×103。
l 字符型常量须用界定符“”、‘’或[]界定。
l 逻辑型常量只有两个,分别有两种表示方法,却都只有一种显示方法;
l VFP6.0以上版本的默认格式为严格的日期格式,故日期/日期时间型常量须按严格的格式输入,当然,是否进行严格的日期/时间检查,可通过SET STRICTDATE TO 0|1|2命令进行设置,其中0表示不进行严格的日期格式检查;1表示进行严格的日期格式检查;2表示进行严格的日期格式检查,并且对CTOD()和CTOT()函数也进行严格的日期格式检查。
l 日期/时间的显示格式,可通过SET DATE TO LONG|AMERICAN|ANSI等命令进行设置。
2、 变量的赋值
(1)简单变量
用等号“=”可以给单个变量赋值,用“STORE TO ”命令可以给多个变量赋值
(2)数组
l 名为array1的数组中的所有元素都可看作名为array1的内存变量,故下述命令可用来显示array1数组中所有元素的值:
DISPLAY MEMORY LIKE array1
l 数组的引用:当要求显示数组变量,只给出数组名时,数组的值等于第1个元素的值。EG:DEMENSION abc[3] ; ?abc
l 数组的定义:对已存在的数组再次定义,原数组元素的值会被继承,即再次定义的数组则是对原数组的扩展。同一数组的不同元素可以赋不同数据类型的值。
l 数组的使用:二维数组可以作为一维数组使用,如对于一个2行3列的数组array1,其数组元数array1[2,1]相当于数组元素array1[4]。
3、 常用函数
(1) 数值函数
【注意事项总结】
l SET DECIMALS TO 4
SET FIXED ON &&设置固定显示小数位为4位;
l MOD()函数——取模函数规律:
MOD(a,b)= a-[INT(a/b)- IIF(a/b<0,1,0)]*b
l ROUND()函数返回圆整到指定小数位数的数值表达式,若指定小数位数的参数(第二个参数)为负,则整数位也要被圆整,如:若第二个参数为-2,则小数点左端的第一和第二个数字(个位和十位)均为零。
(2) 字符函数
【归类总结】
l 截除字符串空格的函数:ALLTRIM()、TRIM()
l 求字符串长度的函数:LEN()
l 求子字符串首次出现的位置的函数:AT()、ATC()
l 取子字符串的函数:SUBSTR()、LEFT()、RIGHT()
(3) 日期/时间函数
显示当前系统的时间、日期:DATE()、TIME()、DATETIME()
返回参数日期中的年/月/日:DAY()、MONTH()、YEAR()
(4) 数据类型转换函数
l 字符 ASCII值:ASC()、CHR()
l 数值 字符:VAL()、STR()
l 字符 日期:DTOC()、CTOD()、TTOC()、CTOT()
【注意】
l 日期型(D)和日期时间型(T)使用场合没有区别,可以混用,故无需DTOT()或TTOD()之类的函数。
l 转换函数的参数不仅受数据类型的限制。如:VAL()中的字符参数只允许是数字的(E例外);CTOD()中的字符参数要类似yyyy/mm/dd表示,而不能是任意阿拉伯数字的组合。
l STR()函数的参数较多,要特别注意其用法。如:若总宽度缺省,默认宽度10;小数位数宽度缺省,默认为0。STR(),如果没有指定宽度和小数位数,默认宽度取10。
(5) 其他常用函数
l BETWEEN()函数:判断一个值是否在某个范围内。该命令的参数若是字符型,则返回值受SET COLLATE 命令影响。
l TYPE()函数:显示值的类型,对于未定义的表达式类型,返回U(注意参数要加引号,且与字符界定符有所区别)。如:
?TYPE(‘ “12” ’) &&显示C
?TYPE(‘ ‘12’ ’) 出错
?TYPE(‘!(3-2)’) &&显示U
l IIF()函数:称为条件函数,根据逻辑表达式的值返回两个值中的一个。
?IIF(DOW(DATE())=1 OR DOW(DATE())=7,’今天休息’,’今天上班’)
?IIF(DAY(DATE())=1,’今天休息’,’今天上班’))
4、 表达式
【注意】
l 不同类型的数据,其运算符不同。即使所用的符号相同,其含义也不同,如“+”,对数值型数据执行加运算,而对字符型数据则起着连接作用。
l 运算符及各种类型的常量表示要规范,不能与传统表示相混淆。如:已知x、y、z为数值型变量,考察下列表达式:
[(x-1)*y-5]/z &&“[]”非法,应改为“()”
|x|+|y| &&绝对值的表示非法,应该用ASC()函数。
x≤y AND y≤z &&“≤”运算错,应改为“<=”
l 表达式中数据类型要匹配。例如,若将数值型数据与字符型数据直接执行 “+”运算,系统将无法确定“+”的含义。如果有必要将不同类型的数据在一个表达式中表示,可以利用数据类型转换函数。如:
?”字符串”+cstring+”的长度为:”+ALLRIM(STR(LEN(cstring)))
l 名称表达式、宏替换:
名称表达式和宏替换可以用来替换命令和函数中的名称,从而为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语句来创建查询的方法。