Programowanie i algorytmy

Sortowanie leksykograficzne

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<cstdlib>
#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;
  system("pause");
  return 0;
}
 

Out:

struktury