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

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

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

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

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

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

Получить список студентов с указанием среднего балла - C++
Дан массив записей. Каждая запись содержит информацию о студентах группы: Ф.И.О., результаты последней экзаменационной сессии. -...

Упорядочить список студентов по возрастанию среднего балла - C++
Имеется код, необходимо упорядочить список студентов по возрастанию среднего балла. Не понимаю, как это сделать. Прошу помочь! ...

Создать список студентов с оценками по нескольким дисциплинам. Отсортировать список по убыванию среднего балла. Имеющих двойки удалить из списка. - C++
Помогите сделать лабу задание:Создать список студентов с оценками по нескольким дисциплинам. Отсортировать список по убыванию среднего...

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

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

Составить программу для вычисления среднего балла студентов, если количество студентов и оценки вводятся с клавиатуры. - C++
Привет всем )) Нужна помощь 3. Задача (язык С + +). Составить программу для вычисления среднего балла студентов, если количество...

18
co6ak
Кошковед
408 / 501 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
22.08.2011, 10:53 #2
делайте как умеете.
после появления рабочего варианта можно будет думать "как лучше"
0
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 10:55 #3
Если требуется вывести на экран всех студентов со средним баллом, то массив не нужен. Если требуется это записать в другой файл - тоже не нужен. Просто считываете очередного студента, считаете его средний балл и выводите на экран. Вопрос в том, где все это изначально хранится.
0
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
22.08.2011, 11:46  [ТС] #4
данные хранятся в файле, а вывести их надо упорядочив лексикографически или по убыванию среднего балла , на выбор пользователя прграммы.
0
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 11:50 #5
Да уж, если бы это была база данных (БОЛЬШАЯ), то сортировать ее одно удовольствие... Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
1
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
22.08.2011, 11:53 #6
Связный список поможет (можно, разумеется rb-дерево).
Причем вставка очередного клиента должна проводиться уже в нужное место списка.
1
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 11:55 #7
Цитата Сообщение от villu Посмотреть сообщение
Связный список поможет (можно, разумеется rb-дерево).
Причем вставка очередного клиента должна проводиться уже в нужное место списка.
Тогда уж лучше дерево (дерево поиска), в среднем вставка быстрее происходит.
0
Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
22.08.2011, 12:24 #8
_д_м_и_т_р_и_й_, less talk more action.
2
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; 
};
Получаем бинарное дерево. Читаем рекурсивной функцией. В общем все по Кернигану.
0
-=ЮрА=-
Заблокирован
Автор 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_ Посмотреть сообщение
Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
- всё таки в этом случае думаю лучше читать из базы, пусть и несколько проходов делать (забыливаше замечание по поводу выделения памяти???)
0
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 12:44 #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- всё таки в этом случае думаю лучше читать из базы, пусть и несколько проходов делать (забыливаше замечание по поводу выделения памяти???)
Нет, все верно, но для данной учебной задачи легче ваш вариант с выгрузкой в память.
1
-=ЮрА=-
Заблокирован
Автор 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);
Файл исходных данных прилагаю, но вы и сами можите его ввести
1
Вложения
Тип файла: txt data.txt (672 байт, 6 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 14:50 #13
Цитата Сообщение от Olga_ Посмотреть сообщение
Нет, все верно, но для данной учебной задачи легче ваш вариант с выгрузкой в память.
- И Вам и ТС обращаю внимание на мой пост выше!На мой взгляд легче сортировать параметры и их индексы а не ворочать в памяти структурами...
0
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
22.08.2011, 15:28 #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- И Вам и ТС обращаю внимание на мой пост выше!На мой взгляд легче сортировать параметры и их индексы а не ворочать в памяти структурами...
В голову бы не пришло сортировать структуры. Либо ссылки сортировать на структуры, либо массив индексов.
1
-=ЮрА=-
Заблокирован
Автор FAQ
22.08.2011, 15:38 #15
Цитата Сообщение от Olga_ Посмотреть сообщение
Наверное лучше все выгрузить в массив структур и отсортировать, тогда изначально вы были правы.
, вы сами себе противоречите
Цитата Сообщение от Olga_ Посмотреть сообщение
В голову бы не пришло сортировать структуры. Либо ссылки сортировать на структуры, либо массив индексов.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2011, 15:38
Привет! Вот еще темы с ответами:

Вывести студентов в порядке убывания среднего балла - C++
дан список студентов и список предметов,по которому сдавался экзамен. известны оценки по каждому предмету. разработать алгоритм и привести...

Составить программу для вычисления среднего балла студентов - C++
Привет всем )) Задача (язык С + +). Составить программу для вычисления среднего балла студентов, если количество студентов и оценки...

Выведите фамилии и имена студентов в порядке убывания их среднего балла - C++
Выведите фамилии и имена студентов в порядке убывания их среднего балла

Вывести список абитуриентов, средний балл которых выше среднего балла по университету - C++
Сказали мне сделать задание) Не поможете ) Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: Ф.И.О....


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.08.2011, 15:38
Ответ Создать тему
Опции темы

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