
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;
Есть так же возможности соптимизировать инкремент и для общего случая. Правда я не знаю нужно ли тебе это, поэтому описывать это не буду.
|
спасибо большое
|