Pascal 仅限于字母

Pascal 仅限于字母,pascal,Pascal,我正在尝试为一个学校项目创建一个简单的加密方法,其想法是通过使用用户输入的数字增加字符的ascii值,然后将其替换回来来更改字符。 所以我的问题是,当我这样做时,它是有效的,但它也包括符号,如%$。。。等 我想做的是将Ord函数限制为仅限字母,例如,如果用户输入数字100,但字母表中只有26个字母,它将不断循环26个字母,直到到达第100个。 希望我足够清楚,哈哈 以下是我到目前为止所掌握的全部代码的一部分: Procedure Crypting( Var cryptFile : Text; t

我正在尝试为一个学校项目创建一个简单的加密方法,其想法是通过使用用户输入的数字增加字符的ascii值,然后将其替换回来来更改字符。 所以我的问题是,当我这样做时,它是有效的,但它也包括符号,如%$。。。等 我想做的是将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;

看起来您正在寻求实现

首先,需要使用
if
语句检查当前字符是否为字母。如果是的话,你要改变它;如果没有,就让它保持原样

其次,仅仅在字符代码中添加
p
是不够的。虽然它适用于
A
P=3
,产生
D
,但是
Y
P=3
会发生什么?您需要使用,以便获得
Y→ Z→ A.→ B

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

如果我们还需要同时支持大写和小写字母,那么最好使用
大小写
构造,而不是
If。。否则。。else
构造

总而言之:

函数Caesar(常数S:string;N:Integer):string;//缓慢的
变量
i:整数;
开始
结果:='';
对于i:=1到长度do
案件S[i]
“A”…“Z”:
结果:=结果+Chr(Ord('A')+(Ord(S[i])-Ord('A')+N)mod 26);
“a”…“z”:
结果:=结果+Chr(Ord('a')+(Ord(S[i])-Ord('a')+N)mod 26);
其他的
结果:=结果+S[i];
结束;
结束;
这个函数可以工作,但从性能的角度来看不是最优的,因为每次迭代都需要一个堆分配。最好分配一次结果字符串,然后只填充它:

函数Caesar(常量S:string;N:Integer):string;
变量
i:整数;
开始
设置长度(结果、长度);
对于i:=1到长度do
案件S[i]
“A”…“Z”:
结果[i]:=Chr(Ord('A')+(Ord(S[i])-Ord('A')+N)mod 26;
“a”…“z”:
结果[i]:=Chr(Ord('a')+(Ord(S[i])-Ord('a')+N)mod 26;
其他的
结果[i]:=S[i];
结束;
结束;
一个完整的例子:

程序项目1;
{$APPTYPE控制台}
{$R*.res}
使用
System.SysUtils;
函数Caesar(常数S:string;N:Integer):string;
变量
i:整数;
开始
设置长度(结果、长度);
对于i:=1到长度do
案件S[i]
“A”…“Z”:
结果[i]:=Chr(Ord('A')+(Ord(S[i])-Ord('A')+N)mod 26;
“a”…“z”:
结果[i]:=Chr(Ord('a')+(Ord(S[i])-Ord('a')+N)mod 26;
其他的
结果[i]:=S[i];
结束;
结束;
变量
s:字符串;
N:整数;
开始
Writeln('请输入要转换的字符串:');
Readln(s);
Writeln('请输入班次大小:');
Readln(N);
书面语;
Writeln('结果:',Caesar(s,N));
书面语;
Writeln('感谢您使用此程序!祝您有愉快的一天!');
Writeln('按回车键退出');
Readln;
结束。
(精确的程序结构取决于您使用的Pascal类型——Pascal有许多不同的类型。)

截图:


您不能限制内置函数的操作,而
Ord()
是;你能做的最好的事情就是在你自己的代码中“包装”它,这样你就不会调用它,除非它的值在你希望允许的范围内。在我的情况下,这怎么可能呢?考虑一下你的问题:如果值不是字母,就不要调用Ord()。或者,更确切地说,如果值是一个字母,调用Ord()。是的,这就是我的意思,但我不太明白如何将其应用到我的代码中,例如,在加密后将这一行“Hello world”更改为它的等效行?Tbh我仍在学习,这仍然有点超出我的能力范围!因此,我一直在做一些调整和东西,它的工作正是我想要的!但有一个问题是,它能应用于整个文本文件吗?不仅仅是一行,比如说一个文本文件中有10行,它会逐行加密line@FirasBlouza:太好了!:)我一直试图让它加密整个文本,但最后我只加密了最后一行:|