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

Упорядочить элементы структуры - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 22:01     Упорядочить элементы структуры #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
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <iomanip>
#include <fstream>
 
using namespace std;
 
struct Man
{
    string fio;
    int date;
    double stat,weight;
    char gen;
};
 
void Init(Man *people,int n)
{
    char gent,Mas_Char[30];
    for (int i=0;i<n;i++)
    {
        cin.sync();
        cout <<"\nВведите ФИО: ";
        cin.getline(Mas_Char,30);
        people[i].fio=Mas_Char;
        cout <<"Введите год рождения: ";
        cin >>people[i].date;
        cout <<"Введите рост человека: ";
        cin >>people[i].stat;
        cout <<"Введите вес человека: ";
        cin >>people[i].weight;
        cout <<"Введите пол человека ""м"" или ""ж"": ";
        label:cin >>gent;
        if ((gent=='м')||(gent=='ж'))
            people[i].gen=gent;
        else 
        {
            cout <<"Введите ""м"" или ""ж"": ";
            goto label;
        }
    }
}
 
void Print(Man *people,int n)
{
    fstream file;
    file.open("people.txt",ios::app);
    if (file)
    {   
        for (int i=0;i<n;i++)
        {
            file <<"\n"<<"ФИО человека      : "<<people[i].fio<<"\n";
            file <<"Год рождения      : "<<people[i].date<<"\n";
            file <<"Рост              : "<<people[i].stat<<"\n";
            file <<"Вес               : "<<people[i].weight<<"\n";
            file <<"Пол               : "<<people[i].gen<<"\n";
        }
                
    }
    else cout <<"Файл не может быть открыт или создан!";
    file.close();
}
 
void Display(Man *people, int n)
{
    for(int i=0;i<n;i++)
        {
            cout <<"\nФИО человека      : "<<people[i].fio<<"\n";
            cout <<"Год рождения      : "<<people[i].date<<"\n";
            cout <<"Рост              : "<<people[i].stat<<"\n";
            cout <<"Вес               : "<<people[i].weight<<"\n";
            cout <<"Пол               : "<<people[i].gen<<"\n";
        }
}
 
Man* Sort(Man *people, int n, int z, int priz)
{
    int k;
    Man buff;
    if (z==0)
        switch (priz)
    {
    case (0):{
    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if (people[k].weight > people[j].weight)
                k=j;
        }
        buff.fio=people[i].fio;
        buff.date=people[i].date;
        buff.stat=people[i].stat;
        buff.weight=people[i].weight;
        buff.gen=people[i].gen;
        people[i].fio=people[k].fio;
        people[i].date=people[k].date;
        people[i].stat=people[k].stat;
        people[i].weight=people[k].weight;
        people[i].gen=people[k].gen;
        people[k].fio=buff.fio;
        people[k].date=buff.date;
        people[k].stat=buff.stat;
        people[k].weight=buff.weight;
        people[k].gen=buff.gen;
    }
             }break;
    case (1):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k].stat > people[j].stat)
                    k=j;
            }
            buff.fio=people[i].fio;
            buff.date=people[i].date;
            buff.stat=people[i].stat;
            buff.weight=people[i].weight;
            buff.gen=people[i].gen;
            people[i].fio=people[k].fio;
            people[i].date=people[k].date;
            people[i].stat=people[k].stat;
            people[i].weight=people[k].weight;
            people[i].gen=people[k].gen;
            people[k].fio=buff.fio;
            people[k].date=buff.date;
            people[k].stat=buff.stat;
            people[k].weight=buff.weight;
            people[k].gen=buff.gen;
        }
             }break;
    case (2):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k].date < people[j].date)
                    k=j;
            }
            buff.fio=people[i].fio;
            buff.date=people[i].date;
            buff.stat=people[i].stat;
            buff.weight=people[i].weight;
            buff.gen=people[i].gen;
            people[i].fio=people[k].fio;
            people[i].date=people[k].date;
            people[i].stat=people[k].stat;
            people[i].weight=people[k].weight;
            people[i].gen=people[k].gen;
            people[k].fio=buff.fio;
            people[k].date=buff.date;
            people[k].stat=buff.stat;
            people[k].weight=buff.weight;
            people[k].gen=buff.gen;
        }            
             }break;
    }
    if (z==1)
        switch (priz)
        {
    case (0):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k].weight < people[j].weight)
                    k=j;
            }
            buff.fio=people[i].fio;
            buff.date=people[i].date;
            buff.stat=people[i].stat;
            buff.weight=people[i].weight;
            buff.gen=people[i].gen;
            people[i].fio=people[k].fio;
            people[i].date=people[k].date;
            people[i].stat=people[k].stat;
            people[i].weight=people[k].weight;
            people[i].gen=people[k].gen;
            people[k].fio=buff.fio;
            people[k].date=buff.date;
            people[k].stat=buff.stat;
            people[k].weight=buff.weight;
            people[k].gen=buff.gen;
        }
             }break;
    case (1):{
      for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k].stat < people[j].stat)
                    k=j;
            }
            buff.fio=people[i].fio;
            buff.date=people[i].date;
            buff.stat=people[i].stat;
            buff.weight=people[i].weight;
            buff.gen=people[i].gen;
            people[i].fio=people[k].fio;
            people[i].date=people[k].date;
            people[i].stat=people[k].stat;
            people[i].weight=people[k].weight;
            people[i].gen=people[k].gen;
            people[k].fio=buff.fio;
            people[k].date=buff.date;
            people[k].stat=buff.stat;
            people[k].weight=buff.weight;
            people[k].gen=buff.gen;
        }
             }break;
    case (2):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k].date > people[j].date)
                    k=j;
            }
            buff.fio=people[i].fio;
            buff.date=people[i].date;
            buff.stat=people[i].stat;
            buff.weight=people[i].weight;
            buff.gen=people[i].gen;
            people[i].fio=people[k].fio;
            people[i].date=people[k].date;
            people[i].stat=people[k].stat;
            people[i].weight=people[k].weight;
            people[i].gen=people[k].gen;
            people[k].fio=buff.fio;
            people[k].date=buff.date;
            people[k].stat=buff.stat;
            people[k].weight=buff.weight;
            people[k].gen=buff.gen;
        }            
             }break;
    }
return people;
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int n,poss,poss1,i;
    cout <<"Введите количество человек: ";
    cin >>n;
    Man* people = new Man[n];
    Man tmp;
    Init(people,n);
    lab:system("cls");
    cout <<"\nВыберите:";
    cout <<"\n0---------->Вывод на экран";
    cout <<"\n1---------->Вывод в файл";
    cout <<"\n2---------->Сортировка";
    cout <<"\n3---------->Выход!";
    cout <<"\n---->";cin >>poss;
    switch (poss)
    {
    case (0):
        Display(people,n);
        system("pause");
        break;
    case (1):
        Print(people,n);
        break;
    case (2):{
        cout <<"\nВыберите метод сортировки:";
        cout <<"\n0---------->По возростанию";
        cout <<"\n1---------->По убыванию";
        cout <<"\n---->";cin >>poss;
        cout <<"\nВыберите метод сортировки:";
        cout <<"\n0---------->По Возрасту";
        cout <<"\n1---------->По Росту";
        cout <<"\n2---------->По Весу";
        cout <<"\n---->";cin >>poss1;
        people=Sort(people,n,poss,poss1);
        break;
             }
    case (3):
        exit(0);
        system("pause");
        break;
    }
    goto lab;
    return 0;
}
Сортирует правильно только лишь по росту... хотя алгоритм везде одинаковый...Помогите кто может пожалуйста.

Добавлено через 12 минут
Вот куча ошибок при компиляции в Release:
Код
1>------ Построение начато: проект: Lab_rab11, Конфигурация: Release Win32 ------
1>Построение начато 02.12.2013 22:37:10.
1>InitializeBuildStatus:
1>  Обращение к "Release\Lab_rab11.unsuccessfulbuild".
1>ClCompile:
1>  Для всех выходных данных обновления не требуется.
1>  Lab_rab11.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(57): error C2011: vc_attributes::YesNoMaybe: переопределение типа "enum"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(57): см. объявление "vc_attributes::YesNoMaybe"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(67): error C2011: vc_attributes::AccessType: переопределение типа "enum"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(67): см. объявление "vc_attributes::AccessType"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(81): error C2011: vc_attributes::Pre: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(81): см. объявление "vc_attributes::Pre"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(78): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(112): error C2011: vc_attributes::Post: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(112): см. объявление "vc_attributes::Post"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(109): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(143): error C2011: vc_attributes::FormatString: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(143): см. объявление "vc_attributes::FormatString"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(155): error C2011: vc_attributes::InvalidCheck: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(155): см. объявление "vc_attributes::InvalidCheck"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(152): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(165): error C2011: vc_attributes::Success: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(165): см. объявление "vc_attributes::Success"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(176): error C2011: vc_attributes::PreBound: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(176): см. объявление "vc_attributes::PreBound"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(173): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(186): error C2011: vc_attributes::PostBound: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(186): см. объявление "vc_attributes::PostBound"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(183): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(196): error C2011: vc_attributes::PreRange: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(196): см. объявление "vc_attributes::PreRange"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(193): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(208): error C2011: vc_attributes::PostRange: переопределение типа "struct"
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(208): см. объявление "vc_attributes::PostRange"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(205): error C3094: repeatable: анонимное использование не допускается
1>          predefined C++ attributes (compiler internal)(147): см. объявление "repeatable"
1>          атрибут может быть применен только к: 'class', 'struct'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(245): error C2370: SA_Yes: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(245): см. объявление "SA_Yes"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(246): error C2370: SA_No: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(246): см. объявление "SA_No"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(247): error C2370: SA_Maybe: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(247): см. объявление "SA_Maybe"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(250): error C2370: SA_NoAccess: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(250): см. объявление "SA_NoAccess"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(251): error C2370: SA_Read: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(251): см. объявление "SA_Read"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(252): error C2370: SA_Write: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(252): см. объявление "SA_Write"
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(253): error C2370: SA_ReadWrite: переопределение; другой класс хранения
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(253): см. объявление "SA_ReadWrite"
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.53
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 =========
Помогите разобраться кто нибудь..Пожалуйста

Добавлено через 1 минуту
При этом в Debug компилируется... Но с уже названной проблемой

Добавлено через 1 час 20 минут
Неужели никто даже предположение высказать не может)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 22:01     Упорядочить элементы структуры
Посмотрите здесь:

Найти минимальный и максимальный элементы массива и упорядочить элементы по убыванию, стоящие между ними, методом «пузырька». C++
C++ Упорядочить элементы массива по убыванию
Упорядочить все элементы матрицы таким образом, чтобы при чтении матрицы по строкам ее элементы образовывали отсортированный по возрастанию массив C++
C++ Упорядочить записи структуры по фамилии
Упорядочить элементы массива, располагая в первой его половине элементы, стоявшие на четных позициях C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
02.12.2013, 22:04     Упорядочить элементы структуры #2
выкини это Г код и перепиши с использованием STL (std::vector, std::sort - с предикатом)
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 22:12  [ТС]     Упорядочить элементы структуры #3
Цитата Сообщение от newbie666 Посмотреть сообщение
выкини это Г код и перепиши с использованием STL (std::vector, std::sort - с предикатом)
std::vector вместо чего?? , std:: sort вместо чего??
и вопрос почему Г код?) я новичок но вроде ничего лишнего)... ну этот вопрос не важен))
newbie666
Заблокирован
02.12.2013, 22:23     Упорядочить элементы структуры #4
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
std::vector вместо чего??
вместо этого
Man* people = new Man[n];
Man tmp;
Init(people,n);

Цитата Сообщение от Alex_Skripa Посмотреть сообщение
std:: sort вместо чего??
вместо этого
people=Sort(people,n,poss,poss1);

Цитата Сообщение от Alex_Skripa Посмотреть сообщение
и вопрос почему Г код?)
да потому что нормальный программист сейчас не пишет код без STL, а ещё более нормальный не пишет код без BOOST

По всякому С-шному барахлу вопросы наверное лучше задавать на ветке С
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 22:25  [ТС]     Упорядочить элементы структуры #5
Да и еще нельзя использовать вектор так как мы его еще не изучали, хотя я уже имею опыт работы с ним только так и не понял как работать с итераторами, и тем более нельзя использовать sort как готовый алгоритм так, хоть таковой и существует но преподу необходимо видеть что сортировка нами усвоена... Собственно вот) а так спасибо за подсказку, буду писать прогу для себя обязательно буду использовать предложенное Вами... Еще раз спасибо!
newbie666
Заблокирован
02.12.2013, 22:27     Упорядочить элементы структуры #6
что за тебя код написать нормальный на STL? Ты всё равно его не поймёшь

Добавлено через 1 минуту
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
мы его еще не изучали
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
но преподу необходимо видеть что сортировка нами усвоена...
ты знаешь, что делать твоё задания для какого то препода - это по крайней мере не благодарное и бестолковое занятие. Моя готовя программа и тебя умнее не сделает, т.к. тебе она нужна только для того, чтоб препод отстал и у меня время отнимет
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 22:35  [ТС]     Упорядочить элементы структуры #7
Цитата Сообщение от newbie666 Посмотреть сообщение
что за тебя код написать нормальный на STL? Ты всё равно его не поймёшь
Напиши будет над чем разобраться, и желательно чтоб работа с итераторами была, можно не эту программу а что нить другое(поменьше...), только с пояснением, и чтобы в векторе тип структуры был. Если конечно не затруднит, заранее Благодарен)))

Добавлено через 2 минуты
Цитата Сообщение от newbie666 Посмотреть сообщение
ты знаешь, что делать твоё задания для какого то препода - это по крайней мере не благодарное и бестолковое занятие. Моя готовя программа и тебя умнее не сделает, т.к. тебе она нужна только для того, чтоб препод отстал и у меня время отнимет
Я вообще то не просил готовый код моей программы, и я в курсе что готовый код меня умнее не сделал бы если я бы его не для разбора попросил, а тупо сдать преподу, и с преподом не проканает такая фишка)
И да код то по сути рабочий, по алгоритму так сказать, а ошибки не понятные...

Добавлено через 2 минуты
Почему в Debug компилируется а в Release нет, Почему по полю stat сортировка проходит нормально, а по полю date и weight сортирует не верно???Вот вопросы) мне решение не нужно. Мне ответы нужны, Пожалуйста)
newbie666
Заблокирован
02.12.2013, 22:50     Упорядочить элементы структуры #8
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Напиши будет над чем разобраться, и желательно чтоб работа с итераторами была, можно не эту программу а что нить другое(поменьше...)
пожалуйста, на этом простом примере надеюсь ты поймёшь как сортируются вектора по любому параметру структуры используя предикат
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
#include <tchar.h>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
 
struct ITEM
{
    int id;
    char oneLetter;
    std::string fullString;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<ITEM> dataBase;
 
    ITEM item;
    //ЗАПОЛНЯЮ БАЗУ ДАННХ ЧЕМ УГОДНО И КАК УГОДНО
    item.id = 341;
    item.oneLetter = 'x';
    item.fullString = "PREVED MEDVED!";
    dataBase.push_back(item);
 
    item.id = 862;
    item.oneLetter = 'a';
    item.fullString = "POKA MEDVED!";
    dataBase.push_back(item);
 
    item.id = 124;
    item.oneLetter = 'n';
    item.fullString = "DUKE WILL NEVER DIE!!!";
    dataBase.push_back(item);
 
    //СОРТИРОВКА ПО id, ТРЕТИЙ АРГУМЕНТ []...И ТД - ЭТО ПРЕДИКАТ, ТОЕСТЬ ВСТРОЕННАЯ ФУНКЦИЯ, КОТОРАЯ ГОВОРИТ, КАК СОРТИРОВАТЬ
    std::sort(dataBase.begin(), dataBase.end(),[](const ITEM a, const ITEM b){return a.id < b.id;});    
    //ВЫКИДЫВАЕМ В КОНСОЛЬ
    std::cout << "SORT BY 'id'" << std::endl;
    for(auto it = dataBase.begin(); it != dataBase.end(); it++)
        std::cout << "ITEM: id= " << it->id << ", oneLetter = " << it->oneLetter << ", fullString = " << it->fullString << std::endl;
    std::cout << std::endl;
 
    //СОРТИРОВКА ПО oneLetter, условие сортировки такое же - так любой символ или строка имеет алфавитную сортировку встроенную
    std::sort(dataBase.begin(), dataBase.end(),[](const ITEM a, const ITEM b){return a.oneLetter < b.oneLetter;}); 
    //ВЫКИДЫВАЕМ В КОНСОЛЬ
    std::cout << "SORT BY 'oneLetter'" << std::endl;
    for(auto it = dataBase.begin(); it != dataBase.end(); it++)
        std::cout << "ITEM: ID = " << it->id << ", oneLetter = " << it->oneLetter << ", fullString = " << it->fullString << std::endl;
    std::cout << std::endl;
 
    std::cout << "SORT BY 'fullString'" << std::endl;
    //СОРТИРОВКА ПО fullString (одной букве), условие сортировки такое же - так любой символ или строка имеет алфавитную сортировку встроенную
    std::sort(dataBase.begin(), dataBase.end(),[](const ITEM a, const ITEM b){return a.fullString < b.fullString;}); 
    //ВЫКИДЫВАЕМ В КОНСОЛЬ
    for(auto it = dataBase.begin(); it != dataBase.end(); it++)
        std::cout << "ITEM: ID = " << it->id << ", oneLetter = " << it->oneLetter << ", fullString = " << it->fullString << std::endl;
    std::cout << std::endl;
 
    return 0;
}
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 22:59  [ТС]     Упорядочить элементы структуры #9
1>c:\users\алексей\documents\visual studio 2010\projects\vectora_rabota\vectora_rabota\vectora_rabota.cpp(65): fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка "{" в "c:\users\алексей\documents\visual studio 2010\projects\vectora_rabota\vectora_rabota\vectora_rabota.cpp(19)"
Ошибку компилятор дал) Но спасибо этого вполне достаточно чтобы разобраться с работой над векторами...
Для всех кто будет в теме:
Жду еще помощи по моим ошибкам, так как предполагаю что препод не в силах мне помочь... Прогу он примет 100% и проблем у меня с этим не будет но вот разобраться с ошибками важно лично для меня
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
02.12.2013, 23:12     Упорядочить элементы структуры #10
Alex_Skripa, не знаю на счет ошибок выдаваемых кмпилятором, лень компилить Ваш код, но вот на счет логики, сразу бросились в глаза строки 113, 139, 165: оператор break должен быть перед '}' а не после неё
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 23:14  [ТС]     Упорядочить элементы структуры #11
Цитата Сообщение от Algoritmer Посмотреть сообщение
Alex_Skripa, не знаю на счет ошибок выдаваемых кмпилятором, лень компилить Ваш код, но вот на счет логики, сразу бросились в глаза строки 113, 139, 165: оператор break должен быть перед '}' а не после неё
Спасибо сейчас проверю) но ведь сортировка по полю stat нормально проходит...
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
02.12.2013, 23:23     Упорядочить элементы структуры #12
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
но ведь сортировка по полю stat нормально проходит...
Очень странно! Должна нормально проходить по полю weight, а для других после первого же break вылетать и просто до них недоходить...

Добавлено через 4 минуты
А вообще громоздко написано. Если правильно использовать указатели, то всё может выглядеть примерно так:

C++
1
2
3
4
5
6
7
8
9
10
Man** Sort(Man **people, int n, int z, int priz)
{...
Man *buff;
...
buff=people[i];
people[i]=people[k];
people[k]=buf;
...
 
}
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 23:31  [ТС]     Упорядочить элементы структуры #13
Цитата Сообщение от Algoritmer Посмотреть сообщение
Очень странно! Должна нормально проходить по полю weight, а для других после первого же break вылетать и просто до них недоходить...
Да я согласен что очень странно, исправил то что Вы посоветовали, проблему конечно не решило но все равно спасибо... И да после case не нужно походу ставить {} попробывал и без них и с ними работает нормально(ну так сказать на switch не ругается)

Добавлено через 5 минут
Цитата Сообщение от Algoritmer Посмотреть сообщение
Очень странно! Должна нормально проходить по полю weight, а для других после первого же break вылетать и просто до них недоходить...

Добавлено через 4 минуты
А вообще громоздко написано. Если правильно использовать указатели, то всё может выглядеть примерно так:

C++
1
2
3
4
5
6
7
8
9
10
Man** Sort(Man **people, int n, int z, int priz)
{...
Man *buff;
...
buff=people[i];
people[i]=people[k];
people[k]=buf;
...
 
}
А почему ** а не * массив же одномерный? и при использование buff в таком случае разве не будет просить индекс?
а так я пробовал
C++
1
Man* Sort(Man *people, int n, int z, int priz)
ну и тд как вы предложили, это была моя первая идея) и она не работала, вообще не понимаю почему приходится присваивать поля структуры отдельно если это одна переменная...(как я и делаю в моём коде, так как
C++
1
2
3
buff=people[i];
people[i]=people[k];
people[k]=buf;
не прошло )
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
02.12.2013, 23:35     Упорядочить элементы структуры #14
нельзя присвоить buff=people[i] если buff статическая, а вот если динамическая, то можно, т.к. происходит присвоение адреса и не нужно переписывать все поля (поэтому и **) ** - это не обзательно двумерный массив. В данном случае имелся ввиду одномерный массив указателей на структуры
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 23:43  [ТС]     Упорядочить элементы структуры #15
Цитата Сообщение от Algoritmer Посмотреть сообщение
нельзя присвоить buff=people[i] если buff статическая, а вот если динамическая, то можно, т.к. происходит присвоение адреса и не нужно переписывать все поля (поэтому и **) ** - это не обзательно двумерный массив. В данном случае имелся ввиду одномерный массив указателей на структуры
Спасибо.
Как в данном случае будет выглядеть условие? точно так-же? ну на проверку по определенному полю...
Буду тестить может поможет, хотя конечно я так и не могу понять в чем прикол этой не правильной сортировки ведь если сортировка проходит по одному полю то чем отличается сортировка по другому полю, ведь даже тип полей например stat и weight идентичны в структуре? Жду помощи...)
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
02.12.2013, 23:47     Упорядочить элементы структуры #16
Вот так будет гораздо элегантней:
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
Man** Sort(Man **people, int n, int z, int priz)
{
    int k;
    Man* buff;   
    switch (priz) //по умолчанию
    {
    case (0):
{
    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if (people[k]->weight > people[j]->weight)
                k=j;
        }
        buff=people[i];        
        people[i]=people[k];        
        people[k]=buff;
      
    }
break;
}
     case (1):
{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->stat > people[j]->stat)
                    k=j;
            }
        buff=people[i];        
            people[i]=people[k];        
            people[k]=buff;            
        }
        break;
}
    case (2):
{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->date < people[j]->date)
                    k=j;
            }
            buff=people[i];        
            people[i]=people[k];        
            people[k]=buff;     
            
        }            
      break;      
}
if (z==1)
{
   Man **pep2=new Man*[n];
   for(int i=0;i<n;i++) pep2[i]=people[n-i-1];
  delete []people;
  people=pep2;
}
return people;
}
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
02.12.2013, 23:54  [ТС]     Упорядочить элементы структуры #17
Цитата Сообщение от Algoritmer Посмотреть сообщение
Вот так будет гораздо элегантней:
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
Man** Sort(Man **people, int n, int z, int priz)
{
    int k;
    Man* buff;   
    switch (priz) //по умолчанию
    {
    case (0):
{
    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if (people[k]->weight > people[j]->weight)
                k=j;
        }
        buff=people[i];        
        people[i]=people[k];        
        people[k]=buff;
      
    }
break;
}
     case (1):
{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->stat > people[j]->stat)
                    k=j;
            }
        buff=people[i];        
            people[i]=people[k];        
            people[k]=buff;            
        }
        break;
}
    case (2):
{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->date < people[j]->date)
                    k=j;
            }
            buff=people[i];        
            people[i]=people[k];        
            people[k]=buff;     
            
        }            
      break;      
}
if (z==1)
{
   Man **pep2=new Man*[n];
   for(int i=0;i<n;i++) pep2[i]=people[n-i-1];
  delete []people;
  people=pep2;
}
return people;
}
Малость не допонял строки 59 и тд, и возвращаемое значение Man* а **people не даст ли это ошибку?
Algoritmer
 Аватар для Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 477
Записей в блоге: 1
03.12.2013, 00:06     Упорядочить элементы структуры #18
Но тогда придется скоректировать всё остальное
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
void Init(Man **people,int n)
{
    char gent,Mas_Char[30];
    for (int i=0;i<n;i++)
    {
        people[i]=new Man; 
        cin.sync();
        cout <<"\nВведите ФИО: ";
        cin.getline(Mas_Char,30);
        people[i]->fio=Mas_Char;
        cout <<"Введите год рождения: ";
        cin >>people[i]->date;
        cout <<"Введите рост человека: ";
        cin >>people[i]->stat;
        cout <<"Введите вес человека: ";
        cin >>people[i]->weight;
        cout <<"Введите пол человека ""м"" или ""ж"": ";
        label:cin >>gent;
        if ((gent=='м')||(gent=='ж'))
            people[i]->gen=gent;
        else 
        {
            cout <<"Введите ""м"" или ""ж"": ";
            goto label;
        }
    }
}
Во всех остальных местах просто при обращении к полям структуры меняем точки на стрелочки
Ну и конечно же изменения в ф-ции main()
C++
1
2
 Man** people = new Man*[n];
    Man* tmp;
Добавлено через 1 минуту
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
Малость не допонял строки 59 и тд, и возвращаемое значение Man* а **people не даст ли это ошибку?
даст. Читайте последнее сообщение

Добавлено через 9 минут
Не сразу понял вопрос ... Если речь идет о строке 59 в моем коде
C++
1
Man **pep2=new Man*[n];
, то ошибки никакой не будет. Ведь мы объявляем указатель на массив уазателей и создаем его
Alex_Skripa
17 / 17 / 1
Регистрация: 16.09.2013
Сообщений: 126
03.12.2013, 10:53  [ТС]     Упорядочить элементы структуры #19
Спасибо буду пробовать) Только завтра... На сегодня хватит так и голову сломать можно)...
Вопрос про компиляцию в Release закрыт, так как перенес в новый проект и скомпилировалось собако... А вот сортировка (кстати при количестве элементов из 3х шт, сортировка работает по всем полям и по убыванию и по возрастанию) так и не работает (работает только по полю stat) в чем проблема остаётся для меня загадкой)
Все заранее спасибо за Помощь!)

Добавлено через 9 часов 23 минуты
_up

Добавлено через 1 час 14 минут
Итак вот опробованы код:
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <iomanip>
#include <fstream>
 
using namespace std;
 
struct Man
{
    string fio;
    int date;
    double stat,weight;
    char gen;
};
 
void Init(Man **people,int n)
{
    char gent,Mas_Char[30];
    for (int i=0;i<n;i++)
    {
        cin.sync();
        cout <<"\nВведите ФИО: ";
        cin.getline(Mas_Char,30);
        people[i]->fio=Mas_Char;
        cout <<"Введите год рождения: ";
        cin >>people[i]->date;
        cout <<"Введите рост человека: ";
        cin >>people[i]->stat;
        cout <<"Введите вес человека: ";
        cin >>people[i]->weight;
        cout <<"Введите пол человека ""м"" или ""ж"": ";
        label:cin >>gent;
        if ((gent=='м')||(gent=='ж'))
            people[i]->gen=gent;
        else 
        {
            cout <<"Введите ""м"" или ""ж"": ";
            goto label;
        }
    }
}
 
void Print(Man **people,int n)
{
    fstream file;
    file.open("people.txt",ios::app);
    if (file)
    {   
        for (int i=0;i<n;i++)
        {
            file <<"\n"<<"ФИО человека      : "<<people[i]->fio<<"\n";
            file <<"Год рождения      : "<<people[i]->date<<"\n";
            file <<"Рост              : "<<people[i]->stat<<"\n";
            file <<"Вес               : "<<people[i]->weight<<"\n";
            file <<"Пол               : "<<people[i]->gen<<"\n";
        }
                
    }
    else cout <<"Файл не может быть открыт или создан!";
    file.close();
}
 
void Display(Man **people, int n)
{
    for(int i=0;i<n;i++)
        {
            cout <<"\nФИО человека      : "<<people[i]->fio<<"\n";
            cout <<"Год рождения      : "<<people[i]->date<<"\n";
            cout <<"Рост              : "<<people[i]->stat<<"\n";
            cout <<"Вес               : "<<people[i]->weight<<"\n";
            cout <<"Пол               : "<<people[i]->gen<<"\n";
        }
}
 
void Sort(Man **people, int n, int z, int priz)
{
    int k;
    Man* buff;
    switch (priz)
    {
    case (0):{
    for(int i=0;i<n-1;i++)
    {
        k=i;
        for(int j=i+1;j<n;j++)
        {
            if (people[k]->weight > people[j]->weight)
                k=j;
        }
        buff=people[i];
        people[i]=people[k];
        people[k]=buff;
    }
             break;}
    case (1):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->stat > people[j]->stat)
                    k=j;
            }
            buff=people[i];
            people[i]=people[k];
            people[k]=buff;
        }
             break;}
    case (2):{
        for(int i=0;i<n-1;i++)
        {
            k=i;
            for(int j=i+1;j<n;j++)
            {
                if (people[k]->date < people[j]->date)
                    k=j;
            }
            buff=people[i];
            people[i]=people[k];
            people[k]=buff;
        }            
             break;}
    }
    if (z==1)
    {
        Man** pep2=new Man*[n];
        for (int i=0;i<n;i++)
            pep2[i]=people[n-i-1];
        delete []people;
        people=pep2;
    }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int n,poss,poss1,i;
    cout <<"Введите количество человек: ";
    cin >>n;
    Man** people = new Man*[n];
    Man* tmp;
    Init(people,n);
    lab:system("cls");
    cout <<"\nВыберите:";
    cout <<"\n0---------->Вывод на экран";
    cout <<"\n1---------->Вывод в файл";
    cout <<"\n2---------->Сортировка";
    cout <<"\n3---------->Выход!";
    cout <<"\n---->";cin >>poss;
    switch (poss)
    {
    case (0):
        Display(people,n);
        system("pause");
        break;
    case (1):
        Print(people,n);
        break;
    case (2):{
        cout <<"\nВыберите метод сортировки:";
        cout <<"\n0---------->По возростанию";
        cout <<"\n1---------->По убыванию";
        cout <<"\n---->";cin >>poss;
        cout <<"\nВыберите метод сортировки:";
        cout <<"\n0---------->По Возрасту";
        cout <<"\n1---------->По Росту";
        cout <<"\n2---------->По Весу";
        cout <<"\n---->";cin >>poss1;
        Sort(people,n,poss,poss1);
        break;
             }
    case (3):
        exit(0);
        system("pause");
        break;
    }
    goto lab;
    return 0;
}
Стало элегантней согласен) Но вот только где -то тут есть косяк работы с указателями...
Компилятор дает ошибку сражу же на этой строке:
C++
1
people[i]->fio=Mas_Char;
Ошибка1:
Необработанное исключение в "0x00067246" в "Lab_Rab11_01.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde5".
указывает сюда:
_Elem *_Myptr()
{ // determine current pointer to buffer for mutable string
return (this->_BUF_SIZE <= this->_Myres ? this->_Bx._Ptr
: this->_Bx._Buf);
}
из библиотеки xstring
С этими ошибками было бы тоже хорошо разобраться...

Добавлено через 2 минуты
Законспектировал ввод ФИО думал там ошибка типов или что нить в этом роде:
Легче не стало :
Необработанное исключение в "0x55132258 (msvcp100d.dll)" в "Lab_Rab11_01.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcded".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 10:58     Упорядочить элементы структуры
Еще ссылки по теме:

Упорядочить элементы массива C++
Упорядочить элементы массива по убыванию C++
Упорядочить элементы в матрице C++

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

Или воспользуйтесь поиском по форуму:
newbie666
Заблокирован
03.12.2013, 10:58     Упорядочить элементы структуры #20
Цитата Сообщение от Alex_Skripa Посмотреть сообщение
0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde5".
эта ошибка говорит об обращение к не инициализированным данным, скорее всего у тебя указатель в лажу какую то указывает )))
Yandex
Объявления
03.12.2013, 10:58     Упорядочить элементы структуры
Ответ Создать тему
Опции темы

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