Սովորում ենք C# | Զանգվածներ
Tags: csharp, dotnet, beginners, armenian
Published: 2020-03-21 20:01:58

Նախկինում ուսումնասիրել ենք C#-ում տվյալների պահպանման համար նախատեսված գործիքակազմը՝ ի դեմս պարզագույն տիպերի փոփոխականների։ Այժմ ժամանակն է ծանոթանալ ինֆորմատիկայի մեջ լայն կիրառություն ունեցող մեկ այլ գործիքի՝ զանգվածների։ 

**Զանգվածն** (*array*) իրենից ներկայացնում է նույն անվան տակ խմբավորված փոփոխականների հավաքածու։ Այն հնարավորություն է տալիս հիշողության մեջ պահել նույն տիպի ցանկացած քանակի փոփոխական՝ դրանք հասցեավորելով հերթական համարներով։

Եթե մեզ հարկավոր է պահել տասը անուն, հնարավոր է հայտարարել տասը արանձին փոփոխական և դրանց տալ համապատասխան արժեքներ՝
```c#
string str1 = "Alpha";
string str2 = "Bravo";
string str3 = "Charlie";
string str4 = "Delta";
// և այլն․․․
```

Սակայն այս մեթոդն այնքան էլ արդյունավետ չէ՝ որոշ դեպքերում մեզ կարող են պետք գալ շատ մեծ թվով կամ նույնիսկ անհայտ քանակով փոփոխականներ։ Զանգվածների կիրառմամբ նույն խնդրի լուծումը կունենա հետևյալ տեսքը՝
```c#

// Զանգվածի հայտարարումը նման է փոփոխականի հայտարարմանը
// Ավելացվում է միայն [] փակագծերի զույգը
// int number   - Integer տիպի մեկ փոփոխական
// int number[] - Integer տիպի փոփոխականների զանգված


string words[] = {"Alpha", "Bravo", "Charlie", "Delta", "Echo"} // և այլն․․․

// Զանգվածի կոնկրետ փոփոխական կարդալու կամ փոփոխելու համար 
// օգտագործվում է դրա հերթական համարը (index)
// Հերթական համարները ինֆորմատիկայում սովորաբար սկսվում են 0֊ից

words[0] // Alpha
words[1] // Bravo
words[2] = "New name"
// words[] = {"Alpha", "Bravo", "New Name", "Delta", "Echo"}

words[3] = words[2];
// words[] = {"Alpha", "Bravo", "New Name", "New Name", "Echo"}
```

Զանգված հայտարարելիս ձևավոր փակագծերի ներսում արժեքների նշումը կոչվում է զանգվածի **սկզբնական արժեվորում** (*initialization*)։ Եթե մեզ դեռևս հայտնի չեն սկզբնական արժեքները, կարելի է փոխարենը զանգվածը հայտարարել միայն տիպը և չափը նշելով։ 
```c#
float numbers[] = new float[10];
string names[] = new string[100];
```

Զանգվածը կարելի է հայտարարել նաև նշելով և՛ երկարությունը, և՛ տարրերը։
```c#
int numbers[] = new int[5] {0, 13, -4, 24, 6};
```


Կոնկրետ չափով զանգված ստեղծելիս հարկավոր է հաշվի առնել, որ քանակը հաշվվում է 1-ից, իսկ հերթական համարները՝ 0-ից։ Այսինքն, `int numbers[] = new int[10];` հրամանով ստեղծված զանգվածը սկսվում է `numbers[0]`-ից և ավարտվում `numbers[9]`-ով (տարրերի ընդհանուր քանակը՝ 10)։ 

Զանգվածի սահմաններից դուրս գտնվող հերթական համար օգտագործելու դեպքում ծրագիրը կհանգի `IndexOutOfRangeException` կոչվող սխալի (Exception-ներին և դրանց տեսակներին կանդրադառնանք ավելի ուշ)։

### Բազմաչափ զանգվածներ

Որոշ խնդիրների լուծման ժամանակ անհրաժեշտ է լինում օգտվել հերթական համարներով տվյալներ հայթայթելու և պահպանելու հարմարությունից, սակայն մեկ չափանի զանգվածները չեն բավականացնում։ Այս պարագայում օգտագործվում են **բազմաչափ զանգվածներ** (*multi-dimensional array*)։

Նման խնդրի օրինակ կարող է հանդիսանալ շախմատի տախտակի մոդելավորումը ծրագրի մեջ՝ 64 առանձին փոփոխական հայտարարելն ընդհանրապես էֆեկտիվ չէ, 8 տարր պարունակող 8 տարբեր զանգված հայտարարելը նույնպես։ Փոխարենը կարող ենք օգտագործել երկչափանի զանգված՝
```c#
// Բազմաչափ զանգված հայտարարելիս քառակուսի փակագծերում ներառվում է ստորակետ
// Ստորակետների քանակը մեկով պակաս է զանգվածի չափումների քանակից
// string[]   - 1D array
// string[,]  - 2D array
// string[,,] - 3D array

string[ , ] board = new string[8, 8];
board[0, 0] = "HOOK";
board[0, 1] = "KNIGHT";
board[0, 2] = "BISHOP";

```

Հարկ է նշել, որ բազմաչափ զանգվածները լինում են երկու տեսակի՝
* Ուղղանկյուն զանգվածներ (*rectangular array*)
* Անհարթ զանգվածներ (*jagged array*)

Այս տեսակների տարբերությունը կայանում է հետևյալում, ուղղանկյունաձև զանգվածի շարքերը պարունակում են հավասար թվով տարրեր, մինչդեռ անհարթ զանգվածն իրենից ներկայացնում է զանգվածներով լի զանգված (այսինքն, զանգված, որի տարրերը նույնպես զանգվածներ են)։ Ընդ որում, ամեն շարք ներկայացնող զանգվածները կարող են ունենալ տարբեր թվով տարրեր։

Կախված տեսակից, փոխվում է հայտարարման գրելաձևը՝
```c#
int[,] rectNumbers = new int[5,3];     // Ուղղանկյունաձև
int[][] jaggedNumbers = new int[5][3]; // Անհարթ

// Անհարթ զանգված հայտարարելիս հնարավոր է դատարկ թողնել երկրորդ չափման երկարությունը
int [][] newJaggedArray = new int[4][];
newJaggedArray[0] = new int[1];
newJaggedArray[1] = new int[5];
newJaggedArray[2] = new int[3];
newJaggedArray[3] = new int[4];
/* Մեր անհարթ զանգվածն ունի հետևյալ տեսքը (X-ով նշված են int տիպի տարրերը)
X
X X X X X
X X X
X X X X
*/

// Անհարթ եռաչափ զանգված ստանալու համար հնարավոր է համատեղել անհարթ և ուղղանկյուն զանգվածներ
int [][,] 3dArray= new int[3][,]
{
    new int[,] { {5, 2}, {0, -1} },
    new int[,] { {11, 133 , 5}, {6, 7, 5} },
    new int[,] { {90}, {5} }
}
```

Զանգվածների հիմնական հատկություններից մեզ հաճախ հետարքրքում է նրա երկարությունը (տարողունակությունը), որը պահվում է զանգվածի `Length` դաշտում (թե ինչ է օբյեկտի դաշտը, կտեսնենք օբյեկտ-կողմնորոշված ծրագրավորում և կլասսներ ուսումնասիրելիս)։ 
```c#
int[] numbers = new int[5];
// numbers.Length արտահայտությունը կվերադարձնի 5

int[,] numbers = new int[3, 4];
// numbers.Length-ը կվերադարձնի 12
```

### Ամփոփում

Այս անգամ ծանոթացանք զանգվածների հետ։ 
* Հասկացանք դրանց կիրառությունը
* Աշխատեցինք միաչափ և բազմաչափ զանգվածների հետ
* Սովորեցինք դրանց հայտարարման և սկզբնական արժեվորման հնարավոր գրելաձևերը
* Հասկացանք բազմաչափ զանգվածների տեսակները և դրանց տարբերությունը