Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
18:09:2007, 11:17
|
|
Новенький Группа: Новенький Сообщений: 88 Регистрация: 18:07:2007 Пользователь №: 11 896 Репутация: 0
|
Всем привет! У меня такой вопрос: как отсортировать слова по алфавиту? Например, есть 6 слов: "мама", "человек", "мир", "папа", "арбуз", "баня". Должно получиться так: "арбуз", "баня", "мама", "мир", "папа", "человек" :)
Как я понимаю нужно сравнивать коды символов. Например, код буквы "а" меньше, чем код буквы "б". Кстати, сравнением только первых букв не обойтись ;) Подскажите как это реализовать на языке Си? |
|
Сообщение
#1
|
|
![]() |
|
|
18:09:2007, 11:32
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
Цитата(BattleMage @ 18:09:2007, 14:17 ) Для сравнения можно использовать strcmp. Небольшой пример есть тут: ]]>http://forum.codeby.net/topic8605]]> |
|
Сообщение
#2
|
|
|
|
18:09:2007, 14:52
|
|
Новенький Группа: Новенький Сообщений: 6 Регистрация: 10:11:2006 Пользователь №: 7 745 Репутация: 0
|
если я не ошибаюсь можно получить аски коды символов, вот их и сравнивай помоему они идут по возростанию начиная от а, насколько я знаю в книге дейтела даже приведена таблица с аски и самими символами
|
|
Сообщение
#3
|
|
|
|
18:09:2007, 19:12
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
Для: crank...
Сразу анекдот вспомнился про удаление русским гланд через сами знаете что |
|
Сообщение
#4
|
|
|
|
18:09:2007, 19:22
|
|
Продвинутый Группа: Новенький Сообщений: 141 Регистрация: 26:08:2007 Из: Харьков Пользователь №: 12 480 Репутация: 2
|
Цитата(crank... @ 18:09:2007, 16:52 ) Сначала идут латинские 'A'..'Z', потом 'a'..'z'. После этого уже 'А'..'Я' и в самом конце 'а'..'я'. Из последовательности выпадают буквы ё и Ё. Кроме того, между группами есть промежутки других символов, а коды кириллицы также зависят от кодировки. |
|
Сообщение
#5
|
|
|
|
18:09:2007, 19:48
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
Да причем тут коды символов? Строки нужно сравнивать!
|
|
Сообщение
#6
|
|
|
|
18:09:2007, 20:05
|
|
Новенький ![]() Группа: Validating Сообщений: 81 Регистрация: 27:04:2007 Пользователь №: 10 505 Репутация: 0
|
BattleMage, если надо будет аски коды определить сделай цикл типа
перебираешь все коды от 0 до 255 он тебе распечатывает все номера в виде символов, то же самое обратно работает символ в цифру вот бы ещё с юнионами разобраться можно через юнион ещё А можно через память выводить как Шизик делает |
|
Сообщение
#7
|
|
|
|
18:09:2007, 22:39
|
|
Божественный Группа: Модеры Сообщений: 1 293 Регистрация: 17:05:2006 Из: Минск Пользователь №: 4 257 Репутация: 29
|
Для: Folderx
про юнион - это шутка была? По теме: stricmp спасет отца русской демократии. |
|
Сообщение
#8
|
|
|
|
19:09:2007, 05:29
|
|
Новенький Группа: Новенький Сообщений: 88 Регистрация: 18:07:2007 Пользователь №: 11 896 Репутация: 0
|
Вообще, European и Pasha правы: нужно сравнивать строки, а не коды символов. Спасибо, получилось ;)
|
|
Сообщение
#9
|
|
|
|
19:09:2007, 05:32
|
|
Мегагуру Группа: Достойный программист Сообщений: 632 Регистрация: 24:05:2006 Пользователь №: 4 397 Репутация: 6
|
вообщето то надо сравнивать с учетом локали..........
|
|
Сообщение
#10
|
|
|
|
19:09:2007, 07:36
|
|
Новенький ![]() Группа: Validating Сообщений: 81 Регистрация: 27:04:2007 Пользователь №: 10 505 Репутация: 0
|
Для: Folderx про юнион - это шутка была? У меня работает через юнион, только если не массив а просто переменная. С массивами там глюк видимо из-за разного количества памяти на каждый тип. А strcmp всё равно на символы всё будет раскладывать. Сообщение отредактировал Folderx - 19:09:2007, 07:40 |
|
Сообщение
#11
|
|
|
|
19:09:2007, 07:45
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
|
|
Сообщение
#12
|
|
|
|
19:09:2007, 07:47
|
|
Божественный Группа: Модеры Сообщений: 1 293 Регистрация: 17:05:2006 Из: Минск Пользователь №: 4 257 Репутация: 29
|
Для: Kmet
Вообще-то stricmp стравнивает с учетом локали. Для: Folderx а memcpy все равно по одному байту копирует, printf по одному символу выводит... Сообщение отредактировал Pasha - 19:09:2007, 07:48 |
|
Сообщение
#13
|
|
|
|
19:09:2007, 08:00
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
Для: Pasha
А потом все к машинным командам сводится |
|
Сообщение
#14
|
|
|
|
19:09:2007, 09:25
|
|
Мегагуру Группа: Достойный программист Сообщений: 632 Регистрация: 24:05:2006 Пользователь №: 4 397 Репутация: 6
|
Для: Pasha
ну вообщето не полностью, если не изменяет память с этой функцией есть пару нюансов, типа того что она учитывет только LC_CTYPE. Рекомендуемое решение это strcoll или stricoll |
|
Сообщение
#15
|
|
|
|
20:09:2007, 13:47
|
|
Продвинутый Группа: Программист Сообщений: 110 Регистрация: 29:06:2006 Из: Moscow Пользователь №: 5 123 Репутация: 0
|
Без изобретения колеса - все из стандартных библиотек:
Аргументы:sort_array - сам массив array_count - количество элементов в массиве word_size - длинна в байтах самого длинного слова или скока нуна символов для сравнения, например до 3-х, а остальные не в счет compar - адрес функции сравнения, можно указать стандартную strcmp или strcoll или вот так: Эта функция должна выдавать меньше нуля, если элемент p1 меньше p2; ноль, если равны; больше нуля, если элемент 1p больше 2p. В нее можно вставить toupper или tolower на первый символ, если нужно равенство заглавных и прописных (макрос в #include <ctype.h>).
|
|
Сообщение
#16
|
|
|
|
21:09:2007, 08:57
|
|
Новенький ![]() Группа: Validating Сообщений: 81 Регистрация: 27:04:2007 Пользователь №: 10 505 Репутация: 0
|
Зачем переписывать уже написанный и миллион раз использованный проверенный код? Да они не идеальные эти функции которые по дефолту там есть в си. У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную(разветвление внутри цикла чтобы сканф не брал два символа подряд, а брал один и потом выключался), вот и эти функции, во-первых надо включать заголовок стринг.х, во вторых они работают как-то непонятно, лучше свою понятную накатать, особенно непонятно работают переменные то у них адрес передаётся, то не адрес а значение, там не поймёшь. |
|
Сообщение
#17
|
|
|
|
21:09:2007, 09:07
|
|
Божественный Группа: Модеры Сообщений: 2 002 Регистрация: 4:09:2006 Из: Минск Пользователь №: 6 316 Репутация: 32
|
Цитата(Folderx @ 21:09:2007, 11:57 ) Твои, конечно же, идеальны, эффективны и понятны Цитата(Folderx @ 21:09:2007, 11:57 ) У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную Если не разобрался, то почему думаешь что проблема в scanf, а не в твоем коде? Цитата(Folderx @ 21:09:2007, 11:57 ) Очень серьезный недостаток Цитата(Folderx @ 21:09:2007, 11:57 ) В функции обработки строк, строки передаются по значению? Ну-ну.. |
|
Сообщение
#18
|
|
|
|
21:09:2007, 21:49
|
|
Новенький ![]() Группа: Validating Сообщений: 81 Регистрация: 27:04:2007 Пользователь №: 10 505 Репутация: 0
|
Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно(плюс ещё функций для строк может не доставать и всё равно придётся свою писать), ещё мне не нравятся ограничения(может я хочу чтобы он strcmp с обратной стороны делал, а такого параметра нет, а когда у меня есть своя функция, я могу её дописать наскоряк чтобы у неё был такой параметр, удобнее)
По сканфу, не, конкретный такой слёт в штопор, я потом по интернету лазил, нашёл подобные ошибки, тоже функция слетает просто и программа зависает(я по своей программе понял что там толи очистки буфера(которым сканф пользуется) нету, толи чо-то вот наподобие, потому что там был цикл и функция вроде должна одну строку взять, а она на втором шаге цикла продолжала брать первую строку(нормально да?), почему так, один оператор - одна строка(я так думаю так должно быть), мы же когда getchar() пишем, он же не берёт предыдущие символы которые мы с клавы вводили. Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого). |
|
Сообщение
#19
|
|
|
|
22:09:2007, 07:34
|
|
Божественный Группа: Модеры Сообщений: 1 293 Регистрация: 17:05:2006 Из: Минск Пользователь №: 4 257 Репутация: 29
|
Цитата(Folderx @ 22:09:2007, 00:49 ) Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить.Цитата(Folderx @ 22:09:2007, 00:49 ) Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".Цитата(Folderx @ 22:09:2007, 00:49 ) Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?
|
|
Сообщение
#20
|
|
|
|
22:09:2007, 21:09
|
|
Новенький ![]() Группа: Validating Сообщений: 81 Регистрация: 27:04:2007 Пользователь №: 10 505 Репутация: 0
|
Цитата Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить. Можешь сделать обратное сравнение, сделай, а не можешь так и делай всегда прямое, если бы ты ездил на велосипеде который изобрели самым первым, то ты б щас тут не сидел Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант. Цитата Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало". Так у меня есть конкретный пример, только кто этим будет заниматься, ты ? А если у тебя не получится разгадать, ты мне чо скажешь, а ну да ну да(смысл мне его щас откапывать сидеть, менять обратно код, чтобы ты мне сказал ну я не знаю спроси у кого-нибудь другого) Цитата Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так? Там string1[0] складывается с string1[1] а digit1[0] не складывается с digit1[1] Поэтому строки выводятся в сложенном виде, а числа (нулевые элементы) затёрлись как-то. |
|
Сообщение
#21
|
|
|
|
22:09:2007, 21:26
|
|
Божественный Группа: Модеры Сообщений: 1 293 Регистрация: 17:05:2006 Из: Минск Пользователь №: 4 257 Репутация: 29
|
Цитата(Folderx @ 23:09:2007, 00:09 ) Там string1[0] складывается с string1[1] а digit1[0] не складывается с digit1[1] Поэтому строки выводятся в сложенном виде, а числа (нулевые элементы) затёрлись как-то. Ты вообще представляешь как работает union? Это сложнейшая вещь Цитата(msdn) A union is a user-defined data or class type that, at any given time, contains only one object from its list of members (although that object can be an array or a class type). т.е. или string1, или string2, или digit1, или digit2. И лежат они в одном куске памяти, причем, скорее всего, первые 4 байта из string1/2 попадают на digit1/2[0]. Ты пишешь в первый байт '.', оно же 0x2E, во второй '*', оно же 0x2A. Должен получить в digit1/2[0] значение 0x00002A2E, оно же 10798. Проверяешь - все сходится.А теперь докажи мне, что у тебя неправильно работает scanf, и что проверенный годами и тысячами людей CRT хуже, чем твой самописный и недокументированный код. Сообщение отредактировал Pasha - 22:09:2007, 21:27 |
|
Сообщение
#22
|
|
|
|
22:09:2007, 23:12
|
|
Продвинутый Группа: Программист Сообщений: 110 Регистрация: 29:06:2006 Из: Moscow Пользователь №: 5 123 Репутация: 0
|
Folderx, похоже ты просто так не остановишься (хоть и не в тему самого вопроса), но заметь:
Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант. Это уже какой-то "наезд" на всё UNIX сообщество - именно там эта функция создавалась и годами оттачивалась, кстати, как и весь Си, на котором ты сейчас пишешь. Подробнее: Эти "топорные функции" используют повсеместно самые устойчивые операционками (и не только OS) на протяжении многих лет и у них таких глюков нет, а ты их "в черный список" из-за одного куска своей программы.Стандартный совет: Читай внимательно документацию - если ты программист (зарабатываешь этим), то твой инструмент включает и стандартные библиотеки, которые облегчают и ускоряют написание программ - надо внимательно изучать инструкции к применению того, чем ты себе кусок хлеба добываешь. Только без обид: Я где-то в 1985-1986 году (короче - давненько) перебрался с UNIX на MS-DOS (появились и у нас IBMки - правильнее РСюки) и там у меня функция printf вешала комп наглухо, если я с первым аргументом мудрил. Дошло до того, что пришлось закупать и перечитывать документацию (к тому времени уже печатали, а в ДОСе МЭНов нет, тем более по Си). А эта функция зеркальный близнец scanf's - как бы похоже на твой случай. Замечу еще одну вещь: Функции из стандартных библиотек, обычно переписывают по двум причинам:
|
|
Сообщение
#23
|
|