Pascal字符串使用(正确的Python示例)

Pascal字符串使用(正确的Python示例),python,string,pascal,freepascal,Python,String,Pascal,Freepascal,我有一个任务,要求用户输入11位代码字符串 一, 例如,假设用户输入代码为3760503299 二, 然后我需要检查最后一个数字是否匹配。这是您获取最后一个数字的方式: nr11=nr1*1+nr2*2+nr3*3+nr4*4+nr5*5+nr6*6+nr7*7+nr8*8+nr9*9+nr10*1模块11 三, 这是我写的: var C, nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10, nr11: string; begin nr1:

我有一个任务,要求用户输入11位代码字符串

一, 例如,假设用户输入代码为3760503299

二, 然后我需要检查最后一个数字是否匹配。这是您获取最后一个数字的方式: nr11=nr1*1+nr2*2+nr3*3+nr4*4+nr5*5+nr6*6+nr7*7+nr8*8+nr9*9+nr10*1模块11

三, 这是我写的:

var  C, nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10, nr11: string;

begin

nr1:=(copy(C, 1, 1));  
nr2:=(copy(C, 2, 1));
nr3:=(copy(C, 3, 1));
nr4:=(copy(C, 4, 1));
nr5:=(copy(C, 5, 1));
nr6:=(copy(C, 6, 1));
nr7:=(copy(C, 7, 1));
nr8:=(copy(C, 8, 1));
nr9:=(copy(C, 9, 1));
nr10:=(copy(C, 10, 1));
nr11:=(copy(C, 11, 1));   

writeln('Enter the code which contains 11 digits:');
 readln(C);

 if nr11 = (nr1*1 + nr2*2 + nr3*3 + nr4*4 + nr5*5 + nr6*6 + nr7*7 + nr8*8 + nr9*9 + nr10*1) mod 11 then
  begin
   writeln('The code is correct!');
  end

else
 if nr11 <> (nr1*1 + nr2*2 + nr3*3 + nr4*4 + nr5*5 + nr6*6 + nr7*7 + nr8*8 + nr9*9 + nr10*1) mod 11
  begin
   writeln('The code is incorrect!');
  end;

  readln();
end.

看起来像是ISBN。为了计算支票数字,我建议如下

function DigitToInt(const c: Char): Integer;
begin
  if (c<'0') or (c>'9') then
    raise Exception.Create('Invalid input');
  Result := ord(c)-ord('0');
end;
这将“0”到“9”范围内的单个字符转换为相应的整数值

function CheckDigit(const s: string): Integer;
var
  i: Integer;
begin
  if Length(s)<>11 then
    raise Exception.Create('Invalid input');
  Result := 0;
  for i := 1 to 10 do
    inc(Result, DigitToInt(s[i])*i);
  Result := Result mod 11;
end;
这将计算11位代码的校验位

要将实际支票数字与计算的支票数字进行比较,您需要填写:

if CheckDigit(code) <> DigitToInt(code[11]) then
  .... handle error

首先,当C为空时,从C复制内容。在尝试访问readlnC的元素之前,应先放置readlnC:

writeln('Enter the code which contains 11 digits:');
readln(C);

nr1:=...
nr2:=...
第二件事是,如果值仅为1个字符,则可以通过索引访问它:

nr1:= C[1];
nr2:= C[2];
...
要将字符串转换为整数,必须包含sysutils才能使用stroint函数:

另一种逐字符的方法是计算字符值与48之间的差值,48是“0”的ASCII码

示例代码:

uses sysutils;
var  C:string
     nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10, nr11: integer;

begin
readln(C);
nr1:=strtoint(C[1]);
nr2:=strtoint(C[2]);
nr3:=strtoint(C[3]);
.
.
.
if nr11 = (nr1*1 + nr2*2 + nr3*3 + nr4*4 + nr5*5 + nr6*6 + nr7*7 + nr8*8 + nr9*9 + nr10*1) mod 11 then
   writeln('The code is correct!') 
   //if you skip the begin/end statements, only the next statement 
   //is executed in loops/if statements
else writeln('Not correct'); //notice that I didn't use ELSE IF but ELSE
readln; 
//in Pascal you can skip the parathenses if you don't pass arguments to the function
end.

请参阅以获取一些结论当我尝试nr1:=strotintc[1]时,它说:错误:不兼容的类型:得到预期的LongIntShortString@Fr0f0nr1,nr2。。。应该是整数。我改正了错误。非常感谢你!!!我已经想了很久了。衷心感谢你!上面说,标识符提升、结果和数字点不是Delphi。该代码在fpc中也能正常工作。您接受的答案中的代码要复杂得多。为什么要声明所有这些变量。我的代码根本不需要这些。
uses sysutils;
var  C:string
     nr1, nr2, nr3, nr4, nr5, nr6, nr7, nr8, nr9, nr10, nr11: integer;

begin
readln(C);
nr1:=strtoint(C[1]);
nr2:=strtoint(C[2]);
nr3:=strtoint(C[3]);
.
.
.
if nr11 = (nr1*1 + nr2*2 + nr3*3 + nr4*4 + nr5*5 + nr6*6 + nr7*7 + nr8*8 + nr9*9 + nr10*1) mod 11 then
   writeln('The code is correct!') 
   //if you skip the begin/end statements, only the next statement 
   //is executed in loops/if statements
else writeln('Not correct'); //notice that I didn't use ELSE IF but ELSE
readln; 
//in Pascal you can skip the parathenses if you don't pass arguments to the function
end.