Programmeerimiskeeltega seotud mõisted


Juhtimine (control) - käskude täitmise järjekorra määramine. Vt. joonis1 ja joonis2.
Andmed (data) - imperatiivses paradigmas on andmed passiivsed, OOP kapseldab andmed ja operatsioonid kokku.
Programm  on algoritmi realisatsioon konkreetses programmeerimiskeeles - seega programmil on reeglina:
Märkus: Kõik programmid ei pruugi omada selget sisendit/väljundit - mõned "teevad" midagi interaktsioonis keskkonnaga - näit. op.süsteem.

Programme projekteeritakse (design) hoolikalt. Meetodite arengust - struktuurprogrammeerimine, objektorienteeritud programmeerimine.
Ülalt alla projekteerimine. Alt-üles programmeerimine, moodulid, taaskasutatavad komponendid.

Näide. Ruutvõrrandi  ax2 + bx + c = 0  reaallahendite leidmine.
  1. Leiame käsiraamatust  lahendivalemi (kõik teavad?)
  2. Sisendiks on kordajad a, b, c
  3. Väljundiks on lahendid x1 ja x2
  4. Eriolukorrad:
Algoritm:
  1. Sisestada algandmed a, b, c
  2. Kui a=0, siis viga
  3. Arvutada d = b2 - 4ac
  4. Kui d < 0, siis reaallahendid puuduvad
  5. Arvutada x1 ja x2 lahendivalemi põhjal
  6. Väljastada x1 ja x2
Detailiseerime need sammud. Joonistame illustreerimiseks skeemid.
Lõpuks jõuame Java-programmini:



public class Ruutvorrand {

  // Klass TextIO.class   D.Eck'i 6pikust peab olema jooksvas kataloogis!

   public static void main (String[] param) {

     // andmete sisestus
      TextIO.putln ("Ruutv6rrandi lahendamine. Sisesta kordajad:");
      TextIO.put ("a = ");
      double a = TextIO.getlnDouble();
      TextIO.put ("b = ");
      double b = TextIO.getlnDouble();
      TextIO.put ("c = ");
      double c = TextIO.getlnDouble();

     // tulemuse leidmine
      if (Math.abs (a) < 0.000000000001)  // a == 0.
         throw new RuntimeException ("\nTegemist pole ruutv6rrandiga, a==0.");
      double d = b*b - 4.*a*c;
      if (d < 0.)
         throw new RuntimeException ("\nReaallahendid puuduvad!");
      double x1 = (-b + Math.sqrt (d)) / (2.*a);
      double x2 = (-b - Math.sqrt (d)) / (2.*a);

     // tulemuste v2ljastamine
      TextIO.putln ("x1 = " + x1);
      TextIO.putln ("x2 = " + x2);
        
   } // main

} // Ruutvorrand


Tutvumine programmeerimiskeele detailidega:


Niisuguse sissejuhatuse järel on aeg minna lähemale keelele Java. Selgitused ja näited tulevad eraldi, järgnev on lühikonspekt Java kohta.

Java põhimõisted

Java definitsioon Sunilt

Kompileerimisüksus:
          võimalik paketikirjeldus
          võimalikud impordikirjeldused
          klasside ja/või liideste kirjeldused

Klassikirjeldus:
          päis (modifikaatorid, seos teiste klasside ja liidestega)
          klassimuutujad (static)
          isendimuutujad (igal isendil individuaalsed)
          konstruktorid (erilised klassimeetodid isendite loomiseks)
          klassimeetodid (static)
          isendimeetodid

Meetod:
          päis (parameetrid, võimalikud eriolukorrad)
          sisu (plokk)

Plokk:
          muutujakirjeldused
          laused (direktiivid)
          võimalikud sisemiste klasside kirjeldused



Klass, kompileerimisüksus, pakett

Kompileerimisüksus

Java-programmi tekst koosneb klasside (class) ja/või liideste (interface) kirjeldustest. Preprotsessorit teksti eeltöötluseks ei kasutata.

Kompileerimisüksus (ingl.k. compilation unit) on Java lähtetekst (faililaiendiga .java), mis reeglina sisaldab ühte avalikku (public) klassi või liidest. Selle klassi/liidese nimi on ühtlasi failinime prefiksiks. NB! Java puhul on suurte-väikeste tähtede erinevus oluline! On kombeks, et klassi/liidese nimi algab suurtähega (vastavalt siis ka failinimi).

Kompileerimisüksus kuulub mingi paketi koosseisu.

Kompileerimine

Java kompilaatorile javac antakse ette kompileerimisüksus (näit. HelloApplet.java)  ja kui vigu ei teki, siis on tulemuseks transleeritud klass(id) faililaiendiga .class (näit. HelloApplet.class). Transleeritud klasside formaadiks on platvormist sõltumatu Java virtuaalmasina baitkood.
javac HelloApplet.java
Kui kompileerimisüksus on jooksvas kataloogis, siis pole klassitee (ingl.k. class path) määramine tavaliselt vajalik. Kui kompilaatorile on tarvis kirjeldada teed vajalike transleeritud klassideni, siis võib seda teha käsurea parameetriga -classpath või läbi keskkonnamuutuja CLASSPATH . Kui transleeritud klassid tuleb paigutada mingisse muusse kataloogi, siis saab seda teha käsurea parameetri -d abil.

Pakett

Pakett (ingl.k. package) on loogiliselt seotud kompileerimisüksuste hulk (n.ö. teek). Pakettide nimed on liitnimed, milles nimeosad kirjutatakse väiketähtedega ja nende eraldajana kasutatakse punkti (näit. java.awt.event). Üldisemad nimeosad paiknevad eespool.
Liitnimi on vajalik paketile viitamiseks failisüsteemis - Java keele seisukohalt on paketinimed kõik samal tasemel (puudub alampaketi mõiste). Paketid võimaldavad klasse grupeerida ja määrata meetodite nähtavuspiirkonda.
Nende klasside kasutamiseks, mis paiknevad mingi paketi koosseisus, nad imporditakse (import). Pakett java.langimporditakse vaikimisi.
Paketikirjeldus (package) määrab antud kompileerimisüksuse jaoks, millisesse paketti ta kuulub. Kõik need kompileerimisüksused, millel paketikirjeldus puudub, kuuluvad ühte suurde nimetusse paketti.

Klass

Klass sisaldab klassimuutujaid, klassimeetodeid, algatajaid, konstruktoreid, isendimuutujaid ja isendimeetodeid (hetkel ei anna täpset definitsiooni, klassi omadused on reeglina static). Klass on alati mingi teise klassi alamklass (extends-täiend), kui sellekohane viide puudub, siis java.lang.Object alamklass.

Programmi käivitamine käsurealt

Käsurealt saab käivitada neid klasse, milles leidub klassimeetod, mille signatuur (nimi ja parameetrite tüübid) on:
public static void main (String[] kasureaparameetrid)
s.t. avaliku (public) klassimeetodi (static) nimi on main, tagastatav väärtus puudub (void) ja sisendparameetriks on stringide massiiv. Seda nim. Java rakenduseks (application).
Interpretaator java peab paiknema käivitatavate programmide otsimisteel ning klass peab olema transleeritud ning paiknema klassiteel (jooksev kataloog on tavaliselt klassiteel). Näit.:
java HelloWeb  [kui vaja, siis siin järel parameetrid]
Klassifaili laiendit .class ei kirjutata, suur- ja väiketähtede erinevus on oluline.
Klassiteed saab määrata käsurea parameetriga -classpath või keskkonnamuutujaga CLASSPATH .

Rakend

Rakend (ingl.k. applet) on klassi java.applet.Applet (või mõne selle alamklassi) isend, mida saab paigutada veebilehele ja käivitada veebilehitsejas.
Veebilehel (s.t. vastavas html-failis) määrab rakendi omadused applet-märgis (ingl.k. applet-tag), mille kohustuslikeks parameetriteks on code (klassi nimi), width (rakendi akna laius pikselites) ning height (akna kõrgus).
Silumiseks saab kasutada ka programmi appletviewer veebilehitseja asemel.
Rakendi nähtavaks muutmisel on üheks võimaluseks üle katta meetod paint() signatuuriga:
public void paint (java.awt.Graphics aken)
Rakendite silumisel tuleb luua applet-märgistega veebileht, mis viitab silutavale klassile (s.t. transleeritud klassile laiendiga .class). Klassi transleerimine toimub tavalisel viisil javac abil.

Java leksika

Kommentaarid

Pilt tüübisüsteemi kohta







Loenditüüp (alates Java 5)

   Näitenum Mast {RISTI, RUUTU, ARTU, PADA};
public static Mast m = Mast.RISTI;

Avaldis


(parameetrid)

[ indeks]

avaldis++

avaldis--

++avaldis

--avaldis

+ avaldis
-avaldis


~ avaldis

! loogiline_avaldis

new konstruktor(parameetrid)

(tüüp)avaldis

avaldis * avaldis

 avaldis / avaldis

 avaldis %avaldis

 avaldis + avaldis

sõne + sõne

avaldis - avaldis

avaldis  <<  kohtade_arv

avaldis < avaldis

avaldis  <= avaldis

 avaldis  > avaldis

avaldis >=  avaldis

avaldis  ==  avaldis

 avaldis !=  avaldis

 avaldis & avaldis

avaldis ^ avaldis

avaldis | avaldis

 avaldis && avaldis

avaldis  || avaldis


 L-väärtus = avaldis

  L-väärtustehe = avaldis
Näide

Piiritlejad (modifikaatorid)

Laused (direktiivid)

Kokkuvõtvalt joonis1 ja joonis2

Plokk

Tühidirektiiv

Javas lõpeb lause kas semikooloni või plokki lõpetava suluga. Alati võib lause kohal olla lihtsalt semikoolon (tühidirektiiv).

Avaldisdirektiiv

Näiteks meetodi poole pöördumine või omistamine.

Naasmisdirektiiv

Kasutatakse meetodi töö lõpetamiseks. Edastab antud meetodi töö tulemuse seda välja kutsunud meetodile.

Juhtimisstruktuurid

pilt1 pilt2

Tingimusdirektiiv

Võimaldab teha programmis hargnemisi vastavalt antud tingimuste täidetusele.
Näide


Eelkontrolliga tsüklidirektiiv

Tsükli sisu täidetakse juhul, kui antud tingimus on tõene.

Järelkontrolliga tsüklidirektiiv

Näide

Üldtsüklidirektiiv

Tsükli päis koosneb kolmest osast: initsialiseerimine, jätkamistingimus ja sammu järel tehtav tegevus. Tsükli sisu täidetakse juhul, kui jätkamistingimus on tõene.
Näide 1
Näide 2
Näide 3

Tsükkel üle kogumi (alates Java 5)

for (objekt : kogum) direktiiv;

public static void main (String[] args) {
for (String arg : args)
System.out.print (arg + " ");
}

Katkestusdirektiiv

Tsüklist või lülitidirektiivist väljumine.
Näide

Jätkamisdirektiiv

Tsüklisammu lõpetamine.

Lülitidirektiiv

Valik lüliti väärtuse järgi (täisarvud, loend, char, boolean, alates jdk1.7 String).
Näide 1
Näide 2

assert

Alates Java 1.4 on olemas tingimuse kontrolli direktiiv assert, mida saab sisse ja välja lülitada. Kui tingimus ei ole täidetud, siis programmi töö katkeb veateatega ja väljastatakse parameetriks oleva avaldise väärtus (kui see on antud).

Kompileerimisel: javac -source 1.4 Klass.java

Lahendamisel: java -ea Klass


assert (tingimus)

assert tingimus : avaldis


Jaanus Pöial