Увод у програмски језик 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 језику.
Наредни део овог серијала можете прочитати овде.
Претходни део овог серијала можете прочитати овде.