[ Trantor @ 05.01.2011. 21:43 ] @
Pozdrav,

U Matlab-u treba za seminarski da napišem funkciju koja će da sortira elemente vektora proizvoljne dužine od najvećeg ka njamanje. Ovo treba da se uradi bez ugrađivanja funkcija sort, max i min. Znači treba da se napiše programčić. Da li neko zna kako se ovo radi? Ubi se tražeći ali nigde ne mogu da nađem. Još mi je samo taj zadatak ostao.

Hvala
[ RMAN @ 05.01.2011. 23:00 ] @
Nisam dugo radio u matlab-u pa sam zaboravio sintaksu, ali to bi trebalo da je lagan posao.

Samo malo treba da mućneš glavom.
[ atomant @ 05.01.2011. 23:34 ] @
Evo ti nesto pisano za 2 minuta. Moze efikasnije, ali ti to neces primetiti jer ne radis sa veoma dugim nizovima.

Code:
function sortirani_niz=sortiranje(niz)
    M=length(niz); radi=1;
    while(radi)
        radi=0;
        for i=1:M-1
            if(niz(i)<niz(i+1))
                temp=niz(i);
                niz(i)=niz(i+1);
                niz(i+1)=temp;
                radi=1;
            end
        end
    end
    sortirani_niz=niz;
end



Nadam se da znas kako se radi sa funkcijama u MATLAB-u (kada cuvas fajl, funkcija mora da se zove ime_funkcije.m, tj. u ovom slucaju sortiranje.m)
Napravi neki vektor A i samo ga pokreni npr ovako: sortirani=sortiranje(A);

[Ovu poruku je menjao atomant dana 06.01.2011. u 00:46 GMT+1]
[ Trantor @ 06.01.2011. 00:49 ] @
Hm nije mi iz nekog razloga uspelo. Prekopirao sam ovaj tvoj kod i snimio ga kao što si ti reko kao sortiranje.m. Napravio vektor i evo kakav sam odziv dobio:

Code:

>> A=[1,7,3,5,9,11,8]

A =

     1     7     3     5     9    11     8

>> sortirani=sortiranje(A)
??? Attempt to execute SCRIPT sortiranje as a function:
C:\Users\Ivan\Desktop\sortiranje.m
[ atomant @ 06.01.2011. 01:08 ] @
Hm, zasto?


Evo ti fajl sortiranje.m

Sad samo pozovi funkciju i vidi da li radi.
[ Trantor @ 06.01.2011. 11:36 ] @
Opet ista stvar. Evo ti link za mali video koji sam snimio kako sam ja to uradio. Možda vidiš šta ja to radim pogrešno.

http://rapidshare.com/files/441085381/Matlab.AVI

Pozdrav
[ atomant @ 06.01.2011. 14:04 ] @
Ono sto ti pokusavas jeste da pokrenes funkciju iz .mat fajla a to nikako nije isto sto i .m fajl.

Skini ovaj m fajl koji sam ti poslao i otvori ga u editoru da vidis kako izgleda. Kao obican tekstualni fajl. Mat fajl je nesto drugo, to je binarni fajl u koji izvozis sadrzaje vektora, matrica itd iz MATLAB-ovog Workspace-a.

Druga vazna stvar je da funkcija mora da se nalazi u istom direktorijumu u kojem je ostatak programa koji je poziva. Posto u tvom slucaju ti funkciju pozivas iz komandnog prozora a ne iz nekog drugog m fajla, funkcija sortiranje.m mora da se nalazi u trenutno aktivnom direktorijumu (ono gore u centru matlabovog prozora Current Folder mora da pokazuje na direktorijum gde se funkcija nalazi).

Posto vidim da ti bas i ne ide, to sve moze da se odradi preko skripta, ali onda nije funkcija.


Code:
niz=[1,7,3,5,9,11,8];
M=length(niz); radi=1;
while(radi)
    radi=0;
    for i=1:M-1
        if(niz(i)<niz(i+1))
            temp=niz(i);
            niz(i)=niz(i+1);
            niz(i+1)=temp;
            radi=1;
        end
    end
end
display(niz);



Ovo mozes direktno da ubacis u Command Window i da dobijes izlaz, ali ako ti se trazi da napises funkciju to nije resenje. Resenje je ono sto sam ti gore napisao.
[ Trantor @ 06.01.2011. 16:55 ] @
E druže puno ti hvala!! Konačno sam uspeo da pokrenem ovu funkciju. Imao sam dve greške jedna je moja druga je tvoja :) Moja je što nisam snimio funkciju u radni direktorijum kao što si ti rekao. To nisam ni znao da treba. Tvoja greška je što funkciju nisi stavio u uglaste zagrade. Evo koda:

Code:

function sortirani_niz=sortiranje(niz) /* sortirani_niz mora u uglaste zagrade!! */
    M=length(niz); radi=1;
    while(radi)
        radi=0;
        for i=1:M-1
            if(niz(i)<niz(i+1))
                temp=niz(i);
                niz(i)=niz(i+1);
                niz(i+1)=temp;
                radi=1;
            end
        end
    end
    sortirani_niz=niz;
end


To sam slučeno našo guglajući po netu da treba da bude u uglastim zagradama. U svakom slučaju puno ti hvala to je definitivno ono što meni treba!!! E sad imam jednu malu molbu ako ti nije problem. Da li bi mogao da mi opišeš ovaj kod u par rečenica jer će profa sigurno da me pita koja je logika programa a ja baš nemam veze kako ovo radi. Samo znam da radi ono što treba :)))

Pozdrav
[ atomant @ 06.01.2011. 17:58 ] @
Ne mora kada funkcija vraca jedan argument, kada vraca vise to ide u uglastim :)
Meni radi i onako.
[ Trantor @ 07.01.2011. 15:22 ] @
OK nije ni važno. Važno je da radi :)
Nego dali bi mogo da mi opišeš ovaj program u par rečenica ako ti nije problem?
[ h4su @ 07.01.2011. 16:34 ] @
Citat:
Trantor: OK nije ni važno. Važno je da radi :)
Nego dali bi mogo da mi opišeš ovaj program u par rečenica ako ti nije problem?


Evo ukratko provjerava u parovima clanove niza, ako je i-ti manji od i+1 zamjeni im mjesta.Eto.Nece te ubiti da
analiziras malo kod naucis kako radi for,if, while.Ako sta nije jasno pitaj :D.


[ Trantor @ 07.01.2011. 20:36 ] @
h4su:

Ajd da probam :)

Code:

function sortirani_niz=sortiranje(niz)   /* Deklariše funkciju čiji je ulaz "sortiranje (niz)" a izlaz "sortirani_niz" */
    M=length(niz);      /* Predstavlja promenljivu koja sadrži podatak o broju elemenata vektora */
    radi=1;           /* Inicira kontrolnu varijablu "radi" na vrednost 1 i ona služi da prekine "while" kada broj poređenja dostigne "M-1" poređenja */
    while(radi)         /* Započinje petlja "while" i izvršava se sve dok je promeljiva "radi" jednaka 1 */
        radi=0;  /* Setuje kontrolnu varijablu "radi" na 0 kako bi onemogućili ponovno izvršavanje "while" petlje ako uslov iz "if petlje nije zadovoljen* /
        for i=1:M-1 /* Inkrementuje promeljivu "i" za jedan u svakom izvršavanju "for" petlje sve dok "i" ne postane "i = M-1" */
            if(niz(i)<niz(i+1)) /* Proverava da li je prethodni element niza (vektora) manji od narednog */
                temp=niz(i);   /* Ako je prethodni uslov ispunjen onda dedeljuje vrednost i-tog elementa niza promeljivoj "temp" */
                niz(i)=niz(i+1);  /* Dodeljuje i-tom elementu niza vrednost (i+1)-og elementa */
                niz(i+1)=temp;/* Dodeljuje vrednost promeljive "temp" (i+1)-om elementu i na taj način je izvršena rokada mesta ova dva elementa */
                radi=1;     /* Ponovo se dodeljuje vrednost jedan promeljivoj "radi" kako bismo ponovo mogli da uđemo u "while" petlju */
            end    /* Kraj "if" petlje */
        end        /* Kraj "for" petlje */
    end            /* Kraj "while" petlje */
    sortirani_niz=niz;  /* Dodeljuje izlazu funkcije "sortirani_niz" niz koji predstavlja sortirane elemente vektora */
end   /* Kraj funkcije */


Ako je ovo objašnjenje u redu onda extra :))) E sad pored toga ja imam dva pitanja:

1. Ovaj program upoređuje brojeve u parovima. Što znači: prvi i drugi, drugi i treći,... To je u redu on će lepo da sortira recimo prvi i drugi ali kako će on ova dva elementa da dovede u vezu za recimo sedmim i osmim ili petim i šestim jer koliko se meni čini ovo poređenje se vrši u parovima nezavisno od prethodnog ili sledećeg para. Da bi ovo radilo po mojoj logici program bi morao da ima mogućnost da se vraća unazad pa kad sortira neka dva para može da se vrati nazad i na osnovu tog rezultata ispravi prethodno sortiranje što mi ne deluje vrlo verovatno.

2. Ako sam ja u pravu promeljiva "radi" služi samo da prekine petlju "while" praktično joj kaže koliko puta treba se izvrši. Pošto program čim uđe u "while" petlju setuje "radi" na 0 logično je da bi se ova petlja posle toga ponovo izvršila potrebno je ponovo vratiti "radi" na 0. Što je u ovom programu i urađeno ali mi nije jasno mesto gde se ponovo promeljiva "radi" dovodi na 1. Valjda treba da se dodeli posle petlej "if" a ne u njoj jer koliko će puta da se izvrši petlja "while" ne zavisi od "if" uslova nego od "for" uslova. Sve dok je i=<M-1 "while" petlja treba se izvršava. Što znači da "radi=1;" treba da se nalazi u okviru "for" uslova a van "if" uslova.

Ovaj program definitivno radi ali eto ove dve stvari mi još nisu jasne pod uslovom da je moj opis gore tačan.

[Ovu poruku je menjao Trantor dana 07.01.2011. u 21:54 GMT+1]
[ atomant @ 07.01.2011. 21:34 ] @
while ciklus ce se izvrsavati dok je radi postavljen na 1.

Cim se udje u while radi se postavi na nulu, i ako se ne izvrsi nijedna zamena mesta radi ce ostati na 0 i program ce se zavrsiti. Ako se pak izvrsi razmena mesta neka 2 broja radi ce se postaviti na 1 i to ce znaciti da je nesto obavljeno u tom koraku i vrsice se jos jedan korak (sve dotle dok se nesto radi, tj dok niz nije sortiran). Ovo while mu sluzi da kad jednom izvrti for petlju ponovo krene da vrti for jos jednom. I da, u pravu si, porede se 2 po 2 elementa. Pusti ga da radi u debageru pa ces videti kako radi. Razmeni 2 elementa, pa nastavi dalje kroz niz, ako je potrebno razmeni jos 2 elementa, pa nastavi dalje. Kada stigne do kraja ponovo ulazi u for petlju i ponovo razmenjuje mesta elementima, u parovima, sve dok ne dotera do kraja kada se prekida. Da ne bih suvoparno objasnjavao evo kako radi po koracima

Imas pocetni niz (ti si ga zadao):

niz=[1,7,3,5,9,11,8];

u prvom prolazu on radi sledece:

niz=[7,1,3,5,9,11,8];
niz=[7,3,1,5,9,11,8];
niz=[7,3,5,1,9,11,8];
niz=[7,3,5,9,1,11,8];
niz=[7,3,5,9,11,1,8];
niz=[7,3,5,9,11,8,1];

U sledecem prolazu ce da uradi sledece (po koracima)

niz=[7,3,5,9,11,8,1]; (ovde ne menja mesta prva 2 clana, jer je 7>3)
niz=[7,5,3,9,11,8,1];
niz=[7,5,9,3,11,8,1];
niz=[7,5,9,11,3,8,1];
niz=[7,5,9,11,8,3,1];
niz=[7,5,9,11,8,3,1]; (ovde opet ne radi nista)


I tako sve dok ne dotera do kraja

niz=[11,9,8,7,5,3,1];

Nadam se da si razumeo :)
[ Trantor @ 07.01.2011. 22:56 ] @
OK znači ipak se vraća nazad da ponovo proverava niz kao što sam pretpostavio. Onda to ima logike. E sad ako si video opis ja sam baš tako i opisao "while" i "radi" nego mi je samo čudno da se "radi" postavlja na 1 i okviru "if" a ne u okviru "for" to je sve. A čemu to služi meni je jasno. Ali dobro ovo je sasvim dovoljno da ja mogu da opišem program.

Hvala još jedno!!!
[ atomant @ 08.01.2011. 15:44 ] @
Kada bi se radi postavljalo u okviru for petlje nikada ne bi ispao iz while petlje jer bi uvek bilo jednako jedinici, tj true. Dobio bi beskonacnu petlju.