Zad. 3. Napisz program, który posortuje dane z zadania 2 najpierw według nazwisk studentów (leksykograficznie), a następnie według średniej ocen (malejąco). Wykorzystaj dostępne funkcje z biblioteki algorithm.
Rozwiązanie.
Do sortowania leksykograficznego posłużymy się funkcją porównującą strcmp zdefiniowaną w bibliotece cstring i opisaną tutaj. W przypadku gdy napotkamy takie same ciągi znaków sortujemy według następnego klucza - w tym zadaniu według średniej. Idąc tym tropem, możemy zdefiniować wiele poziomów sortowania.
#include<iostream>
#include<iomanip>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{ //stworzenie własnego typu o nazwie student
char nazwisko[25];
double srednia;
bool operator < (const student &x)const //zdefiniowanie zachowania się
{ //operatora < potrzebnego przy sortowaniu
int porownaj = strcmp(nazwisko,x.nazwisko);
if(porownaj==0) //gdy nazwiska są równe sortujemy według srednich
return srednia>x.srednia;
return porownaj>0?0:1;
}
};
int main()
{
//stworzenie studentów i przypisanie do nich przykładowych danych
student studenci[] = { //tablica będzie się składać z 14 studentów
{"Kowalski", 3.12},
{"Kasprowicz", 4.40},
{"Nowak", 6.00},
{"Kosak", 5.44},
{"Nasiadka", 5.32},
{"Nowicki", 3.44},
{"Kanigowski", 4.00},
{"Danusiak", 4.00},
{"Dworznik", 4.20},
{"Kaspro", 3.00},
{"Kasprowicz", 4.00},
{"Kasprowicz", 3.10},
{"Danusiak", 2.00},
{"Danusiak", 2.14}
};
cout<<"Dane studentów przed sortowaniem: "<<endl;
for(int i=0;i<14;i++)
cout<<"Nazwisko: "<<studenci[i].nazwisko
<<", srednia: "<<fixed<<setprecision(2)
<<studenci[i].srednia<<endl;
sort(studenci,studenci+14); //sortowanie studentów
cout<<endl;
cout<<"Dane studentów po sortowaniu: "<<endl;
for(int i=0;i<14;i++)
cout<<"Nazwisko: "<<studenci[i].nazwisko
<<", srednia: "<<fixed<<setprecision(2)
<<studenci[i].srednia<<endl;
return 0;
}
Out: