Sortowanie wg zadania

0

Witam potrzebuję pomocy w zadaniu , nie mogę poradzić sobie z sortowanie piosenek , treść w zadaniu.

#include <iostream>

/*
Napisać program Piosenki, który wczytuje informacji o utworach muzycznych.
Dla każdego utworu mamy przechowywać informacje o: nazwie, czasie trwania w sekundach,
wykonawcy(imię, nazwisko, data urodzenia), roku wydania.
Do przechowywania napisów można korzystać z klasy std::string.
Aplikacja ma wypisać utwory o: czasie trwania większym niż oraz wykonywanym przez wykonawcę urodzonego wcześniej niż.
Długość trwania utworu i data urodzenia są podawane przez użytkownika.
Założyć, że:
-dane wejściowe są poprawne,
-nazwa utworu i nazwa wykonawcy są to napisy bez białych znaków.
Przykład:
Dane wejściowe :
3
Utwór1 1230 Imię1 mazwisko1 12 01 1932	1958
Utwór2 2500 Imię2 nazwisko2 2 07 1948 1979
Utwór3 4010 imię3 nazwisko2 30 11 2000 2020
1500
3 08 1960
Wynik:
Utwór2 2500 Imię2 nazwisko2 2 07 1948 1979
*/
int const maxPiosenek = 20;

struct Data
{
	int rok;
	int miesiac;
	int dzien;
};

struct Wykonawca
{
	std::string imie;
	std::string nazwisko;
	struct Data data_urodzenia;
};

struct Piosenka
{
	std::string tytul;
	struct Wykonawca wykonawca;
	int rok_wydania;
	int czas_trwania;
};

struct Piosenki
{
	struct Piosenka piosenki[maxPiosenek];
	int liczba_piosenek;
};

bool wczytajPiosenke(struct Piosenka* piosenka);
bool wczytajWykonawce(struct Wykonawca* wykonawca);
bool wczytajDate(struct Data* data);
bool wczytajPiosenki(struct Piosenki* piosenki);

void wyswietlPiosenke(struct Piosenka* piosenka);
void wyswietlWykonawce(struct Wykonawca* wykonawca);
void wyswietlDate(struct Data* data);
void wyswietlPiosenki(struct Piosenki* piosenki, int min_dlugosc, struct Data* data);


/*
* Funkcja porównuje dwie daty.
* Wynik:
*	-1	data1 < data2
*	0	data1 == data2
*	1	data1 > data2
*/
int porownaj(Data* data1, Data* data2);


bool wczytajPiosenki(struct Piosenki* piosenki)
{
	int liczba_piosenek;
	std::cin >> liczba_piosenek;

	for (int i = 0; i < liczba_piosenek; ++i)
	{
		if (!wczytajPiosenke(&(piosenki->piosenki[i])))
			return false;
	}
	piosenki->liczba_piosenek = liczba_piosenek;
	return true;
}

bool wczytajPiosenke(struct Piosenka* piosenka)
{
	std::cin >> piosenka->tytul;
	std::cin >> piosenka->czas_trwania;
	if (!wczytajWykonawce(&(piosenka->wykonawca)))
		return false;
	std::cin >> piosenka->rok_wydania;
	return true;
}

bool wczytajWykonawce(struct Wykonawca* wykonawca)
{
	std::cin >> wykonawca->imie;
	std::cin >> wykonawca->nazwisko;
	if (!wczytajDate(&(wykonawca->data_urodzenia)))
		return false;
	return true;
}

bool wczytajDate(struct Data* data)
{
	std::cin >> data->dzien;
	std::cin >> data->miesiac;
	std::cin >> data->rok;
	return true;
}

void wyswietlPiosenke(struct Piosenka* piosenka)
{
	std::cout << piosenka->tytul;
	std::cout << " ";
	std::cout << piosenka->czas_trwania;
	std::cout << " ";
	wyswietlWykonawce(&(piosenka->wykonawca));
	std::cout << " ";
	std::cout << piosenka->rok_wydania;
}

void wyswietlWykonawce(struct Wykonawca* wykonawca)
{
	std::cout << wykonawca->imie;
	std::cout << " ";
	std::cout << wykonawca->nazwisko;
	std::cout << " ";
	wyswietlDate(&(wykonawca->data_urodzenia));
}

void wyswietlDate(struct Data* data)
{
	std::cout << data->dzien;
	std::cout << " ";
	std::cout << data->miesiac;
	std::cout << " ";
	std::cout << data->rok;
}

void wyswietlPiosenki(struct Piosenki* piosenki, int min_dlugosc, struct Data* data)
{
	for (int i = 0; i < piosenki->liczba_piosenek; ++i)
	{
		//TODO wyświetlić tylko tpiosenki spełniające kryterium z treści zadania
		wyswietlPiosenke(&(piosenki->piosenki[i]));
		std::cout << "\n";
	}
}


int main()
{
	struct Piosenki piosenki;
	if (!wczytajPiosenki(&piosenki))
	{
		std::cout << "Bład\n";
		return 0;
	}

	//TODO posortowaś piosenki według wykonawcy (data urodzenia, nazwisko, imię)

	struct Data data;
	int dlugosc_utworu;

	std::cin >> dlugosc_utworu;
	wczytajDate(&data);

	wyswietlPiosenki(&piosenki, dlugosc_utworu, &data);
	return 0;

}

Na samym dole jest co trzeba zrobić jako ToDo

0

Jak piszesz w C++20, to tworzysz/przeładowujesz operator <=> dla swojej klasy, a jak w starszym standardzie, to tylko <= wystarczy (AFAIR), i std::sort. Ew. możesz użyć std::sort i funkcji porównującej, jeśli nie chcesz tworzyć porządku dla klasy.

0

@Althorion: mniej więcej wiem jak to ma wyglądać , natomiast mam problem z implementacją

0

Najpierw może zaimplementuj porównanie w structcie Data, coś na modłę:

friend bool operator<(const Data& l, const Data& r) {
    return std::tie(l.rok, l.miesiac, l.dzien) < std::tie(r.rok, r.miesiac, r.dzien);
}

A potem analogicznie dla samego Wykonawca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1