In aceasta lucrare de laborator vor fi
acoperite urmatoarele probleme:
- Utilizarea mediului de
dezvoltare integrat (IDE – Integrated
Development Environment) BlueJ (tutorial, adaptare in limba romana) – link extern
- Introducere in
obiecte si clase Java (adaptare dupa R. Baldwin) – link extern
- Introducere in
Java, Introducere in OO cu Java, Clase
Java de biblioteca – linkuri externe
- Crearea obiectelor si invocarea
metodelor cu BlueJ (in Java)
- Tipuri de date, campurile si starea
obiectelor
- Comportamentul si
interactiunea obiectelor
- Codul sursa Java, editarea si
compilarea lui in BlueJ
- Studiu de caz: Program de calcul al unui polinom (variante orientate spre obiecte)
- Exercitii suplimentare si Teme de casa
Programele de calcul
sunt secvente de instructiuni care prin executia lor pe sisteme (masini) de
calcul rezolva probleme aparute in
diferite domenii ale lumii reale.
Un program de calcul scris intr-un limbaj orientat spre obiecte reprezinta un model al unei parti din lumea reala. Elementele care compun modelul (obiectele software) sunt construite
prin analogie cu entitati care apar
in lumea reala (obiecte, concepte).
Obiectele software obtinute prin modelare (analogie
cu lumea reala) trebuie reprezentate
in limbajul de programare. Ca in cazul obiectelor si conceptelor din lumea
reala, obiectele software pot fi categorisite,
iar o constructie software (structura) complexa numita clasa descrie (intr-o
forma abstracta) toate obiectele de un tip particular.
La fel ca in lumea reala, in care obiectele si
conceptele sunt clasificate pe baza atributelor
pe care le au acestea, clasele reprezinta obiecte software care au atribute similare (atributele fiind elemente de
date, variabile interne care caracterizeaza obiectele). De exemplu, la intrarea
intr-o sala de curs noi clasificam in mod inconstient obiectele individuale:
banci, studenti, ferestre, etc., si interactionam cu ele fara a fi necesar sa
le cunoastem toate detaliile (atributele).
Clasa defineste elementele comune, campuri
(atribute) si metode (operatii), ale
unei categorii de obiecte (reprezinta tipul obiectelor). Toate obiectele
clasificate ca banci au latime, inaltime, pozitie in sala, etc. Clasa Banca
poate fi definita prin campurile ei ca:
class Banca latime inaltime pozitie |
Obiectul este o instanta specifica (un exemplu specific) a unei clase (in care fiecare camp are
o anumita valoare), clasa fiind tiparul dupa care sunt construite
obiectele. O sala poate avea 30 de obiecte clasificate ca banci, fiecare banca
avand propriile valori ale atributelor latime, inaltime, pozitie in sala, etc.
Doua obiecte banca, banca1 si banca2, sunt instante (exemple) diferite ale
aceleiasi clase Banca, au in comun aceleasi atribute, dar pot avea diferite
valori ale acestor atribute:
banca1 |
latime 80 cm inaltime 70 cm pozitie rand 2, a 3-a |
banca2 |
latime 120 cm inaltime 70 cm pozitie rand 4, a 6-a |
In laborator: 1. Numiti 2 clase de obiecte din imediata voastra vecinatate in
acest moment. 2. Scrieti numele fiecarei clase si a cate trei atribute evidente ale
fiecarei clase. 3. Pentru cate un
obiect din fiecare clasa definiti
valori ale fiecaruia dintre cele trei campuri. |
Pentru a crea noi instante ale unor banci reale trebuie folosite profile de lemn, metal, etc., dar atunci
cand modelam bancile intr-un program de calcul, putem crea doua banci (in Java) cu:
new Banca() |
new Banca() |
Pentru a putea trata (accesa) distinct cele doua
obiecte, este necesara utilizarea a doua nume diferite pentru cele doua
obiecte, ceea ce corespunde codului Java:
Banca banca1 = new Banca() |
Banca banca2 = new Banca() |
In laborator: 1. Dati nume pentru 2 obiecte Java care sa corespunda celor 2 clase
anterior numite. 2. Scrieti in Java codul pentru crearea celor doua obiecte. |
In laborator: 1. Lansati in executie mediul de dezvoltare BlueJ. 2. Deschideti proiectul numit shapes. I. Click pe meniul Project, apoi selectati Open Project … (sau direct Ctrl+O) II. Selectati succesiv C:\, BlueJ, examples, shapes, (sau scrieti C:\BlueJ\examples\shapes) |
In laborator: 1. Click-dreapta (meniul pop-up)
pe , selectati new Circle(), si acceptati valoarea
implicita. 2. Creati un alt cerc, acceptand din nou valoarea implicita oferita
de BlueJ. 3. Creati un patrat (Square) in aceleasi conditii. |
In laborator: 1. Click-dreapta (meniul pop-up)
pe primul obiect de tip cerc si selectati Inspect. 2. Repetati operatia pentru al doilea cerc. Apoi comparati valorile atributelor
(campurilor – fields). 3. Inspectati si patratul creat. |
Metoda (operatia)
realizeaza o secventa de actiuni
(reprezentate in programe prin instructiuni) asupra obiectului caruia ii apartine, adica asupra valorilor campurilor obiectului. Actiunile au ca efect obtinerea valorilor atributelor
obiectului, modificarea acestor valori, realizarea unor sarcini utilizand
aceste valorile, sau o combinatie
a acestor 3 efecte elementare.
Regruparea
elementelor de date
(campuri/atribute) si de comportament (metode/operatii) asociate se numeste incapsulare. Incapsularea orientata spre obiecte permite ascunderea detaliilor interne (informatii:
campuri/atribute, si implementare: cod metode/operatii) in spatele unei interfete publice (setul de semnaturi ale
metodelor/operatiilor).
In laborator: 1. Click-dreapta pe obiectul
circle1 si selectati void
makeVisible(). 2. Click pe pentru urmari efectul grafic al apelului metodei makeVisible(). 3. Click-dreapta pe obiectul
circle1 si selectati moveUp(). Urmariti efectul grafic. 4. Repetati de mai
multe ori apelul moveUp(),
urmarind efectul grafic. |
Parametrii specifica
valorile (informatiile) necesare metodelor pentru a fi executate. De exemplu,
apelul circle1.changeSize(50)
specifica valoarea 50 ca parametru (utilizat de metoda changeSize() pentru a da valoarea 50 diametrului cercului).
In laborator: 1. Click-dreapta pe obiectul
circle1 si selectati void
makeVisible(). 2. Click pe pentru urmari efectul grafic al apelului metodei. 3. Click-dreapta pe circle1
si selectati void changeSize(int newDiameter). 4. Stabiliti valoarea diametrului la 150 in fereastra care apare pe ecran. Urmariti efectul grafic. 5. Apelati metoda void slowMoveVertical(int distance)
pasandu-i 50. Urmariti efectul
grafic. 6. Apelati de mai multe ori metoda void moveUp().
Urmariti efectul grafic. Comparati efectele. 7. Apelati metoda void slowMoveHorizontal(int distance)
pasandu-i 50. Urmariti efectul
grafic. |
Descrierea problemelor reale sub forma de modele pentru programme
de calcul necesita definirea datelor
problemei. Urmatoarele campuri descriu obiectul circle1 de tip Circle:
circle1 |
int diameter 30 int xPosition 20 int yPosition 60 String color "blue" boolean isVisible false |
Tipurile de date
specifica domeniul de definitie al
valorilor campurilor, parametrilor sau variabilelor locale (ale
functiilor). Mai exact, tipurile de date specifica :
- spatiul
de memorie alocat pentru stocarea valorii campului/parametrului/variabilei
(de ex., 4B = 32b pentru tipul int, 1b pentru tipul boolean,
etc.),
- gama
valorilor posibile (de ex., -231…231-1
pentru int, valorile true si false pentru boolean),
- formatul
valorilor literale/de tip imediat (de ex., 100000 sau -2000 pentru
tipul int, true sau false pentru
tipul boolean, etc.),
- conventiile
privind conversiile catre alte tipuri (de ex., tipul int se poate converti direct,
implicit, la tipurile long, float si double, si poate fi convertit explicit,
prin cast – conversie prin
trunchiere, la tipurile byte si short, pe cand tipul boolean nu poate fi convertit la nici
un alt tip, etc.),
- valorile
implicite (doar in cazul
campurilor!, 0 pentru tipul int, false pentru tipul boolean),
- operatorii
permisi (pentru astfel de informatii consultati tutorialul Java
oferit de Sun, in special bazele limbajului Java: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/index.html,
specificatia
limbajului Java: http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
si mai ales tabelele din introducerea
in Java oferita ca anexa la laborator).
Tipurile de date primitive Java:
Pentru exemple de tipuri de date complexe, numite tipuri referinta (deoarece accesul la variabilele de acel tip se face prin referinte), clase Java, printre care si clasa String, consultati anexa la laborator dedicata claselor de bibioteca Java mai reprezentative.
In laborator: 1. Click-dreapta pe obiectul
circle1 si selectati void makeVisible(). 2. Click pe pentru urmari efectul grafic al apelului metodei. 3. Apelati metoda void changeColor(String newColor)
pasandu-i "red". Urmariti efectul
grafic. 4. Apelati metoda void changeColor(String newColor)
pasandu-i "rosu". Ce observati? 5. Apelati metoda void changeColor(String newColor)
pasandu-i red. Ce observati? |
Folosind definitia unei clase (de ex. Circle) pot fi create mai multe obiecte de acelasi tip (diferentiate/identificate prin nume):
circle1 |
int
diameter 30 int xPosition 20 int yPosition 60 String color "blue" boolean isVisible false |
circle2 |
int
diameter 30 int xPosition 20 int yPosition 60 String color "blue" boolean isVisible false |
In laborator: 1. Creati trei obiecte Circle cu click-dreapta pe si new Circle(). 2. Faceti fiecare obiect vizibil. Deplasati obiectele.
Schimbati culorile obiectelor. 3. Creati trei obiecte . 4. Faceti fiecare obiect vizibil. Deplasati obiectele.
Schimbati culorile obiectelor. |
Ansamblul valorilor campurilor
(atributelor) unui obiect la un moment
dat reprezinta starea obiectului
(poate diferi in timp, ca urmare a comportamentului, poate fi diferita la un
moment dat pentru diferite obiecte de acelasi tip):
circle1 |
int
diameter 30 int xPosition 20 int yPosition 60 String color "blue" boolean isVisible false |
In laborator: 1. Inspectati starea obiectului
circle1 cu double-click pe (sau click-dreapta si Inspect). 2. Schimbati culoarea obiectului circle1si inspectati-i din
nou starea (valorile campurilor). 3. Creati doua obiecte . Inspectati-le starea. 4. Au toate campurile aceleasi nume? Sunt toate valorile aceleasi? 5. Apelati metode care schimba pozitia celor doua obiecte.
Inspectati-le starea. Ce s-a schimbat? 6. Creati doua obiecte din clase diferite. Inspectati-le starea. Ce campuri au aceleasi nume? |
O metoda realizeaza o actiune (complexa, secventa de actiuni elementare) asupra (valorilor campurilor) obiectului, utilizand valorile campurilor obiectului, astfel efectuand o sarcina pentru codul care a apelat la acea metoda (cod context). Ea este un atom de comportament al obiectului, comportamentul global al obiectului fiind obtinut prin inlantuirea apelurilor de metode.
Toate
obiectele din aceeasi clasa au aceleasi metode disponibile. De
exemplu, clasa Circle are urmatoare
metode:
In laborator: 1. Creati o imagine care sa schiteze o casa si un soare similare celor
din imaginea de mai sus. 2. Notati-va sarcinile pe care le-ati indeplinit pentru a obtine acest efect
(tema de casa pentru lucrarea urmatoare va contine si un listing al acestor sarcini!!).
De
exemplu: I. Circle soare = new Circle() II. soare makeVisible() III. soare moveHorizontal(200) IV. soare changeSize(50) V. soare changeColor("yellow") ... 3. Ar fi putut fi apelate metodele in alta ordine pentru a obtine
acelasi efect? |
Sarcinile realizate manual in exercitiul anterior sunt in mod normal scrise sub forma de instructiuni Java intr-un fisier, pentru a putea fi executate din nou. Primii 5 pasi ar fi scrisi in Java:
Circle soare = new Circle(); soare.makeVisible(); soare.moveHorizontal(200); soare.changeSize(50); soare.changeColor("yellow"); |
BlueJ ofera un exemplu de program (proiectul picture) care contine pe langa clasele Canvas, Circle, Square si Triangle si codul unei clase Picture realizeaza desenul de mai sus prin crearea obiectelor necesare si apelul metodelor respectivelor obiecte, astfel incat sa fie pozitionate, dimensionate si colorate ca in desen.
Se poate spune ca obiectul de tip Picture
interactioneaza (colaboreaza,
comunica prin mesaje – apelurile de metode) cu obiectele de tip Circle, Square si Triangle pentru a realiza sarcina globala.
In laborator: 1. Deschideti proiectul numit pictures (Ctrl-O, apoi pe C:\BlueJ\examples
selectati picture) 2. Creati un obiect . 3. Apelati metoda void draw(). 4. Click pe pentru urmari efectul grafic al apelului metodei. |
Sarcinile pentru crearea obiectelor si apelul metodelor pot fi scrise sub forma de instructiuni Java, salvate intr-un fisier, si reutilizate cand este nevoie de ele.
Listele instructiunilor Java (grupate in metode, iar acestea impreuna cu campurile) definesc o clasa Java. Textul scris al instructiunilor formeaza codul sursa al clasei.
In laborator: 1. Deschideti proiectul numit pictures. 2. Vizualizati codul sursa al clasei Picture, fie double-click
pe , fie right-click, Open Editor. 3. Care este numele clasei? Gasiti instructiunea care defineste numele clasei. 4. Gasiti campurile pentru soare
si partile componente ale casei.
Observati cum sunt declarate. |
In laborator: 5. Gasiti codul metodei a carei declaratie (semnatura) este public
void draw(). 6. Care sunt sarcinile elementare (instructiunile de tip apel) indeplinite pentru a crea zidul? 7. Conteaza ordinea in care sunt efectuate aceste sarcini? 8. Vizualizati codul sursa al clasei Square. Gasiti semnaturile
metodelor invocate in metoda draw()
a clasei Picture. Care sunt sarcinile indeplinite de codurile acestor
metode? |
Instructiunile Java pot fi scrise si citite de programatori, dar pentru a fi executate trebuie compilate (translatate) la cod de octeti Java (executat apoi de interpretorul java).
In laborator: 1. Vizualizati codul sursa al clasei Picture. Gasiti codul sursa al metodei public void draw(). 2. Modificati culoarea zidului in "blue". 3. Compilati codul sursa cu
click pe butonul Compile. 4. Ce s-a intamplat cu obiectul picture1? 5. Creati un obiect al clasei Picture.
Click pe si urmariti efectul. |
Programul cerut ca tema la
lucrarea trecuta, numita Polinom2, utilizeaza
delegarea unor sarcini (tasks) catre metode publice, declarate global la
nivelul clasei (declarate public static):
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
import
javax.swing.JOptionPane; public
class Polinom2 { //
Metoda care obtine de la utilizator
gradul polinomului public static int obtineGrad()
{ // Obtinerea de la utilizator a gradului polinomului int gradPolinom = Integer.parseInt(JOptionPane.showInputDialog(
"Introduceti gradul polinomului")); // Returnarea valorii gradului polinomului return
(gradPolinom); } //
Metoda care obtine de la utilizator coeficientii polinomului public static int[] stabilesteCoeficienti(int
gradPolinom) { // Declararea si crearea tabloului
coeficientilor, numit coeficienti int[] coeficienti = new
int[gradPolinom+1]; // Obtinerea de la utilizator a
coeficientilor Ci, unde i=0,N for (int i=0; i<=gradPolinom; i++) { coeficienti[i] = Integer.parseInt(JOptionPane.showInputDialog(
"Coeficientul de grad " + i)); } // Returnarea tabloului coeficientilor return
(coeficienti); } //
Metoda care afiseaza polinomul P(X) public static void afisarePolinom(int
gradPolinom, int[] coeficienti) { // Afisarea
polinomului P(X) // - mai intai termenul liber Co
System.out.print("P(X) = " + coeficienti[0]); // - apoi termenii Ci*X^i, unde i=1,N for
(int i=1; i<=gradPolinom; i++) {
System.out.print(" + " + coeficienti[i] + "*X^" + i); }
System.out.println(); } //
Metoda care obtine de la utilizator valoarea necunoscutei public static int obtineNecunoscuta()
{ // Obtinerea de la utilizator a valorii necunoscutei int necunoscuta = Integer.parseInt(JOptionPane.showInputDialog(
"Valoarea necunoscutei")); // Returnarea valorii necunoscutei return
(necunoscuta); } //
Metoda care calculeaza valoarea polinomului pt o valoare a necunoscutei public static int valoarePolinom(int gradPolinom, int[] coeficienti,
int necunoscuta)
{ // Declararea si
initializarea variabilei intregi numita polinom, // care
contine valoarea polinomului, P(X) int polinom = 0; int X_i = 1; // Calculul polinomului P(X) = suma(Ci * X^i), unde i=0,N for (int i=0; i<=gradPolinom; i++) { // - actualizarea valorii polinomului polinom = polinom +
coeficienti[i]*X_i; // - actualizarea valorii X^i, unde
i=1,N X_i = X_i * necunoscuta; } // Returnarea valorii polinomului return
(polinom); } //
Metoda principala. Utilizata pentru testarea celorlalte metode. public static void main(String[] args) { // Apelul metodei care obtine de la utilizator gradul polinomului int
grad = obtineGrad(); // Apelul metodei care obtine de la utilizator coeficientii polinomului int[]
coeficienti = stabilesteCoeficienti(grad); // Apelul metodei care afiseaza polinomul afisarePolinom(grad,
coeficienti); // Apelul metodei care obtine o valoare a necunoscutei int necunoscuta = obtineNecunoscuta(); // Afisarea valorii necunoscutei System.out.println("X =
" + necunoscuta); // Apelul
metodei care calculeaza polinomul
pentru necunoscuta data int polinom = valoarePolinom(grad,
coeficienti, necunoscuta); // Afisarea valorii polinomului
System.out.println("P(" + necunoscuta + ") =
" + polinom); System.exit(0); // Inchiderea interfetei grafice } } |
Metodele clasei Polinom2 fiind toate declarate static pot fi apelate direct de metoda principala (si ea declarata static).
In laborator: 1. Compilati si executati programul de mai sus. In BlueJ: I. Inchideti proiectele
anterioare (cu Project si Close sau Ctrl+W). II. Creati un nou proiect numit Polinom2 (cu Project, apoi New Project…,
selectati D:/, apoi Software2006, apoi numarul
grupei, apoi scrieti Polinom2). III. Creati o noua clasa, numita Polinom2, apasand New Class… IV. Double-click pe noua clasa (ii deschideti
codul in editor), si inlocuiti codul cu cel de sus. V. Compilati codul si executati
metoda public static void
main(String[] args). 2. Stergeti cuvintele static din declaratiile metodelor (cu
exceptia metodei principale, main). 3. Recompilati codul. Ce observati? Care este cauza probabila? |
Practic, in clasa Polinom2 nu sunt create obiecte noi, iar metodele apelate tin de clasa si nu de obiecte, asa incat nu se poate vorbi despre orientare spre obiecte pura.
Pentru a se lucra cu obiecte, ar trebui folosite metode non-statice, iar pentru a avea interactiune intre obiecte o alta clasa ar trebui sa creeze un obiect Polinom si sa apeleze metodele acestui obiect.
Pornind de la programul de mai sus, se poate scrie codul unei clase Java numita
Polinom3, a carei structura interna contine:
- o metoda (declarata public) numita obtineGrad(),
care obtine de la utilizator valoarea gradului polinomului, si o returneaza ca intreg de tip int,
- o metoda (declarata public) numita stabilesteCoeficienti(),
care primeste un parametru intreg de
tip int, numit gradPolinom, reprezentand gradului polinomului,
creaza un nou tablou al coeficientilor (cu gradPolinom +1 elemente), obtine de la utilizator valori
pentru coeficientii polinomului si populeaza cu ei tabloul nou creat, apoi returneaza taboul de tip int[]
creat,
- o metoda (declarata public) numita obtineNecunoscuta(),
care obtine de la utilizator valoarea necunoscutei, si o returneaza ca intreg de tip int,
- o metoda (declarata public) numita afisarePolinom(),
care primeste un parametru intreg de tip int, numit gradPolinom, reprezentand gradului polinomului, si un
parametru de tip int[], numit coeficienti, reprezentand coeficientii polinomului,
si afiseaza polinomul corespunzator
valorilor primite,
- o metoda (declarata public) numita valoarePolinom(),
care primeste un parametru intreg de tip int, numit gradPolinom, reprezentand gradului polinomului, un
parametru de tip int[], numit coeficienti, reprezentand coeficientii polinomului,
si un parametru intreg de tip int, numit necunoscuta, reprezentand necunoscuta, apoi
calculeaza valoarea polinomului corespunzatoare valorilor primite si o returneaza ca intreg de tip int.
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import
javax.swing.JOptionPane; public
class Polinom3 { //
Metoda care obtine de la utilizator
gradul polinomului public int obtineGrad() { // Obtinerea de la utilizator a gradului polinomului int gradPolinom = Integer.parseInt(JOptionPane.showInputDialog(
"Introduceti gradul polinomului")); // Returnarea valorii gradului polinomului return
(gradPolinom); } //
Metoda care obtine de la utilizator coeficientii polinomului public int[] stabilesteCoeficienti(int gradPolinom) { //
Declararea si crearea tabloului coeficientilor, numit coeficienti int[] coeficienti = new
int[gradPolinom+1]; // Obtinerea de la utilizator a
coeficientilor Ci, unde i=0,N for (int i=0; i<=gradPolinom; i++) { coeficienti[i] = Integer.parseInt(JOptionPane.showInputDialog(
"Coeficientul de grad " + i)); } // Returnarea tabloului coeficientilor return
(coeficienti); } //
Metoda care afiseaza polinomul P(X) public void afisarePolinom(int
gradPolinom, int[] coeficienti) { // Afisarea
polinomului P(X) // - mai intai termenul liber Co
System.out.print("P(X) = " + coeficienti[0]); // - apoi termenii Ci*X^i, unde i=1,N for
(int i=1; i<=gradPolinom; i++) {
System.out.print(" + " + coeficienti[i] + "*X^" + i); }
System.out.println(); } //
Metoda care obtine de la utilizator valoarea necunoscutei public int obtineNecunoscuta() { // Obtinerea de la utilizator a valorii necunoscutei int necunoscuta = Integer.parseInt(JOptionPane.showInputDialog(
"Valoarea necunoscutei")); // Returnarea valorii necunoscutei return
(necunoscuta); } // Metoda
care calculeaza valoarea polinomului pt o valoare a necunoscutei public
int valoarePolinom(int gradPolinom, int[] coeficienti,
int necunoscuta)
{ // Declararea si initializarea variabilei intregi
numita polinom, // care
contine valoarea polinomului, P(X) int polinom = 0; int X_i = 1; // Calculul polinomului P(X) = suma(Ci * X^i), unde i=0,N for (int i=0; i<=gradPolinom; i++) { // - actualizarea valorii polinomului polinom = polinom +
coeficienti[i]*X_i; // - actualizarea valorii X^i, unde
i=1,N X_i = X_i * necunoscuta; } // Returnarea valorii polinomului return
(polinom); } } |
Metodele de
mai sus (ale obiectelor din clasa Polinom3) sunt obtinute din cele ale clasei
Polinom2 prin simpla indepartare a cuvintelor cheie static din semnaturile
metodelor.
Se poate scrie apoi codul unei clase Java numita RunPolinom3, care contine o metoda principala, de test, care specifica scenariul principal:
- creeaza un obiect numit poli3 de tip Polinom3 (al clasei curente), folosind constructorul fara parametri (numit Polinom3()), oferit implicit de masina virtuala Java (JVM),
- deleaga obtinerea valorii gradului polinomului catre metoda obtineGrad() a obiectului poli3,
- deleaga stabilirea valorilor coeficientilor polinomului catre metoda stabilesteCoeficienti() a obiectului poli3,
- deleaga afisarea polinomului catre metoda afisarePolinom() a obiectului poli3,
- deleaga obtinerea valorii necunoscutei catre metoda obtineNecunoscuta() a obiectului poli3,
- afiseaza valoarea necunoscutei,
- deleaga calculul valorii polinomului catre metoda valoarePolinom() a obiectului poli3,
- afiseaza valoarea polinomului.
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 |
import
javax.swing.JOptionPane; public
class RunPolinom3 { private static Polinom3 poli3; // Metoda
principala. Utilizata pentru testarea clasei Polinom3. public static void main(String[] args) { //
Crearea unui obiect al clasei Polinom3 poli3 = new Polinom3(); // Apelul metodei care obtine de la utilizator gradul polinomului int grad = poli3.obtineGrad(); // Apelul metodei care obtine de la utilizator coeficientii polinomului int[] coeficienti = poli3.stabilesteCoeficienti(grad); // Apelul metodei care afiseaza polinomul poli3.afisarePolinom(grad, coeficienti); // Apelul metodei care obtine o valoare a necunoscutei int necunoscuta = poli3.obtineNecunoscuta(); // Afisarea valorii necunoscutei System.out.println("X = " + necunoscuta); // Apelul
metodei care calculeaza polinomul
pentru necunoscuta data int polinom = poli3.valoarePolinom(grad, coeficienti, necunoscuta); // Afisarea valorii polinomului
System.out.println("P(" + necunoscuta + ") = " + polinom); System.exit(0); // Inchiderea interfetei grafice } } |
In laborator: 1. Compilati si executati programul de mai sus in BlueJ (creati un proiect nou cu numele Polinom3, si doua clase numite
Polinom3 si RunPolinom3 in care
copiati codul de mai sus). |
Se observa ca in
codul metodei principale, ca si in cazul clasei Polinom2, este necesara stocarea sub forma unor
variabile locale a valorilor gradPolinom, coeficienti, necunoscuta si polinom.
Structura unui polinom depinde insa doar
de valorile gradPolinom si coeficienti, si de aceea este recomandabila plasarea lor ca atribute (campuri) alaturi de
metodele care fac initializarea, afisarea si calculul polinomului.
Celelalte doua valori necunoscuta si polinom pot ramane exterioare clasei Polinom, valoarea necunoscuta fiind independenta de structura polinomului iar valoarea polinom
fiind calculata pe baza elementelor de
structura ale polinomului (gradPolinom si
coeficienti).
Se poate scrie codul unei clase Java numita Polinom4, a carei structura interna contine:
- un camp (declarat
private) intreg de tip int numit gradPolinom, care contine gradului polinomului,
- un camp (declarat
private) intreg de tip int[]
numit coeficienti, care contine coeficientii polinomului,
- o metoda
(declarata public) numita obtineGrad(),
care obtine de la utilizator valoarea gradului polinomului, si o foloseste pentru
a da valoare campului gradPolinom,
- o metoda
(declarata public) numita stabilesteCoeficienti(),
care foloseste valoarea campului gradPolinom, pentru a
crea un nou tablou cu (gradPolinom+1) elemente, pe care il atribuie campului coeficienti, apoi obtine de la utilizator valori
pentru coeficientii polinomului si populeaza cu ei tabloul nou creat,
- o metoda
(declarata public) numita obtineNecunoscuta(),
care obtine de la utilizator valoarea necunoscutei, si o returneaza ca intreg de tip int,
- o metoda
(declarata public) numita afisarePolinom(),
care foloseste campurile gradPolinom si coeficienti pentru a afisa polinomul corespunzator valorilor respective,
- o metoda
(declarata public) numita valoarePolinom(),
care primeste un parametru intreg de tip int, numit necunoscuta, reprezentand necunoscuta, si foloseste
campurile gradPolinom si coeficienti pentru a calcula valoarea polinomului
pentru valoarea primita a necunoscutei si a o returna ca intreg de tip int,
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import
javax.swing.JOptionPane; public
class Polinom4 { //
Campuri (atribute, variabile membru) int gradPolinom; int[] coeficienti; //
Metoda care obtine de la utilizator
gradul polinomului public void obtineGrad() { // Obtinerea de la utilizator a gradului polinomului gradPolinom
= Integer.parseInt(JOptionPane.showInputDialog(
"Introduceti gradul polinomului")); } //
Metoda care obtine de la utilizator coeficientii polinomului public void stabilesteCoeficienti() { //
Declararea si crearea tabloului coeficientilor, numit coeficienti coeficienti
= new int[gradPolinom+1]; // Obtinerea de la utilizator a
coeficientilor Ci, unde i=0,N for (int i=0; i<=gradPolinom; i++) { coeficienti[i]
= Integer.parseInt(JOptionPane.showInputDialog(
"Coeficientul de grad " + i)); } } //
Metoda care afiseaza polinomul P(X) public void afisarePolinom()
{ // Afisarea
polinomului P(X) // - mai intai termenul liber Co System.out.print("P(X)
= " + coeficienti[0]); // - apoi termenii Ci*X^i, unde i=1,N for
(int i=1; i<=gradPolinom; i++)
{
System.out.print(" + " + coeficienti[i] +
"*X^" + i); }
System.out.println(); } // Metoda
care obtine de la utilizator valoarea necunoscutei public int obtineNecunoscuta() { // Obtinerea de la utilizator a valorii necunoscutei int necunoscuta = Integer.parseInt(JOptionPane.showInputDialog( "Valoarea
necunoscutei")); // Returnarea valorii necunoscutei return
(necunoscuta); } //
Metoda care calculeaza valoarea polinomului pt o valoare a necunoscutei public
int valoarePolinom(int necunoscuta)
{ // Declararea si
initializarea variabilei intregi numita polinom, // care
contine valoarea polinomului, P(X) int polinom = 0; int X_i = 1; // Calculul polinomului P(X) = suma(Ci * X^i), unde i=0,N for (int i=0; i<=gradPolinom; i++) { // - actualizarea valorii polinomului polinom = polinom + coeficienti[i]*X_i; // - actualizarea valorii X^i, unde
i=1,N X_i = X_i * necunoscuta; } // Returnarea valorii polinomului return
(polinom); } } |
Se observa aparitia campurilor (atributelor) gradPolinom si coeficienti.
Se poate scrie apoi codul unei clase Java numita RunPolinom4, care contine:
- o metoda principala, de test, care specifica scenariul:
- creeaza un obiect numit poli4 de tip Polinom4 (al clasei curente), folosind constructorul fara parametri (numit Polinom4()), oferit implicit de masina virtuala Java (JVM),
- deleaga obtinerea valorii gradului polinomului catre metoda obtineGrad() a obiectului poli3,
- deleaga stabilirea valorilor coeficientilor polinomului catre metoda stabilesteCoeficienti() a obiectului poli3,
- deleaga afisarea polinomului catre metoda afisarePolinom() a obiectului poli3,
- deleaga obtinerea valorii necunoscutei catre metoda obtineNecunoscuta() a obiectului poli3,
- afiseaza valoarea necunoscutei,
- deleaga calculul valorii polinomului catre metoda valoarePolinom() a obiectului poli3,
- afiseaza valoarea polinomului.
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 |
import
javax.swing.JOptionPane; public
class RunPolinom4 { private static Polinom4 poli4; //
Metoda principala. Utilizata pentru testarea clasei Polinom4. public static void main(String[] args) { //
Crearea unui obiect al clasei Polinom4 poli4 = new Polinom4(); // Apelul metodei care obtine de la utilizator gradul polinomului poli4.obtineGrad(); // Apelul metodei care obtine de la utilizator coeficientii polinomului poli4.stabilesteCoeficienti(); // Apelul metodei care afiseaza polinomul poli4.afisarePolinom(); // Apelul metodei care obtine o valoare a necunoscutei int necunoscuta = poli4.obtineNecunoscuta(); // Afisarea valorii necunoscutei System.out.println("X = " + necunoscuta); // Apelul
metodei care calculeaza polinomul
pentru necunoscuta data int polinom = poli4.valoarePolinom(necunoscuta); // Afisarea valorii polinomului
System.out.println("P(" + necunoscuta + ") = " + polinom); System.exit(0); // Inchiderea interfetei grafice } } |
Se observa disparitia variabilelor locale gradPolinom si coeficienti, in acest fel metoda principala fiind eliberata de sarcina gestiunii
acestora.
In laborator: 1. Compilati si executati programul de mai sus in BlueJ (creati un proiect nou cu numele Polinom4, si doua clase numite
Polinom4 si RunPolinom4 in care
copiati codul de mai sus). |
In introducerea
in obiecte si clase Java (dupa R. Baldwin) se dau codurile mai multor clase Java:
- Radio001
pentru versiunea in care tot codul este
scris in metoda main(),
- Radio002
pentru versiunea orientata spre
proceduri,
- Radio003
pentru versiunea "orientata spre clase" (orientata spre module - modularizata), si
- Radio si
Radio01 pentru versiunea orientata
spre obiecte.
Pentru fiecare dintre
aceste versiuni: Compilati si executati programele in BlueJ (creati proiecte noi cu numele Radio001, Radio002, Radio003, si
Radio01, apoi creati clase cu
numele de mai sus, si copiati in
ele codurile din anexa). |
1. Listingul (sau textul scris
de mana) in care v-ati notat sarcinile pe care le-ati indeplinit pentru a
obtine desenul casei (la paragraful 2.2.7. – Comportamentul unui
obiect).
2. Fiecare student va
aduce pentru data viitoare codurile Java pentru 2 clase, aceste coduri
continand cel putin 3 campuri/atribute si 3 metode/operatii. Clasele propuse sunt:
Nume clasa |
Exemplu de declaratie de camp (atribut) |
Exemplu de declaratie (semnatura) de metoda (operatie) |
Scrisoare |
String destinatar |
void setDestinatar(String nume) |
Mail |
String subject |
void setSubject(String text) |
Masina |
String proprietar |
void setProprietar (String nume) |
Bicicleta |
double vitezaCurenta |
void setVitezaCurenta(double viteza) |
Avion |
int numarMotoareActive |
void defectiuneMotor() |
Caiet |
int numarFoi |
void rupereFoaie() |
Clipboard |
int numarFoi |
void adaugareFoi(int foiNoi) |
SalaCurs |
int locuriOcupate |
void asezareStudent(String nume) |
Laborator |
int numarPlatforme |
void adaugarePlatforma() |
Fiecare student va primi un numar de
ordine, iar fiecarui numar de ordine ii corespunde un set de 2 clase, conform
tabelului urmator:
Nr. ord. |
Setul de clase (tema de casa) |
Nr. ord. |
Setul de clase (tema de casa) |
Nr. ord. |
Setul de clase (tema de casa) |
1 |
Scrisoare + Masina |
11 |
Mail + Caiet |
21 |
Bicicleta + SalaCurs |
2 |
Scrisoare + Bicicleta |
12 |
Mail + Clipboard |
22 |
Bicicleta + Laborator |
3 |
Scrisoare + Avion |
13 |
Mail + SalaCurs |
23 |
Avion + Caiet |
4 |
Scrisoare + Caiet |
14 |
Mail + Laborator |
24 |
Avion + Clipboard |
5 |
Scrisoare + Clipboard |
15 |
Masina + Caiet |
25 |
Avion + SalaCurs |
6 |
Scrisoare + SalaCurs |
16 |
Masina + Clipboard |
26 |
Avion + Laborator |
7 |
Scrisoare + Laborator |
17 |
Masina + SalaCurs |
27 |
Caiet + SalaCurs |
8 |
Mail + Masina |
18 |
Masina + Laborator |
28 |
Caiet + Laborator |
9 |
Mail + Bicicleta |
19 |
Bicicleta + Caiet |
29 |
Clipboard + SalaCurs |
10 |
Mail + Avion |
20 |
Bicicleta + Clipboard |
30 |
Clipboard + Laborator |