Uvod u programski jezik C (4. deo)

Autor: Veljko Simić

Nizovi i matrice

U prošlom broju smo pričali o uslovnom grananju i kontroli toka programa. Naučili smo rad sa petljama, pa bismo ovaj tekst, u kome će biti reči o nizovima, počeli jednim pitanjem: kako ćemo napisati program koji računa prosečnu vrednost za deset vrednosti koje se unose? Pretpostavljamo da bi vaše rešenje imalo neku petlju koja bi se izvršavala deset puta i u njoj biste unosili vrednosti u neku promenljivu, nazovimo je zbir, sabirali biste te vrednosti i na kraju biste tu promenljivu podelili sa 10. Dobro, hajde da malo otežamo zadatak. Posle računanja proseka ispisati sve vrednosti koje su veće od njega! Tu nastaje problem: mi te vrednosti nismo zapamtili, već samo njihov zbir. Kada bismo pokušali da zadatak rešimo sa deset različitih promenljivih, zadatak bi bio poprilično ograničen i veoma teško bismo ga uopštili za, na primer, šesnaest vrednosti. Za ovakve, a i mnoge druge situacije, koriste se nizovi.

Niz je određen broj memorijskih lokacija koje imaju isti naziv. Pojedinačnim vrednostima se pristupa pomoću njihovog indeksa (njihovog rednog broja u nizu) i sve vrednosti u nizu moraju biti istog tipa. Indeks niza u programskom jeziku C se piše u uglastim zagradama i, pošto sve počinje od 0, to važi i za numeraciju članova niza.

Opšta deklaracija niza izgleda ovako:

tip ime_niza[broj_članova];

Npr. ako nam treba niz koji ćemo nazvati Pera, od deset članova tipa int, deklarisaćemo ga ovako:

int pera[10];

Kad želite da peti član tog niza ima vrednost 42:

pera[4]=42;

Kao što vidite, sve počinje od 0, pa peti član niza ima indeks 4. Jedan od uobičajenih početničkih lapsusa jeste pristupanje članu koji ne postoji. U ovom slučaju bi bio član sa indeksom 10 – dakle pera[10] ne postoji, a ova greška se naziva off by one.

Možda mislite da određivanje broja članova niza pri deklaraciji ograničava nizove, ali, kao što smo rekli na početku, niz je skup memorijskih lokacija i računar mora znati koliko memorije treba da rezerviše. Postoji način dinamičkog dodeljivanja memorije nizu. To ćemo opisati u nekom od narednih tekstova. Ne moraju svi članovi niza biti iskorišćeni. Tako da, ako ste rezervisali deset mesta, možete da iskoristite deset, jedno, ali i nijedno.

U programskom jeziku C vrednosti elemenata niza nisu unapred deklarisane – dakle, u tim elementima se nalazi vrednost koja se nalazila na toj memorijskoj lokaciji, osim u slučaju kada je niz definisan kao globalna promenljiva. Tada svi članovi niza imaju vrednost 0.

Sada kada možemo reći da imate neko teorijsko znanje o nizovima, možemo uraditi zadatak s početka teksta.

#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;
}

Nizovi takođe mogu da budu višedimenzionalni. Dvodimenzionalni nizovi se nazivaju matrice. Matrice imaju veliku ulogu pre svega u čuvanju i obradi tabelarnih podataka. Da biste dobro vladali matricama, potrebno je da imate iskustva sa višestrukim for petljama. Prolazak kroz matricu je šablonski postupak i svodi se na upotrebu dve ugnježdene petlje for, od kojih je spoljna za redove, a unutrašnja za kolone. Tako prolazimo kroz matricu red po red. Matrica se definiše slično kao niz, samo što ima dve uglaste zagrade koje označavanju indekse rada i kolone. Ako želimo da definišemo matricu 10×10 tipa int, to bi izgledalo ovako:

int matrica[10][10];

Sledi primer učitavanja i ispisa matrice:

#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;
}

Ovo je bio kratak uvod u diskusiju o nizovima i matricama. U sledećem broju ćemo pokazati neke nove tehnike sa ovim strukturama i neke nove stvari u C jeziku.

Naredni deo ovog serijala možete pročitati ovde.

Prethodni deo ovog serijala možete pročitati ovde.

 

Ostavite odgovor

Vaša adresa e-pošte neće biti objavljena. Neophodna polja su označena *

Time limit is exhausted. Please reload CAPTCHA.