1 tema. Paprastos programėlės

Turinys

 1 pavyzdys. Pasisveikinimas
 2 pavyzdys. Vėliava
 3 pavyzdys. Antraštė ir mygtukas
 4 pavyzdys. Veikiantis mygtukas
 5 pavyzdys. Įvedimo laukas
 6 pavyzdys. Pirmoji Java programa
 7 pavyzdys. Programėlė: kvadratinė šaknis
 8 pavyzdys. Įskiepis: kvadratinė šaknis
 9 pavyzdys. Kvadratinė lygtis
 10 pavyzdys. Prisistatymas
 Kaip viską įsivaizduoti?
 Užduotis
Apletai (angl. little application) arba lietuviškai - įskiepiai yra nedidelės Java programos, kurios vykdomomos interneto naršyklės lange. Įskiepis - labai tikslus, netgi pedantiškas vertimas. Todėl truputį šaltas. Galbut nepadarysime didelės žalos gimtajai kalbai, jeigu kartais pavadinsime tas programėles apletais. Šis žodelis primena kompiuterio pelės spragtelėjimą, po kurio atsidaro langas su programa.
Kad įskiepis pradėtų veikti, reikia parašyti programos tekstą, išsaugoti jį faile su plėtiniu java (pavyzdžiui, Appl.java) sukompiliavus gauti failą su plėtiniu .class ( Appl.class) ir įterpti į html puslapį nuorodą, pavyzdžiui,
    <APPLET
	code	= "Appl.class"
	width	= "300"
	height	= "200">
    </APPLET>
 
Jeigu nėra klaidų, atvėrus naršyklės langą apletas pradės veikti. Įskiepiams skirti pirmieji šeši mūsų pavyzdžiai.
Tačiau Java kalba galime rašyti ir įprastines, t.y. ne naršyklės lange vykdomas programas. Trys paskutiniai pavyzdžiai skirti būtent joms.

1 pavyzdys. Tiesiog pasisveikinimas

Šis apletas tik pasisveikina ir daugiau nieko.
	  
import java.awt.*;
import java.applet.*;

public class Appl extends Applet 
{ 
public void init() { }
	  
public void paint(Graphics g) 
{
g.drawString("Sveiki pakliuvę į Java salą!!", 50, 60 );
}
}
	  
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.

   Į pradžią   

2 pavyzdys. Vėliavos piešinys

Objektas g, kurį naudojome pirmajame pavyzdyje gali ne tik užrašyti tekstą. Paprašykime, kad jis nupieštų Lietuvos vėliavą.
import java.awt.*;
import java.applet.*;
public class Appl_1 extends Applet 
{
public void init() {}
public void paint(Graphics g)
{
g.setColor(Color.yellow);
g.fillRect(50,10,200,40);
g.setColor(Color.green);
g.fillRect(50,50,200,40);
g.setColor(Color.red);
g.fillRect(50,90,200,40);
g.setColor(Color.black);
g.drawString("Sveiki matematikai, 
pakliuvę į Java salą!!", 50, 180 );
}
}
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.

Pabandykite pakeisti programos tekstą, kad g nupieštų kitokį piešinį ir užrašytų kitokius tekstus. Išbandykite metodus g.drawOval(a,b,c,d), g.fillOval(a,b,c,d).

   Į pradžią   

3 pavyzdys. Antraštė ir mygtukas


Įdėkime į savo apletą šį tą daugiau - antraštę ir mygtuką.
import java.awt.*;
import java.applet.*;


public class Appl_2 extends Applet {
	
Label antr, antr1;
Button mygt;
public void init() {
setLayout(new BorderLayout());	
antr = new Label("Sveiki pakliuvę į Java salą!!", Label.CENTER);	
antr1 = new Label("Salos gyventojų sveikinimas");
mygt = new Button("Paspauskite, nieko blogo neatsitiks!");
add("North",antr1);
add("Center",antr);
add("South",mygt);
}
}
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.


Pabandykite įdėti daugiau antraščių ir mygtukų. Pakeiskite objektą BorderLayout() objektu GridLayout(r,c), čia r ir c - natūralieji skaičiai (eilučių ir stulpelių skaičiai apleto plane).

   Į pradžią   

4 pavyzdys. Veikiantis mygtukas

Trečiajame pavyzdyje įdėjome mygtuką, tačiau iš jo nebuvo daug naudos - apletui buvo tas pats, ar spaudėme mygtuką, ar ne. Dabar priverskime programą reaguoti į įvykį.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Appl_3 extends Applet implements ActionListener{
	
Label antr, antr1;
Button mygt;
public void init() {
setLayout(new BorderLayout());	
antr = new Label("Sveiki pakliuvę į Java salą!!",Label.CENTER);		
antr1 = new Label("Salos gyventojų sveikinimas");
mygt = new Button("Paspauskite, nieko blogo neatsitiks!");
mygt.addActionListener(this);
add("North",antr1);
add("Center",antr);
add("South",mygt);
}
	
public void actionPerformed(ActionEvent a_e)
{
if (a_e.getSource()==mygt) antr.setText("Tikėkimės, 
kad čia jums patiks.");
}
}
  
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.
Gerai išnagrinėkite programos tekstą. Tikriausiai, daugelis jos eilučių - tamsus miškas. Paprašykite dėstytojo, kad paaiškintų, ką kurios eilutės nurodo. Kai paaiškės - galėsite patys įdėti mygtukus ir nurodyti, ką reikia daryti, kai jie nuspaudžiami.

   Į pradžią   

5 pavyzdys. Duomenų įvedimo laukas

Yra ne vienas būdas perduoti duomenis įskiepiui. Šiame pavyzdyje duomenys (tekstas) tiesiog įrašomas į įvedimo lauką, kad programa jį juos nuskaitytų.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Appl_4 extends Applet implements ActionListener{
	
Label antr1, antr;
Button mygt;
TextField txt;
public void init() {
setLayout(new GridLayout(4,1));	
antr1 = new Label("Duomenų įvedimo laukas",Label.CENTER);
txt = new TextField(); 
add(txt);		
antr = new Label(" ");
mygt = new Button("Įvedę tekstą, paspauskite!");
mygt.addActionListener(this);
add("North",antr1);
add("Center",antr);
add("South",mygt);
}
	
public void actionPerformed(ActionEvent a_e)
{
if (a_e.getSource()==mygt) 
antr.setText(txt.getText()); 
txt.setText("");
}
}
  
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.

   Į pradžią   

6 pavyzdys. Pirmoji Java programa

Jeigu jūs norite rašyti ne apletą, o "tikrą" Java programa, kurios vykdymui nereikalinga interneto naršyklė, reikės šiek tiek pakeisti apleto programos tekstą.
Paskalio žinovų turbūt nenustebins toks tekstas.
	
 public class Prog_1 {
    public static void main ( String arg[] ) {
        System.out.println ("Mano pirmoji Java programa!");
    }
} 
Ką turėtų nuveikti tokia programa - aišku. Belieka priversti dirbti. Pirmiausia, kaip ir įskiepį, kompiliuojame ir gauname failą Prog_1.class. Tada belieka tame pačiame aplanke įvykdyti komandą
java Prog_1
Atsisiųskite programos tekstą.

   Į pradžią   

7 pavyzdys. Programėlė: kvadratinės šaknis


Dažniausiai duomenys yra skaičiai. Kaip priversti programą tekstinius duomenis, įvestus iš klaviatūros ar įskiepio įvedimo lauko, suprasti kaip skaičius ir atlikti su jais reikalingus veiksmus? Java komandos, priverčiančios tai daryti iš pradžių tikriausiai pasirodys gana keistos.
Sukurkime nedidelę programėlę, kuri ką nors apskaičiuotų. Pavyzdžiui, ištrauktų kvadratinę šaknį iš įvesto skaičiaus. Programos tekstas, gali būti, pavyzdžiui, toks:
import java.io.*;
public class Kvadr_sakn{
public static void main ( String arg[] ) throws IOException {
String a_iv;

double a;
BufferedReader br = new BufferedReader ( 
new InputStreamReader (System.in)); 
        
System.out.println ("Galiu istraukti kvadratine sakni");
System.out.print ("Iveskite skaiciu: ");
a_iv = br.readLine();
a = Double.parseDouble(a_iv);
        
System.out.println ("Kvadratine saknis is skaiciaus "+ a +" lygi");
System.out.println (" "+Math.sqrt(a));
System.in.read();
}
}
Kai kurios teksto eilutės tikriausiai atrodo gana mįslingai. Jų prasmė paaiškės gerokai vėliau - kai įgysime daugiau patirties. O dabar pakaks žinoti, kam jos skirtos: pirmiausia sukuriame įvedimo iš klaviatūros objektą; įvestą informaciją priskiriame String tipo kintamajam; nurodome, kad ši informacija turi būti paversta dvigubo tikslumo (double) skaičiumi; liepiame atlikti skaičiavimus ir išvesti rezultatus į ekraną.
Atsisiųskite programos tekstą, sukompiliuokite ir įvykdykite.

   Į pradžią   

8 pavyzdys. Įskiepis: kvadratinė šaknis

Dabar tą pačią kvadratinės šaknies traukimo programą perrašykime taip, kad ją galėtume vykdyti naršyklės lange. Darbų teks nuveikti dar daugiau: sukurti įskiepio elementus (mygtukus, antraštes, įvedimo lauką), juos išdėstyti, be to - priversti programą reaguoti į mūsų mūsų veiksmus...
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Appl_5 extends Applet implements ActionListener{
	
Label antr1,antr2, antr;
Button mygt;
TextField txt;
public void init() {
setLayout(new GridLayout(5,1));
antr1 = new Label("Kvadratinės šaknies traukimo programa",Label.CENTER);
add(antr1);
antr2 = new Label("Duomenų įvedimo laukas");
add(antr2);
txt = new TextField(); 
add(txt);	
		
antr = new Label("Čia bus rašomi atsakymai ");
add(antr);
mygt = new Button("Įvedę skaičių, paspauskite!");
mygt.addActionListener(this);
add(mygt);
}
	
public void actionPerformed(ActionEvent a_e)
{
if (a_e.getSource()==mygt) 
sakn();
}
	
void sakn()
{
double r,q;
r=Double.valueOf(txt.getText()).doubleValue();
q=Math.sqrt(r);	
antr.setText("Kvadratinė šaknis iš skaičiaus "+String.valueOf(r)+" 
lygi "+String.valueOf(q) );
} 
}
  
Pažiūrėkite, kaip veikia.   
Atsisiųskite programos tekstą.

   Į pradžią   

9 pavyzdys. Kvadratinės lygties šaknys

Pabandykite pabendrauti su Java. Ši programėlė išspręs jūsų pateiktą kvadratinę lygtį.
import java.io.*;
public class Prog_2 {
public static void main ( String arg[] ) throws IOException {
String aString, bString, cString;

double a,b,c;
BufferedReader br = new BufferedReader ( // kol kas priimkite tai
new InputStreamReader (System.in)); // kaip būtinybę
        
System.out.println ("Galiu isspresti kvadratine lygti: ax^2 + bx +c = 0");
System.out.print ("Parasykite koeficienta a: ");
aString = br.readLine();
a = Double.parseDouble(aString);

System.out.print ("Parasykite koeficienta b: ");
bString = br.readLine();
b = Double.parseDouble(bString);

System.out.print ("Parasykite koeficienta c: ");
cString = br.readLine();
c = Double.parseDouble(cString);

System.out.println ("Kvadratines lygties: "+a+"x^2 + "+b+"x +"+c+" = 0");
System.out.println ("sprendiniai yra:");
System.out.println ("x1="+((-b+Math.sqrt(b*b-4*a*c))/(2*a)));
System.out.println ("x2="+((-b-Math.sqrt(b*b-4*a*c))/(2*a)));
    }
}
Atsisiųskite programos tekstą.

   Į pradžią   

10 pavyzdys. Prisistatymas

Pabandykite pabendrauti su Java lietuviškai. Atkreipkite dėmesį į pasikeitusias skaitymo ir rašymo komandas.
import java.io.*;
public class Prog_3{
public static void main(String[] args) throws IOException {
 String sp,sv;
 BufferedReader br =  new BufferedReader(
 new InputStreamReader(System.in, "Cp775"));//jei displėjaus kodų lentelė Cp775

PrintWriter pw = new PrintWriter(
new OutputStreamWriter(System.out, "Cp775"),true);

pw.print("Parašykite savo vardą: ");
pw.flush();
sv=br.readLine();
pw.print("Parašykite savo pavardę: ");
pw.flush();
sp=br.readLine();
pw.println(" Jūs esate  "+sv+" "+sp);
    }
}
Atsisiųskite programos tekstą.

Kaip viską įsivaizduoti?

Gali būti, kad peržvelgus daugybę nelabai suprantamų Java kodo eilučių apėmė nerimas: kaip čia viskas jungiasi tarpusavyje, ką reiškia ir kaip viskas vyksta? Pabandykime susikurti, kad ir nelabai tikslų, užtat ryškų vaizdinį, kuris gali išgelbėti nuo melancholijos priepuolių.

Visų pirma suvokime programavimą kaip tam tikrų daiktų (objektų) gamybą. Taigi pagrindinis kiekvieno programuojančio žmogaus tikslas - sukurti kokį nors veikiantį daiktą (žinoma, gali būti ir šalutinių tikslų - pavyzdžiui, gauti įskaitą). Bet kokio daikto gamyba (automobilių, maisto produktų ir t.t.) prasideda nuo projekto. Kodas, kurį rašome Java kalba, tai ir yra mūsų projektas. Jame aprašome, koks turi būti mūsų daiktas. Java kalboje šio būsimo daikto projektą vadiname klase. Naudodamiesi tuo pačiu projektu galime sukurti daug vienodų (ar panašių) daiktų, t.y. objektų. Projekte (klasės kode) nurodome, kokios turi būti mūsų objekto savybės (kokie turi būti objektą aprašantys duomenys) ir ką mūsų objektas turi veikti (kokios šio objekto funkcijos t.y. metodai). Gali būti, kad mūsų tikslas yra sukurti ne vieną vientisą objektą, bet sudėtingą tarpusavyje susijusių objektų sistemą (šitaip galime įsivaizduoti, pavyzdžiui, automobilį arba kompiuterį). Tada programą sudarys iš kelių fragmentų sudarytas failas, o gal ir keletas failų. Tarkime, visas klaidas ištaisėme ir ,,išvertėme" programą į vidinę kompiuterio kalbą, t.y. programą sukompiliavome. Kaip gi prasideda jos vykdymas, t.y. ,,realių" objektų gaminimas?

Java programos vykdymas prasideda nuo main metodo, o įskiepio - nuo init . Kad objektas galėtų ką nors veikti, jis turi būti sukonstruotas . Kol kas mes nesirūpinome, kaip turi būti konstruojami mūsų objektai, manydami, kad kompiuteris pats žino, kaip tai daryti. Taip ir yra - jeigu kode nėra nurodymų, kaip konstruoti objektą, kompiuteris tai atlieka savo nuožiūra (naudoja numatytąjį arba standartinį konstruktorių), kaip šiame labai paprastame pavyzdyje:
import java.io.*;
 public class Java_programa_4  {
   
    public static void main(String[] args)throws IOException {
    
    int d=2;
    double a;
    
    BufferedReader br = new BufferedReader ( 
    new InputStreamReader (System.in)); 

    System.out.print ("Iveskite skaiciu: ");
    a = Double.parseDouble(br.readLine());

    System.out.print ("Ivestas skaičius "+a+"\n padauginę jį iš d gausime "+d*a);
    System.in.read();
   } 	
}
   
Mūsų klasėje tėra tik metodas main, jis ir padaro visą darbą. Tiek to ir darbo - padvigubinti skaičių. Taigi sukūrėme objektą - ,,įvesto skaičiaus dvigubintoją", daugiklis d yra vidinis mūsų objekto parametras.

O dabar modifikuokime savo programą taip, kad turėtume galimybę duoti nurodymus mūsų objekto konstruktoriui. Jeigu norime nurodinėti, tai konstruktorių turime patys aprašyti. Klasės konstruktorius yra specialus metodas, kurio vardas turi sutapti su klasės vardu. Taigi būtini tokie vardų sutapimai:
  • failo, kuriame įrašytas klasės su pagrindiniu metodu main kodas, pavadinimas turi sutapti su klasės vardu;
  • konstruktoriaus vardas turi sutapti su klasės, kurią jis konstruoja vardu.
Panagrinėkime modifikuotą programos kodą; skaičiais nurodyta jos eilučių vykdymo tvarka.
import java.io.*;
public class Java_programa_4  {
 	
    int d;
    BufferedReader br = new BufferedReader ( 
    new InputStreamReader (System.in));
    
    Java_programa_4 (int iv)
    {
    d=iv;	//2
    daug(); //3
    }
    
    public static void main(String[] args) {
    new Java_programa_4(Integer.parseInt(args[0]));	//1
    } 	
    
   public void daug( ) //4
   { double a;
    
    try{
   
    System.out.print ("Iveskite skaiciu: ");
    a = Double.parseDouble(br.readLine());

    System.out.print ("Ivestas skaičius "+a+"\n padauginę jį iš d="+d+" gausime "+d*a);
    System.in.read(); }	
    catch (IOException e) {}
  }  
  }
  1. Programos vykdymas prasideda nuo pagrindinio metodo. Panagrinėkime 1 eilutę:
    • args[0] reiškia argumentą, kuris nurodomas vykdymo komandoje; taigi šią programą reikia iškviesti komanda
      java Java_programa_4 skaicius   (pavyzdžiui, java Java_programa_4 12)
    • Integer.parseInt(args[0]) - tai, kas nurodoma vykdymo komandoje paverčiama skaičiumi.
    • new Java_programa_4(...); iškviečiamas klasės konstruktorius, o jam perduodamas skliausteliuose nurodytas skaičius.
  2. konstruktorius kintamajam d (vidiniam objekto parametrui) suteikia nurodytą reikšmę;
  3. ,,įjungiamas" metodas daug(); jis nuveiks visą darbą;
  4. metodas daug() pradeda veikti...
Štai ir viskas. Jeigu suvoksite šią paprastą Java programų logiką, mokėsite ,,narstyti" ir sudėtingus kodus.

Užduotis

Įsižiūrėję į kvadratinės šaknies traukimo programėlę ir įskiepį sukurkite programą ir įskiepį, atliekantį vieną iš sąraše išvardytų darbų:
  1. įvesto skaičiaus sinuso skaičiavimas;
  2. įvesto skaičiaus natūrinio logaritmo skaičiavimas;
  3. apskritimo ilgio skaičiavimas, įvedus spindulio ilgį;
  4. dviejų įvestų skaičių sumos (arba skirtumo, sandaugos ar dalmens) skaičiavimas;
  5. dviejų įvestų skaičių maksimumo (minimumo) radimas;
  6. dviejų atsitiktinių intervalo [0;1] skaičių generavimas;
  7. atsitiktinio skaičiaus iš intervalo [0;n] generavimas, kai n reikšmė yra įvedama;
  8. įvesto skaičiaus arkkosinuso skaičiavimas;
  9. rutulio tūrio skaičiavimas įvedus rutulio spindulio ilgį;
  10. apskaičiuokite įvesto skaičiaus arkkosinusą.

   Į pradžią