Употреба низова¶
У приручнику Увод у програмирање у програмском језику C# прочитајте поглавља 6.1 и 6.3 (стране 137-145 и 151-156).
У овим поглављима смо видели да низ који желимо да користимо у програму треба да декларишемо, на пример овако:
double[] x;
и да резервишемо простор за тај низ у динамичкој меморији, на пример овако:
x = new double[1000];
Декларација и резервисање простора се могу обавити и у једној наредби:
double[] x = new double[1000];
Овом наредбом је резервисан простор за 1000 реалних бројева, који се у програму зову \(x[0], x[1], ... x[999]\). Бројеви у заградама се називају индекси, а као индекс уместо константе може да се користи и целобројна променљива или израз. Важно је само да вредност таквог израза за овај низ буде између 0 и 999. У противном, извршавање програма ће бити прекинуто (ако не хватамо изузетке) уз поруку да је индекс ван опсега за дати низ.
Сваки податак типа double заузима 8 бајтова у меморији, па цео низ x заузима 8000 бајтова, то јест нешто мање од 8 килобајта.
Да смо формирали низ од 1000 целих бројева
int[] x = new int[1000];
било би заузето 1000 пута по 4 бајта, то јест 4000 бајтова, јер би сваки елемент таквог низа заузимао по 4 бајта (податак типа int заузима 4 бајта).
Погледајмо и анимацију извршавања једноставног програма, који само резервише (алоцира) простор у динамичкој меморији за целобројни низ од 5 елемената. На шематском приказу меморије се види да су статичка и динамичка меморија поптуно раздвојене.
Као што статичку меморију често краће зовемо стек, назив за динамичку меморију је хип (енгл. heap).
Најчешћи поступци са низовима¶
Учитавање¶
Низ се најчешће задаје навођењем броја елемената низа (дужине низа), а затим и самих елемената. Тако задати низ реалних бројева учитавамо помоћу следећих наредби:
double[] a; int i, n;
n = int.Parse(Console.ReadLine());
a = new double[n];
for(i = 0; i < n; i++) {
a[i] = double.Parse(Console.ReadLine());
}
Овде смо претпоставили да је сваки елемент низа дат у посебном реду, тј. да корисник после сваког броја притиска Enter.
Итерирање¶
Неке од основних операција над серијама података смо набројали у поглављу о петљама. Такве операције се могу обавити и над серијом података смештеном у низ. На пример, највећи елемент низа од n елемената можемо да нађемо овако:
max = a[0];
for(i = 1; i < n; i++) {
if(a[i] > max) { max = a[i]; }
}
или овако:
max = a[0];
foreach (int x in a) {
if(x > max) { max = x; }
}
а збир елемената истог низа овако:
sum = 0;
for(i = 0; i < n; i++) {
sum += a[i];
}
или овако:
sum = 0;
foreach (int x in a) {
sum += x;
}
Иницијализација¶
Рецимо да нам је потребан низ који садржи првих 10 степена броја два. Као што знамо, тај низ можемо да формирамо овако:
int[] a = new int[10];
a[0] = 1;
for (int i = 1; i < 10; i++)
a[i] = a[i - 1] * 2;
или набрајањем вредности, овако:
int[] dvaNa = new int[10];
dvaNa[0] = 1; dvaNa[1] = 2; dvaNa[2] = 4; dvaNa[3] = 8; dvaNa[4] = 16;
dvaNa[5] = 32; dvaNa[6] = 64; dvaNa[7] = 128; dvaNa[8] = 256; dvaNa[9] = 512;
Краћи и ефикаснији начин да набројимо вредности елемената низа је
int[] dvaNa = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 };
Крајњи ефекат је у сва три случаја исти - формиран је исти низ од десет целих бројева. Како год да смо формирали овај низ, на даље га користимо на исти начин. На пример, ако нам треба \(2^6\), пишемо dvaNa[6].