计算机程序基础讲义.docx
《计算机程序基础讲义.docx》由会员分享,可在线阅读,更多相关《计算机程序基础讲义.docx(39页珍藏版)》请在冰豆网上搜索。
计算机程序基础讲义
VFP程序设计
§1数据与数据运算……………………………………………
§2结构化程序设计……………………………………………
§3程序结构…………………………………………………
§4子程序、过程与自定义函数…………………………………
§1数据与数据运算
一、数据类型
数据是反映现实世界中客观事物属性的记录,它包括两个方面:
数据内容与数据形式。
数据内容就是数据的值,数据形式就是数据的存储形式和操作使用方式,也称为数据类型。
VFP6系统为使用户建立和操作数据库更加方便,将系统中所有操作、处理的数据,分为几种不同数据类型:
字符型、数值型、日期型、日期时间型、逻辑型、备注型、通用型、货币型、二进制字符型和二进制备注型。
二、常量与变量
在VFP系统中,数据可用常量、变量、数组表示,数据还可以用字段、记录和对象中,由它们存储、容纳各种类型的数据。
(一)常量
常量是在命令或程序中可直接引用、具有具体值的命名数据项,其特征是在整个操作过程中它的值和表现形式保持不变。
VFP按常量取值的数据类型,将常量分为6种类型:
数值型常量、浮点型常量、字符型常量、逻辑型常量、日期型常量、日期时间型常量。
1、数值型常量
由数字、小数点和正负号组成,表示整数或实数值。
如:
100,-21,15.31,-21092.5041等分别是数值型常量中的整数和实数。
2、字符型常量
由任意ASCII字符、汉字、空格或数字等组成的字符型数据,字符型常量又称为字符串。
为与其他类型常量、变量和标识符相区别,VFP要求将字符串中所有字符,用一对双引号“"”或单引号“'”或方括号“[]”作为定界符对括起来。
如“Iamastudent.”,‘中华人民共和国’,[VisualFoxPro数据库系统]都是字符串。
3、日期型常量
日期型常量是表示日期值的数据,其默认格式是{mm/dd/[yy]yy}。
如{10/01/04}和{10/01/2004}均表示2004年10月1日这一日期常量值。
4、逻辑型常量
逻辑型常量就是表示逻辑判断结果“真”或“假”的逻辑值。
逻辑常量只有真和假两种值,分别用(.T.或.y.)和(.F.或.n.)表示真和假。
VFP中在表示逻辑常量的字母左右加注圆点符“.”以示区别。
(二)变量
变量是在操作过程中可以改变其取值或数据类型的数据项。
确定一个变量,需要确定其三个要素:
变量名、数据类型和变量值。
1、内存变量
内存变量是一种存在于计算机内存中变量,是一种单个数据元素的临时性变量,需要时临时定义,不用时可随时释放。
内存变量分为用户自定义内存变量和系统内存变量。
(1)内存变量的建立
建立内存变量就是给内存变量赋值。
内存变量赋值既可定义一个新的内存变量,也可改变已朋内存变量的值或数据类型。
【格式】内存变量=表达式
【功能】计算<表达式>的值并赋值给指定内存变量。
【例】A=3+2y=2*x+5
(2)内存变量的显示输出
可以用两个命令在屏幕上显示输出内存变量的值。
【格式1】?
[表达式表][AT列号]
【格式2】?
?
表达式表[AT列号]
【功能】计算表达式表中各表达式的值,并在屏幕上指定位置显示输出各式的值。
格式1:
不管有无指定表达式表,都会输出一个回车换行符。
如果指定了表达式表,各表达式值将在下一行的起始处输出;
格式2:
不会输出一个回车换行符,各表达式值在屏幕上当前行光标所在位置直接输出;
表达式表:
多个逗号两两分隔的表达式,各表达式的值输出时,以空格分隔;
AT列号:
该子句指定表达式值从指定列开始显示输出。
AT的定位只对它前面的一个表达式有效,多个表达式必须用多个AT子句分别定位输出,而且可反序定位。
【例】?
A,B,CAT20
?
?
A
2、数组
数组是一种结构化的变量,是一组具有相同名称、以下标相互区分的有序内存变量。
一个数组通常都包含多个数据元素。
VisualFoxPro系统中只允许使用一维数组(相当于数列)和二维数组(相当于行列式或矩阵)。
(1)数组元素
●数组中各有序变量(数据元素)组成数组的成员,称为数组元素。
数组元素实质上是一个内存变量,也称数组变量,它们具有相同变量名即数组名,彼此以下标区分;
●数组元素的名称(变量名)用数组加下标构成。
如A
(1)、B(2,3)分别表示一维数组A的第1个数组元素,二维数组B中第2行第3列的数组元素;
●下标必须用圆括号对括;一维数组的元素只有一个下标,二维数组的元素有两个以逗号分隔的下标(也可用一个下标表示);
●数组元素的下标均从1开始,各元素的初始值为.F.;
●数组元素的数据类型决定于最后赋值的数据类型;不同元素的数据类型可以不同;
●数组元素与普通内存变量一样操作,可以赋值和引用。
(2)数组的定义
数组必须先定义后使用,定义数组是向系统申请数组元素在内存中存储空间。
【格式】
DIMENSION数组名1(N1[,N2])
DECLARE数组名1(N1[,N2])[,数组名2(N3[,N4])…]
【功能】定义一维或二维数组。
(3)数组的元素的排列
一维数组是按下标从小到大的顺序排列的,二维数组的排列是先按下标1,再按下标2的从小到大的顺序排列。
如:
A(5)排列如下表所示:
A
(1)
A
(2)
A(3)
A(4)
A(5)
B(3,4)排列如下表所示:
B(1,1)
B(1,2)
B(1,3)
B(1,4)
B(2,1)
B(2,2)
B(2,3)
B(2,4)
B(3,1)
B(3,2)
B(3,3)
B(3,4)
其中:
B(7)相当于B(2,3)
(4)数组的赋值与引用
数组元素的赋值与引用,与普通内存变量的规则相同。
【例】DIMEA(5),B(3,4)
STORE“OK”TOA
B(1,1)=10
B(1,2)=20
?
A(3),B(1,2),B(2,3)
三、常用函数
VisualFoxPro系统中,函数是一段程序代码,用来进行一些特定的运算或操作,支持和完善命令的功能,帮助用户完成各种操作与管理。
函数的一般形式为:
函数名([参数1][,参数2]…)
VisualFoxPro的函数由函数名与参数(即自变量)两部分组成。
参数必须用圆括号对括起来,如有多个参数,各参数以逗号分隔;有些函数可省略参数,或不需参数,但也必须保留括号;
(一)字符函数
字符函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。
函数中涉及的字符型数据项,均以C表示。
1、字符串长度函数
【格式】LEN(C)
【功能】返回字符串C的字符数(长度)。
函数值为N型。
2、取子字符串函数
【格式】SUBSTR(C,N1[,N2])
【功能】返回从字符串C中第N1个字符开始,截取N2个字符的子串。
●LEFT(C,N)从字符串C左边取N个字符
●RIGHT(C,N)从字符串C右边取N个字符
3、子串位置函数
【格式】AT(C1,C2)
【功能】返回字符串C1在字符串C2中的起始位置。
函数值为整数。
如果串C2不包含串C1,函数返回值为零。
4、删除字符串空格函数
【格式】RTRIM|TRIM(C)
【功能】删除字符串C尾部空格字符。
●LTRIM(C)删除字符串C的前导空格字符。
●ALLTRIM(C)删除字符串C的前导和尾部空格字符。
5、空格函数
【格式】SPACE(N)
【功能】返回一个包含N个空格的字符串。
6、大小写字母转换函数
【格式】LOWER(C)|UPPER(c)
【功能】LOWER()将字符串C中字母全部变成小写字母,UPPER()将字符串C中字母全部变成大写字母,其它字符不变。
(二)数值函数
数值函数用于数值运算,其自变量与函数都是数值型数据。
1、取绝对值函数
【格式】ABS(N)
【功能】计算N(数值表达式)的值,并返回该值的绝对值。
2、取整函数
【格式】INT(N)
【功能】计算数值表达式N的值,返回该值的整数部分。
3、四舍五入函数
【格式】ROUND(N1,N2)
【功能】返回N1四舍五入的值,N2表示保留的小数位数。
4、最大值和最小值函数
【格式】MAX|MIN(N1,N2[,N3...])
【功能】返回数值表达式中的最大值MAX()和最小值MIN()。
5、求余数函数(求模函数)
【格式】MOD(N1,N2)
【功能】返回N1除以N2的余数。
余数的小数位数与N1相同,符号与N2相同。
6、平方根函数
【格式】SQRT(N)
【功能】求非负N的平方根。
7、符号函数
【格式】SIGN(N)
【功能】返回N的符号。
正数、零、负数分别返回1、0、-1。
(三)转换函数
在数据库应用的过程中,经常要将不同数据类型的数据进行相应转换,满足实际应用的需要。
VisualFoxPro系统提供了若干个转换函数,较好地解决了数据类型转换的问题。
1、数值转换为字符串
【格式】STR(N[,长度][,小数位数])
【功能】将N的数值转换成字符串形式。
函数值为C型。
2、字符串转换为数值
【格式】VAL(C)
【功能】将C串中数字转换成对应数值,转换结果取两位小数。
函数值为N型。
3、字符转换为ASCII码值
【格式】ASC(C)
【功能】返回C串首字符的ASCII码值。
函数值为N型。
4、ASCII码转换为相应字符
【格式】CHR(N)
【功能】返回以N值为ASCII码的ASCII字符。
函数值为C型。
四、运算符与表达式
在VisualFoxPro系统中,表达式是由常量、变量、函数及其他数据容器单独或与运算符组成的有意义的运算式子。
运算符是对数据对象进行加工处理的符号,根据其处理数据对象的数据类型,运算符分为算术(数值)运算符、字符运算符、日期时间运算符、逻辑运算符和关系运算符五类,相应的,表达式也分为算术表达式、字符表达式、日期时间表达式、逻辑表达式和关系表达式五类。
♦在VisualFoxPro系统中,各类运算的优先顺序如下:
圆括号>算术和日期运算>字符串运算>关系运算>逻辑运算
用户也可以通过给表达式加圆括号的方式,改变其默认运算顺序。
如果多个同一级别的运算,则按在表达式中出现的先后顺序进行运算。
(一)算术表达式
算术表达式又称数值表达式,其运算对象和运算结果均为数值型数据。
数值运算符的功能及运算优先顺序,如表所示。
表中运算符按运算优先级别从高到低顺序排列。
算术运算符
运算符
功 能
表达式举例
运算结果
优先级别
()
圆括号
(2-5)*(3+2)
-15
最高
最低
-
取相反数
-(3-8)
5
**、^
乘幂
2**5、3^2
32、9
*、/
乘、除
2*10、25/5
20、5
%
取余数
20%3
2
+、-
加、减
36+19、29-47
55、-18
(二)字符表达式
字符表达式是由字符运算符将字符型数据对象连接起来进行运算的式子。
字符运算的对象是字符型数据对象,运算结果是字符常量或逻辑常量。
下表为字符运算符的功能。
字符运算符
运算符
功 能
表达式举例
运算结果
+
串1+串2:
两串顺序相连接
‘12’+‘56’
‘1256’
-
串1-串2:
串1尾空格移到串2尾后再顺序相连接
‘12’-‘56’
‘1256’
"+"与"-"都是字符连接运算符,都将两字符串顺序连接,但“+”是直接连接,“-”则将串1尾部所有空格移到串2尾部后再连接。
(三)关系表达式
由关系运算符连接两个同类数据对象进行关系比较的运算式称为关系表达式。
关系表达式的值为逻辑值,关系表达式成立则其值为“真”,否则为“假”。
关系运算符
运算符
功 能
表达式举例
运算结果
<
小于
15<4*6
.T.
>
大于
‘A’>‘1’
.T.
=
等于
2+4=3*5
.F.
==
串全等比较
‘abc’==’abcabc’
.F.
<=
小于或等于
'abc'<='AB'
.F.
>=
大于或等于
{10-10-02}>={10/01/02}
.T.
<>、#、!
=
不等于
5<>-10
.T.
$
包含于。
串1$串2:
串1是否为串2子串
‘1234’$‘a12345’
‘1234’$‘34512’
.T.
.F.
关系运算符的优先级别相同。
关系表达式运算时,就是比较同类两数据对象的“大小”,对于不同类型的数据,其“大小”或者是值的大小,或者是先后顺序。
日期或日期时间数据以日期或时间的先后顺序为序。
(四)逻辑表达式
由逻辑运算将逻辑型数据对象连接而成的式子称为逻辑表达式。
逻辑表达式的运算对象与运算结果均为逻辑型数据。
逻辑运算符前后一般要加圆点“.”标记,以示区别。
逻辑运算符
运算符
功 能
优先级别
.NOT.(!
)
逻辑非,取其右边逻辑值的相反值
最高
最低
.AND.
逻辑与,两边的逻辑值均为真才得真
.OR.
逻辑或,两边的逻辑值均为假才得假
对于各种逻辑运算,其运算规则可由逻辑运算真值表确定,如下表所示就是逻辑运算真值表。
§2结构化程序设计
结构化程序设计的方法:
自顶向下,逐步求精。
结构化程序由顺序结构、选择结构、循环结构三种基本结构组成。
VFP提供面向过程的程序设计和面向对象的程序设计方法。
面向过程的程序设计是用结构化编程语言来实现编写程序。
具体就是告诉计算机如何一步一步解决问题,即要求计算机“怎么做”。
它不依赖具体的机器。
面向对象的程序设计适于解决大型的任务,设计程序时只需告诉计算机“做什么”,而不用说明“怎么做”。
它不依赖具体的机器。
VFP程序是由一系列命令组成,又称命令文件或程序文件。
运行程序文件就是执行文件中的各条命令。
一、引例
先看一个完整的VFP过程化程序实例,从中可以引出程序的几个基本概念。
*程序示例:
求圆形的面积。
CLEAR&&清除主窗口中的信息
SETTALKOFF&&关闭命令窗口对话
INPUT"请输入圆的半径,R="TOR&&输入圆的半径
S=PI()*R^2&&计算圆的面积
?
"圆的面积=",S&&输出圆的面积
SETTALKON&&打开命令窗口对话
RETURN&&返回命令窗口
NOTE程序结束
有关此VisualFoxPro程序的几点说明:
●注释语句
【格式1】*注释内容每一行开头均可加此注释
【格式2】NOTE注释内容同上
【格式3】&&注释内容行尾注释
【功能】增强程序文件易读性,编译时注释内容不会被执行。
NOTE注释一行写不下可加续行符”;”,&&注释不能用在命令语句行续行符”;”的后面。
●对话开关语句
【格式】SETTALKOFF|ON
【功能】关闭或打开命令执行时的对话开关。
●命令的分行
VisualFoxPro程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符“;”,再按回车键。
●程序的结束
执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令:
①CANCAL:
终止程序运行,清除所有的私有变量,返回命令窗口;
②RETURN:
结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口;
二、程序中常用的简单语句
一个程序如果没有输出操作(即将程序结果显示出来)就没有什么实用价值,而如果没有输入操作(即给变量提供数据),则必然缺乏灵活性。
VFP提供多种方法来实现信息的输入和输出。
(一)输入语句
1、赋值输入语句
在编写程序时,给变量提供数据可以用赋值语句,多用于给变量赋初值。
【格式1】STORE数据TO变量名表
【格式2】变量名=表达式
【功能】给变量赋值,其中格式1可以同时给多个变量赋同一个值,而格式2只能给一个变量赋一个值。
而在程序运行过程中,往往需要根据实际情况输入数据赋值给变量,这就需要采用交互式数据输入语句。
2、交互式输入语句——INPUT命令
【格式】INPUT[提示信息]TO内存变量
【功能】在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量
【例】从键盘输入两个任意正数,编程求以两数为边长的矩形面积。
程序文件名为PROG4.PRG
SETTALKOFF
CLEAR
INPUT“矩形的边长a为:
”TOA
INPUT“矩形的边长b为:
”TOB
S=A*B
?
“矩形的面积为:
”,S
SETTALKON
RETURN
【练习】编写一个能同时求矩形面积与周长的程序。
(二)输出语句
1、简单输出语句
【格式】?
|?
?
表达式
【功能】将表达式的值输出(?
)到下一行起始处,或直接输出(?
?
)到当前光标所在位置。
2、格式输出语句
【格式】@行号,列号SAY表达式
【功能】将表达式的值在指定位置输出到屏幕上。
【说明】与格式输入命令相同,@…SAY。
§3程序结构
VisualFoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。
所谓程序设计就是通过对实际问题的分析,确定解题算法,并应用程序设计语言提供的命令或语句将解题算法描述为计算机处理的语句序列(即程序)。
所谓结构化程序设计,就是采用自顶向下逐步求精的设计方法和单入口单出口的控制结构,即顺序、分支、循环三种基本结构构成。
一、顺序结构
顺序结构是一种最简单的结构。
在这种结构中,程序根据语句中的命令的书写顺序依次执行的命令序列。
VFP系统中的大多数命令都可以作为顺序结构中的语句。
【例】编程实现输入某个三角形的底和高,计算其面积。
SETTALKOFF
CLEAR
INPUT“请输入三角形的底:
”TOD
INPUT“请输入三角形的高:
”TOG
AREA=D*G/2&&计算面积
?
AREA&&输出面积
SETTALKON
CANCEL
【例】某商场营业员工资的计算方法是:
每月600元的基本工资加该月总销售额的8.5%提成。
要求编一程序,输入某营业员的月总销售额,计算并显示该营业员的月收入。
二、分支结构(选择结构)
分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。
分支结构又称选择结构,其形式有如下三种:
单向分支、双向分支和多路分支。
语句序列
(一)单向选择语句
单向选择语句,即根据用户设置的条件
表达式的值,决定某一操作是否执行。
【格式】
IF条件表达式
语句序列
ENDIF
【功能】
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈语句序列〉;否则,执行ENDIF后面的第一条命令。
【例】求一元二次方程AX2+BX+C=0的实根。
SETTALKOFF
CLEAR
INPUT“A=”TOA
INPUT“B=”TOB
INPUT“C=”TOC
Z=B^2-4*A*C
IFZ>=0
X1=(-B+SQRT(Z))/(2*A)
X2=(-B-SQRT(Z))/(2*A)
?
”X1=”,X1,”X2=”,X2
ENDIF
SETTALKON
RETURN
(二)双向选择
语句序列2
双向选择语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。
【格式】
IF条件表达式
语句序列1
ELSE
语句序列2
ENDIF
【功能】
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈语句序列1〉中的命令;否则,执行〈语句序列2〉中的命令;执行完〈语句序列1〉或〈语句序列2〉后都将执行ENDIF后面的第一条命令。
【例】编写一密码校验程序(假设密码为ABC)。
SETTALKOFF
CLEAR
ACCEPT“请输入您的密码:
”TOA
IFA=“ABC”
CLEAR
?
“欢迎使用本系统!
”
ELSE
?
“密码错误!
”
ENDIF
SETTALKON
CANCEL
【例】根据输入的百分制成绩,转换成等级分(85以上优秀、60以上合格、60以下不合格)。
CLEAR
SETTALKOFF
INPUT“请输入成绩:
”TOCJ
IFCJ>=85&&判断成绩等级
?
“优秀”
ELSE&&成绩小于85之后再作判断
IFCJ>=60
?
“合格”
ELSE
?
“不合格”
ENDIF&&内层判断结束
ENDIF&&外层判断结束
SETTALKON
CANCEL
(三)多路分支选择
多路分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行。
【格式】
DOCASE
CASE条件表达式1
语句序列1
CASE条件表达式2
语句序列2
……
CASE条件表达式N
语句序列N
[OTHERWISE
语句序列N+1]
ENDCASE
【功能】
该语句根据给出的N个〈条件表达式〉的值,选择N+1个〈语句序列〉中的一个执行。
当所有CASE中〈条件表达式〉的值都是假时,如果有OTHERWISE项,则执行〈语句序列N+1〉,再执行ENDCASE后面的第一条命令;否则,直接执行ENDCASE后面的第一条命令。
【例】假设收入(S)与所得税税率(R)的关系如下表,编程计算个人所得税的缴费方法。
0S<800
R=
0.05800≤S<2000
0.082000≤S<5000
0.1S≥5000
程序结构如下:
SETTALKOFF
CLEAR
INPUT“您的月工资收入:
”TOS
DOCASE
CASES<800
TAX=0
CASES<2000
TAX=0.05*(S-800)
CASES<5000
TAX=0.08*(S-800)
OTHERWISE
TAX=0.1*(S-800)
ENDCASE
?
“应缴个人所得税:
”,TAX
SETTALKON
RETURN
【说明】使用分支语句应注意的几点
(1)IF…ENDIF和DOCASE…ENDCASE必须配对使用,DOCASE与第一个CASE条件表达式之间不应有任何命令。
(2)条件表达式可以是各种表达式或函数的组合,其值必须是逻辑值。
(3)语句序列可以一个或多个命令组成,或是其他控制语句构成的嵌套结构。
(4)DOCASE……ENDCASE命令,每次最多只能执行一个语句序列。
在多个CASE项的条件表达式值为真时,只执行第一个条件表达式值为真的语句序列,然后执行ENDCASE的后面的第一条命令。
【例】编写身高体重测试仪测量程序。
体质指数(BMI)=体重(kg)÷身高平方(m