Documente Academic
Documente Profesional
Documente Cultură
Ecosistemul Java
1. Tool-uri necesare
Instalarea uneltelor pentru dezvoltare
Pentru a putea dezvolta aplicaţii în Java, este nevoie de:
JDK - Acesta conține tot ce conține JRE, în plus vine și cu alte tool-uri
(instrumente) pentru dezvoltarea de aplicații java, cum ar fi compilatorul,
împachetatorul etc.
4. Compilare si Executie
Compilarea şi execuţia codului
Compilarea fișierelor
Pentru a rula un program scris de noi, el trebuie mai întâi compilat, adică transformat din
text în instrucțiuni (cod binar) pe care să le înțeleagă calculatorul.
5. Jar
Împachetarea programelor în arhive .jar
Dacă aplicația noastră are mai multe clase, pentru a putea rula (în afara Eclipse-ului), ele
trebuie împachetate într-un singur fișier, un fel de arhivă, care are extensia .jar.
Acest lucru îl face împachetatorul – jar.exe tot dinC:\Program
Files\Java\jdk1.8.0_31\bin Avem opțiunea de a include
în programulMeu.jar atât fișierele .class, cât și fișierele cu codul sursă .java.
În plus, se mai crează un fișier în interiorul acestui programulMeu.jar care specifică
în ce clasă (adică în ce fișier.class) se află metoda public static void main
(String[] args)pentru ca JVM să știe de unde să înceapă să ruleze o aplicație.
Eclipse face acest lucru automat când dăm RUN, dacă aplicația noastră are mai multe
clase. Fișierul programulMeu.jar rulează pe java.exe la fel ca Main.class.
Putem exporta din Eclipse fișiere executabile .jar.
6. Command Prompt
Rularea aplicaţiilor Java din command prompt
1. Scrierea codului în Notepad - fișierul JademyTest.java
2. Compilarea fișierului: javac JademyTest.java (cu javac.exe)
3. Executarea: java JademyTest (cu java.exe)
javac.exe este compilatorul.
java.exe rulează aplicația.
A se folosi Notepad sau Notepad++. Nu folosiți Microsoft Office Word sau Apache Open
Office, întrucât acestea adaugă caractere speciale pentru formatarea textului.
Salvați fișierul într-un folder, având grijă ca denumirea fișierului să fie identică cu
denumirea clasei, ținând cont și de case (case sensitive), și cu extensia .java.
Dacă extensia .txt nu se vede, pentru a o înlocui, atunci trebuie să mergeți la
meniul Tools al folderului > Folder options și să debifați căsuța cu Hide
extensions for known files.
Deschideți Command promptul lui Windows: Start button > scrieți cmd.
Alegeți cmd.
Pentru ce facem noi aici nu este cazul, dar în alte situații, va fi nevoie să rulați cmd ca
administrator. Click dreapta, run as administrator.
Aici vom rula programele java.exe și javac.exe din JDK. Atenție, chiar dacă există
un java.exe și în folderul JRE\bin, javac.exe pentru compilare nu există decât
în JDK\bin.
Pentru a rula java și javac este necesar ca acestea să fie recunoscute de cmd. Încercați
comenzile java și javac pe rând. Dacă acestea funcționează, poți merge mai departe. Dacă
primești o eroare, atunci vezi secțiunea de mai jos legată de repararea acestei erori.
Va trebui acum să ajungi la locația unde ai salvat fișierul .java. Pentru aceasta poți
folosi următoarele comenzi:
folosind c sau d poți schimba partiția
cd .. - merge cu un folder mai sus
cd denumireFolder înseamnă change directory (schimbă folderul)
Acum putem compila și rula programul scris mai devreme folosind comenzile javac
JademyTest.java, respectiv java JademyTest.
Prima comandă trebuie să fie javac, iar numele fișierului trebuie să conțină și extensia. A
doua comandă trebuie să fie java, urmată de numele fișierului fără extensie - fișierul rulat
este cel cu extensia .class.
Adăugarea programelor java și javac în sistem
În cazul în care ai erori la rularea comenzilor java sau javac, acestea trebuie adăugate
la calea de sistem (Environment variables / Path variable). După modificarea acestora, va
trebui să închizi și să deschizi din nou consola.
Aici puteți vedea că în sistemul de operare sunt definite o serie de variabile. Noi vom
merge însă la System variables. Caută variabila PATH, selecteaz-o, Edit.
Și aici, mare atenție !!! Nu șterge nimic !!! Dacă ștergi ceva, s-ar putea ca unele programe
să nu vă mai ruleze.
În funcție de varianta de Windows - dacă variabila PATH este afișată pe o linie sau într-
un table, va trebui la sfârșit de tot să adaugi ; (punct și virgulă după ultima valoare dacă
nu există, dar sunt scrise în linie), și introdu toată calea către folderul bin din JDK.
c:\Program Files\java\jdk1.8.0_31\bin;
7. Cuvinte Cheie
Cuvinte cheie Java
Mai jos este o listă de cuvinte cheie predefinite în Java. Acestea nu pot fi folosite ca
identificatori în programe. (Nu le putem folosi ca denumiri de variabile, clase, metode).
* not used
** added in 1.2
1. Primul Program
1. Să se afişeze următoarele mesaje, în acelaşi program:
1 Hello World!
2 Hello Again
3 I like typing this.
4 This is fun.
5 Yay! Printing.
6 I'd much rather you 'not'.
7 I "said" do not touch this.
2. Să se mai afişeze încă o linie la programul anterior.
Exerciţii
1. Scrieţi un program care afişează următoarele caractere:
1 *****
2 *****
3 *****
4 *****
5 *****
Solutie
1 System.out.println("*****");
2 System.out.println("*****");
3 System.out.println("*****");
4 System.out.println("*****");
5 System.out.println("*****");
Solutie
1 System.out.println("+-------------------------------------------+");
2 System.out.println("| #### |");
3 System.out.println("| #### |");
4 System.out.println("| #### |");
5 System.out.println("| |");
6 System.out.println("| Bill Gates |");
7 System.out.println("| 1 Microsoft Way |");
8 System.out.println("| Redmond, WA 98104 |");
9 System.out.println("| |");
10 System.out.println("+-------------------------------------------+");
3. Aritmetică şi Comparaţii
Operatori aritmetici şi de comparaţie:
+ plus
- minus
* înmulţit
/ împărţit
% modulo (restul împărţirii)
== egal cu
!= diferit de
< mai mic ca
> mai mare ca
⇐ mai mic ca sau egal cu
>= mai mare ca sau egal cu
Exemplu
1 System.out.println( "I will now count my chickens:" );
2 System.out.println( "Hens " + ( 25 + 30 / 6 ) );
3 System.out.println( "Roosters " + ( 100 - 10 * 3 % 4 ) );
4 System.out.println( "Now I will count the eggs:" );
5 System.out.println( 3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6 );
6
7
8 System.out.println( "Cat face? " + ( -1 % 4 ) );
9 System.out.println( "Care este ordinea operatiilor? " + ( 6 + -11 / 4
10 );
11 System.out.println( "Care este ordinea operatiilor? " + ( 6 + -11 % 4
12 );
13
14
15 System.out.println( "Is it true that 3 + 2 < 5 - 7?" );
16 System.out.println( 3 + 2 < 5 - 7 );
17 System.out.println( "What is 3 + 2? " + ( 3 + 2 ) );
18 System.out.println( "What is 5 - 7? " + ( 5 - 7 ) );
19 System.out.println( "Oh, that's why it's false." );
20 System.out.println( "How about some more." );
21 System.out.println( "Is it greater? " + ( 5 > -2 ) );
22 System.out.println( "Is it greater or equal? " + ( 5 >= -2 ) );
23 System.out.println( "Is it less or equal? " + ( 5 <= -2 ) );
24
25 System.out.println( "Hai sa facem suma lui 3 + 2: " + 3 + 2 );
System.out.println( "De ce nu a iesit?");
System.out.println( 3 + 2 + " Ce s-a intamplat acum?" );
2. Comentarii
Comentarii
Indentarea codului
Instrucţiuni vide
Linii goale
Folosirea ctrl+shift+F în Eclipe pentru aşezarea codului
Comentarii
Pe un singur rând: //
Pe mai multe rânduri: /*…*/
Pentru documentaţie (javadoc): /** … */
Exemplu
1 public class CommentsAndSlashes {
2
3 /**
4 The entry point of a program
5 */
6
7 public static void main (String[] args) {
8
9 // A comment, this is so you can read your program later.
10 // Anything after the // is ignored by Java.
11
12 /* This is a multiline comment
13 And will be totally ignored */
14 /*This is also a multiline comment on a single line*/
15
16 System.out.println( "I could have code like this." ); // and
17 ignored.
18
19 // You can also use a comment to "disable" or comment out a
20 // System.out.println("This won't run.");
21
22 System.out.println( "This will run." );
23 }
}
Pentru documentație Javadoc:
1 /**
2 * Write a description of class VictoryScreen here.
3 *
4 * @author (your name)
5 * @version (a version number or a date)
6 */
7 public class Test {
8 …
9 }
În Java există mai multe tipuri de date, dar pentru moment vom folosi doar int, double,
boolean şi String.
int
folosit pentru numere întregi
poate lua valori între aproximativ -2 miliarde şi +2 miliarde
valoarea implicită este 0
exemplu: int a = 10000, b = -235;
double
folosit pentru numere reale (cu virgulă)
valoarea implicită este 0.0
exemplu: double x = -34.5221, k = 123.45;
boolean
folosit pentru a reţine valorile de adevăr true sau false
valoarea implicită este false
exemplu: boolean first = true;
String
folosit pentru a reprezenta şiruri de caractere (text)
valoare unui String trebuie să fie înconjurată de “”
exemplu: String name = “Vasile”;
putem avea şi şiruri goale: String emptyString = “”;
Folosirea variabilelor
declarare: int x;
iniţializare: x = 20;
atribuire cu operatorul de atribuire: x = 145;
afişare (sau alte operaţii): System.out.println(x);
Operatorul de atribuire "="
int i = 45;
int j = 6 + 5;
int k = i + j;
int m = 056; (baza 8)
int n = 0x5f; (baza 16)
Exemplu 1
1 public class VariablesAndNames {
2
3 public static void main(String[] args) {
4
5 int cars, drivers, passengers, cars_not_driven, cars_driven;
6 double space_in_a_car, carpool_capacity, average_passengers_p
7
8 cars = 100;
9 space_in_a_car = 4.0;
10 drivers = 30;
11 passengers = 90;
12 cars_not_driven = cars - drivers;
13 cars_driven = drivers;
14 carpool_capacity = cars_driven * space_in_a_car;
15 average_passengers_per_car = passengers / cars_driven;
16
17 System.out.println( "There are " + cars + " cars available."
18 System.out.println( "There are only " + drivers + " drivers availab
19 System.out.println( "There will be " + cars_not_driven + " em
20 System.out.println( "We can transport " + carpool_capacity + "
21 System.out.println( "We have " + passengers + " to carpool to
22 System.out.println( "We need to put about " + average_passeng
23 car." );
24 }
}
Assignment
1. Ce reguli învăţate sunt încălcate în codul anterior?
2. De obicei, variabilele se vor declara câte una pe linie, pentru lizibilitate. Cum se va
schimba codul?
3. Pentru variabila space_in_car, valoarea este 4.0. Ce se întâmplă dacă o schimbăm la
valoarea 4?
2. Identificatori. Literali
Exemplu 2
1 public class MoreVariablesAndPrinting {
2
3 public static void main(String[] args) {
4
5 String myName, myEyes, myTeeth, myHair;
6 int myAge, myHeight, myWeight;
7
8 myName = "Zed A. Shaw";
myAge = 35; // not a lie
9
myHeight = 74; // inches
10
myWeight = 180; // lbs
11
myEyes = "Blue";
12
myTeeth = "White";
13
myHair = "Brown";
14
15
System.out.println( "Let's talk about " + myName + "." );
16
System.out.println( "He's " + myHeight + " inches tall." );
17 System.out.println( "He's " + myWeight + " pounds heavy." );
18 System.out.println( "Actually, that's not too heavy." );
19 System.out.println( "He's got " + myEyes + " eyes and " + myHair
20 System.out.println( "His teeth are usually " + myTeeth + " depend
21 coffee." );
22
23 // This line is tricky; try to get it exactly right.
24 System.out.println( "If I add " + myAge + ", " + myHeight + ", an
25 + " I get " + (myAge + myHeight + myWeight) + "." );
26 }
27 }
Assignment
1. Ştergeţi cuvântul “my” din faţa variabilelor. Ce altceva ar trebui să mai schimbaţi?
2. Convertiţi inches şi pounds în cm şi kg folosind variabile. Căutaţi metodele de conversie
pentru acestea şi afişaţi ambele variante.
3. Explicaţi diferenţa de afişare în următorul cod:
1 int num = 4;
2 System.out.println(num);
3 System.out.println(“num”);
4 System.out.println(4);
Identificatori
Toate componentele Java necesită nume. Numele folosite pentru clase, variabile şi
metode sunt identificatori. În Java, există câteva noţiuni care trebuiesc reţinute pentru
identificatori:
byte, int, long, şi short pot fi exprimaţi în baza 10 (zecimal), baza 16 (hexazecimal) sau
baza 8 (octal). Prefixul 0 este folosit pentru a indica un prefix pentru numerele în octal,
iar 0x este prefixul ce indică literalii în hexazecimal. De exemplu:
Literalii de tip String sunt specificaţi ca şi în alte limbaje de programare prin scrierea
unor secvenţe de caractere între perechi de ghilimele. Exemple de literali String:
"Hello World"
"two\nlines"
"\"This is in quotes\""
Literalii de tip String sau char pot conţine orice caractere în Unicode. De exemplu:
Exerciţii
1. Folosind 3 variabile, afişaţi următorul text. Variabilele sunt subliniate. Alegeţi tipul
corespunzător.
2. Folosind 2 variabile, una pentru nume şi una pentru anul naşterii, să se printeze un
mesaj. Să se aleagă tipuri de date corespunzătoare şi nume potrivite pentru variabile.
Mesajul va arăta ca în exemplul de mai jos:
Tipuri de date
Numere întregi: byte, short, int, long
sunt folosite pentru numerele întregi
fiecare are un alt număr de biţi, în funcţie de valoarea pe care vrem s-o reţinem
pentru a putea scrie numere în octal, în Java folosim prefixul 0
pentru a putea scrie numere în hexazecimal, în Java folosim prefixul 0x sau 0X
byte
Datele de tip byte sunt numere întregi cu semn pe 8 biţi (1 octet).
Valoarea minimă este -128 (-27 )
Valoarea maximă este 127 (inclusiv) (27 -1)
Tipul de date byte este de obicei folosit pentru economisirea spaţiului în vectori mari, de
obicei în locul numerelor întregi, având în vedere că un byte este de 4 ori mai mic decât
un int.
Valoarea implicită este 0
Exemple: byte a = 100, byte b = -50
short
Datele de tip short sunt numere întregi cu semn pe 16 biţi (2 octeți = 2 bytes).
Valoarea minimă este -32,768 (-215 )
Valoarea maximă este 32,767(inclusiv) (215 -1)
Tipul de date short poate fi folosit de asemenea pentru a economisi spaţiul precum byte-
ul. Un short este de 2 ori mai mic decât un int.
Valoarea implicită este 0.
Exemple: short s= 10000, short r = -20000
int
Datele de tip int sunt numere întregi cu semn pe 32 de biţi (4 octeți = 4 bytes).
Valoarea minimă este - 2,147,483,648 (-231 )
Valoarea maximă este 2,147,483,647 (inclusiv) (231 -1)
Este folosit ca tipul implicit pentru numere întregi dacă nu există probleme în ce privește
spaţiul de memorare.
Valoarea implicită este 0.
Exemple: int a = 100000, int b = -200000
long
Datele de tip long sunt numere întregi pe 64 de biţi (8 octeți = 8 bytes).
Valoarea minimă este -9,223,372,036,854,775,808 (-2^63)
Valoarea maximă este 9,223,372,036,854,775,807 (inclusiv) (2^63 -1)
Acest tip este folosit când sunt necesare numere mai mari decât int.
Valoarea implicită este 0L.
Exemple: long a = 100000L, long b = -200000L
Numere reale: float, double
Se poate folosi caracterul E sau e pentru notaţiile ştiinţifice
float
Datele de tip float sunt numere reale de simplă precizie pe 32 de biţi (4 octeți).
Acest tip de date este de obicei folosit pentru economisirea spaţiului in vectorii de
numere reale.
Valoarea implicită este 0.0f.
Datele de tip float nu sunt niciodată folosite pentru valori precise, cum ar fi banii.
Exemple: float f1 = 234.5f
double
Datele de tip double sunt numere reale pe 64 de biţi (8 octeți).
Acest tip de date este folosit ca tipul implicit pentru numere reale.
Datele de tip double nu sunt niciodata folosite pentru valori precise, cum ar fi banii.
Valoarea implicită este 0.0d.
Exemple: double d1 = 123.4
boolean
Datele de tip boolean reprezintă un bit de informaţie.
Există doar două valori posibile: true şi false.
Acest tip de date este folosit pentru flag-uri simple care urmăresc condiţii adevărate/false.
Valoarea implicită este false.
Exemple: boolean one = true
char
Folosit pentru reprezentarea unui singur caracter, codat în Unicode; datele de
tip charsunt caractere Unicode pe 16 biţi (2 octeți); fiecare caracter are un echivalent
numeric, astfel îl putem reprezenta pe un număr de biţi
ASCII este un subset al Unicode cu doar 128 de valori
Valoarea minimă este '\u0000' (sau 0).
Valoarea maximă este '\uffff' (sau 65,535 inclusiv).
Acest tip de date este folosit pentru a reţine orice caracter.
Exemple: char letterA ='A'
Valoare
Tip Conţinut implicită Mărime Gama de valori
număr întreg cu 32 biţi sau 4 -231 (-2 147 483 648) → 231 - 1 (2 147 483
int semn 0 octeţi 647)
număr întreg cu 64 biţi sau 8 -263 (-9 223 372 036 854 775 808 ) → 263 - 1
long semn 0 octeţi (9 223 372 036 854 775 807)
Assignments
1. Să se declare şi să se afişeze diferitele tipuri de date. Să se citească câte 2 valori de la
tastatură pentru fiecare tip. Să se introducă valori foarte mari (> 2 miliarde) sau foarte
mici (-2 miliarde) pentru toate. Ce observaţi?
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
System.out.println("Care este numele orasului?");
3
String numeOras = keyboard.next();
4
5
System.out.println(numeOras + " este capitala tarii? (raspundeti tru
6
false)");
7
boolean isCapitalCity = keyboard.nextBoolean();
8
9
System.out.println("Cati locuitori are?");
10
int numberOfCitizens = keyboard.nextInt();
11
12
System.out.println("Ce venit mediu per capita are?");
13 int incomePerCitizen = keyboard.nextInt();
14
15 boolean isMetropolis = (isCapitalCity == true && numberOfCitizens > 1
16 || (numberOfCitizens > 200_000 && incomePerCitizen > 72_000)
17
18 /* puteti folosi underscore (_) pentru a separa grupuri de cifre pen
19 usoara, fara a influenta rezultatul operatiilor */
20
21 System.out.println(numeOras + " este metropola? " + isMetropolis);
1 R = P (l / A)
Unde:
Iar
1 A = pi*r*r \\ D = 2*r
Unde:
r – raza firului pentru care se cere rezistenţa
D – diametrul firului pentru care se cere rezistenţa
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 //valori cerute de la user
4 double p; //rezistivitatea
5 double l; //lungimea
6 int d; //diametrul firului in mm
7
8 //valori calculate intern
9 double a; //aria
double raza; //raza cercului
10
double lmm; //lungimea in mm
11
double dm; //diametrul in metri
12
13
//introducere valori
14
System.out.println("Care este rezistivitatea?");
15
p = keyboard.nextDouble(); // pentru a introduce valoarea "P = 1.7
16
"1.78e-8"
17
18
System.out.println("Care este lungimea firului (metri)?");
19
l = keyboard.nextDouble();
20
21 System.out.println("Care este diametrul firului (mm)?");
22 d = keyboard.nextInt();
23
24 //calculare valori interne
25 lmm = l/1000;
26 dm = d*1000;
27 raza = dm/2;
28 a = Math.PI*(Math.pow(raza, 2));
29
30 //calcul rezultat
31 double rez = p*(lmm/a);
32 System.out.println("Rezistivitatea este " + rez);
33
34 keyboard.close();
5. Literali: numerici
În funcție de sistemul de numerație în care sunt scriși:
zecimal: 10, 44, 56, 39
conține cu caractere între 0 și 9
hexazecimal: 0X4fa, 0x334B
conține caractere între 0 și 9, între a și f sau între A și F
începe cu 0x sau 0X
octal: 0723, 044
conține caractere între 0 și 7
începe cu 0
binar: 0B10001111001
conține caracterele 0 sau 1
începe cu 0b sau 0B
Cu _:
pentru vizibilitatea numerelor foarte mari
În format științific folosind reprezentarea cu E sau e.
Cu sufix pentru:
6. Literali: caracter
ASCII și Unicode
Inițial americanii au inventat sistemul ASCII care înseamnă American Standard Code for
Information Interchange. El avea 128 de caractere codificate în numere de la 0 la 127.
Erau principalele litere mari, mici, cifre și alte câteva semne.
Ulterior ASCII a fost extins la 256 de caractere, adică de la 0 la 255.. (=28 , adică
înmagazinarea informației în fix 8 biți = 1 octet.)
Cu timpul, însă, s-a dovedit a fi prea mic, și a apărut sistemul Unicode pe 2 bytes (2
octeți) de la 0 la 65535, adică 216 caractere. Java folosește exact acest sistem. Primitiva
char ocupă exact 2 octeți și are exact 65536 caractere, adică de la 0 la 65535.
char ch1 = 'J'; se mai poate scrie și ca
1
ch1 = 74; în sistem zecimal (~ să zicem la asta se referea proble
2
ASCII)
3
Putem atribui valori lui ch1 până la maxim 65535.
4 ch1 = '\u004a'; în sistem hexazecimal (Unicode )
Dar cele trei înseamnă exact același lucru, și anume litera J mare.
Următorul cod System.out.println(ch1); va afișa J.
Ca să obținem valoarea numerică a ei:
x", (int)a);
Ideea e că ambele înseamnă reprezentări diferite ale aceleiași valori. Aveți mai jos un link
cu tabelul caracterelor. Ascii Table - ASCII character codes and html, octal, hex and
decimal chart conversion www.asciitable.com
Eclipse în Windows nu afișează caracterele a căror valoare numerică depășește 127. O
afișează ca semnul intrebarii '?'.
Dar nu este eroare. Pur și simplu, Eclipse nu poate afișa alte caractere.
Exemplu:
char caracter = 65000; //MERGE!
1
System.out.println(caracter); => Eclipse afișează semnul întrebării, p
2
reală.
Sub Ubuntu afișează toate caracterele.
Java, însă, a rămas pe 2 bytes în ce îl privește pe char, (unicodul vechi) și se pare că s-a
îngreunat puțin transformarea între char si unicode-ul actual, pe 3 bytes.
1
import java.util.Scanner;
2
3
public class Exemplu3 {
4
5
public static void main(String[] args) {
6
7 String s = "Un șir de caractere \u0046 care conține \ufa4b
8 unicode";
9 System.out.println(s);
}
}
Assignments
Să se definească două caractere. Să se afișeze valorile lor în Unicode și în ASCII, apoi să
se facă suma acestora și să afișeze rezultatul. Ce diferențe observați? Care este deosebirea
între ASCII și Unicode?
1 int i = 32;
2 short sh = i; // eroare de compilare
3
4 long lo = 45L;
5 int i = lo; // eroare de compilare
6
7 double d = 45.67;
8 float f = d; // eroare de compilare
Dacă totuși dorim acest lucru, sau problema cere acest lucru, putem face cast (conversie
exclusivă, forțată) dar s-a putea să pierdem din informație sau să ne dea ceva total aiurea:
1 int i = 130;
2 byte b = (byte) i;
3 System.out.println(b); // -126
Orice operație între 2 byte sau între 2 short, rezultatul este un int (pentru a se asigura că
există destulă memorie pentru înmagazinarea rezultatului). De aceea:
Solutie
1 byte minut = (byte) 5000;
2 System.out.println(minut);
3
4 byte minut5 = (byte) (5000 + 5);
5 System.out.println(minut5);
6
7 System.out.println(minut+5); // suma dintre un byte si un int
8 // mai intai transforma byte-ul in int
2. Masa molară a unei substanțe (atom sau moleculă) este egală cu masa unui mol de
elemente. 1 mol = 1 gram = 6,023 x 1023 atomi / molecule (numărul lui Avogadro).
Ținând cont că masa molară a Oxigenului este 16, iar masa molară a Hidrogenului este 1,
și că formula apei este H2O, să se calculeze câte molecule sunt în 36 de grame de apă.
Solutie
1 double mol = 6.023E23; //atomi/molecule
2 double masaMolara = (36 / (16+1+1) )* mol;
3
4 System.out.println(masaMolara);
3. Care este raza unui copac care are circumferința de 5 metri? A se folosi constanta din
clasa java.lang.Math: Math.PI.
Solutie
int circumferinta = 5;
1
2
// double r = circumferinta / ( 2 * Math.PI ); // int cu double rezul
3
double r2 = circumferinta / 2.0 / Math.PI; // in loc de 2 punem 2.0 ca
4
double
5
6
// System.out.println(r);
7 System.out.println(r2);
4. Care este volumul unei mingi de fotbal știind că raza este de 20 de cm, iar formula
pentru volumul sferei este V = 4/3 pi r3?
Solutie
int r = 20;
1
double vol = 4.0/3.0*Math.PI*(Math.pow(20, 3)); // punem cu .0 pentr
2
double
3
4
System.out.println("Volumul mingii este " + vol);
5. În câți barili încap 1000 litri de petrol știind că volumul barilului este 159 litri? Câți
litri rămân pe afară?
Solutie
1 int litriTotal = 1000;
2 int volBaril = 159;
3
4 System.out.println( "Nr barili " + (litriTotal / volBaril) );
5
6 System.out.println( "Litri care raman = " + (litriTotal % volBaril));
6. Câte sticle de suc de 1,2 litri se vor împărți elevilor dacă s-au adus la școală 100 de
litri?
Solutie
1 double totalLitri = 100;
2 double litriSticla = 1.2;
3
4 int sticle = (int)(totalLitri / litriSticla); //punem in paranteze de
5 totalLitri
6
System.out.println(sticle); //sau sa declaram __sticle__ ca int;
Solutie
/* Metoda din clasa Math care calculeaza sinusul unui unghi
1 este Math.sin(unghi), unde unghiul este exprimat in radiani */
2
3 int grad1 = 30;
4 int grad2 = 50;
5
6 double grad1Rad = (grad1 * Math.PI) / 180; // valoarea unghiului in
7 radiani
8 double grad2Rad = (grad2 * Math.PI) / 180; // valoarea unghiului in
9 radiani
10
11 System.out.println("30 grade inseamna " + grad1Rad + " radiani.");
12 System.out.println("50 grade inseamna " + grad2Rad + " radiani.");
13
14 System.out.println("Sinus de 30 grade inseamna " + Math.sin(grad1Rad)
System.out.println("Sinus de 50 grade inseamna " + Math.sin(grad2Rad)
Solutie
1 int zar = (int)( Math.random() * 6 + 1);
2
3 /* De ce inmultim cu 6 si de ce adunam 1? De ce facem cast la int ?
4 Cautati ce face metoda Math.random() */
5
6 System.out.println(zar);
Solutie
1 System.out.println("Radical din 2 este " + Math.sqrt(2));
10. Câte grade (fracțiuni din Pi) reprezintă arcsinusul lui (radical din 3) / 2?
Solutie
1 double x = Math.sqrt(3)/2;
2 /* Rezultatul lui Math.sqrt() este un double,
3 iar rezultatul oricarei operatiei ce contine un
4 double va fi tot un double */
5
6 System.out.println("Arcsinus este " + Math.asin(x));
11. Câți litri încap într-un cub cu latura de 10 cm, știind că 1 litru = 1000 cmc ? Dar într-
un cub cu latura de 25 de cm?
12. În București, media precipitațiilor anuale este aprox 550 mm (55 cm). Câți litri se
strâng într-un metru pătrat într-un an?
Solutie
1 System.out.println(Math.log10(1000));
14. Dar logaritm în baza 2 din 1024? Căutați pe Internet formula de transformare din
logaritm în baza 10 sau în baza n - în baza 2.
J=0
A=1
V=2
A=3
Deci, pentru un şir de 4 caractere, poziţiile lor vor fi notate de la 0 la 3. Pentru
generalizare:
lungime = n
poziţie minimă = 0
poziţie maximă = n-1
API-ul pentru String
Metode frecvent folosite din clasa String:
1 String string1 = "Avioane de hartie, iiee, ooee.";
2 char ch1 = string1.charAt(0); //primul caracter
3 String string2 = "Avioane de hartie";
4 String string3 = string1.concat(string2); //concatenare
5 boolean bool1 = string1.contains(string2); //daca il contine pe strin
6 boolean bool2 = string1.endsWith("ooee."); //daca se termina cu...
7 String string4 = "aVioAne de HarTIe";
8 boolean bool3 = string2.equals(string4); //daca sunt egale
9 boolean bool4 = string2.equalsIgnoreCase(string4); //daca sunt egale
10 int indexul = string1.indexOf('h'); //prima aparitie a lui h
11 int lungime = string1.length(); //numarul de caractere
12 String string5 = string1.replace('.', '!'); //inlocuieste
13 boolean bool5 = string1.startsWith("Avioane"); //daca incepe cu
14 String string6 = string1.substring(19, 23); // iiee
15 String string7 = string4.toLowerCase();
16 String string8 = string4.toUpperCase();
17 String string9 = " andra@avioanedehartie.ro ";
18 String string10 = string9.trim(); // eliminarea spatiilor albe de l
telefon etc
Clasele din Java SE (standard edition)
Accesati documentatia clasei String. In locul cifrei 8 din URL puteți tasta 7, 6 (etc.)
pentru a vedea API-ul de la versiunile vechi de Java.
Dacă daţi click pe Frame, veţi putea vedea toate clasele din Java SE. Nu vă
speriaţi. Nu veţi lucra decât cu o mică parte dintre ele.
Clasa String
Coloana din stânga arată return-type-ul respectivelor metode.
De exemplu:
Exerciții
Consultaţi API-ul pentru clasa String pentru a rezolva următoarele probleme:
1. Să se citească un şir de caractere de la tastatură. Să se afişeze primul caracter.
Solutie
1 Scanner cititorTastatura = new Scanner(System.in);
2
3 System.out.println( "Scrieti ceva" );
4
5 String ceva = cititorTastatura.next();
6
7 char primulCaracter = ceva.charAt(0);
8
9 System.out.println( "primul caracter este : " + primulCaracter );
2. Să se întrebe utilizatorul dacă mai vrea suc. Acesta trebuie să răspundă cu Y sau N. Să
se folosească o variabilă de tip char.
Solutie
Scanner keyboard = new Scanner(System.in);
1
2 System.out.println( "Mai vrei suc ? (Y/N) ");
3
4
String raspuns = keyboard.next();
5
6
char primaLitera = raspuns.charAt(0); // nu exista metoda nextChar()
7
Scanner
8
9
System.out.println(primaLitera == 'Y' ? "Vine sucul imediat!" : "Bine
Solutie
1 String a = "Carul";
2 String b = "Mare";
3
4 // metoda 1
5 System.out.println(a+b);
6
7 // metoda 2
8 System.out.println(a.concat(b));
4. Se citesc 2 şiruri de caractere. Să se verifice dacă primul şir îl conţine pe al doilea (Ex:
“Programare” conţine “mare”).
Solutie
1 String a = "programare";
2 String b = "mare";
3 boolean c = a.contains(b);
4
5 System.out.println(c);
Solutie
1 String a = "scoala";
2 String b ="ala";
3
4 boolean c = a.endsWith(b);
5
6 System.out.println( c );
Solutie
1 // Metoda 1: compareTo
2 /* Metoda compareTo returneaza 0 daca stringurile sunt egale,
3 un int negativ daca primul string este inaintea celui de-al
doilea (lexicografic), sau unul pozitiv daca primul este dupa
4
cel de-al doilea. Literele mari sunt inaintea celor mici.
5
*/
6
String a = "MARE";
7
String b = "MARE";
8
String c = "mare";
9
String d = "mArE";
10
11
int rez = a.compareTo(b);
12
System.out.println("MARE cu MARE: " + rez);
13
14 System.out.println("MARE cu mare: " + a.compareTo(c));
15 System.out.println("MARE cu mArE ignore case: " + a.compareToIgnoreCa
16
17
18 //Metoda 2: equals
19
20 boolean rezultatMetoda2 = a.equals(b);
21 System.out.println("Rezultat prin metoda 2: " + rezultatMetoda2);
22
23 System.out.println("Rezultat prin metoda 2 (ignore case): " +
24 a.equalsIgnoreCase(d));
Hint
1 Folosiţi metoda indexOf()
Hint
1 Folosiţi metoda length()
9. Să se înlocuiască un caracter dintr-un şir cu altul. Se vor citi pe rând şirul şi cele 2
caractere.
Solutie
String sirCaractereVechi ="abcxefg";
1
char caracterVechi = 'x';
2
char caracterNou = 'd';
3
String sirCaractereNou = sirCaractereVechi .replace(caracterVechi,
4
caracterNou);
5 System.out.println(sirCaractereNou );
10. Să se verifice dacă un şir de caractere începe cu un alt şir de caractere (Ex: Lanterna
începe cu Lan). Se vor citi cele 2 şiruri de caractere.
Hint
1 Folosiţi metoda startsWith()
Solutie
String a = "avion";
1 System.out.println(a.substring(1, 3)); // indexul 1 inclusiv, index
2 ("vi")
3
4 String b = "august";
5 System.out.println( b.substring(2) ); // de la indexul 2 pana la sf
("gust")
12. Să se convertească caracterele unui şir de caractere introdus în litere mari, apoi în
litere mici. (Ex: pentru “MiercuRi” se va afişa pe rând “MIERCURI” şi “miercuri”).
Solutie
1 String a = "MiercuRi";
2
3 System.out.println(a.toLowerCase());
4 System.out.println(a.toUpperCase());
13. Să se şteargă spaţiile albe de la începutul şi sfârşitul unui şir de caractere introdus. De
exemplu: “ asd ” va deveni “asd”.
Hint
1 Folosiţi metoda trim()
9. Tipuri de Date: Scanner
Citirea de la tastatură
Majoritatea programelor sunt făcute pentru a interacţiona cu utilizatorul, nu doar pentru
afişare. Cea mai simplă modalitate este să introducem ceva de la tastatură, apoi să
prelucrăm valorile şi să întoarcem rezultatul.
I/O:
Input = datele introduse în program
Output = datele afişate / rezultate din program
Pentru a folosi citirea de la tastatură, avem nevoie de un obiect al clasei Scanner. Pentru a
folosi această clasă, avem nevoie de următoarea instrucţiune în afara clasei, la începutul
fişierului:
1 import java.util.Scanner;
Astfel, îi vom spune programului că vrem să folosim un Scanner. Pentru a folosi Scanner-
ul, acesta trebuie declarat şi instanţiat ca şi restul variabilelor şi obiectelor. De exemplu:
1 import java.util.Scanner;
2
3 public class AskingQuestions {
public static void main(String[] args) {
4
Scanner keyboard = new Scanner(System.in);
5
6
int age;
7
String height;
8
double weight;
9
10
System.out.print( "How old are you? " );
11
age = keyboard.nextInt();
12
13
System.out.print( "How tall are you? " );
14
height = keyboard.next();
15
16 System.out.print( "How much do you weigh? " );
17 weight = keyboard.nextDouble();
18
19 System.out.println( "So you're " + age + " old, " + height + "
20 heavy." );
21 }
22 }
Clasa Scanner dispune de o serie de metode care permit introducerea datelor. Puteţi
consulta API-ul pentru detalii, cele mai uzuale fiind cele care încep cu “next”. Acestea
aşteaptă ca utilizatorii să introducă un anumit tip de dată de la tastatură.
Assignment 1
Schimbaţi programul anterior pentru a schimba citirea înălţimii cu două variabile: feet şi
inches. Acestea sunt reprezentate prin numere întregi.
Exemplu 2
1 import java.util.Scanner;
2
3 public class Exemplu2 {
4
5 public static void main(String[] args) {
6 Scanner scanner;
7 int numar;
8 double numarReal;
9 String sir;
10
11 // CTROL+SHIFT+O
12 scanner = new Scanner(System.in);
13 System.out.println("Introduceti un numar:");
14 numar = scanner.nextInt();
15 System.out.println(numar);
16
17 System.out.println("Introduceti un numar real:");
18 numarReal = scanner.nextDouble();
19 System.out.println(numarReal);
20
21 scanner.nextLine();
22
23 System.out.println("Introduceti un sir:");
24 sir = scanner.nextLine();
25 System.out.println(sir);
26
27 System.out.println("Introduceti un boolean:");
28 boolean b = scanner.nextBoolean();
29 System.out.println(b);
30
31 double suma = numar + numarReal;
32 System.out.println(suma);
33 }
34
35 }
Assignment 2
1. Cereţi utilizatorului să introducă de la tastatură 2 cuvinte şi 2 numere, iar la sfarşit
afişaţi un mesaj generic. Nu reţineţi valorile introduse în variabile. Singura variabilă de
care veţi avea nevoie va fi de tipul Scanner.
Solutie
Scanner keyboard = new Scanner(System.in);
1
2
System.out.println("Introduceti numele, prenumele, varsta si greutate
3
fiecare:");
4
System.out.println("Numele este " + keyboard.next()
5
+ ", prenumele este " + keyboard.next()
6
+ ", are varsta " +keyboard.nextInt()
7 + " ani si greutatea " + keyboard.nextDouble()+ "
2. Întrebaţi utilizatorul cum îl cheamă. Afişaţi numele şi întrebaţi câţi ani are. Afişaţi
vârsta şi întrebaţi cât câştigă. Afişaţi salariul. Folosiţi variabile corespunzătoare pentru
valorile introduse.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Cum te cheama?");
4 String nume = keyboard.next();
5
6 System.out.println("Salut " + nume + ". Cati ani ai?");
7 int varsta = keyboard.nextInt();
8
9 System.out.print("Ai " + varsta + "? Si cat castigi?");
10 int salariu = keyboard.nextInt();
11
12 System.out.print("Castigi " + salariu + " EUR... Bun!");
Solutie
Scanner keyboard = new Scanner(System.in);
1
2
System.out.println("Vom introduce trei numere si vom jumatatea sumei
3
System.out.println("Primul numar?");
4
double a = keyboard.nextDouble();
5
6
System.out.println("Al doilea numar?");
7
double b = keyboard.nextDouble();
8
9
System.out.println("Al treilea numar?");
10
double c = keyboard.nextDouble();
11
12 double suma = (a+b+c);
13 System.out.println("Suma lor este " + suma + ", iar jumatatea este "
14 suma/2);
6. Calculator IMC
Indicele de masă corporală (IMC) este frecvent folosit de către experții în sănătate și
nutriție, pentru a estima rata de grăsime a corpului uman.
Exemplu de Output:
1 Înălțimea ta (inches): 69
2 Greutatea ta (pounds): 160
3 IMC-ul tău este 23.625289
Apoi, introdu înălțimea în feet și inches (unități de măsură ale US).
1 Înălțimea ta (feet): 5
2 Înălțimea ta (inches): 9
3 Greutatea ta (pounds): 160
4
5 IMC-ul tău este 23.625289
7. Creați un calculator complex. Se introduc 2 numere de la tastatură și semnul operației
ce se dorește efectuată și se cere să se afișeze rezultatul. Exemplu de execuție:
Un tablou care are o singură dimensiune, cum e cel de mai sus mai poartă denumirea
de tablou unidimensional sau vector. Un tablou cu 2 dimensiuni poartă denumirea
de tablou bidimensional sau matrice.
1 10 15 43 28
2
3 24 35 46 30
4
5 18 -100 3 48
Tabloul de mai sus este o matrice cu 4 coloane (column) şi 3 linii (row), adică 4 pe 3.
Putem de asemenea spune că avem un tablou de tablouri, în care fiecare element este o
coloană, nu un singur număr. Fiecare element din acest tablou are de data aceasta 2
indecşi. Ordinea indecşilor este de obicei stabilită de programator şi menţinută în cod.
Istoric, ordinea folosită a fost aceea inversă coordonatelor geometrice. Primul index este
folosit pentru a indica rândul (axa Y) şi al doilea pentru a indica linia (axa X). De
exemplu, pentru 46 avem coordonatele (1,2). Mai exact, putem spune că avem următorul
vector:
1 A
2
3 B
4
5 C
Unde A este prima linie, B a doua şi C a treia. Deci mai întâi indicăm linia (adică
elementul A B sau C), apoi pentru vectorul obţinut trebuie să indicăm noua poziţie.
Coordonatele pot fi reprezentate ca în partea dreaptă.
0 1 2 3
1 // INITIALIZARI
int[] tablou1 = new int[3];
2
int tablou2[] = new int[3];
3
int[] tablou3 = { 5, 86, -123 }; // contine si valorile pentru
4
elemente
5
// pentru tablou3 suntem obligati sa folosim aceeasi instructiune
6
7
// VALORI ELEMENTE - CITIRE
8
Scanner s = new Scanner(System.in);
9
tablou1[0] = s.nextInt();
10
tablou1[1] = s.nextInt();
11 tablou1[2] = s.nextInt();
12
13 // AFISARE
14 System.out.println(tablou3[0]);
15 System.out.println(tablou3[1]);
16 System.out.println(tablou3[2]);
Tablouri unidimensionale
Imaginați-vă că vrem să citim dintr-o bază de date notele a 1000 de elevi, cu care am vrea
să facem diverse operații. Ar fi neconstructiv să declarăm 1000 de variabile care să
stocheze aceste note. Ce facem atunci?
Array-urile vin în ajutorul nostru. Declarăm o singură variabilă compusă din 1000 de
elemente:
1 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
2 | | | | | | | | | | | | | | | | | | |
3 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Array-urile sunt mecanisme logice, organizate, de stocare a datelor de același tip. Array-
urile oferă o flexibilitate enormă în programare. Datele din array-uri pot fi accesate,
procesate și sortate repede și eficient folosind bucle. Prin folosirea array-urilor și a
buclelor, se reduce numărul de instrucțiuni care trebuie scrise, precum și numărul de
instrucțuni pe care trebuie să le compileze compilerul.
Dacă construim un array de 1000 de elemente de tip int, calculatorul va aloca în spațiul
de memorie heap (din RAM) 1000 * 4 octeți (bytes) = 4000 bytes = aprox. 4kb.
Array-urile pot fi de
tip int, long, short, byte, float, double, char, boolean, String, sau de alt tip
de obiecte.
Sintaxă
1 int[] myArray = new int[1000];
2
3 // am construit un array cu 1000 de elemente de tip int.
4 // [] specifică că avem de a face cu o variabilă de tip array.
O variabilă de tip array mai poate fi definită și așa: int myArray[] = …. Totuşi,
această variantă este mai puțin folosită pentru că este mai puțin intuitivă.
int[] myArray este mai clară: se vede clar că am construit un array de tip int.
Un array mai poate fi inițializat și aşa:
1 /* 1 */ int [] arrayulMeu;
2 /* 2 */ arrayulMeu = new int[1000];
Dacă vom încerca să apelăm proprietatea (atributul) length al array-ului (care spune câte
căsuțe are array-ul): arrayulMeu.length vom obține o eroare de
tip NullPointerExceptionla rulare, pentru că nu putem apela o proprietate la ceva ce nu
există.
E un caz similar cu definirea unei variabile de tip primitivă fără să o inițializăm (ex:
doar double d;) și apoi să încercăm să o comparăm cu ceva (if (d == 0.234)
{….} - eroare de compilare).
La pasul 2, se alocă un spațiu de 1000 de int-uri (adică 4000 de bytes) în zona de
memorie HEAP, iar în variabila de pe STACK se trece adresa acestor 4000 de bytes:
Acum dacă apelăm System.out.println ( arrayulMeu.length ); vom obține
valoarea 1000.
length este un atribut (proprietate a obiectului array care returnează dimensiunea în
elemente a arrayului.)
A se observa: array-urile au o proprietate length, iar stringurile au
o metodălength().
Mai mult de atât, dacă arrayul este de tip int, fiecare element va fi inițializat la 0:
Dacă este de tip double, fiecare element va fi inițializat la 0.0 Dacă este de
tip boolean va fi inițializat la false. Dacă este de tip char va fi inițializat
la '\u0000' (adică 0).
De ce la 0? Păi, elementul de tip int nu este altceva decât un spațiu de memorie de 4
bytes, adică de 32 de biți. Biții nu pot fi decât 0 sau 1. Așadar fiecare bit trebuie să fie ori
0, ori 1. Ei vor fi puși pe 0.
Așadar, spațiul de memorie de 4
octeți 00000000|00000000|00000000|00000000 înseamnă numărul 0.
Dacă era 00000000|00000000|00000000|00000001 ar fi însemnat numărul 1, iar
dacă era 00000000|00000000|00000000|00000010 ar fi însemnat numărul 2. Dar
nu. Fiecare bit este făcut 0.
Așadar, avem 1000 de elemente de tip int, și fiecare element este inițializat la 0.
Să recapitulăm:
1 // Pasul 1
2 int [] arrayulMeu; //definire variabilă
3
4 // Pasul 2
5 arrayulMeu = new int[1000]; // instanțiere (crearea obiect în Heap)
6 // și inițializare fiecare element la 0.
Pasul 3 este popularea arrayului: acum populăm arrayul cu numere de tip int. Popularea
arrayului se face astfel:
1 arrayulMeu[0] = 2354;
2 arrayulMeu[1] = 35;
3 arrayulMeu[2] = 435;
4 // etc.
Elementele unui array sunt indexate pentru a putea fi ușor recunoscute. Și cum aproape
totul în java este 0-based, array-ul nefăcând excepție. Prima căsuță are indexul 0, a doua
1, a treia 2 etc.
Dacă scriem int contor = 212; se va crea doar o variabilă pe STACK care va
conține efectiv numărul 212.
Dar în cazul obiectelor, acestea se crează în Heap, iar variabila din STACK va conține o
adresă către locația de memorie din Heap unde este stocat obiectul. Dar ce se
întâmplă dacă construim un array de tip String?
În cazul acesta, flori[3]=null. Adică în flori[3] este stocată o informație de tip adresă
care nu pointează către nici un obiect, nu pointează către nimic.
Dacă acum facem ceva de genul: if (flori[3].equals(“sgsdf”)){…} aplicația va
crăpa la rulare, pentru că nu se poate compara ceva ce nu există. Vom obține o eroare de
tip NullPointerException.
Ca o recapitulare, dacă scriem doar String [] flori = new String [5]; , ce
face calculatorul? Crează o variabilă pe stack pe care o denumește flori despre care știe
că este de tip String[]. Apoi crează un obiect de tip array de tip String în heap care
va avea 5 elemente, iar în proprietatea (variabila) length pune 5, și apoi în
variabila flori de pe stack trece adresa obiectului din heap. Inițializează toate elementele
arrayului cu null (care este valoarea default pentru obiecte).
A nu confunda cu valorile default ale primitivelor care sunt: 0, 0L, 0.0F, 0.0, false,
'\0000'.
Assignment
În exemplul de mai sus, lasați pe flori[3] null, adică neinstanțializat.
Rulați codul:
1 if (flori[3] == null) {
2 System.out.println(true); //boolean
3 } else {
4 System.out.println(false); //boolean
5 }
6 System.out.println(flori[3]);
Arrayurile au dimensiune fixă. Odată construite, numărul lor de elemente nu mai
poate fi modificat. Nici proprietatea length nu mai poate fi modificată.
Pentru a introduce un element nou, se copiază elementele array-ului într-unul mai
mare, în care se va introduce şi elementul nou.
Exemplu:
Sintaxa
1 // DECLARATII
2 int[][] arr;
3 int[] t1[];
4 int t2[][];
5
6 // INITIALIZARI
7 int[][] t3 = { { 1, 6, 3 }, { 2, 3, 5 } };
8 // 1 6 3
9 // 2 3 5
10
11 // echivalent cu:
12 arr = new int[2][3];
13 arr[0][0] = 1;
14 arr[0][1] = 6;
15 arr[0][2] = 3;
16 arr[1][0] = 2;
17 arr[1][1] = 3;
18 arr[1][2] = 5;
19 arr[1][4] = 8;
20
21 //Initializarea arrayurile secundare o putem face si asa:
22 arr[0] = {1,6,3};
23 arr[1] = {2,3,5,8};
24
25 Scanner scanner = new Scanner(System.in);
26 t1 = new int[2][3];
27 for (int i = 0; i <t1.length; i++) { // pentru fiecare linie
28 for (int j = 0; j <t1[i].length; j++) { // pentru fiecare pozitie
29 linie
30 t1[i][j] = scanner.nextInt();
31 }
32 }
33
34 // pentru tablouri care nu sunt complete:
35 t2 = new int[2][]; // 2 linii si numar necunoscut de coloane
36 t2[0] = new int[4]; // 4 coloane pe prima linie
37 t2[1] = new int[2]; // 2 coloane pe a doua linie
38
39 // initializare ca mai sus: element cu element sau cu for
40 for (int i = 0; i <t2.length; i++) { // pentru fiecare linie
41 for (int j = 0; j <t2[i].length; j++) { // pentru fiecare pozitie
42 linie
43 t2[i][j] = scanner.nextInt();
44 }
45 }
46
47 // pentru afisare
48 for (int i = 0; i <t2.length; i++) { // pentru fiecare linie
49 for (int j = 0; j <t2[i].length; j++) { // pentru fiecare pozitie
50 linie
51 System.out.print(t2[i][j] + " ");
52 }
53 System.out.println();
54 }
55
56 for (int[] vector : t1) { // ia vectorul de pe fiecare linie
57 for (int element : vector) { // ia elementul din vector
58 System.out.print(element + " ");
}
System.out.println();
}
Exerciţii tablouri unidimensionale
1. Creaţi un vector cu 5 elemente, puneţi valori în toate poziţiile şi afişaţi elementele de
pe poziţiile 1, 2 şi 4.
Solutie
1 int[] numere = new int [5];
2 numere[0] = 20;
3 numere[1] = 30;
4 numere[2] = 60;
5 numere[3] = 71;
6 numere[4] = 92;
7
8 System.out.println(numere[1]+" "+numere[2]+" "+ numere[4]);
2. Să se găsească numărul cel mai mare dintr-un array creat anterior şi populat cu valori
random.
Solutie
1 int[]numere= new int[10];
2
// populare array
3
for (int i = 0; i < numere.length; i++) {
4
numere[i]=(int)(Math.random()*100);
5
// System.out.print(numere[i]+", "); // afisare pentru
6
verificare
7
}
8
9
// cautare cel mai mare numar; strategie:
10
// 1. Presupunem ca primul numar este cel mai mare
11 // 2. Parcurgem araryul
12 // 3. Daca gasim un numar mai mare il retinem pe acesta.
13
14 int max = numere[0];
15
16 for (int i = 0; i < numere.length; i++) {
17
18
if (numere[i] > max) {
19 max = numere[i];
20 }
21
22 }
23
24 System.out.println();
25 System.out.println("Numarul cel mai mare este " + max);
Solutie
Scanner sc = new Scanner(System.in);
1
2
System.out.println("Introduceti un numar: ");
3
int y = sc.nextInt();
4
5
int[] vector = new int[10];
6
/*
7
Nota: am creat un array cu marimea 10 doar pentru a testa programul
8
Pentru a fi mai rigurosi, ar trebui intai sa aflam numarul de cifre
9 apoi sa cream array-ul pentru aceasta marime .Asta se poate face pr
10 de ex:
11 1. Metoda 1: impartiri succesive la 10;
12 int contorCifre = 0;
13 while (numar != 0) {
14 y = y / 10;
15 contorCifre++;
16 }
17 int[] vector = new int[contorCifre];
18
19 2. Metoda 2: transformare in string si apelarea metodei length()
20 String str = String.valueOf(y);
21 int numarCifre = str.length();
22 int[] vector = new int[numarCifre];
23
24 */
25
26
27 int i = 0;
28 while (y != 0){
29 int ultimaCifra = y % 10;
30 y = y / 10;
31 vector[i] = ultimaCifra;
32 i++;
33 }
34 System.out.println("Afisam cifrele din array: ");
35 for (int j = 0; j < vector.length; j++) {
36 System.out.println(vector[j]);
37 }
ArrayList
Java pune la dispoziție o clasă din pachetul java.util care spre deosebire de array-ul
classic, își poate modifca dinamic dimensiunea. Elementele dintr-un ArrayList sunt
indexate asemenea unui array, fiind 0-based. Într-un ArrayList se pot adăuga elemente
sau scoate.
boolean add(E e) Appends the specified element to the end of this list.
boolean Appends all of the elements in the specified collection to the end of this
addAll(Collection<? list, in the order that they are returned by the specified collection's
extends E> c) Iterator.
boolean addAll(int
index, Collection<? Inserts all of the elements in the specified collection into this list, starting
extends E> c) at the specified position.
boolean contains(Object
o) Returns true if this list contains the specified element.
E get(int index) Returns the element at the specified position in this list.
Modifier and Type Method and Description
Returns the index of the first occurrence of the specified element in this
int indexOf(Object o) list, or -1 if this list does not contain the element.
Iterator<E> iterator() Returns an iterator over the elements in this list in proper sequence.
int lastIndexOf(Object Returns the index of the last occurrence of the specified element in this
o) list, or -1 if this list does not contain the element.
ListIterator<E>
listIterator() Returns a list iterator over the elements in this list (in proper sequence).
ListIterator<E> Returns a list iterator over the elements in this list (in proper sequence),
listIterator(int index) starting at the specified position in the list.
E remove(int index) Removes the element at the specified position in this list.
boolean remove(Object Removes the first occurrence of the specified element from this list, if it
o) present.
boolean
removeAll(Collection<?> Removes from this list all of its elements that are contained in the
c) specified collection.
protected void
removeRange(int Removes from this list all of the elements whose index is between
fromIndex, int toIndex) fromIndex, inclusive, and toIndex, exclusive.
boolean
retainAll(Collection<?> Retains only the elements in this list that are contained in the specified
c) collection.
E set(int index, E Replaces the element at the specified position in this list with the specifie
element) element.
List<E> subList(int Returns a view of the portion of this list between the specified fromIndex
fromIndex, int toIndex) inclusive, and toIndex, exclusive.
Modifier and Type Method and Description
void trimToSize() Trims the capacity of this ArrayList instance to be the list's current size.
1 //aduagarea de elemente
2 lista.add(computer1); //pe poziția 0
3 lista.add(”Alina”); //pe pozitia 1
4 lista.add(new String (”Ioana”)); // pe pozitia 2
5 lista.add(telefon1); //pe pozitia 3
1 //vizualizarea tuturor elementelor:
2 System.out.println(lista);
1 lista.clear(); //șterge toate elementele din listă.
Începând cu versiunea 6 Java, ArrayList-ul poate fi parametrizat (adică să conțină numai
elemente de un anumit tip)
Solutie
1 ArrayList<String> avioane = new ArrayList();
2
3 String avionBoeing = "Boeing";
4 String avionAirbus = "Airbus";
5 String avionConcorde = "Concorde";
6 String avionIAR = "IAR";
7 String avionCessna = "Cessna";
8 String avionLockheed = "Lockheed";
9
10 avioane.add(avionBoeing);
11 avioane.add(avionAirbus);
12 avioane.add(avionConcorde);
13 avioane.add(avionIAR);
14 avioane.add(avionCessna);
15 avioane.add(avionLockheed);
Solutie
1 System.out.println(avioane.get(3));
Solutie
1 String avionNou = "Spitfire";
2 avioane.set(3, avionNou); // sau avioane.set(3, "Spitfire");
3 System.out.println(avioane.get(3));
Solutie
System.out.println("avioane contine Cessna? " + avioane.contains(avio
1 );
2 System.out.println("avioane contine Cessna? " + avioane.contains("Ces
3 System.out.println("avioane contine Mustang? " + avioane.contains("Mu
);
Solutie
System.out.println("Index Lockheed = " +
1
avioane.indexOf(avionLockheed));
Solutie
1
avioane.remove(5);
2
System.out.println("Mai exista Lockheed? " +
avioane.contains(avionLockheed));
7. Ştergeți un avion.
Solutie
avioane.remove(avionCessna);
1 System.out.println("Mai exista Cessna? " + avioane.contains("Cessna")
2 );
1 int i = 45;
2 int m = 056; //baza 8
3 int n = 0x5f; //baza 16
2) rezultatul unei expresii:
1 int j = 6 + 5;
2 int k = i + j;
3 int l = (i * j) / 4;
3) un obiect:
1 int a;
2 int b = (a = 2); // a are acum valoare 2, iar b are si el valoarea 2
Nu putem însă să înlănțuim mai multe atribuiri dacă variabilele nu au fost deja
declarate
1 int a;
2 int c = b = a = 2; // nu compilează
Dar ar fi posibil dacă îl declarăm dinainte pe b:
1 int a;
2 int b;
3 int c = b = a = 2; //a, b și c vor avea toate valoarea 2
Aveți grijă la diferența dintre "==" și "=" în astfel de cazuri:
a) printează 1, nu o valoare booleană
1 int i = 2;
2 int j = 1;
3 System.out.println(i = j);
b) Se va printa ce este in if deoarece nu verificăm dacă booleanul este true, ci îi
atribuim valoarea true
1 if (x = 3) {
2 doSomething();
3 }
Operatori aritmetici
1. Binari
Adică necesită 2 operanzi:
+, -, *, /, %
Exemplu:
int c = a+b;
1
int d = a-b;
2
int d = a*b;
3
4
int e = a/b; //Dacă împărțirea dă rest, variabila stochează numai part
5
întreagă
6
7 int f = 17%5; (modulo)
8 //f stochează restul împărțirii lui 17 la 5, adică 2. 17 = 5 x 3 + 2.
2. Unari
De incrementare / decrementare
i++; e totuna cu i+=1; sau i=i+1;
i–-; e totuna cu i-=1; sau i=i-1;
Nu exista i** sau i//.
La fel și
1 a-=4 (scădem 4)
2 a*=6 (înmulțim cu 6)
3 a/=3 (împărțim la 3)
i *= 2; e totuna cu i = i * 2;
1
2
int b = 13; b%=5: la fel ca b = b%5; adică 3.
3
14. Operatori: relationali
Operatori de comparație
>, >=, <, ⇐, ==, !=
Se folosesc pentru a evalua o expresie.
1 if (a> 5) {...}
>= < ⇐ == != Ei returnează totdeauna doar true sau false. (adică un boolean)
!= înseamnă diferit de, Not Equal
1 if (a != b) {...}
2 if ( ch != 'e' ) {...}
== if (a ==0){..} este egal cu 0? Atenție nu confundați pe = (atribuire) cu == (verificare
egalitate)
if și while evaluează condiții. De aceea, putem spune if (true) sau if (false). if(false) nu
are sens. while (false) dă eroare de compilare.
d. nand, nor
nand: negaţia conjuncţiei
nor: negaţia disjuncţiei
P Q P nand Q P nor Q
Dacă notăm:
De asemenea, dacă urmărim negația situației în care x>0 și y>0, ne convine oricare din
celelalte trei situații:
int x > 0;
int y > 0;
Dacă urmărim negația acestei situații: ! (x > 0 & y > 0) = !(x>0) | !(y>0)
Adică x ⇐ 0 sau y ⇐ 0
2. Lui Timotei nu îi place căldura mare când soarele e arzător și iarba uscată. El speră să
Nu se întâmple ca atât cerul să fie senin și soarele arzător cât și iarba uscată. El speră, de
fapt, ca să fie niște norișori pe cer sau iarba să fie încă verde.
Dacă notăm:
0 0 0
0 1 0
1 0 0
0 0 0
0 1 1
1 0 1
OR (sau) v || | 1 1 1
- 0 1
NOT
(negaţie) ¬ ! ~ - 1 0
În tabela de mai sus, "1" este interschimbabil cu "Adevărat" (A), iar "0" cu "Fals" (F).
Assignment
Să se determine valoarea de adevăr ale următoarelor propoziţii. Rezolvaţi exerciţiile
mental sau pe hârtie, apoi verificaţi-le în Eclipse.
1. (7 < 5)
2. (4 < 12)
3. (3 <= 4) || (5 == 7)
4. (8 > 4) && (2 <= 3)
5. !(5 > 3)
6. ((8 / 3) == 2) && ( ! ((1 – 4) == -3))
7. (((7 - 8) > (5 - 7)) || true) && ((15 % 3 == 0) || !(7 < 9))
8. ((1 < 3) || !(5 > 4)) && false
3. Operatori logici
Când vrem să verificăm mai multe condiții odată.
! - NOT (invers)
& sau && - ȘI (ambele)
| sau || - ORI (cel putin unul)
^ - XOR (diferite)
boolean b = true;
1
if (b) {…..} // b e un boolean. El e deja true sau false. Nu are sens
2
boolean.
3
if ( !b ) {…..} // A se citi: if NOT b. Condiția se împlinește numai
1 if ( a > 0 & b < 0 ) {
2 ........
3 }
if (x >= -3 & x < 4) // Dacă e mai mare de -3 ȘI (AND) mai mic decât 4
1 logic
2 if (x <= -3 | x > 4) // Dacă e mai mic decât -3 SAU (OR) mai mare de 4
logic
1 if ( a > 10 & a < 20) { ... }
2 // echivalent cu
3 if (!(a < 10 | a > 20)) { ... }
if (!str1.equals("catel")) {...}
1
// Dacă str1 este diferit de "catel"
2
3
if (!(a > 5)) {...}
4
//Dacă "a" nu e mai mare decât 5. Sintactic corect, dar mai simplu est
5
if (a <= 5) {...}
6
7
boolean bool = true;
8
if ( bool ) {...}
9
// Dacă bool
10
// Nu are sens să scriem if (bool==true) căci bool e deja un boolean:
11 boolean.
12
13 if (!bool) {...}
14 // Dacă Not bool
15 // Nu are sens să scriem if (bool==false), bool e deja un boolean. If
true false
! false true
& true fals
| true false
^ true false
4. Operatori de scurtcircuitare
Operatorii && și ||.
Operatorii de scurtcircuitare se folosesc cel mai adesea din obișnuință, dar, totuși, uneori
ei sunt imperativ necesari pentru a sări, în anumite condiții, evaluarea celei de a doua
condiții, în sensul de a nu genera o eroare:
copiază un bit la rezultat dacă există în oricare dintre (a & b) rezultă 61 (0011
| (bitwise or) operanzi 1101)
copiază un bit la rezultat dacă există doar într-unul dintre (a ^ b) rezultă 49 (0011
^ (bitwise XOR) operanzi 0001)
operandul din stânga este mutat la stânga de numărul de a << 2 rezultă 240 ( 111
<< (left shift) biți precizați de operandul din dreapta 0000 )
int a = 5;
1
int b = 4;
2
System.out.println(a > b ? “a e mai mare decât b” : “a e mai mic de
3
b”);
E echivalent cu:
1 if (a > b) {
2 System.out.println(“a e mai mare decât b”);
3 } else {
4 System.out.println(“a e mai mic decât b”);
5 }
1 boolean bool = (a > b ? true : false);
E echivalent cu :
1 boolean bool;
2 if (a > b) {
3 bool = true;
4 } else {
5 bool = false;
6 }
1. If
Structura Condiţională
If
Este folosită pentru a verifica dacă o condiţie este adevarată. Sintaxa de bază este
următoarea:
1 if (conditie) {
2 instructiuni;
3 }
Unde:
Condiţie – valoare booleană
Instrucţiuni – oricât de multe instrucţiuni executate
{} – opţionale pentru o singură instrucţiune
Instrucţiunile vor fi executate doar dacă condiţia are valoarea de adevăr true.
Exemplu
1 public static void main(String[] args) {
2 int people = 20;
3 int cats = 30;
4 int dogs = 15;
5 if (people <cats) {
6 System.out.println( "Too many cats! The world is doomed!" );
7 }
8 if (people> cats) {
System.out.println( "Not many cats! The world is saved!" );
9
}
10
if (people <dogs) {
11
System.out.println( "The world is drooled on!" );
12
}
13
if (people> dogs) {
14
System.out.println( "The world is dry!" );
15
}
16
dogs += 5;
17 if (people>= dogs) {
18 System.out.println( "People are greater than or equal to dogs.
19 );
20 }
21 if (people <= dogs) {
22 System.out.println( "People are less than or equal to dogs." );
23 }
24 if (people == dogs) {
25 System.out.println( "People are dogs." );
26 }
27 }
28 }
Assignment
1. Schimbaţi valorile iniţiale ale variabilelor astfel încât să nu fie afişat doar un singur
mesaj. Adăugaţi if-uri astfel încât programul să afişeze minim 3 mesaje. Adăugaţi
comentarii. Ştergeţi acoladele şi observaţi diferenţele.
1 if ( string3 != null ) {
2 if (string3.length() == 8) {
3 System.out.println (“Great”);
4 }
5 }
6 //condiția a doua se execută numai dacă prima condiție e true.
7 //În felul acesta ne asigurăm că nu va crăpa aplicația la rulare.
Sau, prescurtat:
Structura:
1 if (condiție) {
2 //bloc de instrucțiuni
3 } else if {
4 //bloc de instrucțiuni
5 } else {
6 //bloc de instrucțiuni
7 }
Exemplu consolă:
if (planetaAleasa == 6) {
System.out.println("Greutatea ta pe Venus este " + greutatePamant *
kg.");
}
4. Creaţi un formular cu răspunsuri multiple, în care doar un răspuns este corect. Reţineţi
numărul de răspunsuri corecte şi afişaţi-l la final.
Exemplu consolă:
Ex: kg / (m * m).
Categorii:
2. Două întrebări
Să se folosească 2 întrebări pentru a ghici un obiect. Se dă următorul exemplu:
Cu următoarele variante:
Doua intrebari!!!
1
Gandeste-te la ceva si o sa incerc sa il ghicesc!
2
3
Intrebarea 1: Este din interior, din exterior sau poate fi in ambele?
4
exterior
5
Intrebarea 2: Este in viata? da
6
7 Atunci ce altceva ar putea fi in afara de un bou?!?
Solutie
1
Scanner keyboard = new Scanner(System.in);
2
3
System.out.println("Gandeste-te la un obiect si o sa ghicesc daca im
4
intrebari!");
5
6 System.out.println("Este din:" + "\n" + "> interior?" + "\n" + "> ext
7 );
8 String raspunsLocatie = keyboard.nextLine();
9
10 System.out.println("Este in viata? (da/nu)" );
11 String raspunsViata = keyboard.nextLine();
12
13 if ("da".equals(raspunsViata) ) {
14
15 if ("interior".equalsIgnoreCase(raspunsLocatie) ) {
16 System.out.println("Este o plantă de ghiveci." );
17 } else if ("exterior".equalsIgnoreCase(raspunsLocatie)) {
18 System.out.println("Este un bou." );
19 } else if ("ambele".equalsIgnoreCase(raspunsLocatie)) {
20 System.out.println("Este un caine." );
21 }
22
23
24 } else if ("nu".equals(raspunsViata) ) {
25 if ("interior".equalsIgnoreCase(raspunsLocatie) ) {
26 System.out.println("Este o perdea de duş." );
27 } else if ("exterior".equalsIgnoreCase(raspunsLocatie)) {
28 System.out.println("Este un panou publicitar." );
29 } else if ("ambele".equalsIgnoreCase(raspunsLocatie)) {
System.out.println("Este un smartphone." );
}
}
5. Creaţi un program prin care să introduceţi cuvinte. După primul cuvânt introdus, se
mai cere un cuvânt şi se va afişa dacă acesta este din punct de vedere alfabetic înainte sau
după cuvântul anterior. Apoi se va mai introduce un cuvânt şi se va afişa dacă este înainte
sau după al doilea cuvânt. Pentru al 4-lea cuvânt introdus se va compara cu al 3-lea, al 5-
lea cu al 4-lea, etc. Programul se va opri când vom introduce acelaşi cuvânt de 2 ori.
Atenţie Limbajul Java face distincţie între literele mari şi literele mici. Creaţi programul
astfel încât să nu ţineţi cont de acest aspect.
Extra
1. Scrieţi un program cu 2 variabile de tip int, no1 şi no2, cu valori generate random.
Scrieţi apoi şi codul necesar astfel încât la apelul System.out.println("Numerele
sunt " + no1 + " si " + no2); valorile să fie afişate întotdeauna în ordine
crescătoare.
Solutie
1 Random rand = new Random();
2
3 int no1 = rand.nextInt(10);
4 int no2 = rand.nextInt(10);
5
6 if (no1 > no2) {
7 int temp = no1;
8 no1 = no2;
9 no2 = temp;
10 }
11 System.out.println("Numerele sunt " + no1 + " si " + no2);
2. Scrieţi un program cu 2 variabile de tip int, no1 şi no2. Valorile vor fi introduse de
utilizator de la tastatură, iar apoi vor fi afişate în ordine inversă. Porniţi de la codul de
mai jos şi completaţi liniile necesare pentru a inversa valorile, fără să folosiţi nicio altă
variabilă în afara celor 2 de la început.
1 Scanner tastatura = new Scanner(System.in);
2 System.out.println("Introduceti primul numar:");
3 int nr1 = tastatura.nextInt();
4 System.out.println("Introduceti al doilea numar:");
5 int nr2 = tastatura.nextInt();
6
7 // cod aici pentru a inversa numerele
8 // ....
9
10 System.out.println("Numerele introduse: " + nr1 + " si " + nr2);
Solutie
1 // cod aici pentru a inversa numerele
2 nr1 = nr1 + nr2;
3 nr2 = nr1 - nr2;
4 nr1 = nr1 - nr2;
3. Se dă programul de mai jos ce conţine 3 variabile de tip int cu valori random, pe care
le afişează pe ecran. Utilizatorul trebuie să le ordoneze crescător introducând ordinea în
care sa fie afişate numerele, conform exemplului. Completaţi codul acolo unde vi se cere
pentru a afişa rezultatul corect.
1 // Exemplu 1
2 Valori generate: 9 , 1, 7
3 Index : (1) (2) (3)
4
5 Introduceţi ordinea si apasati Enter:
6 2
7 3
8 1
9
10 Valori sortate : 1 , 7, 9
1 // Exemplu 2
2 Valori generate: b , a, c
3 Index : (1) (2) (3)
4
5 Introduceţi ordinea si apasati Enter:
6 2
7 1
8 3
9
10 Valori sortate : a , b, c
Cod de pornire:
2. Switch
Switch
Instrucţiunea switch va verifica o variabilă cu o serie de valori. Atunci când întâlneşte o
valoare egală, va executa toate instrucţiunile până la întâlnirea unui break. În cazul în
care nicio valoare nu este egală, va executa instrucţiunile din clauza default. Exemplul
de mai jos este echivalent cu exemplul de la if-else.
Exemplu 1
1 int weekday = 5;
2 String result = "";
3 switch (weekday) {
4 case 1:
5 result = "Sunday";
6 break;
7 case 2:
8 result = "Monday";
9 break;
10 case 3:
11 result = "Tuesday";
12 break;
13 default:
14 result = "Other day";
15 }
Exemplu 2
1 int month = 5;
2 int daysInMonth = 0;
3 switch (month) {
4 case 1: // Ianuarie
5 case 3: // Martie
6 case 5: // Mai
7 case 7: // Iulie
8 case 8: // August
9 case 10: // Octombrie
10 case 12: // Decembrie
11 daysInMonth = 31;
12 break;
13 case 4: // Aprilie
14 case 6: // Iunie
15 case 9: // Septembrie
16 case 11: // Noiembrie
17 daysInMonth = 30;
18 break;
19 case 2: // Februarie
20 daysInMonth = 28;
21 break;
22 }
Exemplu 3
1 switch (number) { // un oarecare numar intreg
2 case 0:
3 System.out.println("This is my first message!");
4 case 2:
5 System.out.println("This is my second message!");
6 case 15:
7 System.out.println("This is my 3333333 message!!!!");
8 break;
9 case 13:
10 System.out.println("4444444444444444");
11 case 4:
12 System.out.println("No more messages after this 5th one!");
13 break;
14 case 3:
15 System.out.println("And one default, please!");
16 case 8:
17 System.out.println("A default that will come after this");
18 default:
19 System.out.println("a message by default...");
20 break;
21 }
Exemplu String
Maria a obținut nota 10, Anca 9, iar restul 7. Dar îl avem și pe domnul profesor. Ce
facem ca să afișăm nota?
1 if ( nume.equals(”Maria”) ) {
2 System.out.println (“Nota 10”);
3 } else if ( nume.equals(”Anca”) ) {
4 System.out.println (“Nota 9”);
5 } else if ( nume.equals(”profesor”) ) {
6 // nu scriem nimic aici
7 } else {
8 System.out.println (“Nota 7”);
9 }
Până la Java 7, String nu era potrivit pentru a fi folosit într-un switch şi trebuia folosit
numărul elevului din catalog:
1 switch (nume) {
2 case (16): syso (“Nota 10”);
3 break;
4 case (15): syso (“Nota 9”);
5 break;
6 case (-1): //Nu scriem nimic aici.
7 break;
8 default: syso (“Nota 7”);
9 }
Sau:
if ( !nume.equals(“Maria”) && !nume.equals(“Anca”) && !nume.equal
1
syso(“Nota 7”);
2
}
3
//adică dacă numele nu e nici Maria, nici Anca și nici profesor
4
//inlocuiti ghilimelele cu ghilimelele de la Eclipse
5
6
//se poate si cu paranteze
7
if ( (!nume.equals(“Maria”) ) && (!nume.equals(“Anca”)) && (!nume.
8 ....
9 if ( (x!=16) && (x!=15) && (x!=-1) ) ......
Observaţie
Varabila folosită la switch poate fi doar byte, short, char, int sau String. Poate
funcţiona şi cu enumeraţii (enum) sau clase wrapper pentru tipurile de date primitive
menţionate (Character, Byte, Short, Integer). Valorile folosite la clauzele case nu se
pot repeta.
Diferente intre if si switch
if
1 char ch = 'a';
2 if (ch == 'a') {
3 System.out.println("Aurel");
4 }
5 if (ch == 'g') {
6 System.out.println("George");
7 }
8 if (ch == 'm') {
9 System.out.println("Marius");
10 }
11 if (ch != 'a' && ch != 'b' && ch != 'm') {
12 System.out.println("Ceilalti");
13 }
Cu această metodă, se verifică toate condițiile. De asemenea, observăm că nu putem afișa
un mesaj default implicit pentru celelalte litere, decât foloisind tot un if.
if else if
1 char ch = 'a';
2 if (ch == 'a') {
3 System.out.println("Aurel");
4 } else {
5 if (ch == 'g') {
6 System.out.println("George");
7 } else {
8 if (ch == 'm') {
9 System.out.println("Marius");
10 } else {
11 System.out.println("Ceilalti");
12 }
13 }
14 }
15 if (ch != 'a' && ch != 'b' && ch != 'm') {
16 System.out.println("Ceilalti");
17 }
Avantaje: dacă o condiție este adevărată, se iese din structura ramificată. Nu se mai
verifică celelalte condiții. În plus, se poate da o comandă pentru toate celelelta cazuri care
nu sunt incluse.
switch
1 /*
2 * Elevii cu nota 7 primesc ca premiu o intrare la piscina.
3 * Cei cu nota 8 primesc in plus si o intrare la sala.
4 * Cei cu nota 9 primesc in plus si un bilet la film
5 * iar cei cu nota 10 primesc si o excursie
6 * Ceilalti nu primesc nimic
7 */
8
9 int nota = new Random().nextInt(10) + 1;
10 // In loc sa mai scriem Random random = new Random(); si apoi random
11
12 System.out.println();
13 System.out.println("Nota este " + nota);
14 System.out.pritln();
15
16 System.out.println("=============== VARIANTA 1 ====================
17
18 switch (nota) {
19 case 10: System.out.println("Premiu excursie");
20 System.out.println("Premiu bilet film");
21 System.out.println("Premiu sala");
22 System.out.println("Premiu piscina");
23 break;
24 case 9: System.out.println("Premiu bilet film");
25 System.out.println("Premiu sala");
26 System.out.println("Premiu piscina");
27 break;
28 case 8: System.out.println("Premiu sala");
29 System.out.println("Premiu piscina");
30 break;
31 case 7: System.out.println("Premiu piscina");
32 break;
33 default: System.out.println("Nu ai castigat nici un premiu");
34 break; //nu mai e cazul
35 }
36
37 System.out.println("\n========= VARIANTA 2 switch cu acumulare
38 ===============");
39 // Nu mai punem break-uri. Daca intra pe nota 10 se vor acumula toat
40
41 switch (nota) {
42 case 10: System.out.println("Premiu excursie");
43 case 9: System.out.println("Premiu bilet film");
44 case 8: System.out.println("Premiu sala");
45 case 7: System.out.println("Premiu piscina");
46 break; // PUNEM DOAR AICI BREAK daca avem apoi DEFAULT
47 default: System.out.println("Nu ai castigat nici un premiu");
48 break;
}
Assignment
Refaceţi exerciţiile de pe pagina if folosind un switch.
Exerciţii
1. Să se realizeze un program în care utilizatorul introduce de la tastatură un număr între
0 și 6 reprezentând ziua din săptămână, astfel: 0 = Duminică, 1 = Luni … 6 = Sâmbătă.
Folosind switch-ul să se afișeze un mesaj specific zilei din săptămână.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 System.out.println("Alegeti o zi (introduceti numarul)");
3 System.out.print("0. Duminica " + "\n"
4 + "1. Luni" + "\n"
5 + "2. Marti" + "\n"
6 + "3. Miercuri" + "\n"
7 + "4. Joi" + "\n"
8 + "5. Vineri" + "\n"
9 + "6. Sambata" + "\n"
10 );
11 int alegere = keyboard.nextInt();
12
13 switch(alegere) {
14
15 case 0: System.out.println("Azi e zi libera");
16 break;
17
18 case 1: System.out.println("Azi e prima zi de munca");
19 break;
20
21 case 2: System.out.println("Azi sunt trei ceasuri rele. Not!");
22 break;
23
24 case 3: System.out.println("Azi e mijlocul saptamanii");
25 break;
26
27 case 4: System.out.println("Incepe sa se simta adierea vacantei");
28 break;
29
30 case 5: System.out.println("Ultima zi de munca. Ura!");
31 break;
32
33 case 6: System.out.println("Sambata!!!");
34 break;
35
36 default: System.out.println("N-ai ales o zi a saptamanii!");
37 }
3. While
1 while (conditie) {
2 instructiuni;
3 }
sau
1 while (condiție) {
2 // bloc de instrucțiuni
3 // o linie de cod specială care poate face condiția false.
4 }
La fel ca la structura if, condiţia trebuie să fie o valoare booleană (true sau false), iar
instrucţiunile pot fi oricât de multe.
NU uitați să introduceți o linie de cod care să poată facă condiția false, pentru a nu
intra într-o buclă infinită fără scăpare. Sau folosiți break (detalii mai
încolo). Exemplu
1 int index = 0;
2 while (index < 100) {
3 System.out.println("index = " + index);
4 index++; // Nu uitati aceasta linie de cod care poate face codint
5 bucla
}
1 import java.util.Scanner;
2
3 public class EnterPIN {
public static void main(String[] args) {
4
Scanner keyboard = new Scanner(System.in);
5
String pin = “1234”;
6
System.out.println("WELCOME TO THE BANK OF MITCHELL.");
7
System.out.print("ENTER YOUR PIN: ");
8
String entry = keyboard.next();
9
10
while (!entry.equals(pin)) {
11
System.out.println("\nINCORRECT PIN. TRY AGAIN.");
12
System.out.print("ENTER YOUR PIN: ");
13 entry = keyboard.next();
14 }
15 System.out.println("\nPIN ACCEPTED. YOU NOW HAVE ACCESS TO YO
16 ACCOUNT.");
17 }
18 }
Variante de folosire a buclei while
1. Afișarea primelor 10 numere.
1 int i = 1;
2 while (true) {
3 System.out.println(i);
4 if (i == 10) {
5 break;
6 }
7 i++;
8 }
1 int i = 1;
2 boolean flag = true;
3 while (flag) {
4 System.out.println(i);
5 if (i == 10) {
6 flag = false;
7 }
8 i++;
9 }
2. Ghicește numărul
nt numar = 6;
1
int ghici;
2
boolean flag = true;
3
while (flag) {
4 System.out.println("Ghiceste numarul de la 1 la 10");
5 ghici = keyboard.nextInt();
6 if (ghici == numar) {
7 flag = false;
8 }
9 }
10 System.out.println(”Felicitari”);
11
1 int numar = 6;
2 int ghici;
3 while (true) {
4 System.out.println("Ghiceste numarul de la 1 la 10");
5 ghici = keyboard.nextInt();
6 if (ghici == numar) {
7 break;
8 }
9 }
10 System.out.println(”Felicitari”);
La ultima variantă a trebuit să îl inițializăm pe ghici = 0. Dar dacă și 0 putea fi un
posibil număr de ghicit? Sau -1? Atunci procedăm astfel:
1 int numar = 6;
2 System.out.println("Ghiceste numarul de la 1 a 10");
3 int ghici = keyboard.nextInt();
4
5 while (ghici != numar) {
6 System.out.println("Ghiceste numarul de la 1 a 10");
7 ghici = keyboard.nextInt();
8 }
9 System.out.println("Felicitari");
Aici vedem că se repetă codul. Nu e bine.
1 int numar = 6;
2 int ghici;
3
4 do {
5 System.out.println( "Ghiceste numarul de la 1 a 10");
6 ghici = keyboard.nextInt();
7 } while (numar != ghici);
8
9 System.out.println("Felicitari");
Bucla do…while o folosim atunci când trebuie să executăm iterația cel puțin o
dată.
true si false
1
while (true) {
2
// buclă infinită.
3
4 // acest tip de buclă poate fi întâlnit în firele de execuție pe
altfel.
}
1 while (false) {.....} // => NU EXISTĂ while(false). Nu are sens.
Assignments
1. Ce asemănări şi deosebiri sunt între while şi if? În interiorul buclei while, de ce nu
avem cuvântul String în faţa lui entry? Ce se întamplă dacă ştergeţi linia entry =
keyboard.next(); din interiorul buclei while?
2. Investigaţi următoarea secvenţă de cod. Este validă? De ce? Ce afişează aceasta?
1 while (true)
2 System.out.println(“printing”);
Exerciţii 1
1. Salvaţi o valoare între 1 şi 10 într-o variabilă. Încercaţi să ghiciţi numărul prin
introducerea unei valori de la tastatură. Afişaţi mesaje diferite dacă numărul este mai
mare, mai mic sau dacă l-aţi ghicit.
Exemplu consolă
1 int n = 0;
2 while (n <5) {
3 System.out.println( (n+1) + ". " + message );
4 n++;
5 }
Pentru a putea finaliza problema avem nevoie de un counter care să numere de câte ori
am afişat mesajul. În acest caz, n ţine locul acestui counter. De obicei, folosim
un whilepentru a repeta o serie de instrucţiuni cât timp o condiţie este adevărată.
Această problemă este indicată pentru un alt tip de structură repetitivă, dar se poate folosi
şi un while.
++ este un operator de incrementare. Acesta adaugă 1 la valoarea curentă a variabilei.
Opusul său este ‒‒, operator de decrementare.
Modificaţi codul astfel încât:
4. Modificaţi programul dat ca exemplu astfel încat dacă introduceţi un pin greşit de 3
ori, să nu mai aveţi acces la cont.
5. Scrieţi un program care să facă suma unor numere întregi introduse de la tastatură.
Suma va fi afişată la fiecare pas. Programul se va opri când se va introduce valoarea 0.
Solutie
int suma = 0;
1
2
Scanner keys = new Scanner(System.in);
3
4
while( true ) {
5
System.out.println("Introdu un numar");
6
int nrIntrodus = keys.nextInt();
7
if (nrIntrodus == 0) break;
8
else System.out.println( "Acum suma este " + (suma += nrIntrodus)
9 );
10
11
// linia else e o varianta mai scurta pentru:
12
/* else {
13
suma += nrIntrodus;
14
System.out.println( "Acum suma este " + suma);
15 }*/
16 }
17
18 System.out.println("Te-ai oprit la " + suma);
Exemplu:
1 Starting number: 6
2 6 3 10 5 16 8 4 2 1
Mai mult:
10. Să se realizeze un program în care se aruncă cu zarul de mai multe ori. Sa se afişeze
punctele. Dacă iese 6 să se termine programul.
11. Realizați un program care primește un număr de la tastatură și calculează suma
cifrelor lui.
Solutie
Scanner keys = new Scanner(System.in);
1
2 System.out.println( "Introduceti un numar. Vom calcula suma cifrelor
3 lui." );
4
5 int nr = keys.nextInt();
6
7 int suma = 0;
8
9 System.out.print("Cifrele sunt: "); // optional
10 while ( nr != 0){
11
12 int ultimaCifra = nr % 10;
13
14
suma = suma + ultimaCifra;
15
16
System.out.print( ultimaCifra + ", "); // optional
17
18
nr = nr / 10;
19
}
20
21
System.out.println();
22
System.out.println( "Suma cifrelor este: " + suma );
12. Folosind bucla while, transformați un număr din baza 10 în baza 16.
13. Calculatorul ghicește numărul. Calculatorul trebuie să ghicească un număr la care v-
ați gândit voi (între 1 și 100). Hint: el propune un număr aleator. Întreabă dacă numărul
la care s-a gândit userul este mai mare sau mai mic decât numărul propus de el. Dacă este
mai mare, va căuta un număr aleator între numărul propus anterior și 100. Dacă este mai
mic, va căuta un număr aleator între numărul propus anterior și 0. Bonus pentru eficiența
programului: cel de-al doilea număr propus să fie la jumătatea intervalului.
14. Rescrierea lui scanner.nextLine() folosind while: un program care citește
caractere de la tastatură și se oprește la Enter.
Solutie
char a = 0;
1 String sir = "";
2 System.out.println("Introduceti oricate caractere si apasati tasta \
3
4 while (a != 13) // 13 e codul pentru Enter, puteti folosi si codul
5 // pentru alt caracter pentru a marca sfarsitul unui
6 {
7 a = (char) System.in.read();
8 sir = sir + a;
9
10 // Metoda System.in.read() obliga programatorul sa preintampine (
11 sa
12 // "paseze mai departe" (throw) o eventuala eroare de retea care
13 apara.
14 // Cititi avertismentul pe care il ridica aceasta linie in Eclips
15
16 } // sfarsit bucla while
17
System.out.println("Sirul este " + sir);
Exerciţii 2
1. Realizați un program care primește un număr de la tastatură și verifică dacă este putere
a lui 2.
Solutie
1 Scanner sc = new Scanner(System.in);
2 System.out.println( "Introdu un numar intreg si pozitiv" );
3
4 int nr = sc.nextInt();
5
6
7 while ( nr % 2 == 0 ) {
8 nr = nr / 2;
9 }
10
11 if ( nr == 1 ){
12 System.out.println( "Numarul este putere a lui 2" );
13 } else {
14 System.out.println( "Nu este putere a lui 2" );
15 }
2. Realizati o metodă care face ce face metoda indexOf('char') din clasa String. Ea
primește un cuvânt și returnează indexul unei litere, să zicem 'a' sau returnează -1 dacă
litera nu se află în cuvânt.
Solutie
1 import java.util.Scanner;
2
3 public class testSwitch {
4
5 public static void main(String[] args) {
6
7 String cuvant;
8 char caracter;
9
10 Scanner keyboard = new Scanner(System.in);
11 System.out.println("Introduceti cuvantul");
12 cuvant = keyboard.nextLine();
13 System.out.println("Introduceti un caracter");
14 caracter = keyboard.nextLine().charAt(0);
15
16 int index = aflaIndexDinString(cuvant, caracter);
17
18 if (index < 0) {
19 System.out.println("Nu am gasit caracterul");
20 } else {
21 System.out.println("Indexul este " + index);
22 }
23
24 }
25
26 private static int aflaIndexDinString(String cuvant, char caracter)
27
28 int index = 0;
29
30 while (index < cuvant.length() ) {
31
32 if ( cuvant.charAt(index) == caracter) {
33 break;
34 }
35 index++;
36 }
37
38 // Daca nu am gasit caracterul pana la sfarsitul cuvantului,
39 returnam -1
40 if (index == cuvant.length() ) {
41 return -1;
42 }
43
44 return index;
45 }
46
}
Sintaxa
1 do {
2 instructiuni;
3 } while (conditie);
Unde
do – cuvânt cheie
instrucţiuni – oricâte instrucţiuni pe care vrem să le executăm
while – cuvânt cheie
condiţie – o condiţie oricât de complexă din care rezultă ceva adevărat sau fals; atâta timp
cât condiţia este adevărată se vor executa instrucţiunile din interiorul lui do-while
Exemplu
1 int i=0;
2 while (i<100) {
3 i++;
4 }
5 //dar atenție, dacă facem o altă buclă
6 while (i<15) {
7 i++;
8 }
Nu se intră în cea de a doua buclă! Pentru că i a rămas cu valoarea 100 din prima buclă!
Fie folosim altă variabilă, fie îi atribuim valoarea 0 înaintea buclei.
Assignment
Assignment 1
Rulaţi următorul program:
1
2 import java.util.Scanner;
3
public class DoWhileSwimming {
4
public static void main( String[] args ) {
5
6
Scanner keyboard = new Scanner(System.in);
7
8
String swimmer1 = "GALLANT";
9
String swimmer2 = "GOOFUS ";
10
11
double minimumTemperature = 79.0; // degrees Fahrenheit
12
double currentTemperature;
13
double savedTemperature;
14 int swimTime;
15
16 System.out.print("What is the current water temperature? ");
17 currentTemperature = keyboard.nextDouble();
18 savedTemperature = currentTemperature; // saves a copy of th
19 later.
20
21
22 System.out.println( "\nOkay, so the current water temperatur
23 "F." );
24 System.out.println( swimmer1 + " approaches the lake...." );
25
26 swimTime = 0;
27 while ( currentTemperature>= minimumTemperature ) {
28 System.out.print( "\t" + swimmer1 + " swims for a bit." )
29 swimTime++;
30 System.out.println( " Swim time: " + swimTime + " min." )
31 currentTemperature -= 0.5; // subtracts 1/2 a degree fro
32 System.out.println( "\tThe current water temperature is
33 "F." );
34 }
35
36 System.out.println( swimmer1 + " stops swimming. Total swim
37 currentTemperature = savedTemperature; // restores original
38
39 System.out.println( "\nOkay, so the current water temperatur
40 "F." );
41 System.out.println( swimmer2 + " approaches the lake...." );
42
43 swimTime = 0;
44 do {
45 System.out.print( "\t" + swimmer2 + " swims for a bit." )
46 swimTime++;
47 System.out.println( " Swim time: " + swimTime + " min." )
48 currentTemperature -= 0.5;
49 System.out.println( "\tThe current water temperature is
"F." );
} while ( currentTemperature>= minimumTemperature );
Assignment 2
Se da următorul cod.
Exerciţii
1. Să se scrie un program care să simuleze aruncarea a două zaruri. Să se arate valorile de
pe zaruri şi suma acestora. Programul se va opri când va întâlni o dublă. Folosiţi do-
while.
Solutie
Random rand = new Random();
1
2 int zar1;
3 int zar2;
4
5 do {
6 zar1 = rand.nextInt(6) + 1;
7 zar2 = rand.nextInt(6) + 1;
8
9 System.out.println("Zar 1: " + zar1 + " | zar 2: " + zar2 + " | To
10 );
11
12
13
} while (zar1 != zar2);
14
15
System.out.println("Gata, am dat dubla, ne oprim!");
System.out.println("Felicitari, ai ghicit!");
1 do {
2 // bloc de instructiuni
3 } while (conditie) ; // <<==observați punctul si virgula “;”
În acest caz, blocul de instrucțiuni se execută cel puțin o dată. Utilizatorul oricum va
încerca să întroducă măcar o dată parola.
1 package automat;
2 import java.util.Scanner;
3
4 public class MyClass{
5 public static void main(String[] args) {
6 Scanner scanner = new Scanner(System.in);
7 String parola;
8
9 do {
10 System.out.println("Introduceti codul pin");
11 parola = scanner.nextLine();
12 } while (! parola.equals("9759")); //Observati "!"
13 ”;”
14
15 System.out.println("Daca ati ajuns aici inseamna ca ati ghic
16 pin.");
}
}
Assignment
Folosind bucla while, să se implementeze metoda (funcția) indexOf(char) din
clasa String:
1. Avem un șir de caractere.
2. Afișăm indexul primei apariții a unui caracter, dacă există în șirul nostru, iar dacă nu,
afișăm -1.
3. Nu știm câte caractere are șirul.
Varianta 1
Pe care poate că unii dintre voi o preferați.
Bucla While care conține un if.
Condiția din while verifică dacă am gasit 'e'-ul.
Condiția din if verifică dacă am ajuns la capătul șirului. Dacă nu ieștim din buclă, index
va depăși capătul șirului și vom avea o eroarea la rulare de tipul.
StringIndexOutOfBoundsException pe linia sir.charAt(index).
6. For
Structura repetitivă - for
for este o tructura repetitivă cu număr cunoscut de paşi.
Un for este folosit atunci când cunoaştem de câte ori vrem să repetăm o operaţie sau când
vrem să numărăm.
Sintaxa
1 for (initializare; conditie; increment) {
2 instructiuni;
3 }
Unde
import java.util.Scanner;
1
2
public class CountingFor {
3
4
public static void main(String[] args) {
5
Scanner keyboard = new Scanner(System.in);
6
7
System.out.println( "Type in a message, and I'll display it
8
times." );
9
System.out.print( "Message: " );
10
String message = keyboard.nextLine();
11
12 for (int n = 1 ; n <= 5 ; n = n+1) {
13 System.out.println( n + ". " + message );
14 }
15
16 }
17 }
Variante de for
1 for (int i=0; i<100; i++) {.....}
2
3 for (int i=100; i>0; i--) {.....}
4
5 for (int i=1; i<100; i*=2) {.....}
6
7 for (int i=3500; i>100; i/=2) {.....}
Deosebire între for şi while
for este folosit atunci când ştim de câte ori vrem să repetăm ceva (de 5 ori, de 10
ori); while este folosit atunci când ştim până când vrem să repetăm ceva (cât timp nu
ghicim un număr, cât timp nu am am introdus 0).
Un for poate fi scris in felul urmator:
1 for (int i = 0; i <6; i++) {
2 // …
3 }
Un while care îndeplineşte aceeaşi funcţionalitate arată în felul următor:
1 int i = 0;
2 while (i <6) {
3 // …
4 i++;
5 }
Assignment
Folosind codul dat ca exemplu, modificaţi for-ul în felul următor:
Exerciţii
1. Scrieţi un program care afişează mesajul “I KNOW JAVA!!!!” de 10 ori. Numerotaţi
fiecare afişare a mesajului.
Solutie
1 for (int i = 0; i < 10; i++) {
2
3 System.out.print(i + 1);
4 System.out.println(" I know JAVA");
5
6 }
4. Scrieţi un program care foloseşte o variabilă x pentru a număra de la -10 la +10 din 0.5
în 0.5 (Rezultatul va fi -10, -9.5, -9, -8.5, …).
Solutie
1 double x = 0.5;
2
3 for(double i = -10; i <= 10; i += x){
4 System.out.print(i + " ");
5 }
6. Scrieţi un program care citeşte un număr şi afişează toate numele până la acesta.
Programul va afişa un semn în dreptul numerelor pare şi alt semn în dreptul numerelor
impare.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Introduceti un numar ");
4 int numar = keyboard.nextInt();
5
6 for (int i = 0; i < numar + 1; i++) {
7
8 if (i % 2 == 0) {
9 System.out.println("par " + i);
10 } else {
11 System.out.println("impar " + i);
12 }
13
14 }
9. Scrieţi un program care face suma primelor n numere, unde n este citit de la tastatură
(adică 1 + 2 + 3 + 4 + … + n).
Solutie
Scanner keyboard = new Scanner (System.in);
1
2
System.out.println("Introduceti un numar: ");
3
int n = keyboard.nextInt();
4
int suma = 0;
5
6
for (int i = 0; i <= n; i++){
7
suma += i;
8
}
9
10 System.out.println("Suma tuturor numerelor pana la " + n + " este: "+
11 );
10. Scrieţi un program care adună n numere citite de la tastatură (n este şi el citit de la
tastatură). Exemplu: a + b + c + d + …. + k.
Solutie
Scanner keyboard = new Scanner(System.in);
1
2
System.out.println("Va rugam sa introduceti un numar care sa reprezi
3
adunate: ");
4
int numar=keyboard.nextInt();
5
6
int suma=0;
7
8 System.out.println("Va rugam sa introduceti un nr pentru efectuarea
9
10 for (int i=0;i<numar;i++) {
11
12 int numarNou = keyboard.nextInt();
13 System.out.println("Suma pana acum: " + (suma += numarNou) );
14
15 if (i < numar-1) {
16 System.out.println("Introduceti un numar nou: ");
17 }
18
19 if (i == numar-2) {
20 System.out.println("(Acesta va fi ultimul numar)");
21 }
22 }
23
24 System.out.println("Suma numerelor introduse este: " + suma);
2 1 2
3 2 1 2 3
4 3 2 1 2 3 4
5 4 3 2 1 2 3 4 5
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Introduceti un numar pana la 9");
4
5 int nr = keyboard.nextInt();
6
7 for (int contorLinii = 1; contorLinii <= nr; contorLinii++) {
8
9 // spatiile de la inceput
10 for (int i = 1; i<=nr-contorLinii; i++) {
11 System.out.print(" ");
12 }
13
14 // cifre crescatoare
15 for (int i = contorLinii; i > 0; i--) {
16 System.out.print(i + " ");
17 }
18
19 // cifre descrescatoare
20 for (int i = 2; i <= contorLinii; i++) {
21 System.out.print(i + " ");
22 }
23
24 System.out.println(); // pentru trecerea la linia urmatoare
25
26 }
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
}
7. Parcurgere array Unidimensional
Parcurgere array
Creaţi un array de tip int de 1000 de elemente şi populaţi-l cu numere folosind o bucla
while.
int [] numere = new int [1000];
1
contor = 0;
2
while (contor < 1000) {
3
numere[contor] = contor; //in elementul cu indexul contor pune va
4
moment.
5
System.out.println ( numere[contor]);
6 contor++; //nu uitaţi incrementarea
7 }
Ca şi în cazul buclei for, şi la while trebuie să avem o instrucţiune pentru
incrementare (contor++) şi o condiţie pentru oprire (contor < 1000).
Incrementarea contor++; se pune de regulă pe ultimul rând în buclă (sau mai rar,
primul). Ce se întâmplă dacă inversăm și scriem:
1 contor++;
2 System.out.println ( numere[contor]);
În acest caz, va afișa toate valorile 0 pentru că noi afișăm un element care nu a fost
inițializat și care a rămas la valoarea default. În plus, când contor e 999, se
atribuie numere[999] = 999. Se incrementează contor la 1000 și apoi …. se încearcă
afișarea lui numere[1000], ceea ce dă ArrayIndexOutOfBounds, pentru că
elementul cu indexul 1000 nu există. Cel mai mare index este 999, pentru că primul e 0.
Aveţi grijă cu array-urile de tip char:
1 char[] ch = new char [5];
2 ch[0]='I';
3 ch[1]='o';
4 ch[2]='n';
5 ch[3]='u';
6 ch[4]='t';
System.out.print(ch[0]+ch[1]+ch[2]+ch[3]+ch[4]) va avea ca rezultat un
numar, nu “Ionut”. Asta pentru că char-urile sunt de fapt int-uri care formează
codul Unicode aferent fiecărui caracter. De exemplu char ch = 45; este cod
valabil.
Ca sa rezolvăm problema folosim ghilimele ("" +
ch[0]+ch[1]+ch[2]+ch[3]+ch[4]) sau("Numele este " +
ch[0]+ch[1]+ch[2]+ch[3]+ch[4]) forţând transformarea în șir de caractere.
Copiere şi sortare
Se pot folosi următoarele metode:
static int[] copyOf( arrayul Copies the specified array, truncating or padding with zero
original, lungimea noului array) / nulls (if necessary) so the copy has the specified length.
Exemplu:
static void Sorts the specified array of objects into ascending order, according to the
sort(Object[] a) natural ordering of its elements.
2. Creaţi un vector de 5 elemente, apoi dati valori fiecarui element de la tastatură. Copiaţi
apoi conţinutul în alt vector. Schimbaţi ultimul element cu valoarea -5. Afişaţi vectorii.
3. Creaţi un vector de 10 elemente cu numere aleatoare între 0 şi 99. Creaţi un alt vector
care să reţină o copie inversă a acestuia. Afişaţi rezultatul. Exemplu:
1 10 11 12 13 14 15 16 17 18 19 – vector initial
2
3 19 18 17 16 15 14 13 12 11 10 – vector final
Solutie
1 int [] arrayInitial = new int[10];
2
3 // populare array
4 System.out.println("Array initial");
5
6 for (int i = 0; i < arrayInitial.length; i++) {
7 arrayInitial[i] = (int)(Math.random() * 100);
8 System.out.print(arrayInitial[i] + " ");
9 }
10
11 // copiere invers
12 int [] arrayInvers = new int[arrayInitial.length];
13 System.out.println("\n" + "Array invers");
14 int ultimulIndexDinPrimulArray = arrayInitial.length - 1;
15
16 for (int i = 0; i < arrayInitial.length; i++) {
17 arrayInvers[i] = arrayInitial[ultimulIndexDinPrimulArray - i];
18 System.out.print(arrayInvers[i] + " ");
19 }
Exemplu, daca vectorul initial este [1, 5, 3, 6, 5, 1, 5, 12, 3, 5, 5], iar numarul cautat este
5, atunci veti crea un nou vector, in care veti retine indecsii lui 5, adica: 1, 4, 6, 9, 10.
Acesta se va afisa sub forma [1, 4, 6, 9, 10].
7. Creaţi apoi un nou program prin care să alegeţi dacă faceţi căutarea după nume, notă,
sau id.
Exemplu
1 Values:
2 Mitchell 99.5 123456
3 Ortiz 78.5 813225
4 Luu 95.6 823669
5 Zimmerman 96.8 307760
6 Brooks 82.7 827131
7
8 ID number to find: 307760
9
10 Found in slot 3
11 Name: Zimmerman
12 Average: 96.8
13 ID: 307760
8. În metoda main() se inițializează un array de 20 de elemente cu numere de
tip intaleatoare între 1 și 10. Se citește un numar de tipul int de la tastatură între 1 și
10.
Construiţi programul pentru a căuta numărul primit în array şi afişaţi indexul primei
apariții în array, sau -1 dacă numărul nu se găseste:
Varianta I: se va folosi bucla while cu un if nested in el, iar if-ul conține break.
Varianta II: se va folosi doar un singur while pentru ambele condiții.
9. Un program care porneşte cu arrayul 4 2 -3 3 1 -2 -5, pe care îl parcurge astfel:
începe cu indexul 0. Apoi merge x căsuțe în față sau în spate în funcție de valoarea
stocată la indexul respectiv: dacă pe indexul 0 scrie 4, merge 4 căsuțe în față; dacă scrie -
3, merge 3 căsuțe înapoi. Se presupune că metoda nu știe câte elemente are array-ul. Să
se afișeze de câte ori face salturi până când iese din array, sau un mesaj dacă nu iese din
array niciodată. Încercaţi şi cu arrayul: 4 4 1 3 -2 2 -5 sau cu alte secvenţe.
Solutie
int[] vector = { 4, 2, -3, 3, 1, -2, -5 };
1
// int[] vector = { 4, 4, 1, 3, -2, 2, -5 };
2
3
int index = 0;
4
int contor = 0;
5
6
7 while ( index >= 0 && index < vector.length ) {
8
index = index + vector[index];
9
contor++;
10
11
//Daca contorul a depasit numarul de elemente inseamna ca s-au re
12
elemente
13
//Daca s-a repetat un element, inseamna ca mingea merge la infini
14
if (contor > vector.length) {
15
System.out.println("Mingea nu iese niciodata din array.");
16
break;
17
}
18 }
19
20 if (contor <= vector.length) {
21 System.out.println("Mingea face " + contor + " pasi pana iese din
22 }
Solutii
Varianta 1:
1 int[] arrayInitial = { 3, 5, -2, -4, 1, 0, -8, 5, 4 };
2 int[] vectorSortat = new int[arrayInitial.length];
3
4 // afisam array-ul initial
5 for (int i = 0; i < arrayInitial.length; i++) {
6 System.out.print(arrayInitial[i] + " ");
7 }
8
9 System.out.println();
10
11 // sortarea vectorului
12 for (int i = 0; i < vectorSortat.length; i++) {
13
14 int nrMinim = arrayInitial[0];
15 int indexNrMinim = 0;
16 for (int j = 0; j < arrayInitial.length; j++) {
17 // presupunem ca nr de pe index zero este cel mai mic
18 // parcurgem vectorul
19 // daca gasim un alt nr mai mic il retinem pe acesta
20 if (arrayInitial[j] < nrMinim) {
21 nrMinim = arrayInitial[j];
22 indexNrMinim = j;
23 }
24 } // end bucla interioara
25
26 vectorSortat[i] = arrayInitial[indexNrMinim];
27 arrayInitial[indexNrMinim] = Integer.MAX_VALUE;
28
29 } // end bucla exterioara
30
31 // afisare array sortat
32 for (int i = 0; i < vectorSortat.length; i++) {
33 System.out.print(vectorSortat[i] + " ");
34 }
Varianta 2: bubble sort
1 int[] vector = { 3, 5, -2, -4, 1, 0, -8, 5, 4 };
2
3 // afisam array-ul initial
4 for (int i = 0; i < vector.length; i++) {
5 System.out.print(vector[i] + " ");
6 }
7
8 System.out.println();
9
10 // sortarea vectorului cu bubble sort
11 int j = 0;
12 int swap = -1; //Numarul de inversari.
13
14 // iteram atata vreme cat nu mai sunt inversari de facut
15 while (swap != 0) { //in loc de variabila swap puteam folosi
16 boolean
17
18 swap = 0;
19
20 for (j = 0; j < vector.length - 1; j++) { // de ce folosim lengt
21
22 if (vector[j] > vector[j + 1]) {
23
24 int k = vector[j];
25 vector[j] = vector[j + 1];
26 vector[j + 1] = k;
27 swap++;
28
29 } // end if
30
31 } // end bucla for
32
33 } // end bucla while
34
35 // afisam array-ul sortat
36 for (int i = 0; i < vector.length; i++) {
37 System.out.print(vector[i] + " ");
}
Exerciţii extra
1. Se dă un array cu cel puţin 2 poziţii populat cu valori oarecare (int, String etc.). Fără să
folosiţi bucle sau să creaţi un alt array, inversaţi prima şi ultima poziţie din array.
3. Creaţi un vector care reţine 1000 de valori. Puneţi în el valori aleatoare între 10 şi 99.
Afişaţi vectorul, apoi afişaţi de câte ori apar numere cu 0 în coadă (ex: 10, 20, 30, etc…).
Solutie
1 int numere[] = new int[1000];
2
3 int contorMultiplu10 = 0;
4
// populare
5
for (int i = 0; i < 1000; i++) {
6
numere[i] = (int) (Math.random() * 90 + 10);
7
System.out.println(numere[i]);
8
}
9
10
//afisarea arrayului
11
for (int i : numere) {
12
System.out.println(i);
13
if (i % 10 == 0) {
14 //System.out.println(numere[i]);
15 contorMultiplu10++;
16 }
17 }
18
19 System.out.println( "Numere multiplu de 10 apar de " + contorMultiplu
20 ori");
Solutie
// ...
1
int indexNumarMinim = 0;
2
int indexNumarMaxim = 0;
3
4
for (int nr : numere) {
5
6
System.out.println(contorPentruAfisare + ". " + nr);
7
8
9 if (nr < numarMinim) {
numarMinim = nr;
10
indexNumarMinim = contorPentruAfisare;
11
}
12
if (nr > numarMaxim) {
13
numarMaxim = nr;
14
indexNumarMaxim = contorPentruAfisare;
15
}
16
if (nr > 0) produs *= nr;
17
sumaElementePentruMedie += nr;
18 contorPentruAfisare++;
19 }
20
21 System.out.println("Cel mai mic numar este: " + numarMinim + " la poz
22 indexNumarMinim);
23 System.out.println("Cel mai mare numar este: " + numarMaxim + " la po
24 indexNumarMaxim);
// ...
1. cu for classic
Nu apelam metoda next() sau previous() decat daca sunt siguri ca exista un element
in fata, respectiv in spate. Acest lucru il vedem cu hasNext() sau hasPrevious().
1while (iter.hasNext()){
2 iter.next();
3}
while (iter.hasNext()){
1
if (iter.next().getMarca().equals(“HP”) {
2
iter.remove(); //se scoate din ArrayList elementul returnat de
3
iter.next()
4
}
5}
Dacă avem rescrisă metoda equals(), putem face următorul lucru:
Solutie
1 ArrayList<Integer> valori = new ArrayList<>();
2
3 valori.add(-113);
4
5 // aici se face autoboxing - acel int este convertit la Integer de c
6 compilator
7 // pentru a adauga direct un obiect Integer, se putea folosi una din
8 variantele:
9 // valori.add(new Integer(-113))
10 // valori.add(Integer.valueOf(-113))
11
12 valori.add(-113);
13 valori.add(-113);
14 valori.add(-113);
15 valori.add(-113);
16 valori.add(-113);
17 valori.add(-113);
18 valori.add(-113);
19 valori.add(-113);
20 valori.add(-113);
21
22 System.out.println(valori.get(0)); // aici are loc este conversia
23 unboxing
24 System.out.println(valori.get(1));
25 System.out.println(valori.get(2));
26 System.out.println(valori.get(3));
27 System.out.println(valori.get(4));
28 System.out.println(valori.get(5));
29 System.out.println(valori.get(6));
System.out.println(valori.get(7));
System.out.println(valori.get(8));
System.out.println(valori.get(9));
2. Creaţi un ArrayList care reţine valori de tipul Integer. Adăugaţi în acesta 10 copii ale
numărului -113 şi afişaţi conţinutul acestuia pe ecran.
De data aceasta, folosiţi o buclă pentru a umple array-ul cu valori şi apoi pentru a-l afişa.
De asemenea, în condiţia de la buclă, nu număraţi până la un număr literal, ci va trebui să
folosiţi metoda size() din ArrayList.
Solutie
1 ArrayList<Integer> valori = new ArrayList<>();
2
3 for (int i = 0; i < 10; i++) {
4 valori.add(-113);
5 }
6
7 for (int i = 0; i < valori.size(); i++) {
8 System.out.println(valori.get(i));
9 }
3. Creaţi un ArrayList care să reţină valori de tipul Integer. Adăugaţi în acesta 10 numere
aleatoare, cu valori între 1 şi 100. Apoi afişaţi conţinutul acestui ArrayList. Folosiţi o
buclă pentru a genera valori. Pentru afişare puteţi folosi metodă simplă, fără buclă:
System.out.println("ArrayList: " +
1
whateverYourArrayListVariableIsCalled);
4. Creaţi un ArrayList care să reţină valori de tipul Integer. Populaţi lista cu 1,000 de
valori aleatoare, fiecare între 10 şi 99. Apoi afişaţi conţinutul acestui ArrayList pe ecran
cu o modalitate preferată.
5. Copierea unui ArrayList.
Scrieţi un program care să creeze un ArrayList ce conţine valori de tipul Integer. Puneţi
10 numere aleatoare în acesta între 1 şi 100. Acesta ar trebui să copieze toate elementele
din primul ArrayList într-un alt ArrayList de aceeaşi dimensiune. Afişaţi apoi valorile din
cei doi ArrayList folosind modalitatea dorită.
Solutie
1 ArrayList<Integer> valori = new ArrayList<>();
2
3 for (int i = 0; i < 10; i++) {
4 valori.add( (int)(Math.random()*99+1) );
}
5
6
System.out.println("Afisam ArrayListul initial:\n" + valori);
7
8
// varianta cu constructor
9
ArrayList<Integer> valoriCopiateConstructor = new ArrayList<>(valori)
10
11
System.out.println("\nAfisam ArrayListul nou creat prin constructor"
12
for (Integer i : valoriCopiateConstructor) {
13
System.out.print(i + ", "); // unboxing
14
}
15
System.out.println();
16
17 // varianta manuala
18 ArrayList<Integer> valoriCopiateManual = new ArrayList<>();
19
20 for (Integer i : valori) {
21 valoriCopiateManual.add(i);
22 }
23
24 System.out.println("\nAfisam ArrayListul copiat manual:\n" +
25 valoriCopiateManual);
dacă numărul se află în listă, afişaţi un singur mesaj (chiar dacă numărul a fost găsit de
mai multe ori)
dacă numărul nu se află în listă, afişaţi alt mesaj care să indice acest lucru.
9. Unde există?
Refaceţi exerciţiul 7, cu următoarele cerinţe pentru căutarea valorii:
11. Sortare.
Creaţi un ArrayList care să reţină valori de tipul Integer. Populaţi ArrayList-ul cu valori
aleatoare între 10 şi 99. Afişaţi valorile din ArrayList pe ecran. Apoi, folosind o metodă
de sortare la alegere, aranjaţi valorile de la cel mai mare la cel mai mic şi afişaţile din
nou.
Solutie
1 public static void main(String[] args) {
2
3 Scanner keyboard = new Scanner(System.in);
4 System.out.println("Scrieti cateva cuvinte si apasati 'enter'");
5 String frazaTest = keyboard.nextLine();
6
7 String[] cuvinteSplitArray = frazaTest.split(" "); // cautati in
8 metoda split
9
10 ArrayList<String> cuvinte = new ArrayList<>();
11
12 System.out.println("\n\nPopulare si afisare ArrayList initial");
13 for (String s : cuvinteSplitArray) {
14 cuvinte.add(s.toLowerCase());
15 System.out.println(s);
16 }
17
18 sorteazaArrayListStringuri(cuvinte);
19
20 System.out.println("\n\nAfisare ArrayList sortat");
21 for (String s : cuvinte) {
22 System.out.println(s);
23 }
24
25 }
26
27 static void sorteazaArrayListStringuri(ArrayList<String> words) {
28 boolean isStillSwapping = true;
29 while (isStillSwapping) {
30
31 isStillSwapping = false;
32
33 for (int i = 0; i<words.size()-1; i++) {
34
35 if (words.get(i).compareTo(words.get(i+1)) > 0) {
36 String temp = words.get(i);
37 words.set(i, words.get(i+1));
38 words.set(i+1, temp);
isStillSwapping = true;
}
}
}
Exemplu 1
1 for (int i = 0; i <4; i++) {
2 for (int j = 0; j <4; j++) {
3 System.out.print(i + "," + j+" ");
4 }
5 System.out.println();
6 }
Assignment 1
Rulaţi exemplul anterior. Ce afişează acesta? De câte ori se execută fiecare buclă? De
câte ori se execută afişarea?
Exemplu 2
1 public class NestingLoops {
2 public static void main(String[] args) {
3 // this is #1 - I'll call it "CN"
4 for (char c='A'; c <= 'E'; c++) {
5 for (int n=1; n <= 3; n++) {
6 System.out.println(c + " " + n);
7 }
8 }
9 System.out.println("\n");
10
11 // this is #2 - I'll call it "AB"
12 for ( int a=1; a <= 3; a++ ) {
13 for ( int b=1; b <= 3; b++ ) {
14 System.out.print( a + "-" + b + " " );
15 }
16 // * You will add a line of code here.
17 }
18 System.out.println("\n");
19 }
20 }
Assignment 2
Ce afişează exemplul anterior? La setul #1, care variabilă creşte mai repede? Schimbaţi
pentru setul #1 ordinea buclelor – puneţi bucla din interior în exterior şi invers. Cum se
modifică programul? Pentru setul #2 schimbaţi instrucţiunea print în println. Ce
modificări apar? De ce? Adaugaţi un System.out.println(); dupa finalul buclei interioare.
Ce se intâmplă?
Exerciţii
1. Scrieţi un program care afişează următorul desen folosind instrucţiunea
“System.out.print(“*”);” şi 2 for-uri.
1 *****
2 *****
3 *****
4 *****
5 *****
6 *****
Solutie
1 for (int i = 0; i < 6; i++) {
2 for (int j = 0; j < 5; j++) {
3 System.out.print("*");
4 }
5 System.out.println();
6 }
10. Scrieţi un program care citeşte un număr de la tastatură şi afişează tabla înmulţirii
(aşa cum este mai sus) pentru acesta.
11. Scrieţi un program care afişează un set de coordonate x şi y în felul următor:
1 (0,0) (0,1) (0,2) (0,3) (0,4) (0,5)
2 (1,0) (1,1) (1,2) (1,3) (1,4) (1,5)
3 (2,0) (2,1) (2,2) (2,3) (2,4) (2,5)
4 (3,0) (3,1) (3,2) (3,3) (3,4) (3,5)
5 (4,0) (4,1) (4,2) (4,3) (4,4) (4,5)
6 (5,0) (5,1) (5,2) (5,3) (5,4) (5,5)
Solutie
1 for (int x=0; x<6; x++) {
2
3 for (int y=0; y<6; y++) {
4 System.out.print("("+x + "," + y + ") ");
5 }
6
7 System.out.println();
8
9 }
12. Generaţi o serie de numere care au suma egală cu 60 şi diferenţa egală cu 14.
Solutie
1 for (int x = 0; x < 61; x++) {
2
3 for (int y = 0; y < 61; y++) {
4 if (x + y == 60 && x - y == 14) {
5 System.out.println(x + " + " + y + " = " + (x+y) );
6 System.out.println(x + " - " + y + " = " + (x-y) );
7 }
8 }
9 }
Varianta cu valoare absoluta:
1 for (int x = 0; x < 61; x++) {
2
3 for (int y = 0; y < 61; y++) {
4 if (x + y == 60 && Math.abs(x - y) == 14) {
5 System.out.println(x + " + " + y + " = " + (x+y) );
6 System.out.println(x + " - " + y + " = " + (x-y) );
7 }
8 }
9 }
13. Generaţi numere între un interval introdus de la tastatură. Pentru fiecare număr, afişaţi
produsul cifrelor.
14. Găsiţi numere care au proprietatea Armstrong (numărul este egal cu cubul cifrelor
sale adunate). Exemplu: 153 = 13 + 53 + 33.
Solutie
1 int i, rest, cat, suma = 0;
2
3 for (i = 1; i <= 10000; i++) {
4 suma = 0;
5 cat = i;
6 while (cat != 0) {
7 rest = cat % 10;
8 cat = cat / 10;
9 suma = suma + (int) Math.pow(rest, 3);
10 }
11 if (suma == i)
12 System.out.println(i);
13 }
Exemplu: 120 = 2 x 2 x 2 x 3 x 5.
Exemplu: 47 = 47.
Vector cu numere prime: 2, 3, 5, 7, 11, 13, 17, 19, 23, …
Vector cu factorii primi: 2, 2, 2, 3, 5
2.Transformarea din baza 10 în baza 2 sau 16
Un program care transformă un număr citit de la tastatură din baza 10 în baza 2 și 16.
3. Se citesc numere. Să se facă produsul numerelor citite, doar dacă sunt pozitive. Se va
afişa produsul la fiecare iteraţie (pas). Să se evite înmulţirea cu 0 prin folosirea
instrucţiunii continue. Să se evite şi înmulţirea cu 1 prin aceeaşi metodă. Programul se
opreşte la introducerea cifrei -1.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 int nr;
3 long produs = 1; // de ce long si nu int?
4
5 while ( true ) {
6 System.out.println( "Introduceti un numar:" );
7 nr = keyboard.nextInt();
8
9 if ( nr == 0 ) {
10 System.out.println( "Nu inmultim cu 0" );
11 continue;
12 }
13
14 if (nr == 1) {
15 System.out.println( "Degeaba inmultim cu 1" );
16 continue;
17 }
18
19 if ( nr == -1 ){
20 System.out.println( "La revedere" );
21 break;
22 }
23
24 if ( nr > 0 ){
25 System.out.println(produs *= nr);
26 }
27
28 }
29 keyboard.close();
Solutie
1 public static void main(String[] args) {
2
3 // Bucla mare afiseaza sectiunile
4 // Ii punem un label: Sectiuni
5
6 Sectiuni:
7 for (int i = 1; i <= 6; i++) {
8
9 System.out.println();
10 System.out.println("Sectiunea " + i + ":" );
11
12 // Bucla interioara afiseaza intrebarile
13 for (int j = 1; j <= i; j++) {
14
15 String raspuns = getRaspuns();
16 System.out.println( "Intrebarea " + j + ": Raspuns: " + rasp
17
18 if ( raspuns.equals("Nu stiu") ){
19
20 break; // iesim din bucla interioara si continuam cu ur
21 iteratie
22 // a buclei exterioare (urmatoarea sectiune)
23 // se putea folosi si 'continue Sectiuni';
24
25 }
26
27 if ( raspuns.equals("Nu raspund") ) {
28 break Sectiuni; // iesim din bucla Sectiuni.
29 }
30
31 } // end bucla interioara
32 } // end bucla exterioara (label Sectiuni)
33
34 } // end metoda main
35
36
/**
37
* aceasta metoda returneaza raspunsul generat aleator
38 */
39 public static String getRaspuns(){
40
41
Random random = new Random();
42
43
int nrAleator = random.nextInt(100);
44
45
// probabilitate raspunsuri: Da - 40%, Nu - 40%, Nu stiu - 10%, N
46
10%.
47
48
if (nrAleator < 40) {
49
return "Da";
50
} else if (nrAleator < 80 ) {
51 return "Nu";
52 } else if (nrAleator < 90) {
53 return "Nu stiu";
54 } else {
55 return "Nu raspund";
56 }
1 import java.util.Random;
Apoi avem nevoie de un obiect pe care să îl folosim:
1 int x = r.nextInt(10);
Ceea ce ne va da un numar întreg între 0 şi 9.
Assignment
Scrieţi un program care generează 5 numere de la 1 la 10. Modificaţi programul astfel
încât limita superioară să fie introdusă de la tastatură (vom avea numere de la 1 la n).
Modificaţi din nou programul astfel încat şi limita inferioară să fie introdusă de la
tastatură (vom avea numere de la m la n).
Exerciţii
1. Scrieţi un program care generează 2 numere între 1 şi 10. Verificaţi dacă numerele sunt
egale sau nu şi afişaţi un mesaj corespunzător.
2. Modificaţi programul de mai sus astfel încât să genereze numere până când găsiţi 2
numere aleatoare egale.
3. Modificaţi programul anterior astfel încât să afişaţi şi câte încercări au fost necesare
până când s-au găsit cele 2 numere egale.
Solutie
1 Random r = new Random();
2
3 int nr1, nr2;
4 int index = 0;
5
6 do {
7
8 nr1 = r.nextInt(10)+1;
9 nr2 = r.nextInt(10)+1;
10 index++;
11
12 } while (nr1 != nr2);
13
14 System.out.println("Numerele sunt egale: " + nr1);
15 System.out.println("Le-am gasit din " + index + " incercari.");
7. Scrieţi un program asemănător unui “Fortune cookie”. Va trebui să aveţi cel puţin 6
mesaje. Pentru fiecare mesaj, afişaţi şi 6 numere de loto.
8. Să se arunce cu zarul de 5 ori. Să se afișeze suma punctelor obținute în cele 5 aruncări
folosind Math.random().
Solutie
1 int sumaAruncari = 0;
2
3 for (int i = 0; i<5; i++) {
4 int aruncare = (int)(Math.random()*6+1);
5 System.out.println("Aruncarea "+ (i+1) + ": " + aruncare);
6 sumaAruncari += aruncare;
7 }
8
9 System.out.println("Total aruncari: " + sumaAruncari);
8. Modificaţi programul anterior, astfel încât să fie aruncate zarurile de mai multe ori, iar
programul să se oprească când acestea vor avea dubla.
9. Se dă următorul scenariu: Avem 3 cărţi cu faţa în jos, una dintre ele este As. Celelalte
2 cărţi sunt Dama şi Popa. Fiecare carte va fi stabilită aleator. Utilizatorul trebuie să
ghicească care din cărţi este Asul dintr-o singură încercare. Simulaţi scenariul în consolă
astfel incat sa arate similar cu:
1 You slide up to Fast Eddie's card table and plop down your cash.
2 He glances at you out of the corner of his eye and starts shuffling.
3 He lays down three cards.
4
5 Which one is the ace?
6 # # #
7 1 2 3> 2
8
9 Ha! Fast Eddie wins again! The ace was card number 3.
10 K Q A
11 1 2 3
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 Random rnd = new Random();
3
String [] carti = {"A", "Q", "K"};
4
5
// impartire carti la intamplare
6
int indexCarteStanga = rnd.nextInt(3);
7
8
int indexCarteMijloc;
9
do {
10
indexCarteMijloc = rnd.nextInt(3);
11
} while (indexCarteMijloc == indexCarteStanga);
12
13
14
int indexCarteDreapta;
15
do {
16 indexCarteDreapta = rnd.nextInt(3);
17 } while (indexCarteDreapta == indexCarteStanga || indexCarteDreapta =
18
19 // ghicire user
20 System.out.println("Gaseste asul (introdu cifra corespunzatoare):");
21 System.out.println("# # #");
22 System.out.println("1 2 3");
23
24 int alegere;
25 do {
26 alegere = keyboard.nextInt();
27 } while (alegere > 3 || alegere < 1);
28
29 // verificare raspuns si afisare mesaje
30 int indexAs = 0; // stocam in variabila doar pentru a intelege mai
31 mai jos
32
33 if ((alegere == 1 && indexCarteStanga == indexAs)
34 || (alegere == 2 && indexCarteMijloc == indexAs)
35 || (alegere == 3 && indexCarteDreapta == indexAs)) {
36
37 System.out.println("Ai ghicit!");
38
39 } else System.out.println("Imi pare rau, ai pierdut.");
40
41 System.out.println(indexCarteStanga + " " + indexCarteMijloc + " " +
42 System.out.println(carti[indexCarteStanga] + " " + carti[indexCarteMi
carti[indexCarteDreapta]);
10. Recreaţi scenariul anterior în felul următor: Jocul începe cu o sumă de bani (de ex.:
1000 dolari). Utilizatorul poate juca de mai multe ori, şi va fi întrebat înainte de fiecare
joc dacă vrea să joace. La fiecare joc acesta va paria o suma de bani. În cazul în care
pierde, nu va primi nimic înapoi. În cazul în care câştigă, acesta va primi 33% în plus din
suma pariată (cu un minim de $1).
11. Modificaţi programul anterior, astfel încât să reţineţi impozite pe câştig de 16% care
vor fi deduse atunci când jucătorul nu mai doreşte să continue.
IV. Metode
1. Definirea Metodelor
Metode
Să presupunem că în flow-ul programului, la un moment dat vrem să executăm un task
foarte specific, bine definit, care se întinde pe mai multe linii de cod, cum ar fi, în cazul
citirii unei variabile de la utilizator sau calcularea unui rezultat folosind niște operații
complexe.
Pentru că este un task bine definit, pentru a ușura citirea codului programului, putem
muta tot acest bloc de linii de cod în altă parte și să îl referim prin apelarea unui denumiri
pe care să i-o dăm. În acest fel codul nostru este mai bine structurat, mai citeț și poate
rula mai eficient.
În cazul în care apare un bug în programul nostru, va fi mult mai ușor de a face „debug”
pentru că separând codurile între ele în funcție de taskurile pe care le efectuează, codul
este foarte ușor de citit.
Există, de asemenea, și situația în care un anumit cod poate fi apelat din zone diferite ale
programului. De exemplu, citirea unei valori de la utilizator poate fi necesară atât pentru
intrarea în contul bancar, cât și pentru aflarea unor numere prime sau comunicarea
numărului de pizza pe care utilizatorul le comandă.
Deși intrarea în contul bancar nu are nimic în comun cu comunicarea numărului de pizze,
este de observat că ambele folosesc aceeși bucată de cod pentru a primi date de la
utilizator.
Astfel au apărut metodele (funcțiile). Acestea sunt blocuri de cod care efectuează sarcini
bine definite. Iată câteva exemple:
1 return x; // de exemplu
Exemplu:
1 //varianta 1:
2 public static double genereazaNumarAleator() {
3
4 double d = Math.random(); //presupunem ca e un calcul complex.
5 return d:
6 }
7
8 //varianta 2:
9 public static double genereazaNumarAleator() {
10
11 //presupunem ca e un calcul complex.
12 return Math.random();
13
14 }
Ceea ce intoarce trebuie să fie de același tip cu key-wordul din definiția metodei:
int/double/String
Alte exemple
void, int, boolean, String, int[], String[], char[], int[][], int[][][], orice alt obiect, etc….
double, etc….
static nu e totdeauna necear. O să învățăm când trebie să îl menționăm, și când nu.
Apelarea unei metode Dacă returnează ceva, putem scrie
1 double d = genereazaNumarAleator();
Metoda genereazăNumarAleator() returnează un double, pe care noi îl captăm
(stocăm) în variabila d. Putem scrie doar
1 genereazaNumarAleator();
dar în cazul acesta nu captăm numărul pe care îl întoarece metoda.
1 System.out.println(d);
Pe scurt, putem scrie:
1 System.out.println ( genereazaNumarAleator() );
În felul acesta facem economie de memorie și timp, nu mai definim o variabilă.
Chiar și câteva nanosecunde contează într-o apicație mare.
Cele 4 tipuri de metode
Fără parametri
1. nu întoarce nimic
1 public static void nume(){
2 //diverse operații
3 //nu returneaza nimic
4 //observati keywordul void
5 }
2. întoarce ceva
Rezolvări
1
// 1. Sa se creeze o metoda(functie) care primeste un numar si afis
2
3
// 2. Sa se creeze o metoda(functie) care primeste un numar si retu
4
// este prim sau nu. Indiciu: daca are 2 divizori (pe el insusi si
5
// (In realitatea acesta nu este cel mai rapid algoritm. Pentru afl
6
// un numar este prim e suficient sa verificam daca are divizori pa
7
// radicalul lui).
8
9
// 3. Sa se creeze o metoda(functie) care primeste un numar si afis
10
// numerele prime pana la acest numar si returneaza numarul de nume
11
// acest numar.
12
13 // 4. In metoda p s v main(String[]args) se cere utilizatorului sa
14 // si se va apela la metoda 3. Se va afisa numarul de numere prime
15 // pana la acest numar.
16
17 import java.util.Scanner;
18
19 public class NumerePrime {
20
21
22 /**
23 * Aceasta metoda primeste un numar intreg (int nr)
24 * si Returneaza cati divizori are (inclusiv el insusi si 1)
25 */
26 public static int divizori(int nr) {
27
28
29 //aceasta variabila va contine numarul de divizori. Noi vom retu
30 variabile.
31 //De fiecare data cand gasim un nou divizor, incrementam cu 1 va
32 int nrDeDivizori = 0;
33 for (int i=1; i<=nr; i++ ) {
34 //daca restul este 0, inseamna ca este un divizor.
35 if (nr%i == 0){
36 //incrementam cu 1 valoarea variabilei.
37 nrDeDivizori++;
38 }
39 }
40 return nrDeDivizori;
41 }
42
43
44
45 /**
46 * Verificam daca un numar primit ca parametru e prim.
47 * Ne folosim de metoda (functia) creata anterior: divizori()
48 * Adica daca are 2 divizori
49 */
50 public static boolean isPrim(int x){
51
52 //Varianta 1: mai dezvoltat, mai usor de inteles:
53 // //metoda divizori(x) returneaza numarul de divizori
54 // //pe care noi il captam (stocam) intr-o variabila numarDeDiviz
55 // int numarDeDivizori = divizori(x);
56 // //Un numar ca sa fie prim are doar 2 divizori: pe 1 si pe el i
57 // //Daca numarul are doar 2 divizori, inseamna ca e prim.
58 // //In cazul asta returnam true.
59 // //Daca nu e prim returnam false
60 // //A se observa keywordul boolean din definirea metodei
61 // //public static boolean isPrim(int x)
62 // //Cuvantul de dinaintea denumirii metodei (isPrim) inseamna ce
63 // //in cazul nostru returnam un boolean
64 // //spunem ca return-type-ul este de tip boolean
// if (numarDeDivizori == 2) {
65
// return true;
66
// } else {
67
// return false;
68
// }
69
70
// Varianta 2, mai direct, fara declararea unor variabile care sunt
71
// si care fac consum de memorie si, din cauza declararii lor crest
72
// pentru programe mari, cateva nanosecunde in plus pot sa conteze
73
74
// metoda divizori(x) returneaza numarul de divizori
75 if (divizori(x) == 2){
76 return true;
77 }
78 return false;
79 //a se observa ca nu am mai pus else. Este clar ca daca numarul
80 //nu se mai rexecuta codul din if.
81
82 }
83
84
85 /**
86 * Aceasta metoda se foloseste de metoda pe care am scris-o anterio
87 * si afiseaza toate numerele prime pana la un numar pe care il pri
88 * si returneaza cate numere prime a gasit pana la numarul x
89 */
90 public static int numerePrime(int x) {
91
92 //cu aceasta variabila (numar) verificam toate numerele pana la
93 //daca sunt prime
94 //Luam toate numerele pe rand, incepand cu 0 si mergem pana la n
95 int numar = 0;
96
97 //un contor care numara numerele prime gasite.
98 //la inceput avem 0 numere prime gsite
99 int contor = 0;
100
101 System.out.println("Numere prime:");
102 //putem folosi si o bucla for.
103 //while: cate vreme numar este mai mic sau egal cu x
104 while (numar <= x){
105
106 //folosim metoda pe care am definit-o anterior: isPrim()
107 //isPrim(int x) returneaza un boolean: true sau false
108 //scriem if( isPrim(numar) )....
109 //observati ca isPrim(numar) este true sau false.
110 //Nu are sens sa scriem if( isPrim(numar) == true) pentru ca isP
111 //true sau false
112 if (isPrim(numar)){
113 //afisam in consola numarul gasit.
114 System.out.print(numar + ", ");
115 //daca este numar prim, incrementam cu 1 valoarea contorului
116 //cate numere prime am gasit pana in acest moment.
117 contor++;
118 }
119
120 //FOARTE IMPORATNT!!!!
//Nu uitati sa il incrementati pe numar.
121 //Altfel, nu mai iesim din bucla asta niciodata.
122 numar++;
123
124 }//end bucla while
125 System.out.println();
126 return contor;
127 }
128
129
130 /**
131 * metoda main() este punctul de intrare in aplicatie. *
132 */
133 public static void main(String[] args) {
134
135 //Primim un numar de la utilizator
136 //si afisam toate numerele prime pana la acest numar
137 //precum si cate numere prime sunt pana la acest numar
138 Scanner scanner = new Scanner(System.in);
139 System.out.println("Va rugam introduceti un numar intreg mai mar
140 int nr = scanner.nextInt();
141 System.out.println("Pana la acest numar sunt " + numerePrime(nr)
142 " de numere prime" );
143 //puteam face si asa:
144 //defineam o variabila care sa stocheze (sa retina) valoarea pe
145 //metoda numerePrime()
146 //int numerePrimeGasite = numerePrime(nr);
147 //System.out.println("Pana la acest numar sunt " + numerePrimeGa
148 //Dar prin definirea unei noi variabile folsim mai mult memoria
149 //(pentru aplicatii mari chiar conteaza fiecare economisire de m
150 //dar si marim timpul de executie al aplicatiei
151 //E adevarat ca il marim cu doar cateva nanosecunde, dar in apli
152 //daca putem reduce timpul de executie.
153 }
154 }
155
156 //Executie:
157 //Va rugam introduceti un numar intreg mai mare decat zero
158 //100
159 //Numere prime:
160 //2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 6
161 //71, 73, 79, 83, 89, 97,
162 //Pana la acest numar sunt 25 de numere prime
163
164
//Va rugam introduceti un numar intreg mai mare decat zero
165
//1000
166
//Numere prime:
167 //2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 6
168 //73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
169 //157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,
170 //239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311,
171 //331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401,
172 //421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491,
173 //509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
174 //613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
175 //709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,
176 //821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
177 //919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997,
178 //Pana la acest numar sunt 168 de numere prime
179
Exerciţii extra
1. Să se creeze o metodă public static void sayHello() care afișează "Hello".
Să se invoce metoda.
Solutie
1 public static void main(String[] args) {
2 sayHello();
3 }
4
5 public static void sayHello() {
6 System.out.println("Hello");
7 }
Antetul metodei, este format din modificatori, tipul metodei şi semnatura acesteia. Corpul
metodei reprezintă toate instrucţiunile pe care le vom executa în interiorul acesteia.
Dacă într-o clasă există mai multe metode cu acelaşi nume, dar cu o listă de parametri
care diferă, putem spune că vorbim de supraîncărcare.
1 Student st;
creează o referință care poate indica doar către o zonă de memorie inițializată cu patternul
clasei Student fără ca memoria respectivă să conțină date utile. Astfel, dacă după
declarație facem un acces la un câmp sau apelăm o funcție-membru, compilatorul va
semnala o eroare, deoarece referința nu indică încă spre vreun obiect din memorie.
Alocarea efectivă a memoriei și inițializarea acesteia se realizează prin apelul
constructorului împreună cu cuvântul-cheie new.
Un fapt ce merită discutat este semnificația atribuirii de referințe. În exemplul de mai jos:
pentru tipurile primitive se transferă prin COPIERE pe stivă: orice modificare în funcția
apelată NU VA FI VIZIBILĂ în urma apelului.
pentru tipurile definite de utilizator și instanțe de clase în general, se COPIAZĂ
REFERINȚA pe stivă: referința indică spre zona de memorie a obicetului, astfel că
schimbările asupra câmpurilor vor fi vizibile după apel, dar reinstanțieri (expresii de
tipul: st = new Student()) în apelul funcției și modificările făcute după ele, NU VOR FI
VIZIBILE după apel, deoarece ele modifică o copie a referinței originale.
1 class TestParams {
2 static void modificaReferinta(Student st) {
3 st = new Student("Gigel", 10)
4 st.averageGrade = 10;
5 }
6
7 static void modificaObiect(Student s) {
8 s.averageGrade = 10;
9 }
10
11 public static void main(String[] args) {
12 Student s = new Student("Andrei", 5);
13 modificaReferinta(s); // 1
14 System.out.println(s.getName()); // 1'
15
16 modificaObiect(s); // 2
17 System.out.println(s.averageGrade); // 2'
18 }
19 }
Astfel, apelul (1) nu are niciun efect în metoda main pentru că metoda modificaReferinta
are ca efect asignarea unei noi valori referinței s, trimisă prin valoare. Linia (1') va afișa
textul: "Andrei".
Exemplu
1 public static void modifica(int nr) {
2 nr = 10;
3 }
4 public static void modifica(Bicicleta bicicleta) {
5 bicicleta.marca = "BMX";
6 }
7 public static void main(String[] args) {
8 int nr = 5;
9 modifica(nr);
10 Bicicleta bici = new Bicicleta();
11 bici.marca = "RK";
12 modifica(bici);
13 }
3. Var-args
Număr variabil de argumente (var-args)
Dacă ne trebuie o metodă care să primească un număr variabil de parametri. Ce facem?
Să prespunem că avem o aplicaţie web în care trebuie să trimitem spre procesare o dată
12 parametri, o dată 13 parametri, o data 14 parametri, o dată 15 … etc … 1000 de
parametri. Nu o sa facem 1000 de metode diferite!
Facem una care primește un număr variabil de parametri (Variable Arguments). JDK 1.5
ne permite să transmitem un număr variabil de argumente de acelaşi tip metodelor.
Parametrul din metodă este declarat în următorul mod:
1 type... parameterName
În declaraţia metodei, se specifică tipul parametrului urmat de 3 puncte (…). Numai un
singur parametru cu număr variabil de argumente este permis într-o metodă, şi acesta
trebuie să fie ultimul din lista de parametri. Ceilalţi parametri normali trebuie să fie
înaintea lui.
Exemplu
1 public class VarargsDemo {
2 public static void main(String args[]) {
3 // Call method with variable args
4 printMax(34,3,3,2,56.5);
5 printMax(new double[]{1,2,3});
6 }
7
8 public static void printMax(double... numbers) {
9 if (numbers.length == 0) {
10 System.out.println("No argument passed");
11 return;
12 }
13
14 double result = numbers[0];
15 for(int i = 1; i <numbers.length; i++)
16 if(numbers[i]> result)
17 result = numbers[i];
18 System.out.println("The max value is "+ result);
19 }
20 }
Care va afişa următorul rezultat:
5. Metode, Exerciţii
Exerciţii metode
Recapitulare
Exemplu de metode care se apeleaza intre ele pentru aflarea numerelor prime.
1. Să se creeze o metodă (funcţie) care primeşte un număr şi afişează câţi divizori are.
2. Să se creeze o metodă care primeşte un număr şi returnează dacă este prim sau nu.
Indiciu: dacă are 2 divizori - pe el însuşi şi pe 1 - este prim. (În realitate, acesta nu este
cel mai rapid algoritm. Pentru a afla dacă un numar este prim e suficient să verificăm
dacă are divizori până la radicalul lui).
3. Să se creeze o metodă care primeşte un număr şi afişează toate numerele prime până la
acest număr şi returnează numărul de numere prime până la acest număr.
Exerciţii
1. Pictures
Pentru următorul program, apelaţi cele 2 metode lipsă şi schimbaţi structura if-else într-
un switch.
Codul programului
1 import java.util.Scanner;
2
3 public class PictureMenu {
4 public static void main(String[] args) {
5
6 Scanner kb = new Scanner(System.in);
7 int choice;
8
9 System.out.println( "1. Butterfly " );
10 System.out.println( "2. Elephant " );
11 System.out.println( "3. Teddy Bear" );
12 System.out.println( "4. Snake " );
13
14 System.out.print( "\nWhich animal to draw? " );
15 choice = kb.nextInt();
16 System.out.println();
17
18 if (choice == 1) {
19 butterfly();
20 } else if (choice == 2) {
21 elephant();
22 } else if (choice == 3) {
23 // * write code here to call the function named 'teddyb
24 } else if (choice == 4) {
25 // * write code here to call the function named 'snake'
26 } else {
27 System.out.println( "Sorry, that wasn't one of the choi
28 }
29 System.out.println( "\nGoodbye!" );
30 }
31
32 public static void butterfly() {
33 System.out.println(" .==-. .-==. ");
34 System.out.println(" \\()8`-._ `. .' _.-'8()/ ");
35 System.out.println(" (88\" ::. \\./ .:: \"88) "
36 System.out.println(" \\_.'`-::::.(#).::::-'`._/ ");
37 System.out.println(" `._... .q(_)p. ..._.' ");
38 System.out.println(" \"\"-..-'|=|`-..-\"\" ");
39 System.out.println(" .\"\"' .'|=|`. `\"\". ");
40 System.out.println(" ,':8(o)./|=|\\.(o)8:`. ");
System.out.println(" (O :8 ::/ \\_/ \\:: 8: O) ");
41
System.out.println(" \\O `::/ \\::' O/ ");
42
System.out.println(" \"\"--' `--\"\" hjw");
43
}
44
45
public static void elephant() {
46
System.out.println(" _..--\"\"-. .-\
47
System.out.println(" _.-' \__...----...__ /
48
System.out.println(" .' .:::...,' ',...::
49
System.out.println("( .'``'''::; ;::''
50 System.out.println(" '-) (-'
51 System.out.println(" /
52 System.out.println(" .'.-. .-.'.
53 System.out.println(" | \\0|0/ | /");
54 System.out.println(" | .-==-. | / |");
55 System.out.println(" `/`; ;`\\`
56 System.out.println(" '.._ (_ | .-==-. | _)
57 System.out.println(" `\"`\"-`/ `/' '\\` \\`
58 System.out.println(" / /`; .==. ;`\");
59 System.out.println(" .---./_/ .==. /\");
60 System.out.println(" / '. `-.__) | `\"")
61 System.out.println(" | =(`-. '==. ;");
62 System.out.println(" jgs '. `-. /");
63 System.out.println(" \\_:_) `\"--.....-'");
64 }
65
66 public static void teddybear() {
67 System.out.println(" ___ .--. ");
68 System.out.println(" .--.-\" \"-' .- |");
69 System.out.println(" / .-,` .'");
70 System.out.println("
71 ` \\");
72 System.out.println(" '. ! \\");
73 System.out.println(" | ! .--. |");
74 System.out.println("
75 '--' /.____");
76 System.out.println(" /`-. \\__,'.' `\\");
77 System.out.println(" __/ \\`-.____.-' `
78 /");
79 System.out.println(" | `---`'-'._/-` \\----' _");
80 System.out.println(" |,-'` / | _.-' `\\"
81 System.out.println(" .' / |--'` / |"
82 System.out.println(" / /
83 ` |");
84 System.out.println(" | .\\/
85 .--. __ \|");
86 System.out.println(" '-' '._ / `
87 /");
88 System.out.println(" jgs `
89 ' |------'`");
90 System.out.println("
91 |");
92 System.out.println("
93 /");
94 System.out.println(" '._ _.'");
95 System.out.println(" ``");
96 }
97
98 public static void snake() {
99 System.out.println(" ,,'6''-,.");
100 System.out.println(" <====,.;;--.");
101 System.out.println(" _`---===. \"\"\"==__");
102 System.out.println(" //\"\"@@-\\===\\@@@@ \"\"\\");
System.out.println(" |( @@@ |===| @@@ ||");
103 System.out.println(" \@@ |===| @@ //");
104 System.out.println(" \@@ |===|@@@ //");
105 System.out.println("
106 |===| //");
107 System.out.println("___________\\|===| //_____,----\"\"\"\"
108 ,_");
109 System.out.println(" \"\"\"\"---,__`\\===`/ _________,----
110 System.out.println(" |==||
111 \\");
112 System.out.println(" |==| pb
113 System.out.println(" |==| _____ ___
114 System.out.println(" |=| `----
115 \"\"\" `\"\"\"\"\"\"\"\" _,-'");
116 System.out.println(" `=
117 __,---\"\"\"-------------\"\"\"''");
118 System.out.println(" \"\"\"\" ");
119 }
120 }
2. Echivalenţă
În următorul program, căutaţi o metodă care returnează o valoare. Când apelaţi metoda
respectivă, vă va da un rezultat. Compilaţi şi rulaţi ambele clase. Produc ambele acelaşi
rezultat?
Codul programului
Clasa cu metodă:
1 public class HeronsFormula {
2 public static void main(String[] args) {
3
4 double a;
5
6 a = triangleArea(3, 3, 3);
7 System.out.println("A triangle with sides 3,3,3 has an area
8
9 a = triangleArea(3, 4, 5);
10 System.out.println("A triangle with sides 3,4,5 has an area
11
12 a = triangleArea(7, 8, 9);
13 System.out.println("A triangle with sides 7,8,9 has an area
14
15 System.out.println("A triangle with sides 5,12,13 has an are
16 );
17 System.out.println("A triangle with sides 10,9,11 has an are
18 );
19 System.out.println("A triangle with sides 8,15,17 has an are
20 );
21 }
22
23 public static double triangleArea(int a, int b, int c) {
24 // the code in this function computes the area of a triangle
25 and c
26 double s, A;
27
28 s = (a+b+c) / 2;
29 A = Math.sqrt( s*(s-a)*(s-b)*(s-c) );
30
return A;
// ^ after computing the area, "return" it
}
}
3. Distanţe
Scrieţi o metodă care să calculeze distanţa dintre 2 puncte. Având 2 puncte cu
coordonatele (x1, y1) şi (x2, y2), distanţa dintre cele 2 este dată de formula:
4. Lunile anului
Scrieţi o metodă. Aceasta va returna numele unei luni dintr-un an, în funcţie de numărul
acesteia. Asiguraţi-vă că nu aveţi instrucţiuni de citire sau afişare în interiorul metodei.
Numărul lunii va fi dat metodei ca parametru, iar un String va fi întors ca rezultatul care
conţine numele.
Pătrat: A = s * s
Dreptunghi: A = l * w
Triunghi: A = b * h / 2
Cerc: A = pi * r * r
(Veţi avea nevoie de valorea lui pi pentru aria cercului. Aceasta poate fi folosită prin
constanta Math.PI.)
Observaţi că nu trebuie să faceţi citirea de valori în interiorul metodelor, şi nici nu trebuie
să afişaţi valorile rezultate în interiorul acestora. Toate citirile şi afişările se vor face în
metoda main(), iar valorile trebuie trimise prin parametri, respectiv întoarse din metode.
Programul va trebui să ruleze la infinit până când utilizatorul decide să iasă din acesta.
Solutie
1 public class FormeGeometrice {
2
3 public static int PATRAT = 1;
4 public static int DREPTUNGHI = 2;
5 public static int TRIUNGHI = 3;
6 public static int CERC = 4;
7
8 public static void main(String[] args) {
9
10 Scanner tastatura = new Scanner(System.in);
11 boolean runLoopForever = true;
12
13 while (runLoopForever) {
14
15 afiseazaOptiuni();
16 int forma = tastatura.nextInt();
17
18 if (forma == PATRAT) {
19 System.out.println(" • Introduceti latura: ");
20 int latura = tastatura.nextInt();
21 int aria = areaSquare(latura);
22 System.out.println("Aria patratului este " + aria);
23
24 } else if (forma == DREPTUNGHI) {
25 System.out.println(" • Introduceti lungimea: ");
26 int lungime = tastatura.nextInt();
27 System.out.println(" • Introduceti latimea: ");
28 int latime = tastatura.nextInt();
29 System.out.println("Aria dreptunghiului este " + areaRect
30
31 } else if (forma == TRIUNGHI) {
32 System.out.println(" • Introduceti baza triunghiului: ")
33 int baza = tastatura.nextInt();
34 System.out.println(" • Introduceti intaltimea triunghiul
35 int inaltimea = tastatura.nextInt();
36 System.out.println("Aria triunghiului este " + areaTriang
37
38 } else if (forma == CERC) {
39 System.out.println(" • Introduceti raza cercului: ");
40 int raza = tastatura.nextInt();
41 System.out.println("Aria cercului este " + areaCircle(raz
42 }
43
44 System.out.println("\n" + ".: Apasati 'Enter' pentru a conti
45 "\n");
46 String userInput = tastatura.nextLine();
47 if (userInput.length() > 0) {
48 runLoopForever = false;
49 }
50
51 }
52
53 }
54
55
56 // returns the area of a square
57 public static int areaSquare(int side) {
58 return side * side;
59 }
60
61
62 // returns the area of a rectangle
63 public static int areaRectangle(int length, int width) {
64 return length * width;
65 }
66
67 // returns the area of a triangle
68 public static double areaTriangle(int base, int height) {
69 return base * height / 2;
70 }
71
72 // returns the area of a circle
73 public static double areaCircle(int radius) {
74 double aria = Math.PI * radius * radius;
75 aria = (int) (aria * 100) / 100.0; // pentru a limita la numai
76 return aria;
77 }
78
79 public static void afiseazaOptiuni() {
80 System.out.println("Alegeti o forma geometrica careia sa-i cal
81 System.out.println("" + "\n"
82 + "1. Patrat" + "\n"
83 + "2. Dreptunghi" + "\n"
84 + "3. Triunghi" + "\n"
85 + "4. Cerc" + "\n"
86 );
87 }
88
}
6. Literele alfabetului
Apelul alfabetului - un program care conţine doar apeluri de metode. Citiţi codul
programului şi urmaţi instrucţiunile din comentarii.
Codul programului
1 public class FunctionCallAlphabet {
2 public static void main(String[] args) {
3 // ???? a( ???? ); // displays a word beginning with A
4 // ???? b( ???? ); // returns the word to be displayed
5 // ???? c( ???? ); // pass it 'true' and it will display
6 // ???? d( ???? ); // displays a word beginning with D
7 // ???? e( ???? ); // pass it the number of letters to d
8 // ???? f( ???? ); // displays the word you pass it begi
9 // ???? g( ???? ); // returns the word to be displayed
10 // ???? h( ???? ); // tell it how many times to display
11
12 System.out.println();
13
14 // ???? i( ???? ); // pass it any integer and it will di
15 // ???? j( ???? ); // returns a different word depending
16 // ???? k( ???? ); // displays a word beginning with K
17 // ???? l( ???? ); // displays a different word dependin
18 // ???? m( ???? ); // displays a different word dependin
19 // ???? n( ???? ); // displays the word you pass it begi
20 // ???? o( ???? ); // displays a word beginning with O a
21 // ???? p( ???? ); // returns the word to be displayed
22 // ???? q( ???? ); // displays the word
23
24 System.out.println();
25
26 // ???? r( ???? ); // returns a different word depending
27 'false'
28 // ???? s( ???? ); // pass it the number of letters to d
29 // ???? t( ???? ); // displays the word you pass it begi
30 // ???? u( ???? ); // returns the word to be displayed
31 // ???? v( ???? ); // tell it how many times to display
32 // ???? w( ???? ); // pass it any integer and it will di
33 // ???? x( ???? ); // returns a different word depending
34 // ???? y( ???? ); // displays a word beginning with Y
35 // ???? z( ???? ); // returns a different word depending
36 pass it
37 System.out.println();
}
38
39
/**************************************
40
* Don't change anything below here!! *
41
*************************************/
42
43
public static void a() {
44
System.out.print("Ant ");
45
}
46
47
public static String b() {
48
return "Banana ";
49 }
50
51 public static void c(boolean doit) {
52 if (doit)
53 System.out.print("Crocodile ");
54 }
55
56 public static void d() {
57 System.out.print("Doggie ");
58 }
59
60 public static void e(int howmany) {
61 String s;
62 s = "Elephant ";
63 int x = 0;
64 while (x <howmany) {
65 System.out.print(s.charAt(x));
66 x = x + 1;
67 }
68 }
69
70 public static void f(String word) {
71 System.out.print(word + " ");
72 }
73
74 public static String g() {
75 return "Gorilla ";
76 }
77
78 public static void h(int reps) {
79 int x = 0;
80 while (x <reps) {
81 System.out.print("Horseradish ");
82 x = x+1;
83 }
84 }
85
public static void i(int ignoredparameter) {
86
ignoredparameter = 32;
87
String space = Character.toString((char) ignoredparameter);
88
System.out.print("Ice_cream" + space);
89
}
90
91
public static String j(int whichone) {
92
if (whichone == 1)
93
return "Jambalaya ";
94
else if (whichone == 2)
95 return "Juniper ";
96 else
97 return "Jackrabbit ";
98 }
99
100 public static void k() {
101 // the bird OR the fruit
102 System.out.print("Kiwi ");
103 }
104
105 public static void l(boolean a, boolean b) {
106 if (a && b)
107 System.out.print("Lettuce ");
108 else
109 System.out.print("Lhasa_apso ");
110 }
111
112 public static void m(boolean a, boolean b) {
113 if (a || b)
114 System.out.print("Mango ");
115 else
116 System.out.print("Monkey! ");
117 }
118
119 public static void n(String word) {
120 System.out.print(word + " ");
121 }
122
123 public static int o() {
124 System.out.print("Orangutan ");
125 return 1; // just for kicks; the return value doesn
126 }
127
128 public static String p() {
129 return "Parrot ";
130 }
131
132 public static void q() {
System.out.print("Quail ");
133
}
134
135
public static String r(boolean first) {
136
if (first)
137
return "Rabbit ";
138
else
139
return "Radish ";
140
}
141
142
public static void s(int howmany) {
143 String s;
144 s = "Snake ";
145 int x = 0;
146 while (x <howmany) {
147 System.out.print( s.charAt(x) );
148 x = x+1;
149 }
150 }
151
152 public static void t(String word) {
153 System.out.print(word + " ");
154 }
155
156 public static String u() {
157 return "Ugli_fruit ";
158 }
159
160 public static void v(int reps) {
161 int x = 0;
162 while (x <reps) {
163 System.out.print("Valentine_candy ");
164 x = x + 1;
165 }
166 }
167
168 public static void w(int ignoredparameter) {
169 ignoredparameter = 32;
170 String space = Character.toString((char) ignoredparameter);
171 System.out.print("Walrus" + space);
172 }
173
174 public static String x(int whichone) {
175 if (whichone == 1)
176 return "X_files ";
else
177
return "X_men ";
178
}
179
180
public static void y() {
181
System.out.print("Yams ");
182
}
183
184
public static String z(boolean a, boolean b) {
185
if (a || b)
186
return "Zanahorias ";
187 else
188 return "Zebra ";
189 }
190
191 }
192
193
Simulare program
1 Ye Olde Keychain Shoppe
2
3 1. Add Keychains to Order
4 2. Remove Keychains from Order
5 3. View Current Order
6 4. Checkout
7
8 Please enter your choice: 1
9
10 ADD KEYCHAINS
11
12 1. Add Keychains to Order
13 2. Remove Keychains from Order
14 3. View Current Order
15 4. Checkout
16
17 Please enter your choice: 3
18
19 VIEW ORDER
20
21 1. Add Keychains to Order
22 2. Remove Keychains from Order
23 3. View Current Order
24 4. Checkout
25
26 Please enter your choice: 4
27
28 CHECKOUT
Va trebui să creaţi metode pentru fiecare dintre cele patru opţiuni din meniu. Introducerea
unuia dintre numere va chema metoda respectivă. Acest exerciţiu nu necesită să aveţi
funcţionalităţi în niciuna dintre metode, cu excepţia celei pentru meniu. Nu este necesar
să programaţi logica necesară pentru adăugarea sau ştergerea breloacelor, pentru a
vizualiza comanda sau pentru checkout.
Metodele ar trebui să aibă
numele addKeychains(), removeKeychains(), viewOrder() şi checkout().
Fiecare din ele trebuie să afişeze un mesaj corespunzător.
Utilizatorul ar trebui să poată introduce alegeri până la apelul metodei checkout().
Când funcţia checkout() este apelată, programul trebuie să se termine.
Solutie
1 public class KeychainShoppe {
2
3 public static void main(String[] args) {
4
5 int userInput;
6
7 do {
8 afiseazaMeniuPrincipal();
9 userInput = getUserInput(1, 4, "Choice does not exist, try
10
11 if (userInput == 1) {
12 addKeychain();
13
14 } else if (userInput == 2) {
15 removeKeychain();
16
17 } else if (userInput == 3) {
18 viewOrder();
19 }
20
21 } while (userInput != 4);
22
23 // n-ar trebui sa ajunga aici daca nu userInput nu e 4
24 checkout();
25 }
26
27
28 public static void afiseazaMeniuPrincipal() {
29 System.out.println("" + "\n"
30 + "*****************************" + "\n"
31 + "** Ye Olde Keychain Shoppe **" + "\n"
32 + "*****************************" + "\n");
33
34 System.out.println(""
35 + "1. Add Keychains to Order" + "\n"
36 + "2. Remove Keychains from Order" + "\n"
37 + "3. View Current Order" + "\n"
38 + "4. Checkout" + "\n"
39 );
40
41 System.out.println("Please enter your choice: ");
42 }
43
44 public static int getUserInput(int minInput, int maxInput, String ou
45 {
46
47 Scanner keyboard = new Scanner(System.in);
48 int userChoice;
49
50 while (true) {
51 if (keyboard.hasNextInt() ) { // preia input doar daca
52 userChoice = keyboard.nextInt();
53 if (userChoice < minInput || userChoice > maxInput) {
54 System.out.println(outOfRangeMessage);
55 continue;
56 }
57 break;
58 } else {
59 System.out.println("Invalid input, please try again: ");
60 keyboard.next();
61 continue;
62 }
63 }
64 return userChoice;
65 }
66
67 public static String getUserInput() {
68 Scanner keyboard = new Scanner(System.in);
69 return keyboard.nextLine();
70 }
71
72 private static void addKeychain() {
73 System.out.println("(Placeholder code) Adding keychain.");
74 }
75
76 private static void removeKeychain() {
77 System.out.println("(Placeholder code) Removing keychain.");
78 }
79
80 private static void viewOrder() {
81 System.out.println("(Placeholder code) Displaying order.");
82 }
83
84 private static void checkout() {
85 System.out.println("Exiting...");
86 System.out.println("Done.");
}
87 }
Simulare program
1 Ye Olde Keychain Shoppe
2
3 1. Add Keychains to Order
4 2. Remove Keychains from Order
5 3. View Current Order
6 4. Checkout
7
8 Please enter your choice: 1
9
10 You have 0 keychains. How many to add? 3
11 You now have 3 keychains.
12
13 1. Add Keychains to Order
14 2. Remove Keychains from Order
15 3. View Current Order
16 4. Checkout
17
18 Please enter your choice: 2
19
20 You have 3 keychains. How many to remove? 1
21 You now have 2 keychains.
22
23 1. Add Keychains to Order
24 2. Remove Keychains from Order
25 3. View Current Order
26 4. Checkout
27
28 Please enter your choice: 3
29
30 You have 2 keychains.
31 Keychains cost $10 each.
32 Total cost is $20.
33
34 1. Add Keychains to Order
35 2. Remove Keychains from Order
36 3. View Current Order
37 4. Checkout
38
39 Please enter your choice: 4
40
41 CHECKOUT
42
43 What is your name? Biff
44 You have 2 keychains.
45 Keychains cost $10 each.
46 Total cost is $20.
47 Thanks for your order, Biff!
</sxh>
Veţi avea nevoie de 2 noi variabile în funcţia main, una pentru stocarea numărului de
breloace, şi unul pentru a stoca preţul pentru un breloc. Preţul ar trebui să fie de 10 RON.
V. OOP I
În primii ani ai computerul, în anii 40, un panel de swithcuri era tot ce se introducea ca
instrucțune. Acesta este un limbaj timpuriu de de programare și codul se numește binar.
Limba vorbită este mult mai complexă decât cea a unui computer. În timp ce creierul
uman înțelege propoziții, computerul nu înțelege decât starea unor swithuri. Pentru că
primele calculatoare nu includeau limbaje, programatorii trebuiau să introducă coduri
(instrucțuini) în format binar, zerouri și unu.
Dar este foarte dificil să scrii instrucțuni în binar. Limbajele de programare, au fost create
ca punte între limbajul binar și cuvinte. Limbajele timpurii foloseau cuvinte pentru a
reprezenta un set de instrucțiuni binare pe care computerul să le înțeleagă. Aceste cuvinte
se numesc mnemonice. Aceste prime limbaje se numesc machine-languages sau
assembler languages.
Mai multă lume a început să folosească acum calculatoarele, inclusiv companiile. Dar și
limbajele mașină s-au dovedit greu de utilizat, pentru că forțau programatorul să
gândească ca un computer, să separe fiecare task într-o lungă listă de instrucțiuni.
Curând au fost create primele limbaje evoluate, pentru a scrie programe de calculator
repede și eficient pentru a rezolva probleme din lumea reală. Aceste limbaje au fost
dezvoltate pentru ca programatorii să nu trebuiască să își facă griji despre pașii pe care un
computer trebuie să le facă pentru a executa un program. Acest lucru le-a permis să se
focuseze pe design și construirea aplicației. Primele astfel de limbaje evoluate sunt:
Clase. Obiecte
Clasele reprezintă tipuri de date definite de utilizator sau deja existente în sistem. O clasă
poate conține:
1 s = new String("str");
Pentru a crea o clasă nouă, cu funcționalități dorite, vom adăuga în fişierul nostru
câmpuri şi metode.
Dacă în metoda main() scriem Student student1 = new Student(); vom avea
un obiect de tip Student creat, dar el nu are nici numele, nici nota și nici vârsta setate.
Dacă vrem să inițializăm anumite atribute, trebuie să folosim un alt constructor, pe care
să îl scriem:
1 // CONSTRUCTOR
2 public Student(String nume, int varsta, int nota) {
3 this.nume = nume;
4 this.varsta = varsta;
5 this.nota = nota;
6 }
Apoi, în metoda main() putem scrie:
1 Student student1 = new Student(”Ionel”, 20, 9);
2 Student student2 = new Student(”George”, 21, 8);
Setters & Getters
Am creat 2 obiecte de tip Student și am și inițializat atributele.
1 student1.nume = "Gheorghita";
2 System.out.println(student1.nume);
Numai că noi am declarat variabila (atributul) nume ca având access specifier private.
Deci, nu îl putem apela din altă clasă. Declarându-l private am făcut ceea ce se numește
încapsulare, adică să nu poată fi modificat direct din exteriorul clasei pentru că adesea
este nevoie să facem niște validări. De exemplu, ce facem dacă se pasează stringul
"sfd#$%&4456gfsg" ca nume? Noi trebuie să verificăm că sunt numai litere. De aceea
avem metoda setNume() pe care o facem publică și în care punem și validarea numelui
primit.
Vom apela atunci setterul și getterul dacă vrem să modificăm sau să afişăm numele:
1 student1.setNume(”John”);
2 System.out.println(student1.getNume());
1 public class Student {
2
3 // ATRIBUTELE CLASEI
4 private String nume;
5 private int varsta;
6 private int nota = 10;
7
8 // CONSTRUCTOR
9 public Student(String nume, int varsta, int nota) {
10 this.nume = nume;
11 this.varsta = varsta;
12 this.nota = nota;
13 }
14
15 ....getter, setteri, alte metode
16 }
În metoda main() avem:
1 Student student1 = new Student(”Ionel”, 20, 9);
2 Student student2 = new Student(”George”, 21, 8);
Dacă nu scriem în cod constructorul default, dar specificăm altul, compilatorul nu îl va
mai adăuga pe cel default (fără parametri).
3. Campuri
Câmpuri
Un câmp este un obiect având tipul unei clase sau o variabilă de tip primitiv. Dacă este un
obiect atunci trebuie inițializat înainte de a fi folosit (folosind cuvântul cheie new).
1 instantaClasei.numeCamp
Atributele există atâta vreme cât obiectul există. Dacă obiectul nu mai are referințe
(variabile de pe STACK care să pointeze către el, va fi șters din memorie de către
garbage collector).
Orice variabilă are următoarele proprietăți:
int nr = 0;
1. int – data type
2. nr – identifier (denumire)
3. 0 – valoarea
4. o adresă în memorie pe care noi nu o știm
5. scope/life of the variable. Variabilele locale (din metode) există numai atâta vreme cât se
execută metoda. Variabilele de tip instanță (din obiecte) există atâta timp cât există
obiectul.
Obiectul există atâta timp cât există variabile pe STACK care pointează către el.
De exemplu:
4. Metode
O metodă este o acţiune care poate fi executată de clasa noastră. Pentru a crea
o metodă nouă, vom avea nevoie de tipul şi numele acesteia. Exemplu:
1
public int getSumaPrimelor10() {
2 int suma = 0;
3 for (int i = 1; i <= 10; i++) {
4 suma += i;
5 }
return suma;
6 }
7
Iar pentru a folosi metoda, putem avea următoarea implementare în clasa de
test:
1
public void afiseazaSumaPrimelorNumere(int n) {
2 int suma = 0;
3 for (int i = 1; i <= n; i++) {
4 suma += i;
5 }
System.out.println("Suma primelor " + n + " numere este " + suma);
6 }
7
Putem folosi şi metode din clasele date ca exemplu în Java. De exemplu pentru
clasa String:
1
2 public class VeterinaryTest {
public static void main(String[] args) {
3 VeterinaryReport vr = new VeterinaryReport(); // se creează un obiect de tip
4 vr.cats = 99; // se setează valori pentru variabilele membre ale obiectului
5 vr.dogs = 199;
6 vr.displayStatistics(); // se apelează funcția membra a obiectului creat
System.out.println("The class method sais there are " + vr.getAnimalsNo() +
7 }
8 }
9
Dacă nu inițializăm explicit valorile câmpurilor, mașina virtuală va seta toate
referințele null pentru obiecte, respectiv la 0 pentru primitive (sau false pentru
tipul boolean).
În Java fișierul trebuie să aibă numele clasei (publice) care e conținută în el. Cel
mai simplu și mai facil din punctul de vedere al organizării codului este de a avea
fiecare clasă în propriul fișier. În cazul nostru, VeterinaryReport.java și
VeterinaryTest.java.
Obiectele au fiecare propriul spațiu de date: fiecare câmp are o valoare separată
pentru fiecare obiect creat. Codul următor arată această situație:
1
2 public class VeterinaryTest {
public static void main(String[] args) {
3
VeterinaryReport vr = new VeterinaryReport();
4 VeterinaryReport vr2 = new VeterinaryReport();
5 vr.cats = 99;
6 vr.dogs = 199;
7 vr2.dogs = 2;
vr.displayStatistics();
8 System.out.println("The class method says there are " + vr.getAnimalsNo()
9 }
10 }
11
Se observă că, deși câmpul dogs aparținând obiectului vr2 a fost actualizat la
valoarea 2, câmpul dogs al obiectului vr1 a rămas la valoarea inițiala (199).
Fiecare obiect are spațiul lui pentru date!
5. Constructori
Constructori
Există uneori restricții de integritate care trebuie îndeplinite pentru crearea unui obiect.
Java permite acest lucru prin existența noțiunii de constructor.
Astfel, la crearea unui obiect al unei clase se apelează automat o funcție numită
constructor. Constructorul are numele clasei, nu returnează explicit un tip anume (nici
măcar void!) și poate avea oricâți parametri.
1 class MyClass {
2 // ...
3 }
1 MyClass instanceObject = new MyClass(param_1, param_2, ..., param_n);
2 // în dreapta semnului egal avem apel la constructor
De reținut că, în terminologia POO, obiectul creat în urma apelului unui constructor al
unei clase poartă numele de instanță a clasei respective. Astfel, spunem că instanceObject
reprezintă o instanță a clasei MyClass.
Exemplu
1 String myFirstString, mySecondString;
2 myFirstString = new String();
3 mySecondString = "This is my second string";
Acesta creează întâi un obiect de tip String folosind constructorul fără parametru (alocă
spațiu de memorie și efectuează inițializările specificate în codul constructorului), iar
apoi creează un alt obiect de tip String pe baza unui șir de caractere constant.
Clasele pe care le-am creat până acum însă nu au avut nici un constructor. În acest caz,
Java crează automat un constructor implicit (în terminologia POO, default constructor)
care face inițializarea câmpurilor neinițializate, astfel:
1 class SomeClass {
2 String name = "Some Class";
3
4 public String getName() {
5 return name;
6 }
}
7
1 class Test {
2 public static void main(String[] args) {
3 SomeClass instance = new SomeClass();
4 System.out.println(instance.getName());
5 }
}
6
La momentul execuției, în consolă se va afișa “Some Class” și nu se va genera nicio
eroare la compilare, deși în clasa SomeClass nu am declarat explicit un constructor de
forma:
1 public SomeClass() {
2 // Eventuale initializari
3 }
Tipuri de constructori
Putem identifica mai multe tipuri de constructori, printre care: fără parametri (implicit),
cu parametri şi de copiere.
1
2
public class Floare {
3 String culoare;
4 int petale;
5
6 // constructor fara parametri
7 public Floare() {
8 culoare = “”;
petale = 4;
9 }
10
11 // constructor cu parametri
12 public Floare(String culoare, int petale) {
13 this.culoare = culoare;
this.petale = petale;
14 }
15
16 // constructor de copiere
17 public Floare(Floare f) { // creaza in memorie un obiect identic
18 this.nume = f.nume; // in general: this.nume = new String(f.nume);
19 this.petale = f.petale;
}
20 }
21
22
Obiectele se constuiesc utilizând keywordul new. Acesta apelează constructorul din clasa
respectivă.
Constructorul este o metodă specială care nu are return-type (nici void, din nimic). El
trebuie să poarte denumirea clasei, și implicit al fișierului.
Pot exista mai mulți constructori într-o clasă, care să difere între ei prin numărul, tipul și
ordinea parametrilor pe care îi primesc. Nu pot exista 2 constructori identici – trebuie să
difere ceva: fie numărul parametrilor, fie tipul lor, fie ordinea lor.
Student.java
class Student {
1
String name;
2 int averageGrade;
3
4 // (1) constructor fără parametri
5 public Student() {
6 name = "Necunoscut";
averageGrade = 5;
7 }
8
9 // (2) constructor cu 2 parametri, folosit dacă știm numele și media
10 public Student(String n, int avg) {
11 name = n;
12 averageGrade = avg;
}
13
14 // (3) constructor cu un singur parametru, folosit atunci când cunoaștem doar
15 public Student(String n) {
16 this(n, 5); // Astfel, se va apela constructorul (2)
17 }
18
// (4) metoda set pentru câmpul name al clasei Student
19 public void setName(String n) {
20 name = n;
21 averageGrade = 5;
22 }
23
// (5) metoda getter pentru câmpul name
24 public String getName() {
25 return name;
26 }
27 }
28
29
30
31
32
Declararea unui obiect de tip Student se face astfel:
1 Student st;
Crearea unui obiect Student se face prin apel la unul din cei 3 constructori de mai sus:
1
2 class Student {
String name;
3
int averageGrade;
4
5 public Student(String n, int avg) {
6 name = n;
7 averageGrade = avg;
8 }
9
public static void main(String[] args) {
10 Student s = new Student(); // EROARE: constructorul implicit este ascuns d
11 }
12 }
13
6. Compunere
Agregare și Compunere
Agregarea și compunerea se referă la prezența unei referințe pentru un obiect într-o altă
clasă. Acea clasă practic va refolosi codul din clasa corespunzatoare obiectului. Exemplu:
1class Page {
2 private String content;
3 public int no;
4
5 public Page(String c, int
6 no) {
this.content = c;
7 this.no = no;
8 }
9}
1
2 class Book {
3 private String title; // compunere - trebuie sa existe
private Page[] pages; // compunere - trebuie sa exist
4 private LibraryRow libraryRow = null; // agregare - poate lipsi
5
6 public Book(int dim, String title, LibraryRow libraryRow) {
7 this.libraryRow = libraryRow;
8 this.title = title;
9 pages = new Page[dim];
for (int i=0; i <dim; i++)
10 pages[i] = new Page("Pagina " + i, i);
11 }
12
13 }
14
1 class LibraryRow {
2 private String rowName = null; // agregare
3 public LibraryRow(String rowName){
4 this.rowName = rowName;
5 }
}
6
1
class Library {
2
3
// members: array of library rows
4
5 public void addRow(LibraryRow row) {...}
6
7 public static void main(String args[]) {
8 LibraryRow row = new LibraryRow("a1");
9 Book book = new Book(100, "title", row);
book = null;
10 }
11 }
12
Agregarea (aggregation) - obiectul-container (Cartea) poate exista și în absența obiectelor
agregate (Raftul). În exemplul de mai sus, un raft de bibliotecă poate exista și fără cărți.
Compunerea (composition) - este o agregare strong, indicând că existența unui obiect este
dependentă de un alt obiect. În exemplul de mai sus, o carte nu poate exista fără pagini.
Totuși, unele funcții pot trimite un parametru cu același nume ca și un câmp membru. În
aceste situații, se folosește cuvântul cheie this pentru dezambiguizare, el prefixând
denumirea câmpului când se dorește utilizarea acestuia. Acest lucru este necesar pentru
că în Java este comportament default ca un nume de parametru să ascundă numele unui
câmp.
Adăugăm clasei VeterinaryTest o metodă care permite setarea numărului de animale
tratate:
1
2 public class VeterinaryReport {
int dogs;
3 int cats;
4
5 [...]
6
7 public void setAnimalsNo(int cats, int dogs) {
8 this.dogs = dogs;
this.cats = cats;
9 }
10 }
11
Alte exemple:
Exemplu 1
Dacă avem clasa Autoturism:
1
public class Autoturism {
2
3
private String marca;
4 private String model;
5
6 //constructor / constructori
7
8 //getteri, setteri
9
10 public setMarca (String m) {
this.marca = m;
11 }
12 }
13
şi metoda main():
1 public static void main(String [] args){
2 //......
3 Autoturism masina1 = new Autoturism();
4 masina1.setMarca( ”Dacia” );
}
5
atunci când se execută linia masina1.setMarca( ”Dacia” ); se va apela
metoda setMarca(String m) a obiectului masina1 în care se va seta atributul marca a
obiectului masina1 la valoarea ”Dacia”.
Deci în cazul nostru, this se referă la obiectul masina1.
Alt exemplu este cazul în care Eclipse ne genereaza metoda equals() pentru o clasă:
1
2 public static void main (String[] args) {
3
4 Computer computer1 = new Computer (“Acer”, 4, 2000);
5 Computer computer2 = new Computer (“Acer”, 4, 2000);
6
7 //Acum dacă facem
System.out.println(computer1 == computer2);
8 // ne va da false pentru că sunt 2 obiecte (de tip computer) diferite, cu adre
9 // == verifică adresele din memorie.
10
11 //Dar dacă facem
12 System.out.println ( computer1.equals(computer2) );
13 // vom obține true, pentru că acum (după ce am suprascris metoda equals()
// în clasa Computer), equals() compară caracteristicile celor 2 computere.
14
15 // Dacă nu suprascriam metoda equals() ca să compare caracteristicile lor,
16 // am fi obținut tot false, ca în cazul lui == pentru că
17 // by default, equals() în clasa Object face exact la fel ca și ==,
18 // adică compară adresele din memorie a celor 2 obiecte.
}
19
20
Observați linia if (this == obj) return true; din metoda equals().
Când executăm linia computer1.equals(computer2) practic, apelăm metoda equals() a
obiectului computer1. Deci, this, este însuși computer1.
obj este o variabilă care preia ca referință pe computer2. Adică, obj este o variabilă
locală de pe stack care va pointa către același obiect către care pointează și computer2.
Deci, ce înseamnă if (this == obj)?
Se testează dacă computer1 și computer2 conțin aceeași adresă, cu alte cuvinte dacă
pointează către același obiect. Adică dacă computer1 și computer2 sunt unul și același
obiect. (În cazul nostru, nu sunt unul și același obiect, sunt obiecte diferite, dar au
aceleași caracteristici).
Exemplu 2
În main():
1
2 public class Furnizor {
3 String nume;
Client client1;
4 Client client2;
5
6 public Furnizor (String nume) {
7 this.nume = nume;
8 client1 = new Client (“La Mama”, this);
9 // clinentul va avea si el o referire catre furnizor
//pasăm instanța Furnizorului
10 client2 = new Client (“Mega Image”, this);
11 }
12 }
13
1 Client
client;
2 //magazinul știe
3 cine e
4 proprietarul.
5
6 public
7 Magazin (Client
client) {
8 this.client
9 = client;
}
}
Iată un exemplu în care vom extinde clasa Student pentru a cunoaște grupa din
care face parte:
1 class Grupa {
2
3 private int crt;
4 private Student[] studenti;
5
Grupa (){
6 crt = 0;
7 studenti = new Student[10];
8 }
9
10 public boolean addStudent(String nume, int media) {
11 if (crt <studenti.length) {
12 studenti[crt++] = new Student(this, nume, media);
return true;
13 }
14 return false;
15 }
16 }
17
18
1
2 class Student {
3
private String name;
4 private int averageGrade;
5 private Grupa grupa;
6
7 public Student(Grupa grupa, String name, int averageGrade) {
8 this.grupa = grupa;
9 this.name = name;
this.averageGrade = averageGrade;
10 }
11 }
12
8. Ciclul de viaţă al unui obiect
În alte limbaje, cum ar fi C++, programatorul trebuie să aibă grijă să distrugă obiectele de
care nu mai are nevoie, altfel apar memory leaks și programme failures. În Java, de
memorie se ocupă JVM (Java Virtual Machine), care ruleză garbage collector ori de câte
ori consideră necesar.
9. Exercitii: Obiecte
Exerciţii
1. Numere complexe
Creați un proiect nou cu numele NumereComplexe.
Creați clasa NumarComplex.java. Aceasta va avea două campuri: real şi imaginar,
ambele de tip float.
Creați clasa Operatii.java. Această clasă va implementa operațiile de adunare și
înmulțire pentru numere complexe. Definiți în clasa Operatii câte o metodă pentru
fiecare operație. Testați metodele implementate.
Solutie
1public class
2NumarComplex
float real;
{
3 float imaginar;
4}
1
2
public class Operatii {
3
4 public NumarComplex adunare(NumarComplex nr1, NumarComplex nr2) {
5 float rezReal = nr1.real + nr2.real;
6 float rezImaginar = nr1.imaginar + nr2.imaginar;
7
8 NumarComplex result = new NumarComplex();
result.real = rezReal;
9 result.imaginar = rezImaginar;
10
11 return result;
12 }
13
14 public NumarComplex inmultire(NumarComplex nr1, NumarComplex nr2) {
15 float rezReal = nr1.real * nr2.real - nr1.imaginar * nr2.imaginar;
float rezImaginar = nr1.real * nr2.imaginar + nr1.imaginar * nr2.real;
16
17 NumarComplex result = new NumarComplex();
18 result.real = rezReal;
19 result.imaginar = rezImaginar;
20
21 return result;
}
22
23 }
24
25
1 public class Test {
2
public static void main(String[] args) {
3 Operatii op = new Operatii();
4
5 NumarComplex nr1 = new NumarComplex();
6 nr1.real = 4;
7 nr1.imaginar = 10;
8 System.out.println("Nr1 = " + nr1.real + " + " + nr1.imaginar + " * i");
9
NumarComplex nr2 = new NumarComplex();
10 nr2.real = 2;
11 nr2.imaginar = 6;
12 System.out.println("Nr2 = " + nr2.real + " + " + nr2.imaginar + " * i");
13
14 NumarComplex resAdd = op.adunare(nr1, nr2);
System.out.println("Res adunare = " + resAdd.real + " + " + resAdd.imaginar
15
16 NumarComplex resMul = op.inmultire(nr1, nr2);
17 System.out.println("Res inmultire = " + resMul.real + " + " + resMul.imagina
18
19 }
20
21 }
22
23
24
2. Biblioteca
Creați un proiect nou cu numele Biblioteca.
Creați clasa Carte.java cu următoarele
atribute: titlu, autor, editura, numarPagini.
Creați clasa Test.java, pentru a testa viitoarele funcționalități ale bibliotecii. Completați
această clasă, așa cum considerați necesar. Apoi, creați un obiect de tip carte și setați
atributele introducând date de la tastatură. Pentru această folosiți clasa Scanner:
1 Scanner s = new Scanner(System.in);
2 String titlu = s.nextLine();
Verificați ca numărul de pagini introdus să fie diferit de zero. Puteți consulta
documentația claselor String și Integer.
Solutie
1
2 public class Carte {
3
String titlu;
4 String autor;
5 String editura;
6 int numarPagini;
7
8 @Override
9 public String toString() {
return "Titlu: " + titlu + ", autor: " + autor + ", editura: " + editura + ",
10 }
11 }
12
1 public class Test {
2
public static void main(String[] args) {
3 Scanner scan = new Scanner(System.in);
4
5 Carte carte = new Carte();
6
7 System.out.println("Intoruceti o noua carte:");
8
9 System.out.println("Titlu:");
carte.titlu = scan.next();
10
11 System.out.println("Autor:");
12 carte.autor = scan.next();
13
14 System.out.println("Editura:");
15 carte.editura = scan.next();
16
int numarPagini;
17 do {
18 System.out.println("Numar pagini: ");
19 numarPagini = scan.nextInt();
20 } while (numarPagini == 0);
21
22 carte.numarPagini = numarPagini;
23
System.out.println(carte);
24 }
25
26 }
27
28
29
30
3. Verificări cărți
Creați o clasă nouă, Verificari, ce va conține două metode, cu câte 2 parametri de
tipul Carte.
Prima metodă va verifica dacă o carte este în dublu exemplar, caz în care va întoarce
adevărat.
A doua metodă va verifica dacă o carte este mai groasă decât altă, și va întoarce cartea
mai groasă.
Testați aceste două metode.
4. Geometrie
Să se implementeze o clasă Punct care să conțină:
un constructor care să primească cele două numere reale (de tip float) ce reprezintă
coordonatele.
metodă changeCoords ce primește două numere reale și modifică cele două coordonate
ale punctului.
funcție de afișare a unui punct astfel: (x, y).
Să se implementeze o clasă Poligon cu următoarele cerinţe:
un constructor care preia ca parametru un singur număr n (reprezentând numărul de
colțuri al poligonului) și alocă spațiu pentru puncte (un punct reprezentând o instanță a
clasei Punct).
un constructor care preia ca parametru un vector, cu 2n numere reale reprezentând
colțurile. Acest constructor apelează constructorul de la punctul de mai sus și
completează vectorul de puncte cu cele n instanțe ale clasei Punct obținute din parametrii
primiți.
La final, afișați coordonatele poligonului utilizând metoda de afișare a clasei Punct.
5. RandomStringGenerator
Să se implementeze o clasă RandomStringGenerator ce generează un String de o
anumită lungime fixată, conținând caractere alese aleator dintr-un alfabet. Această clasă o
să conțină următoarele:
un constructor care primește lungimea șirului și alfabetul sub formă de String. Exemplu
de utilizare:
1 myGenerator = new RandomStringGenerator(5, "abcdef");
metodă next() care va returna un nou String random folosind lungimea și alfabetul
primite de constructor.
Pentru a construi String-ul, este utilă reprezentarea sub formă de șir de
caractere char[] (char array). Pentru a construi un String pornind de la un char array
procedăm ca în exemplul următor:
1 char[] a = {'a','b','c'};
2 String s = new String(a);
Conversia unui String la char array se face apelând metoda toCharArray() a String-ului
de convertit.
Pentru a genera valori aleatoare din domeniul [0, N - 1], utilizați:
1 import java.util.Random;
2 // ...
3 Random generator = new Random();
4 int value = generator.nextInt(N);
Exemplu:
1 lungimeSir = 4;
2 alfabet = "abcdefgh";
3
4 // Rezultat posibil: dfah
Solutie
1 import java.util.Random;
2
3 public class RandomStringGenerator {
4
private char[] alfabet;
5 private int lungimeSir;
6
7 // constructor default
8 public RandomStringGenerator() {
9 lungimeSir = 5;
10
11 String alfabetImplicitString = "abcdefghijklmnopqrstuvwxyz";
12 alfabet = alfabetImplicitString.toCharArray();
13
}
14
15 // constructor cu parametri
16 public RandomStringGenerator(int lungime, String sir) {
17 lungimeSir = lungime;
18 alfabet = sir.toCharArray();
19 }
20
public String next() {
21 Random randGenerator = new Random();
22 char[] randomChars = new char[lungimeSir];
23
24 for (int i = 0; i < lungimeSir; i++) {
25 int pozitieRandomDinAlfabet =
randGenerator.nextInt(alfabet.length);
26
randomChars[i] = alfabet[pozitieRandomDinAlfabet];
27 }
28
29 return new String(randomChars);
30 }
31
32}
33
34
35
1 public class TestRandomString {
2
3 public static void main(String[] args) {
4
5 RandomStringGenerator myGenerator = new RandomStringGenerator(5, "aeiou" + "bcdfg
6 + ":;,.'|");
7
// generare 10 stringuri random
8 for (int i = 0; i < 10; i++) {
9 System.out.println(myGenerator.next());
10 }
11
12 }
13
14}
6. Agenda Telefonică
Realizati un program care contine 10 contacte într-un array:
Fiecare contact reține numele și numărul de telefon.
Programul va permite userului să introducă numele de la tastatură, și va afișa numărul de
telefon.
Hint: creați 10 obiecte de tip Persoană pe care să le puneți într-un array.
Solutie
1
public class Persoana {
2
3 String nume;
4 String nrTelefon;
5
6 Persoana (String name, String number) {
7 nume = name;
8 nrTelefon = number;
}
9
10 }
11
Test main():
public static void main(String[] args) {
1
2 String [] nume = {"Evanghelina Ene","Eusebia Dinu","Eusebia Chițu",
3 "Maxim Dumitrescu","Mitică Ene","Emanuela Preda",
4 "Eusebia Preda","Mitruț Georgescu","Maximilian Mazilescu",
5 "Manole Cristea"};
6
7 String [] nrTelefon = {"0722480192","0722971200","0722932576",
"0722120320","0722600128","0722379520",
8 "0722707168","0722769696","0722661152",
9 "0722350720"};
10
11 Persoana [] agenda = new Persoana[10];
12
13 // populare array studenti
for (int i = 0; i<nume.length; i++) {
14 agenda[i] = new Persoana (nume[i], nrTelefon[i]);
15 }
16
17 // cautare nume
18 Scanner keyboard = new Scanner(System.in);
19
20 System.out.println("Introduceti numele (sau primele litere ale numelui) persoa
String searchQuery = keyboard.nextLine().toLowerCase(); // preluam numele intr
21
22 for (int i = 0; i<nume.length; i++) {
23
24 // indexOf cauta un substring; returneaza -1 daca nu il gaseste
25 // trebuie sa folosim si aici toLowerCase pe numele pe care il iteram
26 if (agenda[i].nume.toLowerCase().indexOf(searchQuery) >= 0) {
System.out.println(agenda[i].nume + ": " + agenda[i].nrTelefon);
27
} // end if
28
29 // sau direct cu metoda contains, care foloseste intern tot metoda indexOf
30 /*
31 if (agenda[i].nume.toLowerCase().contains(searchQuery) ) {
System.out.println(agenda[i].nume + ": " + agenda[i].nrTelefon);
32 }
33 */
34
35 }
36
37 keyboard.close();
38
} // end main
39
40
41
42
43
44
45
10. Mostenire
Moștenire (Inheritance)
Numită și derivare, moștenirea este un mecanism de refolosire a codului și reprezintă
posibilitatea de a defini o clasă care extinde o altă clasă deja existentă. Ideea de bază este
de a prelua funcționalitatea existentă într-o clasă. Putem de asemenea să adăugăm noi
funcţionalităţi şi să le modifcăm pe cele existente.
Clasa existentă este numită clasa-părinte, clasa de bază sau super-clasă. Clasa care
extinde clasa-părinte se numește clasă copil (child), clasă derivată sau sub-clasă.
Moștenirea este un mecanism care permite crearea unor versiuni “specializate” ale unor
clase existente (de bază). Moștenirea este folosită în general atunci când se dorește
construirea unui tip de date care să reprezinte o implementare specifică (o specializare
oferită prin clasa derivată) a unui lucru mai general. Un exemplu simplu ar fi
clasa Câinecare moștenește clasa Mamifer:
1 public class Animal {
2
3 }
1 public class Mammal extends Animal {
2
3 }
1 public class Reptile extends Animal {
2
3 }
1 public class Dog extends Mammal {
2
3 }
Pe baza exemplului de mai sus, următoarele sunt adevărate în termeni OOP:
Animal este o super-clasă a clasei Mammal.
Animal este o super-clasă a clasei Reptile.
Mammal şi Reptile sunt sub-clase ale clasei Animal.
Dog este o subclasă atât pentru clasa Mammal cât şi pentru clasa Animal.
Având în vedere relaţia IS-A, putem spune că:
1 class Animal {
2 public void eat() {
3 System.out.println("Animal eating");
4 }
}
5
1
class Wolf extends Animal {
2 public void howl() {
3 System.out.println("Wolf howling");
4 }
5
6 public void eat() {
7 System.out.println("Wolf eating");
}
8 }
9
1 class Snake extends Animal {
2 public void bite() {
3 System.out.println("Snake biting");
4 }
}
5
1
2 class Test {
public static void main(String[] args) {
3 Wolf wolf = new Wolf();
4 Snake snake = new Snake();
5
6 wolf.howl();
7 snake.bite();
8 snake.eat();
wolf.eat();
9 }
10 }
11
Implicații
În Java, clasele și membrii acestora (metode, variabile, clase interne) pot avea diverși
specificatori de acces.
La o primă vedere, putem crea clasa Localitate care să aibă următoarele atribute:
1
String denumire;
2 int numărDeLocuitori;
3 String județ;
4 String tipulLocalitatii;
5 String adresaPrefectura;
String adresaPrimarie;
6 String adresaSpital;
7
Ne dăm seama imediat că nu toate localitățile au primărie, și nici prefectură și nici spital
și că trebuie să creăm clase separate. Prefectură au doar reședințele de județ, Primărie nu
au unele sate, ci doar satele reședință de comună, iar comunele nu au spitale. Totuși,
există și atribute pe care le au toate localitățile: denumire, număr de locuitori, județ etc.
Soluția: facem o clasă generică Localitate și mai multe subclase care să moștenească
această clasă, dar care să aibă și unele atribute distincte. Renunțăm la
atributul tipulLocalitatii.
1 public class Localitate {
private String denumire;
2 private int numărDeLocuitori;
3 private String județ;
4
5 public Localitate(String denumire, int numarDeLocuitori, String judet) {
6 this.denumire = denumire;
this.numarDeLocuitori = numarDeLocuitori;
7 this.judet = judet;
8 }
9
10 // getteri, setteri
11 }
12
13
Apoi creăm clasele ResedintaJudet, Oras, SatResedintaComuna, Sat care extind
clasa Localitate:
1
2 public class ResedintaJudet extends Localitate {
3 private String adresaPrefectura;
private String adresaPrimarie;
4
private String adresaSpital;
5
6 public ResedintaJudet(String denumire, int numarDeLocuitori, String judet,
7 String prefectura, String primarie, String spital){
8 super(denumire, numarDeLocuitori, judet);
9 this.adresaPrefectura = prefectura;
this.adresaPrimarie = primarie;
10 this.adresaSpital = spital;
11 }
12
13 //getteri, setteri pentru cele 3 atribute specifice clasei
14 }
15
1
2 public class Oras extends Localitate{
private String adresaPrimarie;
3
private String adresaSpital;
4
5 public Oras (String denumire, int numarDeLocuitori, String judet,
6 String primarie, String spital) {
7 super(denumire, numarDeLocuitori, judet);
8 this.adresaPrimarie = primarie;
this.adresaSpital = spital;
9 }
10
11 // getteri, setteri pentru cele 2 atribute specifice clasei
12 }
13
1
public class SatResedintaComuna extends Localitate {
2
private String adresaPrimarie;
3
4 public SatResedintaComuna(String denumire, int numarDeLocuitori, String
5 String primarie){
6 super(denumire, numarDeLocuitori, judet);
7 this.adresaPrimarie = primarie;
}
8
9 // getteri, setteri pentru adresaPrimarie
10 }
11
public class Sat extends
1 Localitate{
2
3 public Sat (String
4 denumire, int
numarDeLocuitori,
5 String judet){
6 super(denumire,
numarDeLocuitori,
judet);
}
}
Deși clasa ResedintaJudet pare să aibă doar 3 atribute, în realitate are 6, pentru că le
moștenește și pe cele ale clasei Localitate. De asemenea, moștenește și toate metodele
superclasei, inclusiv getteri și setteri.
Atentie: Dacă cele 3 atribute ale clasei Localitate sunt private tot le moștenșete, dar nu le
vom putea folosi direct, ci prin intermediul getterilor (=accesorilor) și setterilor
(=mutatorilor) pe care îi moștenește.
1 Oras oras = new Oras (”Galati”, 300000, “Galati”, “...”, “.....”);
2 oras.getDenumire(); // mosteneste aceasta metoda de la clasa mama. O putem folosi d
Constructorul ResedintaJudet va contine toate cele 6 argumente. Prima linie în
constructorul unei subclase care moștenește o altă clasă, trebuie să fie trimiterea la
constructorul superclasei utilizând instructiuneasuper();.
super() = apelarea constructorului superclasei
Dacă noi nu scriem super();, acest lucru îl va facem automat compilatorul care va
insera pe prima linie în codul compilat, comanda super();. În cazul nostru, noi vom
apela constructorul superclasei care are cele 3 argumente:
public Localitate(String denumire, int numarDeLocuitori, String
judet)
folosind comanda :
is a - indică faptul că o clasă este derivată dintr-o clasă de bază (intuitiv, dacă avem o
clasă Mamifer și o clasă Caine, atunci ar fi normal să avem Caine derivat din Animal, cu
alte cuvinte Caine is a Mamifer).
has a - indică faptul că o clasă-container are o clasă conținută în ea (intuitiv, dacă avem o
clasă Masina și o clasă Motor, atunci ar fi normal să avem Motor referit în cadrul Masina,
cu alte cuvinte Masina has a Motor).
Assignment
1. Faceți o aplicație care să conțină clasa Animal și mai multe subclase (tipuri de
animale) care să aibă și atribute și metode specifice cum ar
fi latra(), necheaza(), ciripeste(), miauna() etc.
Construiţi mai multe animale din fiecare tip.
Apelaţi metodele, încercați să folosiți atributele private ale superclasei în clasa derivată,
creați o metodă toString() și afişaţi atributele diferitelor animale.
1 public class Animal {
2 public void scoateSunet(){
3 System.out.println(“Animalul scoate un sunet de animal (sunet generic).”);
4 }
}
5
1
public class Pisica extends Animal{
2
3 public void scoateSunet(){ //OVERRIDING (SUPRASCRIERE)
4 System.out.println(“Pisica miauna.”);
5 }
6 public void toarce(){
7 System.out.println(“Pisica toarce.”);
}
8 }
9
Spunem că clasa Pisică a implementat metoda scoateSunet() de la clasa Animal.
1 Pisica pisica = new Pisica();
2 pisica.toarce();
3 pisica.scoateSunet(); // ce se va afisa?
4
5 Animal animal = new Animal();
animal.toarce(); //este posibil?
6
11. Suprascriere
Overriding / Suprascriere
Suprascrierea este mecanismul de rescriere a unei metode într-o clasă derivată. Acest
lucru ne permite să definim o implementare mai specializată pentru clasa respectivă.
1 class Animal {
2 public void move() {
3 System.out.println("Animals can move");
4 }
}
5
1
class Dog extends Animal {
2 public void move(){
3 System.out.println("Dogs can walk and run");
4 }
5
6 public void bark(){
7 System.out.println("Dogs can bark");
}
8 }
9
1
public class TestDog {
2 public static void main(String args[]) {
3 Animal a = new Animal(); // Animal reference and object
4 Animal b = new Dog(); // Animal reference but Dog object
5 a.move(); // runs the method in Animal class
6 b.move(); //runs the method in Dog class
}
7 }
8
Codul de mai sus va produce următorul rezultat:
Mai este un amănunt de care trebuie să ţinem seama. Avem următorul exemplu:
Super
super este un cuvânt cheie, asemănător cu this. Singura diferenţă este că super este
folosit atunci când ne referim la clasa părinte (când apelăm o metodă, un constructor sau
un câmp din superclasă). De exemplu, putem să apelăm un constructor din clasa părinte
sau o metodă folosind super în următorul fel:
1 class Animal {
int age;
2
3 public Animal(int age) {
4 this.age = age;
5 }
6
7 public void eat() {
8 System.out.println("Animal eating");
}
9 }
10
11
1
2 class Wolf extends Animal {
public Wolf(int age) {
3 super(age);
4 }
5
6 public void eat() {
7 super.eat();
System.out.println("Wolf eating");
8 }
9 }
10
1 public class TestWolf {
2 public static void main(String[] args) {
3 Animal a = new Wolf(5); // Animal reference but Wolf object
4 a.eat(); // Runs the method in Wolf class
5 System.out.println("age: " + a.age);
}
6
Ceea ce va produce următorul rezultat:
1 Animal eating
2 Wolf eating
3 age: 5
13. this vs. super
this() sau
this(parametri) se apelează un alt constructor din aceeași clasă (overloading = supraîncărcarea)
super() sau
super(parametri) se apelează un constructor din clasa mamă pe care noi o extindem
Atribute
this.atribut = valoare sau variabilă referire la un atribut al clasei
locală; ex: this.ram = ram;.
referire la un atribut din clasa mamă pe care noi o
super.atribut extindem
Metode
apelarea unei metode din această clasă, cum ar fi o
this.metoda() sau metodă overloaded / suprascrisă; practic, this nu es
this.metroda(parametri) obligatoriu
Solutie
1 public class Adresa {
2
String strada;
3 String numar;
4 String oras;
5 String judet;
6
7 public Adresa() {
8
9 }
10
public Adresa(String strada, String numar, String oras, String judet) {
11 super();
12 this.strada = strada;
13 this.numar = numar;
14 this.oras = oras;
15 this.judet = judet;
}
16
17 @Override
18 public String toString() {
19 return "Str. " + strada + ", nr. " + numar + ", " + oras + ", jud. " + judet;
20 }
21
}
22
23
24
25
1
2 public class Livrari {
3
4 public static void main(String[] args) {
5
Adresa[] adrese = new Adresa[4];
6 adrese[0] = new Adresa("Viitorului", "20", "Bucuresti", " Bucuresti");
7 adrese[1] = new Adresa("Trecutului", "10", "Cluj-Napoca", " Cluj");
8 adrese[2] = new Adresa("Prezentului", "15", "Targoviste", " Dambovita");
9 adrese[3] = new Adresa("Neantului", "0", "Iasi", "Iasi");
10
11 for (Adresa tempAdr : adrese) {
System.out.println(tempAdr);
12 }
13
14 }
15
16 }
17
2. Studenti
1. Creați o clasă Student ce reține informații despre un student: nume, an de studiu, si
media. Creați trei instanțe ale clasei Student. Citiți de la tastatură valori pentru atributele
celor 3 studenți. Afișați media celor trei studenți. Nu folosiți un array sau instrucțiuni
repetitive.
2. Creați un array în care rețineți studenții. Realizați modificările necesare pentru a
adăuga valori câmpurilor clasei Student. Întroduceți un nume de la tastatură și verificați
dacă există un student cu acest nume.
3. Şcoala
Realizaţi un program cu următoarele clase:
• denumire • strada
• adresa • numele • numarul
• nrElevi • materia • orasul
Clasa Scoala Clasa Profesor Clasa Adresa
• nrSali
• profesor1
• profesor2
• profesor3
• profesor4
• director
Nu setati pe profesor4.
Directorul este si el un profesor dar nu preda nici o materie.
Solutie
1
public class Profesor {
2 String nume;
3 String materie;
4
5 public Profesor(String nume, String materie) {
6 super();
7 this.nume = nume;
this.materie = materie;
8 }
9
10 }
11
1
2 public class Adresa {
3 String strada;
4 String numar;
String oras;
5
6
public Adresa(String strada, String numar, String oras) {
7 super();
8 this.strada = strada;
9 this.numar = numar;
10 this.oras = oras;
}
11
12 @Override
13 public String toString() {
14 return strada + ", nr. " + numar + ", " + oras;
15 }
16
17 }
18
1 public class Scoala {
2 String denumire;
Adresa adresa;
3 int nrElevi;
4 int nrSali;
5 Profesor profesor1;
6 Profesor profesor2;
7 Profesor profesor3;
Profesor profesor4;
8 Profesor director;
9
10 Scoala(String denumire, Adresa adresa) {
11 this.denumire = denumire;
12 this.adresa = adresa;
}
13}
14
15
16
1
Scoala scoala = new Scoala("Geo Bogza", new Adresa("Bd. Intuitiei", "20", "Bucuresti"))
2
3 scoala.profesor1 = new Profesor("Ilie Moromete", "Politica");
4 scoala.profesor2 = new Profesor("Ion", "Stiinte Agronomice");
5 scoala.profesor3 = new Profesor("Stefan Gheorghidiu", "Filosofie");
6
7 scoala.director = new Profesor("Apostol Bologa", "");
8 scoala.nrElevi = 545;
scoala.nrSali = 11;
9
Cerinţe:
1. Afişaţi numele şcolii
Solutie
1 System.out.println( "Numele scolii este " + "\"" + scoala.denumire + "\"." );
Solutie
1 System.out.println( "Scoala are " + scoala.nrElevi + " de elevi, care invata in "
2 + scoala.nrSali+ " sali." );
Solutie
1 System.out.println( "Adresa scolii este " + scoala.adresa + ".");
Solutie
1 System.out.println( "Primul profesor este " + scoala.profesor1 + ".");
Solutie
1 System.out.println( "Materia directorului este " + scoala.director.materie + ".");
4. My Mall
Clasa Mall Clasa Administrator Clasa Cinema
• denumire
• nrEtaje = 2 default
• nrMagazine = 150 default
• Administrator • denumire
• Cinema • denumire • nrSali
Solutie
1
public class Mall {
2 int nrEtaje = 2;
3 int nrMagazine = 150;
4 String denumire;
5 Cinema cinema;
Administrator admin;
6 }
7
1 public class Administrator {
2 String denumire;
3 }
1 public class Cinema {
2 int nrSali;
3 String denumire;
4 }
Cerinţe:
1. Creaţi 2 obiecte de tip Mall care vor avea
acelaşi administrator (afi şi promenada);
Solutie
1 Mall promenada = new Mall();
2 promenada.denumire = "Promenada";
3 //promenada.nrEtaje = 2; // deoarece valoarea default este identica cu val d
4 //promenada.nrMagazine = 150;
5 Cinema movieplex = new Cinema();
movieplex.denumire = "MoviePlex";
6 movieplex.nrSali = 30;
7 promenada.cinema = movieplex;
8
9 Administrator admin=new Administrator();
10 promenada.admin = admin; // ambele Mall-uri au acelasi admin
promenada.admin.denumire = "Mr Bean";
11
12 Mall afi=new Mall();
13 afi.denumire="AFI Palace";
14 afi.nrEtaje=3;
15 afi.nrMagazine=300;
16 afi.cinema=new Cinema();
afi.cinema.denumire="Cinema City";
17 afi.cinema.nrSali=40;
18 afi.admin=admin; // ambele Mall-uri au acelasi admin
19
20
21
2. Care este denumirea administratorului? Pe câte căi se poate ajunge la denumirea sa?
Afişaţi denumirea administratorului folosind toate căile posibile.
Solutie
1 System.out.println( admin.denumire );
2 System.out.println( afi.admin.denumire );
3 System.out.println( promenada.admin.denumire );
Solutie
5. Agenţii de turism
Realizati un program în care vor exista 2 agentii de turism. Numiți-le cum vreți voi.
Agentia 1 Agentia 2
Hotel 1: 50 euro/noapte
Hotel 2: 40 euro/noapte
Hotel 3: 60 euro/noapte
1. Sa se afiseze cat costa fiecare sejur.
2. Realizati schema variabilelor si a obiectelor pe stack si pe heap.
6. Agentii de turism II
Cerinţe:
1. Realizaţi un program în care o agenție de turism prezintă clientului mai multe sejururi
posibile, prestabilite.
2. Agenția colaborează cu 10 hoteluri care au prețurile fixe.
3. Programul va afișa clientului toate datele sejurului.
4. Folosiți constructorii.
5. Folosiţi array-uri.
6. Clientul poate alege un sejur prestabilit sau își poate configura sejurul.
7. Când clientul își va configura sejurul, veți crea un obiect de tip Sejur.
7. Echipe
Scop: Crearea unui proiect care să reflecte una sau mai multe echipe sportive.
1. Creați un proiect nou în Eclipse numit MyTeam; creați clasele
Team;
Player;
BasketballTeam;
FootballTeam;
Test;
2. Clasa Player conține câmpurile name, age și number ce vor fi inițializate în
constructor. De asemenea, mai conține și metoda toString() care afișează numele,
vârsta și numărul jucătorului.
Solutie
1
2 public class Player {
3 String name;
4 int age;
int number;
5
6 public Player(String name, int age, int number) {
7 this.name = name;
8 this.age = age;
9 this.number = number;
10 }
11
@Override
12 public String toString() {
13 return "Jucator: " + name + ", " + age + " ani, joaca cu numarul " + number +
14 }
15 }
16
3. Clasa Team conține un vector de jucători (adică un vector de Player, numit players)
și un număr ce reprezintă numărul de jucători (noPlayers), plus o
metodă printPlayers()pentru afişarea tuturor jucătorilor.
Creaţi constructori în clasa Team:
un constructor cu un singur parametru ce realizează inițializarea
variabilei noPlayersși a vectorului players;
un constructor cu 2 parametri (un vector de String-uri de
dimensiune noPlayersnumit names și numărul de jucători noPlayers).
Apelați în constructorul cu 2 parametri constructorul cu un singur parametru. De ce se
dorește acest lucru?
Tot în acest constructor inițializați elementele vectorul players. Folosiți-vă de
vectorul names pentru nume și generați vârsta și numărul random.
Solutie
public class Team {
1
2 Player[] players;
3 int noPlayers;
4 String name;
5
6 public Team(int noPlayers) {
this.noPlayers = noPlayers;
7 players = new Player[noPlayers];
8 }
9
10 public Team(String[] names, int noPlayer) {
this(noPlayer);
11
12 Random r = new Random();
13
14 for (int i = 0; i < noPlayer; i++) {
15 int varsta = r.nextInt(25) + 10;
16 int numar = r.nextInt(100) + 1;
players[i] = new Player(names[i], varsta, numar);
17 }
18
19 }
20
21 public void printPlayers() {
22
23 for (Player juc : players) {
24 System.out.println( juc );
}
25
26 }
27
28 }
29
30
31
32
33
5. În clasa Test creați 2 echipe, una de fotbal și una de baschet. Afișați la fiecare numele
echipei și jucătorii.
Solutie
1
2 public class Test {
3
4 public static void main(String[] args) {
5
6 String[] namesB = {"Mihai Jordan", "Ilie Chamberlain", "Sorin O'Neal", "Cos
7 String[] namesF = {"Dorin Maradona", "Gabi Lineker", "Ciprian Zidane", "Adr
8
BasketballTeam bt = new BasketballTeam(namesB, namesB.length);
9 bt.name = "Viitorul Los Angeles";
10
11 FootballTeam ft = new FootballTeam(namesF, namesF.length);
12 ft.name = "Iuventus Bucuresti";
13
14 // afiseaza echipa de baschet
15 bt.printBasketballName();
bt.printPlayers();
16
17 System.out.println();
18
19 // afiseaza echipa de fotbal
20 ft.printFootballName();
21 ft.printPlayers();
22
23 }
24
}
25
26
Clasa Object
Toate clasele moștenesc clasa Object, și implicit toate metodele acesteia (sunt public și
protected):
protected Object
clone() Creates and returns a copy of this object.
boolean
equals(Object obj) Indicates whether some other object is "equal to" this one.
protected void Called by the garbage collector on an object when garbage collection
finalize() determines that there are no more references to the object.
void notify() Wakes up a single thread that is waiting on this object's monitor.
void notifyAll() Wakes up all threads that are waiting on this object's monitor.
Modifier and Type Method and Description
Causes the current thread to wait until another thread invokes the notify()
void wait() method or the notifyAll() method for this object.
Causes the current thread to wait until either another thread invokes the notify
void wait(long method or the notifyAll() method for this object, or a specified amount of time
timeout) has elapsed.
Causes the current thread to wait until another thread invokes the notify()
void wait(long method or the notifyAll() method for this object, or some other thread interrup
timeout, int nanos) the current thread, or a certain amount of real time has elapsed.
17. Suprascrierea equals()
Metoda equals(Object o) în mod default verifică dacă adresele a două obiectele sunt
aceleași.
Având în vedere că toate clasele moștenesc clasa Object, deci implicit și
metoda equals(), noi putem se o suprascriem (override), să o redefinim (pentru a
verifica, de exemplu, egalitatea între caracteristicile a două obiecte, cum ar fi frecvența
procesorului, memoria, marca în cazul a două Computere).
Eclipse poate genera această metodă: Source – generate equals() și hashCode()
Suprascrierea toString()
Object are o metodă public String toString() care este moștenită de toate
obiectele. Aceasta returnează un String și se folosește când dorim să transformăm un
obiect într-un String (ex. pentru a-l printa cu System.out.println()).
Când încercăm să printăm un obiect dintr-o clasă creată de noi, această metodă va fi
automat apelată de către compiler iar rezultatul va fi un String alcătuit din numele clasei,
semnul @ și un hashCode. (ex: Person@601bb1), după cum este ea declarată în Object.
getClass().getName() + '@' + Integer.toHexString(hashCode())
Dacă dorim însă să obținem un rezultat care să reprezinte mai bine obiectul, metoda
toString() va trebui suprascrisă în clasa noastră.
19. Pachete
Pachete
Pachetele sunt folosite pentru a grupa clasele în funcţie de modul în care acestea
comunică. Uneori, în aplicațiile foarte mari putem avea aceeași denumire pentru mai
multe clase. Pentru a evita confuziile, dar și pentru o mai bună organizare a claselor
noastre, vom pune clasele în pachete diferite.
Pentru a folosi pachete, se va declara pachetul pe prima linie din fişierul clasei. Pachetele
grupează clasele folosite în foldere în interiorul proiectului, în folderul de fişiere surse
(src).
De exemplu, clasele Client și Cont sunt obiecte clasice cu care lucrăm. Le putem pune
într-un pachet comun pe care să îl numim domain (denumire convenţională).
Clasa Bancaeste o clasă operațională. O putem pune într-un pachet care să se
numeasacă client (la fel, denumire convenţională pentru acest tip de clase).
1 package domain; // prima linie într-o clasă
2 public class Cont {......}
Clasele care nu sunt în același pachet nu se văd unele pe altele și trebuie importate, așa
cum am importat și clasa Scanner, chiar dacă are access-specifier public.
Într-adevăr, aparent nu are logică, dar ideea este de multe ori (chiar foarte des) o aplicație
are biblioteci uriașe cu mii de clase atașate în aplicație. Pentru a face economie de
memorie, JVM nu încarcă toate aceste clase în memorie. S-ar umple memoria cu clase pe
care nu le folosește. De aceea, folosind import, JVM va încărca în memorie doar clasele
cu care va lucra efectiv.
În clasa Banca vom scrie:
1 package client; // prima linie într-o clasă
2
3 import java.util.Scanner;
4 import domain.Client; //clasa clientului nostru de bancă
5 import domain.Cont;
6
public class Banca {
7
8 public static void main (String [] args) {
9 ........
10 }
11
12 }
13
Pentru a denumi un pachet, formatul standard este numele paginii web specificat invers
(exemplu pentru jademy.ro, avem pachetul ro.jademy) (mai ales în Android). Dacă
avem pachetul ro.jademy şi câteva clase în acest pachet (Test.java), atunci structura
proiectului va fi în felul următor: în folderul src, vom avea subfolderul ro, în
subfolderul ro, vom avea subfolderul jademy, iar în subfolderul jademy vom avea
clasa Test.java.
Pentru a folosi o clasă din acelaşi pachet, aceasta este recunoscută automat. Pentru a
folosi clase din pachete diferite, trebuie să importăm clasa respectivă în clasa în care
vrem s-o folosim. Deci vom folosi un import, ca în exemplele de mai sus.
VI. Modificatori
VII. OOP II
VIII. Colectii
IX. Algoritmi
X. Structuri de Date
XI. Excepţii
XII. I/O
XIII. Fire de Executie
XIV. Formatare
XV. Arhitectură
XVI. JDBC
XVII. UI