如何在方程中使用帕斯卡字符串

问题描述 投票:0回答:2

我有一个小问题。我编写了一个程序,要求用户输入包含 11 位数字的代码。我将其定义为字符串,但现在我想单独使用此代码中的每个数字并制作一个方程式。

例如,如果代码是

37605030299
,我需要做方程:

(1*3 + 2*7 + 3*6 + 4*0 + 5*5 + 6*0 + 7*3 + 8*0 + 9*2 + 1*9) / 11

并找出 MOD 是什么。

这是 ISBN 校验位的计算。

pascal freepascal isbn
2个回答
2
投票

使用循环代替。 (我只显示总值和校验位计算 - 您需要首先将用户输入自己输入名为

UserISBN
的变量中。)

function AddCheckDigit(const UserISBN: string): string;    
var
  i, Sum: Integer;
  CheckDigit: Integer;
  LastCharValue: string;
begin
  Assert(Length(UserISBN) = 10, 'Invalid ISBN number.');
  Sum := 0;
  for i := 1 to 10 do
    Sum := Sum + (Ord(UserISBN[i]) * i);

  { Calculate the check digit }
  CheckDigit := 11 - (Sum mod 11);

  { Determine check digit character value }
  if CheckDigit = 10 then
    LastCharValue := 'X'
  else
    LastCharValue := IntToStr(CheckDigit);

  { Add to string for full ISBN Number }
  Result := UserISBN + LastCharValue;
end;

0
投票
  • 在 Pascal 中,保证十进制数字
    char
    0
    9
    值存在,并且是连续的并且相对于其数值按升序排列。 因此,您可以使用
    char
    值作为输入并计算
    ord('4') – ord('0')
    等表达式来获取
    integer
    4
    program checkDigit(input, output);
        type
            { This is guaranteed to comprise exactly 10 `char` values. }
            decimalDigit = '0'‥'9';
            { Valid index of a component in ISBN10identifier string. }
            ISBN10identifierIndex = 1‥9;
            { Legacy 10‑digit ISBN without check digit. }
            ISBN10identifier = array[ISBN10identifierIndex] of decimalDigit;
        var
            digit: ISBN10identifier;
            checkDigitValue: 0‥10;
        begin
            { This will crash if you do not enter 9 decimal digit characters. }
            readLn(digit[ 1], digit[ 2], digit[ 3], digit[ 4], digit[ 5],
                   digit[ 6], digit[ 7], digit[ 8], digit[ 9]);
            { Obviously this “formula” may benefit from using a `for` loop. }
            checkDigitValue ≔ (ord(digit[1]) * 1 + ord(digit[2]) * 2 +
                               ord(digit[3]) * 3 + ord(digit[4]) * 4 +
                               ord(digit[5]) * 5 + ord(digit[6]) * 6 +
                               ord(digit[7]) * 7 + ord(digit[8]) * 8 +
                               ord(digit[9]) * 9 − 45 * ord('0')) mod 11;
            { Select alternative character for `checkDigitValue` equaling ten. }
            writeLn(('0123456789X')[checkDigitValue + 1])
        end.
    
  • 如果您的实现支持
    maxInt
     ≥ 999,999,999,您可能需要使用
    integer
    。 编写诸如
    n div 10000 mod 10
    之类的表达式来隔离各个数字值。
    program checkDigit(input, output);
        var
            { To ensure your algorithm isn’t totally wrong use sub‑ranges. }
            ID: 0‥999999999;
            { The initial `value` construct is defined by Extended Pascal. }
            weightedSum: 0‥729 value 0;
            { Exponent in 10⁰ = 1,  10¹ = 10,  10² = 100, …, 10⁸ = 100,000,000. }
            i: 0‥8;
        begin
            { NB: This accepts _any_ valid Pascal `integer` literal (e.g. +42). }
            readLn(ID);
            { Accumulate `weightedSum`. }
            for i ≔ 0 to 8 do
            begin
                { The `pow` operator is defined by Extended Pascal. }
                weightedSum ≔ weightedSum + ID div (10 pow i) mod 10 * (9 − i)
            end;
            { Print the entire ISBN including the check digit (`X` for ten). }
            writeLn(ID:9, ('0123456789X')[weightedSum mod 11 + 1])
        end.
    
© www.soinside.com 2019 - 2024. All rights reserved.