Pages

Tuesday, April 07, 2020

Funkcije u C# programskom jeziku


Prošli put smo učili Nizove u C# programskom jeziku, dok ćemo danas učiti još jednu interesantnu i korisnu stvar; funkcije. Bez obzira da li ste početnik u programiranju i bez obzira da li ste do sada učili funkcije u C# programskom jeziku, definitivno ste ih koristili čak i u vašem prvom C# programu. Funkcije predstavljaju jednu izdvojenu celinu naredbi koji izvršavaju neki zadatak. Funkcije pravite kada imate potrebu da deo koda izdvojite i stavite u jednu celinu ili kad imate potrebu da jedan deo koda više puta koristite u programu. Jednostavnije je da pišete samo jednom kod i da ga pozovete kad god vam treba nego da pišete isti kod. Na primer imate funkciju koja latinična slova konvertuje na ćirilična slova. Kad god hoćete da nešto napišete na ćirilici samo pozovete funkciju koja to radi. Isto tako na primer; kad imate neku grešku, ispravljate je samo na jednom mestu u funkciji a ne sto puta u celom kodu. 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 najviše 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 ključnu reč: 
  • 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. 
  

( Funkcije mogu da vraćaju i ne vraćaju vrednost )

C# programskom jeziku imate jednu specijalnu funkciju, funkcije koje ne vraćaju vrednost i funkcije koje vraćaju vrednost. Svaka od njih može uzimati argumente. Specijalna funkcija ili funkcija koju poznajete kao Main() funkcija se koristi kao startna pozicija svakog programa. Može postojati samo jedna funkcija Main() u jednoj klasi ali u drugačijem imenskom prostoru.

static void Main(string[] args) {}

Ako bi ste napravili neku klasu u istom inenskom prozoru i u njoj navedenu funkciju dobili bi ste grešku:
  • Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.

Zato možete imati na primer više formi u projektu gde svaka forma ima svoju Main() funkciju, ali to je zato što svaka forma ima drugačiji imenski prostor. Takođe vidimo da Main() funkcija prihvata argumente u args niz tipa string. I takođe vidimo ključnu reč void koja nam potvrđuje da navedena funkcija ne vraća nikakvu vrednost, već se program završava kad se funkcija izvrši do kraja. Ovu funkciju nikad ne trebate menjati i posebno ne trebate da pravite neku svoju.

Funkcije koje ne vraćaju vrednost


Kad sam vam naveo da ste već koristili funkcije, nisam toliko imao na umu specijalnu Main() funkciju, nego sam više mislio na metode kao što su Write() i WriteLine(). Kad pogledate na primer metodu WriteLine(), vi nju koristite da ispišete neki tekst na terminal. Ali taj tekst može biti i broj bilo kojeg tipa i karakter dok vi u stvari ne morate da isti konvertujete u tekst. Zašto je to tako? To  je zato što klasa Console ima mnogo funkcija koji imaju isti naziv, ali različite atribute. To znači da vi možete imati funkcije sa istim imenom, ali moraju imati različite argumente koje prihvataju. Da bi ste razumeli funkcije, najbolje da pređemo praktični deo. Kreirajte novi program i nazovite ga voidfunction. Zatim, unesite sledeći kod:

using System;
using static System.Console;

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

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

            } while (firstName == String.Empty);

            Write("Enter your middle name: ");
            middleName = ReadLine();
                      
            do
            {
                Write("Enter your last name: ");
                lastName = ReadLine();
                
            } while (lastName == String.Empty);

            FullName(firstNamemiddleNamelastName);
            
        }

        static void FullNamestring fnamestring mnamestring lname)
        {
            WriteLine();

            if ((mname == String.Empty) || (mname == null))
            {
                WriteLine(fname + " " + lname);

            }
            else
            {
                WriteLine(fname + " " + mname + " " + lname);

            }

            WriteLine();
        }
    }
}

U mnogim kompanijama, posebno u USA; kada vam traže ime i prezime, mogu vam tražiti i srednje ime. Ti podaci se smeštaju u bazu podataka. Baza podataka sadrži tabelu sa tri kolone samo za vaše puno ime i prezime. Zašto ne stave sve u jednu kolonu? Uglavnom radi pretrage. To omogućava pretragu po imenu ili prezimenu ili srednjem imenu jednostavnije. Ovaj naš program koristi funkciju FullName koja ne vraća vrednost. To znači da ona prihvata argumente: ime, srednje ime i prezime. Ukoliko korisnik ne unese srednje ime, funkcija povezuje ime i prezime, ako ne onda spaja i ime, srednje ime i prezime. Naravno, između istih stavlja razmak. Zatim to ispisuje na terminal. Kad bi ste Vi sad i pored korisnika koji unosi podatke, prikazivali imena i iz baze podataka; Vi bi ste mogli da koristite istu funkciju za taj zadatak koliko god hoćete puta, kad god vam to treba. Ono što je bitno, ključna reč void u ovoj funkciji nam govori da je ovo funkcija koja ne vraća vrednost. Ona vrednost ispisuje na terminal ili samo izvršava kod u svom bloku. Isto tako možete primetiti da od modifikatora se ne koristi ni jedan. To znači da se podrazumeva da je funkcija privatna i limitirana samo na klasu po defaultu. Funkcije se pišu ispod ili iznad funkcije Main() ali ne izvan klase. Od C# programskog jezika verzije 7.0 vi možete staviti istu funkciju u drugu funkciju, iako meni baš nije jasno zašto bi to neko radio. Funkciju pozivate tako što napišete ime funkcije i u malim zagradama ( ) navedete argumente koje funkcija traži. Obratite pažnju na to da ako funkcija traži dva argumenta, ne možete uneti dva ili više od tri. Isto tako ako se traži argument tipa integer ne možete joj dodeliti string. Ovaj isti program se može napisati da umesto jedne koristi dve funkcije sa istim nazivom. Postoje slučajevi gde bi ta varijanta bila bolja, ali u ovom slučaju to bi bilo komplikovano. Pokušajte za vežbanje da to vi sami uradite. Prepravite kod. Kad pokrenete navedeni program, rezultat će biti sličan u zavisnosti od unosa imena i prezimena klijenta:

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

Manuel Radovanovic

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


( C# & .NET Core - 19. Void Function )

Funkcije koje vraćaju vrednost

Za razliku od funkcija koje ne vraćaju vrednost, funkcije koje vraćaju vrednost se često koriste kada želite da neki deo koda obavi neki proračun i da vam vrati rezultat. Na primer kada želite da imate listu kupaca sortiranih po abecednom redu. Napravićete funkciju koja će uzeti imena kupaca iz baze podataka, sortirati podatke i vratiti vam sortiranu listu kupaca. I pozvaćete tu istu funkciju kad i gde god trebate takvu listu u kodu. Funkcije koje vraćaju vrednost, ne koriste ključnu reč void, nego umesto toga morate deklarisati funkciju sa istim tipom podataka koju vam funkcija vraća. Znači ako vam funkcija vraća listu kupaca, tada i vaša funkcija mora biti deklarisana kao lista. Za vraćanje vrednosti koristite ključnu reč return. Ali, hajde da napravimo nešto jednostavno sa više funkcija koje vraćaju vrednost. Kreirajte novi program, nazovite ga returnfunction i unesite sledeći kod:  

using System;
using static System.Console;

namespace returnfunction
{
    class Program
    {
        static void Main(string[] args)
        {
            bool bresult = false;
            double dresult = 0.0D;
            char opr = '\0';
            double number1 = 0.0Dnumber2 = 0.0D;

            do
            {
                WriteLine("Enter the first number: ");
                bresult = Double.TryParse(ReadLine(), out number1);

            } while (bresult == false);

            do
            {
                WriteLine("Choose the operator ( *, /, +, - ): ");
                Char.TryParse(ReadLine(), out opr);

            } while (opr != '+' && opr != '-' && opr != '*' && opr != '/');

            do
            {
                WriteLine("Enter the second number: ");
                bresult = Double.TryParse(ReadLine(), out number2);

            } while (bresult == false);

            switch (opr)
            {
                case '+':
                dresult = Add(number1number2);
                break;

                case '-':
                dresult = Subtract(number1number2);
                break;

                case '*':
                dresult = Multiply(number1number2);
                break;

                case '/':
                dresult = Divide(number1number2);
                break;
                
            }

            WriteLine();

            WriteLine($"{number1} {opr} {number2} = {dresult}");

            WriteLine();

        }

        static double Add(double n1double n2)
        {
            return(n1 + n2);

        }

        static double Subtract(double n1double n2)
        {
            return(n1 - n2);
            
        }
        static double Multiply(double n1double n2)
        {
            return(n1 * n2);
            
        }
        static double Divide(double n1double n2)
        {
            if(n1 == 0 || n2 == 0return 0;

            return(n1 / n2);
            
        }
    }   
}

Kao što možete videti, navedeni program koristi 4 funkcije koje vraćaju vrednost. Svaka od ovih funkcija je tip double i svaka vraća vrednost double. S obzirom da ne možete deliti broj sa nulom; funkcija koja deli dva broja prvo proverava da li bilo koji od dva argumenta sadrži 0. Ako sadrži, onda vraća rezultat 0. Na ovaj način se mudro izbegava mogućnost da program napravi grešku. Ovaj program možete koristiti kao manji kalkulator. Ukoliko želite da kreirate i koristite funkciju Modulo, da dobijete ostatak od deljenja tada bi ste morali da napravite posebnu funkciju tipa integer. Taj izazov da malo proširite ovaj program u cilju vežbanja, ostavljam vama. Kad pokrenete navedeni program, rezultat će biti sličan u zavisnosti od unosa korisnika:

Enter the first number:
152.45
Choose the operator ( *, /, +, - ):
/
Enter the second number:
5.18

152.45 / 5.18 = 29.43050193050193
  
Kako to sve izgleda možete videti i na video-u:


( C# & .NET Core - 20. Return Function )













No comments:

Post a Comment