与其他BASIC版本不同,Quick BASIC不但有系统定义的基本数据类型,而且用户还可以自己根据需要定义数据类型。我们首先介绍一下数据的概念,然后再介绍基本数据类型和如何自定义数据类型。
数据的概念虽然有各种说法,但都大同小异。数据是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算中,并能被计算机程序加工处理的符合集合。计算机中的数据,并不单单指数值,也包括字符串等。
数据类型是简单数据的基本属性,数据类型是确定的一个值的集合。计算机中,只有相同或相容的类型的数据之间才能进行操作。
基本数据类型可以分为字符串型数据和数值型数据。
(1)字符串
变长字符串 变长字符串的长度为0~32767个字符。组成它的字符可以是代码为0~127的标准ASCII字符,也可以是代码为128~255的扩展ASCII字符。(参见附录C)
定长字符串 定长字符串含有确定个数的字符,但最大长度不超过32767个字符。定长字符串中字符的代码范围也为0~255。
(2)数值
Quick BASIC的数值型数据可以分为整型数和浮点数两类。其中整型数分为常规整型数和长整型数,浮点数分为单精度浮点数和双精度浮点数。下面分别予以介绍:
整型数:整型数是不带小数点和指数符号的数。在计算机内部,它以二进制补码形式表示。例如,整数8和-8分别以下在的形式存放:
0000000000001000
1111111111111000
整型数中,整型(常规整型)在计算机内部,以两个字节(16位)的二进制码表示和参加运算,它的取值范围从-32768到+32767。在Quick BASIC中,增加了长整型数。长整型数以带符号的四字节(32位)二进制存储,它的取值范围从-2147473648到+214743647。
浮点数:Quick BASIC使用IEEE(Institute of Electrical and Electoronice Engineers,Inc)格式的浮点数,而不是像早期版本那样使用Microsoft二进制格式。IEEE格式给出的结果更精确,并能使用8087或80287数学协处理器。
浮点数由三部分组成:符号、指数和尾数,其指数分别用E和D表示。其中的单精度浮点数占4个字节,符号占1位,指数占8位,其余的23位表示尾数,此外还有一个附加的隐含位。单精度数可以精确到7位十进制数,其负数的范围为-3.402823E+38到-14.40129E-45,正数的范围为1.40129E-45到3.402823+38。双精度浮点数占8个字节,符号占1位,指数占11位,其余52位用来表示尾数,此外还有一个附加的隐含位。双精度数精确到15或16位十进制数。其负数的范围为-1.797693134862316D+308。除去整型数和长整型数外,Quick BASIC中还使用十六进制和八制数,还要用到逻辑数据。逻辑型数据只取“真”和“假”两种值,通常情况下把逻辑型数据也看成数值型数据。
除了系统定义的基本数据类型外,用户还可以利用TYPE语句定义自己的数据类型,它的格式为:
TYPE定义的数据类型名
数据类型元素名AS类型名
数据类型元素名AS类型名
……
END TYPE
其中的“定义的数据类型名”的命名规则与变量的命名规则相同,有关变量内容我们将在4.3节中介绍。“数据类型元素名”也遵守同样的规则,注意,数据类型元素名不能为数组名。
“类型名”可以是除变长字符串以外任何数据类型,也可以是用户定义的类型。
[例3-2] 定义日期(MyData)记录数据类型。
TYPE MyData
Year AS INTEGER
Month AS STRING*3
day AS INTEGER
END TYPE
DIM today AS mydate
today.year = 2001
today.month = "April"
today.day = 18
PRINT "today is";today.year;today.month;today.day
END
运行菜单选项"RUN",输出结果:
today is 2001 Apr 18
其中的MYDATE为用户自定义的类型。它包含三个元素:Year、Month和Day。Year和Day为整型,Month为定长字符串,取3个ASCII字符。
我们在使用TYPE语句时,应注意以下几点:
n 用户自定义类型中的字符串必须是定长字符串,它的长度用一个星号和一个常数指明。
n 在使用用户自定义的类型之前,必须用TYPE语句在模块代码中加以定义。而用户自定义类型的变量可以出现在模块的任意地方,包括在SUB或FUNCTION过程中。
n 用户自定义的类型中不能含有数组。
使用计算机能够实现的运算可以分为两类:数值运算和非数值运算。数值运算的运算对象主要是数值量,当然,得到的结果也为数值量,比如3*2+4属于数值运算。非数值运算的运算对象主要不是数值量,而是非数值量,比如把全班同学的姓名按姓氏的英文字母顺序排序;查询
常量是指程序运行过程中不能改变的数据量。如3.4,78,-1等都是常量。在Quick BASIC中,常量可以分为数值常量和字符串常量。有时也把常量分为文字常量和符号常量。
数值常量又可分为整型常量和实型常量两类。
(1)整型常量(又称为整数)
整型常量有若干个数字组成的序列,它可以带有数值符。整型常量又可分为常规整型数和长整型数两类。
常规整型数:常规整型数的取值范围从-32768到+32767。它不包含小数点,常规整型数按两个字节存储。Quick BASIC中用“%”作为常规型数的符号,比如76、76%指的是同一个整型数。但要注意,如果我们所取的数超过了规定的范围,如果仍然在数值后加“%”,则Quick BASIC会出错。如32768%不合法。
长整型数:长整型数是指超过-32768到+32767范围而不超过-2147483648到+214783647范围内不带小数点的整数。在Quick BASIC中,长整型数可以数的末尾加一个“&”表明是长整型,比如32777和32777&指同一个数。所有被认为或被定义为长整型的整数,不管大小均按4个字节存储。比如8&,虽然数值很少,因为被定义为长整型数,Quick BASIC仍然会按4个字节存储。
(2)实型常量(又称实数)
实型常量可以分为单精度实数和双精度实数,在Quick BASIC中,有两种计数方法可计实数,它们是日常计数法和科学计数法。
日常计数法:日常计数法是指日常生活中所使用的十进制小数形式计数。它们由若干个数字序列组成,可以包括小数点和数值符号。比如-3.4,0.786,0.0,+9.485等。因为这些实数的小数点的位置是固定不变的,所以又被称为“定点实数”。比如743.45中的小数点的位置在3后面,我们不能随便移动它的位置,因为移动它将会改变它实际表示的数值。
科学计数法:科学计数法就是用指数的形式来表示实数。在数学中,我们常用幂(幂的底数为10)的形式表示,如743.45可表示为743.45×100、7.4345×102、74.345×101等数值常量。因在为在输入这些数据时,无法输入上角标和下角标,所以Quick BASIC规定用字母“E”或“e”来表示以10为底的幂数。比如上例可表示为743.45E0、7.4345E2、74.345E1。
在Quick BASIC中,一个指数形式的常量是有数字部分和幂(指数)部分组成时,一个实数可以表示为多种指数形式,如上例的743.45E0,还可以表示成7.4345E2、74.345E1等形式。因为用指数形式表示一个实数时,其实数中的数字部分内的小数点的位置可以随着指数的变化而变化,故又称“浮点型实数”。
在Quick BASIC中,为了区别单精度实数和双精度实数,又增加了有关单精度和双精度实数的特殊表示方法:单精度数用末尾带有“!”的十进制定点数表示,也可以用“E”代替指数的底。比如43.21可以表示为43.21!或4.321E1,二者等价。因为我们经常在程序中使用单精度数,为了简化起见,实数中的“!”可以省略不写,上例的43.21!和43.21是等价的;双精度实数用末尾带“#”的十进制定点数来表示,也可用“D”代表指数的底,比如双精度数876.098098098可以表示为876.098098098#或8.76098098098D2。其中的“D”和科学计数法中的“E”等价,只是为了区别起见才这样写。
注意:当我们用指数形式表示一个实数时,指数部分由字母“E”、指数符号(正数可以默认)和不超过3位的整数组成。比如1234.567E-3、5879.55E3、787.23E2都是合法的,而1234.567E-3.2、5879.55E-4321、787.23E22.3均不合法。
计算机中,不同类型的数的存储方式不同,前面我们提到了不同类型的数所占的字节数不一样,经如20、20.00、20.00#数值虽然相同,但20为整型数,而20.00为实型数,20.00#为双精度数。故在存储时所占的存储空间就不一样。20在存储时占用2个字节(整型数存储占2个字节16位),而20.00在存储时计算机会当作单精度实型数处理,存储占4个字节,20.00#在存储时计算机会当作双精度数,存储占8个字节。
程序中若没有特殊说明某实型数是单精度还是双精度数时,可以参照以下原则加以区别:
不超过7位并且带小数点的数,或末尾加“!”的不超过7位数字的十进制小数,或用“E”(或“e”)表示指数部分的浮点实数,在计算机中均以4个字节按单精度实型数存储。
多于7位并且包含小数点的数,或末尾加“#”的实数,或用“D”(或“d”)表示指数部分的浮点实数,在计算机中均以8个字节按双精度实型数存储。
字符串常量是指用一对双引号括起来,包括所有可以打印的ASCII字符和国标码字符的字符串。如"OK"、"Quick BASIC"、"Welcome"等都是合法的字符串常量。应当注意的是:双引号只是字符串的“定界符”,只起“定界”的作用,不算做常量本身的内容。
符号常量是一种用来代替某数值常量或字符串常量的标识符。此常量在使用之前必须用CONST语句加以说明。在Quick BASIC中,可以定义符号常量,用来代替数值或字符串。定义的一般格式为:
CONST常量名=表达式[,常量名=表达式]…
其中的“常量名”为一个名字,按变量名的规则定义,可以加类型说明符;“表达式”由文字常数、算术运算符(除乘方指数运算符^外)、逻辑运算符组成,也可以使用诸如“File already exist”之类的字符串,但是不能使用字符串连接、变量和用户定义的函数或内部函数。例如:
CONST Maxchars%=254,Maxbue%=Maxchars+1
DIM Buffer%(Maxbue%)
其实,符号常量完全可以通过对变量赋值来实现,但使用符号常量有一定优点:
n 在整个程序模块中经常用到的常量只需定义一次。
n 常量不会因疏忽而改变。
n 在独立的程序中,使用常量比使用变量能产生更为有效的代码。
n 使用常量使程序更容易修改。
同时在使用符号常量时应当注意:
(1)如果使用了类型说明符,那么在该常量被引用时可以省略。例如:
CONST Maxdim%=20
……
DIM AccountName$(Maxdim)
在省略了类型说明符后,常量的类型将取决于CONST语句中表达式的类型。字符串表达式总是产生字符串常数,对于数值型表达式来讲,会将该表达式求值并按照最简单的类型来表示此常数。经如,当表达式的结果为整数时,该常数就会确定为最简单的整型常数。
(2)符号常量的类型由类型说明符或表达式的类型决定,并不受DEF type语句的影响。
(3)在过程之外说明的常量可以在本模块中使用,可以在任何使用表达式的地方使用符号常量。
(4)因类型说明符不是符号常量的一部分,故在定义符号常量后,有些变量名在使用时要小心。例如:
CONST A=5.678
那么此时A!、N#、N%和N&就不能再用作变量名。
变量是指程序运行过程,其值可重新赋值的量,亦即在程序执行过程可以发生变化的量。下面将介绍变量的命名规则和变量的类型。
变量名是指表示变量值的名称,主要用于代表一个存储单元。在Quick BASIC中,变量的命名由字母、数字和小数点组成。它命名的规则如下:
(1)变量名由字母、数字和小数点组成,必须以字母开头。如:A1、ConNT.add、B等都是合法的。
(2)变量名由1到40个字符组成,在变量名中只能出现字母、数字、小数点和用于表明变量类型的符号。
(3)表示变量类型的符号(!、#、%、$、&)必须是变量名的最后一个字符。
(4)不能使用Quick BASIC中的保留字作为变量名。例如变量DATA或DATA$非法,但变量DATA合法。
(5)变量名中不能出现空格符号。
(6)变量名不能与过程名或符号常量同名。
(7)在变量名中出现的字母大小写是等效的(要区别于C语言等)。