用户ID: 密码: 验证:

登 录

注 册 取回密码

中山教育

中山国际网

中国教育在线

时代财富科技公司 FortuneAge Technology Co., Ltd. 校园博客客服网站(新)

我的资料

midpoint

博客信息

积分:2028
等级:4级 lv 4
日志总数:479
发表评论总数:24 ( 查看)
获得评论总数:39
发表留言总数:0
所属学校:三鑫
收藏本站:

最新公告

最新相册

我的日历

最新评论

最新留言

[全部留言] [发表留言]
SOGO学术论文网(http://www.sogoart....
马老师,你的博客,两个字,很好,我,一个字,顶!我常上你这...
中 国 教 育 学 会 函 件 ...
马老师,您好! 您的博客内容很丰富、知识性也很...
--书宏
马老师,谢谢您关于电脑学习的推荐!望不吝指教噢

RSS


首页 -> 信息学竞赛->字符处理技巧
字符处理技巧

文章转载自:http://

本文通过字符塔和字符魔方两道问题的探究,讨论Pascal语言字符处理的技巧:

字符串问题的处理是命题中常见的技巧,Pascal提供了存储字符串数组的数据结构,也可以通过字符串的系统函数进行字符串的处理,本期通过两个探究题来分析字符处理的问题?

探究题、输入一个(A-Z)的字母,输出有规律的字符塔,如输入 D,输出:

A

ABA

ABCBA

ABCDCDBA

分析:本题是典型的字符处理问题,关键在于找出每行字符塔字符的规律,先求输入的字符是字母表中的第几个字母(用输入字符的ASCII码减去64),再将每一行的字符分为两部分:AASCII码为65)到输入字符,输入字符前一个字母到A,再根据每一行字符塔输出的中间字符控制每行的空格(ASCII码为32)即可。以下为本题的参考源程序:

program zft;

var a,k:char;

    i,b,j,y:integer;

procedure max(a:char);         {输出字符塔每行的字符}

begin

  b:=ord(a)-64;               {求出当前行中间字符在字母表中的位置赋值于b}

  for i:=1 to b do              {输出字母表中从1b的字母}

    write(chr(i+64));

    for j:=b-1 downto 1 do      {输出字母表中从b-11的字母}

     write(chr(j+64));

  writeln;

end;

procedure kg(o:char);           {输出每行字符塔前的空格}

var c:integer;

    e:integer;

  begin

    c:=ord(o)-64;              {求当前行中间字符在字母表中的位置赋值给c}

    for e:=1 to y-c do           {输出y-c个空格}

      write(char(32));          {空格的ASCII码为32}

  end;

begin

  write('Input:');       {读入一个大写字母}

  readln(a);

  y:=ord(a)-64;        {计算输入字母是字母表中的第几个字母,赋值给y}

  for k:='A' to a do     {输出字符塔,从第一个字母开始到输入的字母遍历}

    begin

      kg(k);         {控制空格的输出}

      max(k);        {输出字符}

    end;

end.

字符的处理问题还有很多技巧,这类问题从ASCII入手比较容易分析,把字符与数联系起来,程序设计思路也较多,可利用上面探究题中主过程中“for k:='A' to a do”的循环结构控制字符变量。有兴趣的读者请完成下面两题:

 

1、字符魔方:如输入“D”,输出:

ABCD

BCDA

CDAB

DABC

 

2、输入一个(A-Z)的字母,输出有规律的逆字符塔,如输入 D,输出:

ABCDCDBA

ABCBA

ABA

A

对于题目一,可以这样解决:

可以采用数组来完成,如命题中的实例,以第一行为基础,数组单元从14分别为ABCD,在输出第二行之前,先将原数组第一个单元字符存入临时变量,再将从第二个单元往后的字符都前移一个单元,最后将临时变量赋值给最后一个数组单元。再继续输出即可。参考Pascal源程序如下:

program zfmf;

var a:array[1..26] of char;

    b,z:char;

    x,e,i,p,ee:integer;

procedure d;     {输出一行字符的子过程}

begin

  for i:=1 to e do

    write(a[i]);

  writeln;

end;

 

procedure nd(c:char);

var i:char;

begin

  x:=1;

for i:='A' to c do    {将数组单元中存入字符}

  begin

    a[x]:=i;

    inc(x);

  end;

    d;           {调用输出字符的子过程}

end;

 

procedure pnd;    {输出从第二行到最后一行的字符}

begin

  z:=a[1];        {将第一个字符存入临时变量}

  for x:=1 to e-1 do

     a[x]:=a[x+1];    {从第1个到e-1字符依次向前平移}

  a[e]:=z;           {将临时变量中的值赋值给最后的数组单元}

  d;                {调用输出字符的子过程}

end;

 

begin

  write('Input:');

  readln(b);              {输入第一行最后的一个字符}

  e:=ord(b)- 64;          {求出这个字母在字母表的位置,}

  ee:=e;

  nd(b);                 {数组字符初始化}

    for p:=1 to ee-1 do

      pnd;

end.

网友评论

共 0 页,0 条记录  

用户名:
密码:
您的评论:
正在载入编辑器...
请输入验证码:


发 表 评 论

马军-中山教师家园