![]() |
|
|
#1
|
||||
|
||||
|
В моей программе используются индентификаторы (у каждого объекта в списке он свой). Индентификатор должен быть в пределах от 0000 до ZZZZ. Используется алфавит по порядку: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ. Вот и сама задача: к одной строке прибавить и получить другую строку. Пример:
0000 -> 000A -> 000B -> ... -> 000Z -> 001A -> ... -> ZZZZ и тд. Здесь HEX не поможет, используются буквы всего алфавита. Не очень-то понятно объяснил. Если кто-то видел похожий исходник, или он у кого-то есть, поделитесь. P.S. Длина строки не имеет значения.Заранее спасибо! Последний раз редактировалось GriLab, 14.06.2011 в 13:10. |
|
#2
|
||||
|
||||
|
Используй 36-ричную систему.
(26+10=36). Хотя если тебе нужно просто прибавить 1 - можно подумать как оптимизировать. |
|
#3
|
||||
|
||||
|
Вот уже не первый раз встречаю подобную систему создания идентификатора и каждый раз подобная система страшно неудобна, тормознута и плохо дружит с тем-же SQL. Возникает простой вопрос: Нахрена козе баян? Чем вас не устраивают нормальные числовые идентификаторы?
|
|
#4
|
||||
|
||||
|
Да, и в правду.
Алгоритм-то я знаю, а вот как его реализовать не получается. |
|
#5
|
|||
|
|||
|
А разве не так?
0000 -> 0001 -> ... -> 0009 -> ... -> 9999 -> 000A -> 000B -> ... -> 000Z -> 001A -> ... -> ZZZZ |
|
#6
|
||||
|
||||
|
вот так чтоль?
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
alphabet: array [1..36] of char =
('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
var
q,w,e,r:integer;
begin
try
for q := Low(alphabet) to High(alphabet) do
for w := Low(alphabet) to High(alphabet) do
for e := Low(alphabet) to High(alphabet) do
for r := Low(alphabet) to High(alphabet) do
Write(alphabet[q]+alphabet[w]+alphabet[e]+alphabet[r]+'->');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end. |
|
#7
|
|||
|
|||
|
Параметры:
DEC:=десятичное число ZeroCount:=Минимальная длинна числа (добовляет нули) AddZero:=Добавлять нули (true/false) Код:
function DecTo36(DEC: Cardinal; ZeroCount:Byte; AddZero:Boolean):String;
const
Simbols: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
i:Cardinal;
SimCount,SC:Cardinal;
c36:String;
begin
SC:=0;
SimCount:=DEC;
while SimCount>=36 do
begin
if SC=0 then SimCount:=(DEC div 36)
else SimCount:=SimCount div 36;
SC:=SC+1;
end;
if SC>0 then
begin
for i:=0 to SC do
begin
if i=0 then c36:=Simbols[SimCount+1];
if (i<>0) and (i<>SC) then c36:=c36+Simbols[SimCount];
if i=SC then c36:=c36+Simbols[(DEC mod 36)+1];
end;
end else c36:=Simbols[(DEC mod 36)+1];
if DEC=36 then c36:='10';
if AddZero then
begin
for i:=1 to ZeroCount-Length(c36) do
c36:='0'+c36;
end;
Result:=c36;
end;Код:
Edit1.Text:=DecTo36(2150,4,true); |
|
#8
|
||||
|
||||
|
Всем спасибо. Сделал через функцию:
Код:
function GetNextValue(const Value: String): String;
const
Symbols: String = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
S1, S2, S3, S4, L: Integer;
begin
if Value = 'ZZZZ' then Exit;
S1 := Pos(Value[1], Symbols);
S2 := Pos(Value[2], Symbols);
S3 := Pos(Value[3], Symbols);
S4 := Pos(Value[4], Symbols);
L := Length(Symbols);
Inc(S1);
if S1 > L then
begin
S1 := 1;
Inc(S2);
if S2 > L then
begin
S2 := 1;
Inc(S3);
if S3 > L then
begin
S3 := 1;
Inc(S4);
if S4 > L then
WriteLn('Limit reached!');
end;
end;
end;
Result := Symbols[S1] + Symbols[S2] + Symbols[S3] + Symbols[S4];
end; |