Nizovi - Zadaci iz programiranja

Ovde smo pripremili zbirku zadataka pomoću kojih ćemo provežbati osnovne tehnike programiranja sa nizovima. Ovakvi zadaci se obično rešavaju korišćenjem ciklusa (najčešće brojačkog), što smo objasnili u tekstu Programiranje sa nizovima i matricama, gde se bavimo osnovama rada sa nizovima. Kroz zadatke vežbamo sledeće tipove problema:

Zadaci su i grupisani otprilike prema tipu problema koji se traži, iako neka striktna podela nije sasvim moguća. Pokušali smo da napravimo gradaciju od lakših ka težim zadacima, kako bismo vas postepeno uvodili u načine rešavanja zadataka sa nizovima. Ne očekujte previše praktičnih problema ovde - smisao ovih zadataka je vežbanje tehnike rada sa nizovima.

Najpre ćemo kreirati malu biblioteku funkcija koje ćemo koristiti za neke aktivnosti koje se stalno ponavljaju - unos i ispis, automatsko kreiranje niza i matrice. Zahvaljujući ovim funkcijama, naši programi će biti čitljiviji.

Funkcije

Ovo su funkcije koje se bave nekim operacijama koje se često ponavljaju. To su:

  • unosNiza(a, n) - unos niza a za zadati broj elemenata n
  • popunaNiza(a,n, kor) - automatsko popunjavanje niza a sa n slučajnih brojeva od 0 do 99, povećanih za korektivni faktor kor
  • ispisNiza(a, n) - ispis niza a od n elemenata
function unosNiza(a, n) {for (i=1..n) { read(a[i]); } } function popunaNiza(a,n, kor) {for (i=1..n) { a[i] = trunc(rand()*100) + kor; } } function ispisNiza(a, n) { write("Elementi niza:"); r=""; for (i=1..n) { r += a[i] + " "; } write(r); }

Osnove

Ovde uspostavljamo osnove rada sa nizovima - unos elemenata niza i formiranje niza slučajnih brojeva pomoću pripremljene funkcije iz biblioteke. Takođe, vežbamo prolazak kroz niz putem brojačkog ciklusa i to radi ispisa ili računanja neke vrednosti.

Zadatak 1
Napisati program kojim se unosi niz od N elemenata i potom ispisuju elementi niza.

a = array(50); read(n); write("Unos elemenata"); for (i=1..n) { read(a[i]); } write("Ispis elemenata"); for (i=1..n) { write(a[i]); }

Zadatak 2
Napisati program kojim se unosi niz od N elemenata i potom ispisuju elementi niza, uz korišćenje unapred pripremljenih funkcija iz biblioteke.

a = array(50); read(n); unosNiza(a,n); ispisNiza(a,n);

Zadatak 3
Formira se niz od N članova. Izračunati zbir elemenata niza.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); s = 0; for (i=1..n) { s += a[i]; } write(s);

Zadatak 4
Izračunati prosek (aritmetičku sredinu) svih elemenata niza od N numeričkih elemenata.

a = array(50);read(n); popunaNiza(a,n,-50); ispisNiza(a,n); s = 0; for (i=1..n) { s += a[i];} p = s/n; write(p);

Zadaci za vežbu

Filtriranje elemenata niza

Sledeća grupa zadataka takođe spada u osnovne. Obično je potrebno nešto izračunati, prebrojati ili ispisati na osnovu elemenata niza, ali ne svih, već samo onih koji zadovoljavaju određeni uslov. Ovi zadaci se obično rešavaju prolaskom kroz niz, dok se unutar ciklusa vrši ispitivanje svakog elementa niza.

Zadatak A.1
Napisati program kojim se pronalazi broj nula u unetom nizu brojeva.

a = array(50); read(n); unosNiza(a,n); br = 0; for (i=1..n) { if(a[i]==0){br++;} } write(br);

Zadatak A.2
Kreira se niz od N celih brojeva. Treba ispisati sve one članove čija je vrednost manja od njihovog rednog broja (indeksa) u nizu.

a = array(50); read(n); for (i=1..n) {a[i] = trunc(rand()*n);} ispisNiza(a,n); write("Traženi elementi:"); for (i=1..n) { if (a[i] < i) {write(a[i]);} }

Zadatak A.3
Izračunati zbir elemenata niza koji su veći od svog indeksa.

a = array(50); read(n);for (i=1..n) {a[i] = trunc(rand()*n);} ispisNiza(a,n); s = 0; for (i=1..n) {if (a[i] > i) {s+=a[i];} } write(s);

Zadatak A.4
Kreira se niz od N članova i unosi broj X. Treba ispisati indekse onih članova niza koji su jednaki broju X.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); read(x); for (i=1..n) { if (a[i] == x) {write(i);} }

Zadatak A.5
Prebrojati koliko ima negativnih brojeva u nizu, u intervalu od indeksa I1 do indeksa I2.

a = array(50);read(n); popunaNiza(a,n,-50); ispisNiza(a,n); read(i1, i2); br=0; for (i=i1..i2) {if (a[i] < 0) {br++;}} write(br);

Zadatak A.6
U unetom nizu celih brojeva, treba naći broj parnih i broj neparnih elemenata niza.

a = array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); bp = 0;bn = 0; for (i=1..n) { if (a[i] % 2) {bn++;} else {bp++;}} write("Br. parnih: " + bp); write("Br. neparnih: " + bn);

Zadatak A.7
Proveriti da li u nizu ima više pozitivnih ili negativnih brojeva.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); r = 0; for (i=1..n) { if (a[i]>0) { r++; } if (a[i]<0) { r--; } } if (r>0) { write("Pozitivnih"); } elseif (r<0) { write("Negativnih"); } else {write("Podjednako");}

Zadatak A.8
Izračunati aritmetičku sredinu svih pozitivnih elemenata niza celih brojeva.

a=array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); s=0; br=0; for (i=1..n) { if (a[i]>0) { s+=a[i]; br++;}} p=s/br; write(p);

Zadatak A.9
Izračunati proizvod svih elemenata koji se nalaze na parnim pozicijama (indeksima).

a=array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); p=1; for (i=1..n div 2) {p *= a[i*2];} write(p);

Zadatak A.10
Kreiraju se nizovi A i B od po N celih brojeva, s tim što elementi niza B mogu biti samo brojevi 0 i 1. Potrebno je izračunati ispisati sve elemente niza A za koje je odgovarajući elemenat niza B jednak 1 i izračunati njihov zbir.

a=array(50); b=array(50); read(n); for (i=1..n) { a[i]=trunc(rand()*100); b[i]=trunc(rand()*2); } ispisNiza(a,n); ispisNiza(b,n); s=0; for (i=1..n) { s+=a[i]*b[i]; if (b[i]) { write(a[i]);} } write("Suma: " + s);

Zadatak A.11
Za unete nizove A od N i B od M celih brojeva, treba ispisati M elemenata niza A onim redosledom kako je navedeno u nizu B. Podrazumeva se da ni jedan elemenat niza B nije veći od N.
Npr. A=[23,52,38,44} i B=[3,1,1,2], ispisuje se 38, 23, 23, 52.

a = array(50); b = array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); read(m); for (i=1..m) {b[i] = trunc(rand()*n)+1;} ispisNiza(b,m); for (i=1..m) { write( a[b[i]] );}

Zadatak A.12
Za uneti niz od N numeričkih vrednosti, prebrojati koliko ima elemenata koji su duplo veći od prethodnog i za 10 manji od sledećeg elementa u nizu.

a = array(50); read(n); unosNiza(a,n); broj = 0; for (i=2..n-1) { if (a[i] == a[i-1]*2 AND a[i] == a[i+1]-10) { broj++; } } write(broj);

Zadatak A.13
Proveriti da li je niz uređen po neopadajućem redosledu (svaki sledeći el. je veći ili jednak prethodnom).

a = array(50); read(n); unosNiza(a,n) ok = true; for (i=2..n) { if (a[i] < a[i-1]) { ok = false; } } if (ok) { write("Neopadajuć");} else { write("Nije neopadajuć");}

Zadatak A.14
U nizu brojeva A od N elemenata, pronaći najduži podniz pozitivnih brojeva.

a = array(50); read(n); popunaNiza(a,n, -50); ispisNiza(a,n); a[n+1] = -1; in = false; first = 0; last = 0; fm = 0; lm = 0; for (i=1..n+1) { if (a[i] > 0) { if (in) { last = i; } else { first = i; last = i; in = true; } } else { in = false; if (last-first > lm-fm) { lm = last; fm = first; } } } for (i=fm..lm) { write (a[i]); }

Zadatak A.15
U nizu brojeva A, pronaći najduži neopadajući podniz.
Zadatak je sličan pronalaženju najdužeg pozitivnog podniza, uz par manjih izmena

a = array(50); read(n); popunaNiza(a,n, -50); ispisNiza(a,n); a[n+1] = a[n]-1; in = false; first = 0; last = 0; fm = 0; lm = 0; for (i=2..n+1) { if (a[i] > a[i-1]) { if (in) { last = i; } else { first = i; last = i; in = true; } } else { in = false; if (last-first > lm-fm) { lm = last; fm = first; } } } if (fm) {fm--;} for (i=fm..lm) { write (a[i]); }

Zadatak A.16
Proveriti da li među elementima niza nema duplikata.

a = array(50); read(n); for (i=1..n) { a[i] = trunc(rand()*20);} ispisNiza(a,n); dup = false; for (i=1..n-1) { for (j=i+1..n) { dup = dup OR (a[i] == a[j]);}} if (dup) {write ("Ima duplikata");} else {write ("Nema duplikata");}

U rešenju se oba ciklusa nepotrebno izvršavaju od početka do kraja čak iako se duplikat nađe odmah na početku. Razmislite o verziji rešenja koja bi bila efikasnija i prekidala cikluse čim se pronađe prvi duplikat.

Pretraga niza

U ovim zadacima pokušavamo da pronađemo specifičan element. U nekim situacijama se pretraga može zaustaviti čim se pronađe elemenat koji zadovoljava traženi uslov, ali u nekim situacijama moramo proći kroz ceo niz u potrazi za "boljim" elementom.

Suštinski, ovo nisu zaista zadaci koji se bave algoritmima za pretraživanje, već samo zadaci koji pod pojmom "pretraga" maskiraju već rađene zadatke u kojima je potrebno proći kroz niz i nešto izračunati ili prebrojati odgovarajuće elemente. Jedina razlika je što se ovde pronađeni element ne "uračunava" već pamti kao "pronađen".

Inače, jedini tip pretrage koji za sada znamo je sekvencijalno pretraživanje, koje se svodi na prolazak kroz jedan-po-jedan elemenat niza.

Zadatak B.1
Pronaći najveći elemenat niza.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); max = a[1]; for (i=2..n) {if (a[i] > max) { max = a[i]; }} write (max);

Zadatak B.2
Pronaći indeks najmanjeg elementa niza.

a=array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); mi = 1; for (i=2..n) { if (a[i] < a[mi]) { mi = i; }} write (mi + ": " + a[mi]);

Zadatak B.3
Pronaći prvi negativni elemenat u nizu od N celih brojeva, ako postoji.

a = array(50);read(n); popunaNiza(a,n,-20); ispisNiza(a,n); i = 1; while(i<=n AND a[i]>=0) {i++;} if (i>n) {write("Ne postoji ni jedan negativni element");} else {write(a[i]);}

Zadatak B.4
Ispitati da li je veći maksimum elemenata na parnim ili elemenata na neparnim pozicijama niza.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); mn=a[1]; mp=a[2]; for (i=3..n) { if (i % 2) { if (mn < a[i]) { mn=a[i]; }} else { if (mp < a[i]) { mp = a[i]; } }} if (mn > mp) { write("Maksimum neparnih: " + mn);}else { write("Maksimum parnih: " + mp);}

Zadatak B.5
Pronaći elemenat koji je najbliži proseku niza.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); s = 0; for (i=1..n) {s += a[i];} p = s/n;min = abs(a[1] - p);e = a[1]; for (i=2..n) {mm = abs(a[i] - p); if (mm < min) { min = mm; e = a[i];}}write("Prosek: " + p); write("Element: " + e);

Zadatak B.6
Kreira se niz pozitivnih i negativnih brojeva. Treba ispisati indekse prvog i poslednjeg pozitivnog elementa u nizu.

a = array(50); read(n); popunaNiza(a,n, -70); ispisNiza(a,n); first = 0; last = 0; for (i=1..n) { if (a[i] >= 0) { if (first==0) { first=i; } last=i; } } write (first); write (last);

Zadatak B.7
Pronaći drugi najveći elemenat niza. Podrazumeva se da niz ima bar dva elementa.

a = array(50);read(n); popunaNiza(a,n,-50); ispisNiza(a,n); if (a[1] > a[2]) { m1 = a[1];m2 = a[2];} else {m1 = a[2];m2 = a[1];} for (i=3..n) {if(a[i] > m1) {m2 = m1; m1 = a[i];} elseif (a[i] > m2) {m2 = a[i];}} write (m2);

Zadatak B.8
Za niz od N elemenata i unet celi pozitivan broj M i vrednost X, naći indeks M-te pojave elementa X u nizu, ako postoji.

a = array(50); read(n); for (i=1..n) {a[i] = trunc(rand()*10);} ispisNiza(a,n); read(m, x); br = 0; ind = 0; for (i=1..n) { if (a[i]==x) { br++; if (br==m) { ind=i; } } } if (ind) { write("Pozicija " + ind);} else { write("Nije pronađen");}

Generisanje niza

U ovim zadacima stvaramo novi niz bilo na osnovu nekih početnih vrednosti i "formule", bilo na osnovu postojećeg niza ili više njih.

Zadatak C.1
Za unete nizove A i B formirati niz C koji se dobija sabiranjem elemenata nizova A i B.

a=array(50); b=array(50); c=array(50); read(n); popunaNiza(a,n,-50); popunaNiza(b,n,-50); ispisNiza(a,n); ispisNiza(b,n); for (i=1..n) { c[i] = a[i] + b[i]; } write("Dobjeni niz C"); ispisNiza(c,n);

Zadatak C.2
Unose se nizovi A i B od po N elemenata. Kreirati niz C čiji je svaki elemenat jednak manjem od odgovarajućih elemenata nizova A i B.
Ako bismo želeli preciznije da se izrazimo: Ci = min(Ai, Bi).

a = array(50); b = array(50); c = array(50); read(n); popunaNiza(a,n,-50); popunaNiza(b,n,-50); ispisNiza(a,n); ispisNiza(b,n); for (i=1..n) { if (a[i] < b[i]) { c[i]=a[i]; } else { c[i]=b[i]; }} write("Dobjeni niz C"); ispisNiza(c,n);

Zadatak C.3
Za uneto X i N, kreirati niz od N elemenata kome je A1 = X, a svaki sledeći elemenat se dobija dupliranjem prethodnog.
Npr. za uneto N=5 i X=3, dobija se niz [3, 6, 12, 24, 48].

a = array(50);read(n, x); a[1] = x; for (i=2..n) {a[i] = a[i-1] * 2;} ispisNiza(a,n);

Zadatak C.4
Kreirati Fibonačijev niz od N elemenata. A1 = 1, A2 = 1, a svaki sledeći se dobija kao zbir prethodna dva elementa.

a = array(50);read(n);a[1] = 1;a[2] = 1;for (i=3..n) {a[i] = a[i-1] + a[i-2];} ispisNiza(a,n);

Zadatak C.5
Za generisani niz A od N članova, kreirati niz B koji se dobija obrtanjem elemenata niza A.
Dakle ako je niz A [4,9,2,7], niz B treba da bude [7,2,9,4].
Znači, B1=AN, B2=AN-1, ... BN=A1

a = array(50); b = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); for (i=1..n) { b[i] = a[n-i+1]; } write("REZULTAT"); ispisNiza(b,n);

Zadatak C.6
Za zadati niz od N celih brojeva krirati i ispisati novi niz čiji se elementi dobijaju kao zbirovi prvog i poslednjeg elementa unetog niza, zatim drugog i pretposlednjeg, trećeg i trećeg s kraja... Podrazumeva se da je N parno.
Ako je zadat niz [4,8,6,2,1,9], treba da se dobije [13,9,8].

a = array(50); b = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); for (i=1..n div 2) { b[i] = a[i] + a[n-i+1]; } write("REZULTAT"); ispisNiza(b, n div 2);

Zadatak C.7
Za uneti niz A od N brojeva, kreirati niz B od N-1 elemenata koji se dobijaju sabiranjem elemenata niza A, gde se i-ti element dobija kao zbir i-tog i i+1 elementa.
b1=a1+a2, b2=a2+a3, b3=a3+a4...

a = array(50); b = array(50); read(n); popunaNiza(a,n, -50); ispisNiza(a,n); for (i=1..n-1) { b[i] = a[i] + a[i+1]; } write("REZULTAT"); ispisNiza(b, n-1);

Zadatak C.8
Za uneti niz A od N elemenata, kreirati niz B koji se dobija kumuliranjem elemenata niza A. To znači da se i-ti element dobija kao zbir od prvog do i-tog elementa niza A. I da još pojasnimo: b1=a1, b2 = a1+a2, b1=a1+a2+a3...

a = array(50); b = array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); b[1] = a[1]; for (i=2..n) { b[i] = b[i-1] + a[i]; } write("REZULTAT"); ispisNiza(b,n);

Zadatak C.9
Za uneti niz A od N celih brojeva, kreirati niz B koji se dobija izbacivanjem negativnih elemenata iz niza A.

a = array(50); b = array(50); read(n); popunaNiza(a,n, -50); ispisNiza(a,n) m = 0; for (i=1..n) { if (a[i] >= 0) { m++; b[m] = a[i];}} write("REZULTAT"); ispisNiza(b,m);

Zadatak C.10
Za uneti niz A od N celih brojeva, treba kreirati niz B, u kome će se naći indeksi onih elemenata niza A koji su jednaki nekom unetom broju X.
Dakle, za uneti niz [4,8,4,6,2,4,1] i X=4, rezultat treba da bude [1,3,6], zato što su prvi, treći i šesti element jednaki broju X.

a = array(50); b = array(50); read(n); unosNiza(a,n); read(x); m = 0; for (i=1..n) { if (a[i] == x) { m++; b[m] = i;}} ispisNiza(b,m);

Zadatak C.11
Kreirati niz A od N elemenata, čiji su elementi celi brojevi od 1 do N, slučajno raspoređeni, uz uslov da se svaki broj pojavljuje samo jednom.
Ovo je u stvari zadatak pravljenja slučajnog redosleda. Ovde ćemo predstaviti dva načina - slučajnim zamenama parova u uređenom nizu ili "skidanjem" jednog po jednog slučajnog elementa iz uređenog niza. Zadatak bi mogao da se reši i ubacivanjem slučajnog broja i proverom da li taj broj postoji, ali taj način rešavanja nije baš praktičan pošto se program sve više usporava kako se bližimo kraju niza.

Da se podsetimo:

  • funkcija rand() vraća slučajan broj u intervalu od 0 do 0.9999999
  • npr. trunc(rand() * 10) daje slučajan ceo broj u intervalu od 0 do 9
  • npr. trunc(rand() * 10)+1 daje slučajan ceo broj u intervalu od 1 do 10

U prvom rešenju kreiramo niz poređanih brojeva [1,2,3,4...], a onda određen broj puta slučajno biramo dva indeksa i tim elementima menjamo mesta - bukvalno, pobrkamo elemente.

a=array(50); read(n); for (i=1..n) { a[i]=i; } for (i=1..n*2) {x=trunc(rand()*n)+1; y=trunc(rand()*n)+1; t=a[x]; a[x]=a[y]; a[y]=t;} ispisNiza(a,n);

Drugi način je malo bolji, ali zahteva da pravimo novi niz. Znači, isto kao malopre kreiramo niz poređanih brojeva, npr. A=[1,2,3,4,5] i onda biramo slučajan broj, iz intervala od 1 do 5. Recimo da dobijemo X=2 - onda drugi element smestimo u niz B=[2], a u nizu A treba da elminišemo izabrani element (npr. u njega možemo smestiti poslednji elemenat) i ostaje nam: A=[1,5,3,4]. Onda opet biramo slučajan indeks, ali sada iz intervala od 1 do 4 i ponavljamo ceo postupak.

a=array(50); b=array(50); read(n); for (i=1..n) { a[i]=i; } for (i=1..n-1) {x=trunc(rand()*(n-i+1))+1; b[i]=a[x]; a[x]=a[n-i+1];} b[n]=a[1]; ispisNiza(b,n);

Zadatak C.12
Na osnovu unetog stringa, kreirati niz podstringova koji se dobijaju kada se string podeli po razmacima. Podrazumeva se da je string ispravan, da nema razmake na početku i kraju, kao ni višestruke razmake.
Npr. za uneti string "Mama ima Momu", dobija se niz od tri elementa ["Mama", "ima", "Momu"].

a = array(50); read(s); n=1; a[1]=""; for(i=0..len(s)-1) {znak=getchar(s,i); if (znak==" "){n++; a[n]="";} else {a[n]+=znak;} } for(i=1..n){write(a[i]);}

Transformacija niza

Ovo su zadaci kod kojih je potrebno na neki način promeniti sam niz. Umesto da vršimo računanje ili prebrojavanje u nekoj posebnoj promenljivoj, u ovakvim zadacima se rezultat obrade smešta u sam elemenat niza.

Ovi zadaci mogu biti veoma slični zadacima gde se na osnovu jednog niza generiše drugi niz, s tim što je ovde posao dodatno zakomplikovan time što suštinski sve moramo da uradimo unutar jednog istog niza.

Zadatak D.1
U nizu celih brojeva, sve elemente na parnim pozicijama treba uvećati za 1, a sve elemente na neparnim smanjiti za 1.

a = array(50);read(n); popunaNiza(a,n,0); ispisNiza(a,n); for (i=1..n) {if (i % 2) {a[i]-=1;} else { a[i]+=1; }} ispisNiza(a,n);

Zadatak D.2
Niz od N elemenata treba transformisati tako što elementi u svakom paru zamene pozicije. Podrazumeva se da je N parno.
Npr. za niz brojeva [5,2,9,1,3,6] dobija se [2,5,1,9,6,3].

a = array(50);read(n); popunaNiza(a,n,0); ispisNiza(a,n); for (i=1..n div 2) {t=a[i*2-1]; a[i*2-1]=a[i*2]; a[i*2]=t; } ispisNiza(a,n);

Zadatak D.3
U niz A od N elemenata treba umetnuti novi elemenat X, posle prvog elementa koji je veći od X ili na kraj niza ako takav elemenat ne postoji.
Za uneto X=80 i niz [57,30,95,17,22], dobija se [57,30,95,80,17,22].

a = array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); read(x); p = 1; a[n+1] = 0; while (a[p] <= x and p <= n) {p++;} if (p<=n) {p++; } m = n-p; for (i=0..m) { a[n-i+1] = a[n-i]; } a[p] = x; n++; ispisNiza(a,n);

Zadatak D.4
U niz A od N elemenata treba ubaciti niz B od M elemenata, počev od zadate pozicije P. Podrazumeva se da je P u okviru niza A.
Dakle, ako je niz A=[15,30,10,40,60], niz B=[2,6] i uneto P=3, treba da dobijemo niz A=[15,30,2,6,10,40,60].

a=array(50); b=array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); read(m); popunaNiza(b,m,-100); ispisNiza(b,m); read(p); br=n-p; for(i=0..br){a[n+m-i]=a[n-i];} for(i=1..m){a[p+i-1]=b[i];} n+=m; ispisNiza(a,n);

Zadatak D.5
Izvršiti pomeranje elemenata niza za X pozicija uz uslov da se elementi koji "ispadnu" pojavljuju sa druge strane niza. Zadatak uraditi bez upotrebe pomoćnog niza. Npr. za niz [1 2 3 4 5 6 7] i uneto X = 3, dobija se niz [5 6 7 1 2 3 4].
Za niz [1 2 3 4 5 6 7] i X = -3, dobija se [4 5 6 7 1 2 3]
U rešenju nećemo previše razmišljati - prosto ćemo ciklirati niz za po jedan element onoliko puta za koliko pozicija je potrebno da se pomeri.

a = array(50); read(n); popunaNiza(a,n,0); ispisNiza(a,n); read(x); m = abs(x); for (j=1..m) { if (x>0) {t = a[n]; for (i=1..n-1) { a[n-i+1] = a[n-i];} a[1] = t;} else {t = a[1];for (i=1..n-1) {a[i] = a[i+1];} a[n] = t;}}ispisNiza(a,n);

Zadatak D.6
Izvršiti pomeranje elemenata niza za X pozicija. Elementi koji ispadnu se gube, a umesto pomerenih elemenata pojavljuju se nule.

Npr. za niz [1 2 3 4 5 6 7] i uneto X = 3, dobija se niz [0 0 0 1 2 3 4].
Za niz [1 2 3 4 5 6 7] i X = -3, dobija se [4 5 6 7 0 0 0]

Ovde ćemo se malo više potruditi da napravimo optimalnije rešenje - bez koncentričnih ciklusa.

a = array(50); read(n); popunaNiza(a,n,-50); ispisNiza(a,n); read(x); m = n-abs(x); if (x > 0) { for (i=0..m-1) { a[n-i]=a[n-i-x]; } for (i=1..x) {a[i] = 0;}} else { for (i=1..m) {a[i] = a[i-x];} for (i=1..abs(x)) {a[n-i+1] = 0;}} ispisNiza(a,n);

Grafički primeri

Ovi primeri nisu toliko značajni za vežbanje programiranja sa nizovima, koliko demonstriraju neku praktičnu primenu nizova za čuvanje većeg broja podataka.

Primer 1
Animiramo N pravougaonika širine 20 piksela, čija se Y koordinata menja po sinusoidi.

Ovo je prosto jedan niz pravougaonika koji se pomeraju gore-dole, jedan za drugim tako da sve to daje neki lep efekat kontinuiranog kretanja. Zašto računamo vertikalnu koordinatu po sinusoidi a ne linearno (kada se pozicija menja uvek za fiksnu veličinu) je da bismo postigli efekat ublažavanja kretanja (ease-in i ease-out). Ako se ne snalazite sa sinusima i kosinusima, pogledajte tekst u kome objašnjavamo trigonometrijske funkcije u JavaScriptu

Ovaj zadatak bi čak mogao da se uradi i bez upotrebe nizova. Razmislite kako.

y = array(50); vis2 = _HEIGHT div 2; vis4 = _HEIGHT div 4; n = _WIDTH div 20; for (i=1..n) {y[i] = _PI/n * i;} off = _PI / 60; fill("#999"); color("#000"); while(true) { cls("#444"); for (i=1..n) { y[i] += off; if (y[i]>_PI*2) {y[i] -= _PI*2;} rect((i-1)*20, sin(y[i])*vis4+vis4, 20,vis2); } graphic(); }

Primer 2
Animiramo 30 "loptica", gde se svaka kreće slučajno izabranim pravcem, s tim što se loptice "odbijaju" kada stignu do ivice grafičkog okvira.

x = array(50); y = array(50); dx = array(50); dy = array(50); n=30; sir=10; init(n,x,y,dx,dy); fill("#f66"); color("#000"); while(true) { cls("#444"); for (i=1..n) { x[i] += dx[i]; y[i] += dy[i]; if (x[i] < 0 or x[i] > _WIDTH) {x[i] -= dx[i]; dx[i] = -dx[i];} if (y[i] < 0 or y[i] > _HEIGHT) {y[i] -= dy[i]; dy[i] = -dy[i];} ellipse(x[i],y[i], sir,sir); } graphic(); } function init(n,x,y,dx,dy) { for (i=1..n) { x[i] = _WIDTH div 2; y[i] = _HEIGHT div 2; dx[i] = offset(); dy[i] = offset(); } } function offset() { if (trunc(rand()*2)) {z = 1;} else {z = -1;} p = (rand()*5 + 2) * z; return(p); }
Svi elementi sajta Web'n'Study, osim onih za koje je navedeno da su u javnom vlasništvu, vlasništvo su autora i ne smeju se koristiti, u celosti ili delimično bez pismenog odobrenja autora. To uključuje tekstove, slike, ilustracije, animacije, prateći grafički materijal i programski kod.
Ovaj sajt koristi tehnologiju kolačića (cookies). Detaljnije o tome možete pročitati u tekstu o našoj politici privatnosti.