20-字符数组与字符串类型
字符数组与字符串类型
字符型变量:VAR CH :CHAR;
一、字符数组:数组基类型(元素的类型)为字符型。
VAR A:ARRAY [ 1((N ] OF CHAR ;
输入、输出也与普通数组一样,只能用循环结构,逐个元素地给它赋值,即:
FOR I:= 1 TO N DO READ(A[ I ]);
或者: A[I]:=‘X’;
不能用:A:=‘IT IS A PEN ’;
例一:判断从键盘输入的字符串是否为回文(从左到右和从右到左读一串字符的值)是一样的,
如ABCDCBA,1234321,11,1),串长< 100 ,且以点号‘( ’结束。
2000年竞赛题:判断一个数是否为回文数。
VAR LETTER:ARRAY [ 1((100 ] OF CHAR ;
I,J:0((100 ;
CH:CHAR ;
BEGIN
WRITELN(‘INPUT A STRING : ’);
I:= O ;READ(CH);
WHILE CH < > ‘( ’ DO
BEGIN
I:=I+1 ;
LETTER[ I ] := CH ;
READ(CH);
END;
J:=1 ;{ I 指向数组的尾部,J指向数组的头部 ,逐个比较 }
WHILE (J < I) AND (LETTER[ J ]= LETTER[ I ]) DO
BEGIN
I:= I – 1 ;
J:=J + 1
END;
IF J > = I THEN WRITELN(‘YES’)
ELSE WRITELN(‘NO ’);
END(
二、字符串类型:针对TURBO PASCAL
1、字符串常量:CONST STR=‘THIS IS A BOOK。’;
我们经常在WRITE语句中用到字符串,也可以WRITE(STR);语句输出STR的值。
2、字符串类型:也是一种构造类型。
定义形式:TYPE 字符串类型名 = STRING[ N ];
其中:N为字符串最大长度, 包括空格, 其中N为1到255之间的整数
3、字符串变量: VAR 字符串变量名:字符串类型名;
如:type st = string[8];
var name:st;
也可以合并,如VAR name:STRING [8] ;
4、存储结构:类似于字符数组。画图,NAME[I]。
5、动态串:N为最大串长,但实际上可以存放0~N之间的任意个字符。为了表示具体究竟有多少
字符(实际长度),一般把下标为0的位置元素上存放实际串长。所以,字符串实际
长度为N+1。
取串长只要:ORD(NAME[0])
三、字符串的运算
?赋值运算:可以一次性输入/出,即作为一个整体赋值。
如:READLN(STR1);
或:STR1:=‘THIS IS A BOOK’; { 长度为 14 }
WRITELN(STR1);
当然也可以逐个元素赋值,如STR1[ 3 ] :=‘I’;此时就作为字符数组用。
?连接运算:‘+’
如:‘THIS ’ + ‘IS’=‘THIS IS’
‘2’+‘12’=‘212’< >‘14’
但必须时刻注意结果不能超出字符串的长度;如:VAR A:STR[ 3 ]; B:STR[ 4 ]; C:STR[ 5 ] ;则C:=A+B;是错误的。
?关系运算 :> < = >= <= <>
如:‘ABC’< > ‘ABCD’
比较规则:1、当两个字符串长度不相等时,则串短的后面补空格,使长度一致;
2、再从左向右逐个 比较对应字符的ASCII值,以首次遇到的不相等字符的ASCII值大小决定两个串的大小,若所有字符的ASCII值都相等,则两个串也相等。
如: ‘12345’< ‘2’
例二:统计一个英文句子中有多少英文单词。假设句子中字符数小于80个,单词间用至少一个空格隔开(可以有多个空格),句子头部也可以有多个空格,句子以‘*’作为结束标志。
如:‘???THIS??IS?A??GOOD???BOOK~* ’ CONST N=80 ;
VAR STR:STRING[ N ];
PREC:CHAR;
NUM,IINTEGER;
BEGIN
READLN(STR);
PREC:=BLANK;
NUM:=0;
FOR I:=1 TO N DO
BEGIN
IF (STR[ I ] < > BLANK)AND(PREC=BLANK) THEN NUM:=NUM+1;
PREC:=STR[ I ]
END;
WRITELN(‘NUM OF WORDS IS: ’,NUM:3 ); END(
引申:为什么要控制在80个字符内呢,因为屏幕25行80列,一行最多写80个字符,若多于80
个字符就要考虑一个单词的换行问题了。现上题中的小于80个这一条件去掉,即一个单词在一行
中写不完可以换到下一行接着写,若正好写完,下一行也要空格。
例三:设姓名最多有15个字符组成,其中姓氏至多5个字符,姓与名之间用空格分隔,输入若干
姓名,以‘*’结束,统计各种姓氏的个数。
:为统计所读姓名中不同姓氏的人数,首先需要 把读入的姓氏保存在一张表TABLE中,读入
;如果没有则一个姓名时,先要到TABLE中查一下是否已有相同姓氏了,如果有只需将人数加1TABLE的长度加1,将此姓添加到表中,同时将此姓的人数置为1,重复以上过程,直到读到‘*’
结束。
程序:
CONST N=20; { N 要足够大}
B5=‘?????’;
VAR I,SIZE,P:INTEGER;FIND:BOOLEAN;
TABLE:ARRAY[ 1((N] OF ARRAY [1((5 ] OF CHAR ;
NUM:ARRAY[ ,((N] OF INTEGER;
NAME:ARRAY[,((15] OF CHAR;
XING:ARRAY[,((5] OF CHAR;
BEGIN
FOR I:= 1 TO N DO TABLE [ I ]:= B5 ;
SIZE:=0;
WRITELN(‘INPUT NAMES: ’);READLN(NAME);
WHILE NAME [ 1 ] < > ‘*’ DO
BEGIN
XING:=B5;P:=1;
WHILE(P < = 5)AND (NAME [ P ] < >‘?’)DO
BEGIN
XING [ P ]:=NAME [ P ];
P:=P+1
END;
FIND:=FALSE;
I:=0 ;
WHILE (NOT FIND)AND(I < SIZE) DO
BEGIN
I:=I+1;
IF TABLE [ I ] = XING THEN FIND:=TRUE
END;
IF FIND THEN NUM [ I ]:=NUM [ I ]+1
ELSE BEGIN
SIZE:=SIZE+1;
TABLE [ SIZE ]:=XING ;
NUM [ SIZE ]:= 1
END;
READLN(NAME);
END;
FOR I:= 1 TO SIZE DO
IF I MOD 2 = 0 THEN WRITELN(B5,TABLE [ I ] ,NUM [ I ]:3)
ELSE WRITE(TABLE [ I ],NUM [ I ] :3);
WRITELN
( END
四、字符串的过程和函数(书P203)
1、函数length(str):求字符串str实际长度;
2、函数pos(str1,str2):子字符串定位,求str1串在str2中首次出现的起始位置;
3、函数copy(str,pos,num):字符串复制,求str串中从pos开始的num个连续字符;
4、函数concat(str1,str2,……strn):字符串连接。将N个字符串有序连接起来,但总的长度
不能超过255。
5、过程delete(str,pos,num):删除str串中从pos开始的num个连续字符;
6、过程insert(str1,str2,pos):将字符串str1插入到字符串str2中从pos开始的位置上;
7、过程str(value,str):将数值value转换成字符串str;
8、过程val(str,var,code):将数字字符串str转换成数值给var,若转换成功则code=0,否则code
为str中出错的首字符位置。
举例演示以上过程和函数的用法和含义。
课后练习:输入若干姓氏,排序后输出(姓氏不超过5个字符)。