2012-02-13 3 views
3

Я пытаюсь написать код, который преобразует числа в алфавиты. Например, 1 будет «A», 2 будет «B», 3 будет «C» и т. Д. Я думаю писать 26 утверждений. Мне интересно, есть ли лучший способ сделать это ...Преобразование чисел в алфавит в C++

Спасибо!

+2

Вы можете прочитать о 'switch' заявлении, а также. В этом случае это не оптимально, но часто это хорошая замена для большой цепочки if-утверждений. – MSalters

ответ

18

Используйте массив букв.

char nth_letter(int n) 
{ 
    assert(n >= 1 && n <= 26) 
    return "abcdefghijklmnopqrstuvwxyz"[n-1]; 
} 
+0

спасибо, что ответили на мой пост. Конечно, это помогло бы мне и всем тем, кто задал бы тот же вопрос. – Bhabes

+0

Если это решит вашу проблему, вы должны принять ее как лучший ответ. – Amol

7

Если вы можете рассчитывать на использовании набора ASCII символов, где они являются последовательными, то вы можете конвертировать

char intToAlphabet(int i) 
{ 
    return static_cast<char>('A' - 1 + i); 
} 

Если вы иногда можете полагаться на это, например, вы можете установить флаг компилятора или аналогичный для конкретной цели, вы также можете использовать этот код для этой конкретной сборки.

В противном случае используйте статическую таблицу поиска (как предложили другие).

Обратите внимание, что предпочтительнее «утверждать» ваш диапазон, если ваш нумерованный ввод поступает из переменных программы, которые, как вы знаете, никогда не должны быть вне пределов досягаемости.

Если входные данные поступают из предоставленных пользователем данных, где пользователи могут потенциально предоставлять данные изгоев, вам нужен способ обработки, который не является «неопределенным поведением». Поэтому вам нужно будет проверить каждое значение и либо выбросить исключение (проинформировать пользователя об исправлении их данных), либо использовать какой-либо символ, чтобы указать на плохой ввод.

+3

Вы не можете положиться на ASCII. (На самом деле, я не знаю какой-либо системы сегодня, которая использует ASCII. И алфавитные символы не смежны в латинском 1 (вероятно, наиболее широко используемая однобайтовая кодировка). И в EBCDIC (используется на мэйнфреймах IBM) даже 26 неактивные альфа-символы не соприкасаются. –

+0

Возможно, вы можете проверить статически, что приведенное выше работает, и используйте свое решение, если это не так. Когда выше это работает, оно, скорее всего, будет более высоким, поскольку компилятор почти наверняка сделает это, и если вы делаете миллионы, это может иметь значение. – CashCow

+0

спасибо за ответ на мой пост. Конечно, это поможет мне и всем тем, кто задал бы тот же вопрос. – Bhabes

1

что-то подобное

my_print(int x) 
{ 
    char symbol = (char)('A' + x - 1); 
    cout << symbol; 
} 
+2

Нет никакой гарантии, что алфавитные символы будут смежными, а на самом деле, в некоторых кодировках (EBCDIC) они не являются. –

+0

спасибо за ответ на мой пост. Конечно, это помогло бы мне и всем тем, кто задал бы тот же вопрос. – Bhabes

2

Самый простой способ будет использовать таблицу:

char 
remap(int original) 
{ 
    static char const remap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    return original >= 0 && original < sizeof(remap) - 1 
     ? remap[ original ] 
     : '?'; // or throw, or ... 
} 
+0

Мне нравится ваше решение в «статической» версии, где вы не можете гарантировать, что символы являются последовательными преобразованиями. Я бы предпочел утверждать проверку диапазона, хотя это должно быть в коде высокой производительности. – CashCow

+0

спасибо, что ответили на мое сообщение. Конечно, это помогло бы мне и всем тем, кто задал бы тот же вопрос. – Bhabes

+0

@CashCow И как вы можете определить что-либо статически? Тот факт, что последний элемент таблицы минус первый, равен одному меньшему, чем длина таблицы, не означает, что все промежуточные значения находятся в диапазоне. И в зависимости от системы это может быть быстрее, чем что-то вроде «A + оригинал». (Вероятнее всего, в старых системах, но вы никогда не знаете.) –