@romentigo

С++ — как отсортировать структуру?

Код почти готов, но не знаю как быть дальше. В структуре я указываю количество студентов, потом заполняю поля: Фамилия, Группа, Оценка1, Оценка2, Оценка3. Sr- средний бал за экзамены. Думал сначала сделать Sr как поле, чтобы потом можно было отсортировать структуру по среднему баллу в порядке спадания. Но что-то всё же не так сделал в структуре. Код прилагаю:
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
	setlocale(0, ".1251");
	struct student
	{
		char surname, gr;
		int ex1, ex2, ex3, sr;
	};
	int kol = 0;

	cout << "Введiть кiлькiсть студентiв: "; 
	cin >> kol;
	student *z = new student[kol];
	setlocale(0, ".1251");
	cout << "Введiть почергово рядки з вiдомостями про успiшнiсть " << kol
		<< " студентiв: \nПрiзвище \tГрупа \tОцiнка1 \tОцiнка2 \tОцінка3" << endl;

	for (int i = 0; i < kol; i++)
	{
		puts(z[i].surname, z[i].gr, &z[i].ex1, &z[i].ex2, &z[i].ex3, &z[i].sr);
	}

	int Count = 0;
	double sr; 
	for (int i = 0; i < kol; i++)
	{
		if (z[i].ex1 >= 60 && z[i].ex2 >= 60 && z[i].ex3 >= 60)
		{
			Count++;
			z[i].sr = (z[i].ex1 + z[i].ex2 + z[i].ex3) / 3.0;
			setlocale(0, ".OCP");
			printf("%s\t%s\t%i\t%i\t%i\t%i\n", z[i].surname, z[i].gr, z[i].ex1, z[i].ex2, z[i].ex3, z[i].sr);
		}
	}

	char* tempS, tempG;
	int temp1, temp2, temp3, tempSr;
	for (int i = 0; i < Count; i++)
	{
		for (int j = 0; j < Count - i; j++)
		{
			if (z[i].sr < z[i + 1].sr)
			{
				tempS = z[i].surname;
				z[i].surname = z[i + 1].surname;
				z[i + 1].surname = tempS;

				tempG = z[i].gr;
				z[i].gr = z[i + 1].gr;
				z[i + 1].gr = tempG;

				temp1 = z[i].ex1;
				z[i].ex1 = z[i + 1].ex1;
				z[i + 1].ex1 = temp1;

				temp2 = z[i].ex2;
				z[i].ex2 = z[i + 1].ex2;
				z[i + 1].ex2 = temp2;

				temp3 = z[i].ex3;
				z[i].ex3 = z[i + 1].ex3;
				z[i + 1].ex3 = temp3;

				tempSr = z[i].sr;
				z[i].sr = z[i + 1].sr;
				z[i + 1].sr = tempSr;
			}
		}
	}

	for (int i = 0; i < kol; i++)
	{
		if (z[i].ex1 >= 60 && z[i].ex2 >= 60 && z[i].ex3 >= 60)
		{
			z[i].sr = (z[i].ex1 + z[i].ex2 + z[i].ex3) / 3.0;
			setlocale(0, ".OCP");
			printf("%s\t%s\t%i\t%i\t%i\t%i\n", z[i].surname, z[i].gr, z[i].ex1, z[i].ex2, z[i].ex3, z[i].sr);
		}
	}

	system("pause");
	return 0;

}


UPD: Готовые функции и методы не подходят
  • Вопрос задан
  • 2172 просмотра
Решения вопроса 1
@pestunov
Не нужно переставлять все поля по одному
tempS = z[i].surname;
        z[i].surname = z[i + 1].surname;
        z[i + 1].surname = tempS;

        tempG = z[i].gr;
        z[i].gr = z[i + 1].gr;
        z[i + 1].gr = tempG;

        temp1 = z[i].ex1;
        z[i].ex1 = z[i + 1].ex1;
        z[i + 1].ex1 = temp1;

        temp2 = z[i].ex2;
        z[i].ex2 = z[i + 1].ex2;
        z[i + 1].ex2 = temp2;

        temp3 = z[i].ex3;
        z[i].ex3 = z[i + 1].ex3;
        z[i + 1].ex3 = temp3;

        tempSr = z[i].sr;
        z[i].sr = z[i + 1].sr;
        z[i + 1].sr = tempSr;


Достаточно написать

temp = z[i];
        z[i] = z[i + 1];
        z[i + 1] = temp;


В отличие от массива, структуры можно присваивать целиком, а не поэлементно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
https://en.cppreference.com/w/cpp/algorithm/sort
Вас интересует вот эта часть:
std::sort(s.begin(), s.end(), [](int a, int b) { return a > b; });
Ответ написан
@res2001
Developer, ex-admin
Реализуйте в структуре конструктор копирования и/или копирующий оператор присваивания, и сортируйте пузырьком (т.к. самая простая реализация соритровки). Можно еще реализовать несколько функций сравнения по разным атрибутам и передавать эти функции в пузырек (чтоб можно было делать сортировку по разным атрибутам с помощью одной функции сортировки).

По коду:
1.Вы начинаете писать на С++, а потом перескакиваете на Си (puts, printf) ...
2.В struct student поля surname и gr объявлены как char, а в коде вы их используете как си-строки - это абсолютно разные вещи.
3.Вы не правильно используете функцию puts. В таком виде у вас программа не соберется. Посмотрите документацию.

Возможно что-то еще ...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы