[C++]zamiana miejscami dwa sąsiednie elementy


(Wert900707) #1

Program ma mieć funkcję realizującą sortowanie listy rosnąco wg dat urodzenia (od najstarszej do najmłodszej). Mam problem z funkcją składniową, która zamienia miejscami dwa sąsiednie elementy listy. Zamiana ma być wykonywana na wskaźnikach.

#include 


class osoba

{

	public:

		char nazwisko[20];

		long int dataur;

                osoba* nast;

		static int liczbaosob;


		osoba();



};


osoba *poczatek=NULL;

int osoba::liczbaosob=0;


osoba::osoba()

{   

	cout << "Podaj nazwisko: ";

	cin >> nazwisko;

	cout << "Odaj date urodzenia: ";

	cin >> dataur;

	nast = poczatek;

	poczatek = this;

        liczbaosob++;


};


void drukuj()

{

	osoba *wsk=poczatek;

        cout << endl;

	while (wsk !=NULL)

	{

		cout << wsk->nazwisko << " " << wsk->dataur << endl;

		wsk = wsk->nast; 

	};

	cout << "Liczba osob = " << osoba::liczbaosob << endl;

};


void sortuj()

{

     int i,j;

     long int tmp;

     long int tablica[20];


  for (i=0;i<=3; i++)

      for (j=0;j<=3; j++)

          if (tablica[j]>tablica[j+1])

             {

             tmp = tablica[j];

             tablica[j] = tablica[j+1];

             tablica[j+1] = tmp;

             }

  cout << "\n\n";    

};



int main()

{

	for (int i=1; i<=3; i++) new(osoba);


        drukuj();


 system("PAUSE");

 return EXIT_SUCCESS;

}

(Sawyer47) #2

Raczej nie ucieszy Cię moja opinia, że cały kod jest do wywalenia, zdecydowanie nie tak się pisze w C++.


(tomms) #3

Zgadza się, kod lekko mówiąc jest 'słaby', w skrócie:

  1. Łączysz dwie funkcjonalności w jednym - klasa osoba i od razu kontener.

Rozdziel to, klasa osoba niech przechowuje informacje o osobie i nic więcej.

  1. Masz skomplikowany konstruktor dla klasy osoba, co będzie gdy będziesz potrzebował

utworzyć obiekt tymczasowy klasy osoba? Niech konstruktor tylko zainicializuje obiekt - ustawi

nazwisko na pustą wartość i rok na jakiś określony.

  1. To sortowanie bąbelkowe można uprościć, zauwać że w każdym obiegu pętli największy bąbelek

leci na sam wierzch, więc w następnej iteracji można go już nie sprawdzać.

  1. Zdefiniuj sobie stałą '3' np 'const int dlugosc = 3' i później jej używaj zamiast bezpośrednio wartości

liczbowej.

  1. system("PAUSE") powinno być karalne - naucz się pracować z konsolą

Poniżej jak to mniej więcej robi się obecnie, zakładam że kontener listy nie był celem w zadaniu więc

użyłem standardowego.

#include 

#include 

#include 

#include 


struct osoba

{

	std::string nazwisko;

	int dataur;

};


typedef std::list my_list_t;


void drukuj(const my_list_t & ml)

{

my_list_t::const_iterator i;


	for(i=ml.begin() ; i != ml.end() ; ++i)

		std::cout << i->nazwisko << " " << i->dataur << std::endl;


	std::cout << "Liczba osob = " << ml.size() << std::endl;

}




bool sort_fun(const osoba & o1, const osoba & o2)

{

	return o1.dataur < o2.dataur;

}




void wczytaj(my_list_t & ml, size_t len)

{

osoba o;


	for(size_t i=0 ; i
	{

		std::cout << "Pozycja nr: " << (i+1) << std::endl;


		std::cout << " Nazwisko: ";

		std::cin >> o.nazwisko;


		std::cout << " Rok urodzenia: ";

		std::cin >> o.dataur;


		ml.insert(ml.end(), o);

	}

}



int main()

{

my_list_t my_list;

const size_t how_many = 3;


	wczytaj(my_list, how_many);

	my_list.sort(sort_fun);

	drukuj(my_list);

}