i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

字符串

Posted on 2016-12-12 13:33  shnoip  阅读(615)  评论(0)    收藏  举报

为了使程序能处理文本信息,PASCAL引入字符串类型,其值表示一个具有可变长变的字符序列。

字符串类型定义形式为:string[n]或者string
其中正整数n(1<=n<=255)表示构成字符串的字符最多个数,即通常所说的字符串最大长度。而字符串的实际长度决定于程序运行时的实际字符个数,可由标准函数length返回。若字符串说明中没有指定长度时,取缺省值255。

字符串类型定义字符串连接操作'+'(或concat函数),是将两个字符串连接生成新字符串,连接操作允许字符类型和字符串类型混合运算。

字符串常量可以通过常量说明语句
const 字串常量名:string[n]='字串';
规定其常量的串长n,并赋初值。例如:
const heading:string[7]='section';

pascal还提供了一些预定义的过程和函数用于对字符串进行操作:

1、length函数
格式:length(st)
这个函数返回串表达式st的长度,即串字符的个数,其结果类型为整型。
例如:st的值为'ABCD1234',则length(st)的值为8。

2、copy函数
格式:copy(st,pos,num)
st为串表达式,pos和num为整型表达式。copy返回一个子串,它包含st中pos开始的num个字符。如果pos超出串长,则返回一个空串;如果得到的字符在串尾之外,即pos+num超过了串长,则返回串里的那部分字符。
例如:st的值为'abcdefg',则
copy(st,4,2)返回值为'de'
copy(st,4,5)返回值为'defg'

3、pos函数
格式:pos(substr,st)
substr和st都是串表达式,其结果类型为整型。pos函数搜索st中的第一个出现的substr字符串,返回该位置值;如果没有找到,返回值为0。
例如:st的值为'abcdefg',则
pos('de',st),返回值为4
pos('ed',st),返回值为0

4、delete过程
格式:delete(st,pos,num)
st是串变量,pos和num是两个整型表达式。delete删除st中从pos开始的num个字符的子串,如pos大于st的长度,则不删除任何字符;若企图删除多于串长度的子串,即pos+num大于串长,则仅删除串内字符。
例如:st的值为'abcdefg',则
delete(st,4,2),结果为'abcfg'
delete(st,4,10),结果为'abc'

5、insert过程
格式:insert(substr,st,pos)
substr是串表达式,st是串变量,pos为整型表达式。insert将substr插入到串st的pos位置上,若pos大于st的长度,那么将substr联接到st上,若大于st的最大长度,那么截去超过部分。
例如:st的值为'abcdefg',则
insert('123',st,3),结果为'ab123cdefg'

6、str过程
格式:str(value,st)
value为整型或实型书写参量,st是串变量,书写参量是指带场宽的整型或实型数。str将value的数字值按value给出的格式转换成字符串,并把结果存到st中。
例如:i的值为2568,则str(i:6,st),给st的值为'  2568'。

7、val过程
格式:val(st,var,code)
var将串表达式st转换为与var同类型的值,并将这个值赋给var。st必须是一个按照数值常量规则来表示的数值的串,其首尾不允许有空格。var为一个整型或实型变量,code为一个整型变量,如果检测时未出错,变量code置0;否则code置为出错的第一个字符的位置,且var的值无定义。
例如:
st的值为'234',i为整型变量,则val(st,i,code),i的值为234,code的值为0。
st的值为'23X56',i为整型变量,则val(st,i,code),i的值无定义,code的值为3,表示第三个字符出错。

8、concat函数
格式:concat(s,s1,s2,…sn)
concat用于连接两个或两个以上的字符串,超出255个字符的部分将被截掉
例如:concat('AB','CDE','FGHI')的结果为'ABCDEFGHI'

例1:输入一串字符,其长度小于200,判断该串字符是否构成回文。
分析:所谓回文是指从左到右和从右到左读一串字符的值是一样的,如abcba、abba就是回文。
var
  st:string;
  i,j:byte;
begin
  write('Input a string:');
  readln(st);
  j:=length(st);
  i:=1;
  while (j>i) and (st[i]=st[j]) do begin
    i:=i+1;
    j:=j-1;
  end;
  if j<=i then writeln('Yes')
          else writeln('No');
end.

例2:输入一个十进制数,将其化成N进制数并输出(2<=N<=16)。
const
  s:string='0123456789ABCDEF';
var
  m:longint;
  i,j,k,n:byte;
  a:array[1..32] of byte;
begin
  write('Enter a number:');
  readln(m);
  write('Enter N=');
  readln(n);
  write(m,'(10)=');
  i:=0;
  while m>0 do begin
    i:=i+1;
    a[i]:=m mod n;
    m:=m div n;
  end;
  for j:=i downto 1 do write(s[a[j]+1]);
  writeln('(',n,')');
end.

例3:以字符串的形式输入仅有整数和加减号构成的表达式,输出该表达式的值。
var
  s:string;
  l,x:longint;
  h:-1..1;
begin
  write('Input:');
  readln(s);
  write(s);
  while pos(' ',s)>0 do delete(s,pos(' ',s),1);
  x:=0;
  while length(s)>0 do begin
    if s[1]='-' then begin h:=-1;delete(s,1,1);end
                else h:=1;
    if s[1]='+' then delete(s,1,1);
    l:=0;
    while (s[1] in ['0'..'9']) and (length(s)>0) do begin
      l:=l*10+ord(s[1])-48;
      delete(s,1,1);
    end;
    x:=x+h*l;
  end;
  writeln('=',x);
end.

例4:卡布列克常数:卡布列克是一个数学家,他在研究数字时发现:任意一个不是用完全相同的数字组成的四位数,如果对它们的每位数字重新排序,组成一个最大的数和一个最小的数,然后用最大的数减去最小的数,差不够四位数时补零,类推下去,最后将变成为一个固定的常数:6174,这就是卡布列克常数。例如:
6543-3456=3087
8730-378=8325
8532-2358=6174
7641-1467=6174

var
  s:string;
  n,n1,n2,i,j,e:integer;
  c:char;
begin
  repeat
    write('Input a number:');
    readln(n);
  until (n>999) and (n<9999);
  while n<>6174 do begin
    str(n,s);
    for i:=1 to 3 do
      for j:=i+1 to 4 do
        if s[i]<s[j] then begin
          c:=s[i];s[i]:=s[j];s[j]:=c;
        end;
    val(s,n1,e);
    for i:=1 to 2 do begin
      c:=s[i];s[i]:=s[5-i];s[5-i]:=c;
    end;
    val(s,n2,e);
    n:=n1-n2;
    writeln(n1,'-',n2,'=',n);
    while n<1000 do n:=n*10
  end;
end.

作业:
1、zerojudge:a009、a011、a022、a135、a224、a466、a779、b030、c012、d086、d103、d107、d124、d155、d187、d235、d275、d337、d614、d670、d671、d929

2、从键盘接收10个字符串,按长度进行降序排序,并显示排序的结果。

3、从键盘接收一段英文文本,统计其中的单词数目。文本中包括英文大小写字母、英文标点、数字和空格,并以星号“*”结束。假设每个单词只由英文字母组成,相邻单词之间可由空格、标点或回车等符号分隔,文本的总长度不超过200个字符。