Thursday, December 03, 2015

Funkcije u C# programskom jeziku


Funkcije predstavljaju izdvojeni celoviti skup naredbi koji izvršavaju određeni zadatak. Kad god imate veliki zadatak i imate potrebu da ga podelite u manje celine, ili jednostavno kad jedan dio koda hoćete više puta da izvršavate u kodu, onda pravite funkciju. Danas da radite na bilo kojem projektu bez funkcija je nezamislivo. Zamislite da u vašem programu hoćete da na više mesta pretvorite milje u kilometre. Da ne bi ste pisali više puta isti kod, vi će te jednostavno napraviti funkciju koja pretvara milje u kilometre i pozivati funkciju kad god vam treba takvo konvertovanje. U programiranju se isti kod skoro nikad ne piše dva puta i ako dođe do neke greške dovoljno je da ispravite vaš kod jednom u funkciji. Inače, bez funkcija bi ste morali prepravljati kod na svim mestima gde ste pretvarali milje u kilometre, dok veličina koda bi bila mnogostruka.



( Statična funkcija koja vraća vrednost u C# programskom jeziku )

Funkcije često nazivaju metodama, što one i jesu. Ali mnogo programera danas meša pojam metode sa funkcijama jer postoji razlika. Metode nisu samo funkcije, već predstavljaju i druge članove klase i strukture koji ne predstavljaju podatke. Znači metode su i indekseri, operatori, konstruktori i destruktori. Čak i svojstva se ponekad smatraju metodama, ali treba znati da svojstva imaju samo karakteristike metoda i atributa, ali svojstva nisu ni metode ni atributi. Ovo je bitno da znate i radi testova koji se polažu za Microsoft sertifikate. I pored toga što su funkcije u C# programskom jeziku slične funkcijama u C i C++ programskom jeziku, funkcije u C++ programskom jeziku možete pogledati ovde; one se takođe razlikuju. C# programski jezik ne podržava globalne metode. Svaku funkciju morate pisati unutar klase. U C# programskom jeziku nije moguće koristiti blokove za grupisanje modifikatora poput public ili private već se u C# programskom jeziku funkcije ali i ostale metode moraju deklarisati sa modifikatorima. Modifiers - modifikatori vam određuju rang delovanja promenjive, funkcije, strukture, metode i klase na nivou celog Solution – rešenja. Osnovni modifikatori pristupa su:
  • Public – javan, bez restrikcija.
  • Protected Internal – limitiran na program, klasu i izvedene klase
  • Internal – limitiran na program i klasu
  • Protected – limitiran na klasu i izvedene klase.
  • Private – limitiran samo na klasu
Pored navedeni modifikatora obavezno trebate obratiti pažnju i na:
  • Static – omogućava da nam nije potrebno da instaciramo klasu kako bi smo pristupili članu klase
Postoje i drugi modifikatori kojima pravimo anonimne ili asinhronizovane funkcije ali o njima će biti posebno pisano u narednim postovima. Inače, najbitnija podela funkcija je podela na funkcije koje ne vraćaju nikakvu vrednost i funkcije koje vraćaju neku vrednost.

Funkcije koje ne vraćaju vrednost


Sintaksa funkcije koja ne vraća nikakvu vrednost je sledeća:
tip void ime_funkcije (lista_parametatra)
              telo_funkcije;
}


Ovu vrstu funkcije ste već viđali na svakom programskom primeru koji smo pisali na postovima do sada.

static void Main(string[] args)
{

}

Kao što vidite funkcije koje ne vraćaju nikakvu vrednost moraju sadržavati tip void. Ključna reč void se u C# programskom jeziku ne mogu koristiti kao parametri jer void u C# programskom jeziku je samo alijas za tip podatka System.Void. Pointer tipovi u nebezbednom kodu mogu koristiti void za unknown-nepoznate tipove ali se ne preporučuje. Pogledajte kod sledećeg programa koji koristi funkciju bez povratne vrednosti.

using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace VoidFunction
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName = String.Empty;
            string lastName = String.Empty;

            do
            {
                Write("Enter your first name: ");
                firstName = ReadLine();

            } while (firstName == String.Empty);

            do
            {
                Write("Enter your last name: ");
                lastName = ReadLine();

            } while (lastName == String.Empty);

            FullName(firstName, lastName);

            ReadLine();

        }

        static void FullName(string fName, string lName)
        {
            WriteLine($"\n\tYour full name is: {fName} {lName}");

        }
    }
}

Kao što vidite u kodu, funkcija FullName ne vraća nikakvu vrednost, ona služi samo da prikaže puno ime na ekranu koje je uneo korisnik. Svaka funkcija mora da ima telo funkcije ograđeno vitičastim zagradama { }. Navedena funkcija takođe, uzima dva parametra ali koristi i modifikator static. Funkcija nije definisana da li je tipa public ili na primer private, zato se podrazumeva da je private. Funkcije ne moraju da traže bilo kakve parametre, ali ako ih traže ni jedan od njih se ne može ignorisati. Funkcije mogu da imaju isti naziv ali ne mogu da se isto nazivaju i da traže iste parametre. Takve funkcije sa istim imenom zovemo preopterećenje metoda ili funkcije. Navedena funkcija ne sadrži ni tip funkcije jer je void tip i znači da ne vraća nikakvu vrednost. Vi možete da ne koristite modifikator static u navedenom primeru ali bi ste onda morali da inicijalizujete klasu u kojoj se nalazi funkcija da bi ste je pozvali u programu. Npr. 

Program Pro = new Program();
Pro.FullName(firstName, lastName);


Kad pokrenete program, rezultat će biti sličan u zavisnosti od unosa imena i prezimena klijenta.

Enter your first name: Manuel
Enter your last name: Radovanovic

                          Your full name is: Manuel Radovanovic


Kako to sve izgleda možete videti i na video-u:

( C# 6.0 Tutorial - Fundamentals - 18. Function Without Return Value )

Funkcije koje vraćaju vrednost

Sintaksa funkcije koja vraća vrednost je sledeća:

modifikator tip ime_funkcije (lista_parametatra)
{
                    telo_funkcije;
                    return vrednost;
}


Za razliku od funkcija koje ne vraćaju vrednost, funkcije koje vraćaju moraju da sadrže ključnu reč return koja vraća vrednost. Tip funkcije definišete u zavisnosti kakav tip želite da vam funkcija vrati. Naravno parametri mogu da budu različitog tipa i da se razlikuju od tipa funkcije. Kako se koriste funkcije koje vraćaju vrednost pogledajte u sledećem programu koji konvertuje temperaturu iz celzijusa u farenhajte i obratno:

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReturnFunctions
{
    class Program
    {
        static void Main(string[] args)
        {
            byte menu = 0;

            do
            {
                Clear();
                WriteLine("\t\t\tTHE TEMPERATURE CONVERTER\n");
                WriteLine("\t1. Convert Celsius to Fahrenheit");
                WriteLine("\t2. Convert Fahrenheit to Celsius");
                WriteLine("\t3. Quite\n");
                Write("\t\tYour choice: ");

                bool correctMenu = byte.TryParse(ReadLine(), out menu);

                Clear();

                if (menu == 1)
                {
                    double temperature = 0.0;

                    do
                    {
                   
                        Write("\n\tWhat is the temperature in Celsius? ");
                        bool correctTemperature = Double.TryParse(ReadLine(), out temperature);

                        if (correctTemperature)
                        {
                            WriteLine($"\n\t{temperature} celsius are {CelsiusToFahrenheit(temperature)} fahrenheits.");
                            ReadKey();

                        }

                    } while (temperature > Double.MaxValue && temperature < Double.MinValue);
                }
               
                if(menu == 2)
                {
                    double temperature = 0.0;

                    do
                    {

                        Write("\n\tWhat is the temperature in Fahrenheits? ");
                        bool correctTemperature = Double.TryParse(ReadLine(), out temperature);

                        if (correctTemperature)
                        {
                            WriteLine($"\n\t{temperature} fahrenheits are {FahrenheitToCelsius(temperature)} celsius.");
                            ReadKey();

                        }

                    } while (temperature > Double.MaxValue && temperature < Double.MinValue);
                }


            } while (menu != 3);
        }

        static double CelsiusToFahrenheit(double temperature)
        {
            return ((9.0 / 5.0) * temperature) + 32;

        }

        static double FahrenheitToCelsius(double temperature)
        {
            return (5.0 / 9.0) * (temperature - 32);

        }
    }
}

Kao što možete videti program sadrži dve funkcije tipa double, zato što vraćaju vrednosti tipa double. U velikim projektima ne bi bilo dovoljno da konvertovanje temperature smestite u privatne funkcije u programu, već bi ste funkcije smestili u posebnu klasu i definisali ih kao javne.

  static public double CelsiusToFahrenheit(double temperature)
  {
            return ((9.0 / 5.0) * temperature) + 32;

  }

Tako bi ste ih mogli uvek koristiti bilo gde u projektu. Čak i funkcija koja vraća vrednost ne mora da uzima parametre, ali i bez parametara svaki poziv funkcije mora da se poziva sa velikim zagradama (  ). Kad pokrenete program, on će konvertovati temperaturu i zbog do… while petlji vam neće dozvoljavati da korisnik pravi greške prilikom unosa vrednosti.

                THE TEMPERATURE CONVERTER

         1. Convert Celsius to Fahrenheit 

         2. Convert Fahrenheit to Celsius
         3. Quite

                       Your choice: 1

         What is the temperature in Celsius? 100 

         100 celsius are 212 fahrenheits.

               THE TEMPERATURE CONVERTER

         
1. Convert Celsius to Fahrenheit
          2. Convert Fahrenheit to Celsius
          3. Quite

                        Your choice: 2

         What is the temperature in Fahrenheits? 212
          212 fahrenheits are 100 celsius.

              THE TEMPERATURE CONVERTER

        
1. Convert Celsius to Fahrenheit
         2. Convert Fahrenheit to Celsius  

         3. Quite

                      Your choice: 3 


Kako to sve izgleda možete videti i na video-u:



( C# 6.0 Tutorial - Fundamentals - 19. Functions With Return Value )

9 comments:

  1. Bas deteljno lepo objasnjeno bez zamrsivanja strvari. Prosti lepi primeri.
    Hvala puno!

    ReplyDelete
  2. Pozdrav.Možete li mi reći šta znači ovo :Internal modifikator pristupa neće biti vidljiv izvan assemblyja.Šta je zapravo assembly ?Hvala unapred

    ReplyDelete
  3. Jedno rešenje može da ima više povezanih projekata. Kad ne želiš da drugi projekti pristupaju tvojim *.dll fajlovima onda ograničiš klase na Internal modifikator. Na nivou assemblyja lakše ćeš shvatiti na nivou *exe ili *dll fajla kad se kompajlira. Pogledaj advanced napredni nivo C# ... https://www.manuelradovanovic.com/2016/03/arhitektura-microsoft-net-framework-a.html

    ReplyDelete
  4. Ako sam dobro shvatio Assembly je zapravo jedan solution .A ako imamo više solutiona onda je vezan samo za jedan.

    ReplyDelete
  5. Solution(rešenje) uvek ima barem jedan Project(projekat) ili više njih. Svaki projekat ima ili program ili klasu ili više njih. Assembly je sklop više skrivenih privremenih fajlova neophodnih da se formira kompajlirani fajl (*exe ili *dll), koji se nalazi u Projecat. Znači Internal modifikator je ograničen na nivou tvog programa ili klase u Project-u. Jel sad šta jasnije?

    ReplyDelete
  6. Jbg ja sam Bosanac pa ide malo teže :) , ali sad je i meni jasno pa samim tim i svima.Hvala legendo.

    ReplyDelete