Всем привет!
Тренируюсь. Программа принимает данные (имя, номер группы, оценка) о указанном числе студентов. Затем производится сортировка по номеру группы. <- Это получилось | Это не получилось, нужно сделать -> И в каждой из групп нужно выполнить сортировку экземпляров в векторе по полю оценка. Если сделать просто сортировку, он отсортирует по оценке, но группы перемешаются. Возможно, нужно задать оператор в функторе и его вызвать в предикате оператора sort.
Mail.Ответы удаляет у меня, что написано в треугольных скобках.
#include //Ввод вывод на консоль
#include //Работа с векторами
#include //Работа с итераторами
#include //Для случайности
#include //Для возможности использования системного времени
#include //Для работы с generate
#include //Для работы с accumulate
#include //Для работы со строками
using namespace std;
struct Student
{
string name;
int group;
int mark;
};
struct SvectIn_class
{
Student operator() ()
{
Student ob;
cout << "Введите имя студента ";
cin >> ob.name;
cout << "Введите группу ";
cin >> ob.group;
cout << "Введите оценку ";
cin >> ob.mark;
return ob;
}
} SvectIn;
struct Sort_class
{
bool operator() (Student s1, Student s2)
{
return s1.group < s2.group;
}
} Sortt;
struct Sort_class2
{
bool operator() (Student s1, Student s2)
{
bool k = false;
if (s1.group == s2.group)
{
k = s1.mark < s2.mark;
}
else
k = true;
return k;
}
} Sortt2;
struct Print_class
{
void operator() (Student ss)
{
cout << "Имя " << ss.name;
cout << " Группа " << ss.group;
cout << " Оценка " << ss.mark;
cout << endl;
}
} Print;
void main()
{
setlocale(LC_ALL, "rus");
srand(time(0));
int n;
cout << "Введите число студентов ";
cin >> n;
vector S(n);
generate(S.begin(), S.end(), SvectIn);
sort(S.begin(), S.end(), Sortt);
sort(S.begin(), S.end(), Sortt2);
for_each(S.begin(), S.end(), Print);
/*sort(vecObjects.begin(), vecObjects.end(), sort_objectX);
cout << endl;
copy(vecObjects.begin(), vecObjects.end(), ostream_iterator(cout, " "));*/
cin.get(); cin.get();
}
Всем спасибо за ответы!
Другие языки программирования и технологии
C++ Сортировка в сортировке вектора экземпляров структуры
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct student {
student() : group(0), mark(0), name("") {}
int group;
int mark;
string name;
friend bool operator<(const student& a, const student& b) {
auto flag = false;
if (a.group < b.group) flag = true;
else if (a.group == b.group && a.mark < b.mark) flag = true;
else if (a.mark == b.mark && a.name < b.name) flag = true;
return flag;
}
friend ostream& operator<<(ostream& out, const student& s) {
out << s.group << ' ' << s.name << ' ' << s.mark;
return out;
}
friend istream& operator>>(istream& in, student& s) {
cout << "name: ";
getline(in, s.name);
cout << "group: ";
in >> s.group;
cout << "mark: ";
in >> s.mark;
in.ignore(numeric_limits<streamsize>::max(), '\n');
return in;
}
};
class students {
public:
void fill(const size_t size) {
for (auto i = 0u; i != size; ++i) {
student tmp;
cin >> tmp;
journal_.push_back(tmp);
cout.put('\n');
}
}
void show()const {
for (const auto entry : journal_) cout << entry << '\n';
}
void my_sort() {
sort(journal_.begin(), journal_.end());
}
private:
vector<student> journal_;
};
int main() {
cout << "quantity: ";
size_t quantity;
cin >> quantity;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
students journal;
journal.fill(quantity);
journal.show();
cout.put('\n');
journal.my_sort();
journal.show();
system("pause");
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct student {
student() : group(0), mark(0), name("") {}
int group;
int mark;
string name;
friend bool operator<(const student& a, const student& b) {
auto flag = false;
if (a.group < b.group) flag = true;
else if (a.group == b.group && a.mark < b.mark) flag = true;
else if (a.mark == b.mark && a.name < b.name) flag = true;
return flag;
}
friend ostream& operator<<(ostream& out, const student& s) {
out << s.group << ' ' << s.name << ' ' << s.mark;
return out;
}
friend istream& operator>>(istream& in, student& s) {
cout << "name: ";
getline(in, s.name);
cout << "group: ";
in >> s.group;
cout << "mark: ";
in >> s.mark;
in.ignore(numeric_limits<streamsize>::max(), '\n');
return in;
}
};
class students {
public:
void fill(const size_t size) {
for (auto i = 0u; i != size; ++i) {
student tmp;
cin >> tmp;
journal_.push_back(tmp);
cout.put('\n');
}
}
void show()const {
for (const auto entry : journal_) cout << entry << '\n';
}
void my_sort() {
sort(journal_.begin(), journal_.end());
}
private:
vector<student> journal_;
};
int main() {
cout << "quantity: ";
size_t quantity;
cin >> quantity;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
students journal;
journal.fill(quantity);
journal.show();
cout.put('\n');
journal.my_sort();
journal.show();
system("pause");
}
Да. Нужно свой предикат с оператором <
Причем, в приоритете группа, потом оценка.
Причем, в приоритете группа, потом оценка.
ваше как то так то.
Выбери диапазон сортировки и передай соответствующие итераторы в std::sort. Сложного ничего нет. По первому критерию сортировать просто. Второй должен учитывать, что первый у группы одинаковый. Третий - первый и второй одинаковы и т. д.
Похожие вопросы
- Сортировка вектора обьектов класса по 1 из аттрибутов.
- c#. Сортировка массива в отдельном методе. Консольное приложение.
- Изучил несколько простых алгоритмов сортировки, осталось изучить быструю и слияние, нужно ли вообще писать эти алгоритмы
- Сортировки, язык Си.
- Сортировка простыми вставками.
- Проблема с алгоритмом быстрой сортировкой С++
- Поправить сортировку по алфавиту c++
- Как написать макрос для Word 2003 чтобы выполнял сортировку чисел в квадратных скобках?
- Сортировка вставками и сортировка слиянием!
- Сортировка
struct Sort_class
{
bool operator() (Student s1, Student s2)
{
//Сюда
return s1.group < s2.group;
}
} Sortt;