Странице

среда, 29. јануар 2014.

Programiranje 105: Matrix i nizovi

Hoćete li uzeti plavu pilulu ili ćete uzeti crvenu pilulu?
Ako uzmete plavu pilulu povlačite se od saznanja predivnosti sveta kompjutera.
Ako uzmete crvenu pilulu uskačete u potpuno nov pogled na svet oko sebe!

0 0 1 0 1 0 0
1 0 0 0 0 0 1
0 1 1 1 1 1 0
Ovde ćete naučiti dosta o matricama i nizovima.

Nizovi

Počećemo od nečega jednostavnog, da učitamo niz i odredimo zbir nekoliko članova tog niza. Nizovi su promenljive koje imaju svoju vrednost i indeks:

int niz[5];

Niz može biti različitih tipova i veličina. U ovom slučaju je tipa int, a veličina 5. Niz se učitava jedan po jedan član. Počinje se od prvog i ide do poslednjeg. Što vas možda asocira na petlje? Kao prvo upravu ste, kao drugo nizove ćemo crtati ovako radi lakšeg rada:

niz0 niz1 niz2 niz3 niz4

Kada osnujemo niz on je nedefinisan, ni jedan od njegovih članova nema vrednost, tu nedefinisanu vrednost ćemo označavati sa NAN. Da bi smo pristupili informaciji nekog člana niza pišemo niz[2]=5; ili niz[0]=niz[2]+3; niz od malopre će se ovim linijama promeniti ovako: (probajte da predpostavite izgled pre gledanja):

8NAN5NANNAN

Broj u uglastim ("[","]") zagradam se zove index niza. On označava koj po redu član niza obrađujemo. Može imati bilo koju vrednost od 0 do broja članova niza (neuključujući sam broj članova).
Takože možemo zadati vrednosti članova niza pomoću cin. Kada bi smo želeli da učitamo sve članove niza koristili bi for petlju koja "ide od" 1 "do" broja članova niza koje želimo da učitamo, a to izgleda ovako:

int niz[5];
for(int i=0; i<5; i++)
{
cin>>a[i];
}

Sada pokrenite program sa ovim kodom (ne zaboravite funkciju main i biblioteke), unesite pet brojeva, recimo 2 5 4 3 1. Pogledajte kako sada računar čuva taj niz u memoriji:

25431

I sada smo spremni da radimo šta god poželimo našem nizu!
Rekli smo da hoćemo da izračunamo sumu nekih članova niza. Prvo ćemo uneti dva broja (levo i desno), a onda uzeti svaki od članova čiji je indeks između brojeva levo i desno (razmislite kako bi ste to). Postoji jedan mali problem. Kada vam neko kaže: "Prvi član niza", to se odnosi na član niza sa indeksom 0, kada kaže: "deseti član niza", to se odnosi na član sa indeksom 9. Tako da kada se unesu brojevi levo i desno mi zapravo tražimo zbir članova od levo-1 do desno-1. Sada pogledajte ovo:

cin>>levo>>desno;
levo--;//isto sto i levo=levo-1;
for(int i=levo; i<desno; i++)
{
zbir+=niz[i];//isto sto i zbir=zbir+niz[i]
}

Primetite kako smo samo levo smanjili. To je zbog toga što zapravo ne proveravamo niz[desno] jer i ide od levo do desno-1, pošto kada i dostigne desno, uslov i<desno, što je isto kao desno<desno, nije ispunjen i petlja se završava.
Dali su vam nizovi donekle jasni? Pa naravno da... možda. Ako ima nešto nejasno pročitajte ponovo i isprobajte se na nekoliko zadataka:
  1. Napišite program u kome unosite dva niza i sabirate sve brojeve prvog niza sa indeksom čija je vrednost drugog niza.
  2. Napišite program koji sabira svaki drugi član niza.
  3. Napišite program koji oduzima 1 svakom od članova niza.

Matrice

Matrice (na engleskom matrix) su "više dimenzionalni nizovi". To znači da imaju više indeksa. Sećate se kako u nizovima pišemo [5]. Kod matrica pišemo [5][3], a može i više ([2][5][4][3][1] i sl. ali retko). matrice se slično pamte u memoriji kao nizovi i mogu da rade čudesne stvari. Hajde da napravimo za početak matricu u kojoj će biti "nacrtana" mala kuća. Matrice ćemo obeležavati ovako:

m0,0 m0,1 m0,2 m0,3 m0,4
m1,0 m1,1 m1,2 m1,3 m1,4
m2,0 m2,1 m2,2 m2,3 m2,4
m3,0 m3,1 m3,2 m3,3 m3,4
m4,0 m4,1 m4,2 m4,3 m4,4

Postoji puno zanimljivih stvari koje mogu da se dešavaju u matricama. Pogledalte šta se dešava kada napišemo recimo ovo: m[1][3]=7; m[2][1]=3; m[3][3]=m[1][3]*m[2][1];:

NANNANNANNANNAN
NANNANNAN7NAN
NAN3NANNANNAN
NANNANNAN21NAN
NANNANNANNANNAN
Počnimo prvo sa unosom:

int m[5][5];
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
cin>>m[i][j];
}
}

To je to! Napisali ste program za učitavanje matrice. Primetite for u for-u (to nije fora) razmislite, j ide od 0 do 5 i kad završi i se poveća. Trebalo bi da znate, pre nego što se naviknete na suprotno, da se slvo j u programiranju izgovara "jot", dakle član matrice m[i][j] bi bio "m od i jot". Sada ga isprobajte, napravite kuću, unesite:

0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1

Nije fascinanto? Ne zaboravite ovo su početničke lekcije programiranja, ako želite stvarno da napravite kuću, za sad imate paint. Mogu vam objašnjavati matrice do mile volje, ali mislim da vam je bitnije da vi sami isprobate. Naravno ako želite možete ići na sledeću lekciju gde ćemo pričati o funkcijama, ili na prethodnu, o petljama koje smo ovde koristili, a i korsitićemo mnogo. Zato ću vam već sada zadati domaći i završiti:

  1. Napišite program koji ispisuje zbir svih redova u matrici. (u onom slučaju sa kućicom: 1 2 2 2 5)
  2. Napišite program koji za unete dve koordinate i matricu računa sumu svih članova matrice između te dve koordinate. (kao SUM u excelu)
  3. Napišite program koji računa proizvod svih članova matrice koji nisu 0.

Rešenja prethodnog domaćeg:

/*1*/
int n,k;
cin>>n;
for(int i=0; i<n; i++)
{
if(n%i==0)k++;
}
if(k==2)cout<<"Prost\n";
else cout<<"Nije prost\n";

/*2*/
int a,b,k,NZD,NZS;
cin>>a>>b;
NZD=a;
while(!((a%NZD==0)&&(b%NZD==0)))NZD--;
cout<<NZD<<endl;
NZS=a;
while(!((NZS%a==0)&&(NZS%b==0)))NZS++;
cout<<NZS<<endl;


/*3*/
bool jeste=true;
for(int a=0; a<2; a++)
{
for(int b=0; b<2; b++)
{
for(int c=0; c<2; c++)
{
if(!(a||(b&&c)==(a||b)&&(a||c)))
{
jeste=false;
break;
}
}
}
}
if(jeste)cout<<"Jeste\n";
else cout<<"Nije\n";


/*4*/
int n;
cin>>n;
while(n>0)
{
cout<<n%2;
n/=2;
}

/*5 je na vama (ako treba pomoc javite se u komentarima)*/

Нема коментара:

Постави коментар