20-字符数组与字符串类型.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符数组与字符串类型
字符型变量: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 ;