Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
1
UvodVrlo je teško ustanoviti odakle početi s objašnjavanjem termina i suštine programiranja. Pretpostavljam da znate makar neke osnove matematike, i naravno koristiti računar...
Dosta vremena ćemo posvetiti objašnjavanju koncepata i terminologije. Terminologija je možda i najbitnija jer ćete kasnije lakše razgovarati o datim konceptima i brže ćete učiti ostale programske jezike, "povezivati kockice"...
KomunikacijaMi ljudi za sebe tvrdimo da smo inteligentna bića. Jedan od dokaza za to je i mnoštvo naših načina komunikacije. Komunikacija podrazumijeva između razmjenu informacijadva ili više učesnika (ne moraju biti ljudi), koristeći zajedničke znakove i pravila.U ovo se ubrajaju vizuelne metode (znakovni jezici, grimase, kolutanje očima), audio metode (govor, muzika), fizičke (kad vas neko udari jer ste nepristojni npr.).Danas u svijetu postoji više od 5.000 jezika, od kojih većina nažalost lagano izumire.
Ljudi pričaju i sa robotima, ako ništa gledali ste futurističke filmove.Ako se nas ljude pita, to je .idealan način za komuniciranjeMeđutim, , nemaju inteligenciju kao živa bića.mašine su u suštini vrlo glupe
Mašine nemaju mozak, tijelo, uši, glasne žice... Sve im to moramo obezbijediti, da bi bile "inteligentne". Neki od tih organa su predstavljeni kompjuterom, mehaničkim dijelovima, mikrofonom, zvučnikom itd.
Kompjuter je mozak mašine, on upravlja svime. Na njega su povezani svi ostali uređaji (organi).Nama ljudima (većini, neki ljudi ne misle nikako), ali misli dolaze same od sebekompjuterima ne. I to im moramo "ručno" unijeti... Te kompjuterske misli su ustvari naše
, koje se skupno nazivaju .naredbe program
Ovdje smo da naučimo neke od načina za komuniciranje s kompjuterima.Naime, ljudi su razvili na stotine koje se koriste za pisanje programskih jezikakompjuterskih programa.Ovi jezici su slični našim jezicima, imaju svoju , i .sintaksu gramatiku pravopis
2
ApstrakcijeKroz život, svjesno ili nesvjesno, naučili smo koristiti apstrakcije. Apstrakcija je ustvari
, uopćavanje nečeg konkretnog. U bitna su nam generalizovanje datom kontekstu samo datog objekta/stvari/koncepta. Naprimjer kada kažemo automobil, neka svojstva
podrazumijevamo nešto sa 4 točka, motorom itd.To je apstraktni automobil, njegova takoreći definicija, dok je konkretan automobil npr. komšijin Pežo(v) 307, iz 2001. godine.
U fizici i hemiji imamo apstrakciju atoma. Zatim se uvodi apstrakcija molekule, koja se sastoje od više atoma. Kada se govori o molekulama, znamo da su "ispod" atomi, ali nas u datom kontekstu to ne zanima! Kontekst predstavlja skup okolnosti i činjenica, još jedna vrlo bitna stvar kada se govori o apstrakcijama.
U matematici imamo apstrakciju broja. Kada kažemo broj obično mislimo na cijeli broj. Ali ne kažemo koji broj!?Dakle, samo znamo da mislimo na broj.neki
ParadigmeJedan od značajnijih problema koje p.j. pokušavaju riješiti je .kompleksnostKako programi postaju veći, to su komplikovaniji za razumjeti.Zato danas imamo nekoliko paradigmi (pristupa, načina) za razvijanje programa, od kojih su najpoznatije:
proceduralnofunkcionalnoobjektno orijentisanologičko
Dosta jezika danas je miks dvije ili više ovih paradigmi.Ove paradigme o problemima po svom nekom usmjeravaju naš način razmišljanjašablonu/fazonu.
Npr. kod proceduralnog/imperativnog načina razmišljanja "u mjestu".mijenjamo varijableOvdje moramo pamtiti/zamisliti koja je vrijednost neke varijable , što je u datom trenutkuvećini ljudi izazovan zadatak.
Kod funkcionalnog/matematičkog načina razmišljanja pravimo a stare ne nove varijablediramo! To nam pomaže kod razumijevanja određenog dijela koda, ne moramo pamtiti u glavi stanje "cijelog svijeta" i na šta utiče promjena date varijable. Ali, otom potom...
3
ProgramiRekli smo da je program koje računar treba izvršiti, u cilju dobijanja nekog niz naredbirezultata.Kako svi ljudi razmišljaju na sebi svojstven način, postoji teoretski beskonačno mnogo rješenja (programa) za jedan te isti problem!
Programi često komuniciraju i sa "vanjskim svijetom".Npr. ako trebamo učitati neki tekstualni fajl i prebrojati sve riječi, taj fajl nije dio programaveć je (en. input) u naš program. Isto vrijedi i za klik miša, unos sa tastature, ulazmikrofona i sl.
Analogno, kada želimo ispisati nešto na ekran, pustiti muziku na zvučnik, to se zove izlaz(en. output) iz našeg programa.
Naravno, da ne bismo "izmišljali toplu vodu" možemo se okoristiti znanjem stečenim kroz ljudsku historiju.Ljudi su nadošli na koncept algoritma, koji predstavlja nedvosmislenu specifikaciju za rješavanje nekog problema.Tj. je niz precizno definisanih koraka za dobijanje nekog rezultata.algoritamLaički rečeno, to je recept za implementaciju neke funkcije.
U toku pisanja koda nekog programa često će nam se pojavljivati .greškeTj. program se izvršava ali ne radi kako bismo željeli. Te greške se nazivaju bagovi (en. bug - buba, insekt).Za program koji ima takve greške kaže se da je .bagovitProces u kojem tražimo greške i ispravljamo ih naziva se debagovanje.
To je to.
1
Instalacija JaveAko vam je baš mrsko instalirati Javu, postoje i online verzije
JavaJShell
Zgodne su za probavanje i igranje sa Javom.
Preporučujem da instalirate .Javu 11Samo downloadujte i raspakujte zip npr. u .C:\Java
Idući korak je .dodavanje PATH varijable
Instalacija je malo komplikovanija, ali je dostupna i za 32-bitne i 64-bitne računare.Jave 8Naravno, možete instalirati više verzija Jave, ali samo jednu možete dodati u !PATH
JDK download step 1
2
Kada se otvori stranica sa prethodne slike kliknite na dugme .download JDK
JDK (Java Development Kit) su alati za razvijanje Java programa: kompajler, debager itd. JDK sadrži JRE (Java Runtime Environment) koji služi za pokretanje Java programa (JVM, Java API klase itd).
Na sljedećoj slici kliknite na "jdk-8u131-windows-x64.exe".To je instalacija za 64-bitni Windows.Ako znate da imate 32-bitni Windows onda skinite tu verziju...
JDK download step 2
Preporučujem da Javu instalirate u folder pod nazivom .C:\Java
Ovo ne morate raditi ali je korisno kada vam treba više verzija Jave.Također, neki programi na Windowsu imaju problema kada putanja sadrži razmak, zato nećemo instalirati u ...Program Files
Napomena: Ne trebate instalirati i JRE!Kada vam dođe prozor za JRE kliknite Cancel! (iksić).Upravo sam vam uštedio 100-tinjak megabajta, nema na čemu... :D
Dakle, kada se završi download, otvorite instalaciju i kliknite Next.
3
JDK folder
Zatim kliknite dugme "Change..." i prepravite putanju foldera na .C:\Java\jdk1.8.0_131
JRE će već biti instaliran zajedno sa JDK! Tako da nam ne treba još jedna instalacija...
JRE, nope!
4
Dodavanje PATH varijabliDio koji slijedi vezan je više za sam rad operativnog sistema (Windows u našem slučaju) nego za Javu.Otvorite na Windowsu (desni klik na My Computer -> Properties). Computer Properties
Otvoriće vam se sljedeći prozor:
Computer Properties
Kliknite na Advanced System Settings. Dobićete sljedeći prozor:
5
System Properties
Otvorite tab i kliknite .Advanced Environment Variables...
Dodajte 3 sistemske varijable u donji prozor (u System Variables):
Naziv varijable Vrijednost
JAVA_HOME C:\Java\jdk1.8.0_131
JDK_HOME %JAVA_HOME%
JRE_HOME %JAVA_HOME%\jre
Glavno, otvorite varijablu i dodajte na kraj.PATH ;%JAVA_HOME%\bin
Nemojte zaboravit tačkazarez kopirati! :DBez navodnika, naravno! Kliknite Ok, Ok...
To je to! Uspješno ste instalirali Javu! :)Stanje bi trebalo biti otprilike ovako:
6
System Properties
ProvjeraDa bi provjerili jesmo li uspješno obavili zadatak, otvorićemo Command Prompt (kod Linuxaša se rekne Shell).Otvorite Start, ukucajte i kliknite . Ukucajte .cmd Enter java -version
Ako dobijete poruku 'java' is not recognized as an internal or external nešto nije uredu, provjerite sve korake command, operable program or batch file.
sekcije ponovo!Dodavanje PATH varijabli
Ako dobijete nešto slično sljedećoj slici, sve je OK:
7
Java verzija
1
JShellDa bi se igrali sa JShellom morate imati instaliranu Javu verzije 9 ili više.Ispratite .sekciju za instalaciju
Koristićemo JShell program za upoznavanje i igranje s Java jezikom.Otvorite konzolu (bez ikakvog straha! :D), ukucajte i udarite Enter.jshell
Dobićete tzv. interaktivni shell u kojem možete kucati Javu.Zovu ga još i REPL (Read Evaluate Print Loop), jer dobija unos od nas, evaluira ga, isprinta neki odgovor, i ponavlja ukrug.
Izrazi i operatoriZa početak, JShell možemo koristiti kao primitivni kalkulator.Tako ćemo steći osjećaj kako se ponašaju brojevi u Javi, i usput objasniti neke osnovne koncepte i pojmove.Ako ukucamo u REPL broj 5 i pritisnemo Enter, vidjećemo sljedeće:
REPL je razumio i odgovorio nam da je to vrijednost .5
U programiranju se kaže da je broj . u programiranju ima isto značenje kao i u izraz Izrazmatematici.Dakle, misli se na nešto što ima . Nešto što možemo prikazati, s čim možemo vrijednostbaratati.
Ako se opet prisjetimo (dosadne) matematike, sjetićemo se da se simboli , , , itd. + - *
nazivaju .operatoriPošto smo rekli da je REPL kao kalkulator, da vidimo šta sve možemo uraditi:
jshell>
$1 ==> 5
55
2
Izgleda da dijeljenje ne radi kako treba... Našli smo grešku! :DAli, nije tako. Java da želimo podijeliti dva broja!podrazumijeva cijelaAko se sjetimo osnovne škole, je ustvari i . :)5 / 2 2 cijelih ostatak 1
Dakle, kada dijelimo dva cijela broja, ustvari radimo "cjelobrojno dijeljenje".
Također, možemo dobiti i ostatak od dijeljenja, pomoću operatora .%
Npr. je .5 % 2 1
Kada želimo koristiti brojeve (sa zarezom), onda moramo poslije broja napisati realnetačku.Tačka se koristi jer se znak zarez koristi za neke druge stvari... Otom potom.Uglavnom, da vidimo kako rade realni brojevi (en. ing point):float
Sada se sve čini onako kako treba. :)
Redoslijed operatora (en. precedence) radi očekivano.Npr. množenje se radi prije sabiranja.Ako želimo baš, baš, biti sigurni da će program raditi kako treba, možemo koristiti zagrade.
jshell>
jshell>
jshell>
jshell>
$2 ==> 4
$3 ==> -3
$4 ==> 21
$5 ==> 2
jshell>
jshell>
jshell>
jshell>
$6 ==> 8.1
$7 ==> 4.4
$8 ==> -11.0
$9 ==> 2.25
+ 2 22 2
- 2 52 5
* 7 37 3
/ 9 49 4
. + .3 0 5 13 0 5 1
. - .7 3 2 97 3 2 9
. * .5 5 -2 05 5 -2 0
. / .9 0 4 09 0 4 0
3
VarijablePrimijetite šta REPL ispisuje kao odgovor, poslije svake unesene linije: .$1 ==> 5
Ako ukucamo u REPL vidjećemo sljedeće:$1
Dakle, REPL nam kaže da je varijable jednaka .vrijednost $1 5
Izraz je spremljen u , koju možemo koristiti umjesto broja .5 varijablu $1 5
Šta je to varijabla?Zamislite da imate kutije raznih oblika i dimenzija.Varijabla je baš kao koji vi želite. Npr. kutija u kojoj kutija sa natpisomčuvamo neki broj.
Kreiraćemo novu varijablu pod nazivom , za čuvanje egera (en. "integer" brojJabuka int
je cijeli broj).Ovo je tip varijable (veličina i oblik kutije)! Kasnije ćemo govoriti malo detaljnije o int
tipovima.
Pošto nismo dali vrijednost našoj varijabli, Java nam pomaže tako što postavlja na vrijednost .brojJabuka 0
Obično je to ono što želimo, ali je najbolje postaviti početnu vrijednost , čim eksplicitnouvodimo novu varijablu. Tako odmah znamo koja joj je početna vrijednost i ne moramo razmišljati o tome... :)To radimo ovako:
jshell>
jshell>
$10 ==> 6
* 2
$11 ==> 8
jshell>
$1
$1 ==> 5
jshell>
brojJabuka ==> 0
| created variable brojJabuka : int
+ * 2 2 22 2 2
( + 2 22 2)
brojJabuka;intint
4
Vrlo jednostavno, nakon naziva varijable slijedi znak jednako i vrijednost, ovdje je to .0
Primijetite da ovaj znak jednakosti već operacija dodjele!nije matematička jednakostTj. kao da kažemo "postavi varijablu na nulu!".brojJabuka
Varijablu možemo izmijeniti, tj. postaviti na novu vrijednost:
Sada je vrijednost promijenjena na . Nakon ove linije, gdje god koristimo 5 brojJabuka
to je kao da napišemo .5
Također, možemo iskoristiti da bismo dobili novu:prethodnu vrijednost varijable
U izrazu , vrijednost odnosi se na brojJabuka + 1 brojJabuka zadnju vrijednost , dakle vrijednost prije ove linije, tj. .varijable 5
Postoji i skraćena verzija za ovo, prikazana na liniji 3, s operatorom .+=
Također imaju skraćene verzije i za oduzimanje, množenje, dijeljenje i modulo: , , -= *=
, respektivno./= %=
Ovo "respektivno" je fancy izraz za "u navedenom redoslijedu". :D
Nazivi varijabliNazivi varijabli i tipova (en. identifiers) ne mogu imati razmake u sebi, ne mogu biti nijedna od rezervisanih riječi kao što je , .class int
Ne mogu biti neki rezervisani znakovi, kao npr. , itd., &
Ne mogu počinjati brojem. Primjeri nevalidnih naziva varijabli (isprobajte u JShellu):
int my variable = 5int int = 5int , = 5
jshell>
brojJabuka ==> 0
| created variable brojJabuka : int
jshell>
brojJabuka ==> 5
| assigned to brojJabuka : int
jshell>
jshell>
brojJabuka ==> 6
$23 ==> 7
brojJabuka = ;int 0int 0
= ;brojJabuka 5brojJabuka 5
= brojJabuka + ;brojJabuka 1brojJabuka 1
+= ;brojJabuka 1brojJabuka 1
5
int 5something = 5
Primjeri validnih naziva varijabli:
int _abc = 5int $xyz = 5int Z = 5int t$df_x = 5
Mogu se koristiti simboli i ali ih treba izbjegavati, pogotovo kao prvi karakter u _ $
nazivu varijable!
Preporučeno je (konvencija, dobra praksa) da varijable počinju malim slovom, da su (svaka iduća riječ počinje velikim slovom), npr. .camelCase myVariable
Konstante (varijable koje se neće mijenjati) se pišu velikim slovima i riječi su razdvojene donjom crticom, npr. .MY_CONST
1
TipoviVećina ozbiljnih jezika ima . One koji nemaju slobodno izbjegavajte! ;)tipoveTip je apstrakcija koju dati p.j. razumije. Npr. kada napišemo , ovo "int" je tip int broj
varijable "broj".Tako će kompjuter znati, između ostalog, za tu varijablu.koliko memorije da rezervišePošto smo mu dali tu informaciju, onda nam može i ukazati na greške u programu koji pišemo. Npr. da ne možemo sabirati broj i slovo, kruške i jabuke...Također nas može i usmjeriti, npr. reći nam koje su operacije dostupne nad datim tipom, da ne moramo nagađati.
Da vidimo JShell u akciji:
Dakle, Java nam da dodijelimo broj varijabli koja je tipa (cijeli broj).ne da 4.5 int
To ima smisla itekako, jer bismo izgubili ovo "zarez pet"... :)Ako želimo da budemo pametniji od Jave, i da na silu "utrpamo" u to ide ovako:4.5 int
I šta smo dobili? Samo cijeli dio... Ali, nekad nam ovo baš i treba!Uglavnom, pouka je da trebamo slušati šta nam Java poručuje!To radi za naše dobro, nju nije briga ako je rezultat netačan, ako je to što želimo... :D
Naravno, imamo još puno toga reći o tipovima, tek smo "zagrebali površinu"!Npr. kako da grupišemo podatke? Kompleksni brojevi, podaci o ljudima, proizvodima itd?O tom ćemo pričati u poglavlju o klasama. :)
jshell>
jshell>
broj ==> 6
| Error:
| incompatible types: possible lossy conversion from double to int
| broj = 4.5;
| ^-^
jshell>
4.5;
broj ==> 4
broj = ;int 6int 6
= . ;broj 4 5broj 4 5
= (intbrojbroj )
2
Stringovi i karakteriPrije nego nastavimo dalje, moramo objasniti i stringove, jer se vrlo često koriste.String (iz en. nit, kanafa) koristi se za predstavljanje teksta, tj. niza karaktera.Karakter (en. je simbol) označava jedan simbol, bio to broj, slovo ili neki simbol, characteremoji...
Stringovi se pišu s :dvostrukim navodnicima
Stringovi se tretiraju specijalno u Javi, pa imamo i operator "sabiranja" nad njima.Npr. možemo "sabrati" 2 stringa, string s brojem i sl:
Ovo sabiranje se naziva (en. je nadovezati/spojiti/naštiklati).konkatenacija concatenateRadi dvosmjerno, možemo sabrati i broj sa stringom, npr. .5 + "hepek.abc"
se piše !String s velikim početnim slovom
String u pozadini koristi actere.char
Kao što smo već rekli, je samo jedan karakter.char
Piše se s :jednostrukim navodnicima
jshell>
"Poyy sviete!"
$1 ==> "Poyy sviete!"
jshell>
jshell>
jshell>
jshell>
jshell>
"Ime" + "Prezime"
$2 ==> "ImePrezime"
"x je " + 5
$3 ==> "x je 5"
"x je " + 5 + ", i kad se pomnoži s " + 3 + " daje " +
$4 ==> "x je 5, i kad se pomnoži s 3 daje 15"
"strin" + g
$5 ==> "string"
s ==> "ABC"
( *55
' '
s = String "ABC"String "ABC"
3
Dakle, karakter ne može biti prazan, niti može sadržati više karaktera.Za ove namjene koristi se ! :)String
Vrlo važne napomene:
string "1" nije isto kao broj 1karakter '1' nije isto kao broj 1string "1" nije isto kao karakter '1'postoje posebne funkcije za pretvaranje iz jednog tipa u drugi, ali otom potom...
jshell>
jshell>
jshell>
jshell>
a
$9 ==> 'a'
| Error:
| empty character literal
| ''
| ^
ab
| Error:
| unclosed character literal
| 'ab'
| ^
slovoA ==> 'A'
' '
''
' '
slovoA = 'A'charchar
1
NaredbeNaredbe (en. statements) su kao rečenice u govornom jeziku, i obično su u imperativnom obliku, kao da se obraćamo kompjuteru: uradi ovo, izbriši ono, upiši u fajl itd.Deklaracije varijabli su naredbe, npr. , može se čitati kaoint i = 5;
"napravi varijablu s imenom 'i' i dodijeli joj vrijednost 5! ODMAH!".Iako još nismo objasnili funkcije, neke od njih su također naredbe, npr:
Vrlo duga naredba je funkcija za printanje u konzolu.System.out.println
Do sada je JShell to automatski radio za nas, ispisivao vrijednost zadnjeg izraza, u svom nekom predefinisanom formatu... Ovako mi možemo ispisati šta god želimo. Primijetite da ispisani nema navodnika!String
Navodnici se samo !!! Nisu uključeni u samu vrijednost koriste za pisanje stringovastringa. Isto je i sa karakterima.
Da vidimo još par primjera:
Dakle, možemo proslijediti string direktno, ili varijablu koja je string, svejedno. :)Kraj naredbe se označava s (tačkazarez, en. semicolon).;
jshell>
Hello!
jshell>
jshell>
jshell>
;
x je 5
rezultat ==> "x je 5"
;
x je 5
.out.println(System "Hello!"System "Hello!")
.out.println( + System "x je " 5System "x je " 5)
rezultat = + ;String "x je " 5String "x je " 5
.out.println(rezultatSystemSystem )
1
Poyy svijete!Vjerovatno vam je do sada dodijao JShell i kucanje u konzoli... :DSada ćemo vidjeti kako se ustvari pokreću Java programi.Sastoji se iz 2 dijela: kompajliranje i pokretanje (en. run).
Kompajler (en. compiler) je program koji provjerava sintaksu našeg programa, da li se poklapaju tipovi itd. te nam ako ih pronađe.prijavljuje greškeI to sve prije nego smo i pokrenuli naš program! Predobro! :DTako smo sigurni da se bar u programu.neke greške neće pojavitiJavin kompajler se zove (skraćeno od Java compiler).javac
Ulaz u kompajler je izvorni tekst programa (en. source code) koji smo napisali (obični tekstualni fajlovi s nastavkom ), a izlaz su fajlovi koji sadrže izvršni kod, koji se .java
može pokrenuti nekako, izvršiti ( fajlovi)..class
Da vidimo napokon kako izgleda obavezni "Hello World" primjer:
Idući korak je pokretanje programa.Java programi se sastoje od naredbi (kod nezavisan od procesora i bytecode
operativnog sistema), koje su vrlo slične mašinskom kodu (specifičnom za svaki procesor).Izlaz iz kompajlera, fajlovi sadrže te naredbe, i njih izvršava tzv. JVM .class bytecode
(Java Virtuelna Mašina).JVM je ustvari program.java
Kompajliranje i pokretanje Java programa
2
Kada se pokrene prethodno prikazani program dobićemo sljedeći rezultat u konzoli:
Kompajliranje i pokretanje programaSadržaj programa sačuvajte u fajl . Primijetite da se PoyySvijeteApp.java mora zvati
, s nastavkom !isto kao i klasa .java
Kod mene se ovo sve nalazi u folderu .C:\programiranje
Kucamo sljedeće:
To je to, sada možemo nastaviti dalje.Svaki primjer koji budemo radili možete isprobati, nemojte mi slijepo vjerovati na riječ da fercera. :)
KomentariKomentari su tekst koji ne utiče na rezultat programa.Koriste se samo radi objašnjavanja koda, nekom drugom ili nama kad budemo čitali kasnije.Prva vrsta komentara se piše sa 2 kose crte (en. slash) i vrijedi .// do kraja linijeDruga vrsta je višelinijska (en. multiline) i počinje s a završava s ./* */
* komentar2
*/
argumenti
poruka
out poruka
// komentar1
/*
* komentar2
*/
class PoyySvijeteApp {
argumenti public static void main(String[] ) {
poruka String = "Poyy sviete!";
out porukaSystem. .println( );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
C:\programiranje>
C:\programiranje>
Poyy sviete!
sviete!PoyyPoyy
// komentar1
/*
* komentar2
*/
class PoyySvijeteApp {
public static void main(String[] ) {
String = "Poyy sviete!";
System. .println( );
}
}
PoyySvijeteApp.javajavacjavac
PoyySvijeteAppjavajava
1
Uslovno grananje toka programaKompjuteri obično izvršavaju naredbe jednu nakon druge tj. sekvencijalno.Međutim, potrebne su nam i naredbe za .uslovno grananjeTo jest, kada želimo izvršiti nešto samo pod datim .uslovimaU Javi za ovu svrhu imamo 2 naredbe: i .if switch
If naredbaGrananje pomoću naredbe je vrlo jednostavno. Ako je ispunjen onda će se taj if uslovdio koda izvršiti. U suprotnom program nastavlja dalje.
Ovo "uslov ispunjen" može biti DA ili NE, tj. ISTINA (en. true) ili NEISTINA (en. false). Ovaj se naziva po matematičaru George Boole-u.tip podatka Boolean
Ako se sjećate logike iz matematike, tablica istine, "I", "ILI", "NE" i ostalih, TO JE TO! :D
Logička operacija "I" (en. and) se u Javi piše kao &&Logička operacija "ILI" (en. or) se u Javi piše kao ||Logička operacija "NE" (en. negate, not) se u Javi piše kao , i piše se prije uslova !
koji negira, npr. .!small
Primjer:
Prethodni kod će ispisati "Nije toplo", jer uslov , tj. izraz uslovToplo nije ispunjen 21.33
je .> 25 false
Ovo se tretira kao !if else jedna naredbaAko želimo da izvršimo više od jedne naredbe u ili bloku, samo ih okružimo if else
zagradama: .if (uslov) { naredbe1... } else { naredbe2... }
Nakon linije 6 program nastavlja normalno sa svojim izvršenjem.
Slijedi i vizuelni dijagram izvršenja ove naredbe:
temperatura
uslovToplo temperatura
uslovToplo
out
out
temperatura double = 21.33;
uslovToplo temperatura boolean = > 25;
uslovToplo if ( ) // može i "if(temperatura > 25)"
outSystem. .println("Toplo je");
else
outSystem. .println("Nije toplo");
1
2
3
4
5
6
double = 21.33;
boolean = > 25;
if ( ) // može i "if(temperatura > 25)"
System. .println("Toplo je");
else
System. .println("Nije toplo");
2
Možemo imati i više uslova u jednoj naredbi, tj. niz .if-elseif-elseif-...-else
Ovi uslovi bi trebali biti tj. smisleni.međusobno isključivi
Ako napišete if (broj>5) {/* prvi */} else if (broj>7) {/* to nema puno smisla jer ako broj nije veći od 5, ne može biti drugi */}
veći od 7, nema šansone. :DAko jeste veći od 5, biće izvršen prvi blok, ali drugi blok koda NIKAD NEĆE BITI IZVRŠEN!
Ako postoji grana , ona će biti izvršena . Ako ne else ako nijedan uslov nije ispunjenpostoji i nijedan uslov nije ispunjen, ništa neće biti izvršeno od te cijele if naredbe.else
Switch naredbaGrananje pomoću naredbe može učiniti kod dosta preglednijim.switch-case
Ova naredba se koristi umjesto mnoštva if-else grana, od koje svaka grana provjerava je li nekoj vrijednosti.varijabla jednaka
U Javi možete "switchati" cijele brojeve, karaktere, stringove i enumeracije.
Na liniji 2 ispituje se čemu je , naravno.jednaka vrijednost varijable i redom odozgoPrvi slučaj (en. case) koji bude ispunjen će biti izvršen.Ako je vrijednost varijable broj 5, ispisaće se na ekran "Pet".i
Često ne znamo koliko ima mogućih slučajeva, pa onda trebamo odlučiti šta da uradimo po tom pitanju.Za to nam služi ključna riječ . To je ustvari ona grana u naredbi! ;)default else if
i
i
out
out
out
i int = 5;
i switch ( ) {
case 3:
outSystem. .println("Tri");
break;
case 5:
outSystem. .println("Pet");
break;
default:
outSystem. .println("Ne znam...");
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
int = 5;
switch ( ) {
case 3:
System. .println("Tri");
break;
case 5:
System. .println("Pet");
break;
default:
System. .println("Ne znam...");
break;
}
3
1
Ponavljanje naredbiKada želimo ponavljati izvršiti neki dio koda više puta, najjednostavniji način je copy-paste. Kopiramo ga n-puta i završeno! :D
Međutim, ovo nije fleksibilno kada kasnije želimo da izmijenimo taj djelić koda.Tada moramo izmijeniti sve linije... :/
Zato postoje specijalne naredbe za : i .ponavljanje while for
Zovu se još i "petlje", jer se vrlo lahko zapetljati u njima.
While naredbaU sljedećem primjeru želimo izvršavati kod sve dok je neki ispunjen (en. while je uslov"dok").
Naravno, unutar tog bloka , inače se program uslov se mora mijenjati neće nikad zaustaviti.To se naziva i obično nije poželjna... :)beskonačna petlja
Uslov se ispituje u svakoj petlje. Dakle, svaki put kada se dođe do linije 5 uslov će iteracijise ponovo ispitati. Ako uslov nije zadovoljen, petlja se zaustavlja i program se nastavlja izvršavati na liniji 6. Slijedi i vizuelni dijagram izvršenja ove naredbe:
For naredba
i
i
out i
i i
i int = 0;
i while( < 10) {
out iSystem. .println("Cifra i je: " + );
i i = + 1;
}
1
2
3
4
5
int = 0;
while( < 10) {
System. .println("Cifra i je: " + );
= + 1;
}
2
For naredbaJava ima i tzv. petlje. To su haman-ha petlje s finijom sintaksom.for while
Sljedeći primjer radi isto kao i prethodni sa petljom.while
Uopćena sintaksa for petlje je sljedeća: .for(inicijalizacije; uslov; koraci)
Vidimo da su dijelovi petlje razdvojeni tačkazarezom.for
Umjesto da deklarišemo varijable prije petlje, zgodno je deklarisati ih u sklopu petlje, jer nam poslije petlje one ne trebaju.Za to nam služi dio .inicijalizacije
Dio je isti kao i kod while petlje.uslov
Dio dolazi , isto kao linija 4 u našoj petlji.koraci na kraju petlje while
Koraci obično iz petlje.utiču na uslov za izlazSlijedi i vizuelni dijagram izvršenja ove naredbe:
i i i i
out i
i i i i for (int = 0; < 10; = + 1) {
out iSystem. .println("Cifra i je: " + );
}
1
2
3
for (int = 0; < 10; = + 1) {
System. .println("Cifra i je: " + );
}
1
FunkcijePrvo malo terminologije:
Potprogram (en. subprogram, subroutine) je koji možemo pozvati po .dio programa imenuU nekim jezicima pravi se razlika između (potprogram koji ima rezultat), i funkcije
(nema rezultat).procedureJava ih zove... khm... ... :DmetodeJa ću najčešće koristiti termin "funkcija" ili "metoda", kako kad.
Funkcijama se mogu proslijediti , tj. ulazni podaci koje funkcija može koristiti.argumenti
Slijedi primjer funkcije za sabiranje dva cijela broja:
Definicija funkcije ima sljedeće dijelove:
tip vrijednosti koju . Kod nas je to , jer je rezultat sabiranja dva vraća funkcija int
a također .int int
naziv funkcije, kod nas je to "suma"lista parametara u zagradama, ovdje su to brojevi i : .a b int a, int b
Ako nema parametara onda idu samo zagrade, npr. mojaFunkcija()tijelo funkcije u vitičastim zagradamaključna riječ i funkcijereturn rezultat
Da vidimo u JShellu kako da deklarišemo i pozovemo prethodnu funkciju:
a b
a b
a b int suma(int , int ) {
a breturn + ;
}
1
2
3
jshell>
jshell>
jshell>
jshell>
{
}
| created method suma(int,int)
$6 ==> 5
int suma(int , int ) {
return + ;
}
suma(int a, int bintint )
a + b;returnreturn
( , suma 1 4suma 1 4)
2
Funkcija se poziva navođenjem njenog imena, i parametara unutar zagrada.Npr. .suma(1, 4)
Pošto poziv funkcije vraća vrijednost , možemo je spasiti u varijablu,int
npr. .int rezultat = suma(1, 4)
Dakle, i poziv funkcije je izraz! Čim ga možemo dodijeliti varijabli. :)
1
NizoviKada trebamo zapamtiti više vrijednosti , to radimo pomoću (en. array).istog tipa nizaTip niza se piše kao . Ovo "tip" može biti , ili bilo šta drugo. Uglate tip[] int String
zagrade kažu da se radi o nizu, a ne "običnom" tipu.
Kada kreiramo niz, kažemo , gdje je neki broj, mora biti new tip[velicina] velicina
. Dužina niza je fiksna, ne može se promijeniti!int
Kada pristupamo elementu niza, to radimo preko indeksa, tj. rednog broja u nizu.Prvi element ima indeks , drugi ima indeks itd.0 1
Npr. da bi izmijenili prvi element pišemo .niz[0] = 9;
Ovdje nam odmah naumpadaju petlje koje smo naučili, i koje su vrlo korisne while for
pri radu s nizovima.
Ako želimo npr. spremiti ocjene studenta, za to možemo koristiti niz.Recimo da student ima 12 predmeta.
Vidimo da se ponavlja na 2 mjesta, i označava istu stvar, dužinu niza.12
Naravno, to nije dobra praksa, jer ako trebamo promijeniti dužinu niza, to moramo odraditi na više mjesta.Možemo napraviti novu varijablu u koju ćemo spremiti dužinu niza.Npr. i onda koristiti nju umjesto literala .int BR_OCJENA = 12; 12
Ovako je kod puno fleksibilniji.
Međutim, ne znamo uvijek dužinu niza unaprijed. Šta ako pravimo funkciju koja prima niz?Da proslijedimo uvijek i dužinu niza? To bi bilo vrlo nečitljivo i dosadno.Srećom, nizovi u Javi imaju polje (en. property) koje sadrži dužinu niza i zove se .length
Kada kažemo dobićemo dužinu niza. :)ocjene.length
Tako da smo u primjeru mogli/trebali napisati for(int i = 0; i < ocjene.length; .i++)
ocjene
ocjene
ocjene
i i i
out ocjene i
ocjene int[] ; // nije još inicijaliziran, ne bi ga trebali koristiti!
ocjene = new int[12]; // niz od 12 nula (po defaultu se popuni nulama)
ocjene [0] = 9;
i i i for(int = 0; < 12; ++) {
out ocjene iSystem. .println( [ ]);
}
1
2
3
4
5
6
7
8
int[] ; // nije još inicijaliziran, ne bi ga trebali koristiti!
= new int[12]; // niz od 12 nula (po defaultu se popuni nulama)
[0] = 9;
for(int = 0; < 12; ++) {
System. .println( [ ]);
}
2
Postoji još jedan zgodan način za inicijalizaciju niza.Ako znamo unaprijed šta niz sadrži, možemo odmah dodijeliti te vrijednosti nizu.Pritome ne moramo ni navoditi dužinu niza, jer će nam kompajler pomoći.
Kad smo već kod "zgoda", imamo i tzv. "poboljšanu for petlju" (en. enhanced for loop). Zove se još i "for-each" petlja.Ona se koristi kada želimo da prođemo kroz sve elemente niza.Ako nam treba i indeks onda moramo koristiti običnu for petlju...
Višedimenzionalni nizoviMožemo imati i , itd. Ne postoji ograničenje na dubinu u koju niz nizova niz nizova nizovaidemo. Nizovi sa 2 ili više dimenzija nazivaju se "višedimenzionalni" (en. multidimensional).
Dvodimenzionalni nizovi se zovu još i "matrice" (en. matrix).Matrice se često koriste u igricama i matematičkim programima.Npr. kad trebamo predstaviti stanje šahovske ploče i sl. to možemo uraditi sa matricom.Ugniježdeni nizovi ne moraju imati istu dužinu.
Recimo da imamo zgradu sa različitim brojem stanova po spratu. Svaki red predstavlja jedan sprat, i u svakom spratu imamo br. stanara za svaki stan. Trebamo ispisati koliko koji sprat ima ukupno stanara:
gradovi
grad gradovi
out grad
// array literal
gradovi String[] = { "Sarajevo", "Tuzla", "Mostar" };
// enhanced for loop
grad gradovi for(String : ) {
out gradSystem. .println( );
}
1
2
3
4
5
6
7
brStanaraPoStanovima
i i brStanaraPoStanovima length i
brStanaraSprata
j j brStanaraPoStanovima i length j
brStanaraSprata brStanaraPoStanovima i j
out i brStanaraSprata
brStanaraPoStanovima int[][] = {
{1, 2, 3, 4}, // prvi red (sprat)
{5, 6, 2} // drugi red (sprat)
};
i i brStanaraPoStanovima length i for (int = 0; < . ; ++ ) {
brStanaraSprata int = 0;
j j brStanaraPoStanovima i length j for(int = 0; < [ ]. ; ++ ) {
brStanaraSprata brStanaraPoStanovima i j+= [ ][ ];
}
out i brStanaraSprataSystem. .println("Br. stanara sprata " + + " je: " +
}
1
2
3
4
5
6
7
8
9
10
11
12
// array literal
String[] = { "Sarajevo", "Tuzla", "Mostar" };
// enhanced for loop
for(String : ) {
System. .println( );
}
int[][] = {
{1, 2, 3, 4}, // prvi red (sprat)
{5, 6, 2} // drugi red (sprat)
};
for (int = 0; < . ; ++ ) {
int = 0;
for(int = 0; < [ ]. ; ++ ) {
+= [ ][ ];
}
System. .println("Br. stanara sprata " + + " je: " +
}
3
Rezultat:
. stanara sprata je: Br 0 10Br 0 10
. stanara sprata je: Br 1 13Br 1 13
1
Tipovi, opetRekli smo da ćemo nastaviti malo detaljnije o tipovima. :)Java ima 2 vrste tipova: primitivne i referentne.
Primitivni tipoviPrimitivnih tipova ima 8 i to su , , , , , , i boolean char int long short byte double
.float
Pišu se . Ne možemo definisati nove primitivne tipove u Javi!malim slovima
Primitivni tipovi predstavljaju "sirove podatke", većina referentnih tipova ih koristi u pozadini.
Referentni tipoviU referentne tipove ubrajaju se svi tipovi koji .nisu primitivniZato se negdje nazivaju i "neprimitivnim tipovima"...Ove tipove .možemo definisati i mi samiKonvencija je da se pišu velikim početnim slovom.
Već smo vidjeli par primjera ovog tipa: i nizovi.String
U nastavku ćemo vidjeti kako da definišemo klase, koje spadaju u referentne tipove.
ReferenceVarijable koje imaju referentni tip nazivaju se .referenceVAŽNO: Svaka referenca može imati vrijednost !!!null
Primitivne varijable nikada ne mogu biti .null
1
KlaseRecimo da imamo zadatak da napravimo program za praćenje učenika u razredu.Za svakog učenika moramo unijeti ime, prezime i prosječnu ocjenu.Trebamo ispisati sve ove podatke i na kraju naći prosjek razreda.
Kako bismo ovo uradili s do sada naučenim konceptima?Imena možemo staviti npr. u niz .String[] imena
Prezimena možemo staviti npr. u niz .String[] prezimena
Ocjene ćemo staviti npr. u niz .double[] prosjeci
Iako ovaj kod radi kako treba, nekako se ne osjećamo dobro zbog njega... :DIndeksi pršte na sve strane, šta ako je jedan od nizova kraći itd?Također, ovi nizovi nam uopće ne govore da su .dio jedne cjelineNeko ko čita ovaj kod mora se dobro zapitati šta oni predstavljaju.To je možda lahko na ovom (namjerno) malom primjeru, ali u projektima s milionima linija koda, niko nema vremena da "razbija glavu"... :)
Ovo je jedan od razloga zašto se uvodi apstrakcija klase.Klasa je recept za pravljenje . Kaže se još i da je objekat .objekta instanca klaseObjekat je obično skup primitivnih varijabli i drugih objekata.Dakle, koristi se za .logičko grupisanje vrijednostiU prethodnom primjeru trebali bismo grupisati ime, prezime i prosjek. Ova nova apstrakcija tj. klasa bi se zvala . To bi izgledalo ovako:Ucenik
imena
prezimena
prosjeci
zbirProsjeka
i i imena length i
out prezimena i imena i
out prosjeci i
zbirProsjeka prosjeci i
prosjekRazreda zbirProsjeka imena length
out prosjekRazreda
imenaString[] ;
prezimenaString[] ;
prosjecidouble[] ;
zbirProsjeka double = 0;
i i imena length i for(int = 0; < . ; ++) {
out prezimena i imena iSystem. .print("U#enik: " + [ ] + " " + [ ]
out prosjeci iSystem. .println(", prosjek: " + [ ]);
zbirProsjeka prosjeci i+= [ ];
}
prosjekRazreda zbirProsjeka imena lengthdouble = / . ;
out prosjekRazredaSystem. .println("Ukupan prosjek razreda: " + )
1
2
3
4
5
6
7
8
9
10
11
12
String[] ;
String[] ;
double[] ;
double = 0;
for(int = 0; < . ; ++) {
System. .print("U#enik: " + [ ] + " " + [ ]
System. .println(", prosjek: " + [ ]);
+= [ ];
}
double = / . ;
System. .println("Ukupan prosjek razreda: " + )
2
Kreiranje objektaDa bismo kreirali novi objekat klase , koristimo operator :Ucenik new
Ovaj operator poziva "funkciju" koja kreira novi objekat i naziva se .konstruktorKompajler nam za nas, kasnije ćemo vidjeti kako sami automatski kreira konstruktormožemo definisati konstruktor(e).
Polja klaseVrijednosti unutar klase nazivaju se / (en. fields, properties), u ovom polja klase atributislučaju to su ime, prezime i prosjek.Pošto im nismo dodijelili nikakve početne vrijednosti, Java će ih postaviti na defaultne
:vrijednosti
referentne na nullbrojevne primitivne na 0boolean primitivne na false
Dakle, u ovom trenutku, ime ima vrijednost , prezime ima vrijednost , prosjek null null
vrijednost . Idemo im dati neke smislene vrijednosti:0
Odabir polja se piše navođenjem reference, pa tačka, a zatim naziv polja.
Dok nismo zaboravili, prethodni primjer sada izgleda puno bolje i razumljivije:
ime
prezime
prosjek
class Ucenik {
imeString ;
prezimeString ;
prosjekdouble ;
}
1
2
3
4
5
ucenik
ucenik ime
ucenik prezime
ucenik prosjek
class Ucenik {
String ;
String ;
double ;
}
Ucenik = new Ucenik();
. = "Mujo";
. = "Mujanovi#";
. = 4.3D;
3
ucenici
zbirProsjeka
u ucenici
out u prezime u ime
out u prosjek
zbirProsjeka u prosjek
prosjekRazreda zbirProsjeka ucenici length
out prosjekRazreda
uceniciUcenik[] ;
zbirProsjeka double = 0;
u ucenici for(Ucenik : ) {
out u prezime u imeSystem. .print("U#enik: " + . + " " + . );
out u prosjekSystem. .println(", prosjek: " + . );
zbirProsjeka u prosjek+= . ;
}
prosjekRazreda zbirProsjeka ucenici lengthdouble = / . ;
out prosjekRazredaSystem. .println("Ukupan prosjek razreda: " + )
1
2
3
4
5
6
7
8
9
10
Ucenik[] ;
double = 0;
for(Ucenik : ) {
System. .print("U#enik: " + . + " " + . );
System. .println(", prosjek: " + . );
+= . ;
}
double = / . ;
System. .println("Ukupan prosjek razreda: " + )
1
Scope, opsegSvaka varijabla u Javi ima svoj scope.Scope je u kom je ta varijabla tj. može se tu koristiti.dio programa vidljivaScope-ovi mogu biti ugniježdeni.Unutrašnji scope može vidjeti/koristiti varijable iz vanjskog scope.Unutrašnji scope može definisati koja se zove kao varijabla u novu varijablu istovanjskom scope!
Postoje dva najvažnija scope-a a to su: scope klase i scope metode.Scope metode je ugniježden u scope klase.Npr. polja klase se mogu koristiti u metodama, ali varijable definisane u metodi se ne mogu koristiti u klasi:
Na liniji 3. vidimo primjer nedozvoljene operacije. Ako se pitate zašto:
Polja objekta se inicijalizuju čim se pozove konstruktor te klase.Metode se pozivaju tj. ručno, on-demand.na zahtjevZato nam Java ne dozvoljava tu operaciju.Također, kompajler ne zna na koje mislimo, da li ono iz ili iz y bla()
... :)meh()
Primijetite i to da varijabla iz s varijablom iz !!!y bla() nema nikakve veze y meh()
To su dva skroz nezavisna bloka, svaki ima svoj scope.
x
y x
y x
class Abc {
x int = 5;
// int z = y + 2; // ovo nije dozvoljeno
void bla() {
y x int = + 1;
}
void meh() {
y x int = + 3;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
class Abc {
int = 5;
// int z = y + 2; // ovo nije dozvoljeno
void bla() {
int = + 1;
}
void meh() {
int = + 3;
}
}
2
Neki primjeri nedozvoljenog definisanja varijabli su dati u metodi .ne()
Otkomentarišite liniju po liniju da vidite šta će vam kompajler reći.U metodi dati su neki primjeri dozvoljenog korištenja istoimenih varijabli.da()
x
y
i i i
duzina
duzina
str
str
x x x
static void ne() {
x int = 1;
{
// int x = 1; // nope
}
{
y int = 1;
}
// y++; // ne može se koristiti izvan bloka! (isto je i za if, for, while, switch)
// for(int x = 1; x < 5; x++) { } // x vec definisano na pocetku metode
// while(true) { int x = 1; } // x vec definisano na pocetku metode
i i i for(int = 1; < 5; ++) {
// for(int i = 1; i < 5; i++) { } // i vec definisano u vanjskoj petlji
}
}
duzinaint ;
static void da() {
// zasjenjivanje polja (shadowing)
// pošto metoda ima svoj scope,
// dozvoljeno joj je uvesti novu varijablu istog imena kao polje klase
duzina int = 5;
// razli#iti blokovi
{
str String = "abc";
}
{
str String = "abc"; // yep, nije na istom NIVOU
}
// razli#ite petlje/blokovi
x x x for(int = 1; < 5; ++) { }
static void ne() {
int = 1;
{
// int x = 1; // nope
}
{
int = 1;
}
// y++; // ne može se koristiti izvan bloka! (isto je i za if, for, while, switch)
// for(int x = 1; x < 5; x++) { } // x vec definisano na pocetku metode
// while(true) { int x = 1; } // x vec definisano na pocetku metode
for(int = 1; < 5; ++) {
// for(int i = 1; i < 5; i++) { } // i vec definisano u vanjskoj petlji
}
}
int ;
static void da() {
// zasjenjivanje polja (shadowing)
// pošto metoda ima svoj scope,
// dozvoljeno joj je uvesti novu varijablu istog imena kao polje klase
int = 5;
// razli#iti blokovi
{
String = "abc";
}
{
String = "abc"; // yep, nije na istom NIVOU
}
// razli#ite petlje/blokovi
for(int = 1; < 5; ++) { }
3
x x x x x x for(int = 1; < 5; ++) { } // fercera
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
for(int = 1; < 5; ++) { } // fercera
}