|
#1
|
||||
|
||||
от 0000 до ZZZZ
В моей программе используются индентификаторы (у каждого объекта в списке он свой). Индентификатор должен быть в пределах от 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; |