请您留下宝贵的建议吧:)
广西百色高中欢迎您!

| 网站首页 | 学校概况 | 软件下载 | 图片中心 | 雁过留声 | 视频资源 | 校长信箱 | 内 部 网 |
| 同 学 录 | 网络办公 | 教学课件 | 优秀教案 | 试卷下载 | 教学素材 | 教学论文 | 电子图书 |

 
您现在的位置: 广西百色高中校园网 >> 学校概况 >> 学生频道 >> 信息技术 >> PASCAL教程 >> 文章正文 用户登录 新用户注册
   
   

第十课 字符与字符串处理          【字体:
第十课 字符与字符串处理
作者:仔仔    文章来源:本站原创    点击数:    更新时间:2006-9-26
第十课 字符与字符串处理
 

一、字符、字符串类型的使用
(一)字符类型
 字符类型为由一个字符组成的字符常量或字符变量,字符常量定义:
   const                                      
    字符常量="字符";

 字符变量定义:
   Var
    字符变量:char;

 字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大小而定,函数succ、pred、ord适用于字符类型,例如:
  后继函数:succ("a")="b"
  前继函数:pred("B")="A"
  序号函数:ord("A")=65
【例1】按字母表顺序和逆序每隔一个字母打印,即打印出:
     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
     name:man;
     screenline:line;
 另一种字符类型的定义方式为把类型说明的变量定义合并在一起
 例如:VAR
     name:STRING[8];
     screenline:STRING;
 Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。
 例如:var
     name:string;
    begin
     readln(nsme);
     for i:=1 to ord(name[0]) do writeln(name[i]);
    end.
 语句writeln(name[i])输出name串中第i个字符。

【例2】求输入英文句子单词的平均长度
 程序如下:
 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=ord(ch[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个位置上的字符,ord(ch[0])为ch串的串长度。程序充分利用Turbo Pascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。

二、字符串的操作
(一)字符串的运算和比较
 由字符串的常量、变量和运算符组成的表达式称为字符串表达式,字符串运算符包括:
 +:连接运算符
 例如:"Turbo "+"PASCAL"的结果是"Turbo PASCAL"
 若连接的结果字符串长度超过255,则被截成255个字符;若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。
 例如:var
     str1,str2,str3:string[8];
    begin
     str1:="Turbo ";
     str2:="PASCAL";
     str3:=str1+str2;
    end.
 则str3的值为:"Turbo PA"
 =<><<=>>=:关系运算符
 两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。
 例如:"AB"<"AC" 结果为真
    "12"<"2" 结果为真
    "PASCAL "="PASCAL" 结果为假
【例3】对给定的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提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。

函数和过程名 功 能   说 明
CONCAL(ST1,...,STN) 将N个字符串连接起来   等效于ST1+...+ST2,是函数
COPY(S,M,N) 取S中第M个字符开始的N个字符   若M大于S的长度,则返回空串;否则,若M+N大于s的长度,则截断,是函数
LENGTH(S) 求s的动态的长度   返回值为整数,是函数
POS(SUB,S) 在S中找子串SUB   返回值为SUB在S中的位置,为byte型,是函数
UPCASE(CH) 将字母CH转换成大写字母   若CH不为小写字母,则不转换,是函数
       
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   W和D是整型表达式,意义同带字宽的write语句,是过程
VAL(S,X,CODE) 将字符串S转换成整数或实数X   若S中有非法字符,则CODE存放非法字符在S中的下标;否则,CODE为零,CODE为整型,是过程
FILLCHAR(S,N,CH) 给S填充N个相同的CH   用于初始化数组或字符串,N常用SIZEOF(S)代替,是过程
:关于字符串的几点说明
空串表示为"",其长度为0,不等于含有一个空格的串" ",它的长度为1;如:A:="";就是将A字符串置空
FILLCHAR可以用于字符串变量和任何类型数组变量的初始化,比如:
  FILLCHAR(A,SIZEOF(A),0)  将整型数组A全置0
  FILLCHAR(B,SIZEOF(B),TRUE)  将布尔型数组B全置0
  FILLCHAR(C,SIZEOF(C),"A")  将整型字符串C全置"A"
【例4】 校对输入日期(以标准英语日期,月/日/年)的正确性,若输入正确则以年.月.日的方式输出。
   程序如下:
   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月份,则还需考虑闰年的情况。

【例5】对输入的一句子实现查找且置换的功能(找到某个子串并换成另一子串)。
   程序如下:
   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.
分析程序中,输入要查找的字符串及要置换的字符串,充分用上了字符串处理的标准过程delete、insert及标准函数pos。
文章录入:qinjun    责任编辑:qinjun 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
          最新热点       最新推荐       相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

       
     
     
     
    广西百色高中欢迎您!   网站地图 | 联系站长 | 友情链接 | 用户排行 | 版权申明 | 管理登录
    版权所有 Copyright© 2005-2010 广西百色高中 (桂ICP备05013955号)
    学校地址:广西百色市城乡路93号 电话号码:0776-2824142 传真:0776-2847293 邮政编码:533000
    站    长:覃钧  QQ:75331465            改版时间:2007年8月20日