首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ord限制为字母

将Ord限制为字母
EN

Stack Overflow用户
提问于 2020-10-27 16:43:23
回答 1查看 324关注 0票数 1

我试图为一个学校项目创建一个简单的密码方法,这个想法是改变一个字符,增加它的ascii,一个用户输入数字,然后替换它回来。因此,我的问题是,当我这样做时,它是有效的,但它也包括象%$!...etc这样的符号。我想要做的是将Ord函数限制为字母,例如,如果用户输入数字100,但字母表中只有26个字母,它会一直循环到26个,直到达到100。希望我已经足够清楚了,这里是我到目前为止所拥有的,是整个代码的一部分:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-27 17:01:05

您似乎希望实现凯撒密码

首先,您需要使用if语句来检查当前字符是否为字母。如果是这样的话,你就转换它;如果不是,你就保持原样。

第二,仅仅将P添加到字符代码是不够的。虽然它适用于AP = 3,生产D,但是YP = 3会发生什么呢?您需要使用模算法才能得到Y → Z → A → B

第三,在编程中,重要的是要很好地构造代码并正确地重构它。目前,您将输入和转换混合在一起。你应该把这些分开。如果您创建了一个Caesar函数,您可以在每次需要执行凯撒密码时使用它。

如果我们还需要同时支持大写字母和小写字母,最好使用case结构而不是if .. else if .. else结构。

把这一切结合在一起:

代码语言:javascript
复制
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;

这个函数可以工作,但从性能的角度来看并不是最优的,因为您需要为每个迭代分配堆。最好只分配结果字符串一次,然后只填充它:

代码语言:javascript
复制
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;

一个完整的例子:

代码语言:javascript
复制
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有许多不同的类型。)

截图:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64559066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档