|
Вопрос # 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>
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|