20-字符数组与字符串类型.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ;

相关文档
最新文档