第十课字符与字符串处理一、字符、字符串类型的使用(一)字符类型字符类型为由一个字符组成的字符常量或字符变量。
字符常量定义:const字符常量='字符'字符变量定义:ⅡVar字符变量:char;字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大小而定。
函数succ、pred、ord适用于字符类型。
例如:后继函数:succ('a')='b'前继函数:pred('B')='A'序号函数:ord('A')=65 ord(‘a’)=97 ord(‘0’)=48例1按字母表顺序和逆序每隔一个字母打印。
即打印出:a c e g I k m o q s u w yz x r v t p n l j h f d b程序如下:program ex8_1;var letter:char;beginfor letter:='a' to 'z' doif (ord(letter)-ord('a'))mod 2=0 then write(letter:3);writeln;for letter:='z' downto 'a' doif (ord(letter)-ord('z'))mod 2 =0 then write(letter:3);writeln;end.分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。
(二)字符串类型字符串是由字符组成的有穷序列。
字符串类型定义:type <字符串类型标识符>=string[n];var字符串变量: 字符串类型标识符;其中:n是定义的字符串长度,必须是0~255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1~n号单元中存放串的字符。
若将string[n]写成string,则默认n值为255。
例如:typeman=string[8];line=string;varname:man;screenline:line;另一种字符类型的定义方式为把类型说明的变量定义合并在一起。
例如:VARname:STRING[8];screenline:STRING;Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。
例如:varname:string;beginreadln(nsme);for i:=1 to ord(name[0])dowriteln(name[i]);语句writeln(name[i])输出name串中第i个字符。
例2求输入英文句子单词的平均长度.程序如下:program ex8_2;varch:string;s,count,j:integer;beginwrite('The sentence is :');readln(ch);s:=0;count:=0;j:=0;repeatinc(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.分析:程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,ch[j]表示ch串中的第j个位置上的字符,ord(ch[0])为ch串的串长度。
程序充分利用Turbo Pascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。
二、字符串的操作(一)字符串的运算和比较由字符串的常量、变量和运算符组成的表达式称为字符串表达式。
字符串运算符包括:1.+:连接运算符例如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'。
若连接的结果字符串长度超过255,则被截成255个字符。
若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
例如:varstr1,str2,str3:string[8];beginstr1:='Turbo ';str2:='PASCAL';str3:=str1+str2;end.则str3的值为:'Turbo PA'。
2.=、〈〉、〈、〈=、〉、〉=:关系运算符两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。
例如:'AB'〈'AC' 结果为真;'12'〈'2' 结果为真;'PASCAL '='PASCAL' 结果为假;例3对给定的10个国家名,按其字母的顺序输出。
程序如下:program ex8_3;var i,j,k:integer;t:string[20];cname:array[1..10] of string[20];beginfor i:=1 to 10 do readln(cname[i]);for i:=1 to 9 dok:=i;for j:=i+1 to 10 doif 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.分析:程序中,当执行到if cname[k]>cname[j]时,自动将cname[k]串与cname[j]串中的每一个字符逐个比较,直至遇到不等而决定其大小。
这种比较方式是计算机中字符串比较的一般方式。
三、字符串的函数和过程Turbo Pascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。
例4 校对输入日期(以标准英语日期,月/日/年)的正确性,若输入正确则以年.月.日的方式输出。
程序如下:program ex8_4;constmax:array[1..12] of byte=(31,29,31,30,31,30,31,31,30,31,30,31);varst:string;p,w,y,m,d:integer;procedure err;beginwrite('Input Error!');readln;halt;end;procedure init(var x:integer);beginp:=pos('/',st);if (p=0) or (p=1) or (p>3) then err;val(copy(st,1,p-1),x,w);if w<>0 then err;delete(st,1,p);end;beginwrite('The Date is :');readln(st);init(m);init(d);val(st,y,w);if not (length(st)<>4) or (w<>0) or (m>12) or (d>max[m]) then err;if (m=2) and (d=29)then if y mod 100=0then beginif y mod 400<>0 then err;endelse if y mod 4<>0 then err;write('Date : ',y,'.',m,'.',d);readln;end.分析:此题的题意很简单,但在程序处理时还需考虑以下几方面的问题。
1.判定输入的月和日应是1位或2位的数字,程序中用了一个过程inst,利用串函数pos,求得分隔符/所在的位置而判定输入的月和日是否为1位或2位,利用标准过程val判定输入的月和日是否为数字;2.判定月和日是否规定的日期范围及输入的年是否正确;3.若输入的月是2月份,则还需考虑闰年的情况。
例5对输入的一句子实现查找且置换的功能。
程序如下:program ex8_5;vars1,s,o:string;i:integer;beginwrite('The text:');readln(s1);write('Find:');readln(s);write('Replace:');readln(o);i:=pos(s,s1);while i<>0 do begindelete(s1,i,length(s));insert(o,s1,i);i:=pos(s,s1);end;writeln(s1);readln;end.分析:程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处理的标准过程delete、insert及标准函数pos。
练习:写出下列程序的运行结果程序1.program Program2;vara,t:string;i,j:integer;begina:=`morning`;j:= l;for i:=2 to 7 doif (a[j]<a[i])thenj:= i;j:= j-1;for i:=1 to j dowrite (a[i]);end.输出:程序2.program program2;vari,j:integer;str1,str2:string;beginstr1:='pig-is-stupid';str2:='clever';str1[1]:='d'; str1[2]:='o';i:=8;for j:=1 to 6 do beginstr1[i]:=str2[j];inc(i);end;writeln(str1);end.输出:_____________________。