1

ユーザーに11桁のコード(文字列)を入力するように求めるこのタスクがあります。

1) たとえば、ユーザー入力コードが 37605030299 であるとします。

2) 次に、最後の数字が一致するかどうかを確認する必要があります。これは、最後の番号を取得する方法です: nr11 = (nr1*1 + nr2*2 + nr3*3 + nr4*4 + nr5*5 + nr6*6 + nr7*7 + nr8*8 + nr9*9 + nr10* 1) mod 11

3)これは私が書いたものです:

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.

私のように数式で文字列を使用できないことを知っているため、これは機能しませんが、機能しますか? 私はパスカルを学んでいるところです。

この UI コードは正しいはずです。チェック中:

1*3 + 2*7 + 3*6 + 4*0 + 5*5 + 6*0 + 7*3 + 8*0 + 9*2 + 1*9 = 108

108/11~9,8

9*11 = 99

108-99 = 9 (答えは 9 なので、最後の桁は 9 でなければなりません。最後の桁は 9 で、コードが正しいことを示します)

私がやろうとしたことを理解していない場合は、python で正しいはずの例を 1 つ見つけました。

def checkIDCode(code):
    if len(code) != 11 or not code.isdigit():
            return False

    c = map(int,code)
    w1 = [1,2,3,4,5,6,7,8,9,1]
    w2 = [3,4,5,6,7,8,9,1,2,3]

    s1 = sum(map(lambda x,y: x*y, c[:-1], w1))%11
    s2 = (sum(map(lambda x,y: x*y, c[:-1], w2))%11)%10

    return s1 == c[-1] or s1 == 10 and s2 == c[-1]
4

2 に答える 2

0

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' の範囲の 1 文字を対応する整数値に変換します。

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
于 2013-03-23T21:01:35.557 に答える
0

まず、C が空のときに C から何かをコピーすることです。その要素にアクセスする前に、readln(C) を配置する必要があります。

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

nr1:=...
nr2:=...

2 つ目は、値が 1 文字のみの場合、インデックスでアクセスできることです。

nr1:= C[1];
nr2:= C[2];
...

文字列を整数に変換するには、sysutils を含めて StrToInt 関数を使用する必要があります: http://www.freepascal.org/docs-html/rtl/sysutils/strtoint.html

別の方法 (char ごと) は、char 値と 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.
于 2013-03-23T21:04:33.297 に答える