Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проверка ISBN 2

Delphi , Синтаксис , Пароли

Проверка ISBN 2

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function ValidateISBN(const ISBN: string): Boolean;
 // 
// References: 
// =========== 
// [1] http://isbn-international.org/userman/chapter4.html 
// 
type
   TISBNPart = (ipGroupID, ipPublisherID, ipTitleID, ipCheckDigit);
   TISBNPartSizes = array [TISBNPart] of Integer;
 const
   ISBNSize = 13;
   ISBNDigits = ['0'..'9'];
   ISBNSpecialDigits = ['x', 'X'];
   ISBNSeparators = [' ', '-'];
   ISBNCharacters = ISBNDigits + ISBNSpecialDigits + ISBNSeparators;
 var
   CurPtr, EndPtr: PAnsiChar;
   Accumulator, Counter: Integer;
   Part: TISBNPart;
   PartSizes: TISBNPartSizes;

   // begin local function 

  function IsPartSizeValid(APart: TISBNPart): Boolean;
   const
     MaxPartSizes: TISBNPartSizes = (5, 7, 6, 1);
   begin
     Result := PartSizes[APart] <= MaxPartSizes[APart];
   end;

   // end local function 

begin
   Result := False;
   // At first, check the overall string length. 
  if Length(ISBN) <> ISBNSize then
     Exit;

   CurPtr := @ISBN[1];
   EndPtr := CurPtr + Pred(ISBNSize);
   Accumulator := 0;
   Counter := 10;
   Part := ipGroupID;
   ZeroMemory(@PartSizes[Low(PartSizes)], SizeOf(PartSizes));

   while Cardinal(CurPtr) <= Cardinal(EndPtr) do
   begin
     if CurPtr^ in ISBNCharacters then
     begin
       if CurPtr^ in ISBNSeparators then
       begin
         // Switch to the next ISBN part, but take care of two conditions: 
        // 1. Do not let Part go beyond its upper bound (ipCheckDigit). 
        // 2. Verify if the current ISBN part does not exceed its size limit. 
        if (Part < High(Part)) and IsPartSizeValid(Part) then
           Inc(Part)
         else
           Exit;
       end
       else // CurPtr^ in [ISBNDigits, ISBNSpecialDigits] 
      begin
         // Is it the last character of the string? 
        if (CurPtr = EndPtr) then
         begin
           // Check the following conditions: 
          // 1. Make sure current ISBN Part equals to ipCheckDigit. 
          // 2. Verify if the check digit does not exceed its size limit. 
          if (Part <> High(Part)) and not IsPartSizeValid(Part) then
             Exit;
         end
         else
           // Special check digit is allowed to occur only at the end of ISBN. 
          if CurPtr^ in ISBNSpecialDigits then
             Exit;

         // Increment the size of the current ISBN part. 
        Inc(PartSizes[Part]);

         // Increment the accumulator by current ISBN digit multiplied by a weight. 
        // To get more detailed information, please refer to the web site [1]. 
        if (CurPtr = EndPtr) and (CurPtr^ in ISBNSpecialDigits) then
           Inc(Accumulator, 10 * Counter)
         else
           Inc(Accumulator, (Ord(CurPtr^) - Ord('0')) * Counter);
         Dec(Counter);
       end;
       Inc(CurPtr);
     end
     else
       Exit;
   end;
   // Accumulator content must be divisible by 11 without a remainder. 
  Result := (Accumulator mod 11) = 0;
 end;

Перевод контента на русский язык:

Приведенный код - это реализация функции в Delphi, называемой ValidateISBN, которая проверяет, является ли заданный ISBN (Международный стандартный номер книги) корректным или нет.

Детальный анализ кода:

  1. Функция принимает строковый параметр ISBN и возвращает булевое значение, указывающее, является ли ISBN корректным или нет.
  2. Она проверяет длину входной строки - 13 символов, что является стандартной длиной для ISBN-13.
  3. Если длина не корректна, функция сразу выходит из себя с возвращенным значением False.
  4. Код инициализирует несколько переменных: CurPtr и EndPtr, указывающие на начало и конец входной строки соответственно; Accumulator и Counter, для отслеживания суммы взвешенных цифр в ISBN; а также Part и PartSizes, для хранения текущего раздела и его размера соответственно.
  5. Функция вступает в цикл, который проходит через каждый символ входной строки. Для каждого символа:
    • Если он является корректным символом ISBN (цифра, разделитель или специальная цифра 'x' или 'X'), она обрабатывает его соответствующим образом.
      • Если это разделитель, функция проверяет, не превышает ли текущий раздел свой максимальный размер, и если да, то переходит к следующему разделу. Если он превышает свой размер или достигает конца строки, функция выходит из себя с возвращенным значением False.
      • Если это цифра или специальная цифра 'x' или 'X', она увеличивает соответствующий размер раздела и добавляет взвешенное значение цифры (или 10 для 'x' или 'X') к аккумулятору. Она также уменьшает переменную Counter.
    • Если это не корректный символ ISBN, функция выходит из себя с возвращенным значением False.
  6. После обработки всех символов функция проверяет, является ли аккумулятор делимым на 11 без остатка. Если да, функция возвращает True; иначе - False.

Приведенный код кажется корректным и соблюдает стандартные правила для проверки ISBN-13. Однако всегда полезно тестировать код с разными входами, чтобы убедиться в его корректности.

Некоторые предложения по альтернативным решениям:

  1. Вместо использования отдельных переменных CurPtr и EndPtr, можно использовать одиночную переменную и изменять ее значение соответствующим образом.
  2. Можно использовать более компактный способ инициализации переменных Accumulator и Counter, например, Accumulator := 0; Counter := 10;.
  3. Рекомендуется добавить обработку ошибок для случаев, когда входная строка null или пустая.

В целом код appears well-structured and easy to understand, making it a good starting point for further development and testing.

Проверка ISBN - алгоритм, позволяющий определить корректность международного_STANDARD_Book_Number (ISBN).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Пароли ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-14 23:39:30/0.006497859954834/0