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

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

Восстановить пароль Регистрация
 
Skies
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
03.07.2012, 17:46     Сортировка и итераторы #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++
C++ Итераторы
Итераторы С++ C++
C++ Итераторы
итераторы си++ C++
C++ Итераторы
C++ Итераторы С++
C++ Итераторы

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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     Сортировка и итераторы
Ответ Создать тему
Опции темы

Текущее время: 02:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru