前面主要介绍了计算机在数值计算中的应用,只涉及了一些简单的字符处理。事实上计算机不仅在数值计算上应用广泛,而且在非数值计算中应用范围正在不断扩大,尤其是用于事务管理领域。如图书检索,人事管理,教务管理,经济信息管理等。有关资料表明,计算机在非数值计算中的应用,要远远超过计算机在数值计算中的应用。这就要求计算机具有相当强的文字处理能力。如果一台计算机没有文字处理功能,充其量只能算是一个高级的计算器。Quick BASIC的一个非常重要的功能就是可以进行字符处理,而且它的字符处理功能十分强大。它提供了字符串变量,字符串数组,字符串语句以及丰富的字符串函数,使用起来直当灵活方便。本章主要介绍Quick BASIC对字符串的各种处理功能,涉及的主要内容有:
n 字符串变量
n 字符串变量和数组字符
n 字符串变量的赋值
n 字符串表达式及字符串的比较
n 取子字符串
n 字符串的生成
n 字符串与数值的相互转换
n 自选输出格式
字符是指单个字母、数字或其他特殊符号。本书附录中的ASCII码表中,列出了IBM-PC系列微机中的字符集。
所谓“字符串”就是系统允许使用的若干个字符构成的序列,也称为字符串常量。一个字符串一般是用双引号括起来的一串字符。例如:
"abcdefg" "1234567" "This is a book"
字符串常量与数值常量一样,在程序执行过程中其值是不变的。
Quick BASIC的字符串中可以使用的字符主要是在键盘上出现的字符,包括:26个英文字母(大写字母A~Z、小写字母a~z),数字0~9,标点符号,空格,数学符号,专用符号(@、¥、~、&等)。除了键盘上出现的字符外,还可以包括用ASCII码形式给出的图形字符或控制字符。
字符串中的每一个字符在内存中占一个字节。一个字符串占据一段连续的内存单元。例如字符串“ABCDEF”有7个字符,因此它在内存中占7个单元。
字符串的长度是指字符串常量中的字符的个数。例如:
"This is a book" 该字符串的长度为14个字节
引号不是字符串的值,它只是字符串常量的起、止界限,而且在引号中不能再套引号。
例如:
"I say:"This is a book"" 这是Quick BASIC中不允许的
一个汉字占两个英文字符的宽度。Quick BASIC规定一个字符串最多可以容纳32767个字符。
Quick BASIC提供的LEN函数可以方便、准确地测出字符串的长度。
格式:
LEN(〈字符串表达式〉)
功能:求字符串表达式中字符的个数,即字符串的长度。
说明:〈字符串表达式〉既可以是字符串常量,也可以是字符串变量。
例如:
PRINT LEN("ABCDEFG") '输出: 7
PRINT LEN(“10*20=”) '输出: 6
PRINT LEN("") '输出: 1(空格也为字符)
字符串常量是指在程序运行过程中始终保持不变的字符串。Quick BASIC允许使用两种形式的字符串常量。
显示的字符串常量就是用双引号括起来的一串字符。如:"I am a student."
在使用字符串时应注意以下几点:
(1)空格或者间隙也是一个字符,应计在字符串长度之内。
(2)字符串中,大小写字母是有区别的。如"ABCD"与"abcd"被看成是2个不同的字符串。
(3)无任何字符的串叫“空串”,用""来表示,空串的长度为零。
(4)应将字符串与数值严格区分开来。例如:12345是一个数值,而"12345"则是一个字符串,其中每个都是独立的字符。字符串不能用作算术运算。
用一个符号名代表一个字符串常量:
CONST xm="Wang Hong"
在本程序块中,xm与"Wang Hong"等价,如果有:
PRINT xm
则输出Wang Hong。
为了阅读程序方便,可以在符号常量名后加“$”,以表明是字符串常量。如:
CONST xm$="Wang Hong"
注意把符号字符串常量与字符串变量相区别。字符串常量的值是不能改变的,例如下面的程序段是非法的:
CONST xm$="Wang Hong" '定义了一个符号字符串变量xm$="Wang Hong"
xm$="Li Qiang" '又要用赋值语句给字符串变量xm$赋值
存放数值的变量称为数值变量,存放字符串的变量就称为字符串变量。数值型变量的值是一个数值,而字符串变量的值则是一个字符串,并且,程序执行的过程中,这个值是可以改变的。
Quick BASIC规定了两类字符串变量:变长字符串变量和定长字符串变量。
在程序执行过程中,变长字符串变量长度可在0~32767范围内增加或减短,这种变量使用起来比较方便灵活。
定义变长字符串变量类型的方法有3种:
(1)用变量名加上类型申明符
格式:变量名$
变量名的命名规则与数值变量相同。例如:al$,b$,erx$,dap$等都是合法的变量名。例如:
jtdz$"kaifeng"
其中jtdz$就是一个字符串变量,现在已将字符串"kaifeng"赋给了变量jidz$,以后需要输出字符串"kaifeng"时,就和使用数值变量一样,直接在PRINT语句中输出变量jtdz$即可。
例如:
PRINT jtdz$
输出结果为:
kaifeng
(2)用DEFSTR类型说明语句
用类型说明语句(DEFSTR语句)来定义以某个字母开头的变量为字符串变量。
格式:DEFSTR〈字母表〉
其中,字母表是单个字母或一段连续的字母范围。
例如:
DEFSTR a,m-p
ma="ABCD"
PRINT ma
上例中,DEFSTR语句是说明以a和m,n,o,p开头的所有变量为字符型变量,ma在的说明的范围内,所以是字符串变量。
(3)在DIM语句中使用AS STRING
格式:DIM〈变量名〉AS STRING
例如:
DIM xm AS STRING
xm="Li Qiang"
PRINT xm
应注意,用DIM…AS STRING语句定义字符串变量时,变量名不应包含类型说明符,例如下面的用法是非法的:
DIM xm$ AS STRING '将xm写成了xm$
变长字符串虽然灵活方便,但人们有时希望在某些字符串取固定的长度,尤其是在打印输出时使上下对齐。
定长字符串是指它在程序执行过程中,始终保持其长度不变的字符串。定长字符串变量的长度要用DIM语句进行说明。
格式:DIM 〈变量名〉 AS STRING*n
例如:
DIM aa AS STRING*8
在定义了aa为定长字符串变量之后,可以用赋值语句为其赋值。上面的语句说明了aa的字符长度为8,如果赋的值长度超过了8,则多余的字符被截去,如果少于8,则在其后补足空格。例如:
aa$="ABCDEF12345" '其值为:"ABCDEF12"
aa#="ABC" '其值为:"ABC "(后面补5个空格)
串变量在未赋值之前的初值为空字符串,对于可变长字符串,其长度为0;而对定长字符串,其他长度为n,即使用空格为其赋值,如aa$=""其长度不变,也为8。
使用定长字符串,可以实现定格输出。
[例10-1] 阅读下面的程序。
'EXAMPLE 1
CLS
DIM a AS STRING *6
FOR i=1 TO 4
READ a
PRINT i,a
NEXT i
DATA ABCDEFGHIJKLMN,ABC,XYZOP ,&&&&&&&&
END
运行结果为:
1 ABCDEF
2 ABC
3 XYZOP
4 &&&&&&
从上例的输出结果可以看出,字符串是以左边对齐,右边补空格的形式输出的。
字符串数组的概念与前介绍的数组相似,即字符串数组是一组有序的字符串变量的集合。字符串数组中的元素称为“串下标变量”。根据字符串数组的维数,同样可分为:一维、二维、三维等。例如:
a$(28),b$(2,3),c$(10,20,30)
其中a$,b$,c$均为字符串数组名,其下标书写规则同数组下标变量。在同一程序中,字符串数组名与字符串变量名可以相同。当程序中使用字符串数组时,同样使用DIM语句进行说明。一个DIM语句可同时对字符串数组和数值数组进行说明。例如:
DIM a(8),b(2,3),a$(5),cb$(4,5)
[例10-2] 有一班级学生,要求按学生姓名的汉语拼音顺序输出。
问题分析:建立数组来存放学生姓名,用字符串比较的方法来实现顺序输出。程序为:
'EXAMPLE 2
CLS
DIM a$(6) '定义字符串数组
FOR i=1 TO 6 '各数组元素读入数据
READ a$(i)
NEXT i
FOR i=1 TO 5 '排序
p=i
FOR j=i+1 TO 6
IF a$(j)<a$(p)THEN p=j
NEXT j
IF p<>i THEN SWAT a$(p),a$(i) '交换数组元素的值
NEXT i
FOR i=1 TO 6 '排序后输出
PRINT a$(i) '输出
NEXT i
DATA "AHANG SAN","LIU FENG","WANG AHI"
DATA "SONG HONG","YANG PING","KANG XIANG"
END
程序运行结果为:
KANG XIANG
LIU FENG
SONG HONG
WANG HAI
YANG PING
ZHANG SAN