《PASCAL数据结构之串.ppt》由会员分享,可在线阅读,更多相关《PASCAL数据结构之串.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、串串濮阳市第一高级中学濮阳市第一高级中学 王晓斌王晓斌 2011.10.05字符变量定义Varx:char;字符类型是一个有序类型,字符的大小顺序按ASCII码的大小决定。相关的函数有succ、pred、ord、chr字符字符Ord(x)对于字符来说是求字符对应的序号就是ascii码Chr(x)求ascii码对应字符ASCII 编码是由美国国家标准委员会制定的一种包括数字、字母、编码是由美国国家标准委员会制定的一种包括数字、字母、通用符号和控制符号在内的字符编码集,全称叫美国国家信息交通用符号和控制符号在内的字符编码集,全称叫美国国家信息交换标准代码换标准代码回顾知识点回顾知识点字符类型的概念
2、回顾字符类型的概念回顾 字符是一个有序类型字符是一个有序类型,字符的大小顺序按其字符的大小顺序按其ASC代码的大小而定。代码的大小而定。函数函数succ、pred、ord适用于字符类型。适用于字符类型。例如:后继函数:例如:后继函数:succ(a)=b前继函数:前继函数:pred(B)=A序号函数:序号函数:ord(A)=65 字符函数:字符函数:chr(65)=A 注意:注意:AZ的的ASCII码是连续的;码是连续的;az的的ASCII码是连续的;码是连续的;字符型数据可以是字母、符号、数字字符型数据可以是字母、符号、数字(0-9)等等ASCII码的所有码的所有字符。字符。Pascal支持扩
3、展支持扩展ASCII码,共包括码,共包括256个字符。但个字符。但非印刷非印刷字符是不能在标准显示上显示或打印输出。字符是不能在标准显示上显示或打印输出。在计算机内部,字符集的元素是在计算机内部,字符集的元素是以该元素在字符集内的顺序位以该元素在字符集内的顺序位置来标记的置来标记的,位置取值范围为,位置取值范围为0255,我们称这些整数为字符在,我们称这些整数为字符在字符集内的字符集内的序数值或序号序数值或序号。每个字符型数据在内存中。每个字符型数据在内存中占一个字节占一个字节。将将字符用单引号括起来,即成字符常数字符用单引号括起来,即成字符常数,如,如,X,7,?。字符常数可按字符的序数值确
4、定大小关系,也就是说它。字符常数可按字符的序数值确定大小关系,也就是说它们的大小由它们所对应的们的大小由它们所对应的ASCII码值决定,如:码值决定,如:Aa。由于采用由于采用ASCII码,字符依码,字符依ASCII码序号排列。这样,字符与码序号排列。这样,字符与ASCII码序号有一一对应的映射关系。码序号有一一对应的映射关系。ord(1=1)=1 trueord(1=5)=0 falseOrd(X)函数返回顺序(离散)类型的序号)函数返回顺序(离散)类型的序号整型、字符型、布尔型、子界型、枚举型整型、字符型、布尔型、子界型、枚举型1.整型返回本身整型返回本身2.字符型返回对应的字符型返回对应
5、的ASCII(美国国家标准交换码美国国家标准交换码)序数值序数值3.布尔型假为布尔型假为0、真为、真为14.最后两种返回自变量在集中的序号最后两种返回自变量在集中的序号0-48A-65a-97将数字8转换为一个字符“8”的表达式为()A.chr(8)B.ord(8)-ord(0)C.chr(8+ord(0)D.chr(ord(8)chr自变量对应的字符自变量对应的字符 字符型字符型 ord 自变量对应的序号自变量对应的序号longint 例:例:chr(66)=Bord(A)=65Ord(8)8,正确的是:正确的是:Ord(8)=Ord(0)+8=48+8=56若若ch是数字字符,则是数字字符
6、,则Ord(ch)-Ord(0)是该数字字符的是该数字字符的数值数值。例如:例如:Ord(8)-Ord(0)=8题一题一对于字符,就是对应的字符与序号之间的关系对于字符,就是对应的字符与序号之间的关系例题一例题一例题一例题一将任一大写字母将任一大写字母,转换成小写字母。转换成小写字母。【问题分析】假设变量是x为一大写字母,我们仔细观察ASCII码表发现小写字母与大写字母之间的差为一定值,因同一个字母的大写和小写ASC码相差32,因此,我们只要将大写字母的ASCII值加上小写与大写字母之差,即可得到该字母的小写字母的ASCII值:chr(ord(x)+32)Programp6;Varx,y:ch
7、ar;beginreadln(x);y:=chr(ord(x)+32);writeln(y);end.题二题二 按字母表顺序和逆序每隔一个字母打印。即打印出:按字母表顺序和逆序每隔一个字母打印。即打印出:按字母表顺序和逆序每隔一个字母打印。即打印出:按字母表顺序和逆序每隔一个字母打印。即打印出:a c e g I k m o q s u w ya c e g I k m o q s u w yz x r v t p n l j h f d bz x r v t p n l j h f d b程序如下:程序如下:program ex8_1;var ch:char;beginfor ch:=a t
8、o z doif(ord(ch)-ord(a)mod 2=0 then write(ch:3);writeln;for ch:=z downto a doif(ord(ch)-ord(z)mod 2=0 then write(ch:3);writeln;end.分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观字符类型变量作为循环变量,使程序处理起来比较直观。题三:输入一串字符,字符个数不超过题三:输入一串字符,字符个数不超过100,且以,且以“.”结束。结束。判断它们是否构成回文
9、。判断它们是否构成回文。分析:回文指从左到右和从右到左读一串字符的值是一样的,分析:回文指从左到右和从右到左读一串字符的值是一样的,如如12321,ABCBA,AA等。先读入要判断的一串字符等。先读入要判断的一串字符,放入数组中,放入数组中,并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可判断出是否为并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可判断出是否为回文。回文。var letter:array1.100of char;i,j:0.100;ch:char;begin read(ch);i:=0;while ch.do 读入一个字符串以读入一个字符串以.号结束
10、号结束 begini:=i+1;letteri:=ch;read(ch)end;j:=1;while(j=ithen writeln(Yes.)else writeln(No.);end.abcdfdcbaabcddcbajiji字符串处理字符串处理串(即字符串)是一种特殊的线性表,它的串(即字符串)是一种特殊的线性表,它的数据元素由字符组成,计算机非数值处理的数据元素由字符组成,计算机非数值处理的对象经常是字符串数据对象经常是字符串数据.串是由零个或多个串是由零个或多个字符组成的有穷序列字符组成的有穷序列.字符串的定义 字符串是由字符串是由字符串是由字符串是由字符字符字符字符组成的有穷序列。
11、组成的有穷序列。组成的有穷序列。组成的有穷序列。一个字符串中的字符可以一个字符串中的字符可以一个字符串中的字符可以一个字符串中的字符可以通过其对应的下标灵活使用。通过其对应的下标灵活使用。通过其对应的下标灵活使用。通过其对应的下标灵活使用。字符串类型定义:type=stringn;var字符串变量:字符串类型标识符;其中:n是定义的字符串长度,必须是0255之间的自然整数,第第0 0号单元中存放串的实际长度号单元中存放串的实际长度,程序运行时由系统自动提供,第1n号单元中存放串的字符。若将stringn写成string,则默认n值为255。如:typeman=string8;var name:
12、man;字符串的输入和输出字符串的输入和输出字符串的输入和输出字符串的输入和输出:read(name),write(name);一般我们可直接定义为一般我们可直接定义为Var Name:string;字符串的操作字符串的操作(一)字符串的运算和比较(一)字符串的运算和比较 由字符串的常量、变量和运算符组成的表达式称为由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串表达式。字符串表达式。字符串表达式。字符串运算符包括:字符串运算符包括:1 1+:连接运算符:连接运算符例如:例如:FreeFree+PASCAL+PASCAL的结果是的结果是 FreeFree PASCAL PASC
13、AL。若连接的结果字符串长度超过若连接的结果字符串长度超过255255,则被截成,则被截成255255个字符个字符。若连接后。若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。时,超过部份字符串被截断。例如:例如:varvarstr1str1,str2str2,str3str3:string8string8;beginbeginstr1str1:=FreeFree ;str2str2:=PASCAL=PASCAL;str3str3:=str1+str2=str1+str2;endend则
14、则str3str3的值为:的值为:FreeFree PA PAS S。2、关系运算符=、=、=:关系运算符:关系运算符两个字符串的比较规则为,从左到右按照两个字符串的比较规则为,从左到右按照ASCASC码值逐个比码值逐个比较,遇到较,遇到ASCASC码不等时码不等时,规定规定ASCASC码值大的字符所在的字码值大的字符所在的字符串为大。符串为大。例如:例如:ABABAC AC 结果为真;结果为真;12122 2 结果为真;结果为真;PASCAL =PASCAL PASCAL =PASCAL 结果为假;结果为假;串的存储串的存储串的存储方法与线性表的一般存储方法类似。不同点在于:因为串的存储方法
15、与线性表的一般存储方法类似。不同点在于:因为串的每个结点只含一个字符,若要提高存储密度串的每个结点只含一个字符,若要提高存储密度(即存储结点中数即存储结点中数据域占用的存储量与整个存储结点用的存储量之比据域占用的存储量与整个存储结点用的存储量之比),则需作出特,则需作出特殊的考虑。串的常见存储结构在顺序存储、链接存储和索引存储。殊的考虑。串的常见存储结构在顺序存储、链接存储和索引存储。串的顺序存储串的顺序存储串的顺序存储结构有时称为顺序串。在顺序串中,串中的字符串的顺序存储结构有时称为顺序串。在顺序串中,串中的字符被依次存放在一组连续的存储单元里。一般的来说,一个字节被依次存放在一组连续的存储
16、单元里。一般的来说,一个字节(8位二进制位二进制)可以表示一个字符可以表示一个字符(即该字符的即该字符的ASCII码码)。因此,一个。因此,一个内存单元可以存储多个字符。例如,一个内存单元可以存储多个字符。例如,一个32位的内存单元可以存位的内存单元可以存储储4个字符个字符(即即4个字符的个字符的ASCII码码)。因此,串的顺序存储有两种方。因此,串的顺序存储有两种方法:一种是每个单元只存一个字符,这称为非紧缩格式。另一种法:一种是每个单元只存一个字符,这称为非紧缩格式。另一种是每个单元存放多个字符,这称为紧缩格式。是每个单元存放多个字符,这称为紧缩格式。在字节编址和非紧缩格式的字编址下,顺序
17、串的类型定义与顺在字节编址和非紧缩格式的字编址下,顺序串的类型定义与顺序表类似,可用含字符数组的记录描述:序表类似,可用含字符数组的记录描述:const maxlen=const maxlen=串的最大长度串的最大长度;type string=recordtype string=recordch:array1.maxlen of char;curlen:0.maxlenend;在紧缩格式的字编址方式的类型定义可借助于紧缩数组,即只在紧缩格式的字编址方式的类型定义可借助于紧缩数组,即只需将上述定义的需将上述定义的ch域改为:域改为:ch:packed array 1.maxlen of char
18、;容易看出,紧缩格式的存储密度高,节省存贮空间,但对串的容易看出,紧缩格式的存储密度高,节省存贮空间,但对串的单个字符操作不够方便。而非紧缩格式存储密度低,但操作比单个字符操作不够方便。而非紧缩格式存储密度低,但操作比较方便。较方便。串的链接存储串的链接存储串的链式储结构有时称为链串。链串的组织式与一般的链表类似。串的链式储结构有时称为链串。链串的组织式与一般的链表类似。主要的区别在于,链串中的一个存储点可以存储多个字符。通常主要的区别在于,链串中的一个存储点可以存储多个字符。通常将链串中每个存储结点所存储的字符个数称为结点大小。将链串中每个存储结点所存储的字符个数称为结点大小。当结点大小大于
19、当结点大小大于1(例如例如4)时,链串的最后一个结点的各个数据域时,链串的最后一个结点的各个数据域不一定总能全被字符占满。此时,应在这些未占用的数据域里补不一定总能全被字符占满。此时,应在这些未占用的数据域里补上不属于字符集的特殊符号上不属于字符集的特殊符号(例如例如#),以示区别。,以示区别。链串的类型定义为:链串的类型定义为:const nodesize=const nodesize=用户定义的结点大小用户定义的结点大小;type pointer=type pointer=node;node;node=recordch:arry1.nodesize of char;next:pointer
20、end;strlist=pointer;当结点大小为当结点大小为1时,可将时,可将ch域简单地定义为:域简单地定义为:ch:char;链串结点大小的选择与顺序串的格式选择类似。结点大小为链串结点大小的选择与顺序串的格式选择类似。结点大小为1时时存储密度低但操作方便而结点大小大于存储密度低但操作方便而结点大小大于1时存储密度高但操作不方时存储密度高但操作不方便。便。串的存储结构 1.静态存储结构 数组 s:array 1.maxsize of char;紧缩数组:s:packed array 1.maxlen of char;2.动态存储结构 const chunksize=chunk;chun
21、k=record ch:array q.chunksize of char;next:pointer;end;3.堆结构每次从自由空间中动态分配一块内存给串,并建立空间的起始地址阅读理解:看程序写答案阅读理解:看程序写答案program program2;var i,j:integer;str1,str2:string;begin str1:=pig-is-stupid;str2:=clever;str11:=d;str12:=o;i:=8;for j:=1 to 6 do begin str1i:=str2j;inc(i);end;writeln(str1);end.注意:注意:INC(N)
22、自增,)自增,DEC(N)自减)自减str1pig-is-stupidstr2cleverdig-is-stupiddog-is-cleverdog-is-stupid阅读理解:看程序写答案阅读理解:看程序写答案programprogram2;varstr:string;i:integer;beginstr:=Today-is-terrible!;fori:=7to11doifstri=-thenstri-1:=x;fori:=13downto1doifstri=tthenstri+1:=e;writeln(str)end.输出:_字符串的函数和过程 Pascal Pascal提供了八个标准函
23、数和标准过程,见下表,利用这些标准函提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。数与标准过程,一些涉及到字符串的问题可以灵活解决。操作操作类型类型 作用作用 返回返回值值例子例子length(s)length(s)函数函数 求字符串求字符串s s的长度的长度整型整型s:=123456789;s:=123456789;l:l:=length(s)length(s);l;l的值为的值为99copycopy(s,w,k)s,w,k)函数函数复制复制s s中从中从w w开始的开始的k k位位字符字符串串s:=123456789;s:=12345
24、6789;s1s1:=:=copy(s,3,5)copy(s,3,5);s1;s1的值是的值是3456734567val(s,k,code)val(s,k,code)过程过程将字符串将字符串s s转为数值,转为数值,存在存在k k中;中;codecode是错误是错误代码代码var s:string;k,code:integer;var s:string;k,code:integer;beginbegins:=1234;s:=1234;val(s,k,code)val(s,k,code);write(k);k=1234write(k);k=1234str(i,str(i,s s)过程过程 将数值
25、将数值i i转为字符串转为字符串s si:=1234;i:=1234;str(i,s)str(i,s);write(s);s=1234write(s);s=1234Delete(s,w,Delete(s,w,k k)过程过程在在s s中删除从第中删除从第w w位开位开始的始的k k个字符个字符s:=Honest Abe Lincoln;s:=Honest Abe Lincoln;Delete(s,8,4)Delete(s,8,4);Writeln(s);Honest Lincoln Writeln(s);Honest Lincoln Insert(s1,S,Insert(s1,S,w)w)过程
26、过程 将将s1s1插到插到s s中第中第w w位位S:=Honest Lincoln;S:=Honest Lincoln;Insert(Abe,S,8)Insert(Abe,S,8);Honest Abe Lincoln Honest Abe Lincoln Pos(c,S)Pos(c,S)函数函数 求子串求子串c c在在s s中的位置中的位置整型整型S:=123.5;S:=123.5;i i:=:=Pos(Pos(.,S);,S);ii的值为的值为4 4+运算符运算符将两个字符串连接起将两个字符串连接起来来s1:=1234;s1:=1234;s2:=5678;s2:=5678;s:=s:=s
27、1+s2s1+s2;12345678;12345678例例1:找出所有的四位回文数:找出所有的四位回文数:(回文数就是一个数从左往右读与从右往左读都是同一个数)(回文数就是一个数从左往右读与从右往左读都是同一个数)或者用如下程序:或者用如下程序:var n:integer;s,t:string;Begin for n:=10 to 99 do begin str(n,s);t:=s+s2+s1;write(s:6);end;end.var s:string4;n:integer;Begin for n:=1000 to 9999 do Begin str(n,s);if(s1=s4)and(s
28、2=s3)then write(n:6);end;end.v 字符串的输入与输出例例2 2 输入两串字母,并按字典顺序将其输出。输入两串字母,并按字典顺序将其输出。var str1,str2:string;var str1,str2:string;beginbegin readln(str1);readln(str1);readln(str2);readln(str2);if str1str2 then if str1str2 then begin begin writeln(str1);writeln(str1);writeln(str2);writeln(str2);end end els
29、e begin else begin writeln(str2);writeln(str2);writeln(str1);writeln(str1);end;end;end.end.例例3、对输入的一句子实现查找且置换的功能。对输入的一句子实现查找且置换的功能。分析分析:程序中程序中,输入要查找的字符串及要置换的字符串输入要查找的字符串及要置换的字符串,充分用上了字符充分用上了字符串处理的标准过程串处理的标准过程delete、insert及标准函数及标准函数pos。程序如下程序如下:program ex program ex3 3;var s1,s,o:string;var s1,s,o:st
30、ring;i:integer;i:integer;beginbeginwrite(write(The text:The text:);readln(s1););readln(s1);write(write(Find:Find:);readln(s););readln(s);write(write(Replace:Replace:);readln(o););readln(o);i:=pos(s,s1);i:=pos(s,s1);while i0 do beginwhile i0 do begin delete(s1,i,length(s);delete(s1,i,length(s);insert
31、(o,s1,i);insert(o,s1,i);i:=pos(s,s1);i:=pos(s,s1);end;end;writeln(s1);writeln(s1);readln;readln;end.end.例例4 4、对给定的对给定的1010个国家名,按其字母的顺序输出。个国家名,按其字母的顺序输出。program ex4;var i,j,k:integer;t:string20;cname:array1.10 of string20;beginfor i:=1 to 10 do readln(cnamei);for i:=1 to 9 dobegink:=i;for j:=i+1 to 1
32、0 doif cnamekcnamej then k:=j;t:=cnamei;cnamei:=cnamek;cnamek:=t;end;for i:=1 to 10 do writeln(cnamei);end.分析:这是一个选择法排序的应用,程序中,当执行到分析:这是一个选择法排序的应用,程序中,当执行到if cnamekcnamej时,时,自动将自动将cnamek串与串与cnamej串中的每一个字符逐个比较,直至遇到不等而决串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方式是计算机中字符串比较的一般方式。定其大小。这种比较方式是计算机中字符串比较的一般方式。一轮下来找到最小
33、的字符串的下标,然一轮下来找到最小的字符串的下标,然后再交换而不是找到一个就交换,这样后再交换而不是找到一个就交换,这样少了很多次的交接过程,让程序执行效少了很多次的交接过程,让程序执行效率大大提高。率大大提高。Japan Poland Spain Australia China Chile Denmark Greece India IranCname12345678910K象一个哨兵一样标识在象一个哨兵一样标识在查找范围内查找范围内的最小值的最小值例例例例5 5:有一个四位数:有一个四位数:有一个四位数:有一个四位数它是一个完全平方数它是一个完全平方数它是一个完全平方数它是一个完全平方数千位
34、数和千位数和千位数和千位数和百位数相等,十位数和个位数相等。求这个四位数。百位数相等,十位数和个位数相等。求这个四位数。百位数相等,十位数和个位数相等。求这个四位数。百位数相等,十位数和个位数相等。求这个四位数。var m,n:integer;st:string4;begin for n=32 to 99 do begin m:=n*n;str(m,st);if(copy(st,1,1)=copy(st,2,1)and(copy(st,3,1)=copy(st,4,1)then writeln(m)end end.经典运用之经典运用之“最长公共子字符串最长公共子字符串”题目:我们把一个字符串中
35、在两个字符串中找到最长公共子串;题目:我们把一个字符串中在两个字符串中找到最长公共子串;例如:由键盘依次输入三个字符串为例如:由键盘依次输入三个字符串为 What is local bus?What is local bus?Name some local buses.Name some local buses.local bus is a high speed I/O bus close to the processer.local bus is a high speed I/O bus close to the processer.则最长公共子串为则最长公共子串为local busloca
36、l bus。题目分析:题目分析:若存在公共子串,则子串肯定存在在两个字符串若存在公共子串,则子串肯定存在在两个字符串st1,st2st1,st2中中,所以所以1.1.两个字符串的公共自字符串的长度肯定两个字符串的公共自字符串的长度肯定l=min(length(st1),length(st2);l=min(length(st1),length(st2);2.2.因为我们要求最长公共子串,所以我们可以先设子串因为我们要求最长公共子串,所以我们可以先设子串=st1(=st1(较短较短),然后利,然后利用用pospos函数在函数在st2st2中查找子串中查找子串pos(st,st2),pos(st,s
37、t2),如果我们找到了则既为所求。如果我们找到了则既为所求。否则我们将尝试长度为否则我们将尝试长度为l:=l-1l:=l-1的的st1st1的子字符串(利用函数的子字符串(利用函数str:=copy(st1,1,l),copy(st1,2,l)str:=copy(st1,1,l),copy(st1,2,l)直到找到为止。直到找到为止。program search(input,output);program search(input,output);var str1,str2,str:string;var str1,str2,str:string;l1,l2,q,a,:integer;flag:
38、boolean;l1,l2,q,a,:integer;flag:boolean;布尔形变量它的值只有布尔形变量它的值只有truetrue,falsefalsebeginbegin flag:=false flag:=false;标识有没有找到最大公共子字符串标识有没有找到最大公共子字符串 readln(str1);readln(str2);readln(str1);readln(str2);输入两个字符串输入两个字符串 l1:=length(str1);l2:=length(str2);l1:=length(str1);l2:=length(str2);用用lengthlength函数求两个字
39、符串的长度函数求两个字符串的长度 if l1l2 thenif l1l2 then begin str:=str2;str2:=str1;str1:=str end;);begin str:=str2;str2:=str1;str1:=str end;);将较短的字符串将较短的字符串-str1,-str1,较长的字符串较长的字符串-str2-str2 q:=length(str1 q:=length(str1););for a:=q downto 1 do for a:=q downto 1 do 公共子字符串的长度依次减少公共子字符串的长度依次减少 for b:=1 to q do for
40、b:=1 to q do 起始位置起始位置1-q1-q begin begin str:=copy(str1,b,astr:=copy(str1,b,a););取长度为取长度为a,a,第第b b个位置开始的字符串为假定的公共个位置开始的字符串为假定的公共子字符串子字符串 if pos(str,str2)0 then if pos(str,str2)0 then 用用pospos函数来找函数来找str2str2中有没有此字符串中有没有此字符串 begin write(str);flag:=true;exit;end begin write(str);flag:=true;exit;end 如果有
41、既为所求,输出,退出如果有既为所求,输出,退出循环循环 end;end;if flag=false then writeln(if flag=false then writeln(no matchno match););如果始终没有找到,则输出没有如果始终没有找到,则输出没有 end.end.类型类型数值范围数值范围占字节数占字节数格式格式shortint-128.1281带符号带符号8位位inteter-32768.327672带符号带符号16位位longint-2147483648.21474836474带符号带符号32位位byte0.2551带符号带符号8位位word0.655352带符
42、号带符号16位位类型类型数值范围数值范围占字节数占字节数有效位数有效位数real2.9e-39.1.7e38611.12single1.5e-45.3.4e3847.8double5.0e-324.1.7e308815.16extended3.4e-4932.1.1e49321019.20comp-263+1.263-1819.20输入两个整数输入两个整数 x x、y y(0 x,y100 x,y10100100),输出它们的和),输出它们的和 var x,y:array0.100 of integer;高精度计算高精度计算 st1,st2:string;i,j,sw1,sw2:integer
43、;begin write(input x:);readln(st1);x,y作为字符串读入作为字符串读入 write(input y:);readln(st2);sw1:=length(st1);sw2:=length(st2);记录数组记录数组x,y的位数的位数 fillchar(x,sizeof(x),0);fillchar(y,sizeof(y),0);数组数组x,y的元素赋的元素赋0 for i:=sw1 downto 1 do 将将st1反向存入数组反向存入数组x中中 xsw1-i:=ord(st1i)-ord(0);第一次循环第一次循环 xsw1-i为为x0,存放个位数存放个位数
44、for i:=sw2 downto 1 do 将将st2反向存入数组反向存入数组y中中 ysw2-i:=ord(st2i)-ord(0);if sw1=A)and(siz then/如果修改后的字符超过如果修改后的字符超过z si:=chr(ord(si)-26);/将该字符减将该字符减26 end else/开始处理小写字符开始处理小写字符 begin si:=chr(ord(si)+3);/计算该小写字符后面的第三个字符计算该小写字符后面的第三个字符 if siz then/如果该字符超过如果该字符超过z si:=chr(ord(si)-26);/将该字符减去将该字符减去26 end;en
45、d;writeln(s);/输出加密后的字符串输出加密后的字符串end.练习三:数码排序 设有n个正整数,将他们连接成一排,组成一个最大的多位整数.例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213。又如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。程序输入:NN个数程序输出:连接成的多位数分析:组成最大的数,顾名思义就是第一位永远都是最大的,即对真个数进行第一位排序,然后第二位将数字先转换为字符串,比较字符串,然后再按字符串大小数排序,再转换为整数,最后输出program maxnum;var n:integer;a:array1.1
46、00of longint;/存放整数存放整数 s:array1.100of string;/将整数转换为字符串将整数转换为字符串 stemp:string;/字符串临时变量字符串临时变量 ok:integer;/字符串转换为整数错误标志字符串转换为整数错误标志 i,j,k:integer;/循环变量循环变量begin read(n);/读入要组合的整数个数读入要组合的整数个数 for i:=1 to n do begin read(ai);/读入整数到数组读入整数到数组a中中 str(ai,si);/将整数转换为字符串保存在将整数转换为字符串保存在s数组中数组中 end;for i:=1 to
47、 n-1 do/字符串排序,冒泡处理字符串排序,冒泡处理 for j:=i+1 to n do if si3)then err;val(copy(st,1,p-1),x,w);if w0 then err;delete(st,1,p);end;begin write(The Date is:);readln(st);init(m);init(d);val(st,y,w);if not(length(st)4)or(w0)or(m12)or(dmaxm)then err;if(m=2)and(d=29)then if y mod 100=0 then begin if y mod 4000 th
48、en err;end else if y mod 40 then err;write(Date:,y,.,m,.,d);readln;end.模式匹配模式匹配串的模式匹配即子串定位是一种重要的串运算。设串的模式匹配即子串定位是一种重要的串运算。设s和和t是给定的是给定的两个串,在主串两个串,在主串s中找到等于子串中找到等于子串t的过程称为模式匹配,如果在的过程称为模式匹配,如果在s中找到等于中找到等于t的子串,则称匹配成功,函数返回的子串,则称匹配成功,函数返回t在在s中的首次出中的首次出现的存储位置现的存储位置(或序号或序号),否则匹配失败,返回,否则匹配失败,返回-1。t也称为模式。也称为
49、模式。为了运算方便,设字符串的长度存放在为了运算方便,设字符串的长度存放在0号单元,串值从号单元,串值从1号单号单元存放,这样字符序号与存储位置一致。元存放,这样字符序号与存储位置一致。(Pascal语言语言pos()函数函数返回的是首位置或返回的是首位置或0)例如:例如:设主串设主串s=ababcabcacbab,模式,模式t=abcac此算法太难,下次讲课给大家详细讲解,此此算法太难,下次讲课给大家详细讲解,此部分可以略过不看,直接做后面练习题部分可以略过不看,直接做后面练习题模式匹配基本思想基本思想:从主串 s 的第一个字符起和模式的第一个字符比较之,若相等,则继续逐个比较后序字符,否则
50、从主串的第二个字符起再重新和模式的字符比较之。依次类推,直至模式 t 中的每个字符依次和主串s 中的一个连续字符序列相等,则称匹配成功,否则匹配不成功。这种算法也叫BF算法。BF算法 function bf(p,s:string):integer;求模式串 t 在主串 s 中的位置的定位函数 var i,j:integer begin i:=1;j:=1 指针初始化 WHILE(i=length(s)and(j length(p)THEN bf:=i length(p)else bf:=0;END;end;KMP(Knuth-Morris-Pratt)算法KMP的基本原理由(1)可知,pj-k