1. FUNKCIJE I STRUKTRUE PROGRAMA Složeni problemi lakše se rašavaju ako se podele na manje celine koje mogu nezavisno da se rešavaju. Rešenje celokupnog složenog problema dobija se kombinovanjem rešenja manjih celina. Delovi programa kojima se rešavaju potproblemi nazivaju se potprogramimi. Postoje dve vrste potprograma: funkcije i procedure(void funkcije). Funkcije se obično definišu kao potprogrami koji, na osnovu izvesnog broja parametara, daje jedan rezultat koji se naziva vrednost funkcije. Vrednost funkcije može da se koristi ugrađivanjem poziva funkcije u izraze. Procedure su potprogrami koji, na osnovu svojih parametara, daju više rezultata menjajući vrednosti nekih od svojih parametara. Procedure ne daju vrednost funkcije i zato ne mogu da se pozivaju kao operandi u sastavu izraza. One se pozivaju zasebnim naredbama. 1.1 Definisanje funkcija Opšti oblik definisanja funkcije je: Vidljivost TipPovratneVrednosti ImeFunkcije (NizParametara) { TeloFunkcije } Vidljivost postavlja službenu reč privateili public (definiše da li je funkcija vidljiva samo u okviru aktivne Form ili šire). Ako se ne navede vidljivost podrazumeva se private. TipPovratneVrednosti predstavlja tip vrednosti funkcije. U obzir dolaze svi standardni tipovi kao i izvedeni tipovi (tipovi koje programer definiše). Za funkcije koje ne stvaraju vrednost kao TipPovratneVrednosti treba koristiti službenu reč void. ImeFunkcije je naziv funkcije koji određuje programer. Ime funkcije se sastoji od jedne reči ili od kombinacije više reči između kojih nema razmaka (primer: NekoIme, Neko_Ime) NizParametara predstavlja parametre funkcije pomoću kojih se vreši unošenje početnih podataka u funkciju. Vrednost funkcije izračunava se na osnovu tih početnih podataka. TeloFunkcije predstavlja sadržaj funkcije. Po formi je blok, tj. niz naredbi unutar velikih zagrada { }. Svaki blok, pa i telo funkcije, može na početku da sadrži deklarativne naredbe, a iza njih izvršne naredbe. Primer: 1. private void primer(int a, int b) 3. label1.text = (a + b).tostring(); 4. }
1.2 Parametri funkcije NizParametara predstavlja parametre funkcije pomoću kojih se vreši unošenje početnih podataka u funkciju. Vrednost funkcije izračunava se na osnovu tih početnih podataka. Opšti oblik niza parametara je: parametar, parametar,..., parametar Pojedini parametri definišu se na isti način kao i obični podaci: OznakaTipa ImeParametra Za razliku od naredbe za definisanje podataka, ovde se za svaki parametar mora zasebno navesti OznakaTipa. OznakaTipa treba da bude naziv standardnog ili izvedenog tipa. ImeParametra je po formi identifikator ( promeljiva ). Parametri funkcije nisu stvarni podaci. Oni samo formalno predstavljaju podatke koji će se navesti prilikom pozivanja (korišćenja) funkcije i na osnovu čijih vrednosti će se izračunavati vrednost funkcije. Ti podaci se nazivaju argumenti funkcije. Parametri funkcije ponekad se nazivaju i formalniargumenti. Podaci pri pozivanju funkcije se tada nazivaju stvarniargumenti. Primer 1: 1. using System; 2. using System.Collections.Generic; 3. using System.ComponentModel; 4. using System.Data; 5. using System.Drawing; 6. using System.Linq; 7. using System.Text; 8. using System.Windows.Forms; 9. namespace Primer1 10. { 11. public partial class Form1 : Form 1//Ovde počinje javni deo 13. public Form1() 14. { 15. InitializeComponent(); 16. } 17. private void IspisZbira(int a, int b) 18. { 19. MessageBox.Show("Zbir dva broja je " + (a + b)); 20. } 21. private void button1_click(object sender, EventArgs e) 2 23. IspisZbira(18, 33);//Pozivanje funkcije 24. } 25. }//Ovee se završava javni deo 26. }
1.3 Telo funkcije TeloFunkcije predstavlja sadržaj funkcije. Po formi je blok, tj. niz naredbi unutar velikih zagrada { }. Svaki blok, pa i telo funkcije, može na početku da sadrži deklarativne naredbe, a iza njih izvršne naredbe. Deklarativne naredbe prvenstveno se koriste za definisanje podataka koji se koriste u funkciji. Ti podaci su lokalni za funkciju, što zanči da postoje i mogu da se koriste samo unutar funkcije. Oni se ponovo stvaraju pri savakom pozivanju funkcije, a uništavaju pri napuštanju funkcije. Izvršne naredbe određuju šta radi funkcija. Povratak iz funkcije na mesto odakle je ona pozvana postiže se naredbom return, koja spada u grupu upravljačkih naredbi (skokova). Opšti oblik te naredbe je: return izraz; Primer 2: 1. namespace Primer2 3. public partial class Form1 : Form 4. { 5. public Form1() 6. { 7. InitializeComponent(); 8. } 9. private int Zbir (int n) 10. { 11. int Saberi = 0; 12. for (int i = 1; i <= n; i++) 13. Saberi += i; 14. return Saberi; 15. } 16. private void textbox1_textchanged(object sender, EventArgs e) 17. { 18. label3.text = Zbir(Convert.ToInt16(textBox1.Text)).ToString(); 19. } 20. } 21. }
1.4 Pozivanje funkcije Pozivanje funkcije smatra se binarnim operatorom (operatorom sa dva operanda) i obeležava se sa (). Za razliku od ostalih binarnih operatora, ovaj operator se ne piše između sbojih operanada (kao na primer a+b) već oko drugog operanda. Prvi operand je funkcija koja se poziva, a drugi operand je niz argumenata: funkcija (argument, argument,..., argument) Funkcija označava funkciju čije se izvršavanje traži. Ona je identifikator funkcije koja se poziva. Argumenti predstavljaju vrednosti koje služe za inicijalizaciju parametara funkcije pre obrade tela funkcije. Argumenti, po broju i tipu, moraju da se slažu sa brojem i tipovima parametara pri definisanju funkcije. Tip prvog argumenta mora odgovarati tipu prvog parametra, tip drugog argumenta mora odgovarati tipu drugog parametra idt. Operator za pozivanje funkcije () je najvišeg prioriteta, tako da će se funkcija u nekom izrazu prva izvršavati. Ukoliko funkcija ne vraća vrednost (tip void) može da se poziva samo u zasebnoj prostoj naredbi - funkcija (...);. Takva funkcija ne sme da se koristi na mestima na kojima se očekuje konkretna vrednost. Primer 3: Izračunati izraz 24+3 4+5 pomoću funkcija za zbir i deljenje 1. namespace Primer_3 3. public partial class Form1 : Form 4. { 5. public Form1() 6. { 7. InitializeComponent(); 8. } 9. decimal c = 0; 10. private decimal Zbir(decimal a, decimal b) 11. { 12. return a + b; 13. } 14. private decimal Razlika(decimal a, decimal b) 15. { 16. return a / b; 17. } 18. private void Prikaz(decimal a) 19. { 20. MessageBox.Show("Vrednost izraza je " + a); 21. } 22. private void button1_click(object sender, EventArgs e) 23. { 24. c = Razlika(Zbir(24, 3), Zbir(4, 5)); 25. Prikaz(c); 26. } 27. } 28. }
1.5 Niz kao parametar funkcije Parametri funkcije mogu da budu i nizovi. Pri navođenju takvog parametra nije neophodno navesti broj elemenata niza. Uz ime parametara dovoljno je navesti samo [] što znači da se radi o nizu, a ne o skalarnom podatku. Opšti oblik navođenja parametara nizvnog tipa je: tip [] ime Primer: 1. int Zbir (int[]a, int n) 3. int i, s; 4. for(s=i=0;i<n;i++) 5. s+=a[i]; 6. return s; 7. } 8. private void button1_click(object sender, EventArgs e) 9. { 10. int [] niz = {8,5,3,4,10}; 11. MessageBox.Show("Zbir je: "+Zbir(niz, niz.length).tostring()); 12. } 1.6 Oblast vidljivosti promenljive 1. int X = 20, Y=200; 2. string ispis; 3. void Funkcija (int a, int b) 4. { 5. int X = 30; 6. ispis += "Vrednost u Funkciji: X = " + X + ", Y = " + Y + "\n"; 7. X = a; 8. Y = b; 9. ispis += "Vrednost u Funkciji(dodela parametra a, b): X = " + X + ", Y = " + Y + "\n"; 10. X = 80; 11. Y = 800; 12. ispis += "Vrednost u Funkciji(dodela vrednosti 80, 800): X = " + X + ", Y = " + Y + "\n"; 13. } 14. private void button1_click(object sender, EventArgs e) 15. { 16. ispis = ""; 17. ispis += "Početak\nVrednost na startu programa: X = " + X + ", Y = " + Y + "\n"; 18. Funkcija(55, 555); 19. ispis += "Vrednost posle funkcije: X = " + X + ", Y = " + Y + "\n"; 20. X = 99; 21. Y = 999; 22. ispis += "Vrednost posle funkcije(dodela novih vrednosti 99 i 999): X = " + X + ", Y = " + Y + "\n"; 23. MessageBox.Show(ispis); 24. }
1.7 Rekurzivna funkcija Rekurzivne funkcije su funkcije koje neposredno ili posredno pozivaju same sebe. One omogućavaju lako i razumljivo rešavanje problema koji su, po svojoj prirodi, rekurzivni. Tipičan primer rekurzivnih problema je izračunavanje n! (n faktroijela) koji je definisan 5! = 5*(4!)=5*4*(3!)=5*4*3*(2!)=5*4*3*2*1=120 1. string ispis; 2. int Funkcija (int n) 3. { 4. if (n == 0 n == 1) 5. return 1; 6. else 7. return n * Funkcija(n - 1); 8. } 9. private void button1_click(object sender, EventArgs e) 10. { 11. ispis = ""; 12. ispis =Funkcija(5).ToString(); 13. MessageBox.Show(ispis); 14. }