четвртак, 25 априла, 2024
Како да...?

Увод у програмски језик 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 језику.

Наредни део овог серијала можете прочитати овде.

Претходни део овог серијала можете прочитати овде.