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

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

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

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

03.07.2012, 17:46. Просмотров 828. Ответов 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;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2012, 17:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка и итераторы (C++):

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

Итераторы С++ - C++
Как с помощью итераторов работать с массивом объектов класса? И что такое класс Итератор? П.С. Не через вектора

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

итераторы - C++
ребят помогите плиз vector&lt;double&gt;::iterator t = matrix.begin(); vector&lt;double&gt;::iterator t1 = matrix.end(); for(;t&lt;t1;t++) ...

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

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

1
alsav22
5425 / 4820 / 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 минут
Исравлю.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2012, 08:39
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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