Стварни параметри и синтакса позива методе

Као што је познато, формални параметри су аргументи које пишемо у заградама иза имена функције. Међутим, формални параметри немају конкретну вредност, они нам само указују на то ког типа треба да буду вредности које ће се налазити унутар заграда приликом позива функције, као и колико ће аргумената функција имати. Позивање методе пишемо у следећој форми:


ime_metoda (lista_argumenata);

Позив метода се врши навођењем имена метода и навођењем евентуалне листе параметара унутар заграда иза имена метода. У заградама се наводе само аргументи, без њиховог типа и међусобно се одвајају зарезима. Уколико повратна вредност постоји, можемо је доделити одређеној променљивој.

Ovo je Java Applet napravljen u GeoGebri sa www.geogebra.org - izgleda da nemate instaliranu Javu; molim otvorite www.java.com
Анимација 9.6. Позив метода

*У случају да се анимација не приказује, притиснути дугме Прикажи слику




Аргументи који се наводе у заградама уместо формалних параметара приликом позива метода јесу стварни параметри. Они представљају конкретне вредности које ће функција коју позивамо обрадити на одређен начин. Стварни параметри морају одговарати формалним параметрима по броју, редоследу и типу параметара.
Анимација 9.7. Веза између формалних и стварних параметара

Аргументи који се наводе у заградама уместо формалних параметара приликом позива метода јесу стварни параметри. Они представљају конкретне вредности које ће функција коју позивамо обрадити на одређен начин. Стварни параметри морају одговарати формалним параметрима по броју, редоследу и типу параметара.

Аргументи се методу могу пренети:

  1. Преко референце
  2. Преко вредности.
У C# се аргументи преносе по вредности уколико се не наведе другачије. Све променљиве морају бити иницијализоване пре него што се могу пренети методу, без обзира на то да ли се преноси преко вредности или референце.

Пренос преко вредности: Вредносни параметар се наводи тако што се наведе име типа иза кога следи име променљиве. Када вршимо пренос по вредности метода прави копију референце, тада две референце (оригинал и копија) референцирају на исти објекат. Оригинална референца се не може променити. Унутар методе може се променити вредност параметара, а да то не утиче на променљиву изван методе.

Пренос преко референце: Референтни параметар представља референцу на меморијску локацију. Када вршимо пренос преко референце метода не прави копију референце, већ се ради са оригиналном референцом. Оригинална референца се не може променити. Референтни параметри се декларишу навођењем кључне речи ref испред типа. Кључна реч ref односи се само на параметар испред кога је наведена, а не на целу листу параметара. Приликом позива методе такође се мора навести кључна реч ref.

Код преноса преко вредности подаци се могу пренети методу, али се не могу пренети из ње, а код преноса преко референце подаци се могу пренети у методу и из методе.

Уколико метод нема параметре, обавезне су празне заграде приликом позива метода, као и приликом њеног дефинисања.

Пример 1. Написати програм који рачуна број комбинација од n елемената k-те класе користећи функцију факторијел.

Решење:

Број комбинација од n елемената k-те класе једнак је:


За израчунавање броја комбинација потребно нам је да израчунамо факторијеле бројева који се појављују у наведеној формули. Да то не бисмо одвојено радили за сваки број користићемо функцију факторијел.
Правимо форму облика:
  1. label1 - преименоваћемо у n, label2 - преименоваћемо у k
  2. textBox1 - у ово поље корисник уноси природан број
  3. textBox2 - у ово поље корисник уноси природан број
  4. button1 - преименоваћемо дугме у Broj kombinacija
  5. label3 - овде ћемо исписати резултат рада програма
Слика 9.7.Изглед форме пре преименовања у примеру 1

Двокликом на дугме Broj kombinacija отвара нам се прозор у коме пишемо код за наш програм. Унутар класе Form1 пишемо код за функцију факторијел, а унутар button1_Click пишемо код програма у коме ћемо више пута позивати функцију факторијел.

Слика 9.8. Изглед форме након преименовања у примеру 1

Приликом рачунања броја комбинација, броја n над k, морамо водити рачуна да су бројеви n и k већи од 0, пошто факторијел није дефинисан за негативне бројеве. Такође, мора важити и да је n веће од k, пошто нам је потребан и факторијел броја n - k. Поред овога, морамо водити рачуна и о томе да у оба textBox - а буде уписан некакав број. Све ово морамо укључити у услове задатка.


public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }
    //Funkcija faktorijel koju ćemo koristiti u programu, nalazi se unutar klase Form1
    int faktorijel(int n)
    {
	//Početna vrednost za faktorijel je 1
        int fakt = 1;
	//Prolazimo kroz for petlju, moramo proći sve brojeve od 1 do n
        for (int i = 1; i <= n; i++)
	    //Množimo prethodni broj sa sledećim
            fakt = fakt * i;
         //Vraćamo fakt, vrednost faktorijela broja n
        return fakt;
    }

    //Sada akciju koju program treba da obavi vezujemo za pritisak na dugme
    private void button1_Click(object sender, EventArgs e)
    {
        //Deklaracija promenljivih
        int n, k;
        int komb;

        //Ukoliko textBox-ovi nisu prazni onda ćemo da učitamo vrednosti iz njih
        if (textBox1.Text != "" && textBox2.Text != "")
        {
	    //Učitavamo vrednost iz textBox1 i textBox2 
	    //Prebacujemo stringovnu reprezentaciju broja u int
            n = int.Parse(textBox1.Text);
            k = int.Parse(textBox2.Text);
	    //Ukoliko je neka od učitanih vrednosti 0 
	    //Ili je n manje od k ne možemo izračunati faktorijel
            if (n < 0 || k < 0 || n < k)
            {
		    
		//Ispisujemo korisniku poruku kakve brojeve sme da unese
                MessageBox.Show("Unesite prirodan broj za n i k i vodite racuna da je n > k!");
		//Praznimo textBox1 i textBox2
                textBox1.Text = "";
                textBox2.Text = "";
		//Praznimo labelu
                label3.Text = "";
            }
	    //Ukoliko su učitane vrednosti ispravne i može se izračunati njihov faktorijel
            else
            {
		//Računamo broj kombinacija po formuli. 
		//Pozivamo funkciju faktorijel, u zagradama su stvarni parametri
                komb = faktorijel(n) / (faktorijel(k) * faktorijel(n - k));
		//Ispisujemo rezultat u labeli
                label3.Text = "Broj n kombinacija k-te klase je " + komb;
            }
        }
	//Ukoliko su textBox1 ili textBox2 prazni
        else
	    //U labeli ispisujemo poruku
            label3.Text = "Unesite brojeve!";           
    }
}

Покренимо сада програм да видимо резултате. Уколико изоставимо попуњавање једног или два поља, као резултат добијамо поруку на слици 9.6, а уколико унесемо неодговарајуће вредности за бројеве n и k, резултат ће бити порука на слици 9.7.

Слика 9.9. Резултат рада програма када нису попуњена сва поља Слика 9.10. Резултат рада програма када је неисправан унос


Напослетку, погледајмо шта ће се десити ако унесемо регуларне вредности за бројеве n и k.

Слика 9.11. Резултат рада програма за исправан унос

Пример 2. Написати програм који рачуна збир n - тих степена првих m природних бројева користећи функцију која рачуна степен.

Решење:

За израчунавање овог збира потребно нам је да знамо n - ти степен било ког природног броја. За то ће нам бити потребна функција која рачуна степен. Овде ћемо посматрати само оне експоненте n који су цели бројеви. Дакле, број n може бити позитиван и негативан. Да бисмо израчунали вредност израза



потребно је да нађемо вредност за сваки сабирак.
Правимо форму облика:
  1. label1 - преименоваћемо у n - stepen, label2 - преименоваћемо у m
  2. textBox1 - у ово поље корисник уноси цео број
  3. textBox2 - у ово поље корисник уноси природан број
  4. button1 - преименоваћемо дугме у Izracunaj
  5. label3 - овде ћемо исписати резултат рада програма
Слика 9.12. Изглед форме пре преименовања у примеру 2

Двокликом на дугме Izracunaj отвара нам се прозор у коме пишемо код за наш програм. Унутар класе Form1 пишемо код за функцију степен, а унутар button1_Click пишемо код програма у коме ћемо позивати функцију степен. Како експонент може бити негативан, решења ће бити реални бројеви.
Слика 9.13. Изглед форме након преименовања у примеру 2

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    //Pišemo funkciju. Prvi argument je osnova, a drugi je eksponent
    double stepen(int m, int n)
    {
	//Početna vrednost za rezultat je 1
        double rezultat = 1;
	//Prvi slučaj je kada je eksponent negativan  
        if (n < 0)
        {
	    //Menjamo vrednost eksponenta u pozitivnu
            n = -n;
	    //Prolazimo kroz for petlju n puta
            for (int i = 1; i <= n; i++)
		//Postojeći rezultat množimo sa m, pošto nam treba stepen broja m
                rezultat = rezultat * m;
	    //Vraćamo recipročnu vrednost rezutata pošto je eksponent negativan
            return 1/rezultat;
        }
	//Ukoliko eksponent nije negativan
        else
        {
	    //Prolazimo kroz for petlju n puta, jer nam treba n - ti stepen
            for (int i = 1; i <= n; i++)
		//Postojeći rezultat množimo sa m, pošto nam treba stepen broja m
                rezultat = rezultat * m;
	    //Vraćamo rezultat jer je eksponent pozitivan
            return rezultat;
        }
    }
    //Kod programa koji se izvršava pritiskom na dugme Izracunaj
    private void button1_Click(object sender, EventArgs e)
    {
	//Ako textBox1 i textBox2 nisu prazni, učitavamo vrednosti
        if (textBox1.Text != "" && textBox2.Text != "")
        {
	    //Inicijalizacija promanljivih
            int n, m;
	    //Početna vrednost za zbir je 0
            double zbir = 0;
	    //Učitavamo vrednost za n iz textBox1 kao ceo broj
            n = int.Parse(textBox1.Text);
	    //Učitavamo vrednost m iz textBox2 kao ceo broj
            m = int.Parse(textBox2.Text);    
	    //Ako je m veće od 0 računamo stepen        
	    if (m > 0)
            {
		//Prolazimo kroz for petlju da bi svi prirodni brojevi od 1 do m ušli u zbir
                for (int i = 1; i <= m; i++)
		    //Postojećoj vrednosti zbira dodajemo n - ti stepen broja
                    zbir = zbir + stepen(i, n);
	        //Ispisujemo rezultat u labeli
                label3.Text = "Zbir " + n + ". stepena prvih " + m + " prirodnih brojeva je ";
		label3.Text = label3.Text + zbir;
            }
	    //Ako je m manje od 0 ispisujemo poruku
            else
                label3.Text = "Unesite prirodan broj za m!";
        }
	//Ako su textBox1 ili textBox2 prazni
        else
	    //Ispisujemo poruku u labeli 
            label3.Text = "Unesite vrednosti za n i m.";
    }
}


Покренимо сада програм да видимо резултате. Уколико изоставимо попуњавање једног или два поља или уколико унесемо негативан број m добићемо следеће резултате:

Слика 9.14. Резултат рада програма када нису попуњена сва поља Слика 9.15. Резултат рада програма када је неисправан унос

Сада погледајмо какве резултате ћемо добити уколико унесемо регуларне вредности за бројеве m и n.

Слика 9.16. Резултат рада програма када је експонент позитиван Слика 9.17. Резултат рада програма када је експонент негативан