• 字符串的处理(pascal)


    字符串的处理(pascal)

    一、字符、字符串类型的使用
    (一)字符类型
    字符类型为由一个字符组成的字符常量或字符变量,字符常量定义:
    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。

    练习
    1. 输入一个由单词组成的文本行(最多80个字符),每个单词之间用若干个空格隔开,统计此文本行中单词的个数
    2. 将输入的任意十进制整数转换成十六制形式显示出来(转换方法请参见本书关于数制的相关章节)
    3. 打印菱形(输入N值,编程输出如下图形) 要求: 输入:一个整数N(1<=N<=7)。
    输出:排列成菱形的大写字符,首字符为Z,以后依次为Y,X...
    测试数据:
    输入:3
    输出:
    Z
    Y X
    W   V
    U T
    S
    4.构造子串:生成长度为n的字串,其字符从26个英文字母的前p(p≤26)个字母中选取,使得没有相邻的子序列相等。例如p=3,n=5时:
    abcba 满足条件
    abcbc 不满足条件
    要求: 输入:n p
    输出:所有满足条件的字串及总数
    测试数据:
    输入:3 2
    输出:aba
    bab
    2
    5.字符近似查找:设有n个单词的字典表(1<=n<=100)。计算某单词在字典表中的4种匹配情况(字典表中的单词和待匹配单词的长度上限为255):
    i: 该单词在字典表中的序号;
    Ei:在字典表中仅有一个字符不匹配的单词序号;
    Fi:在字典表中多或少一个字符(其余字符匹配)的单词序号;
    N:其他情况;
    当查找时有多个单词符合条件,仅要求第一个单词的序号即可。 要求:
    输入:
    n   字典表的单词数
    n行  每行一个单词
    待匹配单词
    输出:
    i
    Ei
    Fi
    其中i为字典表中符合条件的单词序号(1<=i<=n),若字典表不存在符合条件的单词,则对应的i=0。若上述3种情况不存在,则输出N。
    测试数据:
    输入:5
    abcde
    abc
    asdfasfd
    abcd
    aacd
    abcd
    输出:4
    E5

    F1

  • 相关阅读:
    小峰视频三:在eclipse中创建java类
    小峰视频二:java类的编译与解释
    小峰视频一:jdk环境变量的配置
    React/数据流
    React/组件
    React/生命周期
    React/虚拟DOM
    React/JSX简介
    12.朴素贝叶斯-垃圾邮件分类
    9、主成分分析
  • 原文地址:https://www.cnblogs.com/hhdllhflower/p/1590899.html
Copyright © 2020-2023  润新知