下面这个程序缺字符表达式,帮忙改下。
.context 编码解码
【题目】从键盘输入一个英文句子,设计一个编码、解码程序。
编码过程:先键入一个正整数N(1〈=N〉=26)。这个N决定了转换关系。
例如当N=1,输入的句子为ABCXYZ时,则其转换码为ABCXYZ不变。当N=2时,
其转换码为BCDYZA,其它的非字母字符不变。为使编码较于破译,将转换码的信
息自左而右两两交换,若最后仅剩单个字符则不换。然后,将一开始表示转换关
系的N根据ascii表序号化成大写字母放在最前面。
如:abcABCxyzXYZ-/,1. n=3
① cdeCDEzabZAB-/,1. {根据N的值转换}
② dcCeEDazZbBA/-1,. {两两交换}
③ CdcCeEDazZbBA/-1,. {最后编码}
解码过程为编码的逆过程。
【参考程序】
var one:string;
i,what,n,temp,s:integer;temp1:char;
begin
writeln('input your choice:'); {编码,解码过程通过菜单选择}
writeln('1.bian ma'); {选1,编码}
writeln('2.jie ma'); {选2,解码}
readln(what); {输入选择}
writeln('input a string:'); {无论是编码或是解码,均要输入一字符串}
readln(one); {读入字符串到one中}
if what=1 then begin {如果是编码过程}
readln(n); {读入N}
n:=n-1; {根据题意,要换成N-1,为什么?例如N=1,则字符不变}
for i:=1 to length(one) do begin {字串one从头到尾编码}
if ord(one[i]) in [65..90] then begin {如为大写字母}
temp:=ord(one[i])+n; {序号先加N}
if temp>90 then temp:=temp-90+64; {超过Z的处理,保证处理后仍为}
one[i]:=chr(temp); {大写字母}
end;
if ord(one[i]) in [97..122] then begin {如为小写字母}
temp:=ord(one[i])+n;
if temp>122 then temp:=temp-122+96; {超过z的处理,保证为小写字母}
one[i]:=chr(temp); {处理后放回原位置}
end;
end;
s:=ord(one[0]); {S放one字符串长度,用以控制两两交换次数}
if odd(s) then dec(s); {假如是奇数,则减1,保证是偶数次}
i:=1;
repeat
temp1:=one[i]; {以下三句实现前后两字符的两两交换}
one[i]:=one[i+1];
one[i+1]:=temp1;
i:=i+2; {一次便交换两个字符}
until i>=s; {直到字串结束}
write(chr(ord(n+1+64))); {输出N的对应大写字母}
write(one); {输出编码后的one字符串}
end;
if what=2 then begin {解码过程}
n:=ord(upcase(one[1]))-64-1; {由one字串的头一个字符获取密钥N}
one:=copy(one,2,length(one)-1); {取出N后,one字符串减去第一个字符}
s:=ord(one[0]); {以下实现字符串的两两交换}
if odd(s) then dec(s); {S控制两两交换的次数,保证是偶数次}
i:=1;
repeat
temp1:=one[i]; {前后两个字符两两交换}
one[i]:=one[i+1];
one[i+1]:=temp1;
i:=i+2;
until i>=s; {直到字串结束}
for i:=1 to length(one) do begin {根据N的值还原字符串}
if ord(one[i]) in[65..90] then begin {大写字母}
temp:=ord(one[i])-n; {序号 -N}
if temp<65 then temp:=temp+26; {保证在A..Z范围内转换}
one[i]:=chr(temp); {转换后放回原处}
end;
if ord(one[i]) in[97..122] then begin {小写字母}
temp:=ord(one[i])-n;
if temp<97 then temp:=temp+26;
one[i]:=chr(temp);
end;
end;
writeln(one); {输出解码后的字符串}
end;
end.
高悬赏。