Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Сортировка по алфавиту
BattleMage
Вставить ник
сообщение 18:09:2007, 11:17
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 88
Регистрация: 18:07:2007
Пользователь №: 11 896



Репутация:   0  


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

Подскажите как это реализовать на языке Си?
Подняться вверх 
 
Сообщение #1
2 страниц V   1 2 >  
Новая тема 
Ответов (1 - 29)
European
Вставить ник
сообщение 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
crank...
Вставить ник
сообщение 18:09:2007, 14:52
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 6
Регистрация: 10:11:2006
Пользователь №: 7 745



Репутация:   0  


если я не ошибаюсь можно получить аски коды символов, вот их и сравнивай помоему они идут по возростанию начиная от а, насколько я знаю в книге дейтела даже приведена таблица с аски и самими символами
Подняться вверх 
 
Сообщение #3
European
Вставить ник
сообщение 18:09:2007, 19:12
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 2 002
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316



Репутация:   32  


Для: crank...
Сразу анекдот вспомнился про удаление русским гланд через сами знаете что
Подняться вверх 
 
Сообщение #4
shisik
Вставить ник
сообщение 18:09:2007, 19:22
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Новенький
Сообщений: 141
Регистрация: 26:08:2007
Из: Харьков
Пользователь №: 12 480



Репутация:   2  


Цитата(crank... @ 18:09:2007, 16:52 )
помоему они идут по возростанию начиная от а
*

Сначала идут латинские 'A'..'Z', потом 'a'..'z'. После этого уже 'А'..'Я' и в самом конце 'а'..'я'. Из последовательности выпадают буквы ё и Ё. Кроме того, между группами есть промежутки других символов, а коды кириллицы также зависят от кодировки.
Подняться вверх 
 
Сообщение #5
European
Вставить ник
сообщение 18:09:2007, 19:48
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 2 002
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316



Репутация:   32  


Да причем тут коды символов? Строки нужно сравнивать!
Подняться вверх 
 
Сообщение #6
Folderx
Вставить ник
сообщение 18:09:2007, 20:05
Цитата Ответить 


Новенький
*

Группа: Validating
Сообщений: 81
Регистрация: 27:04:2007
Пользователь №: 10 505



Репутация:   0  


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

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

int i;
for (i = 0; i <= 255; i++)
printf("%c", i);


он тебе распечатывает все номера в виде символов, то же самое обратно работает символ в цифру

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

union symbols { int a; char b; } symbols;
symbols.a = 46;
printf("%c", symbols.b);
выведет символ точку


А можно через память выводить как Шизик делает laugh.gif
Подняться вверх 
 
Сообщение #7
Pasha
Вставить ник
сообщение 18:09:2007, 22:39
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 1 293
Регистрация: 17:05:2006
Из: Минск
Пользователь №: 4 257



Репутация:   29  


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

По теме: stricmp спасет отца русской демократии.
Подняться вверх 
 
Сообщение #8
BattleMage
Вставить ник
сообщение 19:09:2007, 05:29
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 88
Регистрация: 18:07:2007
Пользователь №: 11 896



Репутация:   0  


Вообще, European и Pasha правы: нужно сравнивать строки, а не коды символов. Спасибо, получилось ;)
Подняться вверх 
 
Сообщение #9
Kmet
Вставить ник
сообщение 19:09:2007, 05:32
Цитата Ответить 


Мегагуру
Иконка группы

Группа: Достойный программист
Сообщений: 632
Регистрация: 24:05:2006
Пользователь №: 4 397



Репутация:   6  


вообщето то надо сравнивать с учетом локали..........
Подняться вверх 
 
Сообщение #10
Folderx
Вставить ник
сообщение 19:09:2007, 07:36
Цитата Ответить 


Новенький
*

Группа: Validating
Сообщений: 81
Регистрация: 27:04:2007
Пользователь №: 10 505



Репутация:   0  


Цитата(Pasha @ 19:09:2007, 00:39 ) *
Для: Folderx
про юнион - это шутка была?

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

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

Сообщение отредактировал Folderx - 19:09:2007, 07:40
Подняться вверх 
 
Сообщение #11
European
Вставить ник
сообщение 19:09:2007, 07:45
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 2 002
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316



Репутация:   32  


Цитата(Folderx @ 19:09:2007, 10:36 )
А strcmp всё равно на символы всё будет раскладывать.
*

Зачем переписывать уже написанный и миллион раз использованный проверенный код?
Подняться вверх 
 
Сообщение #12
Pasha
Вставить ник
сообщение 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
European
Вставить ник
сообщение 19:09:2007, 08:00
Цитата Ответить 


Божественный
Иконка группы

Группа: Модеры
Сообщений: 2 002
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316



Репутация:   32  


Для: Pasha
А потом все к машинным командам сводится smile.gif
Подняться вверх 
 
Сообщение #14
Kmet
Вставить ник
сообщение 19:09:2007, 09:25
Цитата Ответить 


Мегагуру
Иконка группы

Группа: Достойный программист
Сообщений: 632
Регистрация: 24:05:2006
Пользователь №: 4 397



Репутация:   6  


Для: Pasha
ну вообщето не полностью, если не изменяет память с этой функцией есть пару нюансов, типа того что она учитывет только LC_CTYPE. Рекомендуемое решение это strcoll или stricoll
Подняться вверх 
 
Сообщение #15
garrymax
Вставить ник
сообщение 20:09:2007, 13:47
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Программист
Сообщений: 110
Регистрация: 29:06:2006
Из: Moscow
Пользователь №: 5 123



Репутация:   0  


Без изобретения колеса - все из стандартных библиотек:
#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 или вот так:
/*это в качестве функции сравнения - compar*/
int  intcompare_elements (char **p1, char **p2)  {
    return strcoll (*p1,*p2);
}
Эта функция должна выдавать меньше нуля, если элемент p1 меньше p2; ноль, если равны; больше нуля, если элемент 1p больше 2p. В нее можно вставить toupper или tolower на первый символ, если нужно равенство заглавных и прописных (макрос в #include <ctype.h>).
Подняться вверх 
 
Сообщение #16
Folderx
Вставить ник
сообщение 21:09:2007, 08:57
Цитата Ответить 


Новенький
*

Группа: Validating
Сообщений: 81
Регистрация: 27:04:2007
Пользователь №: 10 505



Репутация:   0  


Цитата(European @ 19:09:2007, 09:45 ) *
Зачем переписывать уже написанный и миллион раз использованный проверенный код?

Да они не идеальные эти функции которые по дефолту там есть в си.
У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную(разветвление внутри цикла чтобы сканф не брал два символа подряд, а брал один и потом выключался), вот и эти функции, во-первых надо включать заголовок стринг.х, во вторых они работают как-то непонятно, лучше свою понятную накатать, особенно непонятно работают переменные то у них адрес передаётся, то не адрес а значение, там не поймёшь.
Подняться вверх 
 
Сообщение #17
European
Вставить ник
сообщение 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
Folderx
Вставить ник
сообщение 21:09:2007, 21:49
Цитата Ответить 


Новенький
*

Группа: Validating
Сообщений: 81
Регистрация: 27:04:2007
Пользователь №: 10 505



Репутация:   0  


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

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

Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
Подняться вверх 
 
Сообщение #19
Pasha
Вставить ник
сообщение 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 )
По сканфу ...snip...
*
Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".
Цитата(Folderx @ 22:09:2007, 00:49 )
Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
*
Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?
Подняться вверх 
 
Сообщение #20
Folderx
Вставить ник
сообщение 22:09:2007, 21:09
Цитата Ответить 


Новенький
*

Группа: Validating
Сообщений: 81
Регистрация: 27:04:2007
Пользователь №: 10 505



Репутация:   0  


Цитата
Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить.

Можешь сделать обратное сравнение, сделай, а не можешь так и делай всегда прямое, если бы ты ездил на велосипеде который изобрели самым первым, то ты б щас тут не сидел cool.gif
Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант.

Цитата
Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".

Так у меня есть конкретный пример, только кто этим будет заниматься, ты ?
А если у тебя не получится разгадать, ты мне чо скажешь, а ну да ну да(смысл мне его щас откапывать сидеть, менять обратно код, чтобы ты мне сказал ну я не знаю спроси у кого-нибудь другого)

Цитата
Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?

Там string1[0] складывается с string1[1]
а digit1[0] не складывается с digit1[1]

Поэтому строки выводятся в сложенном виде, а числа (нулевые элементы) затёрлись как-то.
Подняться вверх 
 
Сообщение #21
Pasha
Вставить ник
сообщение 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? Это сложнейшая вещь smile.gif. Если бы у тебя хватило времени открыть хотя бы мсдн, ты бы увидел следующее:
Цитата(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
garrymax
Вставить ник
сообщение 22:09:2007, 23:12
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Программист
Сообщений: 110
Регистрация: 29:06:2006
Из: Moscow
Пользователь №: 5 123



Репутация:   0  


Folderx, похоже ты просто так не остановишься (хоть и не в тему самого вопроса), но заметь:
Цитата(Folderx @ 23:09:2007, 01:09 ) *
Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант.
Это уже какой-то "наезд" на всё UNIX сообщество - именно там эта функция создавалась и годами оттачивалась, кстати, как и весь Си, на котором ты сейчас пишешь. Подробнее: Эти "топорные функции" используют повсеместно самые устойчивые операционками (и не только OS) на протяжении многих лет и у них таких глюков нет, а ты их "в черный список" из-за одного куска своей программы.

Стандартный совет: Читай внимательно документацию - если ты программист (зарабатываешь этим), то твой инструмент включает и стандартные библиотеки, которые облегчают и ускоряют написание программ - надо внимательно изучать инструкции к применению того, чем ты себе кусок хлеба добываешь.

Только без обид: Я где-то в 1985-1986 году (короче - давненько) перебрался с UNIX на MS-DOS (появились и у нас IBMки - правильнее РСюки) и там у меня функция printf вешала комп наглухо, если я с первым аргументом мудрил. Дошло до того, что пришлось закупать и перечитывать документацию (к тому времени уже печатали, а в ДОСе МЭНов нет, тем более по Си). А эта функция зеркальный близнец scanf's - как бы похоже на твой случай.

Замечу еще одну вещь: Функции из стандартных библиотек, обычно переписывают по двум причинам:
  1. Вопрос безопасности - возможность использования их при внешних аргументах для предотвращения DOS-атак
  2. Ускорение выполнение программы - выполнения ограниченных возможностей без лишних проверок
Так вот второе, из-за того, что стандартная функция оттачивалась годами и не одним программистом, обычно давала обратный результат. Но из-за "глючности" ? - ...........
Подняться вверх 
 
Сообщение #23
Folderx