Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
1

Структуры. Сортировка

30.06.2012, 03:45. Просмотров 1478. Ответов 10
Метки нет (Все метки)

Здравствуйте, ув. форумчане. Я студент 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ого столбца.

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


Буду благодарен за любую помощь! Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2012, 03:45
Ответы с готовыми решениями:

Структуры. Сортировка массива структуры
Здравствуйте! В чем моя ошибка?? Нужно отсортировать массив структуры по возрастанию среднего...

Сортировка и структуры
Задача : "Имеется список 10 политических деятелей. Каждый из 100 опрошенных называет трех...

Сортировка структуры
Есть структура struct v{ string one; string two; int three; }; Подскажите как...

Сортировка структуры
Не могу придумать алгоритм сортировки структуры, пока все что получилось это найти наибольшее...

10
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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;
 }
};
1
5477 / 4872 / 831
Регистрация: 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; // указатель на структуру контрактников.
}
1
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 23
01.07.2012, 02:25  [ТС] 4
Спасибо огромное) просто не представляете как выручили) еще раз спасибо
0
5477 / 4872 / 831
Регистрация: 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; // освобождаем память занятую массивом.
}
0
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
04.07.2012, 21:56 6
так...А сортировка русского языка?
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2012, 01:26 7
Цитата Сообщение от RASHFor Посмотреть сообщение
так...А сортировка русского языка?
Это о чём?
0
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
05.07.2012, 09:16 8
ну чтобы русский язык тоже сортировало и выводило в нормальном виде.а не с проблемами кодировки.спс
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
05.07.2012, 10:03 9
Русский надо перед сравнением приводить в кодировку, в которой коды символов строго возрастают от номера буквы в алфавите, а при выводе в поддерживаемую средством вывода. ANSI 1251 вроде удовлетворяет первому требованию, а на винде и второму.
0
6 / 6 / 2
Регистрация: 12.02.2012
Сообщений: 224
05.07.2012, 10:14 10
а подробнее можно?То как то я и сам понимаю,что надо приводить в кодировку но какикм образом?
Я сначала в поток cin ввожу данные,потом вівод cout. И на консоли кракозяблы.
system("chcp 1251") и setlocale() не решают проблемы.
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.07.2012, 10:29 11
Удалил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2012, 10:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сортировка структуры
Второй день бьюсь с сортировкой структур, покажу код, входные и выходные данные: struct TZap{ ...

сортировка структуры.
Возникла проблема при сортировке. возможно в коде есть и моя ошибка. ну суть в том, что он не...

Сортировка структуры
Всем привет. Нужна помощь при сортировке. Во время сортировки углов нужно так же отсортировать их...

Сортировка структуры
Отсортировать структуру по желанию пользователя. 1. Вывести на экран книги в алфавитном порядке с...

Сортировка Структуры
Помогите пожалуйста, не получается исправить ошибку. Суть: задается кафедра, по этой кафедре...

Структуры. Сортировка
Всем привет! Подскажите пожалуйста, если я создал структуру с тремя компонентами:...


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

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

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