用 户:

密 码:

       科组介绍 在线课堂 竞赛专栏 图文资讯 教学资源 教学设计 学生作品 外部链接


 
        您现在正在浏览: 首页 » 信息技术科 » 在线课堂 » 正文
第十课 字符与字符串处理
发布时间: 2012-10-02 21:07:11   作者:本站编辑   来源: 本站原创   浏览次数:   我要评论()

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

  (一)字符类型

  字符类型为由一个字符组成的字符常量或字符变量 。

  字符常量定义:

  const                                      

   字符常量='字符'

  字符变量定义:

  Var

   字符变量:char;

  字符类型是一个有序类型字符的大小顺序按其ASCⅡ代码的大小而定。函数succpredord适用于字符类型。

  例如:后继函数:succ('a')='b'

     前继函数:pred'B'='A'

     序号函数:ord'A'=65

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

    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

  程序如下:

  program ex8_1;

   var letter:char;

   begin

    for letter:='a' to 'z' do

    if (ord(letter)-ord('a'))mod 2=0 then write(letter:3);

    writeln;

    for letter:='z' downto 'a' do

    if (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

  例如:type

      man=string[8]

       line=string

      var

       nameman

       screenlineline

  另一种字符类型的定义方式为把类型说明的变量定义合并在一起。

  例如:VAR

       nameSTRING[8]

       screenlineSTRING

  Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。

  例如:var

      namestring

     begin

      readlnnsme);

      for i=1 to ordname[0]do

       writelnname[i]);

     end.

  语句writelnname[i])输出name串中第i个字符。

  例求输入英文句子单词的平均长度.

  程序如下:

  program ex8_2;

   var

    ch:string;

    s,count,j:integer;

   begin

    write('The sentence is :');

    readln(ch);

    s:=0;

    count:=0;

    j:=0;

    repeat

     inc(j);

     if not (ch[j] in [':',',',';','''','!','?','.',' ']) then inc(s);

     if ch[j] in[' ','.','!','?'] then inc(count);

    until (j=ordch[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个位置上的字符,ordch[0])为ch串的串长度。程序充分利用Turbo Pascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。

二、字符串的操作

  (一)字符串的运算和比较 

  由字符串的常量、变量和运算符组成的表达式称为字符串表达式。

  字符串运算符包括:

  1+:连接运算符

  例如:'Turbo '+'PASCAL'的结果是'Turbo PASCAL'

  若连接的结果字符串长度超过255,则被截成255个字符。若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。

  例如:var

      str1str2str3string[8]

     begin

      str1='Turbo '

      str2='PASCAL'

      str3=str1+str2

     end

  则str3的值为:'Turbo PA'

  2=、〈〉、〈、〈=、〉、〉=:关系运算符

  两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。

  例如:'AB''AC' 结果为真;

     '12''2' 结果为真;

     'PASCAL '='PASCAL' 结果为假;

  例对给定的10个国家名,按其字母的顺序输出。

  程序如下:

  program ex8_3;

   var i,j,k:integer;

     t:string[20];

     cname:array[1..10] of string[20];

   begin

    for i:=1 to 10 do readln(cname[i]);

    for i:=1 to 9 do

     begin

      k:=i;

      for j:=i+1 to 10 do

       if 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提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。

 

函数和过程名

功 能

说 明

copy(s,m,n)

s中第m个字符开始的n个字符

m大于s的长度,则返回空串;否则,若m+n大于s的长度,则截断

length(s)

s的动态的长度

返回值为整数

pos(sub,s)

s中找子串sub

返回值为subs中的位置,为byte

insert(sour,s,m)

s的第m个字符位置处插入子串sour

若返回串超过255,则截断

delete(s,m,n)

删除s中第m个字符开始的n个字符串

m大于s的长度,则不删除;否则,若m+n大于s的长度,则删除

str(x[:w[:d]],s)

将整数或实数x转换成字符串s

和 d是整型表达式,意义同带字宽的write语句

val(s,x,code)

将字符串转换成整数或实数

S中有非法字符,则code存放非法字符在S中的下标;否则,code为零。code为整型 

upcase(ch)

将字母ch转换成大写字母

ch不为小写字母,则不转换

  例校对输入日期(以标准英语日期,//)的正确性,若输入正确则以年.月.日的方式输出。

  程序如下:

  program ex8_4;

   const

    max:array[1..12] of byte

      =(31,29,31,30,31,30,31,31,30,31,30,31);

   var

    st:string;

    p,w,y,m,d:integer;

   procedure err;

    begin

     write('Input Error!');

     readln;

     halt;

    end;

   procedure init(var x:integer);

    begin

     p:=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;

   begin

    write('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=0

        then begin

            if y mod 400<>0 then err;

           end

     else 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月份,则还需考虑闰年的情况。

  例对输入的一句子实现查找且置换的功能。

  程序如下:

  program ex8_5;

  var

   s1,s,o:string;

   i:integer;

  begin

   write('The text:');

   readln(s1);

   write('Find:');readln(s);

   write('Replace:');readln(o);

   i:=pos(s,s1);

   while i<>0 do begin

    delete(s1,i,length(s));

    insert(o,s1,i);

    i:=pos(s,s1);

   end;

   writeln(s1);

   readln;

  end.

  分析:程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处理的标准过程deleteinsert及标准函数pos

 

中学教学资源网 吉林教育信息网 教育资源网 E度网-中考,高考信息 人教网 中国园丁网 中国教育信息网 动感教育网

设为首页 - 加入收藏 - 管理登录
广东实验中学 版权所有 技术支持:协跃科技 粤ICP备05008850号
Copyright (©) 2012 www.gdsyzx.edu.cn All Rights Reserved