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:
agregiranje - prebrojavanje, sabiranje, množenje, prosek elemenata niza koji zadovoljavaju određeni uslov
pretraživanje - zadaci gde je potrebno pronaći neki elemenat ili više elemenata koji zadovoljavaju zadati uslov
generisanje - kreiranje novog niza, npr. na osnovu neke formule ili pravila, na osnovu unetih početnih vrednosti ili nizova
transformisanje - zadaci u kojima se menja sam niz, npr. menjaju se elementi niza ili se vrši premeštanje elemenata
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.
_show;niz-unos-ispis-sr
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.
_show;niz-unos-ispis-sr
a = array(50); read(n); unosNiza(a,n); ispisNiza(a,n);
Zadatak 3
Formira se niz od N članova. Izračunati zbir elemenata niza.
_show;niz--sr
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.
_show;niz-prosek-niza-sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz-vise-pozitivnih-sr
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.
_show;niz--sr
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).
_show;niz-proizvod-parnih-ind-sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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).
_show;niz--sr
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.
_show;niz--sr
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
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
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).
_show;niz--sr
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].
_show;niz--sr
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.
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
_show;niz--sr
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].
_show;niz--sr
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...
_show;niz--sr
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...
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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"].
_show;niz--sr
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.
_show;niz--sr
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].
_show;niz--sr
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].
_show;niz--sr
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].
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.
_show;niz--sr
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.