[C++] Sortowanie struktury, wg liczb

0

Hej,
mam za zadanie wykonanie ćwiczenia:
Stwórz strukturę uczeń(imię, nazwisko, indeks i ocena), mam podać ilość uczniów i uzupełnić dane, następnie dane maja być posortowane od najwyższej do najniższej oceny, tu pojawia się problem. Starałem się robić to przez bąbelkowanie, ale nie działa tak jak należny, sortuje liczby, ale zawsze ostatnia to jakiś kosmos(ponad 40 000) i na dodatek nie wyświetla reszty wyników w posortowanej kolejność, proszę o pomoc, zamieszczam fragment kodu odpowiadający sortowaniu i wypisywaniu.

Struktura:

struct Student
{
    
    string Imie;
    string Nazwisko;
    int Nr_indeksu;
    int Ocena;
};

Sortowanie:

    for(short licz = 0; licz < x; licz++) 
    {
         if(Numer[licz].Ocena<Numer[licz+1].Ocena)
          {
          int t=Numer[licz].Ocena;
          Numer[licz].Ocena=Numer[licz+1].Ocena;
          Numer[licz+1].Ocena=t;
          }
        cout<<licz + 1<<"\t"<<Numer[licz].Imie<<"\t"<< Numer[licz].Nazwisko<<"\t\t"<<
        Numer[licz].Nr_indeksu<<"\t\t"<<Numer[licz].Ocena<<"\t"<< endl;
  }

Pozdrawiam, proszę o pomoc.

0

na początek:

  1. sortowanie bąbelkowe wymaga dwóch pętli;p
  2. zamieniasz miejscami oceny, a powinieneś zamieniać struktury
0

Może mógłbyś powiedzieć jak mniej więcej ma to wyglądać, wiem, że zamieniam miejscami tylko oceny, ale nie wiem jak zamienić miejscem całe struktury.

0

tak na szybko:

for(short licz = 0; licz < x - 1; licz++)
{
short a = licz;
while(Numer[a].Ocena<Numer[a+1].Ocena && a >= 0)
{
struct Student t=Numer[a];
Numer[a] =Numer[a+1];
Numer[a+1].Ocena=t;
a--;
}
}

0
klajter napisał(a)

for(short licz = 0; licz < x - 1; licz++)
{
short a = licz;
while(Numer[a].Ocena<Numer[a+1].Ocena && a >= 0)
{
struct Student t=Numer[a];
Numer[a] =Numer[a+1];
Numer[a+1].Ocena=t;
a--;
}
}

Niestety, próba skompilowania kończy się błędem, fajnie by było mieć ten program bo zaliczenie zawsze się przydaje:P

0

Kończy się błędem bo jest tam mały błąd... Bezmyślne kopiowanie nigdy nie wychodzi na dobre...

0

Petla wygląda teraz tak:

 for( short licz = 0; licz<x; licz++ ) 
         {
          short a=licz;
          while(Numer[a].Ocena<Numer[a+1].Ocena)
           {
            Student t=Numer[a];
            Numer[a]=Numer[a+1];
            Numer[a+1]= t;
           }
         cout<<a+ 1<<"\t"<<Numer[a].Imie<<"\t"<< Numer[licz].Nazwisko<<"\t\t"<<Numer[a].Nr_indeksu<<"\t\t"<<Numer[a].Ocena<<"\t"        << endl;
       }

Lecz nie działa jeszcze tak jak trzeba, zamienia kilka wyników miejscami, ale nie wszystkie.

0

więc przeanalizuj kod i sprawdź czego brakuje ;]

0

Prawdopodobnie pętli, ale gdzie?

0

liczba pętli jest wystarczająca, ale czegoś brakuje, że któraś z nich nie działa tak jak powinna, dowiedz się, która nie działa i co zrobić żeby działało

0

A możecie chociaż powiedzieć czego brakuje, lub na co powinienem zwrócić uwagę?

0

A nie słyszałeś o czymś takim jak std::sort?
Po cholerę chcesz na nowo wynaleźć kolo?

Pozdrawiam serdecznie

0

Niestety, nie słyszałem, a na dodatek mam sam stworzyć taka funkcję, która posortuje struktury.

Wracając do programu, wpisuje kolejno liczby 5,3,2,6,1 a w wyniku posortowania otrzymuję: 3, 2, 5, 1, 6. Nie bardzo wiem co się w tej pętli dzieje:P

0

Nauczyc sie? Czego? Bubble sort to jeden z gorszych algoritmow sortujacych. Po co uczyc sie O(n^2) jak mozna O(nlog(n))? Nie rozumiem.

Pozdrawiam serdecznie

0

Choćby po to, żeby nauczyć się implementować algorytmy. Po to, że jak sobie później coś wymyśli to będzie w stanie to zakodzić. Po to, że lepiej jest zacząć od czegoś prostszego i stopniowo zwiększać poziom trudności.

0

A może ktoś wróci do temat i nakieruje mnie na dobre rozwiązanie?

0

Wypisuj sobie zmienne przy każdym 'obrocie' pętli i zobacz co tam się kręci

0

Temat do zamknięcia.
Dzięki za pomoc.

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