字符串、字符数组   
一、字符、字符串类型
字符 是一个有序的, 字符的大小顺序按其ASCⅡ代码的大小而定。函数succpredord适用于字符类型。 ord(ch)求字符ch对应的ASCII代码值;如 ord ( 'A' )结果为65 相反:chr65)结果为 'A'

字符串: 
    字符串是由字符组成的有穷序列。 
为了使程序能够处理文字信息,Turbo Pascal特别引入了字符串类型,其值表示一个具有可变长度的字符序列。
   字符串类型定义:
      var 字符串变量: string [n]  或者string
  其中正整数n(1255)表示构成字符串的字符最多个数,即string字符串类型的字符串其最大
长度不能超过255。而字符串的实际长度决定程序运行时的实际字符个数,可以由函数length返回。若字符串说明中没有指定长度,则默认n值为255
字符数组也叫紧缩数组  字符串变量其实就是紧缩型的一维字符数组。字符串变量可以象数组一样使用,且又具有与一般数组不同的附加特征,更便于字符串的操作。例如:
允许对字符串整体输入输出,如,read(ch); weite(ch);等都是合法的;
允许把字符串直接写在文本文件中;
允许对字符串变量进行赋值;等等。
下面两个定义是等价的:
var ch:packed array[1..10] of char;
var ch:string[10];             
string[10]0单元中存放串的长度,第110号单元中存放串的字符
 字符串常量可以通过常量说明语句
字符串和函数是什么
    const 字符串常量名:string[n]='字符串'
  规定其常量的串长n,并赋初值。例如:const head:string[7]='zhoufei';
1、输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。
  分析:回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符,放入数组中,并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可判断出是否为回文。
  var letter:array[1..100]of char;
    i,j:0..100;      ch:char;
begin 
 write('Input a string:'); read(ch); i:=0;
   while ch<>'.' do                        { 读入一个字符串以'.'号结束 }
     begin i:=i+1; letter[i]:=ch; read(ch) end;
   j:=1;                                         
 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.
 
数组letter定义为: var letter:array[1..100]of char; 占用100个字长。
    说明可改为紧缩方式定义:var letter:packed array[1..100]of char; 32位微机中只占用25个字长。 

  Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。
2var namestring;  i:integer;
   begin
    readlnname);
    for i=1 to ordname[0]do writelnname[i]);
   end.
      语句writelnname[i])输出name串中第i个字符。
 
二、字符串的操作
  由字符串的常量、变量和运算符组成的表达式称为字符串表达式。字符串运算符包括:

1、连接运算符 +: 如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'
  若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
  例如:var str1str2str3string[9]
     begin  str1='Turbo 'str2='PASCAL' str3=str1+str2 end
  则str3的值为:'Turbo PAS'

2、关系运算符 =、〈〉、〈、〈=、〉、〉=
  两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。
  例如:'that'< 'this'    结果为true
     '12'< '2'        结果为true;
     'PASCAL '= 'PASCAL'  结果为false
3 对给定的10个国家名,按其字母的顺序输出。
 var i,j:integer; 
  t:string[20];
 const name:array[1..10] of string[20]=( 'China', 'France', 'Canada', 'Australia',
  'Spain', 'American', 'Sweden', 'Poland', 'Turkey', 'Japan');
 begin
  for i:=1 to 9 do
   for j:=i+1 to 10 do   
    if name[i]>name[j] then
begin t:=name[i]; name[i]:=name[i]; name[i]:=t  end;
  for i:=1 to 10 do writelname[i]);
end.
输入一串字符,字符个数不超过100,且以"·"结束,判断它们是否构成回文
 分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321ABCBAAA等;先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。
 源程序如下:
program ex5_5;
var  
 letter:array[1..100] of char;
 i,j:0..100;
 ch:char;
begin
 {读入一个字符串以'.'号结束}
 write('Input a string:');
 i:=0;read(ch);
 while ch<>'.' do
 begin
  i:=i+1;letter[i]:=ch;
  read(ch)
 end;
 {判断它是否是回文}
 j:=1;
 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提供了八个标准函数和标准过程,利用它们可以灵活解决字符串解题中的一些问题。设变量sstrstr1str2均为字符串类型(string){多个字符};ch为字符类型(char){单个字符}
标准函数有:
1copystrnm)从字符串str的左边第n个开始截取m个字符;pos大于st的长度,则返回空串。  如:copy' Pascal '32)的结果为'sc '
2concatstr1str2)将两个字串连接成为一个新的字串;
    如:s:=str1+str2;同等于两串字符相加
3Length(str)求字串str的长度(字符个数);函数值字节型 byte  0255
4posstr1str2)求字串str1在字串中开始的位置;到后返回值为subst中的位置,若没到,函数值为0  :  pos'sca''pascal')结果为3
5upcase(ch)将字符ch转为大写字母,如 upcase( 'a' )结果为'A'
标准过程有:
1Val(strxcode)将数字型字串转为数字并存入变量x中;code返回st中第一个非法字符的位置,未有错,code0
    如:Val(‘768’,x,code),x值为768code为检测错误代码,若code=0表示没有错误;
2str(ns)将数字n转化为字串存入s中,如str(768s)s的结果为 '768'
3insert(str1str2n)把字串str1插入在字串str2的第n个字符之前,结果在str2中;{此过程中的str2为变量形参,具有传入传出的功能};
4delete(strnm)从字串str的第n个开始,删除m个字符,把剩余的字符存在str中,{此过程中的str为变量形参,具有传入传出的功能}; 
5有一个四位数①它是一个完全平方数②千位数和百位数相等,十位数和个位数相等。求这个四位数。
var m,n:integer;
    st:string[4];
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.
6、输入两个整数 xy0<x,y<10100),输出它们的和。
var x,y:array[0..100] of integer;      { 高精度计算 }
  st1,st2:string;
  i,j,sw1,sw2:integer;
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 }
    x[sw1-i]:=ord(st1[i])-ord('0');  {第一次循环 x[sw1-i]x[0],存放个位数 }
  for i:=sw2 downto 1 do              { st2反向存入数组y }
    y[sw2-i]:=ord(st2[i])-ord('0');
  if sw1<sw2 then sw1:=sw2;            { sw1为加法时的最大位 }
  for i:=0 to sw1 do
    begin
      x[i]:=x[i]+y[i]; 
      x[i+1]:=x[i+1]+x[i] div 10;      { 进位 }
      x[i]:= x[i] mod 10
    end;
     write(st1,'+',st2,'=');
  j:=100;
  while x[j]=0 do j:=j-1;              { 到第一个有效数位 }
  writeln
end.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。