@Lisik

Как отсортировать элементы структуры?

Требуется с помощью структуры заполнить данные о 10 учениках (имя, группа, 5 оценок), и отсортировать их по увеличению среднего балла. Но сортировка ни в какую не дается, и элементы не меняются. В чем ошибка? Пузырьком делал - тоже не меняются.
#include <iostream>
#include <string>
#include <clocale>
#include <utility>
using namespace std;

struct Student { //Описание структуры студента
	string name;
	int group;
	int marks[5];
};

Student part() { //Описание отдельного студента
	Student pop;
	cout << "Имя студента: ";
	cin >> pop.name;
	cout << "Его группа: ";
	cin >> pop.group;
	cout << "Его оценки: ";
	for (int i = 0; i < 5; i++) {
		cin >> pop.marks[i];
	}
	cout << endl;
	return pop;
}

int main() {
	setlocale(LC_ALL, "rus");
	const int size = 10; // кол-во студентов
	Student records[size]; // Записи о студентах
	for (int i = 0; i < 10; i++) {
		records[i] = part();
	}
	// Подсчет суммы оценок каждого ученика
	double sumeach[100];
	for (int i = 0; i < 10; i++) {
		sumeach[i] = 0;
		for (int j = 0; j < 5; j++) {
			sumeach[i] += records[i].marks[j];
		}
	}

	// Подсчет среднего балла
	double miderate[100];
	for (int i = 0; i < 10; i++) {
		miderate[i] = sumeach[i] / 5;
		cout << miderate[i] << " " << records[i].name << endl;
	}
	system("pause");
	//сортировка учеников
	for (int j = 0; j < 10; j++) {
		for (int i = 0; i < 9; i++) {
			if (miderate[i] > miderate[i + 1]) {
				swap (records[i].name, records[i + 1].name);
				swap (records[i].group, records[i + 1].group);
				swap(records[i].marks, records[i + 1].marks);
			}
		}
	}

	//вывод учеников
	for (int i = 0; i < 10; i++) {
		cout << records[i].name << " " << records[i].group << " ";
		for (int j = 0; j < 5; j++) {
			cout << records[i].marks[j] << " ";
		}
		cout << endl;
	}
system("pause");
return 0;
}
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В чем ошибка?

if (miderate[i] > miderate[i + 1]) {
        swap (records[i].name, records[i + 1].name);
        swap (records[i].group, records[i + 1].group);
        swap(records[i].marks, records[i + 1].marks);
      }

В том что ты сравниваешь средние оценки, но не переставляешь их.

И к тому же, можно писать просто swap(records[i], records[i + 1]).
И к тому же, можно сортировать с помощью std::sort
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы