当前位置:
文档之家› 字符数组和字符串类型(第十八课)
字符数组和字符串类型(第十八课)
字符类型
例5.14 按字母表顺序和逆序每隔一个字母打印。即打印出: a c e g I k m o q s u w y z x r v t p n l j h f d b 【分析】程序中,我们利用了字符类型是顺序类型这一特 性,直接将字符类型变量作为循环变量,使程序处理起来 比较直观。 程序如下: program ex5_14; var letter:char; begin for letter:='a' to 'z' do if (ord(letter)-ord('a'))mod 2=0 then write(letter:3); writeln; for letter:='z' downto 'a' do if (ord(letter)-ord('z'))mod 2 =0 then write(letter:3); writeln; end.
例5.19 随机输入一个长度不超过255的字符串,将其倒置后 输出。 【分析】将字符串读入到字符串变量Letters中,这里用字 符串类型来处理,让同学们更好地掌握字符处理的函数和过 程。 程序如下: Program ex5_19; Var letters : string; i,len : integer; ch : char; begin readln(letters); len : =length(letters); for i=1 to len do begin ch : =copy(letters,len,1); delete(letters,len 1); insert(ch,letters,i); end writeln(letters); end. 运行结果 :
字符数组和字符串类型
青奥赛辅导
无论数组的下标有几个,类型如何,但数组中全体元素的类型必须相同。数 组元素的类型可以是任何类型,当它是字符型时,我们称它为字符数组。 由于字符数组与字符串类型的应用是计算机非数值处理的重要方面之一, 所以我们把它们两个放在一起进行讨论。 下面我们举例说明字符数组的应用。
例5.17 正确的邮箱地址格式是‚用户名@服务器名‛,输 入一个邮箱地址判断它是不是合法的邮箱地址。 【分析】此题的题意很简单,在判断邮箱地址合法性上需 要考虑: 1.邮箱地址字符串中是否包括字符‚@”; 2.@字符不能出现在第一个位置也不能出现字符 的末尾。 程序如下: Program ex5_17; var p : integer; s : string; begin readln(s); p := pos('@',s); if (p>1) and (p<length(s)) then writeln('ok') else writeln('error'); BA
例5.15 求输入英文句子单词的平均长度。 【分析】程序中,变量s用于存句子中英文字母的总数,变量count用于存放句 子中单词的个数,ch[j]表示ch串中的第j个位置上的字符,ord(ch[0])为ch 串的串长度。程序充分利用Free Pascal允许直接通过字符串下标得到串中的字 符这一特点,使程序比较简捷。 program ex5_15; var ch:string; // 定义ch为字符串类 s,count,j:integer; begin write('The sentence is :'); readln(ch); // 读入整行内容 s:=0; count:=0 j:=0; repeat inc(j); if not (ch[j] in [':',',',';','''','!','?','.',' ']) then inc(s); //[…]这是集合的表式 if ch[j] in[' ','.','!','?'] then inc(count); until (j=ord(ch[0])) or (ch[j] in ['.','!','?']); if ch[j]<>'.' then writeln('It is not a sentence.') else writeln('Average length is ',s/count:10:4); //结果保留二位小数 end.
例5.18 对输入的一句子实现查找且置换的功能。 【分析】程序中,输入要查找的字符串及要置换的字符串,充 分用上了字符串处理的标准过程delete、insert及标准函数 pos。 程序如下: Program ex5_18; var s1,s,o : string; i : integer; begin readln(s1); //输入原句 readln(s); //输入要查找的内容 readln(o); //输入替换的目标内容 i : =pos(s,s1); //在s1中查找s,若找不到返回0 while i<>0 do begin delete(s1,i,length(s)); //在s1中从第i位开始删 除length(s)个字符 insert(o,s1,i); //把o的内容插入s1的第i个位置 i : =pos(s,s1); end; writeln(s1); end.
字符数组和字符串类型
字符类型为由一个字符组成的字符常量或字符变量 。
字符常量定义:
const 字符常量=‘字符’ 字符变量定义: Var 字符变量:char; 字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大小而定。函数succ、pred、ord适用于 字符类型。 例如:后继函数:succ(‘a’)=‘b’ 前继函数:pred(‘B’)=‘A’ 序号函数:ord(‘A’)=65
由字符串的常量、变量和运算符组成的表达式称为字符串表达式。 字符串运算符包括: 1.+:连接运算符 例如:‘Free ’+‘PASCAL’的结果是‘Free PASCAL’。 若连接的结果字符串长度超过255,则被截成255个字符。若连接后 的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度 时,超过部份字符串被截断。 例如:var str1,str2,str3:string[8]; begin str1:=‘Free ’; str2:=‘PASCAL’; str3:=str1+str2; end. 则str3的值为:‘Free PA’。 2.=、〈〉、〈、〈=、〉、〉=:关系运算符 两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇 到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。 例如:‘AB’〈‘AC’ 结果为真; ‘12’〈‘2’ 结果为真;
‘PASCAL ’=‘PASCAL’ 结果为假;
字符串的操作
例5.16 对给定的10个国家名,按其字母的顺序输出。 【分析】程序中,当执行到if cname[k]>cname[j]时,自 动将cname[k]串与cname[j]串中的每一个字符逐个比较, 直至遇到不等而决定其大小。这种比较方式是计算机中字 符串比较的一般方式。 程序如下: proram ex5_16; var i,j,k:integer; t:string[20]; cname:array[1..10] of string[20]; begin for i:=1 to 10 do readln(cname[i]); for i:=1 to 9 do // 选择 排序 begin k:=i; for j:=i+1 to 10 do if cname[k]>cname[j] then k:=j; t:=cname[i];cname[i]:=cname[k];cname[k]:=t; end; for i:=1 to 10 do writeln(cname[i]); end.
字符串的函数和过程 Free Pascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串 的问题可以灵活解决。 函数和过程名 功 能 说 明 copy(s,m,n) 取s中第m个字符开始的n个字符 若m大于s的长度,则返回空串;否则,若m+n大于s的长度,则截断 length(s) 求s的动态的长度 返回值为整数 pos(sub,s) 在s中找子串sub 返回值为sub在s中的位置,为byte型 insert(sour,s,m) 在s的第m个字符位置处插入子串sour 若返回串超过255,则截断 delete(s,m,n) 删除s中第m个字符开始的n个字符串 若m大于s的长度,则不删除;否则,若m+n大于s的长度,则删除到结尾 str(x[:w[:d]],s) 将整数或实数x转换成字符串s w 和 d是整型表达式,意义同带字宽的write语句 val(s,x,code) 将字符串S 转换成整数或实数x 若S中有非法字符,则code存放非法字符在S中的下标;否则,code为零。code为 整型 upcase(ch) 将字母ch转换成大写字母 若ch不为小写字母,则不转换
字符串类型
Free Pascal中,一个字符串中的字符可以通过其对应的下 标灵活使用。 例如: var name:string; begin readln(name); for i:=1 to ord(name[0])do writeln(name[i]); //输出name串中的第i个字符 end. 语句writeln(name[i])输出name串中第i个字符。
其中:n是定义的字符串长度,必须是0~255之间的自然整数,第0号单元中存放串的实际长 度,程序运行时由系统自动提供,第1~n号单元中存放串的字符。若将string[n]写成string,则 默认n值为255。