您现在的位置:小学生自学网>> 信息>> pascal语言>> 基础教程

pascal第十五讲:字符与字符串处理

作者: 来源: 发布时间:2009年05月12日 点击数:
 

一、字符与字符串类型的使用

Var 字符变量名:char;

字符类型是一个有序类型,字符的大小顺序按ASCII码的大小决定。相关的函数有succ、pred、ord、chr等。

VAR A:CHAR;

BEGIN

READLN(A);

WRITELN('A:',A);

WRITELN('SUCC(A):',SUCC(A));

WRITELN('PRED(A):',PRED(A));

WRITELN('ORD(A):',ORD(A));

WRITELN('CHR(ORD(A)):',CHR(ORD(A)));

END.

例:按字母表顺序和逆序每隔一个字母打印。即打印出:

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

for i:=1 to 13 do write(chr(63+2*i):4);writeln;

for i:=1 to 13 do write(chr(92-2*i):4);writeln

 

字符串

〖语法分析〗

字符串用于存放整批的字符数据。通常编程中使用字符串存放字符化了的数字数据。如高精度运算时存放操作数和运算结果。字符串可以看作是特殊的字符串数组来处理。当然,它也有自已的特点。下面是字符串定义的格式:
var s:string; s1:string[15];  s[1] s[2] … s[255]  s[0]  ord(s[0])
字符串定义时,如不指定长度,则按该类型的最大长度(255个字符)分配空间,使用时最大可用长度为255个;如果在中括号中给出一个具体的值(1—255之间),则按这个值的大小分配空间。使用时,最大的可用长度即为该值。

1、字符串的输入、输出:
字符串类型既可按数组方式输入、输出,也可直接输入、输出:readln(s);writeln(s);多个字符串输入时以回车作为数据间的分隔符;每个readln语句只能读入一个字符串。

2、有关字符串的操作:

操作

类型

作用

返回值

例子

length(s)

函数

求字符串 s的长度

整型

s:='123456789';
l:=length(s);{l 的值为 9}
字符串的长度存放在 s[0]中, ord(s[0])的值与 length(s)的值相同。

copy ( s,w,k)

函数

复制 s中从 w开始的 k位

字符串

s:='123456789';
s1:=copy(s,3,5);{s1 的值是 '34567'}

val(s,k,code)

过程

将字符串 s转为数值,存在 k中; code是错误代码

 

var s:string;k,code:integer;
begin
s:='1234';
val(s,k,code);
write(k);{k=1234}

str(i,s)

过程

将数值 i转为字符串 s

 

i:=1234;
str(i,s);
write(s);{s='1234'}

Delete(s,w,k)

过程

在 s中删除从第 w位开始的 k个字符

 

s := 'Honest Abe Lincoln';
Delete(s,8,4);
Writeln(s); { 'Honest Lincoln' }

Insert(s1, S, w)

过程

将 s1插到 s中第 w位

 

S := 'Honest Lincoln';
Insert('Abe ', S, 8); { 'Honest Abe Lincoln' }

Pos(c, S)

函数

求字符 c在 s中的位置

整型

S := ' 123.5';
i :=Pos(' ', S);{i 的值为 1}

+

运算符

将两个字符串连接起来

 

s1:='1234';
s2:='5678';
s:=s1+s2;{'12345678'}

[例6、3]把26个英语字母正向、逆向打印出来。
Const s:string[26]=’abcdefghijklmnopqrstuvwxyz’;
Var t:string[26];
I:integer;
Begin
  t:=’                          ‘;           {共26个空格}
  For I:=1 to 26 do begin
     T[I]:=s[27-I];
  End;
  Writeln(s);
  Writeln(t);
End.
[例6、4]找出所有的四位回文数:(回文数就是一个数从左往右读与从右往左读都是同一个数)
var s:string[4];
n:integer;
begin
  for n:=1000 to 9999 do begin
      str(n,s);
      if (s[1]=s[4]) and (s[2]=s[3]) then write(n:6);
  end;
end.
或者用如下程序:
var n:integer;
s,t:string;
begin
  for n:=10 to 99 do begin
      str(n,s);
      t:=s+s[2]+s[1];
write(s:6);
  end;
end.
上述两个程序,哪个快,哪个慢?

练习题:

1、读入一串字符,以句号结束,然后让其倒序输出。
  如输入:I am a student.
  输出:tneduts a ma I

2、读入一串数字,以句号结束,请统计其中‘0’到‘9’的各个数字的个数。
  如输入:91254782354987012345978. 
  输出:0:1 1:2 2:3 3:2 4:3 5:3 7:3 8:3 9:3
3、输入一段文章(255个字符以内),求文章中单词的个数(相同单词只记一次,The和the认为是同一个单词,只记一次)。
4、请编写一个程序,让它能够计算两个200位以内的整数的和。
5、做一个加法器。完成30000以内的加法,两个加数间用“+”连接,可以连加,回车表示式子输入完成;“#”表示结束运算,退出加法器。

看程序写结果
1.
var ch:string;
   i:byte;
begin
  readln(ch);
  for i:=1 to ord(ch[0]) do
   write(ch[i]:2);
  writeln
end.
输入:My name is Tom.
输出:

2.
var i:integer;
begin
  for i:=1 to 13 do write(chr(63+2*i):4);
  writeln;
  for i:=1 to 13 do write(chr(92-2*i):4);
  writeln
end.
输出:

3.
var a:char;
begin
  readln(a);
  writeln('a:',a);
  writeln('succ(a):',succ(a));
  writeln('pred(a):',pred(a));
  writeln('ord(a):',ord(a));
  writeln('chr(ord(a)):',chr(ord(a)));
  writeln('chr(ord(a)+2):',chr(ord(a)+2));
end.
输入:e
输出:

4.
var s:integer;
ch:char;
   count:array['a'..'z'] of integer;
begin
  for ch:='a' to 'z' do count[ch]:=0;
   read(ch);
  while ch<>'!' do
  begin
   if (ch>='a')and(ch<='z') then
    count[ch]:=count[ch]+1;
   read(ch)
  end;
  s:=0;
  for ch:='b' to 'z' do s:=s+count[ch];
  writeln(s)
end.
输入:We are proud OF OUR COUNTRY! 
输出:
 
5.
var a:array[1..100] of string[20];
   s:string;temp:string[20];
   i,j,k,n:integer;
begin
  readln(n);readln(s);i:=1;j:=0;k:=0;
  while i<=length(s) do
   if s[i] in ['0'..'9'] then
   begin
    j:=1;
    while s[i] in ['0'..'9'] do
    begin
     temp[j]:=s[i];
     inc(j);inc(i){inc(i)相当于i:=i+1}
    end;
    temp[0]:=chr(j-1);
    k:=k+1;
    a[k]:=temp
   end
  else
  while s[i]=' ' do inc(i);
  for i:=1 to n-1 do
   for j:=i+1 to n do
    if (a[i]+a[j])<(a[j]+a[i]) then
     begin
      temp:=a[i];a[i]:=a[j];
      a[j]:=temp
    end;
  for i:=1 to n do write(a[i]);
  writeln
end.
输入:4
81 792 39 79
输出: