[C++Builder]Proste sortowanie liczb

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

[C++Builder]Proste sortowanie liczb

Post autor: zenzee » 05 maja 2009, 19:33

Witam.
Chciałem napisać prosty program,który posortuje mi liczby z tablicy od najmniejszej do
największej.
Czy taka metoda sortowania jest OK.
Wielkie dzięki za wszystkie uwagi. :smile:

Kod: Zaznacz cały

#include<iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------

void SzukajNajwiekszejLiczby();
void Sortuj();
int SortLicz = 0;
float NajwiekszLiczba = 0;
float Tab[10] = {0};//tablica float-ów
#pragma argsused
int main(int argc, char* argv[])
{
for(int DaneIn = 0;DaneIn<10;DaneIn++)//wprowadzanie danych do tablicy
{
cout<< "wprowadz (tylko) liczbe nr. "<< DaneIn+1<<"\n\n";
cin>>Tab[DaneIn];
}
SzukajNajwiekszejLiczby();//wywolanie funkcji do szukania najwiekszej liczby
for(int a1 = 0;a1<10;++a1) 
{
Sortuj();//wywolanie funkcji sortowania 10 liczb z tablicy
}
system("pause");
return 0;
}
//---------------------------------------------------------------------------

void SzukajNajwiekszejLiczby()
{
if(Tab[SortLicz]< Tab[SortLicz+1])swap(Tab[SortLicz+1],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+2])swap(Tab[SortLicz+2],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+3])swap(Tab[SortLicz+3],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+4])swap(Tab[SortLicz+4],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+5])swap(Tab[SortLicz+5],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+6])swap(Tab[SortLicz+6],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+7])swap(Tab[SortLicz+7],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+8])swap(Tab[SortLicz+8],Tab[SortLicz]);
if(Tab[SortLicz]< Tab[SortLicz+9])swap(Tab[SortLicz+9],Tab[SortLicz]);
NajwiekszLiczba = Tab[0];//NajwiekszLiczba = nawieksza liczba

printf("\n");
printf("Dane po posortowaniu");
printf("\n");
}
//--------------------------------------------------------------------
void Sortuj(void)
{

if(Tab[SortLicz]> Tab[SortLicz+1])swap(Tab[SortLicz+1],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+2])swap(Tab[SortLicz+2],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+3])swap(Tab[SortLicz+3],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+4])swap(Tab[SortLicz+4],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+5])swap(Tab[SortLicz+5],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+6])swap(Tab[SortLicz+6],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+7])swap(Tab[SortLicz+7],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+8])swap(Tab[SortLicz+8],Tab[SortLicz]);
if(Tab[SortLicz]> Tab[SortLicz+9])swap(Tab[SortLicz+9],Tab[SortLicz]);
printf("\n");
printf("%f\n",Tab[0]);
Tab[0] = NajwiekszLiczba+1;//dodajemy 1 do najwiekszej liczby


}
A wynik mam taki jak na obrazku.
Sortuje ,to może jest OK. :razz:
Załączniki
Screen.jpg

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 05 maja 2009, 20:11

Yyyyyyyyyy....
Po co tyle tych ifów... Użyłeś w ogóle jakiegoś algorytmu sortowania?
Mój profesor od informatyki zwykł mawiać, że jeżeli w kodzie są obok siebie co najmniej 3 if-y, to kod do kosza...
Look here (moje tematy): 4 różne algorytmy sortowania:
Sortowanie przez wybieranie i przez wstawianie
Sortowanie bąbelkowe
Sortowanie Shella

Wyjaśnienie działania tych 4 algorytmów znajdziesz chociażby na wikipedii, jak czegoś nie rozumiesz, to pytaj śmiało.

Po drugie, radziłbym Ci robić wcięcia w kodzie, komentowanie kodu i pisanie od czystego projektu a nie na jakichś szablonach konsolówki od C++ Buildera.
Na temat samego C++ Buildera się nie wypowiadam, bo na nim nie pracowałem, ale od siebie mogę Ci polecić MS Visual C++ 2008 Express Edition, za darmo ściągniesz ze strony Microsoftu a to świetne narzędzie i ma cudowny debugger. :)

Pozdrawiam.

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 05 maja 2009, 20:32

Jakto po co ify? To jest pętla o 10 przejściach, tylko taka... rozplątana :grin:
zenzee, skup się na tym, jak zrobić, by program działał dla danych o dowolnej długości (powiedzmy 10000 liczb;P ). Podpowiem, że rządki if'ów można zastąpić prostą pętlą.
Luminofor, napisz quicksorta albo chociaż kopcowanie (heapsorta) ;P Będzie na przyszłość kompletna baza sortów dla zainteresowanych tematem ;)

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 05 maja 2009, 21:31

MiW pisze:Luminofor, napisz quicksorta albo chociaż kopcowanie (heapsorta) ;P Będzie na przyszłość kompletna baza sortów dla zainteresowanych tematem
Zapomniałeś o shake/coctail sorcie i sortowaniu przez scalanie :P
Wszystko w swoim czasie :)

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 05 maja 2009, 21:31

Luminofor
Co ,nie podobają Ci się:takie piekne if-y :mrgreen:
Kod brzydki ,dużo do poprawienia,wiem.
Cel osiągnięty: posortowałem od najmniejszej liczby do najwiekszej.
MiW
Piekna rozpętlona petla,masz zupełną rację.
Komu będzie się chciało wpisywać z klawiatury 10000 liczb,wiesz ile to klikania. :grin:
Może taki "ładny"kod nie rozkodzi kompa. :lol:

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 05 maja 2009, 21:34

zenzee, tu nie chodzi o wklepywanie liczb z klawiatury. Robisz uniwersalną funkcję do sortowania n liczb - tak, aby można jej było użyć w innych programach, gdzie np. będzie pobierać tysiące próbek z pliku - też dasz 10000 if-ów? Chyba kumasz o co chodzi?

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 05 maja 2009, 21:52

No nie, wtedy te if-y to pomyłka straszna jest :smile:
Tutaj akurat chodzi o wklepywanie niewielkiej ilości liczb.
Dla wiekszej ilości liczb,no wybacz.....,napiszę to w petli , pokażę kod i będę czekał na
następne krytyczne uwagi. :smile:
Czy ten fajny kod posortował dobrze te liczby?.

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 05 maja 2009, 21:58

VC++ się buntuje przy kompilacji Twojego kodu także nie powiem Ci czy działa.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 05 maja 2009, 22:02

Tak,no popatrz a Builder cicho siedzi. :mrgreen:

[ Dodano: 2009-05-05, 23:07 ]
Uruchomiłem go poza Builder-em i o dziwo system nie padł jeszcze,żadnego echa. :smile:

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 05 maja 2009, 22:09

Używasz jakichś dziwnych plików nagłówkowych sprzed standardu i jakieś pragmy ...
Oj kolego... kupuj Symfonię C++ Standard i czytaj czytaj czytaj...

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 05 maja 2009, 22:24

Dziwnych. :?:
Sam korzystasz z iostream;

[ Dodano: 2009-05-05, 23:28 ]
A ten kod z mojego podpisu kompiluje się u Ciebie :grin: Jest OK :mrgreen:

[ Dodano: 2009-05-06, 14:34 ]
Mam ten program-piękny debugger :smile:
Zmieniłem tylko:

Kod: Zaznacz cały

<iostream.h>
//na
<iostream>
//,dodałem też
using namespace std;
// i bez pragmy oczywiście
Visual C++ nie burzy się wcale :mrgreen:

[ Dodano: 2009-05-06, 19:40 ]
No ta masz Luminofor bez tylu if-ów i Visual i 40 linijek:

Kod: Zaznacz cały

// Pierwszy.cpp : main project file.


#include<iostream>
void SzukajNajwiekszejLiczby();
void Sortuj();
int SortLicz = 0;
float NajwiekszLiczba = 0;
float Tab[10] = {0};//tablica float-ów

using namespace std;

int main(array<System::String ^> ^args)
{

 for(int DaneIn = 0;DaneIn<10;DaneIn++)//wprowadzanie danych do tablicy 
  { 
   cout<< "wprowadz (tylko) liczbe nr. "<< DaneIn+1<<"\n\n"; 
    cin>>Tab[DaneIn]; 
  } 

 SzukajNajwiekszejLiczby();//wywolanie funkcji do szukania najwiekszej liczby 
 
 for(int a1 = 0;a1<10;++a1) 
  {   
	  Sortuj();//wywolanie funkcji sortowania 10 liczb z tablicy 
     } 

system("pause"); 
return 0;
}
//--------------------------------------------------------------------------- 

void SzukajNajwiekszejLiczby() 
{ 
  for(int aa=0;aa<10;aa++)
 {
   if(Tab[SortLicz]< Tab[SortLicz+aa])swap(Tab[SortLicz+aa],Tab[SortLicz]);
   }

NajwiekszLiczba = Tab[0];//NajwiekszLiczba = nawieksza liczba 

  printf("\n"); 
  printf("Dane po posortowaniu\n"); 
 
} 
//-------------------------------------------------------------------- 
void Sortuj() 
{ 
 for(int aa=0;aa<10;aa++)
  {
  if(Tab[SortLicz]> Tab[SortLicz+aa])swap(Tab[SortLicz+aa],Tab[SortLicz]);
   }
printf("\n"); 
 printf("%f\n",Tab[0]); 
 Tab[0] = NajwiekszLiczba+1;//dodajemy 1 do najwiekszej liczby 
}

MiW chyba też zadowolony :mrgreen: :mrgreen:
Albo jeszcze lepiej tak:

Kod: Zaznacz cały

// Pierwszy.cpp : main project file.


#include<iostream>

void Sortuj();

float NajwiekszLiczba = 0;
float Tab[10] = {0};//tablica float-ów

using namespace std;

int main(array<System::String ^> ^args)
{

for(int DaneIn = 0;DaneIn<10;DaneIn++)//wprowadzanie danych do tablicy 
  { 
   cout<< "wprowadz (tylko) liczbe nr. "<< DaneIn+1<<"\n\n"; 
   cin>>Tab[DaneIn]; 
   if(cin.fail())
  {
return 0; //jesli wpisano litere to zakoncz
  
  }
} 

   Sortuj();//wywolanie funkcji sortowania 10 liczb z tablicy 
  printf("\nKoniec\n");     
system("pause"); 
return 0;
}
//--------------------------------------------------------------------------- 
void Sortuj()
{
for(int aa=0;aa<10;aa++)
 {
  if(Tab[0]< Tab[aa])swap(Tab[aa],Tab[0]);
   }

 NajwiekszLiczba = Tab[0];//NajwiekszLiczba = nawieksza liczba 

  printf("\n"); 
   printf("Dane po posortowaniu\n");  
 
 for(int a1 = 0;a1<10;++a1) 
  {   
	 for(int aa=0;aa<10;aa++)
  {
   if(Tab[0]> Tab[aa])swap(Tab[aa],Tab[0]);
   }

	 printf("\n"); 
      printf("%f\n",Tab[0]); 
   Tab[0] = NajwiekszLiczba+1;//dodajemy 1 do najwiekszej liczby
	  
	  
}

}


MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 08 maja 2009, 20:31

zenzee,

Kod: Zaznacz cały

NajwiekszLiczba = Tab[0];//NajwiekszLiczba = nawieksza liczba
używaj komentarzy, by rzeczywiście ułatwić rozumienie kodu :razz:
Program mógłby się wykonywać o połowę szybciej: po co sprawdzać w pętli (pierwsze) elementy tablicy, które są już posortowane?
Luminofor, ja "zleciłem" tylko ciekawsze i pożyteczne edukacyjnie sztuki... :razz: Masz rację, scalanie jeszcze by się przydało, bardzo dydaktyczny jest kod rekurencyjny. O sortowaniu turniejowym ze złożonością 3/2 słyszałeś :wink: ?

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 08 maja 2009, 20:47

MiW pisze:O sortowaniu turniejowym ze złożonością 3/2 słyszałeś
Niestety nie. :) Ale najlepszy jest heapsort/quicksort i czasami Shell :)


zenzee, nie kompilowałem Twojego kodu, ale kilka uwag:

- co masz w nawiasach w int main() ? i po co to?

- nie nazywaj zmiennych np. a1, aa!! tylko nazywaj je tak, żeby wiadomo było po co one są;

- wydaje mi się, że nie powinno się używać zmiennych globalnych, tylko lokalnych, wtedy w funkcjach deklarujesz tylko ci potrzebne zmienne, możesz zasłaniać ich nazwy itp.
Zobacz, w jaki sposób jest to u mnie zrealizowane. Oczywiście nie twierdzę, że masz źle, ale zaleca się unikania zmiennych globalnych bo potem zamieszanie z nimi jest;

- wiesz, jak działa funkcja swap? spróbuj zamienić dwie zmienne bez jej używania (hint: w moich source-codach nie używałem swapa a zamieniałem :) );

- printf() to funkcja z C, ja radziłbym Ci używania cout, cin i strumieni.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 08 maja 2009, 21:52

Witam ponownie.
To w main tam było:powinienem pisać na pustym projekcie.
Poprawie wszystkie nazwy zmiennych.
Czemu użyłem swap-a?
Czytałem Twój post o "bąbelkowaniu" i pomyślałem "o,podmianka
danych".
No nie będę kopiował pomysłu,a ,że dziwnym trafem swap jakoś zadziałał to
się ucieszyłem :mrgreen:,posortawałem,że hoho. :grin:
Chiałem jak najprosciej to napisać-proste zapisy:że sortuje już posortowane,no cóż bedę
pracował nad tym jeszcze trochę.
Co chwilę słyszę,żeby printf stosować:obie metody będę stosował :razz:
Ten kod już przystosowałem do odczytu liczb z pliku i też jak narazie działa.
Nie mam tam już żadnej zmiennej globalnej. :grin:
No bedę jeszcze nad tym pracował i techniką zapisów itd,itp.

ODPOWIEDZ