9 / 9 / 1
Регистрация: 28.11.2013
Сообщений: 153
1

Отсортировать struct. (дайте тест, который "сломает" мой код)

14.03.2015, 13:56. Показов 1622. Ответов 7
Метки нет (Все метки)

Выведите фамилии и имена учащихся в порядке убывания их среднего балла.

Входные данные
Заданы сначала количество учащихся n, затем n строк, каждая из которых содержит фамилию, имя и три числа (оценки по трем предметам: математике, физике, информатике). Данные в строке разделены одним пробелом. Оценки принимают значение от 1 до 5.
Выходные данные
Необходимо вывести пары фамилия-имя по одной на строке, разделяя фамилию и имя одним пробелом. Выводить оценки не нужно. Если несколько учащихся имеют одинаковые средние баллы, то их нужно выводить в порядке, заданном во входных данных.

Пример
Входные данные
3
Markov Valeriy 5 5 5
Sergey Petrov 1 1 1
Petrov Petr 3 3 3

Выходные данные
Markov Valeriy
Petrov Petr
Sergey Petrov

Вроде как задача простенькая, код написал, у себя проверял.
Однако проходит только первых три теста из 99.
На тестирующей системе GNU C++ 4.9. Я пишу в MS VS 2010.

Кликните здесь для просмотра всего текста


Код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
using namespace std;
 
struct student
{
    string name;
    short mark[3];
    double average;
};
 
void get_student(const student stud)
{
    cout << stud.name << endl;
}
void set_student(student *stud)
{
    string tmp;
    cin >> stud->name;
    cin >> tmp; 
    stud->name += " " + tmp;
    cin >> stud->mark[0] >> stud->mark[1] >> stud->mark[2];
    stud->average = (stud->mark[0] + stud->mark[1] + stud->mark[2])/3.0;
}
 
int compare (const void *a, const void *b)
{
    return ( ((student*)a)->average - ((student*)b)->average ); 
}
int main()
{
    unsigned int n;
    cin >> n;
 
    student *arr = new student[n];
 
    for (int i = 0; i<n; ++i)
        set_student(&arr[i]);
 
    qsort(arr, n, sizeof(student), compare);
 
    for (int i = n-1; i>=0; --i)
        get_student(arr[i]);
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2015, 13:56
Ответы с готовыми решениями:

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of &quot;.real&quot;,&quot;.imag&quot; must have...

Структура: error C2079: "A::myElem" использует неопределенный struct "A::B"
class A { public: struct B; private: B myElem; }; struct A::B {

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Форма для ответов на тест "да"или "нет"
Нужна помощь в написании формы, куда будут выводиться по одному вопросу из файла и нужно давать...

7
30 / 30 / 9
Регистрация: 25.12.2014
Сообщений: 115
14.03.2015, 14:19 2
А если файлом подаются данные?
0
9 / 9 / 1
Регистрация: 28.11.2013
Сообщений: 153
14.03.2015, 14:19  [ТС] 3
Кажется, вот так не работает:
3
a a 2 2 4
b b 6 1 1
c c 5 2 1

a a
c c
b b
Т.е. меняет местами одинаковые элементы, а это запрещено в задании. Как можно qsort'y запретить менять местами одинаковые элементы?
0
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
14.03.2015, 14:20 4
Как минимум qsort не стабильная сортировка, используй std::stable_sort
1
9 / 9 / 1
Регистрация: 28.11.2013
Сообщений: 153
14.03.2015, 14:39  [ТС] 5
pavel_pushok, Там можно и так, и так. Без разницы)

Добавлено через 50 секунд
Voivoid, спасибо за совет, почитаю про нее. Там ограничение по времени 2 сек, qsort, думаю, влезет

Добавлено через 17 минут
Voivoid, я правильно понял, что нужно использовать <vector> для stable_sort?
0
16276 / 8835 / 2166
Регистрация: 30.01.2014
Сообщений: 15,267
14.03.2015, 14:42 6
Лучший ответ Сообщение было отмечено 011 как решение

Решение

Цитата Сообщение от 011 Посмотреть сообщение
я правильно понял, что нужно использовать <vector> для stable_sort?
Не обязательно. Можно оставить твой массив.
C++
1
std::stable_sort(arr, arr + n, comp_predicate);
1
9 / 9 / 1
Регистрация: 28.11.2013
Сообщений: 153
14.03.2015, 14:54  [ТС] 7
DrOffset, может, поможете с написанием функции сравнения?

Добавлено через 7 минут
Все, спасибоVoivoid, DrOffset, задачу сдал
0
16276 / 8835 / 2166
Регистрация: 30.01.2014
Сообщений: 15,267
14.03.2015, 14:55 8
Цитата Сообщение от 011 Посмотреть сообщение
поможете с написанием функции сравнения?
C++
1
2
3
4
bool compare(student const & a, student const & b)
{
    return /*здесь реализуешь требуемое сравнение по убыванию или по возрастанию */
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2015, 14:55
Помогаю со студенческими работами здесь

Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива.
Разработать класс &quot;Массив больших чисел&quot;, который состоит из объектов класса &quot;Большие целые числа&quot;....

Массив "hotel", в который пользователь добавляет "жильцов"
Дорогие форумчане, помогите мне решить проблему в данной программе! Суть программы: Есть массив...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

Двусвязный список - Error C2011: ElementsList: переопределение типа "struct"
Что я сделал не правильно? typedef struct ElementsList { struct ElementsList *Prev; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru