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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Skies
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
30.06.2012, 03:45     Структуры. Сортировка #1
Здравствуйте, ув. форумчане. Я студент 1ого курса и только недавно начал изучать C++, учился по видеоурокам, но застрял на структурах, не очень понял как все работает.
Нам нужно было сделать программу "Студенческий поток". Программа должна добавлять\удалять\редактировать информацию о студенте, добавлять\удалять\редактировать информацию о группах, поиск по студентам и тд. это все получилось сделать, но застрял на таком задании:
Структура "student" несет в себе информацию о студенте: имя, фамилия, средний балл, контркт\бюджет и тп.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct student
{
    char name[20], fam[20], otc[20]; //Имя фамилия отчество
    int marks[4]; //4 оценки по четырем предметам
    bool b; //бюджет? (да\нет)
    double grant;  // стипендия
    student *nextst;
};
struct group
{
    int num,count; //номер группы, число студентов в группе
    student *headst;
    group *nextgr;
};
1. Нужно вывести в алф. порядке ФИО всех контрактников имеющих средний балл выше чем общий средний балл по их группе.
2. Вывести таблицу:
Номер группы | Число бюджетников | число контрактников |

Строки - в порядки убывания 2ого столбца.

И вот уже неделю не получается это сделать


Буду благодарен за любую помощь! Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2012, 03:45     Структуры. Сортировка
Посмотрите здесь:

C++ Сортировка данных структуры!
C++ Структуры(сортировка)
Сортировка элементов структуры C++
Структуры. Сортировка массива структуры C++
сортировка структуры. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.06.2012, 06:58     Структуры. Сортировка #2
Цитата Сообщение от Skies Посмотреть сообщение
. Нужно вывести в алф. порядке ФИО всех контрактников имеющих средний балл выше чем общий средний балл по их группе.
Тебе надо отобрать данные в новый список, потом его отсортировать. Копай сюда.

Добавлено через 1 минуту
Цитата Сообщение от Skies Посмотреть сообщение
2. Вывести таблицу:
Номер группы | Число бюджетников | число контрактников |
И что здесь сложного?

Добавлено через 1 час 7 минут
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
struct student
{
    char name[20], fam[20], otc[20]; //Имя фамилия отчество
    int marks[4]; //4 оценки по четырем предметам
    bool b; //бюджет? (да\нет)
    double grant;  // стипендия
    student *nextst;
};
struct group
{
    int num,count; //номер группы, число студентов в группе
    student *headst;
    group *nextgr;
}; 
GroupTable (group *g)
{
 unsigned int b, k, i;
 student *s;
 std::cout<<std::ios::width(53)<<"+------------+-----------------+-------------------------------+"<<std::endl;
 std::cout<<"|Номер группы|Число бюджетников|Число контрактников|"<<std::endl;
 std::cout<<"+------------+-----------------+-------------------------------+"<<std::endl;
 for (; g!=nullptr; g=g->bextgr) // Или NULL
 {
  for (i=p->count, s=g->headst, b=0, k=0; i>0; --i, s=s->nextst)
  {
   if (s->b)
   {
    ++b;
   }
   else
   {
    ++k;
   }
  }
 std::cout<<std::ios::width(1)<<"|"<<std::ios::width(12)<<g->num<<std::ios::width(1)<<"|"<<std::ios::width(17)<<bstd::ios::width(1)<<"|"<<std::ios::width(19)<<bstd::ios::width(1)<<"|"<<std::endl;
 std::cout<<std::ios::width(53)<<"+------------+-----------------+-------------------------------+"<<std::endl;
 }
};
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2012, 02:22     Структуры. Сортировка #3
Цитата Сообщение от Skies Посмотреть сообщение
1. Нужно вывести в алф. порядке ФИО всех контрактников имеющих средний балл выше чем общий средний балл по их группе.
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
float average_m (group *gr) // возвращает средний балл группы.
{
    int i = 0;
    float summ_gr = 0;
    student *st;
    for (i = gr -> count, st = gr -> headst; i > 0; --i, st = st -> nextst) //подсчёт суммы баллов группы.
    {
        for (int i = 0; i < 4; i++)
        {
            summ_gr += st -> marks[i];
        }
    }
    return summ_gr / (gr -> count * 4);
}
 
group* group_k(group *gr) // создаёт группу контрактников, у которых средний балл выше, чем в группе.
{
    group *gr_k = new group; // создание группы контрактников.
    gr_k -> headst = 0;
    gr_k -> count  = 0;
    gr_k -> nextgr = 0;
    
    student *st_last; // для адреса последней  структуры в группе контрактников.
    student *st;      // для перебора структур группы *gr.
    
    for ( st = gr -> headst; st != 0; st = st -> nextst) //перебор группы *gr.
    {
        if (!(st -> b)) // если контрактник, то заход.
        {
            float summ_m = 0;
            for (int i = 0; i < 4; i++) // подсчёт суммы баллов у контрактника.
            {
                summ_m += st -> marks[i];
            }
            if ((summ_m / 4) > average_m (gr)) // если средний балл выше, чем средний в группе, то заход.
            {
                if ( gr_k -> count == 0) // если заход первый, то создём первую структуру в группе
                                         // контрактников.
                {
                    st_last = new student;    // первая  структура.
                    gr_k -> headst = st_last; // запоминаем адрес первой структуры.
                    *st_last = *st;           // копируем старую структуру в первую.
                    st_last -> nextst = 0;    // первая, она же последняя, указывает на 0.
                    gr_k -> count++;          // увеличиваем счётчик сруктур в группе контрактников.
                } 
                else                          // если заход не первый.
                {
                    student *st_k = new student; // очередная структура.
                    *st_k = *st;                 // копирование старой в новую.
                    st_last -> nextst = st_k;    // предыдущая указывает на новую.
                    st_last = st_k;              // новая становится последней.
                    st_last -> nextst = 0;      // последняя указывает на 0.
                    gr_k -> count++;      // увеличиваем счётчик сруктур в группе контрактников
                } 
             }
         }
    }
    return gr_k; // указатель на структуру контрактников.
}
Осталось сделать функцию для сортировки по алфавиту.

Добавлено через 8 часов 1 минуту
Функцию group_k() лучше так сделать:
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
group* group_k(group *gr) // создаёт группу контрактников, у которых средний балл 
                          //выше, чем в группе.
{
    group *gr_k = new group; // создание группы контрактников.
    gr_k -> headst = 0;
    gr_k -> count  = 0;
    gr_k -> nextgr = 0;
    
    student *st_last; // для адреса последней  структуры в группе контрактников.
    student *st;      // для перебора структур группы *gr.
    
    for ( st = gr -> headst; st != 0; st = st -> nextst) //перебор группы *gr.
    {
        if (!(st -> b)) // если контрактник, то заход.
        {
            float summ_m = 0;
            for (int i = 0; i < 4; i++) // подсчёт суммы баллов у контрактника.
            {
                summ_m += st -> marks[i];
            }
            if ((summ_m / 4) > average_m (gr)) // если средний балл выше, чем средний в группе, то заход.
            {
                student *add = new student;    // новая структура.
                *add = *st;           // копируем старую структуру в новую.
                add -> nextst = 0;    // дальше новой ничего.
                gr_k -> count++;      // увеличиваем счётчик сруктур в группе контрактников.
                if (gr_k -> headst == 0)  // если группа пуста.
                {
                    gr_k -> headst = add; // новая в начало группы.
                }
                else  // если группа не пуста.
                {       
                    st_last -> nextst = add; // новая в конец группы.
                }
                st_last = add;  // новая становится последней.
            } // если средний балл выше
        } // если контрактник
    } // for
    return gr_k; // указатель на структуру контрактников.
}
Skies
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
01.07.2012, 02:25  [ТС]     Структуры. Сортировка #4
Спасибо огромное) просто не представляете как выручили) еще раз спасибо
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2012, 09:24     Структуры. Сортировка #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
// создание из группы динамического массива student (используется при сортировке). 
student* arr_student(group *gr) 
{
    student *st;      // для перебора структур группы *gr. 
    int i = 0;
    int n = gr -> count; // количество student в группе.
    
    student *p = new student[n]; // динамический массив для n student.
    
    for ( st = gr -> headst; st != 0; st = st -> nextst, i++) // копирование структур группы.
    { 
        p[i] = *st;
        
    }
    return p; // указатель на массив.
}
 
// распечатка студентов группы в алфавитном порядке по первой букве имени.
void sort_arr_student(group *p)
{
    int n = (*p).count; // количество студентов в группе.
    student *p_arr = arr_student(p); // создание динамического массива из студентов группы.
    
    for (int i = 0; i < n; ++i) // сортировка студентов в массиве по первой букве имени
    {                           // (пузырьковая сортировка).
        for (int j = 0; j < n - i - 1; ++j) 
        {
            if (p_arr[j].name[0] > p_arr[j + 1].name[0]) // сравниваем два соседних элемента.
            {
                student tmp = p_arr[j];  // если они идут в неправильном порядке, то  
                                         // меняем их местами.
                p_arr[j] = p_arr[j + 1];
                p_arr[j + 1] = tmp;        
            }
        }
    }
    
    for (int i = 0; i < n; i++) // распечатка имён студентов отсортированного массива.
    {
        cout << p_arr[i].name << endl;
    }
    cout << endl;
    delete [] p_arr; // освобождаем память занятую массивом.
}
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
04.07.2012, 21:56     Структуры. Сортировка #6
так...А сортировка русского языка?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2012, 01:26     Структуры. Сортировка #7
Цитата Сообщение от RASHFor Посмотреть сообщение
так...А сортировка русского языка?
Это о чём?
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
05.07.2012, 09:16     Структуры. Сортировка #8
ну чтобы русский язык тоже сортировало и выводило в нормальном виде.а не с проблемами кодировки.спс
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.07.2012, 10:03     Структуры. Сортировка #9
Русский надо перед сравнением приводить в кодировку, в которой коды символов строго возрастают от номера буквы в алфавите, а при выводе в поддерживаемую средством вывода. ANSI 1251 вроде удовлетворяет первому требованию, а на винде и второму.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
05.07.2012, 10:14     Структуры. Сортировка #10
а подробнее можно?То как то я и сам понимаю,что надо приводить в кодировку но какикм образом?
Я сначала в поток cin ввожу данные,потом вівод cout. И на консоли кракозяблы.
system("chcp 1251") и setlocale() не решают проблемы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2012, 10:29     Структуры. Сортировка
Еще ссылки по теме:

C++ Сортировка структуры
C++ Сортировка и структуры
Сортировка структуры C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2012, 10:29     Структуры. Сортировка #11
Удалил.
Yandex
Объявления
05.07.2012, 10:29     Структуры. Сортировка
Ответ Создать тему
Опции темы

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