понедељак, 23. новембар 2015.

Iskazi odlučivanja u C# programskom jeziku



Iskazi odlučivanja su bazirani na uslovima. Bez obzira kakav je uslov definisan on se u programiranju uvek svodi na logičke operatore, true ili false. Jednostavno svaki uslov može biti ili ispunjen ili ne; tačan ili netačan. Nema možda, kao u stvarnom životu; jer je u kodu sve crno ili belo! Ako nije vaš kod će da prijavi grešku ili se uopšte neće ni pokrenuti. Takođe, skoro sva AI - Artificial Intelligence – veštačka inteligencija je bazirana na iskazima odlučivanja.



( If... else statement u C# programskom jeziku )

Programerska veština koja pravilno kombinuje i grana uslove u programiranju je mnogo bitnija stvar nego što se to i pretpostavlja kad se uči. Na bilo kom programerskom radnom mestu se podrazumeva da logiku uslovnog odlučivanja umete da iskombinujete do savršenstva. U nekim kompanijama postoje pravila, da na primer morate koristiti vitičaste zagrade { } u if... else iskazima i kad za to nema potrebe. Prvi iskaz za donošenje odluka u C# programskom jeziku jeste if… else… statment. Možete ga koristiti na tri načina:

if (condition)
           statement;

ili

if (condition)
           statement;

else 

           statement;
ili

if (condition)
          statement;

else if (condition)
          statement;

else
          statement;



Prvi način znači ako je logički uslov ispunjen, onda izvrši iskaz. Drugi način znači ako je logički iskaz ispunjen onda izvrši prvi iskaz ali ako nije izvrši drugi iskaz. Treći način je; ako je prvi uslov ispunjen izvrši iskaz, ako nije proveri da li je drugi uslov ispunjen i ako jeste izvrši iskaz. Ali ako obadva prethodna uslova ne ispunjavaju uslove onda izvrši zadnji iskaz. Naravno u trećem načinu korišćenja if… else iskaza vi niste ograničeni na jedan else if uslova, nego ih možete imati više. Prvi uslov if i zadnji uslov else može se pisati samo jednom u jednoj strukturi if... else strukture.

Kako da if uslovima nateram korisnika da unese pravu vrednost umesto da mu prijavljujem grešku?


Za pojavu greške se koristi try catch iskaz o kome ću pisati u nekom narednom postu, ali moguće je, čak i poželjno gde god je moguće da if iskazima onemogućite pojavu greške. Najbolje da analiziramo naredni kod programa:

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

namespace IfElseStatement
{
    class Program
    {
        static void Main(string[] args)
        {
            int number = 0;

jump:
            Write("Enter an integer from 0 to 100: ");
            bool num = Int32.TryParse(ReadLine(), out number);

            if (!num) goto jump;

            if (number < 0)
            {
                goto jump;

            }
            else if (number > 100)
            {
                goto jump;

            }
            else
            {
                WriteLine("\nYour entered value is passed test!");

            }

            ReadLine();
                           
        }
    }
}

Prva stvar koju će te primetiti u ovom kodu je metoda TryParse. U prethodnim postovima smo koristili Parse metodu za konvertovanje ulaza sa Command Prompt-a koji je uvek tipa string bez obzira koji vi karakter prosleđivali kao vrednost promenjivoj, ali metoda Parse će vam prijaviti grešku ukoliko prosledite neki karakter koji nije integer promenjivoj integer. Zato umesto Parse koristimo metodu TryParse tipa bool-ean koji sa svojim argumentima prosleđuje integer broj promenjivoj number ukoliko je korisnik uneo integer, ukoliko nije; neće proslediti vrednost ali umesto greške će proslediti promenjivoj num tipa bool-ean vrednost false i na osnovu toga mi znamo da li je korisnik uneo vrednost tipa integer.

int number = 0;
bool num = Int32.TryParse(ReadLine(), out number);

Druga bitna stvar, u ovom programu koristimo labelu jump za skakanje naredbom goto sa jedne linije koda na navedenu labelu. Ova labela može da se u suštini nazove kako god hoćete pod uslovom da ne koristite ključne reči C# programskog jezika i ne kršite pravila imenovanja labele. Pravljenje labele je jednostavno, samo stavite iza imena labele dvotačku : i kad god hoćete da skočite na navedenu labelu koristite naredbu goto bilo gde u kodu.

jump:
goto jump;

Imajte u vidu da se labele u C# programskom jeziku i projektima retko ili nikad ne koriste; to danas nije praksa i umesto labele se uglavnom koristi drugačiji pristup gde se koristi petlja. Kao što možete primetiti prvi if... else iskaz ima samo jedan uslov; ukoliko je promenjiva num false; znači korisnik nije uneo pravilnu vrednost; i ako nije uneo pravilnu vrednost onda se izvršavanje programa nastavlja skačući na labelu jump i na taj način se ponovo aktivira linija koda koja traži od korisnika da unese vrednost. Ukoliko uslov if... else iskaza nije ispunjena, tj. num je true; korisnik je uneo vrednost tipa integer, cela linija koda će biti jednostavno ignorisana.

if (!num) goto jump;

Ovo isto se mogli napisati i ovako:
if (num == false)
{
           goto jump;

}

Razlika je jedino da se po samom kodu vidi da li ste početnik ili iskusan programer. Kod uvek treba da pišete što kraće ukoliko to ne ide to te mere da postaje apsolutno nečitljiv. Drugi if... else uslov je složeniji ali ispituje više uslova.

     if (number < 0)
            {
                goto jump;

            }
            else if (number > 100)
            {
                goto jump;

            }
            else
            {
                WriteLine("\nYour entered value is passed test!");

            }    

Navedeni drugi if... else složeni iskaz odlučivanja se neće izvršiti ukoliko ispunjava uslov prethodnog prvog jednostavnog iskaza. Znači ako korisnik nije uneo vrednost tipa integer onda nema ni potrebe da se provera da li je broj manji ili veći od 0. Ovaj kod sam takođe mogao napisati i ovako:

if (number < 0 || number > 100) goto jump; else WriteLine("\nYour entered value is passed test!");

Ali onda vam ne bi mogao demonstrirati šta je else if uslov. Kad pokrenete program vaši rezultati će biti slični u zavisnosti kakvu ste vrednosti pokušali dodeliti promenjivoj number:

Enter an integer from 0 to 100: +
Enter an integer from 0 to 100: %
Enter an integer from 0 to 100: *
Enter an integer from 0 to 100: k
Enter an integer from 0 to 100: aaaa
Enter an integer from 0 to 100: \
Enter an integer from 0 to 100: Q
Enter an integer from 0 to 100: ...
Enter an integer from 0 to 100: -8
Enter an integer from 0 to 100: 105
Enter an integer from 0 to 100: 50

Your entered value is passed test!


Kako izgleda navedeni program možete pogledati i na video-u:


( C# 6.0 Tutorial - Fundamentals - 7. If... Else... Statement )

Šta je ternarni ?: operator?

Ternarni operator, kondicionalni ili uslovni operator je skraćeni prikaz if… else iskaza. Koristite ga u situacijama kad imate jednostavan if… else iskaz koji želite da vam vrati jednu ili drugu vrednost. Sintaksa je jednostavna:

condition? first expression : second expression

Imate uslov koji mora biti dodeljen nekoj promenjivoj; jednostavno iza uslova stavite upitnik ? i iza upitnika; dodelite vrednost kad je uslov ispunjen, dok iza dvotačke : navedite vrednost koju dodeljujete kad vrednost nije izvršena: Pogledajte isti program kao prethodni ali gde se koristi ternarni operator i gde su nešto profesionalnije ispisana uslovna odlučivanja.

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

namespace ConditionalOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            int number = 0;

jump:
            Write("Enter an integer from 0 to 100: ");
            bool num = Int32.TryParse(ReadLine(), out number);

            num = (!num || number < 0 || number > 100)? false : true;

            if (!num) goto jump; else WriteLine("\nYour entered value is passed test!");
                       
            ReadLine();

        }
    }
}

U navedenom kodu se zna da je vrednost bool-ean promenjive false ako korisnik ne unese pravilnu integer vrednost. Ali logičkim razmišljanjem se dodeljuje takođe vrednost false promenjivoj num ukoliko korisnik unese manji broj od 0 ili veći broj od 100. Tako num promenjiva postaje odgovorna za sva tri uslova. Tako se bool-ean promenjiva svodi na jednu vrednost, koja se jedina ispituje jednostavnim if... else iskazom prilikom određene akcije i na taj način se izbegava pisanje više granjanja u kodu. Uloga ternarnog ili kondicionalnog operatora u navedenom kodu je da dodeli istoj num promenjivoj vrednost false ukoliko unos korisnika ne ispunjava bilo koji od tri navedena uslova. Kad pokrenete ovaj program i ako unesete iste vrednosti kao što se uneli u prethodnom program, rezultati će biti identični.

Enter an integer from 0 to 100: +
Enter an integer from 0 to 100: %
Enter an integer from 0 to 100: *
Enter an integer from 0 to 100: k
Enter an integer from 0 to 100: aaaa
Enter an integer from 0 to 100: \
Enter an integer from 0 to 100: Q
Enter an integer from 0 to 100: ...
Enter an integer from 0 to 100: -8
Enter an integer from 0 to 100: 105
Enter an integer from 0 to 100: 50

Your entered value is passed test!


Kako izgleda navedeni program možete pogledati i na video-u:

 

( C# 6.0 Tutorial - Fundamentals - 8. Conditional Operator ?: )

Šta je null-coalescing ?? operator?

Za razliku od uslovnog operatora, null-coalescing operator ispituje samo uslov gde je vrednost jednaka null. To znači da null-coalescing operator vraća levu vrednost ukoliko levi operand nije null inače vraća desnu vrednost. Da bi ste koristili operator null-coalescing morate bar pretpostaviti da neka vrednost može biti null. Takođe meni nije poznat određen srpski prevod naziva ovog operatora, osim što ga zovemo nul-kolesking. Postoji dosta stvari u programiranju, posebno u software inženjeringu gde jednostavno ne možete nešto prevesti na srpski jezik. Takve pojmove samo izgovaramo na engleskom jeziku ali znamo čemu služe u kodu. Pogledajte ovaj program i biće vam jasnije kako se koristi null-coalescing operator.

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

namespace NullCoalescingOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            Write("Enter the domain name or don't enter anything: ");
            string word = ReadLine();

            /* You never do this in your code,
               I just improvise a string that is null value */
          
            word = (word == String.Empty) ? null : word;

            WriteLine("\n");

            // This is case where use ?? operator

            WriteLine(word ?? "Unspecified domain name!");

            ReadLine();

        }
    }
}

Naredni kod improvizuje da je vrednost promenjive word null ako niste zadali nikakvu vrednost. Vrednost null nije isto što i 0 ili prazan string ili prazan prostor. To je u programiranju posebna vrednost. U navedenom kodu je dodeljena vrednost promenjivoj word tipa string samo da bi se improvizovao kako se koristi null-coalescing operator. To se inače ne radi. Upotrebu null-coalescing operatora u navedenom primeru koristimo da zadamo neku vrednost stringu ukoliko ona nema nikakvu vrednost, tačnije ako joj je vrednost null.

Ukoliko pokrenete program vaš rezultat će biti ovakav ako ne unesete nikakvu vrednost.

Enter the domain name or don't enter anything:
 

Unspecified domain name!

Kako izgleda navedeni program možete pogledati i na video-u:




 

( C# 6.0 Tutorial - Fundamentals - 9. Null-Coalescing Operator ?? )

Šta je Elvis ?. operator?

Elvis operator ili null propagation operator ili null-conditional operator ili safe navigation operator koji se označava sa ?. vam je najnoviji operator koji je došao u C# programski jezik sa verzijom 6.0. Imate ga naravno i u drugim programskim jezicima poput Groovy programskog jezika. On proverava null vrednost nekog člana ili indeks nekog niza. Ovaj operator pomaže da se kraće piše kod gde se proverava null vrednost i posebno je koristan za ispitivanje null vrednosti u dubljim strukturama podataka. Da bi vam što jasnije bilo, neophodno je da se u kodu u najmanjem slučaju koristi struktura u programu iako još nije pisan post o strukturama, bar kad je C# programski jezik u pitanju. Šta je struktura u C++ programskom jeziku možete pogledati ovde. Za sada strukturu shvatite kao da koristite neki vašu lični objekat koji ima članove. Pogledajte naredni kod programa kako se koristi Elvis ?. operator i kako se koristi zajedno sa prethodnim ?? null-coalescing operatorom.

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

namespace ElvisOperator
{
    class Program
    {
        public struct Person
        {
           public string Name;
           public string Address;
           public string City;

        }

        static void Main(string[] args)
        {
            Person Client = new Person();

            Client.Name = "Manuel";
            Client.City = "Belgrade";

            WriteLine("?. operator\n");

            // using ?. operator
            int? lenghtName = Client.Name?.Length;
            int? lenghtAddress = Client.Address?.Length;
            int? lenghtCity = Client.City?.Length;

            WriteLine($"\nThe lenght of the client's name: {lenghtName}");
            WriteLine($"The lenght of the client's address: {lenghtAddress}");
            WriteLine($"The lenght of the client's city: {lenghtCity}");

            // using ?. operator with ?? operator together
            lenghtName = Client.Name?.Length ?? 0;
            lenghtAddress = Client.Address?.Length ?? 0;
            lenghtCity = Client.City?.Length ?? 0;

            WriteLine("\n?. null conditional operator with ?? null coalescing operator\n");

            WriteLine($"\nThe lenght of the client's name: {lenghtName}");
            WriteLine($"The lenght of the client's address: {lenghtAddress}");
            WriteLine($"The lenght of the client's city: {lenghtCity}");
    
            ReadLine();

        }
    }
}

U navedenom kodu imate strukturu Person koja ima sve javne članove tipa string: Name, Address i City. Kad nekom od članova strukture ne dodate neku vrednost, ona automatski ima vrednost null. U ovom primeru Client tipa Person ima član Address tipa string koji nije inicijalizovan. Znači njegova vrednost je null. Elvis operatori proveravaju sva tri člana, jedan po jedan; da li neki od njih ima vrednost null i ako neki član ima vrednost null, on istu vrednost prosleđuje promenjivoj koja inicijalizuje tog člana. Inače vraća lenght, dužinu člana. Tako će te primetiti da klijent u navedenom kodu nema adresu i kad nema adresu njegova adressa ne sadrži ni jedan karakter ili prazan prostor. Ali zbog korišćenja Elvis operatora dužina adresa klijenta ne sadrži dužinu 0 već null. U nastvaku koda kada se Elvis operatorima pridruži null-coalescing operatori, dužini adrese sa vrednošću null se dodeljuje 0. I sve se to postiže bez korišćenja if... else iskaza. Kad pokrenete navedeni program vaši rezultati će pokazati da je adresa klijenta null (ništa), zatim da je 0.

?. operator

The lenght of the client's name: 6
The lenght of the client's address:
The lenght of the client's city: 8

?. null conditional operator with ?? null coalescing operator

The lenght of the client's name: 6
The lenght of the client's address: 0
The lenght of the client's city: 8


Kako izgleda navedeni program možete pogledati i na video-u:

 

( C# 6.0 Tutorial - Fundamentals - 10. Elvis Operator ?. )

Šta je switch... case iskaz odlučivanja?

Postoje situacije gde su višestruka grananja takva da se izbor jedne od više mogućih alternativa vrši na osnovu neke vrednosti promenjive ili izraza. Pored if… else iskaza u C# programskom jeziku kada se koristi više uslova; efikasnije i čitljivije je koristiti switch... case iskaz.





( Switch... case statement u C# programskom jeziku )


Sintaksa Switch... case iskaza je:

switch (expression)

         case constant-expression : 
                 statement; 
                 break; 

         case constant-expression :       
                 statement; 
                 break;
         . . .

default :  

               statement;
               break;

}


Iskaz switch... case se jedino može koristiti kod tipa promenjive char, string i integer. Za ostale tipove će te morati koristiti if… else  iskaz. Case konstante ili case labele su konstante i ne mogu se koristiti za izračunavanja. Takođe, case labele ne mogu imati istu vrednost. Pogledajte sledeći kod programa koji koristi iskaz switch... else.

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

namespace SwitchStatement
{
    class Program
    {
        static void Main(string[] args)
        {
            int month = 0;

jump:
            Write("Enter the number of month from 1 to 12: ");
            bool num = Int32.TryParse(ReadLine(), out month);

            if (!num) goto jump;

            switch (month)
            {
                case 1:
                    WriteLine("January");
                    break;

                case 2:
                    WriteLine("February");
                    break;

                case 3:
                    WriteLine("March");
                    break;

                case 4:
                    WriteLine("April");
                    break;

                case 5:
                    WriteLine("May");
                    break;

                case 6:
                    WriteLine("June");
                    break;

                case 7:
                    WriteLine("July");
                    break;

                case 8:
                    WriteLine("August");
                    break;

                case 9:
                    WriteLine("September");
                    break;

                case 10:
                    WriteLine("Oktober");
                    break;

                case 11:
                    WriteLine("November");
                    break;

                case 12:
                    WriteLine("December");
                    break;

                default:
                    goto jump;

            }

            ReadLine();

        }
    }
}

Kad pokrenete navedeni program rezultat će biti jedan od meseci u godini ukoliko ste pravilno uneli vrednost, tj. broj od 1 do 12.

Enter the number of month from 1 to 12: +
Enter the number of month from 1 to 12: 50
Enter the number of month from 1 to 12: ]
Enter the number of month from 1 to 12: -5
Enter the number of month from 1 to 12: #
Enter the number of month from 1 to 12: abb
Enter the number of month from 1 to 12: 9
September


Kako izgleda navedeni program možete pogledati i na video-u:

 

( C# 6.0 Tutorial - Fundamentals - 11. Switch... Case... Statement )