Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
1

Сортировка и итераторы

03.07.2012, 17:46. Показов 2471. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста разобраться в функции "sortByMarksCoeff". Реализации ее действий. Еще не
имел дело с итераторами и библиотекой <vector> и поэтому не пойму как осуществляется реализация этой функции.



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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
      struct Student
        {
            char*    nameSurname;
            bool     budgetary;
            int      marks[5];
            int      scholarship;
        
            Student* next,
                   * prev;
        };
        
        
        struct Group
        {
            int      groupNum;
        
            Student* head,
                   * tail;
            
            Group*   next,
                 *   prev;
        };
        
        
        struct University
        {
            int groupsAmount;
        
            Group* head, 
                 * tail;
        };
    
    double getMarksCoeff(Group* group)/средний балл контрактников к среднему баллу бюджетников
    {
        if(!group)
            return 0;
    
        Student* ptr = group->head;
        double b_coeff = 0;
        double c_coeff = 0;
    
        int c_num = 0, b_num = 0;
    
        while(ptr)
        {
            double coeff = 0;
    
            for(int c = 0; c < 5; ++c)
                coeff += ptr->marks[c];
    
            if(ptr->budgetary)
            {
                ++b_num;
                b_coeff += coeff;
            }
            else
            {
                ++c_num;
                c_coeff += coeff;
            }
            ptr = ptr->next;
        }
    
        if(c_num && b_num)
        {
            c_coeff /= c_num;
            b_coeff /= b_num;
    
            if(b_coeff != 0)
                return c_coeff/b_coeff;
        }
    
        return 0;
    }
    
    bool sortByMarksCoeff(University* univer) /*сортировка групп в порядке убывания отношения среднего бала контрактников к среднему балу бюджетников*/
    {
        struct MarkedGroup
        {
            Group* group;
            double mark;
    
            MarkedGroup(Group* in_group, double in_mark)
                : group(in_group), mark(in_mark) {}
        };
    
        vector<MarkedGroup> groups;
         
        if(!univer)
            return false;
    
        Group* ptr = univer->head;
    
        while(ptr)
        {
            groups.push_back(MarkedGroup(ptr, getMarksCoeff(ptr)));
    
            ptr = ptr -> next;
        }
    
        if(groups.empty())
            return 0;
    
    
        auto iter = groups.begin();
        auto end = groups.end();
    
        for(iter; iter != end; ++iter)
        {
            auto iter2 = iter + 1;
            auto end2 = groups.end();
    
            for(iter2; iter2 != end2; ++iter2)
            {
                if(iter2->mark < iter->mark)
                {
                    MarkedGroup buf = *iter2;
                    *iter2 = *iter;
                    *iter = buf;
                }
            }
        }
    
        univer->head = univer->tail = NULL;
    
        iter = groups.begin();
        end = groups.end();
    
        for(iter; iter != end; ++iter)
            addGroup(univer, iter->group, true);
         
        return true;
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2012, 17:46
Ответы с готовыми решениями:

C++: итераторы по умолчанию, пустые итераторы, end()
Всем добра! Вопрос на тему итераторов в плюсах: 1. какие значения имеют итераторы без...

Итераторы и обратные итераторы
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа... Обычные...

Итераторы в C++
Помогите плз решить 2 задачи Задача 1 Напишите программу, использующую итераторы при чтении...

итераторы си++
подскажите пожалуйста какие существуют методы итераторов? и что они делают?

1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
04.07.2012, 08:39 2
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
bool sortByMarksCoeff(University* univer) /*сортировка групп в порядке убывания отношения среднего бала контрактников к среднему балу бюджетников*/
    {
        struct MarkedGroup // структура, в которой будут хранится указатель на группу
                           // и средний балл контрактников к среднему баллу бюджетников в этой группе.
        {
            Group* group;
            double mark;
    
            MarkedGroup(Group* in_group, double in_mark) // конструктор.
                : group(in_group), mark(in_mark) {}
        };
    
        vector<MarkedGroup> groups; // вектор, с такими структурами.
         
        if(!univer)                 // если указатель на универ NULL,
                                    // то выход с false.
            return false;
    
        Group* ptr = univer->head; // создаётся указатель на группу, и ей присваивается
                                   // адрес первой группы универа.
    
        while(ptr) // заполняет вектор структур типа MarkedGroup, 
                   // в каждую из которых помещается указатель на группу и  
                   // средний балл контрактников к среднему баллу бюджетников в этой группе.
        {
            groups.push_back(MarkedGroup(ptr, getMarksCoeff(ptr))); // получение отношения баллов,
                                                                    // создание структуры MarkedGroup,
                                                                    // помещение её в вектор.
    
            ptr = ptr -> next; // переход к следующей группе универа.
        }
    
        if(groups.empty()) // если вектор пуст, то выход.
            return 0;
    
    
        auto iter = groups.begin(); // создаётся указатель на первую структуру вектора.
        auto end = groups.end();    // создаётся указатель на конец вектора.
    
    // пузырьковая сортировка.....................
        
        for(iter; iter != end; ++iter) // перебор вектора с начала и до конца.
        {
            auto iter2 = iter + 1; // создаётся указатель на следующую структуру.
            auto end2 = groups.end(); // ещё один указатель на конец вектора(зачем?).
             for(iter2; iter2 != end2; ++iter2) // перебор вектора от следующей структуры и до конца.
            {
                if(iter2->mark < iter->mark) // сравниваются отношения баллов у группы, на которую указывет iter 
                                             // с группой, на которую указывает iter2.
                                             // если у второй отношение баллов меьше, группы, через буффер, переставляются 
                                             // местами в векторе.
                {
                    MarkedGroup buf = *iter2; 
                    *iter2 = *iter;
                    *iter = buf;
                }
            }
        }
            
    
        univer->head = univer->tail = NULL; // ?
    
        iter = groups.begin(); // восстанавливается указатель на начало вектора.
        end = groups.end();    // восстанавливается указатель на конец вектора
                               // (зачем, вроде бы не менялся?)
    
        for(iter; iter != end; ++iter)
            addGroup(univer, iter->group, true); // ? addGroup() нет в коде.
         
        return true;
    }
Добавлено через 1 час 5 минут
Исравлю.
1
04.07.2012, 08:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2012, 08:39
Помогаю со студенческими работами здесь

Итераторы
От какого класса наследуются итераторы в STL? Например я создаю класс и для него нужен...

Итераторы
Не могу въехать как работают итераторы, литература-форумы не помогли, увы. На 26й строке то, что...

Итераторы
Доброго времени суток! Подскажите пожалуйста, как описать эти методы: 1. Итератор для...

Итераторы
Добрый день! Начал изучать классы в C++ параллельно с итераторами. Решил сделать простенькую...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru