Последовательные буквы в C #

Я хочу генерировать последовательные буквы на C #.

Например, первым значением переменной будет «a», за которым следует «b», «c», ... После «z» диапазон будет продолжаться «aa», «bb», ...

Что-то вроде

i=0;
while(i<40)
{
   Console.WriteLine(i);
   i++;
}

но используя буквы.


person Eduarth    schedule 09.05.2011    source источник
comment
Это домашнее задание? Или, может быть, вопрос на собеседовании?   -  person cost    schedule 09.05.2011
comment
Пожалуйста, опубликуйте, что вы пробовали до сих пор, чтобы мы могли помочь вам улучшить существующий код - вы не узнаете, пока не попробуете это сами.   -  person JasCav    schedule 09.05.2011
comment
Эдуарт, если какой-либо из опубликованных ответов решил вашу проблему, вы должны принять его (нажмите на галочку слева от ответа).   -  person Florian Greinacher    schedule 10.05.2011
comment
Принятый ответ на этот вопрос, безусловно, самый элегантный из тех, что я когда-либо видел: в C #, как я могу создать массив от A до ZZ, который аналогичен способу упорядочивания столбцов в Excel   -  person Cake or Death    schedule 19.01.2018


Ответы (7)


Вы можете увеличивать символ так же, как и целое число.

char c = 'a';

while(c <= 'z')
{
     // Do something with c
     c++;
}
person Florian Greinacher    schedule 09.05.2011

Обратите внимание, я только что придумал это. Я не пробовал.

for (int i=0; i<40; ++i)
{
    char digit = (char) (97 + i%26);  // utf/ascii code 97 == 'a'
    Console.WriteLine(new String(digit, i/26 + 1));
}

Конструктор String(char c, int n) возвращает строку, в которой символ c повторяется n раз. Оттуда все, что вам нужно, это то, что повторять («а» для 0, 26, 52 и т. Д.), И сколько раз повторять это (1 для 0, 2 для 26, 3 для 52 и т. Д.).

Также обратите внимание, что i может быть любым (ну, любым положительным числом). Я просто зациклил от 0 до 40, как и вы. Вам не нужно работать над этим или хранить промежуточные результаты.

person cHao    schedule 09.05.2011

Поскольку вы добавили новый тег домашнего задания, я не дам вам прямого ответа, но я дам вам точку в правильном направлении. Как сказал Флориан Грайнахер, вы можете «считать» символы ascii точно так же, как числа (на самом деле, я думаю, что вы можете, я никогда не делал этого с C #. Разрешает ли это строгая типизация?).

Воспользуйтесь советом Флориана, но следите за тем, сколько раз вы выполнили цикл a-z, и распечатайте больше копий того, что вам нужно, через большее количество итераций.

Вам нужно распечатать такие вещи, как «ab» и «ba», или просто «aa», «aaa» и т. Д.?

person cost    schedule 09.05.2011
comment
@cHao, я подозреваю, что это ошибка в вопросе ... то, что хочет OP, выглядит как номера столбцов Excel - person Thomas Levesque; 09.05.2011

Псевдокод:

Declare a base string
Inialize base string to ""
for each letter in alphabet
    print base_string + letter
    if(letter == last letter)
       base_string = base_string + letter
       letter = first letter

next letter
person Pepe    schedule 09.05.2011

Я бы объявил массив из 26 символов, где [0] = a, [1] = b и т. Д. Затем для данного целого числа разделите на 26 и сохраните значения частного и mod как переменные. Ответом будет элемент в позиции (mod-1), распечатанный (частное + 1) раз. Этот код ниже не идеален; вам, вероятно, придется использовать приведение, чтобы целые клетки играли хорошо. Кроме того, в этом примере я использую число 92, но вы можете использовать любое (число) ...

string[] letters = {'a', 'b', ... };
int number = 92;
int quotient = number / 26; // answer is 3
int mod = number % 26; // answer is 14
string answer = "";

for (int i = 0; i <= quotient; i ++) {
    answer += letters[mod - 1];
}

return answer;
person WEFX    schedule 09.05.2011
comment
Немного грязнее, чем должно быть, но неплохо. :) Если вы используете 92 в качестве примера, я бы предложил использовать переменную (number), а не литерал. Делает шаги более очевидными. - person cHao; 09.05.2011
comment
Вы правы @cHao, я объявил это (число), но потом забыл сослаться на него. Я редактировал это сейчас. Спасибо - person WEFX; 09.05.2011

Вы можете преобразовать int в char (например, так).
Таким образом вы можете использовать цикл for для int.
Вы можете использовать оператор if, чтобы проверить, превышает ли ваш int значение z, и если да, вычтите значение z из вашего int, чтобы узнать, в чем разница, которую вы можете использовать для напишите двойные символы.
Я бы посоветовал вам не зацикливаться на символах, поскольку это может стать беспорядочным, если вы передадите 'z'.

person Oren A    schedule 09.05.2011

Эта проблема отлично работает со стековой структурой данных. Каждый раз, когда вы увеличиваете букву, вы либо увеличиваете верхний элемент, либо меняете его на «а», а затем меняете следующий элемент. Если вы дойдете до базовой буквы, и это z, вы измените ее на a, а затем добавите a в стек.

Я не дам вам код.

person Troy S.    schedule 09.05.2011