Увод у програмски језик C (4. део)
Аутор: Вељко Симић
Низови и матрице
У прошлом броју смо причали о условном гранању и контроли тока програма. Научили смо рад са петљама, па бисмо овај текст, у коме ће бити речи о низовима, почели једним питањем: како ћемо написати програм који рачуна просечну вредност за десет вредности које се уносе? Претпостављамо да би ваше решење имало неку петљу која би се извршавала десет пута и у њој бисте уносили вредности у неку променљиву, назовимо је збир, сабирали бисте те вредности и на крају бисте ту променљиву поделили са 10. Добро, хајде да мало отежамо задатак. После рачунања просека исписати све вредности које су веће од њега! Ту настаје проблем: ми те вредности нисмо запамтили, већ само њихов збир. Када бисмо покушали да задатак решимо са десет различитих променљивих, задатак би био поприлично ограничен и веома тешко бисмо га уопштили за, на пример, шеснаест вредности. За овакве, а и многе друге ситуације, користе се низови.
Низ је одређен број меморијских локација које имају исти назив. Појединачним вредностима се приступа помоћу њиховог индекса (њиховог редног броја у низу) и све вредности у низу морају бити истог типа. Индекс низа у програмском језику C се пише у угластим заградама и, пошто све почиње од 0, то важи и за нумерацију чланова низа.
Општа декларација низа изгледа овако:
tip ime_niza[broj_članova];
Нпр. ако нам треба низ који ћемо назвати Пера, од десет чланова типа int, декларисаћемо га овако:
int pera[10];
Кад желите да пети члан тог низа има вредност 42:
pera[4]=42;
Као што видите, све почиње од 0, па пети члан низа има индекс 4. Један од уобичајених почетничких лапсуса јесте приступање члану који не постоји. У овом случају би био члан са индексом 10 – дакле пера[10] не постоји, а ова грешка се назива off by one.
Можда мислите да одређивање броја чланова низа при декларацији ограничава низове, али, као што смо рекли на почетку, низ је скуп меморијских локација и рачунар мора знати колико меморије треба да резервише. Постоји начин динамичког додељивања меморије низу. То ћемо описати у неком од наредних текстова. Не морају сви чланови низа бити искоришћени. Тако да, ако сте резервисали десет места, можете да искористите десет, једно, али и ниједно.
У програмском језику C вредности елемената низа нису унапред декларисане – дакле, у тим елементима се налази вредност која се налазила на тој меморијској локацији, осим у случају када је низ дефинисан као глобална променљива. Тада сви чланови низа имају вредност 0.
Сада када можемо рећи да имате неко теоријско знање о низовима, можемо урадити задатак с почетка текста.
#include <stdio.h>
int main() {
int n, niz[100],zbir=0,i; //definišemo niz od 100 elemenata
float prosek;
printf ("Unesite duzinu niza manju od 100");
scanf ("%d",&n);
for (i=0;i<n;i++) // ovo je uobičajan način unošenja niza
scanf("%d",&niz[i]);
for (i=0;i<n;i++)
zbir=zbir+niz[i];
prosek=zbir/n;
for (i=0;i<n;i++) // pronalaženje i ispisivanje svih elemenata niza većih od proseka
if (niz[i]>prosek)
printf ("%d ",niz[i]);
return 0;
}
Низови такође могу да буду вишедимензионални. Дводимензионални низови се називају матрице. Матрице имају велику улогу пре свега у чувању и обради табеларних података. Да бисте добро владали матрицама, потребно је да имате искуства са вишеструким for петљама. Пролазак кроз матрицу је шаблонски поступак и своди се на употребу две угњеждене петље for, од којих је спољна за редове, а унутрашња за колоне. Тако пролазимо кроз матрицу ред по ред. Матрица се дефинише слично као низ, само што има две угласте заграде које означавању индексе рада и колоне. Ако желимо да дефинишемо матрицу 10×10 типа int, то би изгледало овако:
int matrica[10][10];
Следи пример учитавања и исписа матрице:
#include <stdio.h>
int main() {
int matrica[20][20],m,n,i,j;
printf ("Unesite dimenzije matrice manje od 20!");
scanf ("%d%d",&m,&n);
for (i=0:i<m;i++) //unošenje matrice
for (j=0;j<n;j++)
scanf ("%d",&matrica[i][j]);
for (i=0:i<m;i++){ //ispis matrice
for (j=0;j<n;j++)
printf ("%d ",matrica[i][j]);
printf ("\n");
}
return 0;
}
Ово је био кратак увод у дискусију о низовима и матрицама. У следећем броју ћемо показати неке нове технике са овим структурама и неке нове ствари у C језику.
Наредни део овог серијала можете прочитати овде.
Претходни део овог серијала можете прочитати овде.
