| 
| 
 | Вопрос # 2 959/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Подскажите алгоритм
 Есть строковая переменная из 4 символов, что то типа ID
 Состоит из букв и цифр. Сначала идут буквы, потом цифры и надо увеличивать на 1
 Например:
 A123. Если заканчиваются цифры(доходит до A999), то берется следующая буква(A999, B001)
 Меня интересует, как здесь лучше всего инкрементить такой код?
 И еще из общего алгоритма надо убрать спец кода. Например код XX00 или XXXX и т.д. не должны участвовать в общей группе, они должны пропускаться
 Есть какие то мысли?
 
 Заранее, спасибо!
 
|  |   Вопрос задал: Irbis (статус: Посетитель)Вопрос отправлен: 1 июля 2009, 11:50
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 1 июля 2009, 13:19; участников в обсуждении: 4. 
|   | Dron (статус: Студент), 1 июля 2009, 12:05 [#1]:А в чём, собственно, проблема? Берёте последние 3 символа строки, преобразуете в число, увеличиваете его. Если стало 1000, то меняете первую букву на следующую. С уважением. |  
|   | Пупкин В В (статус: 2-ой класс), 1 июля 2009, 12:08 [#2]:если я правильно понял, то лучше использовать массив. |  
|   | Dron (статус: Студент), 1 июля 2009, 12:12 [#3]:Зачем массив? Весь набор ключей хранить? Они же легко генерятся. С уважением. |  
|   | Irbis (статус: Посетитель), 1 июля 2009, 12:34 [#4]:Не будет ли тормозить вычисления, когда я буду перебирать полученный код со спецкодами(их может быть много). Можно ли создать что то типа множества, что бы узнать, входит ли данный код в это множество или нет? |  
|   | Amidamaru (статус: 4-ый класс), 1 июля 2009, 12:54 [#5]:Я немного не понял насчет "из общего алгоритма надо убрать спец кода." но в общем всё делается как сказал Dron |  
|   | Пупкин В В (статус: 2-ой класс), 1 июля 2009, 13:00 [#6]:наверно не правильно понял. подумалось что надо менять название самой переменной а не её значение.
 |  
|   | Dron (статус: Студент), 1 июля 2009, 13:03 [#7]:Тормозить не будет - тут преобразования-то простые получаются вроде. Узнать входит или нет - вот тут уже массив нужно делать. Либо как-то алгоритмически по самому ID проверить (например, если первый символ - буква, а остальные - цифры, то входит).
 С уважением. |  
|   | Dron (статус: Студент), 1 июля 2009, 13:06 [#8]:Вот, кстати, ещё мысль: можно работать не со строками, а просто с числами. Тогда первая буква будет определяться числом тысяч в номере: 0 - A, 1 - B, 2 - C и т.д.: 0001 = A001
 1456 = B456
 2999 = C999
 и т.п. С числами работать будет ещё быстрее, чем со строками. Да и инкрементность тогда будет простейшая: увеличиваем число, а потом просто его перегоняем в буквенно-цифровой формат (т.е. заменяем первую цифру на соответствующую букву). Для букв второго десятка, соответственно, числа уже пойдут пятизначные.
 С уважением. |  
|   | Amidamaru (статус: 4-ый класс), 1 июля 2009, 13:19 [#9]:А можно в качестве счетчика использовать простой целый тип (Cardinal например, или int64) и только когда нужно отобразить - преобразовывать его в нужную строку. <code>
 procedure TForm1.SpinEdit1Change(Sender: TObject);
 var C:Cardinal;
 s:string;
 const ordA = ord('A');
 begin
 c:=SpinEdit1.Value;
 s:=chr((c div 1000)+ordA)+format('%.3d',[c mod 1000]);
 label1.Caption:=s;
 end;
 </code>
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |