Сортировка по алфавиту

Тема в разделе "Общие вопросы по С и С++", создана пользователем BattleMage, 18 сен 2007.

  1. BattleMage

    BattleMage Гость

    Всем привет! У меня такой вопрос: как отсортировать слова по алфавиту? Например, есть 6 слов: "мама", "человек", "мир", "папа", "арбуз", "баня". Должно получиться так: "арбуз", "баня", "мама", "мир", "папа", "человек" :)
    Как я понимаю нужно сравнивать коды символов. Например, код буквы "а" меньше, чем код буквы "б". Кстати, сравнением только первых букв не обойтись ;)

    Подскажите как это реализовать на языке Си?
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-BattleMage+18:09:2007, 14:17 -->
    <span class="vbquote">(BattleMage @ 18:09:2007, 14:17 )</span><!--QuoteEBegin-->Подскажите как это реализовать на языке Си?
    [snapback]78649" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Для сравнения можно использовать strcmp.
    Небольшой пример есть тут: http://codeby.net/forum/threads/8605
     
  3. crank...

    crank... Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: crank...
    Сразу анекдот вспомнился про удаление русским гланд через сами знаете что
     
  5. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    <!--QuoteBegin-crank...+18:09:2007, 16:52 -->
    <span class="vbquote">(crank... @ 18:09:2007, 16:52 )</span><!--QuoteEBegin-->помоему они идут по возростанию начиная от а
    [snapback]78680" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Сначала идут латинские 'A'..'Z', потом 'a'..'z'. После этого уже 'А'..'Я' и в самом конце 'а'..'я'. Из последовательности выпадают буквы ё и Ё. Кроме того, между группами есть промежутки других символов, а коды кириллицы также зависят от кодировки.
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Да причем тут коды символов? Строки нужно сравнивать!
     
  7. Folderx

    Folderx Гость

    BattleMage, если надо будет аски коды определить сделай цикл типа

    перебираешь все коды от 0 до 255

    Код (Text):
    int i;
    for (i = 0; i <= 255; i++)
    printf("%c", i);
    он тебе распечатывает все номера в виде символов, то же самое обратно работает символ в цифру

    вот бы ещё с юнионами разобраться можно через юнион ещё

    Код (Text):
    union symbols { int a; char b; } symbols;
    symbols.a = 46;
    printf("%c", symbols.b);
    выведет символ точку
    А можно через память выводить как Шизик делает :huh:
     
  8. Pasha

    Pasha Гость

    Для: Folderx
    про юнион - это шутка была?

    По теме: stricmp спасет отца русской демократии.
     
  9. BattleMage

    BattleMage Гость

    Вообще, European и Pasha правы: нужно сравнивать строки, а не коды символов. Спасибо, получилось ;)
     
  10. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    вообщето то надо сравнивать с учетом локали..........
     
  11. Folderx

    Folderx Гость

    У меня работает через юнион, только если не массив а просто переменная. С массивами там глюк видимо из-за разного количества памяти на каждый тип.

    А strcmp всё равно на символы всё будет раскладывать.
     
  12. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Folderx+19:09:2007, 10:36 -->
    <span class="vbquote">(Folderx @ 19:09:2007, 10:36 )</span><!--QuoteEBegin-->А strcmp всё равно на символы всё будет раскладывать.
    [snapback]78776" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Зачем переписывать уже написанный и миллион раз использованный проверенный код?
     
  13. Pasha

    Pasha Гость

    Для: Kmet
    Вообще-то stricmp стравнивает с учетом локали.
    Для: Folderx
    а memcpy все равно по одному байту копирует, printf по одному символу выводит...
     
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Pasha
    А потом все к машинным командам сводится :)
     
  15. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Для: Pasha
    ну вообщето не полностью, если не изменяет память с этой функцией есть пару нюансов, типа того что она учитывет только LC_CTYPE. Рекомендуемое решение это strcoll или stricoll
     
  16. garrymax

    garrymax Гость

    Без изобретения колеса - все из стандартных библиотек:
    Код (Text):
    #include <stdlib.h>
    void qsort (void *sort_array, size_t array_count, size_t word_size, int (*compar) (const void *,const void *));
    Аргументы:
    sort_array - сам массив
    array_count - количество элементов в массиве
    word_size - длинна в байтах самого длинного слова или скока нуна символов для сравнения, например до 3-х, а остальные не в счет
    compar - адрес функции сравнения, можно указать стандартную strcmp или strcoll или вот так:
    Код (Text):
    /*это в качестве функции сравнения - compar*/
    int intcompare_elements (char **p1, char **p2) {
    return strcoll (*p1,*p2);
    }
    Эта функция должна выдавать меньше нуля, если элемент p1 меньше p2; ноль, если равны; больше нуля, если элемент 1p больше 2p. В нее можно вставить toupper или tolower на первый символ, если нужно равенство заглавных и прописных (макрос в #include <ctype.h>).
     
  17. Folderx

    Folderx Гость

    Да они не идеальные эти функции которые по дефолту там есть в си.
    У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную(разветвление внутри цикла чтобы сканф не брал два символа подряд, а брал один и потом выключался), вот и эти функции, во-первых надо включать заголовок стринг.х, во вторых они работают как-то непонятно, лучше свою понятную накатать, особенно непонятно работают переменные то у них адрес передаётся, то не адрес а значение, там не поймёшь.
     
  18. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
    <span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->Да они не идеальные эти функции которые по дефолту там есть в си.
    [snapback]79074" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Твои, конечно же, идеальны, эффективны и понятны
    <!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
    <span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную
    [snapback]79074" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Если не разобрался, то почему думаешь что проблема в scanf, а не в твоем коде?<!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
    <span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->во-первых надо включать заголовок стринг.х,
    [snapback]79074" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Очень серьезный недостаток
    <!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
    <span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->то у них адрес передаётся, то не адрес а значение, там не поймёшь.
    [snapback]79074" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    В функции обработки строк, строки передаются по значению? Ну-ну..
     
  19. Folderx

    Folderx Гость

    Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно(плюс ещё функций для строк может не доставать и всё равно придётся свою писать), ещё мне не нравятся ограничения(может я хочу чтобы он strcmp с обратной стороны делал, а такого параметра нет, а когда у меня есть своя функция, я могу её дописать наскоряк чтобы у неё был такой параметр, удобнее)

    По сканфу, не, конкретный такой слёт в штопор, я потом по интернету лазил, нашёл подобные ошибки, тоже функция слетает просто и программа зависает(я по своей программе понял что там толи очистки буфера(которым сканф пользуется) нету, толи чо-то вот наподобие, потому что там был цикл и функция вроде должна одну строку взять, а она на втором шаге цикла продолжала брать первую строку(нормально да?), почему так, один оператор - одна строка(я так думаю так должно быть), мы же когда getchar() пишем, он же не берёт предыдущие символы которые мы с клавы вводили.

    Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
     
  20. Pasha

    Pasha Гость

    <!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
    <span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно
    [snapback]79172" rel="nofollow" target="_blank[/snapback]​
    [/quote]Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить.<!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
    <span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->По сканфу ...snip...
    [snapback]79172" rel="nofollow" target="_blank[/snapback]​
    [/quote]Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".
    <!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
    <span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
    [snapback]79172" rel="nofollow" target="_blank[/snapback]​
    [/quote]Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?
     
Загрузка...

Поделиться этой страницей