-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2.3j.cpp
More file actions
143 lines (120 loc) · 4.21 KB
/
2.3j.cpp
File metadata and controls
143 lines (120 loc) · 4.21 KB
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <locale>
using namespace std;
// генерация случайного прироста 1..5
int randomDelta(mt19937& gen) {
uniform_int_distribution<int> dist(1, 5);
return dist(gen);
}
class Musician {
private:
string firstName;
string lastName;
string gender; // "М" / "Ж"
int birthYear;
string instrument; // "клавиши", "гитара", и т.п.
int rating; // суммарный рейтинг
public:
Musician() {
firstName = "";
lastName = "";
gender = "";
birthYear = 2000;
instrument = "";
rating = 0;
}
Musician(const string& fn, const string& ln,
const string& g, int by,
const string& inst, int r) {
firstName = fn;
lastName = ln;
gender = g;
birthYear = by;
instrument = inst;
rating = r;
}
// сеттеры
void setFirstName(const string& fn) { firstName = fn; }
void setLastName(const string& ln) { lastName = ln; }
void setGender(const string& g) { gender = g; }
void setBirthYear(int y) { birthYear = y; }
void setInstrument(const string& i) { instrument = i; }
// добавление к рейтингу
void addToRating(int delta) { rating += delta; }
int getRating() const { return rating; }
string getInstrument() const { return instrument; }
// клавишник?
bool isKeyboard() const {
// можно подстроить под свои названия
return instrument == "клавиши" ||
instrument == "клавишные" ||
instrument == "пианино" ||
instrument == "синтезатор";
}
void print() const {
cout << lastName << " " << firstName
<< " (" << instrument << "), рейтинг = "
<< rating << endl;
}
};
// сортировка: сначала клавишники, потом остальные;
// внутри каждой группы — по рейтингу по убыванию
void sortMusicians(Musician* arr[], int n) {
sort(arr, arr + n, [](Musician* a, Musician* b) {
bool ak = a->isKeyboard();
bool bk = b->isKeyboard();
if (ak != bk) // один клавишник, другой нет
return ak > bk; // клавишник идёт раньше
return a->getRating() > b->getRating(); // по рейтингу
});
}
int main() {
setlocale(LC_ALL, "Russian");
// 3 музыканта в стеке
Musician m1, m2, m3;
m1.setFirstName("Илья");
m1.setLastName("Северов");
m1.setGender("М");
m1.setBirthYear(2005);
m1.setInstrument("клавиши"); // клавишник
m2.setFirstName("Мишель");
m2.setLastName("Назаренко");
m2.setGender("Ж");
m2.setBirthYear(2006);
m2.setInstrument("гитара");
m3.setFirstName("Артем");
m3.setLastName("Петров");
m3.setGender("М");
m3.setBirthYear(2005);
m3.setInstrument("ударные");
// 1 музыкант в куче
Musician* m4 = new Musician(
"Юлия", "Авросева", "Ж", 2006,
"клавишные", // тоже клавишник
0 // начальный рейтинг
);
// генерация случайных голосов
random_device rd;
mt19937 gen(rd());
// имитация 3 концертов
for (int concert = 1; concert <= 3; ++concert) {
cout << "Концерт " << concert << endl;
m1.addToRating(randomDelta(gen));
m2.addToRating(randomDelta(gen));
m3.addToRating(randomDelta(gen));
m4->addToRating(randomDelta(gen));
}
// массив указателей для сортировки
Musician* arr[4] = { &m1, &m2, &m3, m4 };
sortMusicians(arr, 4);
cout << "\nМузыканты по убыванию рейтинга "
"(клавишники впереди):\n";
for (int i = 0; i < 4; ++i)
arr[i]->print();
delete m4;
return 0;
}