Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Подскажите алгоритм, я что-то торможу!  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
Мужики, 2ые сутки мудрю..... безтолку.
Все знают Excel. так вот там есть строки и колонки.
Колонки называются так : A, B, C...Z, AA,AB...ZZ, AAA, AAB... ZZZ.......
т.е. колонка за номером 0 -> A, 1 -> B... 25 -> Z, 26 -> AA ...........

Надо написать функцию, которая получает целое число и возвращает его строковое представлениe. т.е. получая 0 возвращает А, 27 -> AB и т.д.

Я в начале подумал что тут можно применить логику систем счислений. то бишь здесь мы имеем 26-ричную систему счисления и вся задача заключалась бы в том чтоб из 26-ричной пересчитать в 10-ричную ...... но вот проблемка если А это 0 то АА получается 00, если же А это 1 то АА это 11 ( т.е. 10 мы пропускаем ) применить логику систем счислений не получится...... а как выкрутиться не знаю...

Третий час ночи...... задолбался уже....... может кто знает как решить?

С уважением..... Ашот.
5 июл 09, 01:41    [7377374]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
tanglir
Member

Откуда:
Сообщений: 28966
karapetyan_a,
А это принципиально необходимо? Я к тому, что в Экселе же есть режим, чтобы колонки тоже цифрами нумеровать, а не буквами (не помню как называется, но где-то в настройках есть).
5 июл 09, 07:34    [7377507]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 30611
проверь навсякий случай
давно не использовал, помню что был вариант в котором для больших n результат был неверный.
потом исправил, но не уверен, какой я именно вариант нашел сейчас и запостил :)

function TDExcel.ColonLetter( n:integer ) : string;
const letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
  if (n<=26)
  then ColonLetter := letter[n]
  else
    ColonLetter := letter[((N-1) div 26)] +
                   letter[((N-1) mod 26)+1 ];                   
end;
5 июл 09, 10:34    [7377565]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
tanglir
karapetyan_a,
А это принципиально необходимо? Я к тому, что в Экселе же есть режим, чтобы колонки тоже цифрами нумеровать, а не буквами (не помню как называется, но где-то в настройках есть).


Нет не принципиально, но хотелось бы не отходить от стандарта.
В принципе задача такая. Пишу класс обертку для работы из .NET с Excel.
Обычно надо
открыть/создать файл пустой/из шаблона.
Записать данные
Сохранить
Закрыть.
Вот и все в основном что нужно простым смертным.
Так вот придумал, чтоб удобно было бы обращаться с моим классом/оберткой использовать такой синтаксис (через индексаторы):

MyExceBookObject["Sheet1"].["A1"].Value/Formulа = 10/"=sum(A1;B1)";

Так вот доступ к листам возможен как по имени так и по индексу. тут проблем нет.
А доступ к ячейкам возможен в 2х вариантах:
1. по имени ("A1", "AB33"...)
2 по координатам ( [0,0], [27,33] )

Вот для первого варианта и нужна функция.
5 июл 09, 11:59    [7377625]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
S.G.
проверь навсякий случай
давно не использовал, помню что был вариант в котором для больших n результат был неверный.
потом исправил, но не уверен, какой я именно вариант нашел сейчас и запостил :)

function TDExcel.ColonLetter( n:integer ) : string;
const letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
  if (n<=26)
  then ColonLetter := letter[n]
  else
    ColonLetter := letter[((N-1) div 26)] +
                   letter[((N-1) mod 26)+1 ];                   
end;


Спасибо, проверю. О результатах доложу.........
5 июл 09, 12:01    [7377626]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
S.G.
проверь навсякий случай
давно не использовал, помню что был вариант в котором для больших n результат был неверный.
потом исправил, но не уверен, какой я именно вариант нашел сейчас и запостил :)

function TDExcel.ColonLetter( n:integer ) : string;
const letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
  if (n<=26)
  then ColonLetter := letter[n]
  else
    ColonLetter := letter[((N-1) div 26)] +
                   letter[((N-1) mod 26)+1 ];                   
end;


В Excel 2003 всего 256 колонок, что помещается в диапазон до IV
а Excel 2007 уже больше ( подозреваю что ~65000 ) так вот там уже проходит 3 позицию ААА
А в этом случае Ваша функция не работает. т.к. Вы предполагаете что позиций (то бишь букв ) максимум 2.

В принципе можно выкрутиться, по любому спасибо.

Просто за интерес, Можно же предположить что букв всего к примеру 3 (ABC) или 5 (ABCDE),
какая математика будет в таком случае.. ( т.е. в случае N-ричной системы )......... Хотелось не выкрутиться а написать универсальный механизм.
Но видимо Вы правы игра не стоит свеч, можно просто предположить что максимум это ZZZ и проверять:

if (N <= 26) then 1 char
if (N <= 26 * 26) then 2 char
otherwise 3 char........

Хотя, вот только подумал, в случае 3 символов вычислить будет не просто.....
5 июл 09, 13:30    [7377734]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
miksoft
Member

Откуда:
Сообщений: 38545
karapetyan_a
if (N <= 26 * 26)
скорее, как-то так:
if (N <= 26 * 26+26)
5 июл 09, 14:49    [7377819]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите алгоритм, я что-то торможу!  [new]
karapetyan_a
Member

Откуда: Yerevan, Armenia
Сообщений: 463
miksoft
karapetyan_a
if (N <= 26 * 26)
скорее, как-то так:
if (N <= 26 * 26+26)


:) согласен
5 июл 09, 22:33    [7378446]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить