当前位置:文档之家› 20-字符数组与字符串类型.

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 中查一下是否已有相同姓氏了,如果有只需将人数加 1;如果没有则 TABLE 的长度加 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[ 1. . N] OF INTEGER;
NAME:ARRAY[1. . 15] OF CHAR;
XING:ARRAY[1. . 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个字符。

相关主题