Jump to content

Seřazení čísel


ATomas

Recommended Posts

Zdravím,

Rozhodl jsem se udělat po dlouhé době Tutoriál. Nedávno jsem jednomu uživateli vysvětloval, jak seřadit čísla, vzestupně nebo sestupně na tom nesejde. Tím pádem jsem objevil mezeru v tutoriálech.

 

Když máme třeba 4 různá čísla: 2 9 6 1 není pro nás těžké je seřadit. Nato abychom mohli vymyslet systém, jak to zapsat pro pawno je potřeba si těch čísel napsat víc.

 

Příklad: 52,32,64,10,2,9,74,15,24,38,41,62

 

To už je dost čísel nato, abyste museli nad seřazením přemýšlet, a ne proste říct výsledek z hlavy.

Tak jak postupujete, když chcete tato čísla seřadit?

Prostě projedete prstem po všech číslech, a budete hledat to nejnižší, nějak takto:

52 ne nejnižší, další číslo 32 je nižší pamatuju 32 další číslo 64 není menší, jdu dál, další 10 je nejmenší pamatuju 10.

A tímto způsobem najdu nejmenší číslo. To potom škrtnu a cele to budu opakovat dokuje všechny neseřadíme, tedy čísel je v našem případě 12 takže dvanáctkrát to zopakujeme.

 

Díky tomuto, že jsme si to dokázali takto rozebrat už jsme schopni to zapsat do pawna, aby takovouto odpornou práci udělalo za nás J

 

Takže:

Máme čísla v nějaké proměnné například:

new cislo[12];

cislo[0] = 52;

cislo[1] = 32;

cislo[2] = 64;

.

.

.

cislo[11] = 62;

 

 

¨new cislo[12];//tady mame zapsana cisla ktere cheme seradit
new serazeno[12];//tuto promenou vyuzijeme pro ulozeni informaci o tom, v jakem poradi jsou cisla za sebou

new bool:id[12];//promena id nam slouzi jako skrtnuti, abychom stejne cislo ktere jsme uz zaradili, nezaradili znovu
for(new p;p<12;p++)//takze seradime 12 cisel, takze budeme serazovat dvanactkrat
{
   new maxim = 2147000000,idx;//pomoci maxim si budeme ukladat nejmensi nalezenou hodnotu a idx si budeme ukladat ktera to je. Umyslne jsou az v cyklu, aby se pri hledani dalsiho cisla v rade tyto promene zapomenuly a vytvorili znovu
   for(new i;i<12;i++)//je dvanact cisel, takze musime porovnat vsechny
   {
       if(cislo[i] < maxim && id[i] == false)//zde je podminka ze pokud je zrovna porovnavane cislo z tech 12cti mensi nez dosavadni nalezene nejmensi, a za && je podminka pokud uz cislo nebylo zarazeno
       {
           idx = i;//pokud jsou podminky splneny tak si ulozime poradove cislo nejmensi promene
           maxim = cislo[i];//a ulozime nejmensi hodnotu kdybychom nahodou nasli jeste nejake mensi cislo
       }
   }
   //zde je konec cyklu, uz jsme nasli nejmensi cislo v prislusne rade
   id[idx] = true;//nastavime ze jsme si cislo skrtli
   serazeno[p] = idx;//zde si serazujeme poradove cisla promene "cislo"
}
//zde uz mame vpromene "serazeno" poradove cisla promene "cislo" serazene od nejmensi po nejvetsi

//Abychom si overili, jak to vlastne vypada muzeme si to nechat otevrit do dialogu treba takto:
new string[512];
for(new o;o<12;i++) format(string,sizeof(string),"%s\ncislo[%d] = %d;",serazeno[o],cislo[serazeno[o]]);
ShowPlayerDialog(playerid,0,DDIALOG_STYLE_MSGBOX,"Seřazená čísla",string,"Zavřít","");

 

Pokud potřebujeme čísla rovnat od největšího po nejmenší, stačí obrátit znaménko nerovnosti a jako maximální hodnotu nastavit -.

 

K čemu je to dobré? Pomocí takového skriptu si můžete třeba udělat TOPY, i když tam seto dá ještě optimalizovat, ale to možná až příště.)

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

jenom jsem nasel malou chybicku ;)

for(new o;o<12;i++)

 

misto i tam ma bejt o ale to si kazdej clovek snad dokaze opravit... :)

Taky jsem si toho vsiml, akorat mi zmizelo tlacitko upravit, abych to opravil.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...