Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Skies
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
#1

Сортировка и итераторы - C++

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

Помогите пожалуйста разобраться в функции "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;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2012, 17:46     Сортировка и итераторы
Посмотрите здесь:

Итераторы - C++
При удалении элемента из списка (list) - ошибка list iterator not decrementable Что делать? for(Iter = npc.begin(); Iter !=...

Итераторы - C++
Как указать не на следующий за последним элемент последовательности, а на последний! end() - следующий за последним Добавлено через...

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

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

Итераторы - C++
От какого класса наследуются итераторы в STL? Например я создаю класс и для него нужен собственный итератор, совместимый с STL (более...

Итераторы - C++
Всем добрый вечер! Есть небольшие затруднения , вот например фрагмент кода: //... multimap&lt;int,Point&gt; divisionP; ...

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

Итераторы. Шаблоны. - C++
Построить класс, описывающий линейный двусвязной список. Построить класс итератор, что позволяет проходить список. Написать программу,...

Итераторы и стеки - C++
Вот условие: Задано целое число. Записать все десятичные цифры этого числа в стек. Переписать элементы в новый стек удалив все цифры...

Итераторы и структура c++ - C++
Будьте любезны не говорите о том, что использовать структуры в с++ - моветон, подскажите пожалуйста как быть в следующей ситуации: Есть...

Контейнеры и итераторы - C++
Тема: иерархия объектов и группа. Итераторы. Задание: Имена всех монархов на заданном континенте.

Поточные итераторы - C++
Доброго всем времени суток. У Б. Страуструпа в книге, там где &quot;Итераторы потоков &quot; есть пример, в котором реализуется программа, которая...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 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 минут
Исравлю.
Yandex
Объявления
04.07.2012, 08:39     Сортировка и итераторы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru