Kolejność umieszczenia osób na liście. Porządek nazwisk jest leksykograficzny

0

Witam. Mam zadanie:
Napisz funkcję PorownajTStudent() porównującą wartości dwóch zmiennych typu TStudent. Parametrami funkcji mają być dwa wskaźniki do zmiennych typu TStudent, zaś jej wartością liczba całkowita. Wynik funkcji ma nas informować o kolejności umieszczenia studentów na liście. Przyjmujemy, że porządek nazwisk na liście jest leksykograficzny. W przypadku identycznych nazwisk bierzemy pod uwagę imiona. Wynik funkcji ma być liczbą mniejszą od zera, jeśli pierwszy ze studentów powinien się znaleźć na liście alfabetycznej przed drugim, równy zero, jeśli imiona i nazwiska studentów są sobie równe lub większa od zera w przypadku, gdy pierwszy ze studentów powinien być umieszczony na liście po drugim studencie. Napisz program, który wykorzystując funkcję PorownajTStudent() dokona porównania dwóch zmiennych automatycznych oraz dwóch zmiennych dynamicznych. Potrzebne informacje wczytaj z klawiatury, zaś wynik działania obydwu porównań wydrukuj na ekranie.

I nie wiem jak zrobić to sortowanie.
Gdzieś coś widziałem o sortowaniu, ale to było sortowanie znaków w ciągu, a nie sortowanie ciągów np. w tablicy
Na razie mam coś takiego, czyli w sumie podstawy:

#include<iostream>
#include<conio.h>
using namespace std;
struct TStudent{
    string imie;
    string nazwisko;
};
int PorownajTStudent(TStudent *wska, TStudent *wskb){

}
void podaj_dane(TStudent *wsk, int ilu){
    for(int i=0; i<ilu;i++){
    cout<<wsk[i]<<"-a osoba: ";
    cout<<"Podaj imie: ";
    cin>>wsk[i]->imie;
    cout<<"Podaj nazwisko: ";
    cin>>wsk[i]->nazwisko;
}
}
int main(){
TStudent studenci[2];
podaj_dane(studenci, 2);
PorownajTStudent(studenci[0], studenci[1]);
getch();
return 0;
}
0

Coś takiego?

 int PorownajTStudent(TStudent *wska, TStudent *wskb) {
  auto compare = [](std::string& a, std::string& b)->int {
    return a < b? -1: 1;
  };
  int result = 0;
  if(wska->nazwisko != wskb->nazwisko) {
    result = compare(wska->nazwisko, wskb->nazwisko);
  }
  else if(wska->imie != wskb->imie) {
    result = compare(wska->imie, wskb->imie);
  }
  return result;
}
0

Słabe to zadanie, uczy Cię programowania niezgodnego z kanonami C++ (funkcja porównująca przyjmuje wskaźniki, nie ma semantyki operatora<).

Do samego porównania polecam std::tie:

int PorownajTStudent(TStudent const* l, TStudent const* r){
    auto lt = tie(l->imie, l->nazwisko);
    auto rt = tie(r->imie, r->nazwisko);

    if(lt < rt) return -1;
    else if(lt == rt) return 0;
    else return 1;
}

Przykład: http://melpon.org/wandbox/permlink/iPUvyZqwXTnc3flA

Sortowania jako takiego w zadaniu nie widzę, ale ogółem podczas porównania zamieniasz (std::swap) dwa elementy jeśli są w złym porządku (tj. funkcja zwróci 1)

0

kq a znasz jakiś prawdziwy dobry kurs c++? Bo nie raz ktoś mi mówił, że mam C wymieszane z c++, i ćwiczenia zgodne z kanonami c++ jak to określiłeś?
O tym

auto

nawet nigdzie nie czytałem, bo nikt w kursie nie wspominał. Jak szukałem zmiennych automatycznych to wyświetlało mi w google tablice. A skąd miałem wiedzieć że to się nazywa auto.

0

Nie znam żadnego godnego polecenia kursu, ale na pewno powinieneś szukać czegoś o C++11 lub wyżej - nowy standard języka bardzo dużo w nim zmienił, kod kiedyś niepoprawny/niewydajny (i odradzany w tutorialach) potrafi być teraz poprawny, lub na odwrót, stary styl pisania kodu jest niebezpieczny i należy go unikać.

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