С++ — как отсортировать структуру?
Код почти готов, но не знаю как быть дальше. В структуре я указываю количество студентов, потом заполняю поля: Фамилия, Группа, Оценка1, Оценка2, Оценка3. Sr— средний бал за экзамены. Думал сначала сделать Sr как поле, чтобы потом можно было отсортировать структуру по среднему баллу в порядке спадания. Но что-то всё же не так сделал в структуре. Код прилагаю:
UPD: Готовые функции и методы не подходят
- Вопрос задан более трёх лет назад
- 1691 просмотр
- Вконтакте
Не нужно переставлять все поля по одному
Достаточно написать
В отличие от массива, структуры можно присваивать целиком, а не поэлементно.
- Вконтакте
- Вконтакте
Реализуйте в структуре конструктор копирования и/или копирующий оператор присваивания, и сортируйте пузырьком (т.к. самая простая реализация соритровки). Можно еще реализовать несколько функций сравнения по разным атрибутам и передавать эти функции в пузырек (чтоб можно было делать сортировку по разным атрибутам с помощью одной функции сортировки).
По коду:
1.Вы начинаете писать на С++, а потом перескакиваете на Си (puts, printf) .
2.В struct student поля surname и gr объявлены как char, а в коде вы их используете как си-строки — это абсолютно разные вещи.
3.Вы не правильно используете функцию puts. В таком виде у вас программа не соберется. Посмотрите документацию.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Сортировка массива структур — задача #9
Условие задачи:
Задан массив из 6 данных типа структура. Структура включает: фамилию студента и три оценки. Упорядочить массив структур по возрастанию сумм баллов по всем 3-м дисциплинам.
Решение задачи на языке Си
Демонстрация работы программы

Поделиться в соц. сетях:
2 комментария(ев) к статье “ Сортировка массива структур — задача #9 ”
Подскажите, а если количество оценок разное у каждого студента, то как можно сделать в этом случае?
- admin Автор статьи 05.04.2018 в 17:40
Массив с оценками должен быть большего размера (если статический), либо вообще динамический. Также в структуру стоит добавить целое число — длину данного массива с оценками. И в функции getMarksSum находить сумму оценок с помощью цикла. Ввод оценок также, естественно, нужно переосмыслить.
Сортировка структур. STL Часть 13
Показанные в предыдущей части разнообразные сортировки — гибкий и красивый механизм на все случаи жизни. Вот только на практике сортировать в чистом виде последовательности почти никогда не приходится. Это всё из области учебно-показательных задач.
На практике куда чаще стоит задача сортировать достаточно объёмные структуры данных (объёмные даже не по своему размеру, а по числу своих полей). И сортировать (или пересортировывать) их предстоит по значениям самых разных полей этих самых структур. Но и здесь на помощь приходят алгоритмы STL, особенно при использовании их совместно с функторами.
Посмотрим типовую модельную задачу, которую мы уже видели раньше — описание учебной группы или факультета:
C: Как отсортировать структуру по одному из ее элементов? Не могу использовать указатели
По одному из атрибутов вроде цены или веса? Автомобильный массив заявлен заранее. Я не могу использовать указатели и любые другие встроенные функции.
Я пытался сделать это таким способом, но ничего не вышло . Кроме того, если бы кто-нибудь мог сказать мне, как я могу передать такую структуру в функцию, я был бы очень благодарен!
2 ответа
Не вдаваясь в подробности реализации, вот процедурный алгоритм пузырьковой сортировки (не в C): Алгоритм пузырьковой сортировки . Обратите внимание, как упоминалось в комментариях, эта реализация пузырьковой сортировки использует вложенные циклы.
Еще один момент, о котором следует помнить: чтобы переключить два объекта, необходимо использовать третий временный объект того же типа. Например:
Поскольку вы выполняете сортировку по одному элементу коллекции элементов, процедура замены назначений должна будет заменять каждый элемент каждый раз, когда существует условие для обмена, т. Е. При определении того, существует ли условие обмена, учитывается только один член, обмен будет включать всех участников: weight , price , Color и Equip . И, если Color и Equip имеют тип struct (в вашем сообщении не указано), то каждый член этих объектов, принадлежащих к сравниваемым элементам массива, также необходимо будет поменять местами.
Вам следует рассчитывать на то, что в конечном итоге указатели будут использоваться, поскольку это значительно сократит количество операторов присваивания, необходимых для выполнения этой сортировки.
Хорошо, во-первых, то, что вы пытаетесь сделать, не так уж плохо, как некоторые люди могут вам сказать, поскольку сортировка маленьких N пузырьков все еще довольно быстра. Вам подойдет следующее, и, конечно же, вам понадобится двойной цикл:
Обратите внимание, что мы можем копировать структуры, но даже здесь мы стараемся делать это как можно реже.
Однако очень легко сказать: «У меня никогда не будет больше десяти машин», а затем обнаружится, что вы пытаетесь отсортировать несколько тысяч, поэтому я бы посоветовал вам изучить и понять qsort ():
PS: в ответ на вопрос «как передать массив функции?» вспомните одно из множества мудрых высказываний K&R: «Когда имя массива передается функции, то передается местоположение начала массива».
Внутри sortThem () «autom» — это переменная, значением которой является адрес automobil [0].