Java este o tehnologie lansat ă de compania Sun Microsystems [607569]
PREFAȚĂ
Java este o tehnologie lansat ă de compania Sun Microsystems
în 1995, impunându-se prin calit ăți deosebite cum ar fi simplitate,
robustețe și portabilitate.
Prezenta carte este este o culege re de probleme rezolvate în
limbajul Java. Lucrarea este adresat ă studenților de la facult ăți
tehnice, în scopul înv ățării cât mai temeinice a program ării orientate
pe obiecte.
Cartea cuprinde un num ăr de 100 de programe rezolvate de
către autori și este structurat ă pe șapte capitole:
• Instrucțiuni elementare (atribui re, decizie, repetare)
• Dezvoltarea și utilizarea de clase
• Vectori. Matrici
• Șiruri de caractere
• Clase derivate. Clase abstracte. Polimorfism
• Fișiere
• Aplicații grafice
Pitești, 2007 Prof. dr. ing. Alexandru ENE
Universitatea din Pite ști
CUPRINS
Prefață
Instrucțiuni elementare (atribui re, decizie, repetare) 7
Dezvoltarea și utilizarea de clase 16
Vectori. Matrici 31 Șiruri de caractere 58
Clase derivate. Clase abstracte. Polimorfism 66 Fișiere 82
Aplicații grafice 109
Bibliografie
Instrucțiuni elementare (atribui re, decizie, repetare)
7
Cap. 1
Instrucțiuni elementare (atribuire, decizie, repetare)
1. Să se calculeze și afișeze câte numere naturale de patru cifre,
împărțite la 67, dau restul 23.
class Raspuns
{ public static void main(String args[]) { int contor=0; for(int i=1000;i<=9999;i++) if(i%67==23)contor++; System.out.println("Sunt "+contor+" numere."); } }
2. Scrieți o aplicație Java care s ă reconstituie sc ăderea:
X X X – X 2 X ––– 8 7 9
import javax.swing.*;
class Scadere { public static void main(String args[]) { int u1,z1,s1; //cifre unitati, zeci , sute pentru primul termen
int u2,s2; //cifre unitati, sute pentru al doilea termen
boolean are=false; //semafor, are solutie for(u1=0;u1<=9;u1++) for(z1=0;z1<=9;z1++) for(s1=1;s1<=9;s1++) for(u2=0;u2<=9;u2++) for(s2=1;s2<=9;s2++){ int nr1=100*s1+10*z1+u1; int nr2=100*s2+20+u2; if(nr1-nr2==879){ are=true; System.out.println(nr1+"-"+nr2+"=879");
Instrucțiuni elementare (atribui re, decizie, repetare)
8
}
}
if(are==false)System.out.println("nu are solutie"); } }
3. Să se calculeze valoare constantei PI, pe baza formulei:
pi/4=1-1/3+1/5-1/7+1/9-… Se vor lua N=3000 de termini în aceast ă sumă.
class Pi
{ public static void main(String args[]) { final int N=3000;//nr. de termeni ce se aduna double pi=0; for(int i=0;i<N;i++) if(i%2==0)pi=pi+4.0/(2*i+1); else pi=pi-4.0/(2*i+1); System.out.println("PI calculat ca suma de "+N+" termeni: "+pi); System.out.println("Constant a PI din clasa Math: "+Math.PI);
} }
4. Să se afișeze toți divizorii unui num ăr întreg dat ca parametru
în linia de comand ă.
class Divizori
{ public static void main(String args[]) { int nr=Integer.parseInt(args[0]); for(int i=1; i<=nr; i++) if(nr%i ==0)System.out.println(i); } }
5. Să se calculeze primul num ăr prim mai mare decât un num ăr
dat ca parametru în linia de comand ă.
class PrimulNrPrim
{ public static void main(String args[])
Instrucțiuni elementare (atribui re, decizie, repetare)
9
{
int nr=Integer.parseInt(args[0]);
int nrCrt=nr+1;//cautam incepand cu nr+1 for(;;){ if(estePrim(nrCrt)) break;//l-a gasit else nrCrt++; } System.out.println("Primul numar prim mai mare este: "+nrCrt);
} private static boolean estePrim(int x) { boolean este=true; for(int i=2;i<=Math.sqrt(x);i++) if(x % i == 0){ este=false; break; } return este; } }
6. Se citesc de la tastatur ă trei numere întregi a, b și c. Să se
ordoneze aceste numere cresc ătoare, astfel încât a va fi minimul, iar în
c va fi maximul. Citirea de la tastatur ă se va face cu metoda
showInputDialog() din clasa JOptionPane.
import javax.swing.*;
class Ordonare3 { public static void main(String args[]) { int a=Integer.parseInt(JO ptionPane.showInputDialog("a="));
int b=Integer.parseInt(JO ptionPane.showInputDialog("b="));
int c=Integer.parseInt(JO ptionPane.showInputDialog("c="));
if(a>b){ // le comutam: int aux=a; a=b; b=aux; }
if(b>c){
//le comutam: int aux=b; b=c; c=aux;
Instrucțiuni elementare (atribui re, decizie, repetare)
10
}
if(a>c){
//le comutam: int aux=a;a=c; c=aux; } System.out.println(a+" "+b+" "+c); } }
7. Se citesc dou ă numere a și b. Să se afișeze dacă cele dou ă
numere au acela și număr total de divizori.
import javax.swing.*;
class Comparare { public static void main(String args[]) { int a=Integer.parseInt(JO ptionPane.showInputDialog("a="));
int b=Integer.parseInt(JO ptionPane.showInputDialog("b="));
int na=2; // numarul de divizori ai lui a // orice numar are ca diviyori pe 1 si el insusi for(int i=2;i<=a/2;i++) if(a%i==0)na++; int nb=2; // numarul de divizori ai lui b for(int i=2;i<=b/2;i++) if(b%i==0)nb++; if(na>nb)System.out.println(a+" are mai multi divizori "); else if(na==nb)System.out.println("acelasi numar de divizori "); else System.out.println(b+" are mai multi divizori "); } }
8. Se citește un num ăr natural a. S ă se afișeze dacă este pătrat
perfect sau nu.
import javax.swing.*;
class PatratPerfect { public static void main(String args[]) { int a=Integer.parseInt(JO ptionPane.showInputDialog("a="));
Instrucțiuni elementare (atribui re, decizie, repetare)
11
double radical=Math.sqrt(a);
if((int)radical*(int)radical==a)
System.out.println("este"); else System.out.println("nu este"); } }
9. Se citesc n1 și n2 capetele unui interval închis. S ă se afișeze
dacă în intervalul [n1, n2], exist ă cel puțin un num ăr prim.
import javax.swing.*;
class ExistaNumerePrime { public static void main(String args[]) { int n1=Integer.parseInt(JO ptionPane.showInputDialog("n1="));
int n2=Integer.parseInt(JO ptionPane.showInputDialog("n2="));
boolean exista=false; for(int i=n1;i<=n2;i++) if(estePrim(i)){ exista=true; break; } if(exista)System .out.println("exista");
else System.out.println("nu exista"); } private static boolean estePrim(int nr){ for(int i=2;i<=Math.sqrt(nr);i++) if(nr%i==0)return false; return true; } }
10. Se citește un num ăr natural de la tastatur ă. Să se afișeze care
este cifra maxim ă din acest num ăr.
import javax.swing.*;
class CifraMaxima { public static void main(String args[]) { int a=Integer.parseInt(JO ptionPane.showInputDialog("a="));
Instrucțiuni elementare (atribui re, decizie, repetare)
12
int max=0;
for(;;){
int cifraCrt=a%10; if(cifraCrt>max)max=cifraCrt; a=a/10;//reduc numarul: if(a==0)break; } System.out.println(max); } }
11. Se citesc trei numere întregi a, b și c, de la tastatur ă. Să se
calculeze maximul dintre a și b (se va folosi metoda definit ă separat
maxim(), ce are doi parametrii) și maximul dintre a, b și c (se va folosi
metoda definit ă separate maxim(), ce are trei parametrii). Aceast ă
aplicație ilustreaz ă polimorfismul parametric în Java (posibilitatea ca
în aceeași clasă să existe dou ă sau mai multe metode cu acela și nume,
dar cu liste de parametrii diferi ți).
import javax.swing.*;
class CalculMaxim { public static void main(String args[]) { int a=Integer.parseInt(JO ptionPane.showInputDialog("a="));
int b=Integer.parseInt(JO ptionPane.showInputDialog("b="));
int c=Integer.parseInt(JO ptionPane.showInputDialog("c="));
int max2=maxim(a,b); System.out.println(max2); int max3=maxim(a,b,c); System.out.println(max3); } private static int maxim(int a,int b){ if(a>=b)return a; else return b; } private static int maxim(int a,int b,int c){ int max=a; if(b>max)max=b; if(c>max)max=c; return max;
Instrucțiuni elementare (atribui re, decizie, repetare)
13
}
}
12. Se citește un num ăr natural n. Se citesc primul termen și rația
unei progresii aritmetice. S ă se calculeze, recursiv, termenul de rang n
al progresiei.
import javax.swing.*;
class ProgresieAritmetica { public static void main(String args[]) { double a1=Double.parseDoubl e(JOptionPane.showInputDialog(
"primul termen al progresiei=")); double r=Double.parseDoubl e(JOptionPane.showInputDialog(
"ratia =")); int n=Integer.parseInt(JO ptionPane.showInputDialog("n ="));
//calcul termen de rang n: double a_n=calcul(a1,r,n); System.out.print("Terme nul de rang "+n+" este: "+a_n);
} private static double calcul( double primulTermen, double ratia,
int n)
{ if(n==1)return primulTermen; return ratia+calcul(primulTermen,ratia,n-1); } }
13. Se citește un num ăr natural N. S ă se calculeze termenul de
rang N din șirul lui Fibonacci.
Șirul lui Fibonacci se define ște recursiv astfel:
a
0= 1
a1=1
an=an-1+an-2 , pentru n>=2
import javax.swing.*;
class Fibonacci { public static void main(String args[]) { int N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
Instrucțiuni elementare (atribui re, decizie, repetare)
14
System.out.println(fib(N));
}
private static int fib(int n){ if(n==0)return 1; if(n==1)return 1; return fib(n-1)+fib(n-2); } }
14. Se citește un num ăr natural N. S ă se afișeze dacă acest num ăr
este termen în șirul lui Fibonacci.
import javax.swing.*;
class EsteFibonacci { public static void main(String args[]) { int x=Integer.parseInt(JO ptionPane.showInputDialog("x="));
boolean este=false; int n=0; for(;;){ int termen=fib(n); if(x==termen){ este=true; break; } if(x<termen)break; //deci, nu este // trecem la ur matorul termen Fibonacci:
n++; } if(este)System.out.println("este"); else System.out.println("nu este"); } private static int fib(int n){ if(n==0)return 1; if(n==1)return 1; return fib(n-1)+fib(n-2); } }
15. Se citește un num ăr natural N. S ă se calculeze suma primilor N
termeni din șirul lui Fibonacci.
Instrucțiuni elementare (atribui re, decizie, repetare)
15
import javax.swing.*;
class SumaFib
{ public static void main(String args[]) { int N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
int suma=0; for(int i=0;i<N;i++) suma=suma+fib(i); System.out.println(suma); } private static int fib(int n){ if(n==0)return 1; if(n==1)return 1; return fib(n-1)+fib(n-2); } }
Dezvoltarea și utilizarea de clase elementare
16
Cap. 2
Dezvoltarea și utilizarea de clase elementare
1. Să se afișeze din câte încerc ări se genereaz ă trei numere
aleatoare egale, în gama 0..19. import java.util.*;
class NrIncercari{
public static void main(String args[]){ final int GAMA=20; Random r=new Random(); int contor=0; for(;;){ int a=r.nextInt(GAMA); int b=r.nextInt(GAMA); int c=r.nextInt(GAMA); contor++; if((a==b)&&(b==c))break; } System.out.println(contor); } }
2. Folosind clasa BigInteger s ă se calculeze 2
1000. Vom folosi
metoda pow() din aceast ă clasă. Să se afișeze și câte cifre are acest
rezultat. Metoda pow() are semn ătura:
public BigInteger pow(int exponent)
import java.math.*;
class BigInteg1 { public static void main(String args[]) { BigInteger baza=new BigInteger("2"); BigInteger rezu ltat=baza.pow(1000);
String s=rezultat.toString(); System.out.println("rezultat="+s); System.out.println("nr. cifre="+s.length()); } }
Dezvoltarea și utilizarea de clase elementare
17
3. Folosind clasa BigInteger , s ă se calculeze și afișeze valoarea
numărului 50! Se va folosi metoda multiply(), ce are ca parametru un
număr BigInteger și scoate ca rezultat un num ăr de tip BigInteger, care
reprezintă rezultatul înmul țirii între num ărul dat ca parametru și
obiectul curent (pentru care se apeleaz ă metoda multiply()).
import java.math.*;
class Fact50 { public static void main(String args[]) { BigInteger rez=new BigInteger("1"); for(int i=2;i<=50;i++) rez=rez.multiply(new BigInteger(""+i)); System.out.println(rez); } }
4. Se dă următorul fragment de program:
class A {
public int x;
…
}
class B
{
public static void main(String args[])
{ … } } În metoda main(), s ă se scrie în variabila x din clasa A, valoarea 7.
public static void main(String args[])
{ A obiect=new A(); obiect.x=7; …… }
5. Se dă următorul fragment de program:
class A
Dezvoltarea și utilizarea de clase elementare
18
{
public int x;
private double y; … } class B { public static void main(String args[]) { //scriem in variabilele x si y din clasa A: x=3; y=7; … } } Să se explice de ce cele dou ă atribuiri din metoda main() sunt gre șite.
Explicații:
În variabila public ă x, nu se poate scrie direct din afara clasei
ei. Trebuie mai întâi instan țiat un obiect din clasa A, și pe baza lui se
accesează variabila x, astfel:
A obj=new A(); obj.x=3; În cazul variabilei private y, fiind private, nu avem acces din afara clasei în care ea este definit ă.
6. Să se scrie o metod ă ce are ca parametru un num ăr natural N;
metoda returneaz ă două numere aleatoare diferite, în gama 0…N-1.
Dați și un exemplu de aplica ție în care se folose ște această metodă.
import java.util.*;
class Generare2Aleatoare
{ public static void main(String args[]) { final int N=100; Dublet d=getDouaN umereDiferite(N);
//afisam numerele: System.out.println(d.x); System.out.println(d.y); } //metoda ce returneaza doua numere aleatoare //diferite in gama 0..N-1
Dezvoltarea și utilizarea de clase elementare
19
private static Dublet ge tDouaNumereDiferite(int N)
{
Random r=new Random(); int n1=r.nextInt(N);//primul numar int n2; for(;;){ n2=r.nextInt(N); if(n1!=n2)break; } //formez un obiect din clasa Dublet: Dublet d2=new Dublet(n1,n2); return d2; } } class Dublet { public int x; public int y; public Dublet(int a, int b) { x=a; y=b; } }
7. Pentru trei numere întregi a, b și c, să se calculeze maximul,
minimul și media aritmetic ă a celor trei numere, folosind o metod ă
separată ce are ca parametrii trei numere întregi și care returneaz ă trei
rezultate: maximul, minimul și media aritmetic ă a celor trei numere.
class Calcul3Rez
{ public static void main(String args[]) { //Initializam in mod di rect cele trei numere:
int a=7; int b=8; int c=4; Triplet t=getRezultate(a,b,c); //afisam numerele: System.out.println("minim="+t.x);
Dezvoltarea și utilizarea de clase elementare
20
System.out.println("maxim="+t.y);
System.out.println("medie="+t.z);
} //metoda ce returneaza cele trei rezultate: private static Triplet getRezultate(int a, int b, int c) { int min=a; if(b<min)min=b; if(c<min)min=c; int max=a; if(b>max)max=b; if(c>max)max=c; double medie=(a+b+c)/3.0; //formez un obiect din clasa Triplet: Triplet t=new Triplet(min, max, medie); return t; } } class Triplet { public int x; public int y; public double z; public Triplet(in t a, int b, double c)
{ x=a; y=b; z=c; } }
8. Scrieți clasa Numar ce are ca variabil ă de instan ță privată un
număr întreg nr, și ca metode:
‐ constructorul, ce ini țializează variabila nr;
‐ getNr(), ce returneaz ă valoarea variabilei private nr;
‐ metoda estePatratPerfect() ce returneaz ă true dacă nr este
pătrat perfect și false în caz contrar;
‐ metoda estePrim() ce returneaz ă true dacă nr este prim și false
în caz contrar;
‐ metoda afisareDivizori() ce afi șează divizorii num ărului nr.
Scrieți și o clasă de test pentru clasa Numar.
class Numar
{ private int nr;
Dezvoltarea și utilizarea de clase elementare
21
public Numar(int x)
{
nr=x; } public int getNr() { return nr; } public void afisareDivizori() { //nr. 1, este sigur divizor: System.out.println("1"); //Cautam divizorii intr e 2 si jumatatea numarului:
for(int i=2;i<=nr/2;i++) if(nr%i==0)System.out.println(i); //numarul se di vide cu el insusi:
System.out.println(nr); } public boolean estePrim() { boolean este = true; for(int i=2;i<=Math.sqrt(nr);i++) if(nr%i==0){ este = false; break; } return este; } public boolean estePatratPerfect() { int radical=(int)Math.sqrt(nr); if(radical*radical==nr)return true; else return false; } } class TestNumar { public static void main (String args[]) {
Dezvoltarea și utilizarea de clase elementare
22
Numar n=new Numar(25);
System.out.println("Divi zorii numarului "+n.getNr());
n.afisareDivizori(); System.out.println("este patrat perfect="+n.estePatratPerfect());
if(n.estePrim()==true)System.out.p rintln(n.getNr()+" este prim.");
else System.out.println(n.getN r()+" nu este prim.");
} }
9. Să se construiasc ă clasa Dreptunghi, ce are ca variabile de
instanță private, dou ă numere întregi a și b, ce reprezint ă lungimile
laturilor unui dreptunghi. În aceast ă clasă avem ca metode:
‐ constructorul, ce face ini țializările;
‐ metoda calculPerimetru(), ce returneaz ă perimetrul
dreptunghiului;
‐ metoda calculArie(), ce returneaz ă aria dreptunghiului;
‐ metoda estePatrat(), ce returneaz ă true dacă dreptunghiul este
pătrat;
‐ metoda suntEgale(), ce are ca parametru un dreptunghi d și
scoate ca rezultat true dacă dreptunghiul curent (c el pentru care se
apelează metoda) este egal cu dreptunghiul d.
Scrieți și o clasă de test pentru clasa Dreptunghi.
class Dreptunghi
{ private int a; private int b; public Dreptunghi(int x,int y) { a=x;
b=y;
} public int calculPerimetru() { return 2*(a+b); } public int calculArie() { return a*b; }
Dezvoltarea și utilizarea de clase elementare
23
public boolean estePatrat()
{
if(a==b)return true; else return false; } public boolean suntEgale(Dreptunghi d) { if ((this.a==d.a)&&(this.b==d.b))return true; else return false; } } class TestDreptunghi { public static void main (String args[]) { Dreptunghi d=new Dreptunghi(5,7); System.out.println("Primetrul este "+d.calculPerimetru()); System.out.println("Aria este "+d.calculArie()); System.out.println("Dreptunghiul este patrat= "+d.estePatrat());
Dreptunghi d1=new Dreptunghi(5,7); System.out.println("Sunt egale= "+d.suntEgale(d1)); } }
10. Să se dezvolte clasa DouaNumere, ce are variabile de instan ță
două numere întregi a și b, și ca metode:
‐ constructorul ce face ini țializările;
‐ metoda maxim(), ce returneaz ă maximul dintre a și b;
‐ metoda cmmdc(), ce returneaz ă cel mai mare divizor comun al
celor două numere.
Scrieți și o clasă de test pentru clasa DouaNumere.
class DouaNumere
{ private int a,b,c; public DouaNumere(int n1, int n2) { a=n1; b=n2; }
Dezvoltarea și utilizarea de clase elementare
24
public int maxim()
{
if(a>b)return a; else return b; } public int cmmdc() { while(a!=b) if(a>b)a=a-b; else b=b-a; return a; } } class Test2Numere { public static void main(String args[]) { DouaNumere d=new DouaNumere(12,18); System.out.println("m aximul este: "+d.maxim());
System.out.println("cmmdc este: "+d.cmmdc()); } }
11. Să se dezvolte clasa TreiNumere, ce are variabile de instan ță
trei numere întregi a,b și c, și ca metode:
‐ constructorul ce face ini țializările;
‐ metoda maxim(), ce returneaz ă maximul dintre a, b și c;
‐ metoda suntPitagoric e(), ce returneaz ă true, dacă a, b, c sunt
numere pitagorice. Scrieți și o clasă de test pentru clasa TreiNumere.
class TreiNumere
{ private int a,b,c; //constructor: public TreiNumere(int n1, int n2, int n3) { a=n1; b=n2; c=n3; }
Dezvoltarea și utilizarea de clase elementare
25
public int maxim()
{
int max=a; if(b>max)max=b; if(c>max)max=c; return max; } public boolean suntPitagorice() { if((a*a==b*b+c*c)||(b*b==a*a+c*c)||(c*c==a*a+b*b)) return(true); else return(false); } } class Test3Numere { public static void main(String args[]) { TreiNumere t=new TreiNumere(3,5,4); System.out.println("m aximul este: "+t.maxim());
if(t.suntPitagorice())System.out.println("Sunt numere pitagorice"); else System.out.println("Nu sunt numere pitagorice"); } }
12. Să se dezvolte clasa Complex, ce are variabile de instan ță
private dou ă numere întregi re și im (partea real ă și partea imaginar ă a
unui num ăr complex) și ca metode:
‐ constructorul ce face ini țializările;
‐ modul(), ce returneaz ă modulul num ărului complex;
‐ suma(), ce are ca parametru un num ăr complex c, prin care la
numărul complex curent se adun ă numărul complex c (rezultatul se
depune în num ărul curent);
‐ produs(), ce are ca parametru un num ăr complex c, prin care în
numărul complex curent se depune rezultatul înmul țirii dintre num ărul
complex curent și numărul complex c;
‐ getRe(), ce returneaz ă partea real ă a numărului complex;
‐ getIm(), ce returneaz ă partea imaginar ă a numărului complex;
Dezvoltarea și utilizarea de clase elementare
26
‐ equals(), ce redefine ște metoda equals() di n clasa Object, prin
care se compar ă din punct de vedere al con ținutului, dou ă obiecte
Complex: obiectul curent și obiectul dat ca parametru;
‐ toString(), ce redefine ște metoda toString() din clasa Object,
prin care se d ă o reprezentare sub form ă de String a unui num ăr
complex; Scrieți și o clasa de test pe ntru clasa Complex.
class Complex
{ private double re; private double im; public Complex(double x, double y) { re=x; im=y; } public double getRe() { return re; } public double getIm() {
return im;
} public double modul() { return Math.sqrt(re*re+im*im); } //adunarea nr. complex curent, cu un alt nr. complex, cu depunerea
//rezultatului in numarul complex curent: public void suma(Complex c) { re=re+c.re; im=im+c.im; } //inmultirea nr. complex curent, cu un alt nr. complex, cu depunerea //rezultatului in numarul complex curent: public void produs(Complex c) { re=re*c.re-im*c.im;
Dezvoltarea și utilizarea de clase elementare
27
im=re*c.im+im*c.re;
}
//redefinirea metodei equals( ) din clasa parinte Object:
//(trebuie sa se pastreze aceeasi semnatura:) public boolean equals(Object obj) { Complex c=(Complex)obj; if(c!=null) if((re==c.re)&&(im==c.im))return true; return false; } //redefinirea metodei toStri ng() din clasa parinte Object:
public String toString() { String s="("+re+","+im+")"; return s; } } class TestComplex { public static void main(String args[]) { Complex c1=new Complex(1,1); System.out.println("Mo dulul este= "+c1.modul());
Complex c2=new Complex(1,1); c1.suma(c2); System.out.println("suma = "+c1.toString()); Complex c3=new Complex(1,1); System.out.println("sunt egale: "+c2.equals(c3)); } }
13. Scrieți clasa Unghi, ce are ca variabil ă de instan ță privată un
număr întreg x, m ăsura în grade a unui unghi, și ca metode:
‐ constructorul;
‐ suntComplementare(), ce are ca parametru un alt unghi u, și
care returneaz ă true dacă unghiul u este complementar cu unghiul
curent;
Dezvoltarea și utilizarea de clase elementare
28
‐ conversieRadiani(), ce returneaz ă valoarea exprimat ă în
radiani a unghiului curent x.
Scrieți și o clasă de test pentru clasa Unghi.
class Unghi
{ private int x; public Unghi(int x) { this.x=x; } public boolean suntComplementare(Unghi u) { if(this.x+u.x==90) return true; else return false; } public double conversieRadiani() { return (Math.PI*x)/180; } } class TestUnghi { public static void main (String args[]) { Unghi a=new Unghi(30); System.out.println("Radiani= "+a.conversieRadiani()); System.out.println("sunt
complementare="+a.suntComplementare(new Unghi(60)));
} }
14. Să se dezvolte clasa Timp ce are ca variabile de instan ță trei
numere întregi: h, min, sec (ore, minute, secunde). Ca metode:
‐ constructorul;
‐ conversieInSecunde() ce returneaz ă timpul curent, exprimat în
secunde;
‐ compara(), ce are ca parametru un Timp t, și care returneaz ă 1 dacă
timpul current este mai mare ca t, 0 dac ă cei doi timpi sunt egali , și -1
în caz contrar.
Dezvoltarea și utilizarea de clase elementare
29
Scrieți și o clasă de test.
class Timp { private int h; //ore
private int min;
private int sec; public Timp(int ore,int m, int s) { h=ore; min=m; sec=s; } public int conversieSecunde() { return 3600*h+60*min+sec; } public int compara(Timp t) //returneaza 0 daca cei doi timpi sunt egali //returneaza 1 daca timpul curent > timpul t dat ca argument
//returneaza -1 daca timpul curent < timpul t { int sec1=this.conversieSecunde();//timpul curent, in secunde int sec=t.conversieSecunde();//timpul t, in secunde if(sec1>sec)return 1; else if(sec1==sec)return 0; else return -1; } } class TestTimp { public static void main(String args[]) { Timp t1=new Timp(1,5,6); Timp t2=new Timp(1,5,6); int rezultat=t1.compara(t2); if(rezultat==1)System.out.println("t1>t2"); else if(rezultat==0)System.out.println("t1=t2"); else System.out.println("t1<t2"); }
Dezvoltarea și utilizarea de clase elementare
30
}
15. Să se construiasc ă clasa Cerc, ce are ca variabil ă de instan ță
privată, un num ăr întreg r, ce reprezint ă raza unui cerc. În aceast ă
clasă avem ca metode:
‐ constructorul, ce face ini țializarea razei;
‐ metoda calculPerimetru(), ce returneaz ă perimetrul cercului;
‐ metoda calculArie(),ce returneaz ă aria cercului;
Scrieți și o clasă de test pentru clasa Cerc.
class Cerc
{ private int raza; public Cerc(int x) { raza=x; } public double calculPerimetru() { return 2*Math.PI*raza; } public double calculArie() { return Math.PI*raza*raza; } } class TestCerc { public static void main (String args[]) { Cerc c=new Cerc(3); System.out.println("Perimetru= "+c.calculPerimetru()); System.out.println("Aria= "+c.calculArie()); } }
Vectori. Matrici
31
Cap. 3
Vectori. Matrici
1. Se citește de la tastatur ă un număr natural N; se instan țiază un
vector de N numere întregi. S ă se completeze acest vector cu numere
aleatoare în gama 0..N-1, cu condi ția ca fiecare num ăr din aceast ă
gamă să apară o singură dată.
Algoritm: vom ini țializa vectorul cu nume rele 0,1, .., N-1, date în
această ordine. Apoi, aceste numere ini țiale, le vom comuta, pozi țiile
de comutare fiind generate aleator.
import javax.swing.*;
import java.util.*; class InitNumAleatoare { public static void main(String args[]) { int N; String s = JOptionPane .showInputDialog("N=");
N = Integer.parseInt(s); int a[] = new int [N]; int i; //se initializeaza vectorul cu numerele 0,1,…,N-1, in aceasta ordine:
for(i=0;i<a.length;i++) a[i] = i; Random r = new Random(); //se repeta de N ori: for(i=0;i<N;i++){ //se genereaza doua numere aleatoare n1 si n2: int n1 = r.nextInt(N); int n2 = r.nextInt(N); //se comuta vari abilele a[n1] si a[n2]:
int aux = a[n1]; a[n1] = a[n2]; a[n2] = aux; } //Afisare vector generat: for (i=0;i<N;i++) System.out.println(a[i]); System.exit(0);
Vectori. Matrici
32
}
}
2. Se citește de la tastatur ă un număr natural N; se instan țiază un
vector de N numere întregi. S ă se completeze acest vector cu numere
aleatoare în gama 0..N-1, cu condi ția ca fiecare num ăr din aceast ă
gamă să apară o singur ă dată. (Problema anterioar ă, dar un alt
algoritm: vom introduce pe ri nd în vector, cate un num ăr aleator, cu
condiția ca să fie diferit de numerel e anterioare introduse).
import java.util.*;
class Aleatoare { public static void main(String args[]) { final int N=10; int a[]=new int[N]; Random r=new Random(); int i; int nr; for(i=0;i<N;i++){ for(;;){ nr=r.nextInt(N);//intre 0 si (N-1) //a mai fost generat? //cautare liniara: boolean estePrezent=false; for(int j=0;j<i;j++) if(nr==a[j]){ estePrezent=true; break;} if(estePrezent==false){ a[i]=nr; break; } }//for;; }//for i //afisare: for(i=0;i<N;i++) System.out.print(a[i]+" "); System.out.println("\n"); }//main
Vectori. Matrici
33
}
3. Se citesc de la tastatur ă doi vectori a și b, ce au aceea și
dimensiune (dimensiunea lor comun ă, N, este cunoscut ă). Să se
afișeze dacă vectorul b este o perm utare a vectorului a.
import javax.swing.*;
import java.util.*; class SuntPermutari { public static void main(String args[]) { int N; String s = JOptionPane .showInputDialog("N=");
N = Integer.parseInt(s); int a[] = new int [N]; int b[] = new int [N]; int i; for(i=0;i<N;i++) a[i]=Integer.parseInt(JOptionPane .showInputDialog("a["+i+"]="));
for(i=0;i<N;i++) b[i]=Integer.parseInt(JOptionPane .showInputDialog("b["+i+"]="));
//sortam cei doi vectori: Arrays.sort(a); Arrays.sort(b); //comparam cei doi vectori: boolean suntPerm=true; for(i=0;i<N;i++) if(a[i]!=b[i]){ suntPerm=false; break; } if(suntPerm)System.out.println("sunt"); else System.out.println("nu sunt"); }
}
4. În clasa System, care face parte din pachetul java.lang, este
definită metoda: currentTimeMillis() cu semn ătura:
public static long int currentTimeMillis().
Vectori. Matrici
34
Această metodă returneaz ă valoarea timpului sistemului, în
milisecunde.
Se genereaz ă N= 100000 numere întregi aleatoare, în gama 0…9999,
care se memoreaz ă în vectorul a. Folosind metoda
currentTimeMillis(), s ă se calculeze durata sort ării în ordine
crescătoare a vectorului a. Se va sort a vectorul mai întâi cu metoda
Arrays.sort(), și apoi acela și vector cu metoda de sortare prin
interschimbare.
import javax.swing.*;
import java.util.*; class DurataSortare { public static void main(String args[]) { final int N=100000;
final int GAMA=1000; int a[] = new int [N]; Random r=new Random(); int i; for(i=0;i<N;i++) a[i]=r.nextInt(GAMA); //salvam vectorul a: int b[] = new int [N]; for(i=0;i<N;i++) b[i]=a[i]; long t1=System. currentTimeMillis();
Arrays.sort(a); long t2=System. currentTimeMillis();
System.out.println(t2-t1); //Acelasi vector sort at prin interschimbare:
long t3=System. currentTimeMillis();
sortare(b); long t4=System. currentTimeMillis();
System.out.println("sortare interschimbare : "+(t4-t3));
}
private static void sortare(int a[]) {
for(int i=0;i<a.length-1;i++) for(int j=i+1;j<a.length;j++) if(a[i]>a[j]){
Vectori. Matrici
35
int aux=a[i];
a[i]=a[j];
a[j]=aux; } } }
5. Să se scrie o aplica ție ce folose ște o metod ă ce are doi parametrii:
un vector de numere întregi a , și un parametru de tip caracter denumit
sens, ce poate avea dou ă valori: ‘s’ (stânga) și ‘d’ (dreapta). În metod ă
se rotesc în vectorul a toate elementele, cu o pozi ție, spre stânga sau
spre dreapta, dup ă valoarea parametrului sens.
Exemplu: a={1,2,30} și sens=’d’. Dup ă execuția metodei avem: a={30, 1, 2}
class Rotire
{ public static void main(String args[]) { int a[]={1,2,30}; rotire(a,'d'); for(int i=0;i<a.length;i++) System.out.print(a[i]+" "); } private static void rotire(int a[],char sens) { int N=a.length;//dimensiune vector a[] if(sens=='s'){ int aux=a[0]; for(int i=0;i<N-1;i++) a[i]=a[i+1]; a[N-1]=aux; } else if(sens=='d'){ int aux=a[N-1]; for(int i=N-2;i>=0;i–) a[i+1]=a[i]; a[0]=aux; } } }
Vectori. Matrici
36
6. Scrieți o aplica ție în care se implementeaz ă algoritmul de c ăutare
binară a prezen ței unui num ăr x citit de la tastatur ă într-un vector
sortat cresc ător.
class CautareBinara
{ public static void main(String args[]) { int a[]={1,5,7,9,12,30}; int x=1; //Este prezent x in vectorul a[] ? if(estePrezent(x,a,0,a.l ength-1))System.out.println("Este prezent.");
else System.out.println("Nu este prezent."); } private static boolean estePrez ent(int x,int a[ ],int s,int d)
{ if(s==d){ if(x==a[s])return true;else return false;} if(d-s==1){ if((x==a[s])||(x==a[d]))return true; else return false;} int m; m=(s+d)/2; if(x==a[m])return true; else if(x<a[m])return estePrezent(x,a,s,m-1);
else return estePrezent(x,a,m+1,d); }//estePrezent }
7. Scrieți o aplica ție Java în care se implementez ă algoritmul de
sortare prin metoda selec ției maximului.
import javax.swing.*;
class SelectieMaxim{ public static void main(String args[]){ final int N=5; int A[]=new int[N]; int i; //citire vector A[]: for(i=0;i<N;i++) A[i]=Integer.parseInt(JOpti onPane.showInputDialog("nr="));
Vectori. Matrici
37
ordonareCresc(A,N);
System.out.println("Numerele sortate crescator: ");
for(i=0;i<N;i++) System.out.println(A[i]); }//main private static void ordonareCresc(int A[], int nA) //trebuie oblig. ca parametru dat si nA, pt. ca metoda se va apela
// recursiv pt. mai putine elemente.
{ if(nA==1)return;//un singur element, este implicit ordonat! int poz=getPozMax(A,nA);//indexul maximului if(poz!=nA-1){//daca este chiar pe ultima poz., nu avem ce comuta! //comut elementul de pe utima poz. din A cu maximul gasit: int temp=A[nA-1]; A[nA-1]=A[poz]; A[poz]=temp;} //ordoneaza recursiv portiunea din vectorul A[] // ce are doar nA-1 componente: ordonareCresc(A,nA-1); }//ordonareCresc private static int getPozMax(int A[], int nA) { int max=A[0]; int pozMax=0; for(int i=1;i<nA;i++) if(A[i]>max){ max=A[i]; pozMax=i;} return pozMax; } }
8. Scrieți o aplica ție Java în care se implementez ă algoritmul de
interclasare a doi vectori sorta ți crescător.
class Interclasare
{ public static void main(String args[]){ //Se dau doi vectori A[] si B[], fiecare ordonat crescator. Sa obtinem // vectorul C, ordonat crescator, ce cuprinde toate elementele din
//primii doi vectori.
Vectori. Matrici
38
int A[]={1,10,200};
int B[]={5, 6, 7, 22, 33,4090};
int nA=A.length;//nr. de elemente din A int nB=B.length; int C[]=new int[nA+nB]; //Algoritmul de interclasare: //Indexul initial in fieca re din cele 3 multimi:
//indexA=indexB=indexC=0 (se pleaca de la 0) //Comparam pe A[ i ndexA] cu B[indexB].
//Pe cel mai mic, il copiem in multimea C. //Modificam corespunzator indecs ii: incrementam indexul multimii C
// si indexul din multimea din care a fost elementul ce s-a copiat.
//Se repeta apoi acest procedeu., pana se termina una din multimi. int indexA=0; int indexB=0; int indexC=0; int i; while((indexA<nA)&&(indexB<nB)){ if(A[indexA]<=B[indexB]){ C[indexC]=A[indexA]; indexA++;} else{ C[indexC]=B[indexB]; indexB++;} //in ambele cazuri, cresc indexC: indexC++; } //Una din multimile A , B – s-a term inat. Adaug la sfarsitul lui C
// restul elementelor din multimea ce nu s-a terminat: if(indexA==nA)//s-a terminat A: for(i=indexB;i<nB;i++)//cele ramase in B: C[indexC+i-indexB]=B[i]; else if(indexB==nB)//s-a terminat B: for(i=indexA;i<nA;i++)//cele ramase in A: C[indexC+i-indexA]=A[i]; //Afisarea multimii A: for(i=0;i<nA;i++) System.out.print(A[i]+" "); System.out.println(); //Afisarea multimii B:
Vectori. Matrici
39
for(i=0;i<nB;i++)
System.out.print(B[i]+" ");
System.out.println(); //Afisarea multimii C: for(i=0;i<nA+nB;i++) System.out.print(C[i]+" "); } }
9. Folosind clasa Vector, implementa ți următorul algoritm:
se repetă
citim un num ăr real
îl memor ăm într-un obiect de tip Vector
se afișează mesajul: “Dati un alt numar? [d/n] ”
se citește răspunsul la acest mesaj
până când răspunsul este ‘n’
Se vor afi șa în final numerele memora te în obiectul Vector
import java.util.*;
import javax.swing.*; class VectorDinamic { public static void main(String args[]) { Vector v=new Vector(); double nr; for(;;){ nr=Double.parseDouble(JOp tionPane.showInputDialog("nr.="));
v.add(new Double(nr)); String raspuns= JOptionPane.showInputDialog("D ati un alt numar? [d/n]: ");
if(raspuns.charAt(0)=='n')break; } afisareVector(v); //Modificam primul numar introdus anterior in Vector:
v.set(0,new Double(7.5)); System.out.println("Vectorul modificat: "); afisareVector(v); System.out.println(); } private static void afisareVector(Vector v)
Vectori. Matrici
40
{
int n=v.size();// dimensiunea obiectului Vector:
for(int i=0;i<n;i++){ Double obiectCrt=(Double)v.get(i);
//fara operatorul cast (Double): eroare, caci metoda get()
//returneaza un obiect de tipul Object
System.out.printl n(obiectCrt.doubleValue());
//dintr-un obiect Double se extr age valoarea lui numerica de tipul
//double, cu metoda doubleValue()
}//for } }
10. Să se scrie o aplica ție Java în care se implementez ă algoritmul de
sortare rapid ă (quicksort) a unui vector de numere întregi. Vectorul va
fi inițializat cu N numere aleatoare.
import java.util.*;
class QuickSort { public static void main(String args[]) { final int GAMA=100; Random r=new Random(); final int N=10; int a[]=new int[N]; int i; for(i=0;i<N;i++) a[i]=r.nextInt(GAMA); System.out.println("Vector nesortat:"); for(i=0;i<N;i++) System.out.println(a[i]); qsort(a,0,N-1); System.out.println("Vector sortat:"); for(i=0;i<N;i++) System.out.println(a[i]); } private static void qsort(int a[],int st, int dr) { if(st<dr){
Vectori. Matrici
41
int p=getPivot(a,st,dr);
qsort(a,st,p-1);
qsort(a,p+1,dr); } //cand st=dr se iese din metoda } private static int getPivot(int a[],int st, int dr) { int i,j,di,dj; int aux; //Se parcurge vectorul din ambele capete: i=st; di=0;//pasul de avansare din capul stanga j=dr; dj=1;//pasul de avansare din capul dreapta while(i<j){ if(a[i]>a[j]){ //daca nu sunt in ordine aux=a[i]; a[i]=a[j]; a[j]=aux; //comutare elemente
//comutam si pasii: aux=di; di=dj; dj=aux; }//if i=i+di; j=j-dj; }//end while return i; } }//end class
11. Să se scrie o aplica ție Java în care se implementez ă algoritmul de
sortare bubblesort a unui vector de numere întregi.
class Sortare
{ public static void main(String args[]) { int a[]={1,7,6,5,10,4,3,2,9,8}; int i; bubbleSort(a); //afisare: for(i=0;i<a.length;i++)
Vectori. Matrici
42
System.out.println(a[i]);
}
private static void bubbleSort(int a[]) { int dim=a.length; int i; boolean suntInv; for(;;){ suntInv=false; for(i=0;i<dim-1;i++) if(a[i]>a[i+1]){ int aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; suntInv=true; } if(suntInv==false)break; } } }
12. Se citesc dou ă mulțimi de numere întregi, (în fiecare mul țime,
numerele sunt diferite ), în doi vectori A și B. Să se calculeze
reuniunea celor dou ă mulțimi.
class Reuniune
{ public static void main(String args[]){ int A[]={1,10,2}; int B[]={5, 6, 7, 2, 10}; int nA=A.length;//nr. de elemente din A int nB=B.length; int i; int C[]=new int[nA+nB];//vectorul reuniune //Copiem pe A in C: for(i=0;i<nA;i++) C[i]=A[i]; //Adaugam in C[] toate elementele din B[], care // nu sunt si in A[]: int iC=nA;//index in multimea C for(i=0;i<nB;i++)
Vectori. Matrici
43
if(estePrezent(B[i],A)==false){
C[iC]=B[i];
iC++; } int nC=iC;//numarul de elemente din C[] //Afisare A[]: for(i=0;i<nA;i++) System.out.print(A[i]+" "); System.out.println(); //Afisarea multimii B: for(i=0;i<nB;i++) System.out.print(B[i]+" "); System.out.println(); //Afisarea multimii C: for(i=0;i<nC;i++) System.out.print(C[i]+" "); } private static boolean estePrezent(int x,int a[])
{ for(int i=0;i<a.length;i++) if(a[i]==x)return true; return false; } }
13. Se citește un num ăr natural N. Se cite ște un vector a de N numere
întregi. Se cite ște un num ăr natural S. S ă se afișeze toate posibilit ățile
de a scrie pe S ca sum ă de numere luate din vect orul a (pot fi luate 1,
2, …N numere din vector).
import javax.swing.*;
class ToatePosibilitatile { private static int N; private static int S; private static int X[]=new int[100];//X[k] este din multimea {0,1} //X[i]=1 daca se ia in grupa pe a[i]. Daca nu se ia: X[i]=0 .
//Vectorul X are N elemente (am dat o dimensiune acoperitoare) private static int a[]=new int[100]; public static void main(String args[]) {
Vectori. Matrici
44
S=Integer.parseInt(JOp tionPane.showInputDialog("S="));
N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
int i; for(i=0;i<N;i++) a[i]=Integer.parseInt(JO ptionPane.showInputDialog("nr.="));
int nrElemente; for(nrElemente=1;nrElemente<=N;nrElemente++) back(0,nrElemente);//generam toate grupele de nrElemente luate
//din multimea a[] (combinari) } private static void ba ck(int k,int nrElemente)
{ //construieste pe X[k]: int i; if(k==N)afisare(); else for(i=0;i<=1;i++){ X[k]=i; if(valid(k,nrElemente)==true) back(k+1,nrElemente); } } private static boolean va lid(int k, int nrElemente)
{ //Calculeaza cate elemente au fost luate si suma elementelor
// a[i] corespunzatoare: int contor=0; int suma=0; int i; for(i=0;i<=k;i++) if(X[i]==1){ contor++; suma=suma+a[i];} if(contor>nrElemente)return false; if(suma>S)return false; if(k==N-1){//s-a completat vectorul X[] if(suma!=S)return false; if(contor!=nrElemente)return false;} return true; } private static void afisare()
Vectori. Matrici
45
{
for(int i=0;i<N;i++)
if(X[i]==1)System.out.print(a[i]+" "); System.out.println(); } }//end class
14. Să se construiasc ă clasa Punct ce are ca variabile de instan ță două
numere întregi x și y – coordonatele unui punct în plan, și ca metode:
‐ Constructorul ce face ini țializările;
‐ Metoda getX() ce returneaz ă valoarea coordonatei x
‐ Metoda getY() ce returneaz ă valoarea coordonatei y
‐ Metoda distan ța() ce are ca parametru un Punct p și care
returnează distanța dintre punctul curent (ref erit prin cuvântul cheie
this) și punctual p.
‐ Metoda suntEgale() ce are ca parametru un Punct p și care
returnează true dacă punctul curent este egal cu p, și false în caz
contrar.
Folosind clasa Punct, citim de la tastatur ă N obiecte Punct (N
cunoscut), și le memor ăm într-un vector. S ă se afișeze:
a. Sunt toate punctele diferite între ele?
b. Câte puncte sunt situate pe prima bisectoare (x=y)?
c. Care este cea mai mare distan ță dintre dou ă puncte din vector?
import javax.swing.*;
class Punct { private int x;//coordonata x a punctului private int y; public Punct(int x0, int y0)
{
x=x0;
y=y0; } public int getX() { return x; } public int getY() { return y;
Vectori. Matrici
46
}
public double distanta(Punct p)
{ return Math.sqrt((x-p.x )*(x-p.x)+(y- p.y)*(y-p.y));
} public boolean suntEgale(Punct p) { if((x==p.x)&&(y==p.y))return true; else return false; } } class VectorDePuncte { public static void main (String args[]) { int N;//numarul de puncte N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
Punct p[]=new Punct[N];//vectorul de obiecte Punct (clasa de baza)
int i; for(i=0;i<N;i++){ int x=Integer.parseInt( JOptionPane.showInputDialog("x="));
int y=Integer.parseInt( JOptionPane.showInputDialog("y="));
p[i]=new Punct(x,y); }//for //Sunt toate punctele diferite? System.out.println("Sunt t oate diferite="+suntDiferite(p));
//Numarul de puncte de pe prima bisectoare:
System.out.println("Nr. puncte pe prima
bisectoare="+catePeBisectoare(p));
//Distanta maxima intre doua puncte: System.out.println("Dist anta maxima="+distMaxima(p));
} private static boolean suntDiferite(Punct p[])
{ for(int i=0;i<p.length-1;i++) for(int j=i+1;j<p.length;j++) if(p[i].suntEgal e(p[j])==true)return false;
return true; }
Vectori. Matrici
47
private static int catePeBisectoare(Punct p[])
{
int contor=0; for(int i=0;i<p.length;i++) if(p[i].getX()==p[i].getY())contor++; return contor; } private static double distMaxima(Punct p[]) { double maxim=0;//initializare distanta maxima //Formam toate perechile de puncte: for(int i=0;i<p.length-1;i++) for(int j=i+1;j<p.length;j++){ double d=p[i].distanta( p[j]);//distanta intr e punctele i si j
if(d>maxim)maxim=d;} return maxim; } }
15. Să se construiasc ă clasa Complex ce are ca variabile de instan țe
private, numerele întregi re și im ce reprezint ă partea real ă și partea
imaginară a unui num ăr complex. Ca metode:
‐ constructorul, ce face ini țializările;
‐ metoda modul(), ce returneaz ă modulul num ărului complex;
‐ metoda suntEgale(), ce are ca parametru un num ăr complex c,
și care returneaz ă true dacă numărul complex curent (cel pentru care
se apeleaz ă această metodă) este egal cu num ărul complex c;
‐ metoda suma(), ce ar e ca parametru un num ăr complex c și în
care se adun ă la num ărul complex curent, num ărul complex c
(rezultatul se depune tot în num ărul complex curent);
‐ metoda afisare(), în care se afi șează numărul complex.
Folosind clasa Complex, citim de la tastatur ă, într-un vector, N
numere complexe (N – cunoscut).
a.
să se afișeze care este num ărul ce are cel mai mare modul;
b. să se afișeze suma celor N numere complexe;
c. să se afișeze dacă cele N numere complexe sunt toate diferite
între ele.
import javax.swing.*;
class Complex
Vectori. Matrici
48
{
private int re;//partea reala a numarului complex
private int im; public Complex(int x, int y) { re=x; im=y; } public int getRe() { return re; } public int getIm() { return im; } public double modul() { return Math.sqrt(re*re+im*im); } public boolean suntEgale(Complex c) { if((re==c.re)&&(im==c.im))return true; else return false; } public void suma(Complex c) { re=re+c.re; im=im+c.im; } } class VectorDeComplexe { public static void main (String args[]) { int N;//numarul de numere complexe N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
Complex c[]=new Complex[N];//vectorul de obiecte Complex
Vectori. Matrici
49
int i;
for(i=0;i<N;i++){
int x=Integer.parseInt( JOptionPane.showInputDialog("x="));
int y=Integer.parseInt( JOptionPane.showInputDialog("y="));
c[i]=new Complex(x,y); }//for //Numarul ce are cel mai mare modul: int index=calculIndexNrMaxModul(c); System.out.println("Numar ul ce are modulul maxim : ");
System.out.println("r e="+c[index].getRe()+" im="
+c[index].getIm());
//Suma celor N numere complexe: Complex suma=calculSuma(c); System.out.println("suma este: re="+suma.getRe()+" im="
+suma.getIm());
//Sunt toate numerele complexe diferite? System.out.println("Sunt t oate diferite="+suntDiferite(c));
} private static int calcul IndexNrMaxModul(Complex c[])
{ int indexMax=0; double modulMax=c[0].modul(); for(int i=1;i<c.length;i++){ double modulCrt=c[i].modul(); if(modulCrt>modulMax){ indexMax=i; modulMax=modulCrt;} } return indexMax; } private static Complex calculSuma(Complex c[]) { Complex rezultat=new Complex(0,0); for(int i=0;i<c.length;i++) rezultat.suma(c[i]); return rezultat; } private static boolean suntDiferite(Complex c[])
{ for(int i=0;i<c.length-1;i++)
Vectori. Matrici
50
for(int j=i+1;j<c.length;j++)
if(c[i].suntEgal e(c[j])==true)return false;
return true; } }
16. Se citește de la tastatur ă o matrice de numere întregi, de
dimensiuni cunoscute (num ărul de linii și numărul de coloane citite
anterior). S ă se calculeze și afișeze dacă matricea are toate numerele
egale între ele.
import javax.swing.*;
class MatriceSuntEgale { public static void main(String args[]) { int nL;//numar linii matrice nL=Integer.parseInt(JOptionP ane.showInputDialog("nr. linii="));
int nC;//numar coloane matrice nC=Integer.parseInt( JOptionPane.showInputDialog("nr. coloane=")); int a[][]=new int[nL][nC]; //citire matrice: int i,j; for(i=0;i<nL;i++) for(j=0;j<nC;j++) a[i][j]=Integer.parseInt (JOptionPane.showInputDialog("nr="));
boolean egale=suntToateEgale(a); if(egale==true)System.out.prin tln("Sunt toate numerele egale.");
else System.out.println ("Nu sunt toate egale");
} private static boolean s untToateEgale(int a[][])
{ for(int i=0;i<a.length;i++) for(int j=0;j<a[0].length;j++) if(a[i][j]!=a[0][0])return false; return true; } }
Vectori. Matrici
51
17. Se dă o matrice de numere întregi. S ă se calculeze și afișeze dacă
în acestă matrice exist ă cel puțin două linii egale între ele.
class MatriceLiniiEgale
{ public static void main(String args[]) { int a[][]={{1,2,3,4,5}, {0,1,0,0,0}, {1,2,3,4,5}, {1,1,1,1,1}}; //Comparam liniile matricii, doua cate doua: int nL=a.length;//numarul de linii int nC=a[0].length;//numarul de coloane int i,j; for(i=0;i<nL-1;i++) for(j=i+1;j<nL;j++) //compara linia i cu linia j: if(suntEgale(a[i],a[j])){ System.out.println("Are linii egale intre ele"); return; } System.out.println("Nu are linii egale intre ele") ; } private static boolean suntEgal e(int linie1[], int linie2[])
{ //Se compara doi vectori pentru egalitatea lor: for(int i=0;i<linie1.length;i++) if(linie1[i]!=linie2[i])return false; return true; } }
18. Se dă o matrice de numere întregi.. S ă se calculeze și afișeze dacă
în acestă matrice exist ă cel puțin o linie care s ă aibă toate elementele
egale între ele.
class MatriceLinieConstanta
{ public static void main(String args[]) { int a[][]={{1,2,3,4,5},
Vectori. Matrici
52
{0,0,0,0,0},
{1,2,3,4,5},
{1,1,1,0,1}}; //Parcurgem toate liniile matricii: int nL=a.length;//numarul de linii for(int i=0;i<nL;i++) //are linia curenta i, toate elementele egale?
if(areToateEgale(a[i])){ System.out.println("Are."); return; } System.out.println("Nu are."); } private static boolean areToateEgale(int linie[]) { //Se compara toate elemente le vectorului, cu primul:
for(int i=1;i<linie.length;i++) if(linie[i]!=linie[0])return false; return true; } }
19. Se citește un num ăr natural N. Se ini țializează o matrice p ătrată de
dimensiune N, cu numere aleatoare în gama 1…100. S ă se calculeze
câte numere prime sunt în matrice.
import java.util.*;
import javax.swing.*; class CatePrimeInMatrice { public static void main(String args[]) { final int GAMA=100; int N=Integer.parseInt( JOptionPane.showInputDialog("N="));
int a[][]=new int[N][N]; Random r=new Random(); //Initializam matricea: int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=1+r.nextInt(GAMA); //Afisarea matricii:
Vectori. Matrici
53
for(i=0;i<N;i++){
for(j=0;j<N;j++)
System.out.print(a[i][j]+" "); System.out.println(); } int totalNrPrime=cateNrPrime(a); System.out.println("numarul de nr. prime = "+totalNrPrime); } private static int cateNrPrime(int a[][]) { int contor=0; for(int i=0;i<a.length;i++) for(int j=0;j<a[0].length;j++) if(estePrim(a[i][j]))contor++; return contor; } private static boolean estePrim(int nr) { for(int i=2;i<=Math.sqrt(nr);i++) if(nr%i==0)return false; return true; } }
20. Se citește un num ăr natural N. Se ini țializează o matrice p ătrată de
dimensiune N, cu numere aleatoare în gama 1…100. S ă se afișeze dacă
toate numerele din matrice sunt diferite între ele sau nu.
import java.util.*;
import javax.swing.*; class MatriceSuntDiferite { public static void main(String args[]) { final int GAMA=100; int N=Integer.parseInt( JOptionPane.showInputDialog("N="));
int a[][]=new int[N][N]; Random r=new Random(); //Initializam matricea: int i,j; for(i=0;i<N;i++) for(j=0;j<N;j++)
Vectori. Matrici
54
a[i][j]=1+r.nextInt(GAMA);
//Afisarea matricii:
for(i=0;i<N;i++){ for(j=0;j<N;j++) System.out.print(a[i][j]+" "); System.out.println(); } boolean sunt=suntDiferiteInMatrice(a); System.out.println( "sunt diferite = "+sunt);
} private static boolean suntD iferiteInMatri ce(int a[][])
{ int nL=a.length;//numar linii int nC=a[0].length;//numar coloane (in aceasta problema nC=nL)
int i,j,lin,col; //Are prima linie toate elem. diferite?
if(suntDiferiteInVect or(a[0])==false)return false;
//Prima linie are toate elementele diferite. //Parcurg restul liniilor: for(i=1;i<nL;i++){ //are linia i toate elementele diferite intre ele? if(suntDiferiteInVector(a[i])==false)return false; //Elem. liniei i mai apar in liniile 0,1,i-1? for(j=0;j<nC;j++) //Parcurg liniile 0,1,..,i-1: for(lin=0;lin<i;lin++) for(col=0;col<nC;col++) if(a[i][j]==a[lin][col])return false; } return true; } private static boolean sunt DiferiteInVector(int v[])
{ for(int i=0;i<v.length-1;i++) for(int j=i+1;j<v.length;j++) if(v[i]==v[j])return false; return true; } }
Vectori. Matrici
55
21. Se citește de la tastatur ă o matrice de numere întregi, de
dimensiuni cunoscute (num ărul de linii și numărul de coloane citite
anterior). Se citesc în variabilel l1 și l2, numerele a dou ă linii din
matrice. S ă se comute în matrice aceste linii.
import javax.swing.*;
class ComutaDouaColoane { public static void main(String args[]) { int nL;//numar linii matrice nL=Integer.parseInt(JOptionP ane.showInputDialog("nr. linii="));
int nC;//numar coloane matrice nC=Integer.parseInt(JOptionPan e.showInputDialog("nr. col.="));
int a[][]=new int[nL][nC]; //citire matrice: int i,j; for(i=0;i<nL;i++) for(j=0;j<nC;j++) a[i][j]=Integer.parseInt (JOptionPane.showInputDialog("nr="));
//Citeste numerele celor doua linii: int l1; l1=Integer.parseInt(JOpti onPane.showInputDialog("l1="));
int l2; l2=Integer.parseInt(JOpti onPane.showInputDialog("l2="));
comutare(a,l1,l2); //Afisare matrice dupa comutare: System.out.println(); for(i=0;i<nL;i++) { for(j=0;j<nC;j++) System.out.print(a[i][j]+" "); System.out.println(); } } public static void comutare(int a[][],int l1,int l2) { int aux; int i; for (i=0;i<a[0].length;i++) {
Vectori. Matrici
56
aux=a[l1][i];
a[l1][i]=a[l2][i];
a[l2][i]=aux; } } }
22. Se citește un num ăr natural N, impar. S ă se construiasc ă o matrice
pătrat magic de ordinul N, dup ă următorul algoritm:
-Punem primul num ăr (1) în matrice, la mijlocul ultimei linii. (deci
poziția inițială este: linia=N-1, coloana=N/2)
-Punem în ordine numerele 2,3,…,N*N în matrice, calculând astfel
poziția următoare, în care vom scrie num ărul la care am ajuns:
Poziția următoare: dreapta jos cu o linie, fa ță de poziția curentă.
Dacă această nouă poziție a trecut de ultima line, trecem pe prima
linie (linia 0). Dac ă a trecut de ultima coloan ă, trecem pe coloana 0,
Daca aceast ă nouă poziție calculat ă este deja ocupat ă, ne deplas ăm în
celula de deasupra celei în care s-a introdus num ărul anterior (aceasta
sigur nu este ocupat ă)
import javax.swing.*;
class ConstruiestePatratMagic { public static void main(String args[]) { int N; for(;;){ N=Integer.parseInt(JOptionPane.showInputDialog ("N (impar)= ")); if(N%2==1)break; } int a[][]=new int[N][N]; int i,j,linCrt,colCrt; //Umplem matricea cu 0: (nici un numar din gama 1..N*N nu a fost
//introdus)
for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=0; //Punem primul numar (1) in matr ice, la mijlocul ultimei linii:
linCrt=N-1; colCrt=N/2;
Vectori. Matrici
57
a[linCrt][colCrt]=1;
//Punem in ordine numerele 2,3,…,N*N in matrice, calculand
//conform algoritmului pozitiile pe care le punem in matrice:
for(int nr=2; nr<=N*N;nr++) { //Pozitia curenta este coltul dreapta jos?
if((linCrt==N-1)&&(colC rt==N-1))linCrt=N-2;//trecem pe
//penultima linie
else{ //Calculam pozitia pe care scriem pe nr: //Salvam linia si col oana curenta (pentru cazul in care pozitia
// ce o vom calcula, este deja ocupata): int linAnt=linCrt; int colAnt=colCrt; //Pozitia urmatoare: dreapta jos cu o linie, fata de pozitia
//curenta:
linCrt=linCrt+1; colCrt=colCrt+1; //Noua pozitie a depasit granitele matricii?
if (linCrt==N)linCrt=0;//prima linie if (colCrt==N)colCrt=0;//prima coloana //Pozitia calculata este ocupata? if(a[linCrt][colCrt]!=0){ //Este ocupata. Ne deplasam in celula de deasupra celei // in care s-a introdus numarul anterior: // (aceasta sigur nu este ocupata) linCrt=linAnt-1; colCrt=colAnt;} }//else a[linCrt][colCrt]=nr; }//for //Afisarea matricii patrat magic: for(i=0;i<N;i++){ for(j=0;j<N;j++) System.out.print(a[i][j]+" "); System.out.println(); } } }
Șiruri de caractere
58
Cap. 4
Șiruri de caractere
1. Se citește un șir. Să se afișeze dacă primul caracter este egal cu
ultimul caracter.
import javax.swing.*;
class PrimUltimEgale { public static void main(String args[]) { String s=JOptionPane.s howInputDialog("sir = ");
if(s.charAt(0)==s.charAt(s.length()-1)) System.out.println("Primul caracter este egal cu ultimul caracter"); else System.out.println ("Primul caracter este diferit de ultimul caracter"); } }
2. Se citesc de la tastatur ă sub form ă de șiruri de caractere doi
timpi, în formatul hh:mm:ss (ore: minute: secunde). S ă se afișeze care
timp este mai mare.
Exemplu: T1= 5:35:42 T2= 5:18:50 Se va afișa: T2 > T1
import javax.swing.*;
import java.util.*; class ComparaTimpi { public static void main(String args[]) { String timp1=JOptionPane.showInputDialog ("timp1 (hh:mm:ss) = "); String timp2=JOptionPane.showInputDialog ("timp2 (hh:mm:ss) = "); //Extragem din fiecare timp, orele, minutele si secundele.
// Folosim clasa StringTokenizer pentru a extrage acesti atomi. StringTokenizer tk=new StringTokenizer(timp1,":");
Șiruri de caractere
59
int ore1=Integer.parseInt(tk.nextToken());
int min1=Integer.parseInt(tk.nextToken());
int sec1=Integer.parseInt(tk.nextToken()); //Calculam primul timp, in secunde: int T1=3600*ore1+60*min1+sec1; //Similar, pentru timp2 : tk=new StringTokenizer(timp2,":"); int ore2=Integer.parseInt(tk.nextToken()); int min2=Integer.parseInt(tk.nextToken()); int sec2=Integer.parseInt(tk.nextToken()); int T2=3600*ore2+60*min2+sec2; if(T1>T2)System.out.println("timp1 > timp2"); else if(T1==T2)System.out.println("timp1 = timp2"); else System.out.println("timp1 < timp2"); } }
3. Se citește un șir s1 de la tastatur ă, să se construiasc ă un alt șir
s2: inversul șirului s1.
import javax.swing.*;
class InvString { public static void main(String args[]) { String s1=JOptionPane.showInputDialog("sir="); String s2=""; int i; int L1=s1.length();//lungimea primului sir for(i=L1-1;i>=0;i–) s2=s2+s1.charAt(i); System.out.println("Inversul sirului "+s1+" este "+s2);
} }
4. Se citesc dou ă șiruri s1 și s2. Să se afișeze care șir conține mai
multe vocale.
import javax.swing.*;
class ComparaDupaVocale { public static void main(String args[])
Șiruri de caractere
60
{
String s1=JOptionPane.showInputDialog("sir1 = ");
String s2=JOptionPane.showInputDialog("sir2 = "); int nv1=numarVocale(s1); int nv2=numarVocale(s2); if(nv1>nv2)System.out.println("Sir 1 are mai multe vocale ca sir 2");
else if(nv1==nv2)System.out.prin tln("numar egal de vocale");
else System.out.println("Sir 2 are mai multe vocale ca sir 1");; } private static int numarVocale(String s) { int contor=0; for(int i=0;i<s.length();i++) if(esteVocala(s.charAt(i))==true)contor++; return contor; } private static boolean esteVocala(char ch) { if((ch=='a')||(ch=='A')|| (ch=='e')||(ch=='E')|| (ch=='i')||(ch=='I')|| (ch=='o')||(ch=='O')|| (ch=='u')||(ch=='U'))return true; else return false; } }
5. Se citește un șir. Să se afișeze dacă are toate caracterele egale
între ele. Se va folosi o metod ă separată: areToateCarEgale().
import javax.swing.*;
class ToateCarEgale { public static void main(String args[]) { String s=JOptionPane.s howInputDialog("sir = ");
if(areToateCarEgale(s)==true) System.out.println("Are t oate caracterele egale");
else System.out.println("Nu are toate caracterele egale"); } private static boolean ar eToateCarEgale(String s)
Șiruri de caractere
61
{
//Le comparam pe toate, cu primul caracter:
for(int i=1;i<s.length();i++) if(s.charAt(i)!=s.charAt(0))return false; return true; } }
6. Se citește un șir. Să se afișeze dacă are toate caracterele
diferite între ele. Se va folosi o metod ă separată: suntToateDiferite().
import javax.swing.*;
class ToateCarDiferite { public static void main(String args[]) { String s=JOptionPane.s howInputDialog("sir = ");
if(suntToateDiferite(s)==true) System.out.println("Are t oate caracterele diferite");
else System.out.println("Nu ar e toate caracterele diferite");
} private static boolean su ntToateDiferite(String s)
{ //Comparam caracterul curent, cu toate caracterele de dupa el: for(int i=0;i<s.length()-1;i++) for(int j=i+1;j<s.length();j++) if(s.charAt(i)==s.charAt(j))return false; return true; } }
7. Se citește un șir. Să se afișeze dacă șirul conține numai vocale.
Se va folosi o metod ă separată: suntNumaiVocale().
import javax.swing.*;
class SuntNumaiVocale { public static void main(String args[]) { String s=JOptionPane.s howInputDialog("sir = ");
System.out.println("are numai vo cale = "+suntNumaiVocale(s));
}
Șiruri de caractere
62
private static boolean suntNumaiVocale(String s)
{
for(int i=0;i<s.length();i++) if(esteVocala(s.char At(i))==false)return false;
return true; } private static boolean esteVocala(char ch) { if((ch=='a')||(ch=='A')|| (ch=='e')||(ch=='E')|| (ch=='i')||(ch=='I')|| (ch=='o')||(ch=='O')|| (ch=='u')||(ch=='U'))return true; else return false; } }
8. Se citește un șir s1 de la tastatur ă. Să se construiasc ă un alt șir
s2, obținut prin criptarea șirului inițial după algoritmul lui Cezar. (La
început se convertesc to ate literele mari din șirul s1, în litere mici.
Apoi fiecare liter ă mică din s1 se cripteaz ă în șirul s2 astfel: a se
înlocuiește cu d, b cu e,…, x cu a, y cu b și z cu c; se observ ă că
distanța dintre liter ă și litera criptat ă este 3).
import javax.swing.*;
class CriptareString { public static void main(String args[]) { String s=JOptionPane.s howInputDialog("sir = ");
s=s.toLowerCase(); String sCriptat=""; for(int i=0;i<s.length();i++) if(esteLitera(s.charAt(i)))
sCriptat=sCriptat+literaCriptata(s.charAt(i));
else sCriptat=sCriptat+s.charAt(i); System.out.println("sir criptat = "+sCriptat);
} private static boolean esteLitera(char ch) { int cod=(int)ch; if((cod>=(int)'a')&&(cod<=(int)'z'))return true;
Șiruri de caractere
63
else return false;
}
private static char literaCriptata(char ch) { if(ch=='x')return 'a'; if(ch=='y')return 'b'; if(ch=='z')return 'c'; //Pentru restul literelor: int cod=(int)ch; int noulCod=cod+3; return (char)noulCod; } }
9. Se citește un num ăr natural N. Se citesc de la tastatur ă N
cuvinte, într-un vector de șiruri. Să se afișeze dacă toate cuvintele sunt
diferite între ele sau nu.
import javax.swing.*;
class VectorCuvinteDiferite { public static void main(String args[]) { int N=Integer.parseInt(JOpti onPane.showInputDialog("N = "));
String s[]=new String[N]; int i,j; for(i=0;i<N;i++) s[i]=JOptionPane.sho wInputDialog("cuvant = ");
//Sunt diferite? for(i=0;i<N-1;i++) for(j=i+1;j<N;j++) if(s[i].compareTo(s[j])==0){ System.out.println("Nu sunt toate diferite . "); return; } System.out.println("Sunt toate diferite "); } }
Șiruri de caractere
64
10. Se citește un num ăr natural N. Se citesc de la tastatur ă N
cuvinte, într-un vector de șiruri. Să se afișeze cuvântul de lungime
maximă.
import javax.swing.*;
class VectorCuvinteMaxim { public static void main(String args[]) { int N=Integer.parseInt(JOpti onPane.showInputDialog("N = "));
String s[]=new String[N]; int i,j; for(i=0;i<N;i++) s[i]=JOptionPane.showInputDialog("cuvant = "); //Initializare: int lungMax=s[0].length();//lungimea maxima int indexMax=0; //Parcurgem restul vectorului: for(i=1;i<N;i++) if(s[i].length()>lungMax){ lungMax=s[i].length(); indexMax=i; } System.out.println("Cuvantul de lungime maxima este: "
+s[indexMax]);
} }
11. Se citește un num ăr natural N. Se citesc de la tastatur ă N
cuvinte, într-un vector de șiruri. Să se sorteze în ordine alfabetic ă.
import javax.swing.*;
class VectorCuvinteSortare
{ public static void main(String args[]) { int N=Integer.parseInt(JOpti onPane.showInputDialog("N = "));
String s[]=new String[N]; int i,j; for(i=0;i<N;i++) s[i]=JOptionPane.sho wInputDialog("cuvant = ");
//Sortarea prin interschimbare:
Șiruri de caractere
65
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(s[i].compareTo(s[j])>0){ //comut pe s[i] cu s[j]: String aux=s[i]; s[i]=s[j]; s[j]=aux; } //Afisare vector sortat: for(i=0;i<N;i++) System.out.println(s[i]); } }
Clase derivate. Clase abstracte. Polimorfism
66
Cap. 5
Clase derivate. Clase abstracte. Polimorfism
1. Să se construiasc ă clasa ContBancar, folosit ă pentru a modela
un cont bancar, ce are ca variabil ă de instan ță privată, variabila suma ,
(suma de bani din cont). Ca metode:
‐ constructorul;
‐ adauga(), ce are ca parametru un num ăr real x, valoarea ce se
adaugă în cont;
‐ extrage(), ce are ca parametru un num ăr real x, valoarea ce se
extrage din cont, și care scoate ca rezultat true, dacă se poate face
extragerea (suma >= x), și false în caz contrar;
‐ getSuma(), ce returneaz ă valoarea variabilei private suma;
‐ afisare(), ce afi șează valoarea sumei de bani din cont.
Pe baza clasei ContBancar se va dezvolta prin derivare (mo ștenire)
clasa ContBancarExtins, în care se va ad ăuga o nou ă variabilă de
instanță: rata dobânzii anuale și o nou ă metod ă:
adaugaDobandaLunara(), ce adaug ă în cont dobânda calculat ă după
trecerea unei luni. În clasa Cont BancarExtins se va redefini și metoda
afisare(), astfel încât s ă se afișeze și rata dobânzii. De asemenea, în
această nouă clasă se va defini constructo rul, prin care se ini țializează
suma de bani din cont și rata dobânzii.
Să se scrie și o clasă de test pentru clasa ContBancarExtins.
class ContBancar
{ private double suma; public ContBancar(double S) {
suma=S;
} public void adauga(double S) { suma=suma+S; } public boolean extrage(double S) { if(S>suma)return false; suma=suma-S; return true;
Clase derivate. Clase abstracte. Polimorfism
67
}
public double getSuma()
{ return suma; } public void afisare() { System.out.println("suma="+suma); } } class ContBancarExtins extends ContBancar { private double rd ;//rata dobanzii anuale
public ContBancarExtins(double S,double rata) { super(S); rd=rata; } public void adaugaDobandaLunara() { double S=this.getSuma(); double dobanda=S*rd/12; this.adauga(dobanda); } public void afisare() { System.out.println("suma="+this.getSuma()); System.out.println("rata dobanzii="+rd); } } class TestCont { public static void main(String args[]) { ContBancarExtins c=new ContBancarExtins(1000,0.12); c.adauga(1000); c.adaugaDobandaLunara(); c.afisare();
Clase derivate. Clase abstracte. Polimorfism
68
}
}
2. Să se construiasc ă clasa Punct3D, folosit ă pentru a modela un
punct în spa țiu, ce are ca variabile de instan ță x, y, z, coordonatele
unui punct în spa țiu. Ca metode:
‐ constructorul;
‐ muta(), ce are trei parametrii dx, dy și dz, pe baza c ărora noile
coordonate ale punctului de vin: x+dx, y+dy, z+dz;
‐ compara(), ce are ca parametru un punct p, și care returneaz ă
true, dacă punctul curent (cel referit prin this ) este egal cu punctul p,
și false în caz contrar;
‐ distanta(), ce are ca parametru un punct p, și care returneaz ă
distanța între punctul curent și punctul p;
‐ getX() ce returneaz ă valoarea coordonatei x;
‐ getY() ce returneaz ă valoarea coordonatei y;
‐ getZ() ce returneaz ă valoarea coordonatei z;
‐ afisare() ce afi șează coordonatele punctului.
Pe baza clasei Punct3D, se va dezvolta clasa Punct3DColor, în care se va adăuga o nou ă variabilă de instan ță de tipul String: culoarea
punctului și o nouă metodă getCuloare() ce returneaz ă culoarea
punctului. Se vor redefini metodele compara() și afișare() și noul
constructor. Să se scrie și o clasă de test pentru clasa Punct3DColor.
class Punct3D
{ private int x;//coordonata x a punctului private int y; private int z; public Punct3D(int x,int y, int z ) { this.x=x; this.y=y; this.z=z; } public int getX()
{
return x; } public int getY()
Clase derivate. Clase abstracte. Polimorfism
69
{
return y;
} public int getZ() { return z; } public void afisare() { System.out.println("x="+x); System.out.println("y="+y); System.out.println("z="+z); } public void muta(int dx, int dy, int dz) { x=x+dx; y=y+dy; z=z+dz; } public boolean compara(Punct3D p) { if((x==p.x)&&(y==p.y)&&(z==p.z)) return true; else return false; } public double distanta(Punct3D p) { double dx=this.x-p.x; double dy=this.y-p.y; double dz=this.z-p.z; double dist=Math.sqrt(dx*dx+dy*dy+dz*dz); return dist; } } class Punct3DColor extends Punct3D { private String culoare; public Punct3DColor(int x, in t y, int z, String culoare)
{ super(x,y,z);
Clase derivate. Clase abstracte. Polimorfism
70
this.culoare=culoare;
}
public String getCuloare() { return culoare; } public void afisare() { System.out.println("x="+getX()); System.out.println("y="+getY()); System.out.println("z="+getZ()); System.out.println(" culoare="+culoare);
} public boolean compara(Punct3DColor p) { if((this.getX()==p.getX())&& (this.getY()==p.getY())&& (this.getZ()==p.getZ())&& (this.culoare==p.culoare)) return true; else return false; } } class TestPuncte { public static void main (String args[]) { Punct3DColor p=new Punct3DColor(0,1,2,"negru"); p.muta(1,1,1); p.afisare(); } }
3. Să se dezvolte clasa abstract ă A în care sunt definite dou ă
metode:
‐ metoda abstract ă calcul();
‐ metoda durataCalcul() ce returneaz ă durata exprimat ă în
milisecunde, a execu ției metodei calcul();
Clase derivate. Clase abstracte. Polimorfism
71
Din clasa abstract ă A, se va deriva clasa B ce con ține implementarea
metodei calcul(). Se va dezvolta și o clasă de test, pentru clasa
derivată B.
import javax.swing.*;
import java.util.*; abstract class A { abstract public void calcul(int N); public long durataCalcul(int N){ long t1=System.currentTimeMillis(); calcul(N); long t2=System.currentTimeMillis(); return (t2-t1); } } class B extends A { public void calcul(int N) { //Calculeaza N*N*N produse int i,j,k; long rezultat; for(i=1;i<=N;i++) for(j=1;j<=N;j++) for(k=1;k<=N;k++) rezultat=i*j*k; } } class Test { public static void main(String args[]) { final int N=1000; B b=new B(); System.out.println("durata calcul = "+b.durataCalcul(N)+" ms."); } }
Clase derivate. Clase abstracte. Polimorfism
72
4. Să se construiasc ă clasa Punct ce are ca variabile de instan ță
două numere întregi x și y – coordonatele unui punct în plan, și ca
metode:
‐ Constructorul ce face ini țializările;
‐ getX() ce returneaz ă valoarea coordonatei x
‐ getY() ce returneaz ă valoarea coordonatei y
‐ afisare() în care se afi șează coordonatele punctului din clasa
Punct
Din clasa Punct se deriveaz ă două clase: PunctColor și Punct3D.
Clasa PunctColor fa ță de clasa Punct are în plus o variabil ă de instan ță
în care este memorat ă culoarea punctului, un nou constructor în care
este inițializată și culoarea, metoda getCuloare() ce returneaz ă
culoarea, și redefine ște metoda clasei de baz ă, afișare(), afișând pe
lângă coordonatele x și y și culoarea.
Clasa Punct3D, ce reprezint ă un punct în spa țiu, față de clasa Punct
are în plus o variabil ă de instan ță z, un nou constructor în care sunt
inițializate toate cele trei coordona te, metoda getZ() ce returneaz ă
valoarea coordonatei z, și redefine ște metoda clasei de baz ă, afișare(),
afișând pe lâng ă coordonatele x și y și coordonata z.
Folosind aceste trei clase se va dezvolta o aplica ție în care se vor citi
de la tastatur ă N puncte (N- citit anterior), de tipul PunctColor sau
Punct3D. Pentru fiecare punct, în momentul citirii utilizatorul
aplicației va specifica dac ă va introduce un PunctColor sau un
Punct3D. Cele N puncte se vor memo ra într-un vector de obiecte de
tipul Punct (clasa de baz ă). În final se vor afi șa pentru fiecare punct
din cele N informa țiile memorate (pentru fi ecare punct se va apela
metoda afi șare()). Aceast ă aplicație ilustreaz ă conceptul de
polimorfism (Compilatorul știe la rulare ce versiune de metod ă
afișare() să apeleze).
import javax.swing.*;
class Punct { private int x;//coordonata x a punctului private int y; public Punct(int x0, int y0) { x=x0; y=y0; } public int getX()
Clase derivate. Clase abstracte. Polimorfism
73
{
return x;
} public int getY() { return y; } public void afisare() { System.out.println("x="+x); System.out.println("y="+y); } } class PunctColor extends Punct { private String culoare; public PunctColor(int x, int y, String culoare) { super(x,y); this.culoare=culoare; } public String getCuloare() { return culoare; } public void afisare() { //System.out.println("x="+x);G RESIT! x – este var. privata !
System.out.println("x="+getX()); System.out.println("y="+getY());; System.out.println("culoare="+culoare); } } class Punct3D extends Punct { private int z; public Punct3D(int x,int y, int z )
Clase derivate. Clase abstracte. Polimorfism
74
{
super(x,y);
this.z=z; } public int getZ() { return z; } public void afisare() { System.out.println("x="+getX()); System.out.println("y="+getY()); System.out.println("z="+z); } } class AfisarePuncte { public static void main (String args[]) { int N;//numarul de puncte N=Integer.parseInt(JOp tionPane.showInputDialog("N="));
Punct p[]=new Punct[N];//vector ul de obiecte Punct (clasa de
//baza)
int i; for(i=0;i<N;i++){ String sRaspuns=JOptionPane.showInputDialog("Tip punct (0,1,2) : "); int raspuns=Integer.parseInt(sRaspuns); int x=Integer.parseInt(JO ptionPane.showInputDialog("x="));
int y=Integer.parseInt(JO ptionPane.showInputDialog("y="));
if(raspuns==0){ //citeste un Punct: p[i]=new Punct(x,y);} else if(raspuns==1){ //citeste un PunctColor: String culoare=JOp tionPane.showInputDialog("culoare=");
p[i]=new PunctColor(x,y,culoare);} else if(raspuns==2){ //citeste un Punct3D:
Clase derivate. Clase abstracte. Polimorfism
75
int z=Integer.parseIn t(JOptionPane.showInputDialog("z="));
p[i]=new Punct3D(x,y,z);}
}//for //Afisare vector: for(i=0;i<N;i++) p[i].afisare(); } }
5. Să se dezvolte clasa Persoana ce are ca variabile de instan ță
numele și prenumele unei persoane și vârsta ei, și ca metode:
‐ constructorul ce face ini țializările;
‐ getNume(), ce returneaz ă numele;
‐ getPrenume(), ce returneaz ă prenumele;
‐ afisare(), ce afi șează informațiile despre persoan ă.
Din clasa Persoan ă se va deriva clasa Stude nt, ce are în plus ca
variabile de instan ță, numele faculta ții pe care o urmeaz ă și numărul
matricol. În clasa Student se va dezvolta un nou constructor și se va
redefini metoda afisare(). Se vor ad ăuga în plus metodele:
‐ getFacultate();
‐ getNumărMatricol().
Se va dezvolta o aplica ție în care se vor citi de la tastatur ă N= 10
studenți, ce se vor memora înt r-un vector. Se vor afi șa câți studenți au
prenumele ”Ion”.
import javax.swing.*;
class Persoana { private String nume; private String prenume; private int varsta; public Persoana(String n, String p, int v) { nume=n; prenume=p; varsta=v; } public String getNume() { return nume; }
Clase derivate. Clase abstracte. Polimorfism
76
public String getPrenume()
{
return prenume; } public void afisare() { System.out.println(nume+ " "+prenume+" : "+varsta);
} } class Student extends Persoana { private String numeFacultate; private int nrMatricol; public Student(String n, String p, int v, String facult, int nrMatr)
{ super(n,p,v); numeFacultate=facult; nrMatricol=nrMatr; } public String getFacultate() { return numeFacultate; } public int getNumarMatricol() { return nrMatricol; } } class TestStudenti { public static void main(String args[]) { final int N=2; int i; Student s[]=new Student[N]; for(i=0;i<N;i++){ String nume=JOptionPane.showInputDialog("nume="); String prenume=JOptionPane.showInputDialog("prenume="); int varsta= Integer.parseInt(JOptionP ane.showInputDialog("varsta="));
Clase derivate. Clase abstracte. Polimorfism
77
String facultate=JOptionPane .showInputDialog("facultate=");
int nrMatr=Integer.parseInt
(JOptionPane.showInputDialog("nr. matricol=")); s[i]=new Student(nume,pr enume,varsta,facultate,nrMatr);
} int contor_ion=0; for(i=0;i<N;i++){ String prenumeCrt=s[i].getPrenume(); if(prenumeCrt.compareTo("Ion")==0)contor_ion++; } System.out.println(contor_ion); } }
6. Să construiasc ă clasa Num ăr ce are ca variabil ă de instan ță un
număr întreg a, și ca metode:
‐ constructorul;
‐ afisare().
Din clasa Numar, se va deriva clasa DouaNumere, în care se va
adăuga variabila de instan ță b (ce reprezint ă al doilea num ăr), și se va
modifica constructorul și metoda afisare().
Folosind cele dou ă clase, se va dezvolta o aplica ție în care se
generează un număr aleator 0 sau 1. Dac ă este 0, se va instan ția un
obiect din clasa Numar (prin citire de la tastatur ă), dacă este 1, se va
instanția un obiect din clasa Dou ăNumere (tot prin citire de la
tastatură). Pentru obiectul instan țiat se va apela metoda afisare().
import java.util.*;
import javax.swing.*; class Numar { private int a; public Numar(int x) { a=x; } public void afisare() { System.out.println("a="+a); } }
Clase derivate. Clase abstracte. Polimorfism
78
class DouaNumere extends Numar
{ private int b; public DouaNumere(int a,int b ) { super(a); this.b=b; } public void afisare() { //afisare a: super.afisare();//Cu cuv. cheie super se apeleaza metoda
//clasei de baza //afisare b: System.out.println("b="+b); } } class AfisareNumere { public static void main (String args[]) { Numar n; Random r=new Random(); int caz=r.nextInt(2); if(caz==0){ //citeste un numar: int a=Integer.parseInt( JOptionPane.showInputDialog("a="));
n=new Numar(a); }else { //citeste doua numere: int a=Integer.parseInt( JOptionPane.showInputDialog("a="));
int b=Integer.parseInt( JOptionPane.showInputDialog("b="));
n=new DouaNumere(a,b); } //Afisare: n. afisare();//Numai la executie se stie care versiune de metoda
// afisare() se va apela
Clase derivate. Clase abstracte. Polimorfism
79
}
}
7. Să se construiasc ă clasa Cerc, ce are ca variabil ă de instan ță
privată, un num ăr întreg r, ce reprezint ă raza unui cerc. În aceast ă
clasă avem ca metode:
‐ constructorul, ce face ini țializarea razei;
‐ getRaza(), ce returneaz ă raza;
‐ calculArie(),ce returneaz ă aria cercului;
‐ suntEgale(), ce are ca parametru un Cerc c, și care returneaz ă
true dacă cercul curent este egal cu cercul c (au aceea și rază).
‐ afisare(), ce afi șează raza cercului.
Din clasa Cerc se va deriva clasa CercExtins, în care se vor ad ăuga ca
variabile de instan ță x și y: coordonatele centrului și se vor redefini
metodele suntEgale() (cercu rile sunt egale când au aceea și rază și
aceleași coordonate ale centrului), și afisare() (pe lâng ă rază, va afișa
și coordonatele centrului)
Scrieți și o clasă de test pentru clasa CercExtins.
class Cerc
{
private int raza; public Cerc(int x) { raza=x; } public int getRaza() { return raza; }
public double calculArie()
{ return Math.PI*raza*raza; } public boolean suntEgale(Cerc c) { if(this.raza==c.raza)return true; else return false; } public void afisare() {
Clase derivate. Clase abstracte. Polimorfism
80
System.out.println("raza="+raza);
}
} class CercExtins extends Cerc { private int x; private int y; public CercExtins(int r,int x0, int y0 ) { super(r); x=x0; y=y0; } public boolean suntEgale(CercExtins c) { if((this.getRaza()==c.getRaza())&&(this.x==c.x)&&(this.y==c.y)) return true; else return false; } public void afisare() { System.out.println("raza="+this.getRaza()); System.out.println("x="+x); System.out.println("y="+y); } } class TestCercExtins { public static void main (String args[]) { CercExtins c=new CercExtins(3,0,1); System.out.println("Aria= "+c.calculArie()); CercExtins c1=new CercExtins(3,0,10); System.out.println("Sunt egale= "+c.suntEgale(c1)); } }
Clase derivate. Clase abstracte. Polimorfism
81
8. Folosind cele dou ă clase anterioare, Cerc și CercExtins s ă se
dezvolte o aplica ție în care se vor citi N cercuri (de tipul Cerc sau
CercExtins), ce se memoreaz ă într-un vector. Citir ea unui obiect de tip
Cerc sau CercExtins este dat ă de valoarea 0 sau 1 a unui num ăr aleator
generat.
import java.util.*;
import javax.swing.*; class AfisareCercuri { public static void main (String args[]) { final int N=3;//numarul de cercuri Cerc c[]=new Cerc[N];//vecto rul de obiecte Cerc (clasa de
//baza) Random r=new Random(); int i; for(i=0;i<N;i++){ int caz=r.nextInt(2); if(caz==0){ //citeste un Cerc: String s_raza=JOptionPane.showInputDialog("raza="); c[i]=new Cerc(Integer.parseInt(s_raza)); }else{ //citeste un CercExins: String s_raza; s_raza=JOptionPane.showInputDialog("raza="); String s_x=JOptionPane.showInputDialog("x="); String s_y=JOptionPane.showInputDialog("y="); c[i]=new CercExtins(Integer.parseInt(s_raza), Integer.parseInt(s_x), Integer.parseInt(s_y)); } }//for //Afisare vector: for(i=0;i<N;i++) c[i].afisare(); } }
Fișiere
82
Cap. 6
Fișiere
1. Se dă un fișier text în care este memorat ă o matrice de numere
întregi (în fiecare linie a matricii se g ăsește același număr de valori
întregi, separate prin spa ții). Să se copieze datele din fi șierul text într-
o matrice și să se afișeze aceasta.
import java.io.*;
import java.util.*; class FisierInMatrice { public static void main(String args[]) { FileReader fr=null; BufferedReader bfr=null; int a[][]=new int[100][100];//dim. acoperitoare int nL=0;//nr linii int nC=0;//nr. coloane int i; try{ fr=new FileReader("matrice.txt"); bfr=new BufferedReader(fr); String s=bfr.readLine(); StringTokenizer tk=new StringTokenizer(s); nC=tk.countTokens();//nr. de coloane //copiez prima linie de numere in matricea a[][]: for(i=0;i<nC;i++) a[0][i]=Intege r.parseInt(tk.n extToken());
nL++; for(;;){ s=bfr.readLine(); if(s==null)break;//sfarsit de fisier //copiez linia curenta de numere in matrice: tk=new StringTokenizer(s); for(i=0;i<nC;i++) a[nL][i]=Integ er.parseInt(tk.nextToken());
nL++; } bfr.close();
Fișiere
83
fr.close();
}catch(IOException e){
System.out.println("Eroare fisier"); System.exit(1); } //Afisarea matricii: int j; for(i=0;i<nL;i++){ for(j=0;j<nC;j++) System.out.print(a[i][j]+" "); System.out.println(); } } }
2. Să se copieze o matrice de numere întregi într-un fi șier text.
import java.io.*;
class MatriceInFisier { public static void main(String args[]) { int a[][]={{1,2,3}, {-1,-2,-3}}; FileWriter fw=null; BufferedWriter bfw=null; int i,j; try{ fw=new FileWriter("copieMatrice.txt"); bfw=new BufferedWriter(fw); for(i=0;i<a.length;i++){ //scriu linia i a matricii in fisier: String s=""; for(j=0;j<a[0].length;j++) s=s+a[i][j]+" "; bfw.write(s,0,s.length()-1); //trec la linia urmatoare: bfw.newLine(); }//for i bfw.close(); fw.close();
Fișiere
84
}catch(IOException e){
System.out.println("Eroare fisier");
System.exit(1); } }//main }
3. Se citește un num ăr natural N. S ă se genereze un fi șier text ce
conține N linii, în fiecare linie se gase sc N numere naturale aleatoare
cuprinse între 0 și 255; numerele sunt separate între ele în cadrul unei
linii din fi șier, prin câte un spa țiu . (În acest mod gener ăm în fișierul
text, o imagine ce cuprinde N*N pixeli. Fiecare pixel este memorat pe 8 biți, deci este o imagine în tonuri de gri).
import javax.swing.*;
import java.io.*; import java.util.*; class GenerareFisier { final static int GAMA=256; public static void main(String args[]) { int N=Integer.parseInt(JO ptionPane.showInputDialog("N="));
FileWriter fw=null; BufferedWriter bfw=null; try{ fw=new FileWriter("imagine.txt"); bfw=new BufferedWriter(fw); //folosim numere aleatoare: Random r=new Random(); //scrie N linii in fisier: for(int i=0;i<N;i++){ //Scrie linia i:(aceasta linie contine N numere aleatoare) //Construim linia i: String linie=""; for(int j=0;j<N;j++) linie=linie+r.nextInt(GAMA)+" "; //O scrie efectiv in fisier: bfw.write(linie,0,linie.length()); bfw.newLine();
Fișiere
85
}
bfw.close();
fw.close(); }catch(IOException e){ System.out.println(e); System.exit(1);}
}
}
4. Se da fișierul text test.txt, aflat in directorul curent.. S ă se
rescrie acest fi șier, convertind literele mici în litere mari, restul
caracterelor ramânând neschimbate.
import java.io.*;
class FisierTextLitereMari { public static void main(String args[]) { /*Algoritm: – copiem fisierul initial, cu li tere mari intr-un fisier: temp.txt
– stergem fisierul initial – redenumim temp.txt cu numele fisierului initial
(Metodele delete() si renameTo() se gasesc in clasa File.) */ File f=null; File temp=null; FileReader fr=null; FileWriter fw=null; try{ f=new File("test.txt"); fr=new FileReader(f); temp=new File("temp.txt"); fw=new FileWriter(temp); for(;;){ int cod=fr.read(); if(cod==-1)break;//s-a terminat fisier char c=(char)cod; char cMare=Character.toUpperCase(c); fw.write(cMare); }
Fișiere
86
fr.close();
fw.close();
boolean OK=f.delete(); if(OK)temp.renameTo(f); }catch(IOException e){ System.out.println(e);
}catch(SecurityException se){ //pentru metodele din clasa File System.out.println(se); System.exit(1); }
}//main }
5. Să se scrie o aplica ție ce implementeaz ă un test gril ă.
Întrebările și variantele de r ăspuns sunt memorate într-un fi șier text ce
are următoarea structur ă:
‐ Fiecare întrebare are o singur ă linie;
‐ Sunt 2 variante de r ăspuns, fiecare ocup ă o singur ă linie. O
singură variantă este cea corect ă și ea este totdeauna plasat ă după
textul întreb ării (este deci prima variant de r ăspuns din cele doua);
Un exemplu de fi șier text ce con ține două întrebări:
Care este cel mai înalt munte din România ?
Moldoveanu Negoiu Care este capitala Spaniei ? Madrid Barcelona
În cadrul aplica ției sunt prezentate în ordi ne aleatoare toate întreb ările
din fișierul text, pentru fiecare întrebare afi șându-se cele doua variante
de răspuns, de asemenea în ordine aleatoare. La afi șarea pe monitor,
variantele vor fi numerotate cu 1. sau cu 2. Programul cite ște de la
utilizator num ărul răspunsului pe care acesta îl consider ă
corect. Dup ă
preluarea r ăspunsurilor pentru toate întreb ările din fi șier, se va calcula
și afișa o notă ce reflect ă corectitudinea r ăspunsurilor date de
utilizator. Se va afi șa de asemenea și durata complet ării testului, în
secunde. Pentru citire a de la tastatur ă se va dezvolta, separat, clasa CR.
Fișiere
87
import java.util.*;
import java.io.*;
class TestGrila { public static void main(String args[]){ int N = 0; // numarul de intrebari din test CR cr = new CR(); String numeF = "intrebari.txt"; FileReader fr = null; BufferedReader bfr = null; String s[]=new String[1000];// copiem intrebarile intr-un vector
// cu dimensiune acoperitoare // incarcam toate liniile din fisier, in vectorul s[]: try{ fr = new FileReader(numeF); bfr = new BufferedReader(fr); // citim toate liniile for(;;){ String linieCrt = bfr.readLine(); if (linieCrt == null) break; s[N] = linieCrt; N++; } bfr.close(); fr.close(); } catch(IOException e){ System.out.println(e); System.exit(1); } int nrTotalIntrebari=N/3; // Sunt N/3 intrebari distincte in fisier // construim vectorul de ordine aleatoare de prezentare // a intrebarilor: int ordine[]=new int[nrTotalIntrebari];
int i; for (i = 0; i < nrTotalIntrebari; i++) ordine[i]=i; // Amestecam elementele vectorului ordine: amesteca(ordine);
Fișiere
88
Random r = new Random();
int corecte = 0;
long tStart = System.currentTimeMillis(); for (i = 0; i < nrTotalIntrebari; i++){ // tiparim intrebarea si variantele de raspuns
// afisam intrebarea de pe pozitia i System.out.println(s[3*ordine[i]]); char raspCorect; int modAfisRasp = r.nextInt(2); //Daca modAfisRasp este 0: se afiseaza intai varianta 1 // de raspuns, si apoi varianta 2 //Daca modAfisRasp este 1: se afiseaza intai varianta 2 // de raspuns, si apoi varianta 1 if (modAfisRasp == 0){ System.out.println("1. "+s[3*ordine[i]+1]); System.out.println("2. "+s[3*ordine[i]+2]); raspCorect='1'; } else { System.out.println("1. "+s[3*ordine[i]+2]); System.out.println("2. "+s[3*ordine[i]+1]); raspCorect='2'; } char raspUser; for(;;){ System.out.print("Raspuns = (1,2) : "); raspUser = cr.readChar(); if((raspUser=='1')||(raspUser=='2'))break; } if (raspUser == raspCorect) corecte++; System.out.println(); }//end for long tStop = System.currentTimeMillis(); int t = (int)(tStop – tStart)/1000; System.out.println(); System.out.println("N umarul total de intrebari : "
+nrTotalIntrebari); System.out.println( "Raspunsuri corecte : "+corecte);
System.out.println("D urata test : "+t+" secunde.");
double notaCalculata =10.0*corecte/nrTotalIntrebari;
Fișiere
89
//Afisam nota cu o singura zecimala:
double nota=((i nt)(notaCalculata*10))/10.0;
String s1 = ""+nota; System.out.println("Nota la test : "+nota); } private static void amesteca(int ordine[]){ Random r = new Random(); int i; for (i = 0; i<ordine.length; i++){ int index1 = r.nextInt(ordine.length); int index2 = r.nextInt(ordine.length); int aux = ordine[index1]; ordine[index1]=ordine[index2]; ordine[index2]=aux; } } }//class TestGrila //Clasa CR, folosita pt. a citi de la tastatura:
class CR { private BufferedReader buff_read er;//obiect folosit pt. a citi
// o linie de caractere public CR() { //creaza obiectul buff_reader ce are capacitatea de // a citi o linie de caractere. buff_reader=new BufferedReader(new InputStreamReader (System.in)); } //Citeste o linie de la tastatura: public String readString() { String s=""; try{ s=buff_reader.readLine(); //in clasa BufferedReader exista metoda readLine() }
Fișiere
90
catch(IOException e){
System.out.println(e);
System.exit(1); } return s; } //Citeste un int de la tastatura: public int readInt() { String s=this.readString(); int nr=Integer.parseInt(s); return nr; } //Citeste un char de la tastatura: public char readChar() { String s=this.readString(); return s.charAt(0); } }//end class CR
6. Se citește un num ăr natural N. Se citesc numele a N fi șiere
text. Să se afișeze în care fi șier apare de cele mai multe ori caracterul
‘a’.
import java.io.*;
import javax.swing.*; class FisierMaximAparitii { public static void main(String args[]) { int N=Integer.parseInt(JO ptionPane.showInputDialog("N="));
String numeFisiere[]=new String[N]; int i; //Citim numele celor N fisiere: for(i=0;i<N;i++) numeFisiere[i]=JOptionPane.showInputDialog("nume = "); //initializare:
Fișiere
91
int nrMaxAparitii=-1;
int indexMaxAparitii=-1;//indexu l fisierului in care apare de cele
// mai multe ori 'a' FileReader fr=null; try{ //parcurgem cele N fisiere: for(i=0;i<N;i++){ fr=new FileReader(numeFisiere[i]); int nrAparitiiFisierCrt=0; for(;;){ int cod=fr.read(); if(cod==-1)break;//s-a terminat fisier if((char)cod=='a')nrAparitiiFisierCrt++; } if(nrAparitiiFisierCrt>nrMaxAparitii){ nrMaxApar itii=nrAparitiiFisierCrt;
indexMaxAparitii=i;} fr.close(); } }catch(IOException e){ System.out.println(e); System.exit(1);} System.out.println("Nr. max. apar itii 'a' = "+nrMaxAparitii) ;
System.out.println("In fisierul: "+numeFisiere[indexMaxAparitii]);
}//main }
7. Se dă un fișier text în care este memorat ă o imagine binar ă
(alb- negru) ce con ține N1xN1 pixeli (valori de 0 sau 1, separate
printr-un spa țiu în cadrul aceleia și linii). Valoarea N1 este cunoscut ă.
Să se construiasc ă un alt fi șier text ce con ține imaginea anterioar ă
redusă la N2xN2 pixeli (N2 cunoscut și este un divizor al lui N1).
Algoritmul de reducere este urm ătorul: se calculeaz ă dimensiunea
unui bloc (notata cu dimBloc) dimBloc= N1/N2, și apoi imaginea
inițială de N1xN1 pixeli se împarte în blocuri de dimBloc linii și
dimBloc coloane. Fiecare bloc va fi redus la un pixe l, în matricea
redusă (ce va avea dimensiunea N 2xN2). Valoarea pixelului se
calculează astfel: este 1 dac ă numărul de pixeli de 1 din bloc este >=
decât num ărul de pixeli de 0 din bloc, și este 0 în caz contrar.
import java.io.*;
Fișiere
92
import java.util.*;
class ReduceFisier{
public static void main (String args[]) { final int N1=100; final int N2=10; int dimBloc=N1/N2; FileReader fr = null; BufferedReader bfr=null; int a[][] = new int[N1][N1]; int i,j; try{ //copiem fisierul mare,ce are N1 linii, intr-o matrice: fr = new FileReader("unu.txt"); bfr = new BufferedReader(fr); for (i=0;i<N1;i++) { String s = bfr.readLine(); StringTokenizer tk = new StringTokenizer(s); for(j=0;j<N1;j++) { String atomCrt = tk.nextToken(); a[i][j]=Integer.parseInt(atomCrt); } } bfr.close(); fr.close(); }catch (IOException e){ System.out.println(e); System.exit(1);} //Reducem matricea si o copiem in al doilea fisier:
try { int b[][] = new int [N2][N2]; //construim matricea redusa, b[][]: for (i=0;i<N2;i++) for (j=0;j<N2;j++){ int contor1 = 0; for (int k = i*dimBloc;k<(i+1)*dimBloc;k++) for (int l = j*dimBloc;l<(j+1)*dimBloc;l++) if (a[k][l] == 1)contor1++;
Fișiere
93
if (contor1>=dimBloc *dimBloc/2)b[i][j] = 1;
else b[i][j] = 0;
} //copiem matricea redusa, in fisier: FileWriter fw = new FileWriter ("doi.txt"); BufferedWriter bfw = new BufferedWriter (fw); for (i=0;i<N2;i++){ String st=""; for (j=0;j<N2;j++) st = st + b[i][j] + " "; bfw.write(st,0,st.length() – 1); bfw.newLine(); } bfw.close(); fw.close(); }catch (IOException e){ System.out.println(e); System.exit(1); } } }
8. Să se afișeze care este cel mai lung cuvânt dintr-un fi șier text
dat. Se consider ă că în fișier nu se afl ă cuvinte desp ărțite în silabe, la
cap de rând.
import java.io.*;
import java.util.*; class CelMaiLungCuvant { public static void main(String args[]) { FileReader fr=null; BufferedReader bfr=null; //initializari: String cuvantMax=""; int lungimeMax=0;//initializare pt. dimensiunea celui mai lung
//cuvant
try{ fr=new FileReader("referat.txt"); bfr=new BufferedReader(fr);
Fișiere
94
for(;;){
String linie=bfr.readLine();
if(linie==null)break;//s-a terminat fisierul //Extragem cuvintele din aceasta linie: StringTokenizer tk=new StringTokenizer(linie); int n=tk.countTokens(); for(int i=0;i<n;i++){ String cuvant=tk.nextToken(); int lungime=cuvant.length(); if(lungime>lungimeMax){ lungimeMax=lungime; cuvantMax=cuvant; } } } bfr.close(); fr.close(); }catch(IOException e){ System.out.println(e); System.exit(1);} System.out.println("Cel mai l ung cuvant este: "+cuvantMax);
}//main }
9. Se citește numele unui fi șier text ce con ține mai multe linii. S ă
se afișeze dacă toate liniile sunt diferite între ele sau nu.
import java.io.*;
import javax.swing.*; class LiniiDiferite { public static void main(String args[]) { String numeF=JOptionPane.showInputDialog("nume fisier="); FileReader fr=null; BufferedReader bfr=null; //Vom copia toate liniile din fi sier, intr-un vector de Stringuri:
String s[]=new String[1000];//dimensiune acoperitoare //initializare pt. numarul de linii din fisier: int N=0; try{
Fișiere
95
fr=new FileReader(numeF);
bfr=new BufferedReader(fr);
for(;;){ String linie=bfr.readLine(); if(linie==null)break;//s-a terminat fisierul //copiem linia in vectorul s[]: s[N]=linie; N++; } bfr.close(); fr.close(); }catch(IOException e){ System.out.println(e); System.exit(1);} //Verificam daca vectorul s[] ar e toate elemente le diferite:
for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) if(s[i].compareTo(s[j])==0){ System.out.println("Nu are toate liniile diferite !"); return;} System.out.println("Are toate lin iile diferite !");
}//main }
10. Să se afișeze dacă primul caracter dintr-un fi șier text este egal
cu ultimul.
import java.io.*;
class PrimulSiUltimulCaracter { public static void main(String args[]) { FileReader fr=null; //Presupunem ca fisierul are cel putin doua caractere!
try{ fr=new FileReader("date.txt"); //citim primul caracter: int cod=fr.read(); char primul=(char)cod; //citim urmatorul caracter si cu acesta initializam pe ultimul:
cod=fr.read();
Fișiere
96
char ultimul=(char)cod;
//citim restul caracterelor, actualizand ultimul caracter:
for(;;){ cod=fr.read(); if(cod==-1)break;//s-a terminat fisier ultimul=(char)cod; } fr.close(); if(primul==ultimul)System.out.println("da"); else System.out.println("nu"); }catch(IOException e){ System.out.println(e); System.exit(1);} }//main }
11. Se citesc N linii de la tastatura (N – c unoscut). Sa se copieze
aceste linii intr-un fisier text.
import javax.swing.*;
import java.io.*; class FisierScriePropozitii { public static void main(String args[]) { FileWriter fw=null; BufferedWriter bfw=null; int N=Integer.parseInt(
JOptionPane.showInputDialog("N="));
try{ fw=new FileWriter("propozitii.txt") ; bfw=new BufferedWriter(fw); for(int i=0;i<N;i++){ String s=JOptionPan e.showInputDialog("linie=");
bfw.write(s,0,s.length());//i ndex start si lungimea ce se scrie
bfw.newLine();//scrie ENTER } bfw.close(); fw.close(); }catch(IOException e){ System.out.println("Eroare scriere fisier");
Fișiere
97
System.exit(1);
}
}//main }
12. Se da un fisier text de cuvint e (fiecare cuvant se afla pe o
linie). Sa se construiasca un alt fi sier text, ce con tine cuvintele din
primul fisier, sortate in ordine alfabetica.
import java.io.*;
class ScrieFisierSortat { public static void main(String[] args) { FileReader fr=null; BufferedReader bfr=null; //Copiem toate cu vintele (liniile) intr- un vector de Stringuri:
String st[]=new String[ 100];//dimensiune acoperitoare
int nL=0;//numar ul de linii din fisier
try { fr=new FileReader("cuvinte.txt"); bfr=new BufferedReader(fr); for (;;) { String s=bfr.readLine(); if (s==null)break; else st[nL]=s; nL++; } bfr.close(); fr.close(); } catch(IOException e){ System.out.println(e); System.exit(1);} //sortare bubblesort pentru vectorul st[]: for (;;) { boolean gata=true; for (int i=0;i<nL-1;i++) {
Fișiere
98
if (st[i].compareTo(st[i+1])>0)
{
String aux=st[i]; st[i]=st[i+1]; st[i+1]=aux; gata=false; } } if (gata)break; } //copiere vector st[] in fisier: FileWriter fw=null; BufferedWriter bfw=null; try { fw=new FileWriter("cuvinteSortate.txt"); bfw=new BufferedWriter(fw); for(int i=0;i<nL;i++){ bfw.write(st[i],0,st[i].length ());//index start si lungimea ce se scrie
bfw.newLine();// scrie ENTER in fisier } bfw.close(); fw.close(); }catch(IOException e){ System.out.println(e); System.exit(1);} } }
13. Să se creeze prin program, un fi șier text ce are urm ătorul
conținut:
0 0 … 0 1 1 … 1 ……….. 9 9 … 9 În fiecare linie din fi șier sunt câte 10 numere separate prin spa ții.
import java.io.*;
class ScrieFisier { public static void main(String[] args)
Fișiere
99
{
final int N=10; //numar ul de linii din fisier
FileWriter fw=null; BufferedWriter bfw=null; try { fw=new FileWriter("numere.txt"); bfw=new BufferedWriter(fw); for(int i=0;i<N;i++){ //Construim linia curenta: String s=""; for(int j=0;j<N;j++) s=s+i+" "; bfw.write(s,0,s.length()); bfw.newLine();// scrie ENTER in fisier } bfw.close(); fw.close(); }catch(IOException e){ System.out.println(e); System.exit(1);} } }
14. Să se calculeze câte valori nule sunt într-un fi șier binar de
octeți al cărui nume se cite ște de la tastatur ă.
import java.io.*;
class MaximOctet { public static void main(String args[]) { FileInputStream fi=null; String numeF=JOptionPane.showInputDialog("nume fisier="); int contor=0; //initializare nr. valori nule try{ fi=new FileInputStream(numeF); for(;;){ int cod=fi.read(); if(cod==-1)brea k; //s-a terminat fisierul
if((byte)cod==0)contor++; }
Fișiere
100
fi.close();
}catch(IOException e){
System.out.println(e); System.exit(1); } System.out.println("nr. valori nule = "+contor); } }
15. Să se calculeze maximul dintr-un fi șier binar de octe ți.
import java.io.*;
class MaximOctet { public static void main(String args[]) { FileInputStream fi=null; String numeF=JOptionPane.showInputDialog("nume fisier="); byte max=0; //initializare maxim try{ fi=new FileInputStream(numeF); for(;;){ int cod=fi.read(); if(cod==-1)brea k; //s-a terminat fisierul
byte b=(byte)cod;//octetul curent citit if(b>max)max=b; } fi.close(); }catch(IOException e){ System.out.println(e); System.exit(1); } System.out.println("maxim="+max); } }
16. Să se afișeze dacă toți octeții dintr-un fi șier binar, sunt diferi ți
între ei sau nu.
import java.io.*;
class OctetiDiferiti {
Fișiere
101
public static void main(String args[])
{
FileInputStream fi=null; String numeF=JOptionPane.showInputDialog("nume fisier="); //Copiem toti octetii din fisier, intr-un vector: byte b[]=new byte[10000]; int N=0;//numar de octeti din fisier (initializare) try{ fi=new FileInputStream(numeF); for(;;){ int cod=fi.read(); if(cod==-1)break; //s-a terminat fisierul b[N]=(byte)cod; N++; } fi.close(); }catch(IOException e){ System.out.println(e); System.exit(1); } //Verificam daca toti octetii sunt diferiti: for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) if(b[i]==b[j]){ System.out.println( "Nu sunt toti diferiti.");
return; } System.out.println("Sunt toti diferiti."); } }
17. Se citește un num ăr natural N. Se citesc N numere întregi, care
se vor copia într-un fi șier binar de numere întregi.
import java.io.*;
import javax.swing.*; class CopiereNumereInFisier { public static void main(String args[]) { int N=Integer.parseInt( JO ptionPane.showInputDialog("N="));
Fișiere
102
FileOutputStream fos=null;
DataOutputStream f=null;
try{ fos=new FileOutputStream("numere.dat"); f=new DataOutputStream(fos); //Citim cele N numere de la tastatura: for(int i=0;i<N;i++){ int nr=Integer.parseInt(JOptionPane. showInputDialog("nr=")); //Scriem numarul in fisier: f.writeInt(nr); } f.close(); fos.close(); }catch(IOException e){ System.out.println(e); System.exit(1); } } }
18. Să se calculeze maximul dintr-un fi șier binar de numere
întregi.
import java.io.*;
class MaximDinFisier { public static void main(String args[]) { File f=null; FileInputStream fis=null; DataInputStream dis=null; String numeF=JOptionPane.showInputDialog("nume fisier="); try{ f=new File(numeF); long L=f.length();//lungimea in octeti int N=(int)L/4;//Numarul de intregi memorati in fisier //(un int ocupa 4 octeti ) System.out.println(L); fis=new FileInputStream(f); dis=new DataInputStream(fis);
Fișiere
103
//initializam maximul cu primul numar intreg din fisier:
int max=dis.readInt();
//Citim celelalte numere din fisier: for(int i=1;i<=N-1;i++){ int nr=dis.readInt(); if(nr>max)max=nr; } System.out.println("maxim="+max); dis.close(); fis.close(); //f.close(); Nu exista close() pentru File }catch(IOException e){ System.out.println(e); System.exit(1); } catch(SecurityException se){ //pentru metodele din clasa File System.out.println(se); System.exit(1); } } }
19. Să se afișeze dacă toate numerele dintr-un fi șier binar de
numere întregi sunt egale între ele sau nu.
import java.io.*;
class SuntToateEgaleInFisier { public static void main(String args[]) { File f=null; FileInputStream fis=null; DataInputStream dis=null; String numeF=JOptionPane.showInputDialog("nume fisier="); try{ f=new File(numeF); long L=f.length();//lungimea in octeti int N=(int)L/4;//Numarul de intregi memorati in fisier //(un int ocupa 4 octeti ) fis=new FileInputStream(f); dis=new DataInputStream(fis);
Fișiere
104
//Citesc primul numar din fisier:
int nr1=dis.readInt();
boolean suntToateEgale=true;//semafor //Citim restul numerelor si le comparam cu primul:
for(int i=1;i<N;i++){ int nr=dis.readInt(); if(nr!=nr1){ suntToateEgale=false; break;} } if(suntToateEgale) System.out.println(" Sunt toate numerele egale.");
else System.out.println("Nu sunt toate numerele egale.");
dis.close(); fis.close(); }catch(IOException e){ System.out.println(e); System.exit(1); }catch(SecurityException se){//p entru metodele din clasa File
System.out.println(se); System.exit(1); } } }
20. Să se calculeze câte numere poz itive sunt prezente într-un
fișier binar de numere întregi.
import java.io.*;
class CateNumerePozitiveInFisier { public static void main(String args[]) { File f=null; FileInputStream fis=null; DataInputStream dis=null; String numeF=JOptionPane.showInputDialog("nume fisier="); try{ f=new File(numeF); long L=f.length();//lungimea in octeti int N=(int)L/4;//Numarul de intregi memorati in fisier
Fișiere
105
//(un int ocupa 4 octeti )
fis=new FileInputStream(f);
dis=new DataInputStream(fis); int contor=0; //Citim numerele din fisier: for(int i=0;i<N;i++){ int nr=dis.readInt(); if(nr>=0)contor++; } System.out.println("numarul de numere pozitive="+contor); dis.close(); fis.close(); }catch(IOException e){ System.out.println(e); System.exit(1); }catch(SecurityException se){//p entru metodele din clasa File
System.out.println(se); System.exit(1); } } }
21. Se dă un fișier binar de numere întregi. S ă se copieze toate
numerele din fi șier, într-un vector de numere întregi.
import java.io.*;
class CopiereNumereDinFisierInVector { public static void main(String args[]) { File f=null; String numeF=JOptionPane.showInputDialog("nume fisier="); int N=0;//numarul de numere intregi din fisier
//(initializarea lui N este obligatorie! Altfel, eroare la // compilare) try{ f=new File(numeF); long L=f.length();//lungimea in octeti N=(int)L/4;//Numarul de intregi memorati in fisier
}catch(SecurityException e){ System.out.println(e);
Fișiere
106
System.exit(1);
}
//instantiere vector: int a[]=new int[N]; //Citim numerele di n fisier in vector:
FileInputStream fis=null; DataInputStream dis=null; try{ fis=new FileInputStream(f); dis=new DataInputStream(fis); for(int i=0;i<N;i++) a[i]=dis.readInt(); dis.close(); fis.close(); }catch(IOException e){ System.out.println(e); System.exit(1); } //Afisare vector: for(int i=0;i<N;i++) System.out.println(a[i]); } }
22. Se dă un fișier binar de octe ți, date.bin. S ă se copieze acest
fișier în NFIS fi șiere binare (NFIS – contant ă ce se cunoa ște):
date1.bin, date2.bin, date3.bin, etc., aceste fi șiere conțin părți egale
din fișierul inițial date.bin ( cu eventuala excep ție a ultimului fi șier din
cele NFIS). Exemplu: dac ă NFIS=2, atunci prima jum ătate din
date.bin se copiaz ă în date1.bin, cealalt ă jumătate se copiaz ă în
date2.bin.
import java.io.*;
class SplitBinaryFile { public static void main(String args[]) { final int NFIS=3;//numar de fisiere final int DIM=10000;//dim. acoperitoare final String numeFisier="date.bin"; FileInputStream fi=null;
Fișiere
107
byte b[]=new byte[DIM];
int N=0;//numar de octeti din fisier (initializare)
//copiere fisier in vector de octeti: try{ fi=new File InputStream(numeFisier);
for(;;){ int cod=fi.read(); if(cod==-1)br eak; //s-a terminat fisierul
b[N]=(byte)cod; N++; } fi.close(); }catch(IOException e){ System.out.println(e); System.exit(1); } //Generare vector de nume de fisiere de iesire: //(in exemplul folosit: date1.txt, date2.txt, date3.txt) String nume[]=new String[N]; //Pentru a extrage din numeFisier, numele fara extensie: StringTokenizer tk=new StringTokenizer(
numeFisier,".");
String numeBaza=tk.nextToken(); String numeExtensie=tk.nextToken(); int i,j; for(i=0;i<NFIS;i++) nume[i]=numeBaza+(i+1)+"."+numeExtensie; for(i=0;i<NFIS;i++) System.out.println(nume[i]); //Construirea celor NFIS fisiere: FileOutputStream fo=null; //nr. de octeti ce se copiaza intr-un fisier din cele NFIS:
int dim=N/NFIS; try{ for(i=0;i<NFIS;i++){ fo=new FileOutputStream(nume[i]); //se va copia din vectorul b[]: int indexStart=i*dim; int indexStop=indexStart+dim; if(i==NFIS-1)indexStop=N; //daca este ultimul fisier
Fișiere
108
for(j=indexStart;j<indexStop;j++)
fo.write(b[j]);
fo.close(); } }catch(IOException e){ System.out.println(e); System.exit(1); } } }
Aplicații grafice
109
Cap. 7
Aplicații grafice
1. Să se scrie o aplica ție ce con ține patru componente grafice:
JTextField pentru afi șare și trei butoane JButton, notate cu “unu”,
”doi” și ”trei”. Cele trei butoane vor fi a șezate în linie. La ap ăsarea
unui buton se va afi șa în componenta JTextField numele butonului
apăsat.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; class ScrieNumeButon {
public static void main(String args[])
{
Fereastra f=new Fereastra(); f.setTitle("Test de butoane"); f.setVisible(true); } } class Fereastra extends JFrame {
private JTextField jtf; private JButton jb1, jb2, jb3; //constructor public Fereastra() { setSize(300,300); addWindowListener(new FereastraListener()); //construieste componente: jtf=new JTextField(); //doar pt. afisare: jtf.setEditable(false); //Construim cele trei butoane: jb1=new JButton("unu"); jb2=new JButton("doi"); jb3=new JButton("trei"); //Le plasez intr-un cont ainer intermediar JPanel:
JPanel jp=new JPanel();
Aplicații grafice
110
jp.add(jb1);jp.add(jb2);jp.add(jb3);
//Atasam fiecarui buton, obiectul de ascultare, pentru a putea fi
//tratate evenimentele de apasare a acestor butoane:
ClasaButoaneListener liste ner=new ClasaButoaneListener();
jb1.addActionListener(listener); jb2.addActionListener(listener); jb3.addActionListener(listener); //adaugam componentele in containerul final, ce se extrage din
//fereasta:
Container containerFi nal=this.getContentPane();
containerFinal.add(jtf,"Center"); //daca lipseste, nu deseneaza nimic
//in centru
containerFinal.add(jp,"South");//le aseaza in partea de jos a
//ferestrei
} / /clasa interioara: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }private class ClasaButoaneList ener implements ActionListener
{ //Interfata ActionListe ner are o singura metoda:
public void actionPer formed(ActionEvent ev)
{ Object sursa=ev.getSource(); if(sursa==jb1)jtf.setText("unu"); else if(sursa==jb2)jtf.setText("doi"); else if(sursa==jb3)jtf.setText("trei"); } } }
2. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
patru componente grafice: JTextF ield pentru intr oducerea unui num ăr
întreg, JTextField pentru afi șare și două componente JButton. Atunci
când este ap ăsat primul buton, se vor afi șa toți divizorii num ărului
introdus. Când se apas ă cel de-al doilea, se iese din program.
Aplicații grafice
111
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; class GraficAfisareDivizori { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Calcul divizori"); f.setVisible(true); } } class Fereastra extends JFrame { private JTextField jtfDate, jtfAfisare; private JButton jbCalcul, jbExit; //constructor public Fereastra() { setSize(600,400); addWindowListener(new FereastraListener()); //construieste componente: JLabel jl1=new JLabel("Numar="); jtfDate=new JTextField(5) ;//pt. introducere numar
JPanel jp1=new JPanel(); jp1.add(jl1); jp1.add(jtfDate); JLabel jl2=new JLabel("Divizorii: "); jtfAfisare=new JTextField(40); jtfAfisare.setEditable(false) ; JPanel jp2=new JPanel(); jp2.add(jl2); jp2.add(jtfAfisare); jbCalcul=new JButton("Calcul"); jbExit=new JButton("Exit"); JPanel jp3=new JPanel(); jp3.add(jbCalcul); jp3.add(jbExit); //Container intermediar: JPanel jp=new JPanel();
Aplicații grafice
112
jp.setLayout(new GridLayout(3,1));
jp.add(jp1); jp.add(jp2); jp.add(jp3);
ClasaButoaneListener bL =new ClasaButoaneListener();
jbCalcul.addActionListener(bL); jbExit.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jp,"South"); } //inner class: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ Object sursa=ev.getSource(); if(sursa==jbExit)System.exit(0); if(sursa==jbCalcul){ int nr=Integer.parseInt(jtfDate.getText()); String rezultat="1, ";//primul divizor for(int i=2;i<=nr/2;i++) if(nr%i==0)rezultat=rezultat+i+", "; //Ultimul di vizor este chiar nr:
rezultat=rezultat+nr+"."; jtfAfisare.setText(rezultat); } } }//end inner class }//end class Fereastra
3. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
patru componente grafice: JTextFie ld pentru introducerea elementelor
Aplicații grafice
113
unui vector de numere intregi (ele mentele sunt separate prin spa ții),
JTextField pentru afi șarea maximului din vector și două componente
JButton. Atunci când este ap ăsat primul buton, se va afi șa maximul
din vectorul introdus. Când se apas ă cel de-al doilea, se iese din
program.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; import java.util.*; class GraficAfisareMaxim { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Calcul maxim"); f.setVisible(true); } } class Fereastra extends JFrame { private JTextField jtfDate, jtfAfisare; private JButton jbCalcul, jbExit; //constructor public Fereastra() { setSize(600,400); addWindowListener(new FereastraListener()); //construieste componente: JLabel jl1=new JLabel("Vector="); jtfDate=new JTextField(40);//pt. introducere numar JPanel jp1=new JPanel(); jp1.add(jl1); jp1.add(jtfDate); JLabel jl2=new JLabel("Maxim: "); jtfAfisare=new JTextField(5); jtfAfisare.setEditable(false) ; JPanel jp2=new JPanel(); jp2.add(jl2); jp2.add(jtfAfisare);
Aplicații grafice
114
jbCalcul=new JButton("Calcul");
jbExit=new JButton("Exit");
JPanel jp3=new JPanel(); jp3.add(jbCalcul); jp3.add(jbExit); //Container intermediar: JPanel jp=new JPanel(); jp.setLayout(new GridLayout(3,1)); jp.add(jp1); jp.add(jp2); jp.add(jp3); ClasaButoaneListener bL =new ClasaButoaneListener();
jbCalcul.addActionListener(bL); jbExit.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jp,"South"); } //inner class: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ Object sursa=ev.getSource(); if(sursa==jbExit)System.exit(0); if(sursa==jbCalcul){ //preluarea elemente lor vectorului, din JTextField:
String s=jtfDate.getText(); StringTokenizer tk=new StringTokenizer(s); int N=tk.countTokens();//nr. de elemente din vector //initializam maximul cu primul numar : int max=Integer.parseInt(tk.nextToken());
Aplicații grafice
115
//Comparam cu restul numerelor:
for(int i=1;i<N;i++){
int nrCrt=Intege r.parseInt(tk.nextToken());
if(nrCrt>max)max=nrCrt; } //Afisare maxim: jtfAfisare.setText(""+max); } } }//end inner class }//end class Fereastra
4. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
trei componente grafice: JTextAr ea pentru introducerea pe mai multe
linii a unor numere întregi (în fiec are linie sunt mai multe numere
separate prin spa ții), JTextField pentru afi șare și JButton pentru
comanda efectu ării calculelor. Atunci când se apas ă butonul, în
JTextField se va afi șa suma tuturor numerelor din JTextArea.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; import java.util.*; class AfisareSuma { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Suma numerelor"); f.setVisible(true); } } class Fereastra extends JFrame { private JTextArea jta; private JTextField jtfAfisare; private JButton jbCalcul; //constructor public Fereastra() {
Aplicații grafice
116
setSize(600,400);
addWindowListener(new FereastraListener());
jta=new JTextArea(); jtfAfisare=new JTextField(5); jtfAfisare.setEditable(false) ; JPanel jp1=new JPanel(); jp1.add(jtfAfisare); jbCalcul=new JButton("Calcul"); JPanel jp2=new JPanel(); jp2.add(jbCalcul); //Container intermediar: JPanel jp=new JPanel(); jp.setLayout(new GridLayout(2,1)); jp.add(jp1); jp.add(jp2); ClasaButoaneListener bL =new ClasaButoaneListener();
jbCalcul.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jta,"Center"); c.add(jp,"South"); } //inner class: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ String s=jta.getText(); //Extrag numerele :
Aplicații grafice
117
StringTokenizer tk=new StringTokenizer(s);
int N=tk.countTokens();
int suma=0; for(int i=0;i<N;i++) suma=suma+Integer.parseInt(tk.nextToken()); //Afisare suma: jtfAfisare.setText(""+suma); } } }//end class Fereastra
5. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
trei componente grafice: JTextA rea pentru introducerea unui text,
JTextField pentru afi șare și JButton pentru comanda efectu ării
calculelor. Atunci când se apas ă butonul, în JTextField se va afi șa
numarul de caractere ’a’ din te xtul introdus în JTextArea.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; import java.util.*; class Calcul { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Calcul nr. caractere a"); f.setVisible(true); } } class Fereastra extends JFrame { private JTextArea jta; private JTextField jtfAfisare; private JButton jbCalcul; //constructor public Fereastra() { setSize(600,400); addWindowListener(new FereastraListener());
Aplicații grafice
118
jta=new JTextArea();
jtfAfisare=new JTextField(5);
jtfAfisare.setEditable(false) ; JPanel jp1=new JPanel(); jp1.add(jtfAfisare); jbCalcul=new JButton("Calcul"); JPanel jp2=new JPanel(); jp2.add(jbCalcul); //Container intermediar: JPanel jp=new JPanel(); jp.setLayout(new GridLayout(2,1)); jp.add(jp1); jp.add(jp2); ClasaButoaneListener bL =new ClasaButoaneListener();
jbCalcul.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jta,"Center"); c.add(jp,"South"); } //inner class: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ String s=jta.getText(); int contor=0; for(int i=0;i<s.length();i++) if(s.charAt(i)=='a')contor++; jtfAfisare.setText(""+contor); } } }//end class Fereastra
Aplicații grafice
119
6. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
următoarele componente grafice: JTextField pentru afi șarea textului:
Afisare cu diferite marimi de fonturi !, trei butoane radio
JRadioButton, pentru selec ția mărimii fontului cu car e se scrie textul
din JTextField ( font mic, font mediu, font mare ), și un buton JButton
pentru ie șirea din program. Atunci când este activat primul buton
radio, textul se va afi șa în JTextField folosind font de m ărime 12, când
este activat al doilea buton radio, textul se va afi șa cu font de m ărime
18, când este activat al treilea, se va folosi font de m ărime 24.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; import java.util.*; class GraficButoaneRadio { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Butoane radio"); f.setVisible(true); } } class Fereastra extends JFrame { private JTextField jtfAfisare; private JButton jbExit; private JRadioButton radio1,radio2,radio3; //constructor public Fereastra() { setSize(600,400); addWindowListener(new FereastraListener()); //construieste componente: jtfAfisare=new JtextField ("Afisare cu diferite marimi de fonturi !"); jtfAfisare.setEditable(false) ; radio1= new JRadioButton("font mic"); radio1.setSelected(true);
Aplicații grafice
120
radio2= new JRadioButton("font mediu");
radio2.setSelected(false);
radio3= new JRadioButton("font mare"); radio3.setSelected(false); ButtonGroup radioGrup= new ButtonGroup(); radioGrup.add(radio1); radioGrup.add(radio2); radioGrup.add(radio3); JPanel jpRadio= new JPanel(); //in JPanel nu este permisa adaugarea de ButtonGroup ! jpRadio.add(radio1); jpRadio.add(radio2); jpRadio.add(radio3); jbExit=new JButton("Exit"); JPanel jpExit=new JPanel(); jpExit.add(jbExit); //Container intermediar: JPanel jp=new JPanel(); jp.setLayout(new GridLayout(2,1)); jp.add(jpRadio); jp.add(jpExit); ClasaButoaneListener bL =new ClasaButoaneListener();
jbExit.addActionListener(bL); radio1.addActionListener(bL); radio2.addActionListener(bL); radio3.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jtfAfisare,"Center"); c.add(jp,"South"); //Scriem textul in jtfAfisare cu font mic (marimea 12): jtfAfisare.setFont(new Font("MonoSpaced",Font.ITALIC,12)); jtfAfisare.repaint(); } //inner class: private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev)
Aplicații grafice
121
{
System.exit(0);
} }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ Object sursa=ev.getSource(); if(sursa==jbExit)System.exit(0); else{ String tipFont="MonoSpaced"; int stilFont=Font.ITALIC; int marimeFont=12; if(radio2.isSelected())marimeFont=18; else if(radio3.i sSelected())marimeFont=24;
jtfAfisare.setFont(new Font(tipFont,stilFont,marimeFont)); jtfAfisare.repaint(); } } } }//end class Fereastra
7. Să se scrie o aplica ție în care se afi șează o fereastr ă ce conține
trei componente grafice: JTextField pentru introducerea unui text, JTextField pentru afi șare și un buton JButton pentru ie șirea din
program. Atunci când se apas ă tasta ENTER în primul JTextField,
textul introdus acolo va fi c opiat în al doilea JTextField.
import java.awt.*;
import java.awt.event.*; import javax.swing.*; import java.util.*; class GraficCopiereText { public static void main(String args[]) { Fereastra f=new Fereastra(); f.setTitle("Copiere text"); f.setVisible(true);
Aplicații grafice
122
}
}
class Fereastra extends JFrame { private JTextField jtfDate,jtfAfisare; private JButton jbExit; //constructor public Fereastra() { setSize(600,400); addWindowListener(new FereastraListener()); //construieste componente: jtfDate=new JTextField(40); jtfDate.setEditable(true); jtfDate.addKeyListener(new ClasaTasteListener()); JPanel jp1=new JPanel(); jp1.add(jtfDate); jtfAfisare=new JTextField(40); jtfAfisare.setEditable(false); JPanel jp2=new JPanel(); jp2.add(jtfAfisare); jbExit=new JButton("Exit"); JPanel jp3=new JPanel(); jp3.add(jbExit); //Container intermediar: JPanel jp=new JPanel(); jp.setLayout(new GridLayout(3,1)); jp.add(jp1); jp.add(jp2); jp.add(jp3); ClasaButoaneListener bL =new ClasaButoaneListener();
jbExit.addActionListener(bL); //Containerul final: Container c=this.getContentPane(); c.add(jp,"South"); }
Aplicații grafice
123
//inner class:
private class FereastraLis tener extends WindowAdapter
{ public void windowClosing(WindowEvent ev) { System.exit(0); } }//end inner class //inner class: private class ClasaButoaneList ener implements ActionListener
{ public void actionPer formed(ActionEvent ev)
{ System.exit(0); } } private class ClasaTasteLi stener extends KeyAdapter
{ public void keyPressed(KeyEvent evt) { // S-a tastat ENTER ? if (evt.getKeyChar() == '\n') { jtfAfisare.setText(jtfDate.getText()); } } } }//end class Fereastra
Bibliografie
1. Georgescu H., Introducere in universul Java, Ed. Tehnica, 2002
2. Keogh J., Java fara mistere, Ed. Rosetti Educational, 2006
3. Tanasa S., Olaru C., Andrei S. – Ja va de la 0 la expert, Ed. Polirom,
2003 4. Ene Al.- Programare orientat ă pe obiecte, note de curs,
Universitatea din Pite ști, 2007
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Java este o tehnologie lansat ă de compania Sun Microsystems [607569] (ID: 607569)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
