文章转载自:http://
本文通过字符塔和字符魔方两道问题的探究,讨论Pascal语言字符处理的技巧:
字符串问题的处理是命题中常见的技巧,Pascal提供了存储字符串数组的数据结构,也可以通过字符串的系统函数进行字符串的处理,本期通过两个探究题来分析字符处理的问题?
探究题、输入一个(A-Z)的字母,输出有规律的字符塔,如输入 D,输出:
A
ABA
ABCBA
ABCDCDBA
分析:本题是典型的字符处理问题,关键在于找出每行字符塔字符的规律,先求输入的字符是字母表中的第几个字母(用输入字符的ASCII码减去64),再将每一行的字符分为两部分:A(ASCII码为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 {输出字母表中从1到b的字母}
write(chr(i+64));
for j:=b-1 downto 1 do {输出字母表中从b-1到1的字母}
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
对于题目一,可以这样解决:
可以采用数组来完成,如命题中的实例,以第一行为基础,数组单元从1到4分别为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.