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

Сортировка в структурах[C++] - C++

Восстановить пароль Регистрация
 
druger
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 57
22.03.2012, 19:02     Сортировка в структурах[C++] #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
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<iomanip.h>
#include<fstream.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
 
ifstream Fin;
ofstream Fout;
const int m=6;
struct Sportsmen
 {
  char Fam[11];
  char Dolgn[14];
  float Ball[m];
 };
void input (Sportsmen &T)
 {
  Fin>>T.Fam>>T.Dolgn;
  for (int j=0; j<m; j++)
   Fin>>T.Ball[j];
 }
void output (Sportsmen T)
 {
  Fout<<setw(10)<<T.Fam<<" "<<setw(15)<<T.Dolgn;
  for (int j=0; j<m; j++)
   Fout<<setw(4)<<T.Ball[j];
   Fout<<endl;
 }
 
float SrBall (Sportsmen T)
 {
   float Sr=0;
   for (int j=0; j<m; j++)
   Sr+=T.Ball[j];
   return Sr/m;
 }
void InsertSort (float Ball[],int m,Sportsmen T)
 {
  for (int i=1; i<m; i++)
   {
    float x=SrBall[i];
    for (int j=i-1; j>=0 && SrBall[j]>x; j++)
     SrBall[j+1]=SrBall[j];
    SrBall[j+1]=x;
   }
  }
 
void main ()
{
 Sportsmen S[50];
 Fin.open("Z:\\STRUCT\\DATA.cpp");
  if (Fin.fail())
   {
   cout<< "\n input file is not open \n";
   exit(1);
   }
 int k=0;
 while (!Fin.eof())
  input (S[k++]);
  k--;
 Fin.close();
 InsertSort(SrBall,m);
 Fout.open("Z:\\STRUCT\\SORT.txt");
  if (Fout.fail())
   {
    cout <<"\n created file is not open\n";
    exit(1);
   }
 for (int i=0; i<k; i++)
  output (S[i]);
 Fout.close();
Вот файл
Код
Ololoev swimer 20 15 18 19.5 17 20
Troler troling 20 19 17 20 14 20
Djigurda sport_dancer 15 14 10 5 7 3.5
Mentov footballer 5.5 4 2 1 1 1
Ravshan skier 3 8 6 12 16 14
Djamshut bobsledder 3 3 1 2 2.5 1.5
Putin karatist 19 20 19 13 9 8
Mevdedev judoist 18.5 17.5 19.5 11 4 20
Makarov athlete 13 15 11.5 14.5 9 18
Syvorov biathlete 7 0 3 9 8 2
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2012, 19:02     Сортировка в структурах[C++]
Посмотрите здесь:

Указатели в структурах C++
C++ Константы в структурах
C++ Выделение памяти в структурах
Операция new в структурах C++
Заполнение строк в структурах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
22.03.2012, 19:09     Сортировка в структурах[C++] #2
вот аналогичное задание в котором сортируются студенты по возрастанию среднего бала

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
#include "iostream"
#include "fstream"
 
using namespace std;
 
struct student 
{
    char name[20];//фамилия студента
    int group; //номер группы
    int  ses[5]; //оценки
};
 
double sort(student *,int n);    // прототип функции сортировки по среднему балу
double horoshist(student *,int n); // прототип функции вывод студентов у которых 4 и 5
 
int main()
{
    setlocale(LC_CTYPE,"Russian"); //русский шрифт в консоле
    int n, i, j; //обьявляем переменные
    cout << "Введите количество структур типа студент - ";
    cin >> n; //число элементов в массиве структур
    
    student *stud1 = new student [n]; //выделение динамической памяти под массив структур
 
    ifstream instr("inform.txt");   //открытие файла для ввода
    if(!instr) //если файл не найден тогда....
    {
        cout<<"File can not be open\n"; //выводим сообщение
        return 0; //выход из программы
    }                                          
 
    cout << endl << "Фамилия\tГруппа\t\t    Оценки" << endl << endl;
    
    //заполнение массива считыванием из файла
    for(i = 0; i < n; i++)
    { 
        instr >> stud1[i].name >> stud1[i].group;
        cout << stud1[i].name << '\t' << stud1[i].group; 
            for(j = 0; j < 5; j++)
            {
                instr >> stud1[i].ses[j];
                cout << '\t' << stud1[i].ses[j];
            }   
            cout << endl;
    }  
    instr.close(); //закрываем файл
 
    cout << endl << "Mассив STUD1 по возрастанию среднего балла" << endl;
    cout << endl << "Фамилия\tГруппа\t\t     Оценки\t\t     Средний бал" << endl << endl;
    sort(stud1, n); //вызываем функцию сортировки
 
    cout << endl << "Фамилии и номера групп для всех студентов, имеющих оценки 4 и 5" << endl;
    cout << endl << "Фамилия\tГруппа" << endl << endl;
    horoshist(stud1, n); //вызываем функцию для вывода хорошистов
 
    delete [] stud1; //очищаем память
    system("pause >> null"); //ждем пока пользователь нажмет любую клавишу
    return 0; //выход с программы
}
 
 
//сортировку делаеи спомощью "Пузырьковой сортировки"
double sort(student *gr, int n)
{
    double s; //перемееная для подсчета суммы балов каждого студента
    double *avg = new double [n]; //выделяем память под массив хранящщего средние балы каждого студента
    
    //находим средний бал каждого студента
    for(int i = 0; i < n; i++)
    {
        s = 0.;
        for(int j = 0; j < 5; j++)
        {
            s += gr[i].ses[j];
            avg[i] = s / 5;
        }
    }
 
    bool flag = true; //обьявляем булевую переменную и даем есть значение "истина"
        
        while(flag) //пока "истина" делаем
        {
            flag = false;  //устанавливаем переменную в "ложь"
                    
            for(int i = 0; i < n - 1; ++i)
            {
                if(avg[i] > avg[i + 1]) //если элемент массива большн следующий элемент, тогда
                {
                    //меняем массивы в структуре местами
                    student x = gr[i];
                    gr[i] = gr[i + 1];
                    gr[i + 1] = x;
                    
                    //а также меняем местами и элементы в массиве средних оценок 
                    double temp = avg[i];
                    avg[i] = avg[i + 1];
                    avg[i + 1] = temp;
           
                    flag = true; //уснанавлюем в "истина"
                }
            }
        }
 
        //выводим на экран отсортированную структуру
        for(int i = 0; i < n; i++)
    { 
        cout << gr[i].name << '\t' << gr[i].group; 
            for(int j = 0; j < 5; j++)
            {
                cout << '\t' << gr[i].ses[j];
                
            }
            cout << "\t" << avg[i]; //выводим на экран средний бал
            cout << endl;
    }  
    delete [] avg; //освобождаем память
    return 0;
}
 
 
//ищем хорошистов
double horoshist(student *gr, int n)
{
    int x, z = 0; //объявляем переменные
 
    for(int i = 0; i < n; i++)
    {
        x = 0;
        for(int j = 0; j < 5; j++)
        {
            
            if(gr[i].ses[j] == 4 || gr[i].ses[j] == 5)
            {
                x++; //считаем количество 4 и 5 у каждого студента
            }
        }
        if (x == 5) //если еоличество 4 и 5 равен 5 тогда...
        {
            cout << gr[i].name << '\t' << gr[i].group << endl; //выводи этих студентов
            z++;//подсчитываем количеств хорошистов
        }
        
    }
    if (z == 0) //если хорошистов нет, тогда ....
        {
            cout << "Среди студентов нет хорошистов" <<endl; //выводим сообщение об этом
        }
    return 0;
}
Разбирайтесь!

Сортировка пузырьком или простым обменом!

Содержимое файла
Ivanov 203 3 4 5 2 3
Petrov 402 4 3 5 4 5
Homenko 303 2 5 4 1 1
Zaletov 101 4 1 1 1 1
Sidorov 304 1 4 5 4 5
Reznik 304 3 3 3 4 4
Rolin 101 4 3 1 1 3
Garmash 304 1 4 3 4 4
Aleshin 222 4 5 4 4 4
Alabysh 453 5 4 3 5 2
Babaev 122 4 5 4 3 4
Bagoley 204 3 4 5 4 3
Belkin 102 2 5 4 3 2
Belokon 342 5 5 5 5 5
Gilyov 354 1 4 3 2 4
Vagin 100 5 3 4 2 2
Volokh 234 4 5 4 4 4
Griazev 176 3 5 2 4 3
Demin 312 5 5 5 5 2
Dulov 423 3 5 4 2 3
Эльшат
0 / 0 / 0
Регистрация: 21.12.2012
Сообщений: 7
28.12.2012, 20:40     Сортировка в структурах[C++] #3
помогите отсортировать это задание методом выбора у меня почти такое же задание
Learx
1032 / 839 / 85
Регистрация: 31.03.2010
Сообщений: 2,465
28.12.2012, 21:06     Сортировка в структурах[C++] #4
druger, Вы в функции InsertSort обращаетесь к SrBall как к массиву, хотя это у вас функция.
Вам следует

1. переопределить тип первого параметра InsertSort на Sportsmen[]
2.
C++
1
float x=SrBall[i];
это доллжно быть вычисление среднего балла для текущего спортсмена и должно быть исправлено на:
C++
1
float x= SrBall(Ball[i]);
3. передать в функцию InsertSort массив S

По идее после этого программа заработает.
Yandex
Объявления
28.12.2012, 21:06     Сортировка в структурах[C++]
Ответ Создать тему
Опции темы

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