Масив (програмиране)

от Уикипедия, свободната енциклопедия
Вижте пояснителната страница за други значения на Масив.

Масив

Масивът в компютърните науки е наредена последователност от елементи от един и същ базов тип. Отделен елемент на масива се указва посредством името на целия масив, последвано от поредния номер (индекс) на елемента. В различните езици за програмиране масивите са изградени по различни начини.[1]

Масиви в C/C++[редактиране | редактиране на кода]

В езиците за програмиране C и C++, масивът е група от променливи които са от един и същи тип данни, имат един и същи размер, разположени са последователно в паметта и съществува указател, който сочи към първия елемент от масива.

/* Създаване на масиви: */

/* Вариант 1: създаване на незадължително инициализиран масив. */
int arr[6]; // Създава масив от 6 елемента, всеки от които е цяло число.

/* Вариант 2: създаване на инициализиран масив. */
int arr[] = {0, 1, 2, 3, 4, 5}; // Създава масив от 6 елемента.

/* Задаване на стойности на елементи на масива: */
arr[0] = 5; // Присвоява на нулевия елемент от масива числото 5.

/* Следните два реда са еквивалентни. */
  arr[  2] = 100; // Присвоява на втория елемент числото 100.
*(arr + 2) = 100; // Присвоява на втория елемент числото 100.

/* Прочитане на елемент от масива: */
int tmp; // Създава променливата tmp от тип int (цяло число).
tmp =   arr[ 0]; // Задава на променливата tmp стойността на нулевия елемент на масива arr.
tmp = *(arr +0); // Задава на променливата tmp стойността на нулевия елемент на масива arr.
tmp = arr[2];    // Задава на tmp стойността на втория елемент на масива arr.

/* Адресна аритметика: */
int *tmp; // Създава променливата tmp, чийто тип е int*, т.е. указател към цяло число.
tmp = arr; // Задава на променливата tmp адреса на нулевия елемент на масива arr.
tmp = &arr[0]; // Задава на променливата tmp адреса на нулевия елемент. (Няма разлика с горния ред.)
tmp = &arr[2]; // Задава на tmp адреса на втория елемент.
tmp = arr + 2; // Задава адреса на втория елемент. Еквивалент на горния ред, защото:
               // &(arr[2]) ---> &(*(arr + 2)) --> arr + 2;

Масиви в PHP[редактиране | редактиране на кода]

В езика за програмиране PHP, масивът е променлива, която съдържа множество от елементи. Масивите могат да бъдат 2 вида — обикновени и асоциативни. При обикновените масиви за обръщане към елемент се използва индекс (поредно число) на елемента. При асоциативните масиви за обръщане към елемент се използва текстов низ.

$arrr = array('c', 'php', 'javascript', 'python'); // Създава обикновен масив с 4 елемента
$arrr[0] = 2; // Присвоява на нулевия елемент от масива числото 2
$arra = array('c' => true, 'php' => 'yes', 'python' => 1); // Създава асоциативен масив с 3 елемента
$arra['python'] = 4; // Присвоява на елемента "python" стойност 4

Масиви в JavaScript[редактиране | редактиране на кода]

В езика за програмиране JavaScript, масивът е обект. Той има конструктор и методи. За обръщане към елементите от обекта могат да се използват индекси или текстови низове.

var arr = new Array(17, 3, 5, 2, 13, 11, 7); // Създава обект от тип Array (масив)
arr.sort(function (a, b) { // Подрежда (сортира) елементите в масива
  return a  b;
});
var narr = new Array('yes', 1, 'no', 0); // Създава друг обект от тип Array (масив)
narr.length; // Взима дължината на новия масив (броя на елементите в него)

Масиви могат да бъдат създавани и посредством литерала за масив:

var literalArray = [5,2,3,8];
literalArray.pop(); //8
literalArray.push(1);
console.log(literalArray); //[5,2,3,1]

Масиви в Python[редактиране | редактиране на кода]

В езика за програмиране Python, масивите са 3 вида — tuple, list и dictionary. Разликата между тях е, че един tuple не може да бъде променен — докато съществува, неговите елементи остават такива, каквито са били при създаването му. При list елементите могат да бъдат променяни.

mytuple = ("hello", "world", 1) # Създава tuple
mylist = [3+2j, "wikipedia", "is", "cool"] # Създава list
mylist = mylist[:3] + ["very"] + mylist[3:] # Добавя елемент към list

Масиви в Perl[редактиране | редактиране на кода]

В езика за програмиране Perl, масивът е променлива, която съдържа множество от елементи. Масивите могат да бъдат 2 вида — обикновени и асоциативни. При обикновените масиви за обръщане към елемент се използва индекс (поредно число) на елемента. При асоциативните масиви за обръщане към елемент се използва текстов низ. При обръщане към елемент от масив, пред името на масива се поставя знакът $ (долар). При обръщане към обикновен масив пред името на масива се поставя знакът @ (маймунско А). При обръщане към асоциативен масив пред името на масива се поставя знакът % (процент).

@natural = (1, 2, 3, 4, 5, 6, 7, 8, 9); // Създава обикновен масив
@natural; // Обръща се към масива
$natural[0]; // Връща 1
%browsers = ("konqueror", "khtml", "opera", "Presto", "firefox", "Gecko", "safari", "WebKit");
$browsers{"opera"}; // Връща "Presto"

Масиви в C#[редактиране | редактиране на кода]

Схема на масив в C#

Масивите в езика С# представляват съвкупност от няколко еднотипни променливи. Те се наричат елементи на масива.

Декларират се по следния начин:

type[] arrayName;   //декларира референция към статичен масив с тип на елементите type и име arrayName
                    //стойност по подразбиране null
                    
type[] arrayName= new type[10]; //създава статичен масив с 10 елемента от тип type и го асоциира
                                //с името arrayName
var    arrayName= new type[10]; //алтернативно създаване на статичен масив

Характеристики на масивите[редактиране | редактиране на кода]

Масив от масиви (Jagged array)


  • Масивът може да бъде едномерен, многомерен или масив от масиви.
  • Базирани са на нулево индексиране – това означава, че в масив с N елемента, първият елемент ще е с индекс нула, а последният с индекс N-1.
  • Елементите на масива могат да бъдат от всякакъв тип, включително от тип масив.
  • Стойността по подразбиране на елементите от числен тип е нула, за референтните типове е null, а за булевите типове е false. При масив от масиви елементите са от референтен тип и по подразбиране са null.
  • Редът на елементите и дължината на масива са фиксирани.

Следващите примери демонстрират как се създават едномерен, многомерен и масив от масиви (jagged array).

// Деклариране на едномерен масив
int[] array;
	
// Деклариране и създаване на едномерен масив
int[] array1 = new int[5]; // стойности на елементите 0

// Деклариране, създаване на масив и задаване на стойности на елементите му
int[] array2 = new int[] { 1, 2, 3, 4, 5, 6 };
int[] array3 =           { 1, 2, 3, 4, 5, 6 }; // Друг запис на горното
        
// Деклариране на двумерен масив
int[,] multiDimensionalArray;

// Деклариране и създаване на двумерен масив
int[,] multiDimensionalArray1 = new int[2, 3]; // 2 реда по 3 колони (6 елемента)

// Деклариране, създаване на двумерен масив и задаване на стойности на елементите му
int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };
	// Може да си го представим като масив от еднакви по големина масиви
	
// Деклариране на масив от масиви
int[][] jaggedArray; // масив с тип на елементите int[]

// Деклариране и създаване на масив от масиви
int[][] jaggedArray   = new int[6][]; // 6 масива
	// Може да си го представим като масив от различни по големина масиви
		jaggedArray[0]= new int[2];   // 2 елемента
		jaggedArray[1]= new int[5];   // 5 елемента

При деклариране на масив след типа на променливите трябва да бъдат поставени квадратните скоби ([]), а не идентификатора (името) на масива.

Многомерни масиви[редактиране | редактиране на кода]

За двумерен масив елементите с индекси i, j биха имали адрес B + c.i + d.j, където коефициентите c и d са стъпките на увеличение съответно на реда и колоната.

По-общо, в k-мерен масив, адресът на елемент с индекси i1, i2, …, ik e:

B + c1 · i1 + c2 · i2 + … + ck · ik.

Например: int a[3][2];

Това означава, че масивът е от тип int и има 3 реда и 2 колони. В него можем да съхраним 6 елемента, подредени линейно, започвайки от първия ред. Горепосоченият масив би бил съхранен в следния ред: a11, a12, a13, a21, a22, a23.

Тази формула изисква само k умножения и k събирания за6 който и да е масив, който може да се събере в паметта. Освен това, ако коефициентът е точна степен на 2, умноженията могат да се заместят с Побитови измествания.

Коефициентите ck трябва да бъдат такива, че всеки валиден индекс да води до адреса на определен елемент.

Ако минималната позволена стойност за всеки индекс е 0, то B е адресът на елемента, на който всички индекси са 0. Както при едномерните масиви, индексите на елементите могат да бъдат променяни, като се промени основния адрес B. Следователно, ако двумерен масив има редове и колони с индекси от 1 до 10 и от 1 до 20 съответно, то тогава заменяйки B с B + c1 – − 3 c1 ще преномерираме индексите на елементите на съответно от 0 до 9 и от 4 до 23. Възползвайки се от това свойство, някои езици за програмиране (като FORTRAN 77) задават индексите на масивите да започват от 1, както е традиционно математически, докато други езици (като Fortran 90, Pascal и Algol) позволяват на потребителя да избира минималната стойност на всеки индекс.

Обработване на масиви[редактиране | редактиране на кода]

  • с for цикъл — използва се когато се работи с индекса на елементите и не е задължително да се обхожда всеки един от първия до последния елемент.
  • с foreach цикъл — използва се когато не е необходима употребата на индекс, а елементите се обхождат един по един. С тази операция елементите не могат да бъдат променяни, а само прочитани.

Масивите като обекти[редактиране | редактиране на кода]

В езика C# масивите са всъщност обекти. System.Array е базовият тип на всички видове масиви и неговите характеристики могат да бъдат прилагани. Пример за това може да бъде намирането на дължината на масива с използване на метода System.Array.Length.

Преоразмеряеми масиви[редактиране | редактиране на кода]

Източници[редактиране | редактиране на кода]

  1. Крушков, Христо. Програмиране на C#. Пловдив, Коала Прес, септември 2017. ISBN 978-619-7134-44-5. с. 132.