Bazele PR in Java
Bazele PR in Java
Bazele PR in Java
JAVA
L&S Info-mat
Copyright 2005-2018 Editura L&S INFO-MAT
ISBN: 978-973-7658-03-6
Această carte în format electronic este protejată de legea
dreptului de autor. Toate drepturile asupra acestei lucrǎri aparţin
editurii L&S INFO-MAT. Reproducerea integralǎ sau parţialǎ a textului
din aceastǎ carte este posibilǎ doar cu acordul în scris al editurii
L&S INFO-MAT.
După confirmarea plății, fiecare carte poate fi descărcată de maximum 5 ori şi este
disponibilă 30 de zile.
E-mail: office@ls-infomat.ro
www.ls-infomat.ro
www.manuale-de-informatica.ro
Biblioteca Digitală de Informatică “Tudor Sorin”
www.infobits.ro
Laboratorul Virtual de Informatică şi TIC
http://lab.infobits.ro
Cuprins
Capitolul 1. Java, primele noţiuni.......................................... 11
1.1. Instalarea mediului de programare ........................................ 12
1.2. Primul program ..................................................................... 14
1.3. Conceptul de Maşină Virtuală Java (JVM)................................. 15
1.4. Tipuri de aplicaţii Java ........................................................... 16
1.5. Comentarii ............................................................................ 17
1.6. Afişarea şirurilor de caractere ................................................ 17
1.7. Programe care se găsesc în alte folder-e ............................... 17
Din cuprins:
Instalarea mediului de programare
Primul program
Maşina Virtuală Java
Tipuri de aplicaţii
Comentarii
Afişarea şirurilor de caractere
Programe care se găsesc în alte folder-e
12 Bazele programării în Java
Poate p@n` la apari]ia acestei c`r]i ve]i g`si versiuni mai noi.
B. Pentru c` soft-ul pus la dispozi]ie de firma Sun lucreaz` prin comenzi
date de la tastatur` (ca \n MS-DOS, un sistem de operare mai vechi, creat
de Microsoft) va trebui s` folosim un program, numit CMD.exe, care
simuleaz` sistemul de operare amintit. Programul se g`se[te \n folder-ul
WINNT. Identifica]i-l cu Search. El creeaz` o fereastr` prin care
se pot da comenzi MS-DOS.
C. Pentru a utiliza cu u[urin]` acest WINNT, vom crea pe
Desktop un shortcut c`tre el (vede]i al`turat).
D. Va trebui ca fereastra
CMD s` fie deschis` \n
subfolder-ul bin, al folder-ului
care con]ine softul download-
at [i instalat. Executa]i click
cu butonul drept al mouse-
ului [i selecta]i Properties.
La apari]ia cutiei de dialog
al`turate, intoduce]i calea
folder-ul amintit \n edit-ul
Start in.
class prima {
public static void main(String[] args) {
System.out.println("Acesta este primul program Java");}
}
javac prima.java
Dac` a]i reu[it s` rula]i acest prim program, a]i f`cut un pas
instruc]iune, o traduce [i o execut`, apoi alt` instruc]iune, o traduce
[i o execut`...), programele se execut` mai lent. Acest fapt este
compensat de procesoarele din ce \n ce mai performante, dar [i de
performan]ele interpreterului.
! |n aceast` carte sunt tratate doar aplica]iile din primele dou` tipuri.
1.5. Comentarii
|n Java, se pot pune comentarii oriunde dorim, la fel ca [i \n C++.
Ele sunt de dou` feluri:
Pentru a-l compila, da]i comanda urm`toare, unde a]i scris [i calea
c`tre fi[ier:
javac c:\testjava\prima.java
Manipularea datelor
Din cuprins:
Tipuri de date
Operatori
Instrucţiuni
Masive
Citirea datelor de la tastatură
Probleme rezolvate
Probleme propuse
20 Bazele programării în Java
Exemple:
Declar`m [i afi[`m mai multe variabile de tip \ntreg:
short t=32767;
byte z=-128, x=15;
int a=100000;
System.out.println(t);
System.out.println(z);
System.out.println(x);
System.out.println(a);
Capitolul 2. Tipuri şi operaţii de date 21
b) Tipuri reale
Exemple:
Pentru tipul real float, literalii trebuie urma]i \n mod obligatoriu
de litera f. Excep]ie fac literalii care reprezint` valori \ntregi.
c) Tipul char
Exemplu: mai jos pute]i observa declara]ia a trei variabile de tip char:
Caracter Semnifica]ie
\\ backslash
\n newline
\' apostrof
\” ghilimele
\r carriage return
\t tab
\f salt la pagin` nou`
22 Bazele programării în Java
Exemple:
1. char a='\''; am declarat caracterul apostrof. Dac` am \ncerca s`
declar`m acest caracter prin char a='''; primim eroare de sintax`.
2. char b='\n'; am declarat caracterul newline. Dac` se afi[eaz`
acest caracter, cursorul sare pe linia urm`toare.
3. char c='\\'; am declarat caracterul backslash. Dac` am \ncerca s`
declar`m acest caracter prin char a='\'; primim eroare de sintax`.
d) Tipul boolean
O variabil` de acest tip poate re]ine la un moment dat, una din cele
dou` valori: false (fals) sau true (adev`rat).
System.out.print() [i System.out.println(),
2.2. Operatori
|n acest paragraf vor fi prezenta]i operatorii utiliza]i \n Java.
Observa]ii:
1. Operatorul '/' (\mp`r]ire) ac]ioneaz` \n mod diferit \n func]ie de
operanzi:
a) dac` ambii sunt de tip \ntreg, rezultatul este \ntreg [i are
semnifica]ia de \mp`r]ire \ntreag`. Cu toate acestea, rezultatul
este corect (din punct de vedere matematic) numai dac` valorile
care se \mpart sunt pozitive.
b) dac` cel pu]in un operand este de unul din tipurile reale
rezultatul este real (se efectueaz` \mp`r]irea obi[nuit`).
2. Operatorul '%' ac]ioneaz` numai asupra operanzilor de tip \ntreg.
Rezultatul ob]inut este corect din punct de vedere matematic
numai dac` ambii operanzi sunt numere naturale.
24 Bazele programării în Java
1. Fie declara]ia: int a=10;. Atunci expresia 4*a/3 este de tip int [i la
evaluare se ob]ine 13. S-a \nmul]it 4 cu con]inutul variabilei a (10) [i s-a
ob]inut 40. Apoi, 40/3=13 (a fost efectuat` \mp`r]irea \ntreag`). |n acelea[i
condi]ii, expresia 4*(a/3) are ca rezultat num`rul 12. La \nceput s-a
efectuat a/3 [i s-a ob]inut 3, apoi 4*3=12. Iat` un exemplu \n care se
observ` faptul c` una este o expresie la matematic`, [i alta \n Java.
2. Fie declara]ia: float a=10;. Expresia 4*(a/3) are rezultatul 13.3333,
la fel ca expresia 4*a/3. De aceast` dat`, s-a efectuat \mp`r]irea a dou`
numere reale.
3. Fie declara]ia: int a= -10;. Atunci expresia a%3 are ca rezultat
num`rul -1.
4. Fie declara]ia: int a=-10;. Atunci expresia a*-3 are ca rezultat 30.
5. Fie declara]iile: int a=10; char b=2; float c=5;. Atunci expresia:
a+b+c are rezultatul 17.0.
F`r` o conversie prealabil`, operatorii aritmetici nu ac]ioneaz` asupra
variabilelor de tip char. De exemplu, secven]a char x=’1’; x=x+1;
este eronat` din punct de vedere sintactic.
Capitolul 2. Tipuri şi operaţii de date 25
Care este diferen]a \ntre efectul unui operator aplicat prefixat sau
postfixat? S` ne g@ndim la faptul c` pot fi expresii care con]in [i al]i
operatori \n afara celor de incrementare (decrementare).
! negare logic`;
&& [i logic;
|| sau logic.
Operatorul sau logic (binar) ac]ioneaz` astfel: dac` cel pu]in unul din
operanzi este true, rezultatul este true, altfel rezultatul este false.
Exemple: \n condi]iile: boolean a=true, b=false;
1. !a returneaz` false;
2. a||b returneaz` true;
3. a&&b returneaz` false;
Operatorii logici binari garanteaz` modul \n care se trateaz` operanzii
- \nt@i cel din st@nga, apoi (dac` este cazul) cei din dreapta. Astfel, dac`
operandul din st@nga este true, operatorul sau logic nu mai ac]ioneaz`
asupra operandului din dreapta (este clar c` rezultatul este true). Tot a[a,
dac` operandul din st@nga este false, operatorul [i logic nu mai evalueaz`
operandul din dreapta (oricum rezultatul este false). Observa]ia este foarte
important` pentru cazul \n care al doilea argument este func]ie (metod`) de
tip boolean.
Operatorul << este binar. El are rolul de a deplasa c`tre st@nga con]inutul
tuturor bi]ilor operandului din st@nga sa, cu un num`r de pozi]ii egal cu
valoarea re]inut` de al doilea operand. Pozi]iile r`mase libere (\n dreapta)
vor re]ine valoarea 0. Dac` al doilea operand re]ine valoarea m, o astfel de
deplasare este echivalent` cu \nmul]irea cu 2m (evident, dac` m este mai
mic dec@t num`rul de bi]i rezervat primului operand).
Operatorul >> este binar. El are rolul de a deplasa c`tre dreapta con]inutul
tuturor bi]ilor operandului din st@nga cu un num`r de pozi]ii egal cu
valoarea re]inut` de al doilea operand. Aten]ie: \n pozi]iile din st@nga,
r`mase libere dup` deplasare, se copiaz` con]inutul bitului de semn (acesta
re]ine 1 \n cazul numerelor negative [i 0, \n cazul numerelor pozitive).
Dac` operandul din st@nga este un \ntreg pozitiv, pozi]iile r`mase libere (\n
st@nga) vor re]ine valoarea 0. |n cazul \ntregilor pozitivi, dac` al doilea
28 Bazele programării în Java
Operatorul >>> ac]ioneaz` la fel ca [i operatorul >>, dar diferen]a este dat`
de faptul c` pozi]iile r`mase libere din dreapta vor re]ine 0.
se evalueaz` expresia;
valoarea ob]inut` este atribuit` variabilei vn (eventual convertit` -
dac` este cazul);
con]inutul variabilei vn este atribuit variabilei vn-1 (eventual se
efectueaz` conversia necesar`);
. . .
con]inutul variabilei v1 este atribuit variabilei v (eventual se
efectueaz` conversia necesar`).
Pentru atribuiri se mai pot utiliza [i operatorii: *=, /=, %=, +=, -=,
<<=, >>=, &>, ^=, |=.
v=v op expresie
(diferen]a este c` \n primul caz se genereaz` un cod ma[in` eficient).
\ntr-o expresie. Ca orice expresie, aceasta are o valoare rezultat` \n
urma evalu`rii. |n cazul atribuirilor, valoarea rezultat` este valoarea
atribuit` variabilei care este prima din st@nga, (\ntr-un [ir de atribuiri,
eventual dup` conversie).
Exemple:
1. Fie declara]iile: int a=5, b=3; float c;. |n urma atribuirii c=a/b, c
va con]ine valoarea real` 1.0. Este normal s` fie a[a \ntruc@t expresia a/b
este de tip int (se efectueaz` \mp`r]irea \ntreag` [i se ob]ine 1), apoi
aceast` valoare este atribuit` variabilei c (dup` ce este convertit`).
30 Bazele programării în Java
Observa]ie foarte important`! Sunt permise doar atribuiri \n care tipul
variabilei c`reia i se atribuie con]intul unei variabile de alt tip, con]ine,
printre valorile permise, cele ale tipului variabilei care este atribuit`.
Exemple:
Dup` cum observa]i, aici apare o diferen]` fa]` de C/C++. Java, ca
[i Pascal-ul, \ncearc` s` te fereasc` de erori ascunse, rezultate \n
urma conversiilor implicite.
se evalueaz` exp1;
dac` aceasta produce true, se evalueaz` exp2 [i exp3 este
ignorat` (nu se evalueaz`);
altfel, se evalueaz` exp3 [i exp2 este ignorat`.
Capitolul 2. Tipuri şi operaţii de date 31
2. Se afiseaz` valoarea 5.
int a=1, b=5, c;
System.out.println(a>b?a:b);
3. Variabila h ia valoarea 9. Aici se observ` c` nu este obligatoriu ca
exp2 [i exp3 s` aib` acela[i tip:
int a=1, b=5; float d=9,h;
h=a>b?a:d;
Exemple:
1) (), . , []
2) ++, --, +(unar),–(unar),!, new, operatorul de conversie
explicit`
3) *, /; %
32 Bazele programării în Java
2.3. Instrucţiuni
1. Instruc]iunea vid`. Instruc]iunea nu face nimic, dar are sens \n
programul Java, dup` cum va rezulta din studiul altor instruc]iuni.
Instruc]iunea vid` se marcheaz` prin ;.
{
;
;
;
}
Exemple:
a) int a, b=6;
a=b+5; // dup` atribuire a re]ine 11.
b) int a, b=6;
a=++b+5; // dup` atribuire a re]ine 12.
c) int a=1, b=6;
a+=b; // dup` atribuire a re]ine 7.
d) a=b=c=1; // a, b, c sunt de tip int.
Observa]ii:
Nu sunt permise atribuiri de genul: ++a=b+5;
Exist` o diferen]` \ntre operatorul de atribuire [i instruc]iunea de
atribuire. De exemplu, a=b=c=1 este o instruc]iune de atribuire, dar
con]ine 3 operatori (de atribuire). Practic, o instruc]iune de atribuire
con]ine cel pu]in un operator de atribuire.
Forma 1.
if (expresie de tip boolean) instruc]iune1 else instruc]iune2
se evalueaz` expresia;
dac` valoarea produs` de aceasta este true, se execut`
instruc]iune1;
dac` valoarea produs` este false se execut` instruc]iune2.
Forma 2.
if (expresie de tip boolean) instruc]iune
se evalueaz` expresia;
dac` valoarea produs` de aceasta este true, se execut`
instruc]iunea subordonat`, altfel se trece la cea urm`toare.
else System.out.println(b);
b) Se rezolv` ecua]ia ax+b=0, unde pentru valorile lui a [i b sunt re]inute
variabilele cu acela[i nume.
if (a!=0)
{ x=-b/a;
System.out.println(x); }
else
if (b==0) System.out.println("infinitate de solutii");
else System.out.println("nu are solutie");
Se evalueaz` expresia;
Dac` valoarea produs` de aceasta este true, se execut`
instruc]iunea subordonat`, apoi se revine la evaluarea expresiei,
altfel se trece la instruc]iunea urm`toare.
Exemple:
Exemple:
int n=10,s=0,i=1;
do
{ s=s+i;
i=i+1;
} while (i<=n);
System.out.println(s);
int n=115,i=2,fm;
do
{
fm=0;
while (n%i==0)
{ fm++;
n/=i;
}
if (fm!=0) System.out.println(i+" la puterea "+fm);
i++;
}while (n!=1);
for(expresieini]ializare;expresietest;expresieincrementare) instruc]iune
Principiul de executare:
Exemple:
9. Instruc]iunea break.
Are rolul de a for]a iesirea dintr-un ciclu. |n cazul \n care exist` cicluri
imbricate (un ciclu in interiorul altui ciclu), for]eaz` doar ie[irea din primul
ciclu (vezi secven]a urm`toare, unde for-ul dup` j se execut` doar pentru
j=1). Se folos[te pentru instruc]iunile for, while, do while [i, \n
Capitolul 2. Tipuri şi operaţii de date 37
Principiul de executare:
se evalueaz` expresia;
int i =2;
switch(i)
{
case 1: System.out.println(1);
case 2: System.out.println(2);
default: System.out.println("altceva");
}
|n forma general`, instruc]iunea switch are rolul de a stabli mai
multe puncte de intrare \ntr-o secven]` de instruc]iuni, \n func]ie de
valoarea pe care o re]ine expresie.
2.4. Masive
|n Java exist` un mecanism excep]ional de lucru cu masive (vectori,
matrice, etc).
Din motive didactice, pentru \nceput, vom prezenta declararea
masivelor \n doi pa[i:
Capitolul 2. Tipuri şi operaţii de date 39
Vectorii se pot declara [i a[a cum se vede mai jos, gata ini]ializa]i.
|n urma unei astfel de declara]ii se poate lucra direct cu ei, exact ca
anterior.
int[] V={1,2,3,4}; int i;
for (i=0;i<4;i++) V[i]=i+1;
for (i=0;i<4;i++) System.out.println(V[i]);
int[][] Mat;
int i,j;
Mat=new int [4][3];
for (i=0;i<4;i++)
for (j=0;j<3;j++) Mat[i][j]=i+j;
for (i=0;i<4;i++)
{ for (j=0;j<3;j++)
System.out.print(Mat[i][j]+" ");
System.out.println();
}
Declararea unui masiv se poate face [i \ntr-un singur pas, ca mai jos:
Exemplu: Avem doi vectori, V [i V1. Cei doi vectori sunt crea]i [i ini]ializa]i.
Dup` aceasta, se interschimb` referin]ele c`tre cei doi vectori [i, \n vederea
prob`rii opera]iilor efectuate se afi[eaz`.
V 1 2 3 4
0 1 2 3
V1 9 9 9
11 0 1 2
1
Man=V1;
V 1 2 3 4
0 1 2 3
V1 9 9 9
11 0 1 2
1
Man
V1=V;
V 1 2 3 4
0 1 2 3
V1 9 9 9
11 0 1 2
1
Man
V=Man;
V 1 2 3 4
0 1 2 3
V1 9 9 9
11 0 1 2
1
42 Bazele programării în Java
for (j=0;j<=i;j++)Mat[i][j]=k++; }
for (i=0;i<4;i++)
{ for (j=0;j<Mat[i].length;j++)
System.out.print(Mat[i][j]);
System.out.println();
}
System.out.print("a=");
int a=Integer.parseInt(cin.Token());
System.out.print("b=");
int b=Integer.parseInt(cin.Token());
System.out.println(a+b);}
}
Metoda Long.parseLong(sir) returneaz` [irul convertit c`tre long.
class prima {
46 Bazele programării în Java
class prima {
public static void main(String[] args) {
System.out.print("n=");
int i,s=0,n=Integer.parseInt(cin.Token());
for (i=1;i<=n;i++) s+=i;
System.out.println("Suma este " +s);
}
}
System.out.print("n=");
int s=0,n=Integer.parseInt(cin.Token());
while (n!=0)
{ s+=n%10;
n=n/10;}
System.out.println("Suma cifrelor este " +s);
}
int n=Integer.parseInt(cin.Token());
double B[]=new double[n];
for (j=0;j<n;j++)
{ System.out.print("B["+j+"]=");
B[j]=Double.parseDouble(cin.Token());
}
int k=0;
double C[]=new double[m+n];
i=j=0;
while (i<m && j<n)
if (A[i]<B[j]) C[k++]=A[i++];
else C[k++]=B[j++];
if (i<m) for (j=i;j<m;j++) C[k++]=A[j];
else for (i=j;i<n;i++) C[k++]=B[i];
for (i=0;i<k;i++) System.out.println(C[i]);
}
12. Mai jos pute]i observa o secven]` simpl` prin care se pot inversa
liniile i [i j ale unei matrice cu n linii [i m coloane (i,j<n).
int Man[];
Man=A[i]; A[i]=A[j]; A[j]=Man;
50 Bazele programării în Java
Probleme propuse
1. Ce se va afi[a \n urma execut`rii secven]elor urm`toare?
1.1)
int x=3; a) 3;
x=~x; b) 4;
System.out.println(x); c)-3;
d)-4.
1.2)
int x=5; a) 0;
x=x<<3; b) 2;
System.out.println(x); c) 40;
d) 5.
1.3)
int x=5; a) 0;
x=x>>1; b) 2;
System.out.println(x); c) 5;
d) 1.
1.4) System.out.println(7>10); a) eroare de execuţie;
b) 7>10;
c) false;
e) true.
d) 6/2;
e) x/y+y/x unde x [i y sunt variabile \ntregi care con]in, 1 respectiv 6;
f) x<3 || x>6 (unde x este o variabil` real` care re]ine 7);
g) x<3 && x>6 (la fel ca mai sus);
11. Avem int a=5,b=3; Care este valoarea rezultat` \n urma evalu`rii
expresiei a&b+a|b+a^b?
a) 11; b) nedecidabil; c) 21.
a) x & x; b) x | x; c) x ^ x; d) x | !x.
20. Care este func]ia evaluat` de expresia de mai jos (x este real)?
x<2?x-1:x*x
21. Care este valoarea pe care o re]ine variabila rez dup` executarea
secven]ei de mai jos?
int k,rez;
k=4; rez=3+k/5;
22. Care dintre secven]ele de mai jos este corect` din punct de vedere
sintactic?
a) k=4; b) k=4; c) k=4;
if (k>=0); if(k>=0) if k>=0;
else; then; else;
else;
28. Dac` valoarea ini]ial` a lui x este 5 (x=5), care trebuie s` fie condi]ia
de continuare ( while (x=?) ) astfel \nc@t atribuirile subordonate lui do s`
se execute exact de 4 ori?
a) 10 b) 8 c) 50 d)28
29. Pentru care dintre valorile ini]iale ale lui x (de mai jos) programul nu
cicleaz`?
a) 0 b) 1 c) 2 d) 4
30. Care dintre atribuirile de mai jos \nlocuieste secven]a celor trei atribuiri:
x:=x-1; x:=2*x; x:=x+1;
a) x:=2*x-1 b) x:=2*x-3 c) x:=2*x+1 d) x:=2*x
Răspunsuri:
1.1 d), 1.2 c), 1.3 b) 1.4 c) 1.5 a) 1.6 a) 4. x=1. 5. x
6. c) 7. b) 8. c) 9. a) 10. c) 11. a) 12. b) 13. a) 14. d)
15. c) 16. Orice num`r care poate fi re]inut de tipul int; 17. x=0;
18. Orice x [i y care pot fi re]inute de tipul int.; 19. x=-1;
20. f(x) x-1 daca x<2, x*x altfel; 21. a) 22. a) 23. c) 24. a)
25. b) 26. c) 27. x=2*(x-1); 28. c); 29. d); 30. a).
CAPITOLUL 3
Metode
Din cuprins:
Generalităţi
Structura unei metode şi apelul ei
Transmiterea parametrilor
Despre variabile
Exemple de utilizare ale metodelor
Metode recursive - exemple
Supraîncărcarea metodelor
Probleme propuse
58 Bazele programării în Java
3.1. Generalităţi
|n Java se lucreaz` orientat spre obiect (prin programare orientat` pe
obiecte). Din ra]iuni didactice, vom \ncerca s` prezent`m lucrurile pornind de
la ceea ce [tim deja, dac` am lucrat, c@t de c@t, \ntr-un alt limbaj de
programare. Mai precis, vom \nv`]a s` lucr`m cu variabile (date membru)
[i func]ii (metode) ata[ate clasei care con]ine main(). Aceasta ne permite
s` exers`m utilizarea subprogramelor \n Java, f`r` a ne complica de la
\nceput cu mecanismele specifice program`rii pe obiecte. Acest fapt este
important pentru c` nu are sens ca absolut orice problem` s` fie rezolvat`
prin mecanismele program`rii orierntate pe obiecte.
class prima {
static int a; static float b;
static char c; static boolean d;
public static void main(String[] args) {
System.out.println(a+" "+b+" "+c+" "+d);}
}
Exemplu de metod`:
Exemplu: mai jos, pute]i observa metoda suma() ce are rolul de a calcula
suma a dou` numere naturale. |n schema ata[at`, pute]i identifica
elementele constitutive ale ei:
|ntruc@t masivele con]in [i data membru length, dac` o metod`
prime[te ca parametru o referin]` c`tre masiv , atunci nu mai este
necesar ca, \n alte limbaje de programare, s` transmitem [i num`rul
de componente ale masivului.
Capitolul 3. Metode 63
Exemplu:
Dac` avem un parametru cu un anumit nume, atunci nu mai este
permis s` declar`m variabile locale cu acest nume. De exemplu,
secven]a urm`toare d` eroare de compilare, pentru c` numele
variabilei locale coincide cu numele parametrului.
numere se poate determina \mp`r]ind produsul lor la cel mai mare divizor
comun al lor. Prin urmare, scriem o metod` cmmdc cu doi parametri formali
m [i n, care \ntoarce o valoare \ntreag` - cel mai mare divizor comun al
lor.
public class Clasa1 {
static int cmmdc(int m, int n)
{ while (m!=n)
if (m>n) m-=n;
else n-=m;
return m;}
public static void main(String[] args) {
int m=Integer.parseInt(cin.Token());
int n=Integer.parseInt(cin.Token());
int cm=cmmdc(m,n);
System.out.println(cm);}
}
Rezolvare. Modul \n care test`m dac` un num`r este palindrom este acum
l`murit. Mai mult, avem [i metoda. Nu trebuie dec@t s` o folosim:
public class Clasa1 {
static boolean palin(int i)
{ int isalv=i,iinv=0;
while (i!=0)
{ iinv=iinv*10+i%10; i=i/10;}
return isalv==iinv;
}
public static void main(String[] args) {
int m=Integer.parseInt(cin.Token());
int n=Integer.parseInt(cin.Token());
for(int i=m;i<n;i++)
if (palin(i))
if (palin(i*i)) System.out.println(i+" "+i*i);
}
}
1, n0
n! fact(n) nN
n fact(n 1), altfel
3!=fact(3)=3fact(2)=32fact(1)=321fact(0)=3211=6.
n 0
fact=1
Metoda se autoapeleaz`. Parametrul n ia
valoarea 0. |n stiv` se creeaz` un nou nivel,
n 1 care re]ine n cu valoarea 0. Func]ia ia
n 2 valoarea 1, autoapelul nu mai are loc. Se
revine pe nivelul 3.
n 3
x 1, x 12
F(x)
F(F(x 2)), x 12
public class Clasa1 {
static int manna (int x)
{ if (x>=12) return x-1;
else return manna(manna(x+2));
}
public static void main(String[] args) {
int n=Integer.parseInt(cin.Token());
System.out.println(manna(n));
}
}
a, ab
cmmdc(a, b) cmmdc(a b, b),a b
cmmdc(a, b a), a b
0, n0
S(n)
n % 10 S(n / 10), altfel
Probleme propuse
1. "Numai ultima cifr`". Se citesc n, num`r natural <100, [i n numere
naturale xi, nenule, mai mici ca 30000. Se cere:
12. |n programul de mai jos, \nlocui]i cele trei puncte cu una din
secven]ele de mai jos. Pentru care dintre ele programul afi[eaz` produsul
celor dou` numere citite.
public class Clasa1 {
static int a,b,t=0;
static void increment ()
{ t++; }
c) d)
13. Care dintre instruc]iunile de mai jos, \nlocuit` \n program (\n locul
celor 3 stelu]e) nu calculeaz` a2, pentru un num`r natural, a citit?
a) System.out.println(increment(increment(a)*decrement(a)));
b) System.out.println(increment(a)*decrement(a)+1);
c) System.out.println(1+increment(a)*decrement(a)));
a) 12+23+...+n(n+1);
b) 1+1/2+...+1/n;
c) 1/(23)+2/(3*4)+...+n/((n+1)(n+2));
k
16. Se citesc n [i k (numere naturale n>k). Calcula]i, recursiv, Cn , prin
k 1
utilizarea formulei de recuren]`: C C C . Este eficient?
k k
n n 1 n 1
1, k 0;
C nk n k 1 k 1
Cn altfel.
k
19. Se cite[te un num`r natural n. Se cere s` se scrie o metod`
recursiv` care returneaz` cea mai mic` baz` \n care se poate considera n.
21. Scrie]i o metod` recursiv` care returneaz` suma elementelor pare ale
unui vector citit.
Exemplu: n=4, V=(2,2,5,6). Se returneaz` 10.
23. Scrie]i o metod` recursiv` care returneaz`, oglinditul unui num`r natural.
Exemplu: pentru n=123 se returneaz` 321.
0, k 0 sau k n;
F(n, k) 1 k n;
F(n 1, k 1) nF(n 1, k) 1 k n.
29. Calcula]i iterativ [i recursiv cel mai mare divizor pentru dou` numere
naturale m [i n, utiliz@nd algoritmul lui Euclid:
cmmdc(n, m mod n), n0
cmmdc(m, n)
m, n0
30. Ce se afiseaz` pentru System.out.println(t(12)); ?
static int t(int n)
{ if (n!=0) return 10*t(n/10)+ n%10;
else return 0; }
32. |n metoda de mai jos \nlocui]i linia ... cu una dintre instruc]iunile
urm`toare, astfel \nc@t metoda s`-[i \ncheie execu]ia f`r` eroare pentru
orice valoare admisibil` a argumentului:
static int x(int n)
{ if (n!=0)
{ System.out.println(n);
... }
else return 0;
}
33. Dac` metoda este apelat` prin an(4), de c@te ori se autoapeleaz`?
a) de 4 ori; b) de 3 ori;
c) de 5 ori; d) depinde de stiv`.
Răspunsuri:
10. c) 11. a) 12. d) 13. c) 30 a) 31. d) 32. d) 33. a)
CAPITOLUL 4
Din cuprins:
Ce este o clasă ?
Constructori
Date membru statice şi metode statice
Cuvântul cheie this
Referinţe către obiecte
Masive de obiecte
Aplicaţii ale noţiunilor prezentate
s Garbage Collector
Cum sunt memorate clasele ?
Pachete
Clase interioare
O problemă de terminologie
Probleme propuse
81 Bazele programării în Java
Privi]i programul de mai jos care con]ine dou` clase: Complex [i test..
class Complex {
// date membru
double x,y;
// metoda
void afis()
{ System.out.println(x+" "+y); }
}
public class test {
public static void main(String[] args) {
// declar un numar complex
Complex z1;
z1= new Complex (); // Complex z1=new Complex();
// Datelor membru li se atribuie valori
z1.x=3;
z1.y=-4.7;
// Afisez datele membru
z1.afis();
}
}
S` analiz`m programul.
Clasa Complex:
Foarte important !
z
1 x y
E) Accesul la variabilele interne ale obiectului se realizeaz` prin numele
obiectului, urmat de operatorul „.‟ [i numele variabilei. |n exemplu, Z va
re]ine num`rul x+2i, iar aceste valori vor fi afi[ate,
z1.x=1;
z1.y=2;
System.out.println(z1.x);
System.out.println(z2.y);
F) O clas` poate con]ine una sau mai multe metode. Apelul unei metode
de acest tip se face prin numele variabilei care re]ine referin]a c`tre obiect,
urmat de „.‟ [i de numele metodei. Exemplu: z1.afis();
G) Datele membru ale unei clase sunt ini]ializate implicit cu valoarea 0,
dac` sunt de un tip numeric, sau caracterul de cod 0, dac` sunt de tip
char, sau cu null dac` sunt de tip referin]`.
83 Bazele programării în Java
4.2. Constructori
A[a cum am ar`tat, orice clas` are un constructor implicit. Rolul lui
este de a aloca spa]iu \n memorie pentru obiect. Constructorul este apelat
de operatorul new. Acesta din urm` are [i rolul de a returna referin]a c`tre
obiect, referin]` care este memorat` de o variabil` de tip referin]` c`tre
obiect.
Unei clase i se pot crea proprii constructori, a[a cum rezult` din
exemplul urm`tor, unde clasei prezentate \n paragraful precedent i s-au
ad`ugat doi constructori:
class Complex {
// date membru
double x,y;
// Constructor 1
Complex (double x1)
{ x=x1; }
// Constructor 2
Complex (double x1, double y1)
{ x=x1; y=y1;}
// metoda
void afis()
{ System.out.println(x+" "+y);}
}
public class test {
public static void main(String[] args) {
Complex z1 = new Complex (2,3),z2 =new Complex (1);
z1.afis();
z2.afis();
}
}
De re]inut:
D) Unei clase i se pot ata[a mai mul]i constructori, dup` cum a]i v`zut [i
\n exemplu. Ei trebuie s` difere prin num`rul parametrilor [i /sau tipul
parametrilor, cu alte cuvinte, ca [i metodele, acestia sunt supra\nc`rca]i.
E) Constructorul implicit este apelat \n mod transparent (f`r` a scrie o
secven]` special`) de c`tre constructorul propriu.
class Matematica {
static double Pi=3.1415;
static double Patrat (double x)
{ return x*x; }
static double Cub (double x)
{ return x*x*x; }
}
public class Clasa1 {
public static void main(String[] args) {
int Raza=3;
double Aria=Matematica.Pi*Matematica.Patrat(Raza);
System.out.println(Aria);
//altfel
Matematica ob=new Matematica();
Aria=ob.Pi*ob.Patrat(Raza);
System.out.println(Aria);
}
}
Foarte important !
A) Datele membru statice [i metodele statice nu sunt memorate de fiecare
obiect al clasei respective. Ele sunt memorate o singur` dat`, \n cadrul
clasei respective.
85 Bazele programării în Java
O clas` indispensabil`, este clasa Math, care este prezentat` \n
aceast` carte. Ea con]ine o mul]ime de metode “matematice” care se
utilizeaz` mult \n orice limbaj de programare. Clasa Matematica, din
exemplu, este construit` pe acelea[i principii ca [i clasa Math.
Alte aplica]ii ale cuv@ntului cheie this vor fi prezentate la momentul potrivit.
void afis()
{ System.out.println(x+" "+y);}
Complex adun(Complex z)
{ return new Complex (x+z.x,y+z.y);}
}
public class test {
public static void main(String[] args) {
Complex z1 = new Complex (2,3);
Complex z2 =new Complex(3,4);
Complex z=z1.adun(z2);
z.afis();}
}
Alte exemple:
1) |n secven]a urm`toare, V1 re]ine o referin]` c`tre un vector cu 10
componente care pot re]ine referin]e c`tre obiecte ale clasei Complex.
Se instan]iaz` un obiect al clasei Complex [i referin]a sa este
atribuit` lui V1[2]. Ultimele 3 instruc]iuni au rolul de a proba cele
prezentate.
Complex[] V1 =new Complex[10];
V1[2]=new Complex(10,11);
V1[2].afis();
main() din bin, poate folosi clasa compilat`, f`r` a o mai declara \ntr-un fel.
De altfel, aceast` problem` va fi tratat` pe larg \n acest capitol.
class I {
public static void main(String[] args) {
int m=Integer.parseInt(cin.Token());
int n=Integer.parseInt(cin.Token());
Rational q1=new Rational (m,n);
m=Integer.parseInt(cin.Token());
n=Integer.parseInt(cin.Token());
Rational q2=new Rational (m,n);
Rational q3=q1.add(q2);
System.out.println("Suma="+q3.m+"/"+q3.n );
q3=q1.sub(q2);
System.out.println("Diferenta="+q3.m+"/"+q3.n );
q3=q1.mul(q2);
System.out.println("Produsul="+q3.m+"/"+q3.n );
q3=q1.div(q2);
System.out.println("Catul="+q3.m+"/"+q3.n );
}
}
class I {
public static void main(String[] args) {
System.out.print("k=");
int k=Integer.parseInt(cin.Token());
Rational [] V=new Rational [k];
for (int i=0;i<k;i++)
{ System.out.print("V["+i+"].m=");
int m=Integer.parseInt(cin.Token());
System.out.print("V["+i+"].n=");
int n=Integer.parseInt(cin.Token());
V[i]=new Rational(m,n);
}
boolean gasit;
Rational man;
do
{ gasit=false;
for (int i=0;i<k-1;i++ )
if (V[i].maiMare(V[i+1]))
{ man=V[i];
V[i]=V[i+1];
V[i+1]=man;
gasit=true;
}
} while (gasit);
for (int i=0;i<k;i++)
System.out.println("V["+i+"].m="+V[i].m+" V["+i+"].n="+V[i].n);
}
}
0 1 0 1 0 1 0 0
0 1 2 3 4 5 6 999
|n continuare, prezent`m componentele care alc`tuiesc clasa respectiv`:
class Multime {
byte[] caract=new byte[1000];
int card()
{ int s=0;
for (int i=0;i<1000;i++)
if (caract[i]==1) s++;
return s;}
boolean ap(int k)
{ if (caract[k]==1) return true;
else return false;}
Multime reun (int k)
{ caract[k]=1;
return this;}
Capitolul 4. Clase – primele noţiuni, exemple 94
class A
{ void tip() { System.out.println("clasa A"); }
}
class B
{ void tip() { System.out.println("clasa B"); }
}
public class exmp {
public static void main(String[] args) {
A x=new A(); x.tip();
B y=new B(); y.tip();
}
}
97 Bazele programării în Java
Modul \n care se re]in clasele are drept consecin]` [i faptul c`, odat`
compilat` o clas`, ea se va g`si \n folder-ul bin [i va putea fi
utilizat` [i de alte programe, care nu con]in \n textul surs` clasa
respectiv` (pe acest principiu am utilizat clasa cin).
Dac` am fi apelat javac prin javac c:\sursa\exmp.java, atunci
programul compilat s-ar g`si acolo unde este [i fi[ierul text care
con]ine programul surs` (adic` \n folder-ul sursa).
Capitolul 4. Clase – primele noţiuni, exemple 98
4.10. Pachete
Un pachet este alc`tuit dintr-una sau mai multe clase si eventual, unul
sau mai multe subpachete. Perntru moment, vom neglija subpachetele [i vom
considera pachetul alc`tuit exclusiv din clase. Ideea de baz`, care a stat la
elaborarea unui set de reguli de creare [i exploatare a pachetelor, este de a
permite celor ce scriu programe s` utilizeze clasele respective sau numai
unele metode con]inute de aceste clase. Acum, ne propunem s` \nv`]`m s`
cre`m [i s` utiliz`m pachete. Clasele care alc`tuiesc pachetul respectiv se pot
g`si \ntr-unul sau mai multe fi[iere surs`.
A.java:
package primulPachet;
public class A
{ public void tip() { System.out.println(“clasa A”); }
}
B.java:
package primulPachet;
public class B
{ public void tip() { System.out.println(“clasa B"); }
}
Pasul 4. Compil`m pe r@nd cele dou` clase (-d precizeaz` unde se vor g`si
fi[ierele compilate):
import primulPachet.*;
public class exmp {
public static void main(String[] args) {
System.out.println("Utilizarea primului pachet");
A x=new A(); x.tip();
B y=new B(); y.tip();}
}
Important !
Foarte important !
class A {
I ref=new I();
int a=1;
void M1()
{ System.out.println("a="+a);}
class I {
int b=2;
void M2()
{ System.out.println("Metoda din clasa inclusa");}
}
}
public class C {
public static void main(String[] args) {
A x=new A();
x.M1();
x.ref.M2();
System.out.println(x.ref.b);
}
}
Capitolul 4. Clase – primele noţiuni, exemple 102
Observa]ii:
3. Dintr-o clas` interioar` se pot accesa datele membru ale clasei care o
con]ine. Testa]i!
Probleme propuse
Exerci]iile 1. [i 2. se refer` la clasa de mai jos, care se g`se[te deja
compilat` \n bin:
class a {
int a=1;
int a()
{ int a=2;
return a;}
}
1. Care dintre programele de mai jos este corect din punct de vedere
sintactic?
a) b)
class ex { class ex {
public static void public static void
main(String[] args) { main(String[] args) {
a a=new a();} a x=new a;}
} }
c) d)
class ex { class ex {
public static void public static void
main(String[] args) { main(String[] args) {
x a=new a();} a x=new ();}
} }
a) System.out.println(x.a);
b) System.out.println(x.a.a);
c) System.out.println(x.a());
d) Nici una dintre instruc]iunile de mai sus nu afi[eaz` valoarea 2.
class A {
static void M(int x) {System.out.println(1);}
static void M(float x) {System.out.println(2);}
static void M(double x) {System.out.println(3);}
static void M(char x) {System.out.println(4);}
}
a) 1; b) 2; c) 3; d) 4.
Capitolul 4. Clase – primele noţiuni, exemple 104
class A {
int a,b;
A(int a, int b)
{ this.a=a;
this.b=b;}
A (int x) {b=x;}
void Afis() {System.out.print (a+" "+b);}
}
class ex {
public static void main(String[] args) {
A x=new A(3);
x.Afis();
}
}
a) Eroare; b) 3 0; c) 0 0; d) 0 3.
5. Crea]i o clas` numit` Lista, care opereaz` cu liste liniare simplu \nl`n]uite.
Un element al listei liniare simplu \nl`n]uite este descris de clasa Nod:
class Nod
{ Nod adr_urm;
int nr; }
Metoda void adaug (int nr) - adaug` la sf@r[itul listei un nod care
va re]ine valoarea numeric` nr, primit` de metod` ca parametru.
class Nod
{ Nod adr_prec;
int nr; }
13. Crea]i un folder numit Pac pe c:\. Acest folder va con]ine pachetul
citiri, care include clasa cin.java (cea pe care am utilizat-o de at@tea ori
pentru citirea datelor).
14. Scrie]i un program care cite[te [i afi[eaz` o variabil` \ntreag`. Programul
va utiliza pachetul citiri.
15. Realiza]i un pachet care con]ine clasele Nod [i Stiva, create la
exerci]iul anterior. Pachetul se va numi structuri [i se va g`si \n folder-ul
Pac, creat \n C:\.
16. Prin utilizarea clasei Stiva, scrie]i un program care cite[te n numere
naturale [i le afi[eaz` \n ordinea invers` citirii.
17. Crea]i o clas` numit` Coada, care implementeaz` structura de tip coad`.
Fiecare element al cozii va fi de tip Complex (deci va re]ine un num`r
\ntreg).
.
18. Ad`uga]i pachetului structuri (vezi problema 15) clasa Coada.
19. Scrie]i un program care utilizeaz` clasa Coada din pachetul structuri.
20. Realiza]i un program care creeaz` [i parcurge \n preordine, inordine [i
postordine un arbore binar. Fiecare nod al arborelui re]ine un num`r real.
Datele se citesc de la tastatur`.
21. Crea]i un pachet care con]ine clasele pe care le-a]i utilizat \n programul
precedent.
Capitolul 4. Clase – primele noţiuni, exemple 106
Răspunsuri:
1. a) 2. c) 3. c) o constant` real` care nu se termin` cu f, este
considerat` automat ca fiind de tipul double. Prin urmare, este apelat`
automat metoda cu parametru de tip double.
4. d) Clasa este \nzestrat` cu doi constructori (supra\nc`rca]i). Este apelat
constructorul cu un singur parametru. Data membru a este ini]ializat` implicit
cu 0.
5.
class Lista
{ Nod v;
void adaug(int nr)
{ // daca lista este vida
if (v==null)
{ v=new Nod();
v.nr=nr;
v.adr_urm=null;}
else
// daca lista este nevida, aceasta este parcursa mai
// intai, dupa care se adauga nodul
{ Nod c=v;
while (c.adr_urm!=null) c=c.adr_urm;
c.adr_urm=new Nod();
c.adr_urm.nr=nr;
c.adr_urm.adr_urm=null;}
}
}
8.
void adaugI(int nr)
{ Nod c=new Nod();
c.nr=nr;
c.adr_urm=v;
v=c;
}
107 Bazele programării în Java
9.
class ex {
public static void main(String[] args) {
Lista l1=new Lista();
int Numar_citit;
do
{ System.out.print("numar_citit=");
Numar_citit=Integer.parseInt(cin.Token());
if (Numar_citit!=0) l1.adaug(Numar_citit);
} while (Numar_citit!=0);
l1.afis();
}
}
va fi if (Numar_citit!=0) l1.adaugI(Numar_citit);.
11.
void concat(Lista varf)
{ Nod c=v;
while (c.adr_urm!=null) c=c.adr_urm;
c.adr_urm=varf.v;
}
12.
class Stiva
{ Nod varf;
void push(int nr)
{ Nod c=new Nod();
c.nr=nr;
c.adr_prec=varf;
varf=c;
}
int pop()
{ if (varf!=null)
{ int x=varf.nr;
varf=varf.adr_prec;
return x; }
else return -1;
}
}
13.
Cre`m folder-ul Pac. Fi[ierul cin.java se g`se[te \n bin. |l modific`m
astfel:
- prima linie va con]ine package citiri;
- clasa devine public` [i fiecare metod` a ei tot public`.
Capitolul 4. Clase – primele noţiuni, exemple 108
package citiri;
import java.io.*;
import java.util.*;
public class cin {
...
public static String linie() {
...
public static String Token(){
...
}
14. Programul este cel de mai jos, iar fi[ierul gr.java este \n bin:
import citiri.*;
class gr {
public static void main(String[] args)
{ System.out.print("n=");
int n=Integer.parseInt(cin.Token());
System.out.println(n);}
}
Apoi:
javac -classpath c:\Pac gr.java (am precizat unde este pachetul care
con]ine cin.class).
15. Cele dou` clase trebuie s` fie publice (inclusiv trebuie s` fie publice
metodele push() [i pop(). Pentru aceasta, fiecare clas` trebuie s` se
g`seasc` \ntr-un fi[ier cu extensia .java [i care are numele clasei respective.
Astfel, \n bin avem:
Fi[ierul Nod.java:
package structuri;
public class Nod
{ Nod adr_prec;
int nr; }
Fi[ierul Stiva.java:
package structuri;
public class Stiva
{ Nod varf;
public void push(int nr) {
...
public int pop() {
...
}
109 Bazele programării în Java
16. Programul este cel de mai jos, iar fi[ierul Inv.doc este \n bin:
import structuri.*;
import citiri.*;
class Inv {
public static void main(String[] args)
{
Stiva st=new Stiva();
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
int nr;
for (int i=0;i<n;i++)
{
System.out.print("nr=");
st.push(Integer.parseInt(cin.Token()));
}
do
{
nr=st.pop();
if (nr!=-1) System.out.println(nr);
}while (nr!=-1);
}
}
Se dau comenzile:
javac -classpath c:\Pac Inv.java
java -classpath C:\Pac;C:\j2sdk1.4.2_04\bin gr
CAPITOLUL 5
Din cuprins:
Clasa Math
Clasa String
Clasa StringTokenizer
Clase înfăşurătoare
Lucrul cu numere mari
Probleme propuse
Capitolul 5. Studiul unor clase ale limbajului Java 111
Metoda Ce calculeaz` ?
long abs(long x) modul din x (|x|)
double abs(double x) ...
int abs(int x) ...
float abs(float x) ...
int abs(int x) ...
double acos(double x) arccos(x)
double asin(double x) arcsin(x)
double ceil(double x) cel mai mic \ntreg mai mare
sau egal cu x.
double floor(double x) cel mai mare \ntreg mai mic
sau egal cu x ([x], parte
\ntreag` din x)
double cos(double x) cos(x)
double sin(double x) sin(x)
double tan(double x) tg(x)
double pow(double a, double b) ab
double sqrt(double x) radical(x)
long round(double x) cel mai apropiat \ntreg de x.
int round (float x) ...
double random() num`r aleator (\nt@mpl`tor) \n
[0,1)
double max(double x, double y) max{x,y}
float max(float x, float y) ...
int max(int x, int y) ...
long max(long x, long y) ...
double min(double x, double y) min{x,y}
float min(float x, float y) ...
long min(long x, long y) ...
int min(int x, int y) ...
double exp(double x) ex
112 Bazele programării în Java
Exemple:
Math.ceil(2.35) returneaz` 3;
Math.ceil(-2.35) returneaz` -2;
Math.floor(2.35) returneaz` 2;
Math.floor(-2.35) returneaz` -3.
Math.round(2.35) returneaz` 2.
Math.round(-2.35) returneaz` -2.
Math.round(2.55) returneaz` 3.
Math.round(-2.55) returneaz` -3.
Math.round(-2.5) returneaz` -2.
Math.round(2.5) returneaz` 3.
System.out.println(s.charAt(1));
5.2.3. Subşiruri
Vom \n]elege prin sub[ir al un [ir de caractere, mai multe caractere
consecutive ale acestuia. De exemplu, “text” are ca sub[ir “ex”.
Exemple:
1. Secven]a urm`toare afi[eaz` Un sir Alt sir:
String s =new String ("Un sir" );
String s1 = new String(" Alt sir");
116 Bazele programării în Java
s=s+s1;
System.out.println(s);
Dup` cum observa]i, concatenarea [irurilor nu este comutativ`. Aceasta
\nseamn` c` prezint` importan]` ordinea \n care [irurile sunt puse \n
expresie.
5.2.6. Aplicaţii
1. S` se citeasc` de la tastatur` un [ir de caractere, apoi s` se afi[eze.
Rezolvare. Vom utiliza clasa cin (cea pe care am folosit-o [i p@n` acum).
De altfel, clasa cin o vom utiliza pentru toate exerci]iile din acest paragraf.
public static void main(String[] args) {
String s =new String ();
s=cin.linie();
System.out.println(s);
}
do
{ gasit=false;
for (int i=0;i<n-1;i++)
if (V[i].compareTo (V[i+1])>0)
{ man=V[i];
V[i]=V[i+1];
V[i+1]=man;
gasit=true;
}
} while (gasit);
for (int i=0;i<n;i++)
System.out.println(V[i]);
}
Exemple:
int n=4;
Integer nr=new Integer(n);
Double x=new Double (-12.34);
Character c=new Character ('e');
Boolean este=new Boolean(true);
Exemple:
Integer nr=new Integer("10");
Double x=new Double ("-12.34");
Boolean este=new Boolean("true");
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
System.out.println(Double.MAX_VALUE);
Exemple:
Dac` expresia este de tip \ntreg, atunci se genereaz` o excep]ie
(excep]iile vor fi studiate separat), iar programul este \ntrerupt, ca \n
secven]a de mai jos.
int x=2;
System.out.println(x/0);
Probleme propuse
1. Scrie]i un program care s` citeasc` 0<a<b, numere naturale [i s`
afi[eze un num`r aleator \n intervalul [a,b].
2. Scrie]i un program care cite[te x, num`r real, [i n>0, num`r natural [i
calculeaz` P=sin(x)*sin(2x)*...sin(n*x). Se presupune c` x
reprezint` o valoare exprimat` \n radiani.
3. Se cite[te de la tastatur` un [ir de caractere. {irul con]ine cel pu]in 10
caractere. Se cere s` se afi[eze numai primele 10 caractere din [ir.
4. Se cite[te de la tastatur` un [ir de caractere. Dac` [irul are mai mult
de 4 caractere s` se afi[eze numai primele 4, altfel se va afi[a [irul citit.
5. Scrie]i o clas`, numit` Afis, care con]ine metoda String aNum(int
lung, String s) metod` ce are rolul de a \ntoarce sirul re]inut de s, pe
lungimea lung). Dac` num`rul de caractere ale [irului este mai mare dec@t
lung, se \ntoarce sub[irul format din primele lung caractere ale [irului,
altfel se \ntoarce un [ir pe lungimea lung. [ir alc`tuit din caracterele [irului
ini]ial la care se adaug` de un num`r corespunz`tor de blank-uri. Exemple
pentru lung=5:
{irul: citit “Mihai” - se returneaz` “Mihai”.
126 Bazele programării în Java
12. Scrie]i un program care, prin utilizarea clasei Elev, cite[te numele [i
notele pentru n elevi [i le afi[eaz` aliniat, \mpreun` cu media general`.
2! 3! n! ( n 1)!
Indicaţii / rezolvări:
1. class prima {
public static void main(String[] args) {
System.out.print("a="); int a=Integer.parseInt(cin.Token());
System.out.print("b="); int b=Integer.parseInt(cin.Token());
System.out.println(a+Math.floor(Math.random()*(b-a+1)));
}
}
3. class prima {
public static void main(String[] args) {
String afis=new String(cin.linie());
System.out.println(afis.substring(0,10));}
}
5. class Afis {
String aNum(int lung, String sir)
{ if (sir.length()>lung)
return sir.substring(0,lung);
else
{ String blank="";
for (int i=1;i<=lung-sir.length();i++) blank=blank+" ";
return sir+blank; }
}
}
6. class prima {
public static void main(String[] args) {
System.out.print("n="); int n=Integer.parseInt(cin.Token());
String[] t=new String [n];
for(int i=0;i<n;i++)
t[i]=cin.linie();
Afis comanda=new Afis();
for(int i=0;i<n;i++)
System.out.println(" "+comanda.aNum(5,t[i])); }
}
Capitolul 5. Studiul unor clase ale limbajului Java 129
7.
String num(int lung, int v)
{ String sir=new String (""+v);
if (sir.length()>lung) return "Numarul nu poate fi afisat";
else
{ while (sir.length()!=lung) sir=" "+sir;
return sir;}
}
8.
class prima {
public static void main(String[] args) {
System.out.print("n="); int n=Integer.parseInt(cin.Token());
Afis comanda=new Afis();
int[] t=new int [n];
for(int i=0;i<n;i++)
t[i]=Integer.parseInt(cin.Token());
for(int i=0;i<n;i++)
System.out.println(comanda.num(5,t[i]));
}
}
9.
String num(int lung, int zec, double v)
{ String sir=new String (""+v);
int indice=sir.indexOf(".");
if (sir.length()-indice-1<zec)
while (sir.length()-indice-1!=zec) sir=sir+"0";
else
sir=sir.substring(0,indice+zec+1);
if (sir.length()>lung) return "Numarul nu poate fi afisat";
else
{ while (sir.length()!=lung) sir=" "+sir; return sir; }
}
10.
class prima {
public static void main(String[] args) {
System.out.print("n="); int n=Integer.parseInt(cin.Token());
Afis comanda=new Afis();
double[] t=new double [n];
for(int i=0;i<n;i++)
t[i]=Double.parseDouble(cin.Token());
for(int i=0;i<n;i++)
System.out.println(comanda.Num(8,2,t[i]));
}
}
11.
class Elev
{ String Nume;
int nota_mate,nota_info,nota_engl;
Elev()
{ System.out.println("Introduceti datele");
System.out.print("Numele elev=");Nume=cin.linie();
130 Bazele programării în Java
System.out.print("Nota mate=");
nota_mate=Integer.parseInt(cin.Token());
System.out.print("Nota info=");
nota_info=Integer.parseInt(cin.Token());
System.out.print("Nota engl=");
nota_engl=Integer.parseInt(cin.Token());
}
void afisez()
{ Afis elv=new Afis();
System.out.print(elv.aNum(20,Nume));
System.out.print(elv.num(5,nota_mate));
System.out.print(elv.num(5,nota_info));
System.out.print(elv.num(5,nota_engl));
double med=(double)(nota_mate+nota_info+nota_engl)/3;
System.out.println(elv.num(8,2,med));}
}
12.
class prima {
public static void main(String[] args) {
System.out.print("n=");int n=Integer.parseInt(cin.Token());
Elev[] tabel=new Elev[n];
for (int i=0;i<n;i++) tabel[i]=new Elev();
for (int i=0;i<n;i++) tabel[i].afisez();}
}
13.
import java.util.*;
class t {
public static void main(String[] args) {
String s=new String (cin.linie());
StringTokenizer t=new StringTokenizer(s);
String sir_corect= new String();
while (t.hasMoreTokens())
sir_corect=sir_corect+t.nextToken()+" ";
sir_corect=sir_corect.trim();
System.out.println(sir_corect);}
}
14.
import java.math.*;
class t {
public static void main(String[] args) {
System.out.print("n=");int n=Integer.parseInt(cin.Token());
BigInteger P=new BigInteger("1"),I=new BigInteger("1"),incr=new
BigInteger("1");
for(int i=1;i<=n;i++)
{ P=P.multiply(I); I=I.add(incr);}
System.out.println(P.toString());}
}
Extinderea claselor
Din cuprins:
Un exemplu de extindere al unei clase
O modalitate de simulare a extinderii multiple
Referinţe către obiectele superclaselor, referinţe
către obiectele subclaselor
Probleme propuse
132 Bazele programării în Java
Aici s-a extins clasa C1. Ea con]ine dou` date membru x [i y, ambele de
tip int. |n exemplul dat, C1 este superclas`.
Noua clas`, C2, va con]ine datele membru ale clasei C1 (\n exemplu x [i
y) dar [i o nou` dat` membru (z, de tip int). De asemenea, clasa C2
con]ine [i metoda afis(), care are rolul de a afi[a con]inutul datelor
membru ale unui obiect. |n exemplu, clasa c2 este subclas`. Programul
creeaz` un obiect al clasei C2, numit ref, \i ini]ializeaz` datele membru [i
le afi[eaz`.
2. Pentru a marca faptul c` o clas` extinde o alt` clas` se folose[te
cuv@ntul extends (\n exemplu class C2 extends C1 ).
3. Ini]ializarea unui obiect al subclasei are ca efect apelul, \n aceast`
ordine, al constructorului superclasei [i apelul constructorului subclasei. Este
normal s` fie a[a, pentru c` subclasa include datele membru [i metodele
superclasei.
Exemplu: analiza]i programul de mai jos, \n care fiecare clas` con]ine c@te
un constructor. Programul afi[eaz`:
Constructor 1
Constructor 2
Capitolul 6. Extinderea claselor 133
class Unu{
Unu (){ System.out.println("Constructor 1"); }
}
class Doi extends Unu
{ Doi() { System.out.println("Constructor 2"); };
}
public class C {
public static void main(String[] args) {
Doi x=new Doi();
}
}
Clasa este extins` la o alta, Complex_op, care con]ine [i metode prin care
se efectueaz` opera]iile de mai jos cu numere complexe:
z1 z 2 x 1 i y1 x 2 i y 2 x 1 x 2 i (y1 y 2 ).
z1 z 2 x 1 i y1 x 2 i y 2 x 1 x 2 i (y1 y 2 ).
z1 z 2 x 1 i y1 x 2 i y 2 x 1 x 2 y1 y 2 i (x 1 y 2 x2 y1 ).
z1 x i y1 x i y1 x 2 i y 2 x1 x 2 y 1 y 2 i x 2 y1 x1 y 2
1 1
z 2 x2 i y 2 x2 i y 2 x2 i y 2 x 22 y 22
Complex_op (double x)
{ super(x,0); }
Complex_op add(Complex_op z)
{ Complex_op t=new Complex_op (x+z.x,y+z.y);
return t; }
Complex_op sub(Complex_op z)
{ Complex_op t=new Complex_op (x-z.x,y-z.y);
return t; }
Complex_op mul(Complex_op z)
{ Complex_op t=new Complex_op (x*z.x-y*z.y, x*z.y+z.x*y);
return t; }
Complex_op div(Complex_op z)
{ double num=z.x*z.x+z.y*z.y;
Complex_op t;
if (num!=0)
t=new Complex_op ((x*z.x+y*z.y)/num, (z.x*y-x*z.y)/num);
else t=new Complex_op(0,0);
return t;
}
}
136 Bazele programării în Java
Exerciţii rezolvate
Observa]ii:
1. |n fapt, se instan]eaz` 3 obiecte: primul este al clasei A, al doilea este
al clasei B [i al treilea este al clasei Mosten. Accesul la datele membru [i
metodele obiectelor de tip A [i B se face prin referin]ele c`tre acestea,
referin]e con]inute de obiectul de tip Mosten.
2. Accesul la datele membru ale claselor extinse se face pu]in mai greu
(vede]i exemplul de mai sus). Cu toate acestea, problema nu este at@t de
grav`. |n practica OOP, se obi[nuie[te ca datele membru s` fie accesate
numai prin metodele clasei respective. Dezavantajul acestui procedeu este
dat de faptul c`, \n cazul unor clase cu zeci de metode care urmeaz` a fi
“mo[tenite”, trebuie avut` mult` r`bdare pentru a implementa, ca mai sus,
toate metodele.
Capitolul 6. Extinderea claselor 139
class X
{ int k=1;
void met() {System.out.println("Metoda x"); }
}
class Y extends X
{ int v=2;
void metoda() {System.out.println("Metoda y"); }
}
System.out.println(ref.v);
ref.metoda();
membru, a superclasei este redefinit` \n subclas`, adic` a fost scris`
o alta cu acela[i nume, atunci este posibil ca prin procedeul de mai
sus, f`r` a utiliza operatorul de conversie explicit`, s` apel`m metoda
subclasei. Acest caz este tratat separat. Vede]i polimorfismul.
3. O variabil` de tip referin]` c`tre un obiect al subclasei, nu poate re]ine
o referin]` c`tre superclas`.
Exemplu: dac` \n program am avea instruc]iunea: Y ref=new X();, ea ar
produce eroare la compilare.
V` pute]i \ntreba, la ce folose[te faptul c` o variabil` de tip referin]` c`tre
un obiect al superclasei poate re]ine [i o referin]` c`tre un obiect al
subclasei? Ideea de baz` este urm`toarea: se poate crea o clas`, care
poate fi extins` de mai multe clase. Aceasta \nseamn` c` o structur`
oarecare (vector, matrice, stiv`, coad`, list` liniar`, etc) cu elemente de tip
referin]` c`tre obiectele superclasei, poate lucra cu referin]e c`tre obiectele
subclaselor. Sau, altfel spus, prin acest procedeu se poate asigura
independen]a structurii fa]` de datele propriu-zise. Ideea este fundamental`
\n OOP.
Observa]ii:
1. Evident c` obiectele clasei Int, precum [i obiectele clasei Real au [i
data membru adr_prec, care este mo[tenit`.
Capitolul 6. Extinderea claselor 141
2. Practic, prin extinderea clasei Baza putem ob]ine orice alte clase ale
c`ror obiecte s` poat` fi memorate de stiv`.
Clasa Stiva con]ine:
Probleme propuse
1. S` se extind` clasa cin. Noua clas` se va numi Cit [i va con]ine
metodele:
static int Intreg() // cite[te [i returneaz` un num`r \ntreg;
static double Real() // cite[te [i returneaz` un num`r real;
static char Caracter() // cite[te [i returneaz` un caracter;
static String Sir() // cite[te [i returneaz` un [ir de caractere.
a) 1; b) 2; c) Eroare.
a) 1; b) 2; c) Eroare.
a) 1; b) 2; c) Eroare.
a) 1; b) 2; c) Eroare.
Capitolul 6. Extinderea claselor 143
8. Fiind date clasele de mai jos, care este corpul corect al constructorului
clasei Doi?
class Unu
{ int A;
Unu (int A)
{this.A=A; }
}
a) b) c) d)
this.B=B; super(A); this.A=A; Nici unul
this.C=C; this.B=B; this.B=B; nu este
super(A); this.C=C; this.C=C;
corect
9. Fiind dat` clasa de mai jos (Baza), scrie]i o clas` (Lista) care
creeaz` o list` liniar` simplu \nl`n]uit` \n care elementele sunt obiectele
clasei Baza. Evident, elementele acestei liste nu au nici o alt` informa]ie, \n
afara celei de adres`.
class Baza { Baza adr_urm;}
Lista va con]ine:
Baza v; - data membru; re]ine v@rful listei;
Baza varf() - returneaz` v@rful listei liniare (adresa primului
element);
void adaug (Baza Nod) - adaug` la sf@r[itul listei un element.
10. Crea]i clasa Int, care s` extind` clasa Baza [i s` con]in` \n plus:
Indicaţii / răspunsuri:
1. class Cit extends cin
{ static int Intreg()
{ return Integer.parseInt(Token());}
static double Real()
{ return Double.parseDouble(Token());}
static char Caracter()
{ return linie().charAt(0);}
static String Sir()
{return linie();}
}
2. class t {
public static void main(String[] args) {
System.out.print("n=");int n=Cit.Intreg();
System.out.println(n);
System.out.print("x=");double x=Cit.Real();
System.out.println(x);
System.out.print("ch=");char ch=Cit.Caracter();
System.out.print(ch);}
}
3. b) 4. a) 5. c) 6. c)
7. Doi x=new Doi();
Unu y=x;
System.out.println(y.A+" "+x.A);
8. b)
9. class Lista
{ Baza v;
Baza varf()
{ return v;}
void adaug (Baza Nod)
{ Baza c=v;
if (c!=null)
{ while (c.adr_urm!=null) c=c.adr_urm;
c.adr_urm=Nod; }
else v=Nod;
}
}
Capitolul 6. Extinderea claselor 145
13.
Din cuprins:
Polimorfism. Exemple
Clase abstracte. Exemple
Interfeţe. Aplicaţii
Modificatori. Exemple
Probleme propuse
148 Bazele programării în Java
7.1. Polimorfism
Prin polimorfism vom \n]elege posibilitatea ca at@t superclasa, c@t [i
subclasa s` aib` metode cu acela[i nume (metodele pot fi redefinite).
class B extends A
{ void tip() { System.out.println("clasa B"); }
}
// Cazul 3
System.out.println("Cazul 3");
A O2=new B(); O2.tip();
System.out.println(O2.i);
}
}
class B extends A
{ void tip() { System.out.println("clasa B"); }
}
subordine mai mul]i muncitori. Se [tie c` [eful de echip` prime[te mai mult
pentru o or` lucrat` (\n exemplu 50.000). Se construie[te clasa
Sef_echipa, care este subclas` a clasei Muncitor. Metoda salariu()
este redefinit`. Dintre [efii de echip`, unii sunt selecta]i pentru a urma o
[coal` de mai[tri. Dup` ce devin mai[tri [i au \n subordine mai mul]i [efi
de echip`. S` se construiasc` clasa Maistru, care are ca superclas` clasa
Sef_echipa. Un maistru prime[te pe or` mai mult dec@t un [ef de echip`
(\n exemplu 100000 lei), deci metoda salariu() este redefinit`. Se cere
s` se scrie un program care cite[te un num`r natural n \ntre 1 [i 3. Dac`
n este 1 se construie[te un obiect al clasei muncitor, dac` n este 2 se
construie[te un obiect al clasei sef_echipa, iar dac` n este 3 se
construie[te un obiect al clasei Maistru. De asemenea, se cite[te num`rul
de ore lucrat de persoana respectiv`. |n final, se va afi[a salariul \ncasat
de persoana citit`.
class Muncitor
{ int ore_lucrate;
Muncitor(int ore_lucrate)
{ this.ore_lucrate=ore_lucrate;}
double salariu()
{ return ore_lucrate*20000;}
}
class Sef_echipa extends Muncitor
{ Sef_echipa(int ore_lucrate)
{ super(ore_lucrate); }
double salariu()
{ return ore_lucrate*50000;}
}
class Maistru extends Sef_echipa
{ Maistru(int ore_lucrate)
{ super(ore_lucrate);}
double salariu()
{ return ore_lucrate * 100000;}
}
public class test {
public static void main(String[] args) {
Muncitor x=null;
int tip=Integer.parseInt(cin.Token());
int ore=Integer.parseInt(cin.Token());
switch (tip)
{ case 1: x=new Muncitor(ore); break;
case 2: x=new Sef_echipa(ore); break;
case 3: x=new Maistru(ore); break; }
System.out.println(x.salariu());
}
}
152 Bazele programării în Java
Observaţii:
Exemplul dat se refer` la polimorfism [i la legarea dinamic`. Metoda
salariu este prezent` \n toate cazurile. Este rulat` o metod` sau alta
\n func]ie de valoarea citit`, prin urmare avem legare dinamic`.
Exist` multe alte metode de rezolvare ale acestei probleme. Judec@nd
dup` problema \n sine, ar rezulta c` utilizarea polimorfismului poate fi
evitat`. A[a este, dar \n cazul programelor complexe (de exemplu \n
programarea vizual`), utilizarea lui se dovede[te extrem de util`.
7.5. Interfeţe
Prin interfa]` vom \n]elege un proiect de clas`. O interfa]` poate
con]ine doar constante [i antete de metode. Ele sunt acceptate de limbaj [i
se presupune c`, ulterior, interfe]ele vor fi implementate de una sau mai
multe clase. O interfa]` arat` ca o clas`, numai c`, \n locul cuv@ntului
class, se folose[te cuv@ntul interface. Atunci c@nd scriem o clas` care
implementeaz` o anumit` interfa]`, se folose[te cuv@ntul cheie implements,
ca \n exemplul de mai jos. O interfa]` poate fi implementat` de una sau
mai multe clase.
interface A
{ void metA();}
interface B
{ void metB();}
interface C
{ void metC();}
Capitolul 7. Noţiuni avansate de programare orientată pe obiecte 157
Observa]ie: mai general, prin utilizarea interfe]elor se transmit de fapt
obiecte rezultate din instan]ieri ale claselor care au implementat
respectiva interfa]`.
Exemplul 4. Nu este de neglijat faptul c` \ntr-o interfa]` se pot defini multe
constante. Urm`ri]i exemplul urm`tor \n care am declarat [i “utilizat”
constante pentru zilele s`pt`m@nii:
Capitolul 7. Noţiuni avansate de programare orientată pe obiecte 161
interface Saptamana {
int Luni=1,Marti=2, Miercuri=3,Joi=4,
Vineri=5, Sambata=6, Duminica=7;
}
class Ziua implements Saptamana {
void ceFac()
{ for (int zi=Luni;zi<=Duminica;zi++)
if (zi>=Marti && zi<=Joi)
System.out.println("Ceva munca");
else
System.out.println("Sarbatoare");
}
}
public class test {
public static void main(String[] args) {
Ziua x=new Ziua();
x.ceFac();}
}
7.7. Modificatori
Forma general` prin care o clas` este definit` o pute]i observa mai
jos. Tot ce este trecut \ntre paranteze drepte este op]ional.
Modificatorii sunt:
1. public – data membru poate fi accesat` de oriunde este accesibil`
(deci [i din afara pachetului) [i poate fi mo[tenit`;
2. protected - data membru poate fi accesat` de codul aflat \n acela[i
pachet [i poate fi mo[tenit`;
3. private - data membru poate fi accesat` numai din clasa \n care se
afl` [i nu este mo[tenit` (sau dac` vre]i, este mo[tenit`, dar nu poate fi
accesat` din clasa care o mo[tene[te, ceea ce este acela[i lucru);
4. modificatorul implicit (package) – are efect \n absen]a modificatorilor de
mai sus. Data poate fi accesat` de cod din acela[i pachet [i poate fi
mo[tenit` numai de clase ale aceluia[i pachet;
5. final – data membru este considerat` constant`, deci nu poate fi
modificat`;
6. static - data membru nu este memorat` de fiecare obiect al clasei
respective (modificatorul a mai fost prezentat).
c) Clasa urm`toare, aflat` \n acela[i pachet, este corect` pentru c`, de[i
extinde clasa A, redefine[te o metod` care nu are modificatorul final:
class B extends A
{ void metp() {System.out.println("Test2");}
}
Capitolul 7. Noţiuni avansate de programare orientată pe obiecte 165
Probleme propuse
Testele de la 1 la 4 se refer` la clasele urm`toare. De fiecare dat`,
instruc]iunea (sau setul de instruc]iuni) la care se refer` \ntrebarea va fi
scris` \n locul liniei lips` (punctat`):
class A
{ int x=1;
void met() {System.out.println("Clasa A");}
}
class B extends A
{ int x=2;
void met() {System.out.println("Clasa B");}
}
class C extends B
{ int x=3;
void met() {System.out.println("Clasa C");}
}
a) 1; b) 2; c) 3; d) EROARE.
a) 1 1; b) 2 2; c) 1 2; d) 2 1.
Răspunsuri:
1. b); 2. a); 3. d); 4. c); 5 d);
6. class Numar
{ int nr;
Numar(int nr) { this.nr=nr;}
int valoare () { return nr;}
boolean impar()
{ if (nr%2==1) return true;
else return false;}
168 Bazele programării în Java
boolean prim ()
{ boolean p=true;
for (int i=2;i<=Math.sqrt(nr);i++)
if (nr%i==0) { p=false;
break;}
return p;
}
int succesor() {return nr+1;}
}
class Par extends Numar
{ Par(int nr)
{ super(nr);}
int succesor() { return nr+2;}
}
class Impar extends Numar
{ Impar(int nr)
{ super(nr);}
int succesor() { return nr+2;}
}
class Prim extends Impar
{ Prim(int nr)
{ super(nr);}
int succesor()
{ Numar val=new Numar(nr+2);
while (!val.prim()) val=new Numar(val.succesor());
return val.valoare();
}
}
public class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
Numar x=new Numar(n);
if (x.prim()) x=new Prim(x.valoare());
else
if (x.impar()) x=new Impar(x.valoare());
else x=new Par(x.valoare());
System.out.println(x.succesor());}
}
7. b); 8. d);
9. public class test {
public static void main(String[] args) {
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
functie f=new f1(); System.out.println(funct(f ,n));
f=new f2(); System.out.println(funct(f ,n));
f=new f3(); System.out.println(funct(f ,n));
}
public static int funct(functie ref, int x)
{ return ref.f(x);}
}
CAPITOLUL 8
try {……………}
Excepţii
catch (ER1 ob1) {……………}
[ catch (ER2 ob2) {…………}
catch (ER3 ob3) {…………}
...
catch (ERn obn) {………} ]
[ finally {……………}]
Din cuprins:
Noţiunea de excepţie
Mecanismul de tratare a excepţiilor
Metode de tratare a excepţiilor
Exemple de tratare a excepţiilor
Probleme propuse
170 Bazele programării în Java
class t {
public static int citesc() throws Eroare1,Eroare2
{ int n=Integer.parseInt(cin.Token());
if (n<1) throw new Eroare1();
else
if (n>5) throw new Eroare2();
else return n;
}
2. Dac` clasa care trateaz` excep]ia extinde clasa Exception, atunci este
obligatoriu ca apelul metodei ce poate returna o excep]ie s` se fac` \n
construc]ia try, ca \n exemplul anterior, sau metoda care apeleaz` o astfel
de metod` s` con]in` \n antet clauza throws.
Exemplul 1: dac` \n metoda main() de mai sus, am avea V[]=citesc(),
f`r` construc]ia try, atunci am primi eroare de compilare.
class e {
public static void main(String[] args) {
int i=0;
while (i==0)
try
{ int numar=Integer.parseInt(cin.Token());
System.out.println(numar);
i=1;
}
catch (NumberFormatException e)
{ System.out.println("Numar eronat");}
}
}
class t {
public static void main(String[] args) {
System.out.print("n="); int n=Integer.parseInt(cin.Token());
System.out.print("m=");
int m=Integer.parseInt(cin.Token());
try { System.out.println(n/m);}
catch (ArithmeticException e)
{ System.out.println ("Impartire la 0 ");}
}
}
class e {
public static void main(String[] args) {
double s=0;
System.out.print("n=");
int n=Integer.parseInt(cin.Token());
178 Bazele programării în Java
Probleme propuse
1. Se citesc n, num`r natural [i n numere reale. Se cere s` se afi[eze
suma numerelor citite. Pentru citirea numerelor, programul va utiliza
mecanismul excep]iilor (\n caz de introducere gre[it` a datelor - care nu
corespund formatului de num`r real, se va afi[a un mesaj corespunz`tor [i
se va relua citirea numerelor).
Capitolul 8. Excepţii 179
2. La fel ca mai sus numai c` cele n numere citite trebuie s` fie mai mici
dec@t 10. De asemenea, se va folosi mecanismul excep]iilor at@t pentru
formatul real, c@t [i pentru valorile admise.
3. Scrie]i un program care cite[te dou` numere reale a [i b [i afi[eaz`
rezultatul \mp`r]irii lui a la b. Dac` ambele numere sunt 0, se va afi[a un
mesaj l`muritor, dac` numai b este 0, se va tip`ri alt mesaj l`muritor, iar
dac` \mp`r]irea se poate face, se va afi[a rezultatul \mp`r]irii. Evident,
programul va utiliza mecanismul excep]iilor [i metode ale claselor
\nf`[ur`toare (de rev`zut).
4. La fel ca mai sus numai c` se vor utiliza excep]iile [i la citirea
numerelor a [i b, iar \n caz c` \mp`r]irea nu se poate efectua se va
repeta citirea numerelor a [i b.
Rezolvări:
1.
class test {
public static void main(String[] args) {
int n=1; double nr=0; int semnal=0;
// citesc pe n
while (semnal==0)
{ try
{ System.out.print("n=");
n=Integer.parseInt(cin.Token()); semnal=1;}
catch (Exception e) {System.out.println("Eroare la introducerea
lui n");}
}
// citesc cele n numere
double s=0;
for (int i=0;i<n;i++)
{ nr=0;
try
{ System.out.print("valoarea este=");
nr=Double.parseDouble(cin.Token());}
catch (Exception e) { System.out.println ("Valoare
nenumerica"); i--;}
s+=nr;}
System.out.println("Suma="+s);
}
}
class test {
public static void main(String[] args) {
int n=1; double nr=0; int semnal=0;
// citesc pe n
while (semnal==0)
{ try
{ System.out.print("n=");
n=Integer.parseInt(cin.Token()); semnal=1;}
catch (Exception e) {System.out.println("Eroare la introducerea
lui n");}
}
// citesc cele n numere
double s=0;
for (int i=0;i<n;i++)
{ nr=0;
try { nr=citesc();}
catch (Er1 e) { e.afis(); i--;}
catch (Er2 e) { e.afis(); i--;}
s+=nr;}
System.out.println("Suma="+s);
}
public static double citesc() throws Er1,Er2
{ double n=0;
try { n=Double.parseDouble(cin.Token());}
catch (Exception e) { throw new Er2();}
if (n>10) throw new Er1();
else return n;
}
}
3.
class Er1 extends Exception {
void afis() { System.out.println ("Impartire la 0");}
}
class Er2 extends Exception {
void afis() { System.out.println ("ambii operanzi sunt 0");}
}
class test {
public static void main(String[] args) {
double s=0;
System.out.print("a=");double a=Double.parseDouble(cin.Token());
System.out.print("b=");double b=Double.parseDouble(cin.Token());
try {double z=divide(a,b); System.out.println(z);}
catch (Er1 e) { e.afis();}
catch (Er2 e) { e.afis();}
}
static double divide (double a, double b) throws Er1,Er2
{ if (Double.isNaN(a/b)) throw new Er2();
else
if (Double.isInfinite (a/b)) throw new Er1();
else return a/b;
}
}
CAPITOLUL 9
Din cuprins:
Clasa Vector
Fişiere
Fire de execuţie
Probleme propuse
182 Bazele programării în Java
9.2. Fişiere
B) Fluxuri de ie[ire - de la
program fi[ier
surs`, (programul), c`tre destina]ie
(fi[ier), unde se re]in rezulatatele.. Sursa Destinatie
Observa]ii:
Exemple:
Observa]ii:
Acestea fiind spuse, pute]i analiza programul de mai jos care afi[eaz`
toate liniile unui fi[ier text. De exemplu, dac` crea]i cu Notepad un fi[ier
cu mai multe linii, numit in.txt, programul \l afi[eaz`:
import java.io.*;
public class f {
public static void main (String[ ] args) throws IOException
{ FileInputStream f=new FileInputStream("in.txt");
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
String linie;
while ((linie=buf.readLine() )!=null) System.out.println(linie);
fchar.close();
}
}
Exemplu: programul de mai jos creeaz` un fi[ier text (numit out.txt) care
con]ine 3 linii, iar fiecare linie con]ine c@te un [ir de caractere:
import java.io.*;
public class f {
public static void main (String[ ] args) throws IOException
{ FileOutputStream f=new FileOutputStream("out.txt");
PrintStream fchar=new PrintStream (f);
fchar.println("O linie");
fchar.println("Alta linie");
fchar.print("A treia linie");
fchar.close();
}
}
Cel mai bun exemplu de utilizare a acestei clase este dat de metoda
linie() a clasei cin (cea pe care am folosit-o de at@tea ori p@n` acum).
import java.io.*;
import java.util.*;
class cin {
static InputStreamReader f = new InputStreamReader (System.in);
static BufferedReader tamp=new BufferedReader(f);
static String linie() {
try { return tamp.readLine();}
catch (IOException e) { return ("Eroare");}
}
static String Token(){
StringTokenizer v=new StringTokenizer(linie());
if (v.hasMoreTokens())return v.nextToken();
else return"";
}
}
Dac` acel program a fost scris \n Java, atunci s-au utilizat firele de
execu]ie. Practic, un fir de execu]ie \nseamn` o secven]` de instruc]iuni.
Procesorul \[i \mparte timpul pentru a executa o parte dintr-un fir de
execu]ie, apoi o parte din alt fir de execu]ie, [.a.m.d. Mai mult, de c@te ori
el trebuie s` intre \n a[teptare pentru un fir de execu]ie (de exemplu, se
a[teapt` introducerea unei date), reia executarea altui fir de execu]ie,
[.a.m.d. V` da]i seama c` un astfel de mecanism este extrem de complex,
dar \n Java se poate folosi cu u[urin]` pentru c` acesta este foarte bine
pus la punct. Ce trebuie s` [tim pentru a crea fire de execu]ie?
1. Un fir de execu]ie este un obiect al unei clase care extinde
(mo[tene[te) clasa Thread.
2. Secven]a de instruc]iuni a acestui fir de execu]ie este con]inut` de
metoda run() a clasei.
3. Un fir de execu]ie se lanseaz` utiliz@nd metoda start() a clasei din
instan]ierea c`reia a rezultat firul de execu]ie respectiv. Evident, metoda
start() este mo[tenit` din clasa Thread.
4. Un fir de execu]ie poate fi pus \n a[teptare prin utilizarea metodei
sleep(long m), metod` mo[tenit` de la clasa Thread. Ea poate genera o
excep]ie, a[a c` trebuie pus` sub construc]ia try. Evident, \n acest timp,
procesorul poate relua executarea unui alt fir de execu]ie. Timpul este dat
\n milisecunde.
Exemple:
1. Programul urm`tor con]ine un fir de execu]ie, care incrementeaz`
valoarea unei variabile (date membru) apoi o afi[eaz`, dup` care st` \n
a[teptare o secund`, [.a.m.d., p@n` c@nd valoarea variabilei devine mai
mare dec@t 10:
class Fir extends Thread {
int i=0;
public void run()
{ while (i!=10)
{ i++;
System.out.println("i="+i);
try { sleep(1000);}
catch (Exception e) {}
}
}
}
public class pv {
public static void main(String args[]) {
Fir x=new Fir();
x.start();
}
}
190 Bazele programării în Java
Probleme propuse
1. Implementa]i o stiv` prin utilizarea clasei Vector. Avantajul acestei
implement`ri este evident: se poate utiliza stiva pentru a re]ine orice tip de
obiect.
Indicaţii / rezolvări:
1.
import java.util.*;
class Stiva {
Vector st=new Vector();
void push(Object x)
{ st.addElement (x);}
Object pop ()
{ if (st.size()>0)
{ Object retur=st.lastElement();
st.removeElementAt(st.size()-1);
return retur;
}
else return null;
}
}
2.
class test {
public static void main(String[] args) {
Stiva st=new Stiva();
st.push(new Integer (1));
st.push(new Integer (2));
st.push(new Integer (3));
Integer numar;
do
{ numar=(Integer)st.pop();
if (numar!=null)
System.out.println(numar.intValue());
} while (numar!=null);
}
}
192 Bazele programării în Java
7.
import java.io.*;
import java.util.*;
public class test {
public static void main (String[ ] args) throws IOException
{ FileInputStream f=new FileInputStream("numere.in");
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
String linie=buf.readLine();
StringTokenizer t=new StringTokenizer(linie);
int s=0;
while (t.hasMoreTokens())
s+=Integer.parseInt(t.nextToken());
System.out.println(s);
fchar.close();
}
}
8.
import java.io.*;
import java.util.*;
public class test {
public static void main (String[ ] args) throws IOException
{ FileInputStream f=new FileInputStream("numere.in");
InputStreamReader fchar=new InputStreamReader (f);
BufferedReader buf = new BufferedReader(fchar);
String linie=buf.readLine();
StringTokenizer t=new StringTokenizer(linie);
int s=0;
int nr;
while (t.hasMoreTokens())
try { nr=Integer.parseInt(t.nextToken()); s+=nr;}
catch (Exception e) {}
System.out.println(s);
fchar.close();
}
}
9.
...
public static void main (String[ ] args) throws IOException
{ if (args.length==0)
System.out.println ("Fisierul?");
else
{ String nume_f=args[0];
FileInputStream f=new FileInputStream(nume_f);
...
CAPITOLUL 10
Din cuprins:
Prima fereastră
Mecanismul prin care se ataşează componente
ferestrei. Clasa Container
Clasele JComponent şi ToolKit
Poziţionarea componentelor
Studiul principalelor componente
Mai mult despre clasa Container
Cutii de dialog
Clasele Graphics şi Graphics2D
Evenimente
Animarea imaginilor
Probleme propuse
194 Bazele programării în Java
public class pv {
public static void main(String args[]) {
Fereastra f= new Fereastra ("Prima", 100,200, 25, 100);}
}
import java.awt.*;
import javax.swing.*;
class Fer extends JFrame
{ public Fer(String titlu) {
super(titlu);
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Buton 1"); x.add(A);
JButton B=new JButton("Buton 2"); x.add(B);
setVisible(true);}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Doua butoane");}
}
Capitolul 10. Iniţiere în programarea vizuală 197
Butoanele ata[ate sunt componente de tip JButton, care au un
constructor de tip JButton(String s). {irul s va ap`rea pe
suprafa]a butonului.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ public Fer(String titlu) {
super(titlu);
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
198 Bazele programării în Java
numit` Component. Atunci c@nd prezent`m unele metode ale clasei
JComponent, care sunt mo[tenite de la clasa Component nu vom
mai face referire la acest lucru, ci le vom trata ca f`c@nd parte din
clasa JComponent.
Exemplu:
JButton B=new JButton("Buton 2");
B.setToolTipText("Eu sunt butonul 2");
De re]inut:
c) GridLayout(int nr_linii,
int nr_col, int sp_o, int sp_v ) -
se procedeaz` ca anterior, numai c` se
trec [i spa]iile pe orizontal` [i pe vertical`
\ntre dreptunghiurile generate.
GridLayout (3,3,5,8)
! Pentru GridLayout nu are nici un efect metoda setPreferredSize().
De re]inut:
1. Pentru ad`ugarea unei componente container-ului, se folose[te metoda
add cu 2 parametri, al doilea fiind cel care precizeaz` pozi]ia \n care este
ad`ugat` componenta. Vezi, mai sus!
GridBagLayout() - constructor;
import java.awt.*;
import javax.swing.*;
class Fer extends JFrame
{
public Fer(String titlu) {
super(titlu);
setSize(250,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagLayout pozitii=new GridBagLayout();
JLabel et=new JLabel ("Numele ");
JTextField txt=new JTextField(15);
JButton bt=new JButton("Ce-am citit?");
Container x=getContentPane();
// pozitionare eticheta
GridBagConstraints p_et=new
GridBagConstraints(0,0,1,1,1,2,GridBagConstraints.EAST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(et,p_et);
// pozitionare edit
GridBagConstraints p_txt=new
GridBagConstraints(1,0,1,1,4,2,GridBagConstraints.EAST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(txt,p_txt);
// pozitionare buton
GridBagConstraints p_bt=new
GridBagConstraints(0,1,2,1,1,1,GridBagConstraints.CENTER,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(bt,p_bt);
x.setLayout(pozitii);
x.add(et); x.add(txt); x.add(bt);
setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Gestionar de pozitionare");
}
}
CardLayout() - constructor;
next(Container parinte) - afi[eaz` urm`toarea component`.
Dac` este afi[at` ultima component`, se afi[eaz` din nou prima
component`;
last(Container parinte) - se afi[eaz` ultima component`;
208 Bazele programării în Java
Exemplu:
Icon icon = new ImageIcon("om.gif");
JButton A=new JButton(icon);
Exemplu:
Icon icon = new ImageIcon("om.gif");
JButton A=new JButton( "Java...",icon);
A.setVerticalTextPosition(JButton.TOP);
A.setHorizontalTextPosition(JButton.CENTER);
Container x=getContentPane();
Container x=getContentPane();
x.setLayout(new BorderLayout ());
x.setLayout(new BorderLayout ());
Icon icon = new ImageIcon("idee.gif");
Icon icon = new ImageIcon("idee.gif");
JLabel A=new JLabel (icon);
JLabel A=new JLabel (icon);
x.add(A);
x.add(A);
Exemplu:
Container x=getContentPane();
x.setLayout(new GridLayout());
Icon icon = new ImageIcon("idee.gif");
JLabel A=new JLabel
("Asta era!!!",icon,JLabel.CENTER);
A.setHorizontalTextPosition(Jlabel.CENTER);
A.setVerticalTextPosition(JLabel.TOP);
x.add(A);
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{ JTextField a,b,r; JButton but;
public Fer(String titlu) {
super(titlu); setSize(200,200);
fer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
//primul panel
JPanel panel1 = new JPanel();
JLabel et=new JLabel ("a=");
panel1.add(et);
a=new JTextField(15);
panel1.add(a);
x.add(panel1);
//al doilea panel
JPanel panel2 = new JPanel();
JLabel et1=new JLabel ("b=");
panel2.add(et1);
b=new JTextField(15);
panel2.add(b);
x.add(panel2);
// al treilea panel
JPanel panel3 = new JPanel();
JLabel et2=new JLabel ("x=");
panel3.add(et2);
r=new JTextField(15);
panel3.add(r);
x.add(panel3);
// butonul Rezulta
but=new JButton("Rezultat");
x.add(but);
but.addActionListener(this);
setVisible(true);
}
214 Bazele programării în Java
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Ecuatia de gradul 1");
}
}
JComboBox () – constructor.
void addItem(Object s) - adaug` listei o op]iune. Cum clasa
Object este la baza ierarhiei de clase Java, parametrul efectiv poate
fi o referin]` c`tre orice obiect, inclusiv c`tre tipul des utilizat String.
Object getSelectedItem() – returneaz` [irul de caractere
corespunz`tor op]iunii selectate.
int getItemCount() - returneaz` num`rul de op]iuni.
int getSelectedIndex() - returneaz` indexul op]iunii selectate.
Object getItemAt(int ind) - returneaz` obiectul re]inut de
item-ul de indice ind (dac` trebuie s` ob]inem un obiect de tip
String, atunci converti]i c`tre String prin operatorul de conversie).
Capitolul 10. Iniţiere în programarea vizuală 215
ButtonGroup() - constructor;
void add(AbstractButton b) – adaug` un buton grupului (clasa
AbstractButton este superclas` pentru JButton, JRadioButton,
JCheckBox).
Enumeration getElements(); - returneaz` un pointer la grupul de
butoane.
int getButtonCount() - returneaz` num`rul de butoane din grup.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class Fer extends JFrame implements ActionListener
{ ButtonGroup grup;
public Fer(String titlu) {
super(titlu); setSize(150,200);
fer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout (FlowLayout.LEFT));
JLabel et=new JLabel ("Selectati"); x.add(et);
JRadioButton b1=new JRadioButton("Matematica");x.add(b1);
JRadioButton b2=new JRadioButton("Informatica",true);x.add(b2);
JRadioButton b3=new JRadioButton("Engleza"); x.add(b3);
JRadioButton b4=new JRadioButton("Biologie");x.add(b4);
JButton but=new JButton("Ce-am selectat?"); x.add(but);
but.addActionListener(this);
grup = new ButtonGroup();
grup.add(b1);grup.add(b2);
grup.add(b3);grup.add(b4);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{
Enumeration enum=grup.getElements();
while (enum.hasMoreElements())
{ JRadioButton b=(JRadioButton)enum.nextElement();
if(b.isSelected()) System.out.println(b.getText());
}
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Validare");
}
}
218 Bazele programării în Java
10.7.7. Meniuri
JMenuBar() - constructor;
add(JMenu) - adaug` meniului componente de tip JMenu, vede]i \n
continuare.
Exemplu:
meniu1.add(new JSeparator());
JRadioButton b1=new JRadioButton("Matematica");
meniu1.add(b1);
JRadioButton b2=new JRadioButton("Informatica");
meniu1.add(b2);
JRadioButton b3=new JRadioButton("Engleza");
meniu1.add(b3);
JRadioButton b4=new JRadioButton("Biologie");
meniu1.add(b4);
meniu1.add(new JSeparator());
ButtonGroup grup = new ButtonGroup();
grup.add(b1);
grup.add(b2);
grup.add(b3);
grup.add(b4);
int a=125;
JOptionPane.showMessageDialog(this
, "a="+a);
int a=125;
int rasp=
JOptionPane.showConfirmDialog(this,"a="+a+"?");
System.out.println(rasp);
Aceste cutii de dialog sunt mai complexe. Ele permit s` select`m un set de
butoane (vom vedea cum) [i s` le schimb`m numele conform propriilor
dorin]e!
JTextArea() - constructor.
void append(String S) - adaug` la sf@r[itul [irului re]inut de
component` un alt [ir.
void insert(String s, int pozitie) - insereaz` \n text,
\ncep@nd de la pozitie un [ir de caractere. Dac` pozitie
dep`[e[te indicele ultimului caracter, atunci inserarea se face la
sf@r[itul [irului re]inut de component`.
void replaceRange(String str, int start, int end) -
\nlocuie[te [irul dintre indicii start [i end cu [irul transmis ca
parametru. Evident, dac` acesta din urm` este vid, se [terge \ntreg
textul.
setFont(Font f) - seteaz` fontul utilizat.
String getText() - returneaz` [irul de caractere con]inut de
component` (inclusiv dac` el con]ine newline, altfel spus, mai multe
paragrafe).
void setText(String S) - determin` ca obiectul de tip
JTextArea s` re]in` [irul S.
void setBackground(Color c) - seteaz` culoarea de fond a
suprafe]ei care afi[eaz` literele.
String getSelectedText() - returneaz` [irul de caractere
selectat.
void selectAll() - selecteaz` \ntreg textul re]inut de component`.
int getSelectionStart() - returneaz` indicele primului caracter
selectat.
int getSelectionEnd() - returneaz` indicele ultimului caracter
selectat.
void setLineWrap(boolean v) - dac` re]ine true, seteaz`
obiectul ca textul scris f`r` newline (adic` un singur paragraf) s` se
afi[eze pe mai multe r@nduri (\n cazul \n care nu \ncape pe l`]ime).
Dac` re]ine false, acesta este afi[at pe o singur` linie, chiar dac`,
la un moment dat, nu este toat` vizibil`.
226 Bazele programării în Java
JProgressBar() - constructor;
void setMinimum(int a) - memoreaz` valoarea la care
componenta indic` faptul c` nu s-a efectuat nimic;
void setMaximum(int b) - memoreaz` valoarea la care
componenta indic` faptul c` opera]ia este terminat`;
void setValue(int c) - seteaz` valoarea pe care o re]ine
componenta la un moment dat. Ea trebuie s` fie \ntre valorile a [i b,
setate cu setMinimum() [i setMaximum().
228 Bazele programării în Java
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Bara de progres");
WindowListener t=new Evfer();
fp.addWindowListener(t);
}
}
Valoarea returnat` este 0, dac` s-a ap`sat butonul Open sau este 1
dac` s-a ap`sat butonul Close. Rolul ei este ca, atunci c@nd a fost
selectat un anumit fi[ier [i s-a ap`sat Open, obiectul de tip
JFileChooser s` con]in` date despre fi[ierul selectat.
int showSaveDialog(Component fer_parinte) - afi[eaz` o cutie
de dialog de tip Save, asem`n`toare cu cutia precedent`. Valoarea
returnat` este 0 dac` s-a ap`sat butonul Save [i 1 dac` s-a ap`sat
butonul Cancel. Ca [i cutia precedent` (de tip Open), rolul ei este
ca obiectul de tip JFileChooser s` con]in` date despre fi[ierul
salvat.
Aten]ie: cutia de tip Open nu deschide fi[ierul, iar cutia de tip Save
nu-l salveaz`. Rolul lor este de a ob]ine informa]iile necesare
deschiderii [i salv`rii fi[ierelor.
File getSelectedFile() - metoda returneaz`, at@t \n cazul
salv`rii, c@t [i \n cazul deschiderii fi[ierelor, date despre fi[ierul
selectat (furnizate de showOpenDialog() [i showSaveDialog()).
Pentru a putea accesa aceste informa]ii, trebuie s` studiem c@teva
metode ale tipului File.
232 Bazele programării în Java
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
bara.addSeparator();
lista.addItem("Optiunea 1");
lista.addItem("Optiunea 2");
bara.add(lista);
lista.setPreferredSize(new Dimension (100,30));
setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Bara cu unelte");
}
}
Observa]ii:
1. Pentru a pozi]iona bara orizontal se prefer` gestionarul GridLayout [i
bara se a[eaz` \n nord.
2 |n aceste condi]ii, panelul s-a aranjat \n centru. Cum celelalte trei
componente lipsesc, componenta din centru ocup` toat` linia din mijloc, iar
linia din mijloc ocup` [i partea de sud!
3. Pentru bar` se prefer` gestionarul FlowLayout (FlowLayout.LEFT)
care aranjeaz` componentele pe bar` de la dreapta la st@nga, dar aliniate
st@nga!
4. Pentru a ne asigura c` butoanele [i lista au aceea[i \n`l]ime, am
preferat dimensionarea lor prin setPreferredSize().
5. |ntre cele dou` butoane [i list` a fost introdus un separator. Observa]i-
l \n imaginea de pe pagina anterioar`!
coloana.setPreferredWidth(150);
coloana.setResizable(false);
coloana=mColoane.getColumn(1);
coloana.setHeaderValue("Coloana 2");
JScrollPane panel = new JScrollPane(table);
table.setPreferredScrollableViewportSize
(new Dimension(200, 80));
Spuneam c` un container este asem`n`tor unui vector. Astfel, prima
component` ad`ugat` cu metoda de mai sus are indicele 0, a doua
component` are indicele 1, [.a.m.d.
numai dac` componenta propriu-zis` are tipul respectiv. De exemplu,
dac` c este tip Component [i re]ine adresa unui obiect de tip
JButton, atunci conversia JButton buton (JButton)c; este
corect`. Dac` \ns` c re]ine adresa unei componente de tip JLabel,
atunci prin conversia de mai sus se ob]ine o excep]ie.
Prezent`m programul:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Dial extends JDialog implements ActionListener
{
// Constructia cutiei de dialog
JButton buton=new JButton("Inchide cutia!");
JTextField txt=new JTextField(10);
Container y;
String sir=txt.getText();
Dial (JFrame parinte,String mesaj, boolean modal)
{ super(parinte,mesaj,modal);
y=getContentPane();
setSize(200,200);
y.setLayout(new FlowLayout());
y.add(buton);
y.add(txt);
buton.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
// inchide cutia
{ setVisible(false);}
}
class Fer extends JFrame implements ActionListener
{
Dial cutie=null;
public Fer(String titlu) {
super(titlu);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Afiseaza cutia"); x.add(A);
A.addActionListener(this);
JButton B=new JButton("Ce-am citit?");
x.add(B);
B.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{
//Daca a fost apasat butonul “Afiseaza cutia”
if( e.getActionCommand().compareTo("Afiseaza cutia")==0)
//daca cutia nu a fost afisata
if (cutie==null) cutie=new Dial(this,"Cutie de dialog",
true);
// daca cutia a fost afisata
else cutie.setVisible(true);
Capitolul 10. Iniţiere în programarea vizuală 247
else
//daca a fost apasat butonul “Ce-am citit?”
if (cutie!=null)
{ // recuperez container-ul cutiei
Container t=cutie.y;
// recuperez referinta catre edit
JTextField com=(JTextField)t.getComponent(1);
// recuperez continutul edit-ului
JOptionPane.showMessageDialog(this,com.getText());
}
// daca vreau sa vad ce-am scris fara sa fi afisat cutia
else JOptionPane.showMessageDialog
(this,"Mai intai afiseaza cutia de dialog");
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Fereastra din care apelez cutia");
}
}
Observa]ii:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Dial extends JDialog implements ActionListener
{ Container y;
JFrame frs;
Dial (JFrame parinte,String mesaj, boolean modal)
{ super(parinte,mesaj,modal);
y=getContentPane();
frs=parinte;
setSize(100,100);
y.setLayout(new FlowLayout());
JButton b1=new JButton("Rosu"); y.add(b1);
b1.addActionListener(this);
JButton b2=new JButton("Galben"); y.add(b2);
b2.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ Container z=frs.getContentPane();
if( e.getActionCommand().compareTo("Rosu")==0)
z.setBackground(Color.red);
else z.setBackground(Color.yellow);
}
}
class Fer extends JFrame implements ActionListener
{ Dial cutie=null;
public Fer(String titlu) {
super(titlu);
setSize(150,100);
Container x=getContentPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x.setLayout(new FlowLayout ());
JButton A=new JButton("Seteaza culoarea"); x.add(A);
A.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ if (cutie==null) cutie=new Dial(this,"Seteaza culoarea",
false);
else cutie.setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Culori");
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Culori");
}
}
250 Bazele programării în Java
Observa]ii:
Exemplu: ecr.setColor(Color.black);
int[] X= {10, 100,25, 80};
int[] Y= {10, 100,75, 30};
ecr.drawPolygon(X, Y, 4);
Clasa BasicStroke are mai mul]i constructori, din care, aici sunt
prezenta]i doar doi, mai importan]i:
Iat` care sunt valorile pe care le poate lua parametrul join (modul
de unire a segmentelor). Pentru fiecare din cazuri vom prezenta o linie
fr@nt` realizat` cu GeneralPath:
Parametrul join are efect doar \n cazul figurilor unitare (linie fr@nt`,
Prin utilizarea parametrului join, nu mai sunt necesare metode de
tipul celor care creeaz` un dreptunghi cu col]urile rotunjite. Acestea
pot fi rotunjite prin valoarea pe care o transmitem pentru join.
10.11.3. Gradient
aciclic ciclic
Capitolul 10. Iniţiere în programarea vizuală 259
Imagine()
{ // creez un obiect BufferedImage
imag_a=new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
// pentru a desena ii asociez un un obiect Graphics2D
gr=imag_a.createGraphics();
// desenez
Line2D.Float linie = new Line2D.Float(10,10, 100,100);
gr.draw(linie);
// obtin un obiect de tip Image care contine desenul
im=Toolkit.getDefaultToolkit().createImage(imag_a.getSource());
setSize(300,300); setBackground(Color.WHITE);
}
public void paint (Graphics ecr)
{ // desenez imaginea p
ecr.drawImage(im,0,0,this);
}
}
class Fer extends JFrame
{ Imagine p=new Imagine();
public Fer(String titlu) {
super(titlu);setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
x.add(p);
setVisible(true);
}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Imagine ascunsa");
}
}
10.11.5. Texturi
Suprafe]ele pot fi acoperite de o aceea[i culoare, de un gradient sau
de o textur`. Pentru a acoperi o suprafa]` cu o textur`, vom utiliza aceea[i
metod` a clasei Graphics2D ca [i c@nd acoperim suprafa]a cu un gradient
[i anume setPaint(Paint p). Dup` cum am ar`tat, Paint este o
interfa]`. Ea este implementat` de clasa GradientPaint (cu ajutorul ei
cre`m un gradient), dar [i de clasa TexturePaint, clas` cu ajutorul c`reia
cre`m o textur`.
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
10.11.6. Dreptunghiuri 3D
Clasa Graphics2D ne ofer` posibilitatea s` desen`m dreptunghiuri \n
relief. |n acest scop, ea con]ine metodele draw3DRect() [i fill3DRect():
2. Atunci c@nd parametrul raised re]ine true, laturile din st@nga [i sus
sunt desenate \ntr-o culoare deschis`, iar laturile din dreapta [i jos sunt
desenate \ntr-o culoare \nchis`. Dac` raised re]ine false, culorile laturilor
se inverseaz`. Exact aceste culori creeaz` impresia de ridicat sau cobor@t.
3. Practic, culoarea deschis` este cea setat` pentru desen, iar culoarea
\nchis` este aleas` automat de metod`. Din acest motiv, dac` avem setat`
culoarea negru, efectul este nul, iar dac` avem setat` culoarea alb efectul
este maxim.
Exemplu: butoanele al`turate au fost realizate \n clasa urm`toare:
-
-
apoi, \n urma unei transla]ii ( a doua din dreapta),
apoi, \n urma unei rota]ii (linia vertical`).
Se observ` [i faptul c` dup` aplicarea unei rota]ii, p`tratul se
afi[eaz` rotit.
Capitolul 10. Iniţiere în programarea vizuală 265
10.12. Evenimente
10.12.1. Generalităţi
|n exemplele date p@n` acum, majoritatea opera]iilor erau efectuate ca
urmare a ap`s`rii unui buton. |n realitate, mecanismul declan[`rii [i trat`rii
evenimentelor este cu mult mai complex. Exist` mai multe tipuri de
evenimente [i ele sunt tratate de “ascult`tori” diferi]i. |n continuare, le vom
prezenta pe cele mai des utilizate \n programarea vizual`.
Astfel, fiecare component` care poate emite mesaje de acest tip con]ine
metoda:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Fer extends JFrame implements ActionListener
{
public Fer(String titlu) {
super(titlu);
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
//Butonul
JButton A=new JButton("Buton 1");
x.add(A);
A.addActionListener(this);
//Lista
JComboBox lista=new JComboBox ();
lista.addItem("Optiunea 1");
lista.addItem("Optiunea 2");
x.add(lista);
lista.addActionListener(this);
// Edit-ul
JTextField t=new JTextField(10);
x.add(t);
t.addActionListener(this);
// JCheckBox
JCheckBox b=new JCheckBox("Bifeaza");
x.add(b);
b.addActionListener(this);
// JCheckBox
JRadioButton c=new JRadioButton("Radio");
x.add(c);
c.addActionListener(this);
setVisible(true);
}
public void actionPerformed (ActionEvent e)
{ System.out.println(e.getActionCommand()); }
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Test ActionEvent");
}
}
Capitolul 10. Iniţiere în programarea vizuală 267
void addMouseListener(MouseListener l)
- pentru “ascult`torul” MouseListener;
void addMouseMotionListener(MouseMotionListener l)
- pentru “ascult`torul” MouseMotionListener.
Observa]i c`:
Observa]i faptul c` programul con]ine [i metoda update
(Graphics ecr). Ce este cu ea, de ce am pus-o?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class Fer extends JFrame implements FocusListener, ActionListener
{
JTextField txt;
public Fer(String titlu) {
super(titlu);
setSize(200,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container x=getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("Buton 1"); x.add(A);
A.setName("Buton 1");
A.addFocusListener(this);
A.addActionListener(this);
JButton B=new JButton("Buton 2"); x.add(B);
B.addFocusListener(this);
B.setName("Buton 2");
txt =new JTextField(10);
txt.setName("Edit");
txt.addFocusListener(this);
x.add(txt);
setVisible(true);
}
public void focusGained(FocusEvent e)
{ System.out.println(e.getComponent().getName());}
public void focusLost(FocusEvent e) {}
public void actionPerformed (ActionEvent e)
{ System.out.println("blank sau click");}
}
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Focus");
}
}
Poza1.jpg…………….Poza4.jpg…………....Poza8.jpg…………...Poza12.jpg
De fapt, efectul ob]inut este o iluzie optic`. Dac` anima]ia este realizat`
într-un mod coerent [i intuitiv, ea va fi perceput` foarte u[or de privitori.
Totul depinde de îndemânarea [i talentul programatorului la crearea unor
efecte vizuale cât mai realiste.
Capitolul 10. Iniţiere în programarea vizuală 277
public class pv {
public static void main(String args[]) {
Fer fp=new Fer("Imagine");}
}
Probleme propuse
1. Scrie]i un program \n care o fereastr` afi[eaz` un buton. La ap`sarea
butonului, programul va afi[a \n fereastra CMD rezolu]ia ecranului.
2. Scrie]i un program \n care o fereastr`
afi[eaz` dou` butoane: Buton 1 [i Buton 2.
{tiind c` metoda boolean isEnabled() a clasei
JComponent returneaz` true dac` butonul este activ [i false \n caz
contrar, face]i \n a[a fel \nc@t, la ap`sarea primului buton, daca al doilea
buton este activ s` devin` inactiv [i invers, dac` este inactiv s` devin`
activ.
3. Cum se pot a[eza dou` butoane \n fereastr`
ca \n exemplul al`turat? Observa]i faptul c` primul
buton ocup` toat` partea de sus, iar al doilea
este a[ezat centrat pe orizontal`, \n partea de jos.
Capitolul 10. Iniţiere în programarea vizuală 279
Indicaţii:
4.
...
Container x=getContentPane();
x.setLayout(new BorderLayout ());
JButton A=new JButton("Buton 1");
x.add(A,BorderLayout.SOUTH);
JPanel panel=new JPanel();
x.add(panel,BorderLayout.CENTER);
panel.setLayout(new GridLayout(2,2));
JButton B=new JButton("Buton 2"); panel.add(B);
JButton C=new JButton("Buton 3"); panel.add(C);
JButton D=new JButton("Buton 4"); panel.add(D);
JButton E=new JButton("Buton 5"); panel.add(E);
...
5.
class Fer extends JFrame
{
public Fer(String titlu) {
super(titlu); setSize(250,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagLayout pozitii=new GridBagLayout();
JLabel et=new JLabel ("Numele ");
JTextField txt=new JTextField(15);
JLabel et1=new JLabel("Varsta");
JTextField txt1=new JTextField(2);
JButton bt=new JButton("Apasa");
Container x=getContentPane();
Capitolul 10. Iniţiere în programarea vizuală 283
// pozitionare et
GridBagConstraints p_et=new
GridBagConstraints(0,0,1,1,1,2,GridBagConstraints.WEST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(et,p_et);
// pozitionare txt
GridBagConstraints p_txt=new
GridBagConstraints(1,0,1,1,4,2,GridBagConstraints.WEST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(txt,p_txt);
// pozitionare et1
GridBagConstraints p_et1=new
GridBagConstraints(0,1,1,1,1,2,GridBagConstraints.WEST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(et1,p_et1);
// pozitionare txt1
GridBagConstraints p_txt1=new
GridBagConstraints(1,1,1,1,4,2,GridBagConstraints.WEST,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(txt1,p_txt1);
// pozitiona buton
GridBagConstraints p_bt=new
GridBagConstraints(0,2,2,1,1,1,GridBagConstraints.CENTER,
GridBagConstraints.NONE,new Insets(0,0,0,0), 0,0);
pozitii.setConstraints(bt,p_bt);
x.setLayout(pozitii);
x.add(et);
x.add(txt);
x.add(bt);
x.add(et1);
x.add(txt1);
setVisible(true);
}
}
6. Utiliza]i metoda:
Applet-uri
Din cuprins:
Crearea şi executarea applet-urilor
Arhive Java şi atributele elementului APPLET
Redefinirea unor metode ale applet-ului
Afişarea imaginilor. Clasa URL
Redarea sunetelor
Exemple de applet-uri
Capitolul 11. Applet-uri 286
11.1. Generalităţi
Pentru a \n]elege acest capitol, trebuie s` ave]i no]iuni despre HTML
[i modul \n care se “posteaz`” pe Internet o pagin` WEB. Aceste no]iuni pot
fi g`site, fie \n “Crearea [i programarea paginilor WEB”, fie \n “Tehnologia
Informa]iei [i a Comunica]iilor”, manual pentru clasa a IX-a, ambele scrise
de autorii acestei c`r]i.
Important:
1. Un applet este asem`n`tor unei ferestre. El poate con]ine una sau mai
multe componente pe suprafa]a sa.
2. Pentru crearea unui applet vom utiliza o component` de tip JApplet.
3. Applet-ul este ata[at unui fi[ier HTML, la fel ca o imagine.
4. Applet-ul este afi[at de c`tre browser-ul calculatorului de pe care se
vizualizeaz` pagina WEB [i este rulat tot de acesta.
5. Pentru ca browser-ul s` poat` rula applet-ul este necesar ca pe acel
calculator s` se g`seasc` implementat` (instalat`) o ma[in` virtual` Java
(Java Virtual Machine, JVM). Cum noi avem deja implementat soft-ul de
dezvoltare Java, nu mai avem nici o problem`, deoarece JVM este inclus \n
acesta. Dar, un utilizator oarecare poate desc`rca [i instala JVM de pe
site-ul firmei Sun.
6. M`surile de securitate impun anumite restric]ii. V` da]i seama ce ar fi
dac` nu s-ar lua m`surile de securitate de mai jos:
Applet-urile nu pot scrie sau citi fi[iere;
Nu pot apela programe aflate pe sistemul utilizatorului.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Ap extends JApplet implements ActionListener
{ public void init () {
Container x = getContentPane();
x.setLayout(new FlowLayout ());
JButton A=new JButton("merge");
A.addActionListener(this);
x.add(A);
}
<HTML>
<BODY>
<APPLET CODE="Ap.class" WIDTH=300 HEIGHT=300>
</BODY>
</HTML>
Mai jos, se poate observa cum arat` de aceast` dat` fi[ierul HTML:
<HTML>
<BODY>
<APPLET CODE="Ap.class" ARCHIVE="arh.jar" WIDTH=300 HEIGHT=300>
</BODY>
</HTML>
import java.awt.*;
import javax.swing.*;
public class Ap extends JApplet{
public void init()
{ JOptionPane.showMessageDialog (this, "Init");}
public void start()
{ JOptionPane.showMessageDialog (this, "Start");}
public void paint(Graphics g)
{ setBackground(Color.RED);}
}