Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.06.2011, 12:32
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию от 0000 до ZZZZ

В моей программе используются индентификаторы (у каждого объекта в списке он свой). Индентификатор должен быть в пределах от 0000 до ZZZZ. Используется алфавит по порядку: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ. Вот и сама задача: к одной строке прибавить и получить другую строку. Пример:

0000 -> 000A -> 000B -> ... -> 000Z -> 001A -> ... -> ZZZZ и тд.

Здесь HEX не поможет, используются буквы всего алфавита.

Не очень-то понятно объяснил. Если кто-то видел похожий исходник, или он у кого-то есть, поделитесь. P.S. Длина строки не имеет значения.

Заранее спасибо!

Последний раз редактировалось GriLab, 14.06.2011 в 13:10.
Ответить с цитированием
  #2  
Старый 14.06.2011, 13:52
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Используй 36-ричную систему.
(26+10=36).

Хотя если тебе нужно просто прибавить 1 - можно подумать как оптимизировать.
Ответить с цитированием
  #3  
Старый 14.06.2011, 14:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот уже не первый раз встречаю подобную систему создания идентификатора и каждый раз подобная система страшно неудобна, тормознута и плохо дружит с тем-же SQL. Возникает простой вопрос: Нахрена козе баян? Чем вас не устраивают нормальные числовые идентификаторы?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 14.06.2011, 14:24
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Да, и в правду.
Алгоритм-то я знаю, а вот как его реализовать не получается.
Ответить с цитированием
  #5  
Старый 14.06.2011, 14:47
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

А разве не так?

0000 -> 0001 -> ... -> 0009 -> ... -> 9999 -> 000A -> 000B -> ... -> 000Z -> 001A -> ... -> ZZZZ
Ответить с цитированием
  #6  
Старый 14.06.2011, 15:22
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

вот так чтоль?
Код:
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  
Старый 14.06.2011, 16:38
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Параметры:
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  
Старый 14.06.2011, 19:18
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Всем спасибо. Сделал через функцию:

Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter