Показать сообщение отдельно
  #7  
Старый 03.06.2013, 02:20
ИдиПейЧай ИдиПейЧай вне форума
Прохожий
 
Регистрация: 02.06.2013
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Если я тебя правильно понял, то тебе нужно реализовать обычный инкремент восьмиразрядного тридцатишестиричного числа (т.е. в системе счисления 36). В общем случае это делается примерно так:
Код:
const
  Digits: AnsiString = 'abcdefghijklmnopqrstuvwxyz0123456789'; // В этой строке находятся используемые
                                                               // "цифры" в порядке возрастания

procedure Increment(var Number: AnsiString);
var
  i, p: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    p := Pos(Number[i], Digits);
    if p = 0 then raise Exception.Create('Встретилась неизвестная цифра');
    Inc(p);
    if p > Length(Digits) then
    begin
      Number[i] := Digits[1];
      Dec(i);
    end else
    begin
      Number[i] := Digits[p];
      Exit;
    end;
  end;
end;

// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
const
  NumberLen = 8; // Количество "цифр" в "числе"
var
  s, First: AnsiString;
begin
  First := StringOfChar(Digits[1], NumberLen); // Первое "число" вроде такого "aaaaaaaa"
  s := First;
  repeat
    Caption:=s;
    Increment(s);
  until s = First; // Пока не вернёмся к первому "числу"
end;
Если константе Digits задать значение '0123456789', то получим инкрементирование обычных десятичных чисел, если задать '0123456789ABCDEF' то инкрементирование шестнадцатеричных чисел, если задать '01' то инкрементирование двоичных чисел и т.д.
Правда так как эта процедура предназначена для общего случая, то она не сильно шустрая. Если же важна скорость, то для твоего случая (36-ричного) можно соптимизировать её примерно так:
Код:
procedure Increment(var Number: AnsiString);
var
  i: Integer;
begin
  i := Length(Number);
  while i > 0 do
  begin
    case Number[i] of
      'a'..'y', '0'..'8': Number[i] := Succ(Number[i]);
      'z': Number[i] := '0';
      '9':
        begin
          Number[i] := 'a';
          Dec(i);
          Continue;
        end;
    else
      raise Exception.Create('Встретилась неизвестная цифра');
    end;
    Break;
  end;
end;
Есть так же возможности соптимизировать инкремент и для общего случая. Правда я не знаю нужно ли тебе это, поэтому описывать это не буду.

спасибо большое
Ответить с цитированием