Sortowanie bąbelkowe

0

Witam mam problem musze dodac do programu sortowanie studentow wedlug nr indeksu
chcialem bąbelkowym ale mam pewne problemy jakby ktos umial mi to napisac(poprawic gdzie blad robie) bylbym wdzieczny

podaje kod programu

#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cctype>  
#include <fstream>
#include <conio.h>

using namespace std;
const int MAX = 100;
const int STUD = 300;
int licz_student=0;
char* Nazwa="lista.txt";


struct student {
       char nazwisko[MAX], 
       imie[MAX];
       char kierunek[MAX];
       int album;
       };
       student *tablica_st[STUD];

void Dodaj() 
{
    student *nowe_student;
    nowe_student=new student;
    cout<<"Podaj nazwisko: ";
    cin.getline(nowe_student->nazwisko,MAX);
    cout<<"Podaj imie: ";
    cin.getline(nowe_student->imie,MAX);
    cout<<"Podaj kierunek:";
    cin.getline(nowe_student->kierunek,MAX);
    int i,dlug=strlen(nowe_student->nazwisko);
    nowe_student->nazwisko[0]=toupper(nowe_student->nazwisko[0]);
    for (i=1;i<dlug;i++) nowe_student->nazwisko[i]=tolower(nowe_student->nazwisko[i]);
    nowe_student->imie[0]=toupper(nowe_student->imie[0]);
    dlug=strlen(nowe_student->imie);
    for (i=1;i<dlug;i++) nowe_student->imie[i]=tolower(nowe_student->imie[i]);
    cout<<"Podaj album: ";
    cin>>nowe_student->album;
    cin.get();
    tablica_st[licz_student] = nowe_student;
    licz_student++;
}
void Znajdz()
{
   
    char szukaj[MAX];
    if (licz_student==0){cout<<"Lista jest pusta"<<endl;} else {
    cout<<"Podaj szukane nazwisko ";
    cin>>szukaj;cin.get();
    int i, dlug=strlen(szukaj);
    szukaj[0]=toupper(szukaj[0]);
    cout<<setw(10)<<"Nazwisko"<<setw(10)<<"Imie"<<setw(10)<<"Kierunek"<<setw(10)<<"Album"<<endl;
    for (int i=0; i < licz_student; i++) {
    if (strcmp(tablica_st[i]->nazwisko,szukaj)==0){
    cout<<setw(10)<<tablica_st[i]->nazwisko<<setw(10)<<tablica_st[i]->imie<<setw(10)<<tablica_st[i]->kierunek<<setw(10)<<tablica_st[i]->album<<endl;} 
    else cout<<"Nie ma studenta"<<endl;  
        }     
    }  
}                      

// procedura sortujaca tablice 
void babel()
{

  for (int i=0; i<tablica_st.album; i++)
    {
      for (int j=0; j<tablica_st.album-1; j++)
	{
	  if (tablica_st.album[j]>tablica_st[j+1].album)
	    {
	      int tmp;
	      tmp = tablica_st.album[j];
	      tablica_st.album[j] = tablica_st.album[j+1];
	      tablica_st.album[j+1] = tmp;
	    }
	}// wypisywanie danych 
    for (int i=0;i<n;i++) 
    { 
        for (int j=0;j<n;j++)
        {
        cout << tablica_st.album[i][j]<< " "; 
        } 
        }
    }

}


void fnZapisz(char* Nazwa = "lista.txt") 
{

  if (licz_student == 0) 
  {
      cout << "Nie ma czego zapisac" << endl;
      return;
  }
  ofstream plik_zap(Nazwa);
  if (!plik_zap) 
  {
      cerr << "\n\aPliku " << Nazwa << " nie udalo sie otworzyc\n" << endl;
  } 
  else 
  {
      cout << "zapisuje do pliku:\n";
      for (int i = 0;i < licz_student;i++) {
      plik_zap << tablica_st[i]->nazwisko << "," << tablica_st[i]->imie
      << "," <<tablica_st[i]->kierunek<<","<< tablica_st[i]->album << endl;
      cout << tablica_st[i]->nazwisko << ' ' << tablica_st[i]->imie
      << ' ' <<tablica_st[i]->kierunek<<' '<< tablica_st[i]->album << endl;
      }
      plik_zap.close();
  }
}
void fnOdczyt(char *Nazwa = "lista.txt") 
{

  ifstream plik_odcz;
  plik_odcz.open(Nazwa);
  if (!plik_odcz) 
  {
    cerr << "\a\nBRAK PLIKU: " << Nazwa << endl;
  } 
  else 
  {
      cout << "Odczytuje z pliku:\n";
      cout << plik_odcz.rdbuf();

      plik_odcz.close();
  }
}



   
int main(int argc, char *argv[]) 
{
  char z;

  while (1) 
  {
      cout << "***************MENU******************" << endl;
      cout << "1 -  Dodaj studenta" << endl;
      cout << "2 -  Znajdz" << endl;
      cout << "3 -  Wyswietl wszystkie elementy" << endl;
      cout << "4 -  Sortowanie studentow" <<endl;
      cout << "5 -  Zapis do pliku" << endl;
      
      cout << "Q -  Wyjscie" << endl;
      z = getch();
      switch (z) 
      {
          case 'Q': return EXIT_SUCCESS;
          case 'q': return EXIT_SUCCESS;
          case '1': Dodaj(); break;
          case '2': Znajdz(); break;
          case '3': fnOdczyt(); break;
          case '4': babel(); break;
          case '5': fnZapisz(); break;
          
          
      }
  }

  system("PAUSE");
  return EXIT_SUCCESS;
}
0

moim zdaniem problem leży tutaj:

if (tablica_st.album[j]>tablica_st[j+1].album)
            {
              int tmp;
              tmp = tablica_st.album[j];
              tablica_st.album[j] = tablica_st.album[j+1];
              tablica_st.album[j+1] = tmp;
            }
 

troche źle masz indeksy w tablicach... i chyba sortujesz tylko numery indeksów... wiec nawet jak poprawilbys indeksy to w przypadku jak masz 3 studentów:

Kowalski     1234
Kowal         2345
Kowalewski 0523

to w wyniku pewnie dostaniesz:

Kowalski     0523
Kowal         1234
Kowalewski 2345

a nie zmienione pozycje...

moja propozycja...

// procedura sortujaca tablice
void babel()
{

  for (int i=0; i<tablica_st.album; i++)
    {
      for (int j=0; j<tablica_st.album-1; j++)
        {
          if (tablica_st.album[j]>tablica_st[i].album) // to zmienilem
            {
              student * tmp; // to zmienilem 
              tmp = tablica_st.album[i]; // to zmienilem 
              tablica_st.album[i] = tablica_st.album[j]; // to zmienilem
              tablica_st.album[j] = tmp; // i to zmienilem
// z tym ze nie wiem czy zadziala ze wskaznikiem 
// czy nie bedzie trzeba zrobic zwyklego student tmp
// i poprzypisywac kazda wartosc osobno
            }
        }// wypisywanie danych
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
        cout << tablica_st.album[i][j]<< " ";
        }
        }
    }

}

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