| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > сортировка массива структур |
| Автор: SergXP 17.11.2008, 12:18 | ||||
| Добрый день! Никак не могу отсортировать массив структур, поэтому прошу помощи. Имеется структура:
Задаю переменную:
Есть функции, которые считывают из файла и записывают в массив структуры bd[i].key bd[i].family и тд. Данные считыватся правильно и также правильно заносятся в этот массив структур Пролема в том, что мне не удается отсортировать этот массив по определенному полю. Допустим по полю family. Уже стока методов перепробывал, результатов 0. Прошу, напишите хотябы примерно по моему примеру, как необходимо отсортировать данные. http://forum.vingrad.ru/topic-93423.html - читал эту тему, мало чего понял Спасибо! |
| Автор: Lazin 17.11.2008, 12:40 | ||
используй std::sort
|
| Автор: DareDevil225 17.11.2008, 13:01 | ||
| А что именно там Вам не понятно - можно поконкретнее? Вопрос тот же самый и ответ дан.
|
| Автор: SergXP 17.11.2008, 13:49 | ||
DareDevil225, вышла ошибка
Что это? чего он не нашел template <typename T, typename M> я указал template <class T, class M> что не правильно? Думаю вы уже видети, что я не профи, но пытаюсь хорошо разобраться. Спасибо. |
| Автор: DareDevil225 17.11.2008, 13:59 |
| SergXP, а можно на весь код глянуть? |
| Автор: Cтpaнник 17.11.2008, 14:02 | ||
|
| Автор: SergXP 17.11.2008, 14:18 | ||
DareDevil225, только в этом коде целая программа)) Несколько методов сортировок))
|
| Автор: DareDevil225 17.11.2008, 14:37 |
| М-да, совсем все не нужно было выкладывать Нужно было только те места, где используется данная функция, т.е. объявления функции sort и функции indexing СТранно, вроде должно работать - а в какой строке ошибку выдает и весь этот код в одном файле или в нескольких? (т.е. объявление шаблона фунции sort и indexing находятся в одном файле?) |
| Автор: SergXP 17.11.2008, 14:42 |
| DareDevil225, все в одном файле. using namespace std; - нехочет работать! |
| Автор: DareDevil225 17.11.2008, 14:54 |
| SergXP, что значит не хочет? что компилятор говорит по этому поводу? |
| Автор: SergXP 17.11.2008, 15:04 |
| DareDevil225, на строку using namespace std; говорит Declaration Syntax error Если и вторая ошибка, которая указана выше Could not find a match for 'sort (base *,int,int base::*)' |
| Автор: DareDevil225 17.11.2008, 15:10 | ||||||
попробуйте изменить
на
про это ничего не понял, можно точнее мысль выразить |
| Автор: SergXP 17.11.2008, 15:12 |
| DareDevil225, может все дело в компиляторе? Borland C++ 3.1 for DOS? Что-то не понятно. |
| Автор: DareDevil225 17.11.2008, 15:14 |
| Кстати, каким компилятором пользуетесь? Добавлено @ 15:19 Понятие namespace было добавлено в С++ где-то в середине 90-х, если не ошибаюсь, то в Borland C++ 3.1 for DOS еще не было понятия namespase. Программы с namespace ( using namespace std; ) должны использовать iostream, без него - iostream.h. |
| Автор: SergXP 17.11.2008, 15:19 |
| изменил, стало 11 ошибок, не возможно подключить файл <iostream> Насчет второй ошибки сам не пойму. указывает на строку std::sort(bd, count, &base::key); |
| Автор: DareDevil225 17.11.2008, 15:22 |
| SergXP, в общем подключай просто 1. #include <iostream.h> 2. using namespace std; - вообще не пиши 3. и шаблонную функцию sort переименуй - например в Sort или MySort все должно заработать |
| Автор: SergXP 17.11.2008, 15:27 | ||
А это как? т.е. всмысле? |
| Автор: DareDevil225 17.11.2008, 15:30 | ||||
и в функции indexing вызывай
переименовать нужно, потому что в файле iostream.h есть своя функция sort, а поскольку пространства имен (namespace) еще не было, то происходит перекрытие методов. |
| Автор: Lazin 17.11.2008, 15:49 |
| этот компилятор скоро будет отмечать 20-ти летний юбилей, как можно им пользоваться, когда есть столько альтернатив, в том числе и бесплатных? |
| Автор: DareDevil225 17.11.2008, 16:08 |
| Lazin, вопрос не в том как можно им пользоваться, а как решить поставленную задачу - раз пользуются, значит либо есть только он, либо необходимо использовать только его |
| Автор: SergXP 17.11.2008, 16:28 |
| DareDevil225, таже самая ошибка. |
| Автор: DareDevil225 17.11.2008, 17:33 |
| SergXP, тогда не знаю, значит компилятор не понимает, нужно именно на нем или можно другой использовать? |
| Автор: SergXP 17.11.2008, 17:42 |
| DareDevil225, ну мы используем его. А вы проверяли у себя мой код на компиляторе? Работает? |
| Автор: DareDevil225 17.11.2008, 18:09 | ||
У меня работает вот так
|
| Автор: SergXP 17.11.2008, 18:29 |
| DareDevil225, в моем компиляторе таже самая ошибка! Сейчас попробую в другом |
| Автор: SergXP 17.11.2008, 18:50 |
| DareDevil225, в Билдере 6 не компилируется очень много ошибок Что делать? Уже несколько дней бьюсь с этой проблемой. Не бросайте, пжл! Каким еще можно компилятором проверить? |
| Автор: DareDevil225 17.11.2008, 18:57 |
| SergXP, какие ошибки хоть выдает? |
| Автор: SergXP 17.11.2008, 19:05 | ||
DareDevil225, очень разные и не понятные
Прикрепил свой исходник Builder |
| Автор: DareDevil225 17.11.2008, 19:17 |
| Посмотрю, только завтра, с работы уже ухожу! |
| Автор: SergXP 17.11.2008, 19:18 |
| Изменил переменную с count на zap, программа запускается! |
| Автор: SergXP 17.11.2008, 22:45 |
| DareDevil225, все программа запускается без ошибок, но сортировка не происходит! Массив остается прежним! |
| Автор: inside_pointer 18.11.2008, 02:51 | ||||
рабочий пример на сишнике
вывод
когда сравниваются строки например, нельзя передавать в qsort указатели на них, иначе будет компилироваться и ничего не делаться, дебаггер тоже внутрь qsort не пускает, потому непонятно что там и как здесь заданы три структуры, сначала сортировка их первых значений, потом вторых, потом третьих ну и вывод (задана локальная переменная блока одноимённая, чтобы можно было вынести цикл за пределы если надо посмотреть структуры в первоначальном виде (а так лучше так не делать, т.к. одноимённые переменные вносят путанницу в код, плохой стиль и тд) update: убрал совпадения (чтобы все разные были) |
| Автор: SergXP 18.11.2008, 10:22 |
| inside_pointer, спасибо! Сейчас попробую! |
| Автор: DareDevil225 18.11.2008, 10:34 |
| только она не правильно работает))) Добавлено через 2 минуты и 5 секунд Кстати, функция indexing для каких целей нужна? |
| Автор: SergXP 18.11.2008, 12:03 | ||||
| DareDevil225, да, это точно. Не работает код. Функция indexing - это типа индексация. Считываю из файла данные(LoadFromFile) и загоняю их в массив data В начале кода я объявил переменную
И в этот массив структур заношу все данные считанные из файла, которые находятся в массиве data. Мне нужно было произвести индексацию всех записей, в литературе ничего ро это не нашел. Делал так, как сообразил. Вся проблема в том, что массив структур не сортируется. Если имеем, допустим:
то при использовании сортировки, она не происходит! Либо одни ошибки появляются, либо просто выводится список без сортирования. |
| Автор: DareDevil225 18.11.2008, 13:44 | ||
вот так попробуйте:
Добавлено @ 13:46 У меня на Borland Developer Studio 2006 все работает без проблем и как надо |
| Автор: SergXP 18.11.2008, 14:34 | ||
| DareDevil225, компилирую на Borland C++ 6 Builder Компилируется без ошибок. Данные из файла считываются не правильно. Файл base.txt содержит в себе записи и имеет вид:
Сейчас попробую настроить вывод из файла. |
| Автор: SergXP 18.11.2008, 15:01 |
| DareDevil225, прошу прощения, спасибо за код. Но к сожалению мне нужно сначала считывать в массив. а потом уже присвоить к структуре. |
| Автор: DareDevil225 18.11.2008, 18:03 | ||
SergXP,
не понимаю для каких целей это нужно(в задаче я этого не заметил в LoadFromFile() сначала считывате в ваш массив и затем в этой же функции заполняете структуру данными из массива. в SaveInFile() тогда сначала заполняете массив данными из структуры а потом сохраняете в файл этот массив. Но в любом случае, в остальных функциях необходимо работать только со структурой, исходя из задания. |
| Автор: YanTsys 18.11.2008, 18:13 |
| Код который привел DareDevil225, нормально откомпилировался только заменил count на count1 но есть ошибки в самой программе Когда включаешь пузырьковую сортировку по фамилии в функцию sort_puzirek (int tp ) должна передаваться двойка, ( так как в data[i][1] содержится key а family содержится в data[i][2] ) а при проверке видно что туда передается единичка |
| Автор: DareDevil225 18.11.2008, 18:38 | ||
в моем коде нет функции sort_puzirek (int tp ), не нужно путать! Полностью все не проверял по причине нехватки времени А в программе приведенной до этого есть есть еще много недочетов. |
| Автор: YanTsys 18.11.2008, 18:56 |
| Извините не уточнил, имел в виду код который вы привели в посте Дата 17.11.2008, 18:09 А то что код ваш я и не утверждал |
| Автор: SergXP 18.11.2008, 19:11 |
| DareDevil225, YanTsys, Пытаюсь добавить массив при чтении. Насчет каких недочетов вы утверждаете? |
| Автор: SergXP 18.11.2008, 21:32 |
| Мне необходимо: по каждому полю создать индекс, это сделано и вывести таблицу упорядоченную по полю фамилия используя массив индекса. Интересно получается со всеми сортировками разобрался, а с этой никак не получается. |
| Автор: DareDevil225 19.11.2008, 10:59 | ||
А можно поподробнее, что именно необходимо - не совсем понял из вашего описания |
| Автор: SergXP 19.11.2008, 12:24 | ||||||||
| Имеется файл base.txt В нем записано несколько записей:
Считываем эти записи в массив char data[21][6][255]; Это находится в функции LoadFromFile(); Нужно проивести индексацию записей, т.е. ведь на самом деле получается 3 записи, это в данном примере. Вот к примеру первая запись:
переменная zap - это номер записи, в данном примере она равна 1 В функции indexing - мне необходимо по каждому полю создать индекс и вывести исходную таблицу упорядлченную по полю family и спользуя массив индекса. Я это понял так и сделал: Создал структуру base. Объявил переменную base bd[n]; И данной функции присвоил значения из массива, полученного в функции LoadFromFile(); Допустим для первой записи получим результат:
Т.е. получился массив структур bd и произошла индексация. Теперь не обходимо вывести упорядоченную таблицу
Вот так должна выйти на экран таблица с упорядоченными записями по полю Family; Прошу помогите разобраться. |
| Автор: YanTsys 19.11.2008, 12:29 | ||
Не знаю может вы уже тот код и не рассматриваете Но когда запускаю на исполнение код из сообщения Дата 17.11.2008, 18:09 То если в нем выбираешь сортировку >> Sorting 'Puzirek' то при выборе сортировки Sorting Puzirek Key Sorting: Family * Model Motor Color Adres Back По полю Model на самом деле идет сортировка по полю Family т.е. в функцию sort_puzirek (int tp ) передается значение на 1 меньше чем нужно |
| Автор: SergXP 19.11.2008, 13:20 |
| YanTsys, понятно, но это не так страшно. Меня сейчас больше волнует вопрос сортировки массива структур. |
| Автор: DareDevil225 19.11.2008, 13:34 | ||||||
Все правильно, так и считывайте, только потом еще и заполняете массив структур bd. Можете сразу же вызвать функцию indexing, в которой просто вызываете один из методов сортировки для массива структур. И потом выводите на экран.
Привели же уже весь код сортировки и вы написали
|
| Автор: SergXP 19.11.2008, 14:15 | ||||
DareDevil225, массив структур не сортируется у меня, вообще!
Через эту функцию делаю, не сортируется все равно! Вот прикрепил проект написанный в Borland C++ 6 Builder. Посмотрите пожалустайта. :( Запускаю сортировку sort(bd, zap-2, &base::family); И затем вывожу на экран:
Данные не сортируются и выводятся так как написаны в файле. |
| Автор: DareDevil225 19.11.2008, 15:22 | ||||||||||
Естественно не будет работать - структуру-то изменили на
и получается что сравниваются указатели, а как вы себе представляете сравнить два указателя на различные символьные массивы - они естественно будут не равны
здесь тоже можете получить access violation при выходе за пределы инициализированной части массива, аккуратнее нужно использовать индексы массивов Добавлено через 5 минут и 11 секунд YanTsys, написал
SergXP, на что вы ответили
это как раз страшно (сделали верное замечание)- у вас это наблюдается во всем коде, соответственно при малейшем телодвижении - программа падает, а это совсем не есть гуд |
| Автор: SergXP 19.11.2008, 17:16 | ||||
| DareDevil225, ага, терь начинаю понимать в чем ошибка. Создаю структуру:
Почему появляется такая ошибка, если присваивать?
|
| Автор: DareDevil225 19.11.2008, 18:33 | ||||||
| есть такой вопрос, ваш компилятор понимает тип AnsiString? Добавлено @ 18:35 Если есть, то вот код:
код рабочий, но не все ошибки исправлял, связанные с индексами массивов
Ошибка появляется потому, что data - это массив символов, а в структуре хранится только один символ |
| Автор: SergXP 19.11.2008, 19:20 |
| DareDevil225, Сейчас буду пытаться разобраться со всеми не правильностями, которые были у меня. Просто мне это не для того, чтобы кто-то написал я тупо вставил и поблагодарил, я хочу все разобрать построчно, и понять. Искрене вам благодарен и признателен. Я до этого сидел долго и не мог никак сделать, если бы не ваша помощь, долго бы еще сидел. С C++ я еще знаком не важно, поэтому и возникали глупые вопросы. Еще раз спасибо Огромное! |