CodeGym /Kurslar /C# SELF /Massivlərlə tanışlıq

Massivlərlə tanışlıq

C# SELF
Səviyyə, Dərs
Mövcuddur

1. Massiv — elementlərin konteyneridir

Yəqin ki, eşitmisən, kompüterlər nəhəng həcmdə informasiyanı emal edə bilir. Şərt operatoru (if-else) və dövrlər (for, while) əlbəttə, bu işdə kömək edir. Amma təkcə bunlarla uzağa getmək olmur, çünki işlədiyimiz məlumatları haradasa saxlamaq lazımdır.

Bu halda C#-da, demək olar ki, bütün proqramlaşdırma dillərində olduğu kimi, massivlər (Array) adlı əla bir şey var. Onlara bəzən cədvəl də deyirlər.

Massiv — bu, xüsusi bir obyektir ki, burada tək bir dəyər yox, bir neçə dəyər saxlamaq olar.

Arrays (Array) C#

Əvvəllər dəyişəni qutuya bənzədirdiksə (orada hansısa bir dəyər saxlamaq olurdu), massiv isə daha çox içi bölmələrə ayrılmış bir qutudur. Hər bölmənin “qutu-massivdə” öz nömrəsi var. Nömrələmə, təbii ki, sıfırdan başlayır...

Başqa bir analogiya da aparmaq olar. Gəlin adi bir evi və çoxmərtəbəli binanı müqayisə edək. Adi evdə bir ailə yaşayır, çoxmərtəbəli bina isə mənzillərə bölünüb. Adi evdə yaşayan ailəyə məktub yazmaq üçün onun unikal ünvanını göstərmək lazımdır. Amma mənzildə yaşayan ailəyə məktub yazmaq üçün evin ünvanı və üstəlik mənzilin nömrəsini göstərmək lazımdır.

Yəni, massiv dəyişəni — çoxmərtəbəli bina kimidir. Orada bir yox, bir neçə dəyər saxlamaq olur. Belə dəyişəndə bir neçə mənzil (hüceyrə) var, hər birinə onun nömrəsi (indeksi) ilə müraciət etmək olar.

Bunun üçün dəyişənin adından sonra kvadrat mötərizədə müraciət etdiyimiz hüceyrənin indeksini göstərmək lazımdır. Bu, kifayət qədər sadədir:


array[indeks] = dəyər;
Massivin hüceyrəsinə indekslə dəyər təyin etmək

Burada array — massiv dəyişənin adı, indeks — massivdəki hüceyrənin nömrəsi, dəyər isə həmin hüceyrəyə yazmaq istədiyimiz dəyərdir.

Amma gəlin əvvəlcə massivləri necə yaratmaq olar, ona baxaq.

2. C#-da elementlər massivinin yaradılması

C#-da elementlər massivinin yaradılması

Tutaq ki, proqramında 100 tam ədədi haradasa saxlamaq lazımdır. Yəqin ki, bunun üçün massiv uyğun olardı. Bəs onu necə yaradaq?

Əgər bir tam ədəd saxlamaq istəsəydik, int tipi uyğun olardı, amma 100 tam ədəd saxlamaq istəyiriksə, yəqin ki, int tipli massiv lazımdır. Onun yaradılması üçün kod belə olacaq:

int[] array = new int[100];
100 tam ədədli massiv yaradılması

Gəlin baxaq, burada nə yazılıb.

Yəqin artıq başa düşmüsən, bərabərlik işarəsinin solunda array adlı dəyişənin elan olunması və int[] tipi var. int tipindən sonra kvadrat mötərizələr gəlir, bu da göstərir ki, bu “qutuda” bir yox, bir neçə dəyər saxlamaq olar.

Bərabərlik işarəsinin sağında isə “obyektin yaradılması” (söz new) və 100 elementli (hüceyrəli) int tipli massiv var. Çox da çətin deyil.

Məsələn, 20 hüceyrəlik real ədədlər üçün massiv yaratmaq istəsəydik, kod belə olardı:

double[] vals = new double[20];
20 real ədədli massiv yaradılması

Massivin hüceyrələrinin sayına massivin ölçüsü və ya massivin uzunluğu deyilir. Bir çox dəyər saxlamaq qabiliyyətinə görə massivlərə bəzən konteyner də deyirlər.

Vacib fakt: massiv konteynerinin ölçüsünü yaradıldıqdan sonra dəyişmək olmaz.

Yeni yaratmaq olar, amma artıq yaradılmış konteynerin uzunluğunu dəyişmək mümkün deyil.

3. Massivin hüceyrələri ilə iş

Massivin hüceyrələri ilə iş

Yaxşı, massiv yaratmağı öyrəndik, bəs onlarla düzgün necə işləmək olar?

Demək olar ki, adi dəyişənlərlə işlədiyimiz kimi, sadəcə massiv dəyişənin adından sonra mütləq işlədiyimiz hüceyrənin nömrəsini göstərmək lazımdır.

Massivin hüceyrələrinin nömrələnməsi həmişə sıfırdan başlayır. Əgər 10 elementli massivimiz varsa, hüceyrələrin nömrələri (indeksləri) 0..9, əgər 200 elementli massivdirsə, 0..199. Və s.

Nümunələr:

int[] a = new int[10];	// 10 elementli int tipli massiv yaradırıq.

a[2] = 4;				// 2 indeksli hüceyrəyə 4 dəyəri yazırıq.

a[7] = 9;				// 7 indeksli hüceyrəyə 9 dəyəri yazırıq.

a[9] = a[2] + a[5];		// 9 indeksli hüceyrəyə 2-ci və 5-ci hüceyrələrdəki dəyərlərin cəmini yazırıq 	
                        // (2-də 4 var) və 5-də (0 var). 

Bu kod icra olunduqdan sonra yaddaşda belə saxlanacaq:

Working with int array cells

Massivin solundakı sütun (boz rəngdə) — hüceyrələrin nömrələridir (indekslər). Hüceyrələrdə yazılmış dəyərlər saxlanılır: 4, 9 və 4. Massiv yaradıldıqdan dərhal sonra bütün hüceyrələr sıfırla doldurulur.

Vacibdir. Bütün massiv hüceyrələri eyni tipdə olur. Əgər string massiv yaratmışıqsa, orada yalnız sətir saxlamaq olar. Massivin tipi yaradılarkən təyin olunur. Nə massiv tipini, nə də uzunluğunu sonradan dəyişmək olmaz.

4. Massivlər yaddaşda

Əvvəlki nümunələrdəki şəkillər bir az dəqiq deyil.

Massivlər yaradılarkən (sətirlər kimi) yaddaşda iki blok ayrılır: biri massivin (konteynerin) özü üçün, digəri isə onun ünvanını saxlayan dəyişən üçün. Dəqiq vəziyyət aşağıdakı şəkildə göstərilib:

Arrays in memory

Yaşıl rəngdə 10 elementli int tipli massiv və int[] tipli dəyişən göstərilib, hansı ki, yaddaşda int tipli massivə ünvan (referans) saxlayır.

Müqayisə üçün mavi rəngdə adi int tipli dəyişən göstərilib, hansı ki, 199 dəyərini saxlayır.

Bir az sətirlərin yaddaşda saxlanmasına bənzəyir, elə deyilmi?

Düzdür, sətirlər. Və sətirlərlə işləyərkən olduğu kimi, “massiv tipli dəyişənləri” bir-birinə təyin etmək olar:

int[] a = new int[10];		// 10 elementli int tipli massiv yaradırıq.

a[2] = 4;					// 2 indeksli hüceyrəyə 4 dəyəri yazırıq.
a[7] = 9;					// 7 indeksli hüceyrəyə 9 dəyəri yazırıq.

int[] b = a;				// b dəyişəninə a dəyişənindəki ünvanı saxlayırıq.
                            // İndi a və b eyni massiv obyektinə işarə edir.

a[9] = b[2] + a[7];			// massiv obyektinin 9 indeksli hüceyrəsinə, 
                            // 2-ci (4 var) və 7-ci (9 var) hüceyrələrdəki dəyərlərin cəmini yazırıq. 

Bu zaman massiv obyekti olduğu yerdə qalır, a və b dəyişənləri isə eyni ünvanı (referansı) saxlayır. Şəkilə bax:

Arrays in memory 2

5. Massivlərlə daha detallı iş

Massivi istənilən tipdən yaratmaq olar. Bunun üçün tipin adından sonra kvadrat mötərizə yazmaq kifayətdir. Massivin yaradılmasının ümumi forması belədir:

tip[] ad = new tip[say];
Massivin yaradılmasının kanonik forması

Burada tip — massivdə saxlayacağımız elementlərin (hüceyrələrin) tipi, ad — massivə müraciət edəcəyimiz dəyişənin adı, say isə massivdəki hüceyrələrin sayıdır.

Yuxarıdakı nümunədə kanonik forma göstərilib: massiv dəyişənin yaradılması və massiv obyektinin yaradılması. Əslində bunlar iki müstəqil konstruksiyadır. Massiv dəyişəni və massiv obyektini ayrıca yaratmaq olar:


tip[] ad;
ad = new tip[say];
        
Dəyişəni və massivi ayrıca yaradırıq

Və daha bir vacib məqam

Massivin indeksi və massivdəki elementlərin sayı kimi dəyişənlər və hətta tam ifadələr istifadə oluna bilər.

Nümunələr:

int n = 100;
int[] a = new int[n];			// 	n elementli massiv yaradılması

int n = 100;
int[] a = new int[n * 2 + 3];	// 	203 elementli massiv yaradılması

int n = 100;
int[] a = new int[n];
a[n-1] = 2;					// a[99] = 2;
a[n-2] = 3;					// a[98] = 3;
a[n/5] = a[n-1] + a[n-2];	// a[20] = a[99] + a[98];

Massivin sərhədlərindən kənara çıxmaq

Yeri gəlmişkən, diqqət et ki, əgər massivdə olmayan indekslə hüceyrəyə müraciət etsən (bizim halda 0..99 istisna olmaqla bütün tam ədədlər), proqram IndexOutOfRangeException — massiv sərhədlərindən kənar indeks xətası ilə qəza verəcək.

6. Massivin uzunluğu

Əvvəlki nümunədə gördüyümüz kimi, massiv tipli dəyişəni ayrıca yaratmaq və sonra kodda ona massiv obyektinin ünvanını təyin etmək olar. Hətta belə də etmək olar:

int[] array;			//	int[] tipli massiv dəyişəni yaradırıq
if (a < 10)				// Əgər a dəyişəni 10-dan kiçikdirsə,
   array = new int[10];	// 10 elementli massiv yarat.
else					// Əks halda
   array = new int[20];	// 20 elementli massiv yarat 

Bəs belə massivlə necə işləmək olar? Necə bilək neçə elementi var?

Bunun üçün massivdə xüsusi bir xüsusiyyət (dəyişən) var — length. Massivin uzunluğunu belə öyrənmək olar:

array.Length;
Length xüsusiyyəti ilə massiv uzunluğunu almaq

Burada array — massiv dəyişənin adı, Length isə massiv obyektinin xüsusiyyətinin adıdır. Length xüsusiyyətinin dəyərini dəyişmək olmaz: Length xüsusiyyətini başqa dəyişənə təyin etmək olar, amma ona heç nə təyin etmək olmaz (proqram sadəcə kompilyasiya olunmayacaq).

Əvvəlki nümunəni belə davam etdirmək olar:

int[] array;			//	int[] tipli massiv dəyişəni yaradırıq
if (a < 10)				// Əgər a dəyişəni 10-dan kiçikdirsə,
   array = new int[10];	// 10 elementli massiv yarat.
else					// Əks halda
   array = new int[20];	// 20 elementli massiv yarat 

for (int i = 0; i < array.Length; i++)	// Massivin bütün elementləri üzrə dövr: 0-dan array.Length — 1-ə qədər
{
   Console.WriteLine(array[i]);
}

7. C#-da massivlər haqqında faktlar

Gəlin massivlər haqqında bildiyimiz faktları yekunlaşdıraq:

  • Fakt 1. Massiv bir çox hüceyrədən ibarətdir.
  • Fakt 2. Konkret hüceyrəyə giriş onun nömrəsini göstərməklə olur.
  • Fakt 3. Bütün hüceyrələr eyni tipdədir.
  • Fakt 4. Bütün hüceyrələr üçün ilkin dəyər — 0 və null (əgər hüceyrədə ünvan saxlanılırsa), false (bool tipi üçün).
  • Fakt 5. string[] list — sadəcə dəyişənin elanıdır: konteynerin (massiv obyektinin) özü hələ yaradılmayıb. Onunla işləmək üçün massiv (konteyner) yaradıb bu dəyişənə təyin etmək lazımdır, sonra istifadə etmək olar. Aşağıdakı nümunəyə bax.
  • Fakt 6. Massiv obyektini (konteyneri) yaradanda, onun uzunluğunu — neçə hüceyrə olacağını göstərmək lazımdır. Bu belə edilir: new TypeName[n];
  • Fakt 7. Massivin uzunluğunu .Length xüsusiyyəti ilə öyrənmək olar.
  • Fakt 8. Massiv yaradıldıqdan sonra nə elementlərinin tipini, nə də sayını dəyişmək olmaz.
string s;				// s null-dur
string[] list;			// list null-dur

list = new string[10];	// list dəyişəni 10 elementli sətir massivinin obyektinə referans saxlayır.
int n = list.Length;	// n 10-dur

list = new string[0];	// İndi list 0 elementli massiv saxlayır. 
                        // Massiv var, amma element saxlaya bilmir.

list = null;
Console.WriteLine(list[1]); // Proqram xətası yaranacaq — proqram qəza verəcək. 
                            // list boş referans saxlayır — null

list = new string[10];
Console.WriteLine(list[10]);	// Xəta yaranacaq — massiv sərhədlərindən kənara çıxış.
//	Əgər list 10 element/hüceyrə saxlayırsa, icazə verilən indekslər: 0 1 2 3 4 5 6 7 8 9 — cəmi 10 ədəd. 	
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Tam ədədlər massivinin yaradılması və ekrana çıxarılması
Tam ədədlər massivinin yaradılması və ekrana çıxarılması
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Massivin elementlərinin cəmi
Massivin elementlərinin cəmi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION