ŠKOLA: Small Basic, 2. dio

Petlje

Ponekad je neophodno da se neki djelovi programa (blokovi naredbi) izvršavaju više puta (iteracije). Struktura koja to omogućava naziva se programska petlja. Djelovi programa se programskom petljom mogu ponavljati unaprijed zadani broj puta ili sve dok je određeni uslov ispunjen. Petlje se u Small Basic-u ostvaruje naredbama For i While.

Naredba „For“

Kod For petlje broj izvršavanja bloka naredbi je unaprijed zadan, a o tome vodi računa brojač.

For i=n to m Step s
      Blok naredbi
EndFor

Promjenljiva i služi kao brojač. Njena vrijednost na početku jednaka je vrijednosti n. Nakon izvršenog bloka naredbi, vrijednost promjenljive i postaje jednaka zbiru njene posljednje vrijednosti i vrijednosti s (koraka). Potom se ponovo izvršava blok naredbi i sve tako dok vrijednost promjenljive i ne dostigne vrijednost m. Tada se posljednji put izvršava blok naredbi i tu se petlja završava.

Primjer 1: Želimo da prikažemo brojeve od 1 do 25. Da ne bismo pisali program od 25 linija koda.

TextWindow.WriteLine(1)
TextWindow.WriteLine(2)
.
.
.
TextWindow.WriteLine(25)

mi to možemo učiniti sa 3 linije koda na sljedeći način:

For  i = 1 to 25 Step 1
    TextWindow.WriteLine(i)
EndFor

Brojač je promjenljiva i (mogli smo odabrati bilo koje drugo ime promjenljive). Njena prva vrijednost u ovom primjeru je 1, a posljednja 25. Kad se izvrši prvi blok naredbi (u ovom primjeru samo jedna naredba) vrijednost promjenljive i se poveća za 1, što nam govori dio koda Step 1 (korak 1).

Primjer 2: Prikaz brojeva djeljivih sa 6 u segmentu od 1 do 60.

For  i = 6 to 60 Step 6
     TextWindow.Write(i)
     TextWindow.Write(" ")
EndFor

Brojač počinje od 6, a korak je takođe 6.

Primjer 3: Prikaz opadajućeg niza parnih brojeva od 30 do 1.

For  i = 30 to 1 Step -2
    TextWindow.Write(i)
    TextWindow.Write(" ")
EndFor

Brojač počinje od 30, a korak je – 2.

Naredba „While“

Za razliku od naredbe For kojoj je unaprijed određeno koliko puta će se izvršavati blok naredbi unutar petlje, naredbe u While petlji će se izvršavati dok je god ispunjen prethodno zadati uslov.

While (uslov)
     Blok naredbi
EndWhile

Dok je uslov zadovoljen, tj. iskaz unutar zagrade tačan, izvršavaće se blok naredbi, a kad bude netačan izaći će se iz petlje.

U sljedećem primjeru ilustrovana je primjena While naredbe:

TextWindow.WriteLine("Unesite dva realna broja:")
x=TextWindow.Read()
y=TextWindow.Read()
TextWindow.WriteLine("1. Saberi")
TextWindow.WriteLine("2. Oduzmi")
TextWindow.WriteLine("3. Množi")
TextWindow.WriteLine("4. Dijeli")
TextWindow.WriteLine("5. Izađi")
a=TextWindow.Read()
While(a<>5)
    If(a=1) then
      z=x+y
      TextWindow.WriteLine("Zbir brojeva "+x+" i "+y+" je "+z)
    elseif (a=2) then
      z=x-y
      TextWindow.WriteLine("Razlika brojeva "+x+" i "+y+" je "+z)
    elseif(a=3) then
      z=x*y
      TextWindow.WriteLine("Proizvod brojeva "+x+" i "+y+" je "+z)
    elseif(a=4) then
      z=x/y
      TextWindow.WriteLine("Količnik brojeva "+x+" i "+y+" je "+z)
    else 
    TextWindow.WriteLine("Unijeli ste pogrešan broj, pokušajte ponovo.")
    Endif
    
  TextWindow.WriteLine("1. Saberi")
  TextWindow.WriteLine("2. Oduzmi")
  TextWindow.WriteLine("3. Množi")
  TextWindow.WriteLine("4. Dijeli")
  TextWindow.WriteLine("5. Izađi")
  a=TextWindow.Read()
  EndWhile

Kao što vidimo, blok naredbi se izvršava, dok se ne unese broj 5 za izlazak iz programa.

Nizovi

Niz predstavlja skup podataka istog tipa. Oni su indeksirani tako što prvi element niza ima indeks 0, drugi 1 i tako dalje.

Primjer 1:

TextWindow.WriteLine("Unesite 5 imena")
For i=0 To 4 Step 1
  x[i]=TextWindow.Read()
EndFor  
TextWindow.Write("Ćao ")
For i=0 To 4 Step 1
  TextWindow.Write(x[i]+", ")
EndFor
TextWindow.WriteLine("")

U ovom primjeru elementi niza su imena koje korisnik unosi. U For petlji se formira 5 elemenata niza od x[0] do x[4]. Kasnije opet For petljom ispisujemo ta imena.

Primjer 2: Izračunavanje dekadnog broja ekvivalentnog zadatom binarnom broju. Binarni broj se unosi cifru po cifru, a za njegovo čuvanje koristi se niz.

TextWindow.WriteLine("Unosite cifru po cifru binarnog broja (između cifara pritisnite enter), za kraj unosa ukucajte cifru različitu od 0 i 1")
x=TextWindow.ReadNumber()
i=0
While ((x=0) Or (x=1))
  b[i]=x
  x=TextWindow.Read()
  i=i+1
EndWhile
d=0
For j=i-1 To 0 Step -1
  d=d+b[j]*Math.Power(2,(i-1-j))
EndFor   
TextWindow.Write ("Dekadni broj binarnog broja ")
For k=0 To i-1 Step 1
  TextWindow.Write(b[k])
EndFor   
TextWindow.WriteLine(" je "+d)

Ovdje se u niz b upisuju cifre binarnog broja, pa se kasnije pomoću ovih elemenata niza (tj. cifara binarnog broja) izračunava dekadni broj. Za računanje stepena nekog broja koristi se funkcija Power iz klase Math.

Višedimenzionalni nizovi

Višedimenzionalni nizovi su nizovi čiji su elementi definisani pomoću više indeksa. Kod dvodimenzionalnih nizova (matrica) položaj elementa u nizu određen je sa dva indeksa. Prvi indeks pokazuje u kojoj vrsti se element nalazi, a drugi u kojoj koloni. Takođe, razni tipovi podataka mogu biti elementi niza, ali za primjer navodimo matricu sa brojevima.

Primjer: Kreirati matricu čiji su elementi slučajno odabrani prirodni brojevi između 1 i 9. Potom prikazati zbir njenih elemenata po vrstama.

For i=1 To 9 Step 1
  For j=1 To 9 Step 1
    x[i][j] = Math.GetRandomNumber(9)
  EndFor 
EndFor 
TextWindow.WriteLine("Matrica je sljedeća:")
TextWindow.WriteLine("")
For i=1 To 9 Step 1
  zbir[i]=0
  For j=1 To 9 Step 1
    TextWindow .Write(x[i][j]+" ")
    zbir[i]=zbir[i]+x[i][j]
  EndFor 
  TextWindow.WriteLine("")
EndFor
For i=1 To 9 Step 1
  TextWindow.WriteLine("Zbir elemenata vrste "+i+" je "+zbir[i])
EndFor  

Funkcija GetRandomNumber(n) iz klase Math, gdje je n neki prirodni broj koji treba zadati, vraća proizvoljan prirodan broj od 1 do n.

Rad sa grafikom

Vrijeme je da počnemo da se igramo grafikom. Small Basic posjeduje moćan skup grafičkih funkcija i krećemo istraživati njihove mogućnosti.

Dosad smo rezultate svih programa dobijali u crnom prozoru TextWindow, a sada ćemo crtati u prozoru GraphicsWindow koji pozivamo naredbom GraphicsWindow.Show() .

Možemo jednostavno podesiti naziv prozora (title), dimenzije (height-visina, width-širina), boju pozadine (background color)…

GraphicsWindow.Title = "Grafika"
GraphicsWindow.Height = 250
GraphicsWindow.Width = 400
GraphicsWindow.BackgroundColor ="SteelBlue"
GraphicsWindow.Show()

Prozor će se prikazati i ako izuzmemo posljednju liniju koda Show() za prikaz. Ako ne zadamo dimenzije, podrazumjevajuća dimenzija biće 640×480. Ukoliko boja nije zadata, podrazumjevaće se bijela boja. Dovoljno je da postoji bar neka naredba iz seta GraphicsWindow, ostale podrazumjevane će se same izvršiti.

Crtanje linija

Počnimo sa crtanjem, za sad samo linija. Jedna linija se zadaje njenim krajnjim tačkama, tj. njihovim (x,y) koordinatama. Dakle, ako želimo da nacrtamo liniju kojoj su koordinate krajnjih tačaka (20, 20) i (300, 200), potrebno je ukucati GraphicsWindow.DrawLine(20, 20, 300, 200).

Dalje, linije možemo i obojiti (ako to ne učinimo biće crne boje) na ovaj način: GraphicsWindow. PenColor=“HotPink“. Boju „olovke“ potrebno je podesiti prije samog crtanja linije.

Boje se zadaju po imenima, a mogu i sa heksadecimalnim zapisima boje (npr. #FF0000 za crvenu boju). Pogledajmo boje, njihova imena i heksadecimalne zapise koje podržava SmallBasic. Možete raditi i sa ostalim bojama čiji heskadecimalni zapis znate.

 

 

 

 

 

 

 

Možemo podesiti i debljinu „olovke“ kojom ćemo crtati liniju, npr. GraphicWindow.PenWidth= 10 (a kad se ne precizira debljina podrazumjevana debljina je 1).

Sad da vidimo na djelu kako sve to izgleda.

GraphicsWindow.Title = "Grafika"
GraphicsWindow.Height = 250
GraphicsWindow.Width = 400
GraphicsWindow.BackgroundColor ="#FFFFF0"

GraphicsWindow.PenColor="RosyBrown"
GraphicsWindow.PenWidth=10
GraphicsWindow.DrawLine(20,20,350,200)

GraphicsWindow.PenColor="#20B2AA"
GraphicsWindow.PenWidth=10
GraphicsWindow.DrawLine(380,10,10,200)

U narednom primjeru ćemo iskoristiti For petlju da bismo nacrtali više linija, jednu pored druge, koje ćemo u svakom sljedećem koraku petlje podebljavati i povećavati im dimenzije.

GraphicsWindow.Title = "Grafika"
GraphicsWindow.Height = 240
GraphicsWindow.Width = 420
GraphicsWindow.BackgroundColor ="#778899"
GraphicsWindow.PenColor="Orchid"

For  i= 0 To 20 Step 1
  GraphicsWindow.PenWidth=i+1
  GraphicsWindow.DrawLine(2+20*i,110-5*i,2+20*i,130+5*i)
EndFor

Crtanje i popunjavanje oblika

Kod kreiranja oblika razlikujemo crtanje i popunjavanje, gdje se pod crtanjem podrazumjeva crtanje samo ivice oblika „olovkom“ (olovka – engl. pen), a pod popunjavanjem pravljenje oblika potpuno ispunjenog bojom „četkom“(četka – engl. brush).

Oblici koje možemo crtati su pravougaonici i elipse.

Kod crtanja pravougaonika koristimo naredbu GraphicsWindow.DrawRectangle(x,y,w,h), gdje su x i y koordinate gornjeg lijevog tjemena pravougaonika, w širina pravouganika i h njegova visina.

Naredba GraphicsWindow.DrawEllipse(x,y,w,h) nam služi za crtanje elipsi, gdje su x i y koordinate gornjeg lijevog tjemena zamišljenog pravougaonika koji opisuje elipsu, a w i h su širina i visina elipse. Da bismo nacrtali krug, treba samo podesiti jednaku visinu i širinu.

Za zadavanje boje četki treba napisati npr. GraphicsWindow.BrushColor="DarkCyan", a crtanje oblika ispunjenog bojom radi se pomoću naredbi FillEllipse ili FillRectangle.

Jednostavan primjer bi bio:

GraphicsWindow.Title = "Grafika"
GraphicsWindow.Height = 240
GraphicsWindow.Width = 420
GraphicsWindow.BackgroundColor ="#778899"

GraphicsWindow.BrushColor="SteelBlue"
GraphicsWindow.FillRectangle(20,20,370,200) 

GraphicsWindow.PenColor="Orchid"
GraphicsWindow.DrawEllipse(20,20,370,200)

GraphicsWindow.BrushColor="DarkCyan"
GraphicsWindow.FillEllipse(100,20,200,200)

Ovdje je prvo nacrtan bojom popunjeni pravougaonik (korišteni su četka – brush i popunjavanje – fill), potom je nacrtana elipsa olovkom (olovka – pen i crtanje – draw) i na kraju krug popunjen bojom (brush i fill).

Ukoliko upotrijebimo For petlju, možemo dobiti i neke zanimljivije crteže:

GraphicsWindow.Title = "Grafika"
GraphicsWindow.Height = 200
GraphicsWindow.Width = 200
GraphicsWindow.BackgroundColor ="Black"
GraphicsWindow.PenColor="White"

For i=1 To 100 Step 5
  GraphicsWindow.DrawRectangle(100-i,100-i,i*2,i*2) 
EndFor

A ukoliko u prethodnom kodu umjesto Rectangle upišemo Ellipse, dobijamo:

Ranije smo koristili funkciju GetRandomNumber za slučajan odabir broja iz nekog zadatog segmenta brojeva, a sad ćemo još iskoristiti funkciju GetRandomColor za slučajan odabir boje. Rezultat sljedećeg programa će izgledati svaki put drugačije zbog ovih slučajno odabranih vrijednosti.

GraphicsWindow.BackgroundColor = "Black"
For  i = 1 To 500
   GraphicsWindow.BrushColor = GraphicsWindow.GetRandomColor()
   x = Math.GetRandomNumber(640)
   y = Math.GetRandomNumber(480)
   GraphicsWindow.FillEllipse(x, y, 10, 10)
EndFor

Na crnoj podlozi nacrtaće se 500 kružića, a boje i parametri x i y se biraju slučajno (x – slučajan broj od 1 do 640, što je podrazumjevana širina prozora, a y – slučajan broj od 1 do 480, što je podrazumjevana visina prozora).

Ovim završavamo priču o Small Basic-u u ovom broju. Pozdrav do sljedećeg nastavka.

Ovaj unos je objavljen pod Treći broj. Zabeležite stalnu vezu.

Ostavite odgovor

Popunite detalje ispod ili pritisnite na ikonicu da biste se prijavili:

WordPress.com logo

Komentarišet koristeći svoj WordPress.com nalog. Odjavite se / Promeni )

Slika na Tviteru

Komentarišet koristeći svoj Twitter nalog. Odjavite se / Promeni )

Fejsbukova fotografija

Komentarišet koristeći svoj Facebook nalog. Odjavite se / Promeni )

Google+ photo

Komentarišet koristeći svoj Google+ nalog. Odjavite se / Promeni )

Povezivanje sa %s