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

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

Войти
Регистрация
Восстановить пароль
 
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
#1

Получить список студентов с указанием среднего балла - C++

22.08.2011, 10:51. Просмотров 916. Ответов 18
Метки нет (Все метки)

имеется информация о студентах группы: Ф.И.О., результаты экзаменационной сессии. Мне надо получить список студентов с указанием среднего балла.
Для решения данной задачи мне надо использовать массив структур или можно как-то по другому сделать? Если да, то как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2011, 10:51     Получить список студентов с указанием среднего балла
Посмотрите здесь:

C++ Вывести студентов в порядке убывания среднего балла
C++ Нахождение среднего балла
Напечатать список студентов мужского пола с указанием их возраста C++
C++ Найти студентов, общий балл которых отличается не более чем на 2 балла от максимального общего балла
Вычисление среднего балла C++
Подсчет среднего балла каждой группы C++
C++ Составить программу для вычисления среднего балла студентов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
22.08.2011, 10:53     Получить список студентов с указанием среднего балла #2
делайте как умеете.
после появления рабочего варианта можно будет думать "как лучше"
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 10:55     Получить список студентов с указанием среднего балла #3
Если требуется вывести на экран всех студентов со средним баллом, то массив не нужен. Если требуется это записать в другой файл - тоже не нужен. Просто считываете очередного студента, считаете его средний балл и выводите на экран. Вопрос в том, где все это изначально хранится.
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
22.08.2011, 11:46  [ТС]     Получить список студентов с указанием среднего балла #4
данные хранятся в файле, а вывести их надо упорядочив лексикографически или по убыванию среднего балла , на выбор пользователя прграммы.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 11:50     Получить список студентов с указанием среднего балла #5
Да уж, если бы это была база данных (БОЛЬШАЯ), то сортировать ее одно удовольствие... Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
22.08.2011, 11:53     Получить список студентов с указанием среднего балла #6
Связный список поможет (можно, разумеется rb-дерево).
Причем вставка очередного клиента должна проводиться уже в нужное место списка.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 11:55     Получить список студентов с указанием среднего балла #7
Цитата Сообщение от villu Посмотреть сообщение
Связный список поможет (можно, разумеется rb-дерево).
Причем вставка очередного клиента должна проводиться уже в нужное место списка.
Тогда уж лучше дерево (дерево поиска), в среднем вставка быстрее происходит.
Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
22.08.2011, 12:24     Получить список студентов с указанием среднего балла #8
_д_м_и_т_р_и_й_, less talk more action.
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
22.08.2011, 12:35     Получить список студентов с указанием среднего балла #9
Что-то в таком роде:

C++
1
2
3
4
5
6
7
8
struct TNODE 
{
   string sName; 
   int   iAlgebra;
   int   iCPP;
   struct TNODE *psLeft; 
   struct TNODE *psRight; 
};
Получаем бинарное дерево. Читаем рекурсивной функцией. В общем все по Кернигану.
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 12:40     Получить список студентов с указанием среднего балла #10
Вот Си реализация по вводу данных в базу и выводу среднего балла
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
#include <stdio.h>
 
FILE * f;
 
struct STUDENT
{
    char familia[32];
    char imya[32];
    char otchestvo[32];
 
    float matemat;
    float fizika;
    float history;
 
    float sr_ball;
};
STUDENT pSTD;
 
int IsDataBasePresent()
{
    int ret = 0;
    if(!(f = fopen("data.txt","rb+")))
    if(!(f = fopen("data.txt","wb+")))
        ret = -1;//Г”Г*éë Г*åëüçÿ Г§Г*ГЇГЁГ±Г*ГІГј
    else
        fclose(f);
    return ret;
}
 
void p1()
{
    if(IsDataBasePresent() == -1)
        printf("%s\r\n","NE MOGY POLYCHIT DOSTYP K [data.txt]");
    else
    {
        fseek(f,0,SEEK_END);//ГЏГЁГёГҐГ¬ ГўГЄГ®Г*ГҐГ¶ ГЎГ*çû
        printf("\tEnter student's data\r\n");
        printf("FAMILIA\t");scanf("%s",pSTD.familia);
        printf("IMYA\t");scanf("%s",pSTD.imya);
        printf("OTCHESTVO\t");scanf("%s",pSTD.otchestvo);
        
        printf("Ocenki po ekzamenam\r\n");
        printf("MATEMATIKA\t");scanf("%g",&pSTD.matemat);
        printf("FISIKA\t");scanf("%g",&pSTD.fizika);
        printf("ISTORIA\t");scanf("%g",&pSTD.history);
        pSTD.sr_ball = (pSTD.matemat + pSTD.fizika + pSTD.history) / 3;
        fwrite((void *)&pSTD,sizeof(STUDENT),1,f);
        printf("Vvod okoncen\r\n");
        fclose(f);
    }
}
 
void p2()
{
    long i,fLen;
    double n;
    if(IsDataBasePresent() == -1)
        printf("%s\r\n","NE MOGY POLYCHIT DOSTYP K [data.txt]");
    else
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        
        n = fLen / sizeof(STUDENT);
        
        if(n < 1)
            printf("BASA DANNIH PYSTA!\r\n");
        else
        if(int(n/2)*2 != n)
            printf("BASA DANNIH POVREZHDENA!\r\n");
        else
        {
            printf("\tInformacia ob yspevaemosti\r\n");
            printf("FAMILIA I.O.\tSREDNI BALL\r\n");
            for(i = 0; i < n; i++)
            {
                fread((void *)&pSTD,sizeof(STUDENT),1,f);
                printf("%s %c.%c\t%.2f\r\n",
                    pSTD.familia,
                    pSTD.imya[0],
                    pSTD.otchestvo[0],
                    pSTD.sr_ball);
            }
        }
        fclose(f);
    }
}
 
int main()
{
    int choise;
    while(true)
    {
        printf("\tPROGRAM MENU\r\n");
        printf("1 - Vvesti dannie po sessii o studente\r\n");
        printf("2 - Polychit' spisok so sr ballom\r\n");
        printf("OTHER KEY - EXIT\r\n");
        printf("Vash vibor> ");scanf("%d",&choise);
        switch(choise){
        case 1:
            p1();
            break;
        case 2:
            p2();
            break;
        default :
            return 0;
            break;
        }
    }
    return 0;
}
[Результат работы]

1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor> 1
Enter student's data
FAMILIA FAM2
IMYA NAM2
OTCHESTVO OTCH2
Ocenki po ekzamenam
MATEMATIKA 3
FISIKA 3
ISTORIA 5
Vvod okoncen
PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor> 2
Informacia ob yspevaemosti
FAMILIA I.O. SREDNI BALL
FAM1 N.O 4.67
FAM2 N.O 3.67
PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor>


Добавлено через 2 минуты
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
данные хранятся в файле, а вывести их надо упорядочив лексикографически или по убыванию среднего балла , на выбор пользователя прграммы.
- сразу не прочёл, у меня просто вывод, сейчас модернезирую

Цитата Сообщение от Olga_ Посмотреть сообщение
Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
- всё таки в этом случае думаю лучше читать из базы, пусть и несколько проходов делать (забыливаше замечание по поводу выделения памяти???)

Добавлено через 15 секунд
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
данные хранятся в файле, а вывести их надо упорядочив лексикографически или по убыванию среднего балла , на выбор пользователя прграммы.
- сразу не прочёл, у меня просто вывод, сейчас модернезирую

Цитата Сообщение от Olga_ Посмотреть сообщение
Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
- всё таки в этом случае думаю лучше читать из базы, пусть и несколько проходов делать (забыливаше замечание по поводу выделения памяти???)
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 12:44     Получить список студентов с указанием среднего балла #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- всё таки в этом случае думаю лучше читать из базы, пусть и несколько проходов делать (забыливаше замечание по поводу выделения памяти???)
Нет, все верно, но для данной учебной задачи легче ваш вариант с выгрузкой в память.
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 14:48     Получить список студентов с указанием среднего балла #12
Вот алгоритм с возможностью сортировки как по фамилиям так и по баллу
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
#include <stdio.h>  //FILE scanf, printf
#include <ctype.h>
#include <windows.h>//malloc
 
FILE * f;
 
struct STUDENT
{
    char familia[32];
    char imya[32];
    char otchestvo[32];
 
    float matemat;
    float fizika;
    float history;
 
    float sr_ball;
};
STUDENT pSTD;
 
char   * LETTERS;//Первые буквы фамилий
double * SR_BALL;//Средние баллы
 
int *INDEX;//Индексы
 
void sort_srballs(int n, double * sr_ball, int * index);
void sort_letters(int n, char   * letters, int * index);
 
int IsDataBasePresent()
{
    int ret = 0;
    if(!(f = fopen("data.txt","rb+")))
    if(!(f = fopen("data.txt","wb+")))
        ret = -1;//Файл нельзя записать
    else
        fclose(f);
    return ret;
}
 
void p1()
{
    if(IsDataBasePresent() == -1)
        printf("%s\r\n","NE MOGY POLYCHIT DOSTYP K [data.txt]");
    else
    {
        fseek(f,0,SEEK_END);//Пишем вконец базы
        printf("\tEnter student's data\r\n");
        printf("FAMILIA\t");scanf("%s",pSTD.familia);
        printf("IMYA\t");scanf("%s",pSTD.imya);
        printf("OTCHESTVO\t");scanf("%s",pSTD.otchestvo);
        
        printf("Ocenki po ekzamenam\r\n");
        printf("MATEMATIKA\t");scanf("%g",&pSTD.matemat);
        printf("FISIKA\t");scanf("%g",&pSTD.fizika);
        printf("ISTORIA\t");scanf("%g",&pSTD.history);
        pSTD.sr_ball = (pSTD.matemat + pSTD.fizika + pSTD.history) / 3;
        fwrite((void *)&pSTD,sizeof(STUDENT),1,f);
        printf("Vvod okoncen\r\n");
        fclose(f);
    }
}
 
void p2()
{
    long i,choise,fLen;
    double n;
    if(IsDataBasePresent() == -1)
        printf("%s\r\n","NE MOGY POLYCHIT DOSTYP K [data.txt]");
    else
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        
        n = fLen / sizeof(STUDENT);
        
        if(n < 1)
            printf("BASA DANNIH PYSTA!\r\n");
        else
        if(int(n/2)*2 != n)
            printf("BASA DANNIH POVREZHDENA!\r\n");
        else
        {
            LETTERS = (char *)  malloc(n*sizeof(char));
            SR_BALL = (double *)malloc(n*sizeof(double));
            INDEX   = (int *)   malloc(n*sizeof(int));
 
            printf("\tInformacia ob yspevaemosti\r\n");
            printf("Viberite rezim sortirovki\r\n");
            printf("1 - SORT PO 1-q BYKVE FAMILII\r\n");
            printf("2 - SORT PO SREDNEMY BALLY\r\n");
            printf("3 - BEZ SORTIROVKI\r\n");
            scanf("%d",&choise);
 
            for(i = 0; i < n; i++)
            {
                fread((void *)&pSTD,sizeof(STUDENT),1,f);
                LETTERS[i] = toupper(pSTD.familia[0]);
                SR_BALL[i] = pSTD.sr_ball;
                INDEX[i] = i;
            }
            printf("FAMILIA I.O.\tSREDNI BALL\r\n");
            switch(choise){
            case 1:
                sort_letters(n, LETTERS, INDEX);
                break;
            case 2:
                sort_srballs(n, SR_BALL, INDEX);
                break;
            }
            for(i = 0; i < n; i++)
            {
                fseek(f,INDEX[i]*sizeof(STUDENT),SEEK_SET);
                fread((void *)&pSTD,sizeof(STUDENT),1,f);
                printf("%s %c.%c\t%.2f\r\n",
                        pSTD.familia,
                        pSTD.imya[0],
                        pSTD.otchestvo[0],
                        pSTD.sr_ball);
            }
            free(LETTERS);
            free(SR_BALL);
            free(INDEX);  
        }
        fclose(f);
    }
}
 
int main()
{
    int choise;
    while(true)
    {
        printf("\tPROGRAM MENU\r\n");
        printf("1 - Vvesti dannie po sessii o studente\r\n");
        printf("2 - Polychit' spisok so sr ballom\r\n");
        printf("OTHER KEY - EXIT\r\n");
        printf("Vash vibor> ");scanf("%d",&choise);
        switch(choise){
        case 1:
            p1();
            break;
        case 2:
            p2();
            break;
        default :
            return 0;
            break;
        }
    }
    return 0;
}
 
void sort_srballs(int n, double * sr_ball, int * index)
{
    double buf;
    for(int i = 0,j,ibuf; i < n; i++)
    {
        for(j = i; j < n; j++)
        {
            if(sr_ball[i] < sr_ball[j])
            {
                buf = sr_ball[i];
                sr_ball[i] = sr_ball[j];
                sr_ball[j] = buf;
 
                ibuf = index[i];
                index[i] = index[j];
                index[j] = ibuf;
            }
        }
    }
}
 
void sort_letters(int n, char * letters, int * index)
{
    char buf;
    for(int i = 0,j,ibuf; i < n; i++)
    {
        for(j = i; j < n; j++)
        {
            if(letters[i] < letters[j])
            {
                buf = letters[i];
                letters[i] = letters[j];
                letters[j] = buf;
 
                ibuf = index[i];
                index[i] = index[j];
                index[j] = ibuf;
            }
        }
    }
}
[Результат работы]

PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor> 2
Informacia ob yspevaemosti
Viberite rezim sortirovki
1 - SORT PO 1-q BYKVE FAMILII
2 - SORT PO SREDNEMY BALLY
3 - BEZ SORTIROVKI
1
FAMILIA I.O. SREDNI BALL
FAM1 N.O 4.67
FAM2 N.O 3.67
FAM3 N.O 2.33
FAM4 N.O 3.00
B_FAM N.O 3.67
A_FAM N.O 3.67
PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor> 2
Informacia ob yspevaemosti
Viberite rezim sortirovki
1 - SORT PO 1-q BYKVE FAMILII
2 - SORT PO SREDNEMY BALLY
3 - BEZ SORTIROVKI
2
FAMILIA I.O. SREDNI BALL
FAM1 N.O 4.67
FAM2 N.O 3.67
A_FAM N.O 3.67
B_FAM N.O 3.67
FAM4 N.O 3.00
FAM3 N.O 2.33
PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor> 2
Informacia ob yspevaemosti
Viberite rezim sortirovki
1 - SORT PO 1-q BYKVE FAMILII
2 - SORT PO SREDNEMY BALLY
3 - BEZ SORTIROVKI
3
FAMILIA I.O. SREDNI BALL
FAM1 N.O 4.67
FAM2 N.O 3.67
FAM3 N.O 2.33
FAM4 N.O 3.00
A_FAM N.O 3.67
B_FAM N.O 3.67
PROGRAM MENU
1 - Vvesti dannie po sessii o studente
2 - Polychit' spisok so sr ballom
OTHER KEY - EXIT
Vash vibor>


Всем сторонникам сортировки в памяти структур советую посмотреть мой код, сортирую не структыры а лишь нужные мне параметры и то из индексы, затем уже выполняю чтение из файла в нужном месте
C++
1
fseek(f,INDEX[i]*sizeof(STUDENT),SEEK_SET);
Файл исходных данных прилагаю, но вы и сами можите его ввести
Вложения
Тип файла: txt data.txt (672 байт, 6 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 14:50     Получить список студентов с указанием среднего балла #13
Цитата Сообщение от Olga_ Посмотреть сообщение
Нет, все верно, но для данной учебной задачи легче ваш вариант с выгрузкой в память.
- И Вам и ТС обращаю внимание на мой пост выше!На мой взгляд легче сортировать параметры и их индексы а не ворочать в памяти структурами...
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 15:28     Получить список студентов с указанием среднего балла #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- И Вам и ТС обращаю внимание на мой пост выше!На мой взгляд легче сортировать параметры и их индексы а не ворочать в памяти структурами...
В голову бы не пришло сортировать структуры. Либо ссылки сортировать на структуры, либо массив индексов.
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 15:38     Получить список студентов с указанием среднего балла #15
Цитата Сообщение от Olga_ Посмотреть сообщение
Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
, вы сами себе противоречите
Цитата Сообщение от Olga_ Посмотреть сообщение
В голову бы не пришло сортировать структуры. Либо ссылки сортировать на структуры, либо массив индексов.
germeticus
27 / 27 / 1
Регистрация: 21.06.2011
Сообщений: 82
22.08.2011, 15:45     Получить список студентов с указанием среднего балла #16
Я смотрел задачу сортировки слов по алфавиту. Быстрая сортировка конечно быстрее всего, но если у нас идет поток данных, то их лучше сразу раскидывать по бинарному дереву.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 15:47     Получить список студентов с указанием среднего балла #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
, вы сами себе противоречите
Одно дело общие высказывания, другое - реализация. Мои слова - с учетом уровня читающего. Для себя реализация была бы совсем иной. Что за придирки...

Добавлено через 1 минуту
Цитата Сообщение от germeticus Посмотреть сообщение
Я смотрел задачу сортировки слов по алфавиту. Быстрая сортировка конечно быстрее всего, но если у нас идет поток данных, то их лучше сразу раскидывать по бинарному дереву.
В начале это уже говорилось, дерево (поиска) здесь - хороший вариант.
Сыроежка
Заблокирован
22.08.2011, 16:42     Получить список студентов с указанием среднего балла #18
Цитата Сообщение от Olga_ Посмотреть сообщение
Если требуется вывести на экран всех студентов со средним баллом, то массив не нужен. Если требуется это записать в другой файл - тоже не нужен. Просто считываете очередного студента, считаете его средний балл и выводите на экран. Вопрос в том, где все это изначально хранится.
И, вообще, студенты также не нужны! так как средиий балл зависит от настроения преподавателя!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 16:45     Получить список студентов с указанием среднего балла
Еще ссылки по теме:

C++ Выведите фамилии и имена студентов в порядке убывания их среднего балла
Упорядочить список студентов по возрастанию среднего балла C++
C++ Распечатать список студентов со средним баллом выше общего среднего балла
C++ Распечатать список студентов группы имеющих средний балл выше общего среднего балла
создание sql-запроса на подсчет среднего балла C++

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

Или воспользуйтесь поиском по форуму:
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 16:45     Получить список студентов с указанием среднего балла #19
Цитата Сообщение от Сыроежка Посмотреть сообщение
И, вообще, студенты также не нужны! так как средиий балл зависит от настроения преподавателя!
Здесь средний балл для каждого студента по нескольким предметам
Yandex
Объявления
22.08.2011, 16:45     Получить список студентов с указанием среднего балла
Ответ Создать тему
Опции темы

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