уторак, 01. децембар 2015.

Nizovi u C# programskom jeziku


Najjednostavnije rečeno, niz vam je indeksiran skup podataka istog tipa. Indeks nizova uvek počinje od 0. Nizovi se dele na jednodimenzionalne i višedimenzionalne nizove. Kad pravite nizove u C# programskom jeziku, vama oni izgledaju slično kao u C ili C++ programskom jeziku ali oni to definitivno nisu. Nizove u C++ programskom jeziku možete pogledati ovde. U C i C++ programskom jeziku ime nekog niza samo predstavlja pokazivač memorijske adrese, dok indeks niza predstavlja samo relativnu poziciju navedene adrese. I pored toga što su nizovi u C i C++ programskom bili fleksibilni, lako su pravili greške jer nisu pratile veličinu niza što je dovodilo i do oštećenja podataka. U programskom jeziku Visual Basic, niz je čak u osnovi predstavljao promenjivu tipa SAFEARRAY, što znači da rad sa nizom je podrazumevao izvesno angažovanje sistema ali zato je olakšavao rad sa nizovima. I ono je bilo bolje nego nizovi u C i C++ programskom jeziku. Zato je C# prevazišao nedostatke programskog jezika C i C++ i nizove od starta tretira kao objekte sa metodama i svojstvima uključujući i granice. Ali i na taj način opet podržava nizove u formi izričitog različitog tipa.


( Nizovi u C# programskom jeziku prikazani mapom uma )

Za razliku od nizova u C i C++ programskom jeziku, u C# programskom jeziku prilikom deklarisanja niza se u pozadini pravi primerak .NET bazne klase System.Array. Znači, C# kompajler vaš kod prevodi u razne pozive metoda klase System.Array i zbog toga nizovi u C# programskom jeziku imaju neke dodatne funkcije koje u drugim navedenim jezicima nisu postojale. Sintaksa niza u C# je sledeća:

Jednodimenzionalan niz:
tip [] naziv_niza;

Dvodimenzionalni niz:
tip [ , ] naziv_niza;

Višedimenzionalan niz:
tip [ , , … ] naziv_niza;

Ortogonalni niz:
tip [ ] [ ] naziv_niza:


Nemojte mešati nizove u C# programskom jeziku sa nizovima u C i C++ programskom jeziku.



int[] array; // it is not like as in C/C++ … int array[];

Rad sa jednodimenzionalnim nizom

Za inicijalizovanje niza konkretnih dimenzija koristi se ključna reč new i dimenzionisanje. Ključna reč new prilikom inicijalizacije se koristiti jer je niz u C# programskom jeziku objekat. Npr. ovako se inicijalizuje jednodimenzionalni niz od 5 elemenata.

int[] array = new int[5];

            array[0] = 1;
            array[1] = 2;
            array[2] = 3;
            array[3] = 4;
            array[4] = 5;

Ali navedeni kod se može napisati i jednostavnije:

int[] array = { 1, 2, 3, 4, 5 };

Ali najbolje da pogledate kod celog programa koji koristi jednodimenzionalan niz.

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

namespace OneDimensionalArray
{
    class Program
    {
        static void Main(string[] args)
        {
            byte numberNames = 0;
            bool correct = false;
            string[] names;

            do
            {              
                Write("How much names you wish to enter in an array? ");
                correct = byte.TryParse(ReadLine(), out numberNames);

            } while (!correct);

            names = new string[numberNames];

            for (byte i = 0; i < numberNames; i++)
            {
                Write($"Enter {i + 1} of {numberNames} names: ");
                names[i] = ReadLine();

            }

            Array.Sort(names);

            WriteLine();

            foreach (string item in names)
            {
                WriteLine(item);

            }
           
            ReadKey();

        }
    }
}

Kao što možete i po kodu pretpostaviti, vi prvo pitate korisnika koliko imena hoće da unese u jednodimenzionalan niz. To je neophodno jer nedefinisan niz u C# programskom jeziku ne dozvoljava da naknadno unosite elemenat po elemenat od korisnika. Ukoliko ne želite da korisnik definiše koliko će uneti elemenata u niz, onda možete da koristite liste o kojima će biti pisano u narednim postovima. Međutim vi možete da dimenzionišete niz promenjivom. Kad znamo koliko će niz imati elemenata onda za unos elemenata možemo koristiti i for petlju. Takođe obratite pažnju kako se sortira niz kroz metodu Array.Sort koju možete koristiti zahvaljujući uključenom imenskom prostoru System. Zatim kroz foreach petlju prikazujemo sortirana imena koja je korisnik uneo. Ovu metodu ne možete koristi za višedimenzionalne nizove ili ako jednodimenzionalan niz nije dimenzioniran. Kad izvršite navedeni program, rezultat će biti sortirana imena koja ste uneli.

How much names you wish to enter in an array? 5
Enter 1 of 5 names: Manuel
Enter 2 of 5 names: Lennon
Enter 3 of 5 names: Richard
Enter 4 of 5 names: Harrison
Enter 5 of 5 names: John

Harrison
John
Lennon
Manuel
Richard


Takođe obratite pažnju da umesto metode ReadLine() koristimo drugu metodu imenskog prostora Console; ReadKay() koja služi za čitanje pritisnutog tastera; ali je ovde korišćena za zadržavanje ekrana Command Prompt-a. Kako navedeni program izgleda možete pogledati i na video-u:

 

( C# 6.0 Tutorial - Fundamentals - 16. Onedimensional Array )

Višedimenzionalni nizovi


Za razliku od jednodimenzionalnih nizova, višedimenzionalni nizovi u C# programskom jeziku mogu biti pravougaoni nizovi koje zovemo matrica ili ortogonalni nizovi koje zovemo jagged – testerasti nizovi. Pravougaoni nizovi su nizovi koji imaju isti broj i redova i kolona, dok su ortogonalni nizovi oni u kojima svaki red može imati drugačiji broj kolona. Takvi nizovi su vam u suštini nizovi u nizu i retko se upotrebljavaju jer ih je teško inicijalizovati. Takođe prolaskom kroz svaki red vi morate koristiti i metodu GetLenght() niza da bi ste dinamički odredili broj kolona kroz koje treba proći. Pogledajte sledeći program, i obratite pažnju kako se koristi testerasti niz.


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

namespace MultidimensionalArray
{
    class Program
    {
        static void Main(string[] args)
        {
            bool correct = false;
            byte numberTeams = 0;
            byte numberMembers = 0;
            byte[,] numberTeamsMembers;

            do
            {
                    Write("How many programmer teams are in the company? ");
                    correct = byte.TryParse(ReadLine(), out numberTeams);

            } while (!correct);

            numberTeamsMembers = new byte[numberTeams, 2];
            WriteLine();

            correct = false;
            for (byte i = 0; i < numberTeams; i++)
            {
                do
                {
                    Write($"How many members in {i + 1} team? ");
                    correct = byte.TryParse(ReadLine(), out numberMembers);
                    if (correct)
                    {
                        numberTeamsMembers[i, 0] = (byte)(i + 1);
                        numberTeamsMembers[i, 1] = numberMembers;

                    }
                   
                } while (!correct);
            }

            WriteLine($"\nYour company have {numberTeams} teams with next number of memembers:\n");

            for (byte i = 0; i < numberTeams; i++)
            {
                    WriteLine($"Team {numberTeamsMembers[i,0] }, Members {numberTeamsMembers[i,1] }");

            }

            WriteLine();

            // initialisation jagged array
            string[][] programers = new string[numberTeams][];

            for (int i = 0; i < numberTeams; i++)
            {
                programers[i] = new string[numberTeamsMembers[i, 1]];

                for (int j = 0; j < numberTeamsMembers[i, 1]; j++)
                {
                    Write($"Enter the name of {j + 1} member in { i + 1} team: ");
                    programers[i][j] = ReadLine();

                }
            }

            WriteLine();

            // read data from jagged array
            for (int i = 0; i < programers.Length; i++)
            {
                Write($"Names from {i + 1} team are: ");

                for (int j = 0; j < programers[i].Length; j++)
                {

                   Write(programers[i][j] + ", ");

                }
                   WriteLine();

            }

            ReadKey();
                   
        }
    }
}

Program prvo zahteva od korisnika da navede koliko ima programerskih timova u kompaniji, zatim koliko svaki tim ima članova i na osnovu tih podataka se inicijalizuje jagged niz u koji se direktno unose imena programera u tačnom broju koliko određeni tim ima članova. Ovakav zadatak se može rešiti na više načina, međutim u ovakvim situacijama je poželjno koristiti jagged niz. Program ne obuhvata i sortiranje imena pre unosa u testerasti niz zbog svoje kompleksnosti. Biće odlično ako i navedeni kod razumete u potpunosti. Takođe obratite pažnju da je u ovom kodu korišćen i operator za kastovanje:

numberTeamsMembers[i, 0] = (byte)(i + 1);

S obzirom da ( i + 1 ) nije definisana niti deklarisana vrednost, niti uvećava promenjivu i za 1 nego uvećanja vrednost za 1 je samo prikaz promenjive uvećan za 1 i to tipa integer bez obzira što je i tipa byte; neophodno je isti kastovati u tip byte jer je niz tipa byte. Casting – kasting nekog tipa vam je eksplicitno konvertovanje jednog tipa podataka u drugi. Bez obzira sad što vam ovo sve zvuči komplikovano, samo programiranjem će te videti da je u suštini jednostavno. Kad pokrenete navedeni program rezultati će zaviti od vašeg unosa podataka.

How many programmer teams are in the company? 3
 

How many members in 1 team? 3
How many members in 2 team? 2
How many members in 3 team? 4

Your company have 3 teams with next number of memembers:

Team 1, Members 3
Team 2, Members 2
Team 3, Members 4

Enter the name of 1 member in 1 team: Sandra
Enter the name of 2 member in 1 team: Sonia
Enter the name of 3 member in 1 team: Manuel
Enter the name of 1 member in 2 team: Linda
Enter the name of 2 member in 2 team: Alex
Enter the name of 1 member in 3 team: Mathew
Enter the name of 2 member in 3 team: John
Enter the name of 3 member in 3 team: Paul
Enter the name of 4 member in 3 team: George

Names from 1 team are: Sandra, Sonia, Manuel,
Names from 2 team are: Linda, Alex,
Names from 3 team are: Mathew, John, Paul, George,


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


( C# 6.0 Tutorial - Fundamentals - 17. Multidimensional Array )