Osnove programiranja Funkcije - Metode
Prenos parametara Po vrednosti Po referenci Po izlazu Sadržaj Opseg važenja promenljive u drugim strukturama Rekurzije
Prenos parametara Metoda može vratiti isključivo jednu vrednost uz pomoć return operatora. Za više od jedne vrednosti koriste se mehanizmi za prenos parametara metode: preko vrednosti vrši se inicijalizacija ulaznih parametara u glavnom kodu. Podaci se prenose u metodu, ali se NE mogu preneti iz nje. Svi prethodi primeri koristili su ovaj način prenosa parametara; preko reference inicijalizacija ulaznih i izlaznih parametara. Podaci se prenose u metodu i mogu se preneti i iz nje; preko izlaza inicijalizacija izlaznih parametara. Podaci se prenose iz metode, ali se NE mogu preneti u nju;
Prenos parametara
Prenos parametra po vrednosti Vrednosni tipovi (int, char, long, float, ) prenose KOPIJU svoje VREDNOSTI. Referentni tipovi (niz, string) prenose KOPIJU svoje REFERENCE.
Prenos parametra po static void Main() int i = 10; int ikopija = i; i++; Console.WriteLine("i=0, ikopija=1", i,ikopija); vrednosti i referenci Uvećanje promenljive i ne utiče na njenu kopiju. static void Inkrementiraj(int a) a++; Console.WriteLine("a="+a); static void Main() int i = 10; //argument f-je Console.WriteLine("i=" + i); Inkrementiraj(i); Console.WriteLine("i="+i); i=10 a=11 i=10 SM1 static void Inkrementiraj(ref int a) a++; Console.WriteLine("a="+a); static void Main() int i = 10; Console.WriteLine("i=" + i); Inkrementiraj(ref i); Console.WriteLine("i="+i); i=10 i=10 a=11 a=11 i=11 i=11
Slide 6 SM1 Kada se prosledi argument metodi, odgovarajući parametar se inicijalizuje kopijom argumenta. Ovo važi bez obzira na to da li je parametar vrednosnog tipa (npr. int) ili je referentnog tipa (npr. string). To znači da bilo kakva promena vrednosti parametra ne može da utiče na promenu vrednosti originalnog argumenta. Ako se parametru doda prefiks ref, on postaje referenca na originalni argument (umesto njegova kopija). Zbog ovoga svaka izmena nad ref parametrom je automatski izmena originalnog argumenta. Ovaj prefiks se mora dodati i ispred originalnog argumenta i ispred parametra u metodi. Suzana Markovic; 9.12.2015.
Upoređenje parametar vrednosnog tipa Kada se promenljiva vrednosnog tipa predaje metodi, u stvari se predaje kopija promenljive metodi. Svaka promena izvršena nad parametrom unutar metode neće imati nikakvog uticaja na originalne podatke koji su smešteni u promenljivoj izvan metode. Metoda koja će promeniti vrednost parametra, mora da se prenese po referenci koristeći ref ili out ključne reči (referenca na originalni argument).
SM6 Upoređenje parametar vrednosnog tipa Svaka promena unutar metode Kvadrat nećeimati uticaja na promenljivu n izvan metode. static void Kvadrat(ref int n) n *= n; Console.WriteLine("Vrednost unutar je: 0", n); static void Main() int n = 5; Console.WriteLine("Vrednost pre je: 0", n); //5 Kvadrat(ref n); Console.WriteLine("Vrednost posle je: 0", n);
Slide 8 SM6 static void Kvadrat(int n) n *= n; Console.WriteLine("Vrednost unutar je: 0", n); static void Main() int n = 5; Console.WriteLine("Vrednost pre je: 0", n); //5 Kvadrat(n); Console.WriteLine("Vrednost posle je: 0", n); Suzana Marković; 7.5.2018.
Upoređenje parametar referentnog tipa Promenljiva referentnog tipa ne sadrži podatke direktno, već sadrži referencu na podatke. Kada se preda parametar referentnog tipa po vrednosti, moguće je promeniti podatke na koje pokazuje referenca, ali se NE menja vrednost same reference. Unutar metode se može stvoriti novi objekat i referenca preusmeriti na njega, ali to će trajati koliko i metoda. Promene nisu trajne zato što se zapravo metodi predaje kopija reference kada se NE koristi ključna reč ref. Kopija se menja unutar metode, ali original ostaje isti. Izvan metode, referenca će opet pokazivati na stari objekt. Za promene se moraju koristiti ref ili out ključne reči. Kada se koristi ref, realokacija niza postaje trajna.
SM5 Prenos parametra referentnog tipa po vrednosti static void Change(int[] niz) niz = new int[5] -3, -1, -2, -3, -4 ; niz[0] = 0; System.Console.WriteLine("Unutar metode, prvi element je: 0", niz[0]); static void Main() int[] vektor = 1, 4, 5 ; System.Console.WriteLine("Unutar metode Main, pre pozivanja metode, prvi element je: 0", vektor[0]); Change(vektor); System.Console.WriteLine("Unutar metode Main, posle pozivanja metode, prvi element je: 0", vektor[0]); 1 0 1
Slide 10 SM5 Isključiti niz[0] = 0; Kako se sada ponaša funkcija? 1, -3, 1 Ako zamenimo mesta biće 1, -3, 0 pošto se prenosi kopija reference, ali se objekat promenio Suzana Marković; 7.5.2018.
SM4 Prenos parametra referentnog tipa po referenci static void Change(ref int[] niz) niz = new int[5] -3, -1, -2, -3, -4; //niz[0] = 0; System.Console.WriteLine("Unutar metode, prvi element je: 0", niz[0]); static void Main() int[] vektor = 1, 4, 5; System.Console.WriteLine("Unutar metode Main, pre pozivanja metode, prvi element je: 0", vektor[0]); Change(ref vektor); System.Console.WriteLine("Unutar metode Main, posle pozivanja metode, prvi element je: 0", vektor[0]);
Slide 11 SM4 Isključiti niz[0] = 1; Kako se sada ponaša funkcija? Suzana Marković; 7.5.2018.
Parametar out Za prenos po referenci se koristi ključna reč ref, a za izlazni parametar - out Ove ključne reči se koriste i u definiciji metoda i na mestu poziva. Izlazni parametri ne moraju da budu inicijalizovani u glavnom delu programa pre prosleđivanja metodi. Izlaznom parametru se mora pridružiti vrednost u metodi.
Parametar out static void Metoda(out int x) x = 5; Console.WriteLine(x); static void Main() int x; //može i int x=1; Metoda(out x); x = 5
Izlazni parametar static void Change(out int[] niz) niz = new int[5] ; //neinicijalizovani niz System.Console.WriteLine("Unutar metode, prvi element je: 0", niz[0]); static void Main() int[] vektor = 1, 4, 5; System.Console.WriteLine("Unutar metode Main, pre pozivanja metode, prvi element je: 0", vektor[0]); 1 0 0 Change(out vektor); System.Console.WriteLine("Unutar metode Main, posle pozivanja metode, prvi element je: 0", vektor[0]);
SM2 Opseg važenja promenljive u drugim strukturama
Slide 15 SM2 int i; for (i=0;i<10;i++) string text = "za i="+i; Console.WriteLine("For petlja 0",text); Console.WriteLine("Van petlje 0", text); Console.ReadKey(); Suzana Marković; 29.11.2016.
Opseg važenja promenljive u drugim strukturama Zašto promenljiva text posle petlje ne zadržava vrednost koja joj je dodeljena pre petlje? Kada se promenljivama dodele vrednosti, one se raspoređuju u memoriji. Kada se ova raspodela dogodi unutar petlje, vrednost je deklarisana kao lokalna i izlazi izvan opsega važenja kada je van petlje.
Opseg važenja promenljive u drugim strukturama Iako sama promenljiva nije lokalnog karaktera za petlju, vrednost koju sadrži jeste. Dodeljivanje vrednosti izvan petlje omogućava (u primeru string text= ) da ta vrednost postane lokalna za glavni deo koda, a da i dalje bude u opsegu unutar petlje. To znači da promenljiva ne izlazi iz svog opsega važenja, dokle god ne izađe iz bloka glavnog dela koda, tako da imamo pristup njenim vrednostima izvan petlje.
Rekurzivne metode Rekurzija je tehnika programiranja u kojoj metoda poziva samu sebe (lat. "recurrere" (re nazad, currere izvršavati). Rekurzivni algoritam mora da ima bazni slučaj (engl. base case); Rekurzivni algoritam mora da menja svoje stanje i da napreduje ka osnovnom slučaju rekurzivni korak ili rekurzivni slučaj (engl. recursive case); Rekurzivni algoritam mora da poziva samog sebe.
Rekurzije primer static int Faktorijel(int n) if (n <= 1) return 1; return n * Faktorijel(n 1); static void Main(string[] args) Console.WriteLine("Unesi broj za koji će se izračunati faktorijel: "); int n = int.parse(console.readline()); Faktorijel(n); Console.WriteLine("\n" + n + "! = " + Faktorijel(n)); static int Fibonaci(int n) if (n <= 1) return 1; return Fibonaci(n 1) + Fibonaci(n 2); static void Main(string[] args) Console.WriteLine("unesi n\n"); int n = int.parse(console.readline()); for (int i=0; i < n; i++) Console.WriteLine(Fibonaci(i));