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 )
U 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(firstName, middleName, lastName);
}
static void FullName( string fname, string mname, string 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.0D, number2 = 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(number1, number2);
break;
case '-':
dresult = Subtract(number1, number2);
break;
case '*':
dresult = Multiply(number1, number2);
break;
case '/':
dresult = Divide(number1, number2);
break;
}
WriteLine();
WriteLine($"{number1} {opr} {number2} = {dresult}");
WriteLine();
}
static double Add(double n1, double n2)
{
return(n1 + n2);
}
static double Subtract(double n1, double n2)
{
return(n1 - n2);
}
static double Multiply(double n1, double n2)
{
return(n1 * n2);
}
static double Divide(double n1, double n2)
{
if(n1 == 0 || n2 == 0) return 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