我试图为一个学校项目创建一个简单的密码方法,这个想法是改变一个字符,增加它的ascii,一个用户输入数字,然后替换它回来。因此,我的问题是,当我这样做时,它是有效的,但它也包括象%$!...etc这样的符号。我想要做的是将Ord函数限制为字母,例如,如果用户输入数字100,但字母表中只有26个字母,它会一直循环到26个,直到达到100。希望我已经足够清楚了,这里是我到目前为止所拥有的,是整个代码的一部分:
Procedure Crypting( Var cryptFile : Text; tempVar2 : String; pNumber: Integer);
Begin
Writeln('Enter P : ');
Readln(P);
Reset( cryptFile );
For i:= 1 to length(tempVar2) do
Write(Chr(Ord(tempVar2[i])+P));
End;发布于 2020-10-27 17:01:05
您似乎希望实现凯撒密码。
首先,您需要使用if语句来检查当前字符是否为字母。如果是这样的话,你就转换它;如果不是,你就保持原样。
第二,仅仅将P添加到字符代码是不够的。虽然它适用于A和P = 3,生产D,但是Y和P = 3会发生什么呢?您需要使用模算法才能得到Y → Z → A → B。
第三,在编程中,重要的是要很好地构造代码并正确地重构它。目前,您将输入和转换混合在一起。你应该把这些分开。如果您创建了一个Caesar函数,您可以在每次需要执行凯撒密码时使用它。
如果我们还需要同时支持大写字母和小写字母,最好使用case结构而不是if .. else if .. else结构。
把这一切结合在一起:
function Caesar(const S: string; N: Integer): string; // slow
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
case S[i] of
'A'..'Z':
Result := Result + Chr(Ord('A') + (Ord(S[i]) - Ord('A') + N) mod 26);
'a'..'z':
Result := Result + Chr(Ord('a') + (Ord(S[i]) - Ord('a') + N) mod 26);
else
Result := Result + S[i];
end;
end;这个函数可以工作,但从性能的角度来看并不是最优的,因为您需要为每个迭代分配堆。最好只分配结果字符串一次,然后只填充它:
function Caesar(const S: string; N: Integer): string;
var
i: Integer;
begin
SetLength(Result, Length(S));
for i := 1 to Length(S) do
case S[i] of
'A'..'Z':
Result[i] := Chr(Ord('A') + (Ord(S[i]) - Ord('A') + N) mod 26);
'a'..'z':
Result[i] := Chr(Ord('a') + (Ord(S[i]) - Ord('a') + N) mod 26);
else
Result[i] := S[i];
end;
end;一个完整的例子:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
function Caesar(const S: string; N: Integer): string;
var
i: Integer;
begin
SetLength(Result, Length(S));
for i := 1 to Length(S) do
case S[i] of
'A'..'Z':
Result[i] := Chr(Ord('A') + (Ord(S[i]) - Ord('A') + N) mod 26);
'a'..'z':
Result[i] := Chr(Ord('a') + (Ord(S[i]) - Ord('a') + N) mod 26);
else
Result[i] := S[i];
end;
end;
var
s: string;
N: Integer;
begin
Writeln('Please enter a string to transform:');
Readln(s);
Writeln('Please enter shift size:');
Readln(N);
Writeln;
Writeln('Result: ', Caesar(s, N));
Writeln;
Writeln('Thank you for using this program! Have a nice day!');
Writeln('Press Return to exit.');
Readln;
end.(精确的程序结构取决于您所使用的Pascal的类型-- Pascal有许多不同的类型。)
截图:

https://stackoverflow.com/questions/64559066
复制相似问题