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

Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп - C++

Восстановить пароль Регистрация
 
Op1um
0 / 0 / 0
Регистрация: 28.11.2009
Сообщений: 9
13.01.2010, 17:03     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #1
Кто поможет написать алгоритм?Очень надо!
Задан список из N абитуриентов, поступивших в вуз (в алфавитном порядке) для каждого студента задан средний бал, вступительных экзаменов. Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2010, 17:03     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп
Посмотрите здесь:

Обработка сведений об успеваемости студентов C++
C++ Вывести журнал успеваемости студентов группы в алфавитном порядке
C++ Программа контроля успеваемости студентов
Создать текстовый файл с информацией об успеваемости студентов C++
Создать текстовый файл с информацией об успеваемости студентов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
13.01.2010, 17:18     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #2
смотря какой критерий равномерного распределения. если там один отличник, а остальные троешники, то о какой равномерности может идти речь?

одно ясно, надо отсортировать студентов по успеваемости и начиная с максимального балла распихивать их по группам. то есть если три чела с равными балами то они в разные группы, а вот если меньше трёх, то тут вопрос что прозвучал выше
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.01.2010, 17:44     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #3
Цитата Сообщение от TanT Посмотреть сообщение
одно ясно, надо отсортировать студентов по успеваемости и начиная с максимального балла распихивать их по группам. то есть если три чела с равными балами то они в разные группы, а вот если меньше трёх, то тут вопрос что прозвучал выше
А я бы не мудрствуя лукаво отсортировал список, а потом тупо по одному в каждую из трёх групп дёргал. Ну а там уже, как сложится...
Op1um
0 / 0 / 0
Регистрация: 28.11.2009
Сообщений: 9
13.01.2010, 18:24  [ТС]     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #4
мне хотя бы увидеть как примерно примерно будет выглядеть алгоритм
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.01.2010, 15:25     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Получилось всё, как в жизни... В "А" ботаны собрались, в "В" - кому в первых двух классах места не нашлось... Но в принципе могло быть хуже...
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
    
/*
    Задан список из N абитуриентов, поступивших в вуз (в алфавитном порядке) 
    для каждого студента задан средний бал, вступительных экзаменов. 
    Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп
*/
#define STRLEN 128
#define GROUPS 3
    
/* структура */
typedef struct _student {
    char *name;
    double average;
    struct _student *next;
} Student_t;
 
Student_t *Student(const char *name, double average){
    Student_t *s;
    if ( ( s = (Student_t*)malloc(sizeof(Student_t)) ) == NULL )
        return NULL;
    if ( ( s->name = strdup(name) ) == NULL ){
        free(s);
        return NULL;
    }
    s->average = average;
    s->next = NULL;
    return s;
}
 
void killAll(Student_t *s){
    Student_t *n;
    while ( s ){
        n = s->next;
        if ( s->name )
            free(s->name);
        free(s);
        s = n;
    }
}
 
double groupAverage(const Student_t *s){
    int cnt;
    double sum;
    for ( cnt = 0, sum = 0.0; s != NULL; s = s->next ){
        sum += s->average;
        ++cnt;
    }
    return sum / (double)cnt;
}
 
Student_t *firstName(const Student_t *s){
    const Student_t *f = s;
    while ( s = s->next )
        if ( strcmp(s->name, f->name) < 0 )
            f = s;
    return (Student_t*)f;
}
 
Student_t *maxAverage(const Student_t *s){
    const Student_t *m = s;
    while ( s = s->next )
        if ( s->average > m->average )
            m = s;
    return (Student_t*)m;
}
 
void swapStudents(Student_t *a, Student_t *b){
    Student_t s;
    s.name = a->name;
    s.average = a->average;
    a->name = b->name;
    a->average = b->average;
    b->name = s.name;
    b->average = s.average;
}
 
Student_t *dupStudent(const Student_t *s){
    Student_t *d;
    if ( ( d = (Student_t*)malloc(sizeof(Student_t)) ) == NULL )
        return NULL;
    if ( ( d->name = strdup(s->name) ) == NULL ){
        free(d);
        return NULL;
    }
    d->average = s->average;
    d->next = NULL;
    return d;
}
 
void sortByName(Student_t *s){
    Student_t *f;
    while ( s->next ){
        f = firstName(s);
        if ( f != s )
            swapStudents(f, s);
        s = s->next;
    }
}
 
void sortByAverage(Student_t *s){
    Student_t *m;
    while ( s->next ){
        m = maxAverage(s);
        if ( m != s )
            swapStudents(m, s);
        s = s->next;
    }
}
 
void printGroup(Student_t *s){
    printf("\nФИО                           Средний балл\n--------------------------------------------------\n");
    while ( s ){
        printf("%-30s%.1f\n", s->name, s->average);
        s = s->next;
    }
    printf("--------------------------------------------------\n");
}
 
int main(void){
    Student_t *s, *d, *all, *last, *grp[GROUPS], *lst[GROUPS];
    char buf[STRLEN], *p;
    double avg;
    int cnt, i;
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    printf("\nВсего студентов: ");
    if ( scanf("%d%*c", &cnt) != 1 || cnt < GROUPS ){
        fprintf(stderr, "Wrong data!\n");
        exit(1);
    }
    all = last = NULL;
    while( cnt-- ){
        printf("\nФИО: ");
        if ( !fgets(buf, sizeof(buf), stdin) ){
            fprintf(stderr, "Bad string\n");
            exit(1);
        }
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( !*buf ){
            fprintf(stderr, "Empty string!\n");
            exit(1);
        }
        printf("Средний балл: ");
        if ( scanf("%lf%*c", &avg) != 1 ){
            fprintf(stderr, "Wrong data!\n");
            exit(1);
        }
        if ( ( s = Student(buf, avg) ) == NULL ){
            printf("Shit happens!\n");
            exit(1);
        }
        if ( !all )
            all = s;
        if ( !last )
            last = s;
        else {
            last->next = s;
            last = last->next;
        }
    }
    
    sortByName(all);
    printf("\nВсе студенты:\n");
    printGroup(all);
    printf("Средний балл для всех студентов: %.1f\n", groupAverage(all));
    printf("Press ENTER");
    getchar();
    
    sortByAverage(all);
    for ( i = 0; i < GROUPS; ++i )
        grp[i] = lst[i] = NULL;
    
    for ( s = all, i = 0; s != NULL; s = s->next ){
        if ( ( d = dupStudent(s) ) == NULL ){
            fprintf(stderr, "Can't duplicate data!\n");
            exit(1);
        }
        if ( grp[i] == NULL )
            grp[i] = d;
        if ( lst[i] == NULL )
            lst[i] = d;
        else {
            lst[i]->next = d;
            lst[i] = lst[i]->next;
        }
        if ( ++i == GROUPS )
            i = 0;
    }
    
    for ( i = 0; i < GROUPS; ++i ){
        sortByName(grp[i]);
        printf("\n\nГруппа #%d:\n", i + 1);
        printGroup(grp[i]);
        printf("Средний балл для группы: %.1f\n", groupAverage(grp[i]));
        printf("Press ENTER");
        getchar();
    }
    
    for ( i = 0; i < GROUPS; ++i )
        killAll(grp[i]);
    killAll(all);
    
    exit(0);
}
Добавлено через 3 часа 20 минут
опечатку нашёл, поправил. от неё, правда, не горячо, не холодно, просто выглядело странно...
Op1um
0 / 0 / 0
Регистрация: 28.11.2009
Сообщений: 9
14.01.2010, 21:39  [ТС]     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #6
Блин при компилировании выдает в строках 57:20,
65:20,
129:22,
130:28,
144:25,
211:2
может нужен другой компилятор?

Добавлено через 24 секунды
ты на чем писал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2010, 23:27     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп
Еще ссылки по теме:

Программа об успеваемости студентов C++
Учёт успеваемости студентов C++
Отсортировать группы студентов в порядке убывания средней успеваемости C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.01.2010, 23:27     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп #7
Op1um, на всякий случай отсюда скопировал, скомпилил cl микрософтовским - всё, как надо...
Yandex
Объявления
14.01.2010, 23:27     Составить списки трех груп, равномерно распределив студентов по успеваемости в каждую из груп
Ответ Создать тему
Опции темы

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