Sunteți pe pagina 1din 243

I .

Ecosistemul Java

1. Tool-uri necesare
Instalarea uneltelor pentru dezvoltare
Pentru a putea dezvolta aplicaţii în Java, este nevoie de:

JDK (Java Development Kit) – pentru a putea rula programele


Eclipse IDE – mediu de dezvoltare care ajută la scrierea programelor Java

2. Primul Program in Java


Crearea primului proiect
1. Pornirea Eclipse
2. Selectarea unui workspace
3. Crearea unui proiect nou
File → New → Other → Java Project → Next
4. Opțiuni proiect nou
Project Name: First Project → Next → Finish
5. Perspectiva unui proiect Java
Împarţirea spaţiului de lucru: caseta cu fişiere sursă şi editorul de text
Folder-ul src
6. Fişiere sursă - crearea primei clase de test
Crearea unei clase
Introducerea ro.jademy la campul pentru numele pachetului (optional)
Introducerea TestJademy la numele clasei
Bifarea public static void main(String[] args)
7. Metoda main
este punctul de începere a programului
public static void main(String args[]) - execuţia unui program în Java
începe de la metoda main()
8. Prima instrucțiune
Folosirea metodei System.out.println();
Adăugarea instrucțiunii System.out.println("Hello, Jademy!"); în metoda
main
9. Rularea programului
Compilarea şi rularea proiectului folosind săgeata verde din bară (CTRL + F11)
10. Rezultatele programului
Observarea rezultatelor în consolă
11. Sintaxa. Coding Style
Case Sensitivity - Java este case sensitive, ceea ce înseamnă că "hello" şi "Hello" au
semnificaţii diferite
Numele fişierelor – Trebuie să fie exact la fel cu numele claselor
Numele claselor (coding style) – prima literă ar trebui să fie literă mare şi restul mici.
Dacă o clasă are mai multe cuvinte, acestea vor începe cu literă mare, fără spaţii între ele
Exemplu
1 package ro.jademy;
2
3 public class TestJademy {
4 public static void main(String[] args) {
5 System.out.println("Hello, Jademy!");
6 }
7 }
Analiza Proiectului
Clasa public class TestJademy este, de fapt, scrisă în fișierul TestJademy.java.
Uitați-vă în folderul proiectului pe care l-ați creat (acesta se află în folderul de workspace
cu care lucrați în Eclipse). Acolo, în folderul proiectului, veți găsi 2
subfoldere: src și bin. În subfolderul src veți găsi TestJademy.java.
În folderul bin se vor găsi fișierele .class care rezultă din compilarea codului.
Ex: TestJademy.class.
Denumirea clasei trebuie să fie identică, case-sensitive, cu cea a fișierului.

3. JVM. JRE. JDK


JVM -Java Virtual Machine este un program care simulează procesorul
calculatorului. Aplicațiile java rulează pe JVM ca și cum ar rula pe procesorul
calculatorului.
JRE- Acesta conține JVM care rulează aplicațiile java.Dacă nu avem instalată
java pe calculator și navigăm pe vreo pagină web, întâlnim situația în care pagina
ne roagă să instalăm Java pentru a rula o anumită aplicație. Atunci se instalează
JRE.

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.

Eclipse face acest lucru automat. El apelează automat


programul javac.exe(compilatorul) din JDK din C:\Program
Files\Java\jdk1.8.0_31\bin care ne compilează fișierul, creând un fișier
binar JademyTest.class. Eclipse face acest lucru automat, ori de câte ori dăm Save la
o clasă. Eclipse îl salvează în subfolderul bin din aplicația noastră.
Rularea (executarea)
Ori de câte ori noi dăm din Eclipse RUN, Eclipse apelează automat java.exe care
rulează JademyTest.class.
Acest fișier binar se execută cu programul java.exe care se află în una din următoarele
locaţii:

 C:\Program Files\Java\jdk1.8.0_31\bin (dacă avem JDK)


 C:\Program Files\Java\jre1.8.0_31\bin (dacă avem doar JRE)
care practic lansează JVM (dacă nu era lansată) și rulează programul nostru
(JademyTest.class).
Rularea se face prin traducerea (interpretarea) fișierului binar JademyTest.class într-
un fișier pe care să poată să îl înțeleagă sistemul de operare.
Java este un limbaj platform independent. Aplicațiile scrise în java pot rula pe orice
sistem de operare pentru a veni în sprijinul programatorilor, ca să nu fie nevoie ca aceeași
aplicație să fie scrisă în mai multe variante pentru fiecare sistem de operare în parte.
JVM a fost astfel creată pentru a putea traduce (interpreta) orice aplicație java în varianta
specifică sistemului de operare. Există mai multe variante de JVM pentru fiecare sistem
de operare, iar aceasta se comportă ca un strat suplimentar între aplicațiile pe care le
scriem și sistemul de operare.

JVM se poartă ca un simulator de procesor. De fapt, ea intrepretează (traduce)


fișierul JademyTest.class într-un fișier pe care să poată să îl înțeleagă sistemul de
operare. Astfel, îl traduce într-un .exe pentru Windows (sau într-un executabil pentru
Linux, într-un alt executabil pentru Mac, într-un alt executabil pentru Solaris, etc.).
De aici, proprietățile Java de a fi limbaj compilat și interpretat.
Când rulează un program, JVM încarcă automat (din folderele proprii JRE sau JDK) toate
clasele Java din pachetul java.lang, adică clasele String, System, Object, etc.
Ea nu încarcă toate clasele din Java Standard Edition (Java SE). Nu încarcă automat
clasele precum Scanner, ArrayList. Sunt sute de clase în tot pachetul Java SE și ar
însemna o supraîncărcare degeaba a memoriei calculatorului cu clase care nu sunt
folosite.
În momentul citirii și executării unei aplicații scrise de noi, se încarcă doar clasele
folosite, atunci când se citesc instrucțiunile:
1 import java.util.Scanner;
2 import java.util.ArrayList;
Paşi
 se scrie codul într-un editor de text
 se compilează codul
 compilarea generează fişierele pentru execuţie
 JVM citeşte fişierele şi le execută
 JVM încarcă datele şi instrucţiunile în memorie şi le rulează pe procesor

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.

Tabul Advanced , Environment variables

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).

Cuvintele cheie goto şi const sunt rezervate, dar nu sunt folosite.


true, false şi null par ca fiind cuvinte cheie, dar sunt defapt literali (valori). Nici
acestea nu pot fi folosite ca identificatori.
abstract continue for new switch

assert*** default goto* package synchronized

boolean do if private this

break double implements protected throw

byte else import public throws

case enum**** instanceof return transient

catch extends int short try

char final interface static void

class finally long strictfp** volatile

const* float native super while

* not used

** added in 1.2

*** added in 1.4

**** added in 5.0


Numele claselor java (precum String, System, Object, etc) NU sunt rezervate.
int String = 32;
Ele sunt considerate valide ca și identificatori, însă este recomandat să nu le
folosiți fiindcă produc confuzii.

8. Java API: System


Clasa System
Aici putem observa obiectele in și out pe care le-am folosit. După cum vedeți, ele sunt
obiecte statice. Se apelează cu System.in și System.out
in e un obiect de tipul InputStream, iar out este un obiect de tipul PrintStream.
Dacă dați click pe PrintStream, veți putea observa metoda println() pe care o folosim
frecvent: System.out.println().

În clasa System mai putem observa câteva metode:

System.arraycopy(………..) - copiere de arrayuri. Pentru copiere arrayuri mai bine


folosim multele metode copyOf(…) din clasa Arrays, care sunt tot
statice: Arrays.copyOf(…….)
 System.currentTimeMilis() - returnează data în milisecunde începând cu 1 ian
1970
 System.gc() - recomandăm lui JVM să ruleze garbage collectorul
 System.exit() - se încheie aplicația.
După cum vedem, toate sunt metode statice. Se apelează folosind denumirea
clasei: System.metodă(). Nu este nevoie să creăm un obiect pentru a folosi aceste
metode statice.

II.Tipuri de Date si Operatori

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.

3. Să se adauge două bare (/ /) la începutul unei instrucţiuni. Ce diferenţe


observaţi?

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("*****");

2. Să se printeze informaţiile de pe un plic. Rezultatul trebuie să fie asemănător cu cel de


jos. Nu este nevoie să coloraţi fundalul în negru. Nu uitaţi de marginile plicului!

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 }

3.Variabile. Identificatori. Literali


Variabile. Identificatori. Literali
1. Variabile. Tipuri de Date
Variabilele sunt folosite pentru a da nume unor valori. Valorile lor se pot schimba de-a
lungul codului şi de cele mai multe ori nu ne sunt cunoscute.

Î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)

A nu se confunda operatorul de atribuire "=" care schimbă valoarea unei variabile


cu operatorul de comparaţie "==" care ne arată dacă 2 variabile sunt egale sau
nu.

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:

 Primul caracter trebuie sa fie un caracter valid (literă, $, _)


 Următoarele caractere din secvenţă trebuie să fie caractere valide (literă, cifră, $, _)
 Un cuvânt cheie nu poate fi utilizat ca identificator
 Identificatorii sunt case-sensitive
 Exemple de identificatori legali: age, $salary, _value, _1_value
 Exemple de identificatori ilegali: 123abc, -salary
Coding style

 Numele metodelor şi variabilelor – toate metodele şi variabilele trebuie să înceapă cu


literă mică şi să conţină litere mici. Dacă acestea conţin mai multe cuvinte, celelalte
cuvinte vor începe cu literă mare, fără să aibă spaţii între ele. Acest mod de denumire
poartă numele de CamelCase. Examplu: metodaMea
Literali
Un literal este o reprezentare în codul sursă a unei valori fixe. Aceştia sunt reprezentaţi
direct în cod şi pot fi atribuiţi oricărui tip de date primitive. De exemplu:

int a =68; char a ='A';

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:

int decimal=100; int octal =0144; int hexa =0x64;

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:

char a ='\u0001'; String a ="\u0001";

Exerciţii
1. Folosind 3 variabile, afişaţi următorul text. Variabilele sunt subliniate. Alegeţi tipul
corespunzător.

1 This is room #__113__


2 e is close to __2.71828__
3 I am learning a bit about __Computer Science__
Solutie
1 int roomNo = 113;
2 double e = 2.71828;
3 String clasa = "Computer Science";
4
5 System.out.println("This is room #" + roomNo + ".");
6 System.out.println("e is close to " + e + ".");
7 System.out.println("I am learning a bit about " + clasa + ".");

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:

1 Mă numesc Ion Ionică Ionescu şi m-am născut în anul 1820.


Solutie
String nume = "Ion Ionica Ionescu";
1
int an = 1945;
2
3
System.out.println("Ma numesc " + nume + " si m-am nascut in anul " +
4
".");

3. Să se printeze un orar pentru o zi de liceu, ce va conţine numele orei şi profesorul care


o predă. Să se folosească variabile corespunzătoare acolo unde este cazul.

4. Tipuri de Date: Primitive


Tipuri de date primitive în Java
Java cunoaşte 8 tipuri de date primitive. Acestea sunt reprezentate în calculator pe un
număr diferit de biţi, în funcţie de scopul şi tipul acestora.

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

boolean true sau false false 1 bit NA

caracter unicode 16 biţi sau 2


char fără semn \u0000 octeţi 0 (\u0000) → 216 - 1 (\uFFFF)
Valoare
Tip Conţinut implicită Mărime Gama de valori

număr întreg cu 8 biţi sau 1


byte semn 0 octet -27 (-128) → 27 - 1 (127)

număr întreg cu 16 biţi sau 2


short semn 0 octeţi -215 (-32 768) → 215 – 1 (32 767)

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)

număr real de 32 biţi sau 4


float precizie simplă 0.0f octeţi 1.4E-45 → 3.4028235E+38

număr real de 64 biţi sau 8


double precizie dublă 0.0 octeţi 439E-324 → 1.7976931348623157E+308

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?

2. Scrieţi un program care să ceară 2 numere de la tastatură şi să afişeze rezultatele


adunării, scăderii, împarţirii, înmulţirii şi modulo. Folosiţi pe
rând byte, short, int, long.
Exemplu:

1 For the numbers 30 and 10.


2 The result of adding is 40.
3 The result of subtracting is 20.
4 The result of multiplying is 300.
5 The result of dividing is 3.
6 The result of module is 0.
Exerciţii
1. Să se verifice dacă un oraş este metropolă. Se vor folosi 3 variabile:

 isCapitalCity este true dacă şi numai dacă oraşul este o capitală


 numberOfCitizen este numărul de locuitori ai oraşului.
 incomePerCitizen este venitul mediu anual al fiecărui locuitor
O metropolă este un oraş care este

 ori o capitală cu mai mult de 100 000 de cetăţeni


 ori un oraş cu mai mult de 200 000 de cetăţeni şi un venit mediu de 72 000
Să se introducă de la tastatură cele 3 valori, să se reţină într-o expresie booleană rezultatul
şi să se afişeze.

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);

2. Să se calculeze rezistenţa unui fir, ştiind că formula este:

1 R = P (l / A)
Unde:

P – rezistivitatea (exemplu de valori: 1.78*10-8, 2300)


l – lungimea firului în metri
A – aria în metri pătraţi

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

Să se introduca de la tastatură următoarele valori: rezistivitatea, lungimea şi diametrul


firului. Să se afişeze rezistenţa. Să se testeze cu valori implicite (P = 1.78*10-8, l = 1m, D
= 1mm). Să se folosească exprimarea ştiinţifică cu E.

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:

 long - se poate termina cu l sau L


 double - se poate termina cu d sau D
 float - se poate termina cu f sau ''F"

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:

1 int val = (int) ch1;


2 // sau direct:
3 int val = ch1;
4 // primitiva char are în spate un cod numeric.
5 System.out.println(val); // obținem 74.
Ca să printeze valoarea în format Unicode hexazecimal fie transformăm pe 74 într-o
reprezentare în baza 16, fie folosim o metodă a clasei String, pe care nu am învațat-o, și
anume String hex = String.format
("\\u

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.

Concluzie: dacă facem System.out.println(ch1); ne dă J. Ca să obținem valoarea


numerică facem System.out.println( (int)ch1 ); Dacă avem mai multe
variabile de tip char și facem:
char ch1 = 'I';
1
char ch2 = 'o';
2
char ch3 = 'n';
3
System.out.println( ch1 + ch2 + ch3); // calculatorul le transformă
4
adunare
calculatorul le transformă în valori numerice și face adunare
Dacă vrem să obținem scris "Ion" trebuie sa forțăm operatorul "+" să facă concatenare,
nu adunare: System.out.println( "Numele meu este: " + ch1 + ch2 +
ch3 ); ⇒ Ion
Ca să se complice puțin lucrurile, între timp Unicode a trecut la o reprezentare pe 3 bytes
(octeți), adică pe 24 biți, căci se pare că nici 65536 caractere nu au fost suficiente.

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.

Un alt exemplu de un String care conține și caractere unicode:

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?

Afișare din baza 10 în baza 16:

1 Integer.toString(int, 16) sau Integer.toHexString(int)


Din baza 16 în baza 10:
1 Integer.valueOf(string, 16)

7. Cast pentru primitive

Cast (transformare) dintr-o primitivă în alta


Putem atribui unui int valoarea unui short sau byte, pentru că 2, respectiv 1 byte (octet)
încap în 4:
short sh = 45;
int i = sh;

Dar nu putem atribui unui

 byte valoarea unui short sau int sau long


 short valoarea unui int sau long
 int valoarea unui long
 float valoarea unui double
 int valoarea unui float sau double
pentru că pur și simplu spațiul cu mai mulți octeți nu încape într-un spațiu cu mai puțini
octeți.

Obținem o eroare de compilare:

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:

short sh1 = 11;


1
short sh2 = 12;
2
short sh3 = sh1 + sh2; // eroare de compilare, sh1 + sh2 rezultă în
3
int.
4
5
int i = 32 / 5;
6 System.out.println(i); // 6
Exerciții
La o parte dintre întrebări trebuie să folosiți metodele din clasa java.lang.Math.
1. Un rezervor se umple ciclic de la nivelul -128 litri până la nivelul maxim de 127 litri
cu debitul de 1 litru / min. Când se umple se golește într-un minut. Folosind o variabilă
byte calculați ce nivel va avea apa în rezervor la minutul 5000. Dar peste încă 5 minute?

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;

7. Cât face sinus de 30 de grade? Dar de 50 de grade?

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)

8. Scrieți instrucțiunea care să simuleze aruncarea unui zar.

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);

9. Cât este radical din 2?

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?

13. Cât face logaritm în baza 10 din 1000?

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.

8. Tipuri de Date: String


String
Un String este un şir de caractere care conţine mai multe caractere. Fiecărui caracter din
String îi este asociată o poziţie (sau index). Numărătoarea poziţiilor începe de la 0.
Astfel, şirul “JAVA” conţine 4 caractere care au următorii indecşi:

 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:

 .charAt(int index) returnează char-ul de la indexul respectiv


 .concat(String str) returnează stringul rezultat din concatenarea a două stringuri
 .equals(Object object) returnează un boolean (true sau false)
 .getBytes() returnează un array de byte byte[]
 .getChars(..) nu returnează nimic (void).
 .indexOf(int ch) returnează un int (indexul). Observați că parametrul ch nu a fost
scris ca char ci ca int, pentru că așa cum am văzut, char poate fi asociat cu un int. În fond
este un număr: char ch = 345;

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

3. Să se citească 2 şiruri de caractere. Să se concateneze folosind o metodă şi să se


afişeze.

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);

5. Se citeşte un şir de caractere de la tastatură. Să se verifice dacă acesta se termină cu


“ala”.

Solutie
1 String a = "scoala";
2 String b ="ala";
3
4 boolean c = a.endsWith(b);
5
6 System.out.println( c );

6. Să se compare 2 şiruri de caractere citite de la tastatură. Comparaţia să se facă ţinând


cont de caracterele majuscule (MARE este egal cu MARE, dar nu este egal cu Mare),
apoi ignorând-ule (Mare este egal şi cu MARE şi cu mArE).

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));

7. Se citeşte un şir de caractere şi un caracter. Să se verifice dacă caracterul se află în şir,


prin poziţia sa.

Hint
1 Folosiţi metoda indexOf()

8. Să se citească un şir de caractere şi să se afişeze câte caractere conţine.

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()

11. Să se returneze un subşir dintr-un şir introdus de la tastatură în funcţie de 2 indecşi


(introduşi la rândul lor de la tastatură). De exemplu: pentru şirul “avion” şi indecşii 1 şi 3
se va afişa “vi”. Indexul de început va fi inclus, iar cel de sfârşit exclus.

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 Scanner keyboard = new Scanner(System.in);


Exemplu 1

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!");

3. Cereţi utilizatorului câteva informaţii şi afişaţi-le la sfârşit. De exemplu:

1 Please enter the following information so I can sell it for a profit


2
3 First name: Helena
4 Last name: Bonham-Carter
5 Grade (9-12): 12
6 Student ID: 453916
7 Login: bonham_453916
8 GPA (0.0-4.0): 3.73
9
10 Your information:
11 Login: bonham_453916
12 ID: 453916
13 Name: Bonham-Carter, Helena
14 GPA: 3.73
15 Grade: 12
4. Refaceţi următoarea conversaţie, astfel încât să aflaţi numele şi vârsta utilizatorilor.
Afişaţi vârsta pe care aceştia o să o aibă în 5 ani, şi vârsta care au avut-o acum 5 ani.

1 Hello. What is your name? Percy_Bysshe_Shelley


2 Hi, Percy_Bysshe_Shelley! How old are you? 34
3
4 Did you know that in five years you will be 39 years old?
5 And five years ago you were 29! Imagine that!
Solutie
Scanner keyboard = new Scanner(System.in);
1
2 System.out.println("Hello. What is your name?");
3 String nume = keyboard.next();
4
5 System.out.println("Hi, " + nume + ". How old are you?");
6 int varsta = keyboard.nextInt();
7
8 System.out.println("\n"); // un rand gol
9 System.out.println("Did you know that in five years you will be " + (
10 "?");
11 System.out.println("And five years ago you were " + (varsta - 5) + "?
that!");

5. Creaţi un calculator simplu care cere 3 numere reale de la tastatură (a, b, c) şi


calculează suma lor, apoi o împarte la 2. Afişaţi rezultatul pe ecran.

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.

Se calculează luând greutatea individului (masa) în kilograme și împărțind-o la pătratul


înălțimii acestuia, calculată în metri.

Exemplu de Output:

1 Înălțimea ta (m): 1.75


2 Greutatea ta (kg): 73
3 IMC-ul tău este 23.83673
Apoi, introdu greutatea și înălțimea folosind pounds și inches (unități de măsură ale US),
făcând apoi conversia la kilograme și metri pentru a afla IMC-ul.

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:

Introduceți primul număr:


1
5
2
Introduceți al doilea număr:
3
2
4
Ce operație doriți să efectuați, introduceți unul din semnele: +, -,
5
/:
6 *
7 Rezultatul este: 5 * 2 = 10.
Pentru a compara 2 string-uri se folosește metoda equals().

10. Tipuri de Date: array

Tablouri (Arrays). Introducere


Un tablou poate conţine mai multe elemente care aparţin aceluiaşi tip de date, spre
deosebire de variabilele simple care pot reţine un singur element. De exemplu, putem
folosi variabile care sunt tablouri pentru a reţine 10 numere întregi.
1 10, 20, 45, 12, 60, -120, 14
Fiecare element din tablou are asociată o poziţie. Numerotarea poziţiilor începe de la 0 şi
merge până la lungimea acestuia -1. De exemplu:

 n = numărul de elemente ale tabloului


 0 = prima poziţie
 n-1 = ultima poziţie
În tabloul prezentat mai sus elementul 10 este pe poziţia 0, elementul 20 pe poziţia 1,
etc… Numărul total de elemente este 7, iar ultimul element, adică 14 este pe poziţia 6.

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

A 10 15 43 28 (0, 0) (0, 1) (0, 2) (0, 3)

B 24 35 46 30 (1, 0) (1, 1) (1, 2) (1, 3)

C 18 -100 3 48 (2, 0) (2, 1) (2, 2) (2, 3)


Pentru a folosi un vector în Java, vom adăuga un set de paranteze [] la declarare şi vom
iniţializa folosind din nou [], împreună cu cuvântul new şi numărul de elemente, ca în
exemplu. Dacă un tablou a fost iniţializat, elementele lui încă nu există, deci trebuie să
atribuim şi acestora valori.
Exemplu

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 String [] flori = {“zambilă”, “panseluță”, “iris”};


Computerul va ști că trebuie să construiască un array cu 3 elemente și va pune automat
aceste stringuri în array. Dar acest lucru se poate face doar la declararea
variabilei flori. Nu se poate să declaraţi variabila și să construiţi array-ul în doua
comenzi diferite:
1 String [] flori;
2 flori = {“zambilă”, “panseluță”, “iris”}; // nu e acceptat.
Cum funcţionează un array?
Ce se întâmplă în spatele codului în momentul rulării programului:

1 /* 1 */ int [] arrayulMeu;
2 /* 2 */ arrayulMeu = new int[1000];

La pasul 1, se va crea o variabilă în zona de memorie pe stack (stivă) cu denumirea


de arrayulMeu de tip array.
În acest moment, variabila nu conține nimic. (De fapt conține. Conține o informație de tip
adresă care nu pointează către nici un obiect. O să înțelegeți ce înseamnă asta puțin mai
jos. Cu alte cuvinte conține null.)
Dacă vom incerca să o comparăm cu vreo valoare, Eclipse ne va da eroare de compilare.

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.

Popularea unui array se poate face ușor folosind o buclă:


1 for (int i=0; i<arrayulMeu.length ; i++) {
2 arrayulMeu[i] = i*2;
3 }
4
5 // arrayulMeu.length = 1000.elemente
Deci noi mergem de la 0 inclusiv la 1000 exclusiv. Indexul ultimei căsuțe este 999,
adică arrayulMeu.length – 1.
Țineți minte: când trebuie să parcurgem un array (ca și la String), scriem for (int
i=0; i<arrayulMeu.length ; i++) și nu vor fi probleme.
De ce ar fi probleme? Pentru că dacă încercăm să
apelăm arrayulMeu[1000] programul va crăpa cu o eroare la rulare de
tipul ArrayIndexOutOFBoundsException (similară cu cea de la
String: StringIndexOutOfBoundsException) pentru că nu există căsuța cu indexul
1000. (Nu vom obține eroare la compilare deoarece compilatorul nu știe asta).
Array-urile sunt obiecte
Un tablou este un obiect, la fel ca un string. Obiectele au proprietăți și metode care pot fi
apelate. De exemplu, stringurile au
metodele .equals(), .trim(), .charAt(), indexOf(), .length(). Arrayurile nu
au metode, dar au proprietatea length.
Când se creează pe HEAP obiectul de tip array, se va crea și o variabilă length în el,
care va avea valoarea numărului de elemente.

Rețeineți că există o diferență semnificativă între primitive și obiecte.

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?

1 String [] flori = new String [5];


2 flori[0] = “Panseluță”;
3 flori[1] = “Păpădie”;
4 flori[2] = “Viorele”;
5 flori[3] = “Zambilă”;
6 flori[4] = “Narcisă”;

Nu este obligatoriu să populăm toate elementele unui array:

1 String [] flori = new String [5];


2 flori[0] = “Panseluță”;
3 flori[1] = “Păpădie”;
4 flori[2] = “Viorele”;
5
6 flori[4] = “Narcisă”;

Î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.

Tablouri cu mai multe dimensiuni


În Java, putem folosi tablouri cu mai multe dimensiuni. Array-urile pot conține elemente
de tip array. În loc să conţină elemente de tip int sau float sau boolean sau String,
putem avea: * array de arrayuri de int sau * array de arrayuri
de String''
Atunci când avem un tablou de tablouri, putem spune că avem un tablou cu 2 dimensiuni.
Pentru a înţelege acest concept, urmăriţi următoarea schemă:
Practic, fiecare tablou conţine un tablou care conţine elemente. Null ne indică faptul că
nu avem niciun tablou.

Exemplu:

1 String [][] multiArr = {


2 {"panseluta","mac"},
3 {"vulpe", "iepuras", null, "caprioara"},
4 {null, "Bucuresti", "Ierusalim"}
5 };

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);

3. Se citește un număr de la tastatură. Să se creeze un array ce conține cifrele acestui


număr.

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 }

4. Se citește un număr de la tastatură. Să se construiască un array cu divizorii numărului.

Exerciţii tablouri multidimensionale


1. Să se introducă numere aleatoare într-o matrice de 3 x 4. Să se afişeze.
Solutie
int[][] numere = new int[3][4];
1
2 for (int i = 0; i < numere.length; i++) { // numere.length == 3
3
4
for (int j = 0; j < numere[i].length; j++) { // numere[i].len
5
4
6 numere[i][j] = (int) (Math.random()*100);
7 System.out.print(numere[i][j] + " ");
8 }
9
10
System.out.println();
11
12
}
11. Tipuri de Date: ArrayList

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.

Spre deosebire de array, ArrayList poate conține numai obiecte, nu și primitive.

ArrayList lista = new ArrayList(); // s-a creat un ArrayList care nu a


1
element.
2
lista.size(); // returnează numărul de elemente. În acest caz =0.
Metode uzuale

Modifier and Type Method and Description

boolean add(E e) Appends the specified element to the end of this list.

void add(int index, E


element) Inserts the specified element at the specified position in 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.

void clear() Removes all of the elements from this list.

Object clone() Returns a shallow copy of this ArrayList instance.

boolean contains(Object
o) Returns true if this list contains the specified element.

Increases the capacity of this ArrayList instance, if necessary, to ensure


void ensureCapacity(int that it can hold at least the number of elements specified by the minimum
minCapacity) capacity argument.

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.

boolean isEmpty() Returns true if this list contains no elements.

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.

int size() Returns the number of elements in this list.

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

Returns an array containing all of the elements in this list in proper


Object[] toArray() sequence (from first to last element).

Returns an array containing all of the elements in this list in proper


sequence (from first to last element); the runtime type of the returned
<T> T[] toArray(T[] a) array is that of the specified array.

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)

ArrayList<String> lista = new ArrayList<String>(); // nu se mai pot a


1
String.
2
3
// Obtinerea unui element de pe o anumita pozitie:
4
String comp = lista.get(4);
5
6
// returnarea primei pozitii în care se găsește un element
7
int index = lista.indexOf(sir1);
8
9
// returnarea ultimei pozitii in care se gaseste un element
10
int index = lista.lastIndexOf(sir1);
11
12 //stergerea unui element
13 String computer = "ASUS"; // sterge elementul de pe pozitia 3 și îl r
14 boolean bool = lista.remove(computer1);
Exerciţiu
Se considera mai multe avioane reprezentate sub forma de String.

1. Creați o listă (ArrrayList) de avioane folosind variabile pe stack.

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);

2. Afișați avionul de pe indexul 3.

Solutie
1 System.out.println(avioane.get(3));

3. Înlocuiţi un avion cu altul nou.

Solutie
1 String avionNou = "Spitfire";
2 avioane.set(3, avionNou); // sau avioane.set(3, "Spitfire");
3 System.out.println(avioane.get(3));

4. Verificați dacă lista de avioane conține un anumit avion.

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
);

5. Afișați indexul unui avion.

Solutie
System.out.println("Index Lockheed = " +
1
avioane.indexOf(avionLockheed));

6. Ștergeți un avion după index.

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 );

12. Operatori: atribuire


Operatori: atribuire
Unul dintre operatorii cei mai comuni este cel de atribuire (=). Acesta este folosit pentru
a atribui unei variabile una dintre următoarele:
1) o valoare fixă:

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 String s = new String("Hello");


2 Employee e = new Employee();
O expresie de atribuire returneză mereu o valoare, cea care a fost atribuită variabilei. Spre
exemplu, valoarea returnată de expresia a = 5 este 5. Putem astfel să înlănțuim mai multe
atribuiri:

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 boolean isNew = false;


2 if (isNew = true) {
3 System.out.println("Este nou.");
4 }
c) nu va compila, condiția if așteaptă un boolean și primește un int

1 if (x = 3) {
2 doSomething();
3 }

13. Operatori: aritmetici

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//.

Exista si ++i și ––i.


i++ diferă de ++i în sensul că al doilea se efectuează imediat. La fel şi
pentru i–- şi -–i.
Daca facem System.out.println(i++);, il afisează mai intai pe i si apoi il
incrementeaza. Daca facem System.out.println(++i);, mai intai il incremeteaza
pe i, si apoi face afisarea. La fel si cu i-– si -–i:
1 int a = 4;
2 int b = 10;
3 System.out.println(a++ + ++b);
4 // b devine 11.
5 // se aduna a+b=15
6 // se afiseaza 15
7 // apoi a devine 5.
La fel si cu z= a++ + ++b;. z va fi 15, nu 16.
Dacă facem int i = 5; si apoi i = i++;, i ramane 5, nu se incrementează la 6.
Pentru că i se atribuie lui i vechea lui valoare. Dacă facem i = ++i;, atunci i se
incrementează.
Plus și minus
+ și - se mai pot folosi pentru a stabili semnul numerelor.
3. Operatorii de atribuire compuși
1 int a = 3;
2 a+=5; e totuna cu a = a + 5; \\
Atribuim lui a valoarea anterioară la care adunăm 5, a va fi 8, adică 3 + 5.

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.

Operatori de comparație se folosesc numai pentru primitive


Dacă folosim == la obiecte, se compară adresa din memorie. Din întâmplare merge la
String, pentru a compara șirurile, dar doar în anumite cazuri. Mai multe detalii puteți găsi
la pagina String Pool.
Nu folosiți == și != pentru a compara șiruri de caractere (String)!
Egalitatea dintre 2 obiecte se face cu metoda equals() Exemple de obiecte:
String, array. Pentru a verifica egalitatea dintre 2 obiecte, metoda equals trebuie
redefinită pentru obiectul respectiv (o să vedem asta săptămâna asta), astfel,
calculatorul să știe cum să verifice egalitatea. Cum verifici egalitatea între 2 raci?
Sau 2 ursuleți? Depinde ce vrei să compari.
Dacă nu o redefinim, equals() testează egalitatea adreselor acestor obiecte în
memorie, ca și ==. La Array nu are sens să verificăm egalitatea. equals()
testează egalitatea adreselor acestor obiecte în memorie, nu dacă au elemente
identice. Dacă vrem să testăm dacă au elemente identice, trebuie să verificăm
noi manual element cu element.

String a redefinit metoda equals(). De accea o putem folosi pentru a verifica


egalitatea dintre 2 șiruri de caractere. (Mai multe despre equals() săptpmâna
asta.) În cazui clasei String putem compara două șiruri din punct de vedere
alfabetic (asemenea unui dicționar, care cuvânt se situează în fața altuia din
punct de vedere alfabetic) cu metoda .compareTo(alt șir);

15. Operatori: logici

Operatori Logici. Funcţii booleene


1. Funcţii Booleene
a. Adevărat (true), Fals (false)
b. Identitate, Negație (not)
 Identitate: aceeași valoare pe care o are şi propoziția
 Negație: valoarea inversă propoziției (not, !, ~)
P P !P

True True False

False False True


c. Conjuncţie (and), Disjuncţie (or)
 Conjuncţie: adevărat dacă ambele propoziţii sunt adevărate (and, &&, &)
 Disjuncţie: adevărat dacă cel puţin una din propoziţii este adevărată (or, ||, |)
P Q P && Q P || Q

True True True True

True False False True

False True False True

False False False False

d. nand, nor
 nand: negaţia conjuncţiei
 nor: negaţia disjuncţiei
P Q P nand Q P nor Q

True True False False

True False True False

False True True False

False False True True

e. Egalitate Logică (xnor), Disjuncţie Exclusivă (xor)


 Egalitate logică: adevărat dacă ambele propoziţii au aceeaşi valoare de adevăr, fals dacă
au valori diferite
 Disjuncţie exclusivă: adevărat dacă propoziţiile au valori diferite de adevăr, fals dacă au
aceeaşi valoare
P Q P xnor Q P xor Q

True True True False

True False False True

False True False True

False False True False


Pentru:
 xor, în java există notația ^: (p ^ e )
 xnor este negația lui xor: !(p ^ e )
Exemplu
1. Să presupunem că Maria și Gigel au câte o prăjitură. Rareș e tare pofticios și speră să
nu se îmtâmple ca atât Maria cât și Gigel să își mănânce prăjiturile.

Dacă notăm:

 boolean m = true; - Maria mănâncă prăjitura


 boolean g = true; - Gigel mănâncă prăjitura
Gigel speră următoarea situație:

 ! (m & g) = !m | !g, unde:


 !m înseamnă negația lui m
 !g înseamnă negația lui g
 | înseamnă ori
Așadar, măcar unul din cei doi copii să nu își mănânce prăjitura.

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.

Negația conjuncției este disjuncția negațiilor.


3. Bunica lui Patrick și a lui Emily nu vrea ca unul din copii să fie bolnav. De fapt, ceea
ce ea vrea, este ca atât Patrick cât și Emily să fie sănătoși.

Dacă notăm:

 boolean p = true; - Patrick e bolnav


 boolean e = true; - Emily e bolnavă
Bunica lor nu vrea să aibă loc p sau e: ! (p | e ) = !p & !e Unde:
 !p înseamnă negația lui p
 !e înseamnă negația lui e
 & înseamnă și
Așadar, atât Patrick, cât și Emily să fie sănătoși.

Negația disjuncției este conjuncția negațiilor.


2. Operaţii Binare
Operațiile binare de bază sunt și (AND), sau (OR) și negație (NOT). Dintre acestea,
primele două sunt operații binare iar a treia este o operație unară.

Tabla operaţiilor logice binare de bază

Simbol Simbol Programare Simbol Programare Operator Operator


Operaţie Logic (Logică) (Binar) 1 2 Rezult

0 0 0

0 1 0

1 0 0

AND (şi) ^ && & 1 1 1

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 true false

false false false

| true false

true true true

false true false

^ true false

true false 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:

String str; //definirea unei variabile fără a o instanția, (fără a cr


1
obiect).
2
diverse linii de cod.........în care variabila poate sau nu să fie in
3
if (str.length() == 7){….......} ==>> EROARE LA RULAREA PROGRAMULUI
Eroarea apare pentru că str nu are nici o referință către nici un obiect (Mai mult depre
obiecte în zilele următoare Atenție: String este o CLASĂ, nu o PRIMITIVĂ. Cu ajutorul
clasei String creăm obiecte de tip String). Nu putem apela metoda length() la un obiect
care nu există.
Așa cum nu se poate apela medota turn(grade) la un lobster care nu exsită.

Cum rezolvăm problema?

1 if (str != null && str.length()==7 ) {.........}


cu ajutorul operatorului AND de scurtcircuitare
Dacă str e null, cea de-a doua condiție nici nu mai este evaluată și nu se mai
generează eroarea!

16. Operatori: pe bit


Operatori pe bit (Bitwise and Bit Shift Operators)
Java pune la dispoziție un set de operatori pe bit care pot fi folosiți cu numere întregi de
tip byte, short, char, int și long. Ei nu sunt însă des folosiți.

1 int a = 60; // 0011 1100 în binar


2 int b = 13; // 0000 1101 în binar
Operator Descriere Exemplu

(a & b) rezultă 12 (0000


& (bitwise and) copiază un bit la rezultat dacă există în ambii operanzi 1100)

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)

~ (bitwise ~1 este 0; ~00000000


compliment) inversează tiparul este 11111111

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 )

operandul din stânga este mutat la dreapta de numărul de


>> (right shift) biți precizați de operandul din dreapta a >> 2 rezultă 15 (1111

17. Operatori: ternar


boolean bool;
1
a > 5 ? bool = true : bool = false);
2
System.out.println(a> 5 ? "a este mai mare decât 5" : "a nu este mai
3
5");
Se verifică dacă a este mai mare decât 5. Dacă da, se efectuează prima operație
după semnul întrebării. Dacă nu, se efectuează cea de a doua.

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 }

18. Operatori: precedenta


Precedenta Operatorilor

Operator Precedență Direcție

Postfix a++, a–, [], .membru, metodă() Stânga la dreapta

Unari ++a, –a, !, ~ Dreapta la stânga

new & Cast new, (cast) Sreapta la stânga

Aritmetici *, /, %,+, - Stânga la dreapta

Relaționali <, >, <=, >= Stânga la dreapta

Egalitate ==, != Stânga la dreapta

Logic AND (şi) && Stânga la dreapta

Logic OR (sau) || Stânga la dreapta

Ternar ?: Dreapta la stânga

Assignement (Atribuire) =, +=, -=, *=, /=, %= Dreapta la stânga

III. Structuri de Control

 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.

2. Aflarea dimensiunii unui șir de caractere.

1 String string3 = "Marioara";


2 if ( string3.length() == 8 ) {….}
Dar, atenție, dacă string nu e instanțializat/inițializat/definit? Dacă string3 e null?
Verificăm:

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:

1 if ( string3 != null && string3.length() == 8 ){..........}


&& - operatorul logic AND de scurtcircuitare.
Dacă prima condiție e false, nu se mai verifică cea de a doua condiție, ca nu are
sens. false & true tot false dă. Cea de a doua condiție se evaluează numai dacă
prima e true.
If Else
Atunci când condiţia de la if este falsă, putem avea alt set de instrucţiuni pe care îl vom
executa puse în clauza else. Mai mult, se pot face verificări succesive, astfel încât să
executăm doar instrucţiunile potrivite pentru o anumită condiţie.

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 }

else nu este obligatoriu


Exemplu
int weekday = 2;
1
String result = "";
2
if ( weekday == 1 ) {
3 result = "Luni";
4 } else if ( weekday == 2 ) {
5 result = "Marti";
6 } else if (weekday == 3) {
7 result = "Miercuri";
8 } else {
9 result = "Alta zi";
10 }
11
Exerciţii
If
1. Creaţi un program care să afişeze unul din următoarele mesaje pentru o vârstă
introdusă de la tastatură. Testaţi programul cu toate variantele.
 Pentru o vârstă mai mică de 16 ani, “Nu poţi conduce.”
 Pentru o vârstă între 16 şi 17 ani: “Poţi conduce, dar nu poţi vota.”
 Pentru o vârstă între 18 şi 24 de ani: “Poţi vota, dar nu poţi închiria maşini.”
 Pentru o vârstă de 25 de ani sau mai mare: “Poţi să faci cam orice.”
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Ce varsta ai?");
4 int varsta = keyboard.nextInt();
5
6 if (varsta < 16) {
7 System.out.println("Nu poti conduce");
8 }
9
10 if (varsta >= 16 && varsta <= 17) {
11 System.out.println("Poţi conduce, dar nu poţi vota.");
12 }
13
14 if (varsta >= 18 && varsta <= 24) {
15 System.out.println("Poţi vota, dar nu poţi închiria maşini.");
16 }
17
18 if (varsta >= 25) {
19 System.out.println("Poţi să faci cam orice.");
20 }

2. Introduceţi un număr între 1 şi 7 de la tastatură. Afişaţi denumirea zilei corespuzătoare


numelui introdus (1 – Luni, 2 – Marți, etc.)
3. Se cunoaşte gravitaţia relativă pentru fiecare planetă. Să se introducă greutatea de pe
Pământ şi planeta dorită şi să se afle greutatea pe planeta respectivă, ştiind că:
 1 Venus – 0.78
 2 Marte – 0.39
 3 Jupiter – 2.65
 4 Saturn – 1.17
 5 Uranus – 1.05
 6 Neptun – 1.23
Pentru calcul, se va înmulţi greutatea introdusă cu gravitaţia de pe planeta cerută.

Ex: 128 * 0.39 = 49.92.

Exemplu consolă:

1 Introduceți greutatea actuală de pe pământ: 58kg


2 Am informație pentru următoarele planete:
3 1. Venus 2. Marte 3. Jupiter
4 4. Saturn 5. Uranus 6. Neptun
5
6 Ce planetă vizitezi? -> 2
7 Greutatea ta ar fi undeva la 22kg pe acea planetă.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 double gravitatieVenus = 0.78;
4 double gravitatieMarte = 0.39;
5 double gravitatieJupiter = 2.65;
6 double gravitatieSaturn = 1.17;
7 double gravitatieUranus = 1.05;
8 double gravitatieNeptun = 1.23;
9
10
11 System.out.println("Ce greutate ai?");
12 double greutatePamant = keyboard.nextDouble();
13
14 System.out.println("Alege o planeta (introdu numarul):");
15 System.out.println("1. Venus" + "\n"
16 + "2. Marte" + "\n"
17 + "3. Jupiter" + "\n"
18 + "4. Saturn" + "\n"
19 + "5. Uranus" + "\n"
20 + "6. Neptun"
21 );
22
23 int planetaAleasa = keyboard.nextInt();
24
25
26 if (planetaAleasa == 1) {
27 System.out.println("Greutatea ta pe Venus este " + greutatePamant *
28 kg.");
29 }
30
31 if (planetaAleasa == 2) {
32 System.out.println("Greutatea ta pe Marte este " + greutatePamant *
33 kg.");
34 }
35
36 if (planetaAleasa == 3) {
37 System.out.println("Greutatea ta pe Venus este " + greutatePamant *
38 kg.");
39 }
40
41 if (planetaAleasa == 4) {
42 System.out.println("Greutatea ta pe Venus este " + greutatePamant *
43 kg.");
44 }
45
46 if (planetaAleasa == 5) {
47 System.out.println("Greutatea ta pe Venus este " + greutatePamant *
48 kg.");
}

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ă:

1 Ești pregatit(ă) pentru un test? -> Y


2
3 Bun, începem așadar!
4 Î1) Care este capitala statului Alaska?
5 1) Melbourne
6 2) Anchorage
7 3) Juneau
8 -> 3
9 Corect!
10
11 Î2) Poți stoca valoarea "pisică" într-o variabilă de tip int?
12 1) da
13 2) nu
14 -> 1
15 Ne pare rău, "pisică" este o valoare de tip string. int poate stoca
16 numere.
17
18 Î3) Care este rezultatul ecuației 9+6/3?
19
20 1) 5
21 2) 11
22 3) 15/3
23 -> 2
24 Corect!
25
26 În total, ai răspuns corect la 2 întrebări din 3.
Mulțumim pentru participare!
5. Scrieţi un program prin care să ghiciţi un număr. Reţineţi un număr într-o variabilă,
apoi introduceţi un număr de la tastatură. Dacă numărul introdus este egal cu cel reţinut,
afişaţi un mesaj de genul “Ai ghicit numărul!”. Dacă este diferit, afişaţi mesajul “Nu ai
ghicit numărul…”.
6. Introduceţi un număr întreg de la tastură. Afişaţi toate proprietăţile acestuia: par sau
impar, pozitiv sau negativ.
If else
Assignment if-else Refaceţi exerciţiile Exerciţii if astfel încât să folosiţi o structură if-
else şi operatorii logici && sau ||.
1. Calculator IMC
Creaţi un calculator BMI (body mass index) (IMC – indice de masă corporală). Acesta
este folosit în sănătate şi nutriţie pentru a estima obezitatea populaţiei. Se cere înălţimea
în metri şi greutatea în kg, apoi se împarte greutatea la înalţimea la patrat.

Ex: kg / (m * m).

Se cere să se afişeze indicele BMI şi categoria din care face parte.

Categorii:

 IMC sub 18.5 - sunteţi o persoană subponderală


 IMC între 18.5 şi 24.9 - sunteţi o persoană normală
 IMC între 25.0 şi 29.9 - sunteţi o persoană supraponderală
 IMC peste 30.0 - sunteţi o persoană obeza
Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Ce inaltime ai (cm)?");
4 double inaltimeMetri = keyboard.nextInt() / 100.0;
5
6 System.out.println("inaltimeMetri = " + inaltimeMetri);
7
8 System.out.println("Ce greutate ai (kg)?");
9 double greutate = keyboard.nextDouble();
10
11 double bmi = greutate / (inaltimeMetri * inaltimeMetri);
12
13 System.out.print("Indice BMI: " + bmi + ". ");
14
15 if (bmi < 18.5) {
16 System.out.print("Sunteţi o persoană subponderală.");
17 } else if (bmi < 24.9) {
18 System.out.print("Sunteţi sunteţi o persoană cu greutate
19 normală.");
20 } else if (bmi < 29.9) {
21 System.out.print("Sunteţi o persoană supraponderală.");
22 } else if (bmi >= 30) {
23 System.out.print("Sunteţi o persoană obeza.");
}

2. Două întrebări
Să se folosească 2 întrebări pentru a ghici un obiect. Se dă următorul exemplu:

Întrebarea 1: Poate fi din interior, din exterior sau ambele?


Întrebarea 2: Este în viaţă?

Cu următoarele variante:

înăuntru afară ambele

în viaţă plantă de ghiveci bou câine

nu e în viaţă perdea de duş panou publicitar smartphone


Exemplu consolă

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." );
}
}

3. Pentru exerciţiul anterior să se adauge şi a treia întrebare!


4. Testaţi metoda compareTo() a clasei String.
1 System.out.print("Comparing \"axe\" with \"dog\" produces ");
2 int i = "axe".compareTo("dog");
3 System.out.println(i);
4 System.out.print("Comparing \"applebee's\" with \"apple\" produces ")
5 System.out.println( "applebee's".compareTo("apple") );
Această metodă va produce un rezultat negativ dacă folosim un cuvânt care este alfabetic
înaintea cuvântului cu care se compară şi un rezultat pozitiv, dacă cele 2 cuvinte sunt în
ordine alfabetică inversă.

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:

Random rand = new Random();


1 Scanner tast = new Scanner(System.in);
2
3 int a = rand.nextInt(10);
4 int b = rand.nextInt(10);
5 int c = rand.nextInt(10);
6
7 System.out.println("Valori generate: " + a + " , " + b + " , " + c);
8 System.out.println("Index : (1) (2) (3)");
9
10
System.out.println("Introduceti ordinea (1, 2 si 3) si apasati
11 'Enter':");
12 int primaPozitie = tast.nextInt();
13 int aDouaPozitie = tast.nextInt();
14 int aTreiaPozitie = tast.nextInt();
15
16
17
// completati aici astfel incat afisarea de mai jos sa se faca
18 // conform ordinii introduse de utilizator
19
20
// ....
21
// ....
22
23
24
System.out.println("Valori sortate : " + a + " , " + b + " , " + c);
Solutie
1 // completati aici astfel incat afisarea de mai jos sa se faca
2 // conform ordinii introduse de utilizator
3
4 if (primaPozitie == 1) {
5 // variabila a isi pastreaza valoarea
6 if (aDouaPozitie == 2) {
7 // variabila b isi pastreaza valoarea
8 // la fel si c, nimic nu se schimba
9 } else {
10 // se inverseaza valorile lui b si c
11 int valoareTemporara = b;
12 b = c;
13 c = valoareTemporara;
14 }
15
16 } else if (primaPozitie == 2) {
17 int valoareTemporara = a;
18 a = b;
19
20 if (aDouaPozitie == 1) {
21 b = a; // iar c ramane neschimbat
22 } else {
23 b = c;
24 c = valoareTemporara;
25 }
26
27 } else if (primaPozitie == 3) {
28 int valoareTemporara = a;
29 a = c;
30
31 if (aDouaPozitie == 1) {
32 c = b; // mutam valoarea din b la pozitia c
33 b = valoareTemporara;
34 } else {
35 c = valoareTemporara;
36 }
37 }

 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

Structura Repetitivă. While


while este o structură repetitivă cu număr necunoscut de pași.
Structura repetitivă while este folosită pentru a executa o secvenţă de instrucţiuni cât timp
o condiţie este adevarată.

Sintaxa generală este:

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 Ghiciti un numar intre 1 si 10.


2 Introduceti numarul: 3
3 Numarul cautat este mai mare!
4 Introduceti numarul: 8
5 Numarul cautat este mai mic!
6 Introduceti numarul: 6
7 Felicitari! Ati ghicit numarul!
Solutie
int nrDeGhicit = 75;
1
Scanner keyboard = new Scanner(System.in);
2
int incercare = 0;
3
System.out.println ("Incearca sa ghicesti numarul...");
4
5
while(incercare != nrDeGhicit) {
6
incercare = keyboard.nextInt();
7
if (incercare < nrDeGhicit) System.out.println("Numarul tau e pre
8
else if (incercare > nrDeGhicit) System.out.println("Numarul tau
9 }
10 System.out.println("Ai ghicit, felicitari!"); // fara alte conditi
11 numarul

2. Pentru programul anterior, afişaţi şi numărul de încercări care au fost necesare.


3. Introduceţi un mesaj de la tastatură. Afişaţi mesajul de 5 ori.
Secvenţă de cod ajutătoare:

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:

 Mesajul să fie afişat de 10 ori.


 Afişaţi în faţa mesajului numerele 10, 20, 30, 40, etc… Rezolvaţi în 2 moduri.
 Cereţi numărul de afişări de la tastatură.
 Să fie folosit operatorul de decrementare în locul celui de incrementare.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 System.out.println("Introduceti un mesaj pentru a fi repetat");
3 String mesaj = keyboard.nextLine();
4
5 // Afisati mesajul de 5 ori.
6 // Mesajul să fie afişat de 10 ori.
7 int contor = 0;
8
9 while (contor < 5) { // respectiv n < 10 pentru a doua cerinta
10 System.out.println(mesaj);
11 contor++;
12}
1 // Afisati in fata mesajului numerele 10, 20, 30, 40, etc… Rezolvati in
2 moduri
2
int n = 0;
3
while (n < 5) {
4
n++;
5
System.out.println( n*10 + ". " + mesaj);
6
}
7
8
// sau
9
n = 0;
10while (n < 50) {
11 n+=10;
12 System.out.println( n + ". " + mesaj);
13}
// Cereti numarul de afisari de la tastatura
1
// Sa fie folosit operatorul de decrementare in locul celui de
2
incrementare
3
System.out.println("Introduceti un mesaj pentru a fi repetat");
4 String mesajDeRepetat = keyboard.nextLine();
5 System.out.println("De cate ori sa se repete?");
6 int repetari = keyboard.nextInt();
7
8 while (repetari > 0) {
9 System.out.println(mesaj);
10 repetari--;
11 }

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);

6. Scrieţi un program care să verifice dacă 3 numere introduse de la tastatură pot


reprezenta lungimile laturilor unui triunghi dreptunghic. Forţaţi programul pentru a
introduce numerele în ordine crescătoare. Numere egale sunt permise.
Hint: folosiţi reciproca teoremei lui Pitagora: dacă a2 + b2 = c2 triunghiul este
dreptunghic, unde a şi b reprezintă catetele, iar c ipotenuza.
7. Recreati secventa Lothar Collatz.
Reguli:

 Se consideră un număr natural n.


 Dacă n este par, împărţiţi-l la 2, pentru a obţine n / 2
 Dacă n este impar, înmulţiţi-l cu 3 şi adăugaţi 1, pentru a obţine 3n + 1
 Repetaţi procesul la infinit pentru noul număr
Scrieţi un program care cere un număr de la utilizator şi afişează secvenţa Collatz
începând de la acel număr. Opriţi-vă când aţi ajuns la 1.

Exemplu:

1 Starting number: 6
2 6 3 10 5 16 8 4 2 1
Mai mult:

 Afişaţi numărul total de paşi din secvenţă.


 Afişaţi cel mai mare număr care apare în secvenţă.
8. Introduceţi un număr întreg de la tastatură. Afişati cifrele acestuia.
Solutie
1 Scanner keys = new Scanner(System.in);
2
3 System.out.println( "Introduceti un numar. Vom afisa cifrele lui." );
4
5 int nr = keys.nextInt();
6
7 while ( nr != 0){
8
9 System.out.println( nr % 10 );
10
11 nr = nr / 10;
12 }

9. Introduceţi un număr întreg de la tastatură. Verificaţi dacă este palindrom. Un număr


este palindrom dacă este egal cu opusul său (respectiv dacă este acelaşi număr indiferent
dacă este citit de la stânga la dreapta sau de la dreapta la stânga).
Solutie
1 System.out.println("Scrie un numar");
2 Scanner keyboard = new Scanner(System.in);
3 int a = keyboard.nextInt();
4 int opusul = 0;
5 int ultimaCifra;
6
7 int valoareInitiala = a;
8
9 while (a != 0) {
10
11 ultimaCifra = a %10;
12 a = a/10;
13 System.out.println(ultimaCifra);
14
15 //Generam pe loc opusul lui.
16 opusul = opusul * 10 + ultimaCifra;
17 System.out.println("Opusul = " + opusul);
18 }
19
20 if (valoareInitiala==opusul) {
21 System.out.println("Numarul introdus e palindrom");
22 } else {
23 System.out.println("Numarul nu e palindrom");
24 }

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
}

3. Realizați o metodă care suprascrie metoda replace(char1, char2) din


clasa String. Programul va înlocui prima apariție a subșirului "dra" cu "dru" din cuvântul
"Alexandra". Vom presupune că șirul nostru are un singur “d”. Indiciu: Vom afla poziția
literei "d" (fără a folosi metoda indexOf()).
Solutie
1 String cuvant = "Alexandra";
2 String sirInlocuitor = "dru";
3
System.out.println( "Cuvantul initial: " + cuvant);
4
5
// Cautam indexul literei 'd'
6
int index = 0;
7
while ( index < cuvant.length() ) {
8
9
10 if (cuvant.charAt(index) == 'd') {
break;
11
}
12
index++;
13
}
14
15
16
// In mod normal trebuie verificata valoarea indexului, sa vedem dac
17
litera,
18
// dar acum stim ca cuvantul contine litera 'd'
19
20
// acum verificam daca urmatoarele caractere dupa 'd' formeaza sirul
21 if( (cuvant.charAt(index+1) == 'r') && (cuvant.charAt(index+2) == 'a
22
23 String sirNeschimbat = cuvant.substring (0,index);
24 System.out.println("Sirul corespunde si va fi inlocuit!");
25
26 cuvant = sirNeschimbat + sirInlocuitor;
27 }
28 System.out.println( "Cuvantul inlocuit: " + cuvant);

4. Modificați programul de la Exercitiul 3, folosind tot o bucla while, astfel încât să


înlocuiească a cincea apariție a literei "a", dacă există, cu litera "i". Exemplu: "Rareș a
încercat să prindă pasica, dar aceasta a fost mult mai rapidă decat el". Bineînțeles, că în
acest caz se poate face: sir.replace("pasica","pisica"); - dar vrem să folosim
bucla while.
5. Modificați programul de la exercitiul 3, pentru a înlocui toate literele "a" cu "i". Practic
implementăm noi metoda replaceAll(sir, sir) din clasa String.
6. Bonus - Spânzuratoarea
Calculatorul se "gândeşte" la un cuvânt, iar noi trebuie sa îl ghicim. Nu există un număr
maxim de pași. Indiciu: Noi propunem o literă. Calculatorul spune dacă există sau nu.
Dacă există, va afişa poziţiile literei (va înlocui spaţiile _ cu litera ghicită.)
Exemplu:
1 M-am gandit la un cuvănt. (sa zicem spanzuratoare) Poți să îl ghiceș
2 literă:
3 a
a este. Cuvantul este __a____a__a__.
4
Zi o litera
5
s
6
s este. Cuvantul este s_a____a__a__.
7
Zi o litera.
8
o
9
o este. Cuvantul este s_a___a_oa__.
10
Zi o litera.
11
F
12 f nu este.
13 …
14 …
15 Zi o litera.
16 P
17 p este. Cuvantul este spanzuratoare
18 Bravo! Ai ghicit!
 4. Do-while
Structura repetitivă do-while
do…while este o structură repetitivă cu număr necunoscut de paşi.
Do-while se comportă asemănător cu un while. Singura diferenţă este verificarea
condiţiei care este făcută la final pentru structura do-while. Din acest motiv, instrucţiunile
din do-while se vor executa cel puţin o singură dată.

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 Scanner sc = new Scanner(System.in);


2 int sum = 0;
3 do {
4 int num = sc.nextInt();
5 sum += num;
6 } while (num != 0);
7 System.out.println(sum);
Greșeli frecvente
Fie următorul program ce conține 2 bucle:

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 );

System.out.println( swimmer2 + " stops swimming. Total swim


}
}
Rulaţi programul pentru o valoare de 80.5 pentru temperatura curentă a apei. Înoată cei
doi sportivi pentru aceeaşi perioada de timp? Rulaţi programul pentru 78 de grade. Ce
diferenţe sunt? Se aruncă cei doi sportivi în apă fără să verifice temperatura acesteia?

Assignment 2
Se da următorul cod.

1 Scanner keyboard = new Scanner(System.in);


2 Random rng = new Random();
3 String again;
4
5 while ( again.equals("y") ) {
6 int flip = rng.nextInt(2);
7 String coin;
8 if ( flip == 1 )
9 coin = "HEADS";
10 else
11 coin = "TAILS";
12
13 System.out.println( "You flip a coin and it is... " + coin );
14
15 System.out.print( "Would you like to flip again (y/n)? " );
16 again = keyboard.next();
17 }
Ce probleme are? De ce nu se compilează? Rezolvaţi problema, apoi rescrieţi codul
folosind do-while. Stergeţi modificarea pe care aţi făcut-o la început. Se mai compilează
codul? De ce?

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!");

2. Să se scrie un program care generează un număr aleator. Să se ghicească numărul


respectiv din mai multe încercări. După fiecare încercare să se afişeze dacă numărul
introdus este mai mare sau mai mic decât numărul care trebuie ghicit. Să se
folosească do-while.
Solutie
1 Random rand = new Random();
2 int nrDeGhicit = rand.nextInt(101);
3 System.out.println("(numarul generat este " + nrDeGhicit + ")"); //
4 test
5
6 System.out.println("Sa vedem daca poti sa ghicesti un numar de la 0
7
8 Scanner keyboard = new Scanner(System.in);
9 int incercare;
10
11 do {
12 System.out.println("Introdu un numar: ");
13 incercare = keyboard.nextInt();
14 if (incercare < nrDeGhicit) System.out.println("Numarul tau e mai
15 else if (incercare > nrDeGhicit) System.out.println("Numarul tau e
16 mare");
17 } while (incercare != nrDeGhicit);

System.out.println("Felicitari, ai ghicit!");

3. Să se creeze un calculator care face operaţii simple de adunare şi înmulţire cu o cifră.


Se introduc numerele cu operaţia între ele, apoi se afişează rezultatul. Programul se
opreşte la adunarea 0 + 0. Folosiţi do-while.
4. Se citesc numere de la tastatură până la întâlnirea numărului 0 şi se face un total, astfel:
numerele pare introduse vor fi adunate, iar cele impare vor fi înmulţite cu totalul
intermediar. La sfârşit va fi afişat total totalul. Implementaţi o rezolvare cu while şi do-
while.
Solutie do-while
1 Scanner keyboard = new Scanner(System.in);
2 int numar;
3 System.out.println("Introdu un numar. Numerele pare vor fi adunate c
4 + "iar cele impare vor fi inmultite");
5
6 int total = 0;
7 int numarUser;
8
9 do {
10
11 numarUser = keyboard.nextInt();
12 if (numarUser % 2 == 0) {
13 total += numarUser;
14 } else if (total == 0) {
15 total = numarUser; // initializare la numarul userului daca
16 impar
17 } else total *= numarUser;
18
19 System.out.println("Total pana acum: " + total);
20 System.out.println("Introdu alt numar sau cifra 0 pentru a inchei
21 System.out.println();
22
23 } while (numarUser != 0);
24
25 System.out.println("Total: " + total);

5. Să se numere câte cifre are un număr introdus de la tastatură. Implementaţi


cu whileşi do-while.
Exemplu:

* 123 are 3 cifre


1
* 2994 are 4 cifre
2
5. Review
Exemple de utilizare
Exemplu:
Folosind bucla while, să se realizeze un bancomat care cere codul pin de un inifinit de ori
până când îl obține pe cel corect:

Varianta 1: cu break, mai puțin folosită:


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 while (true){
9 // E suficient să scriem doar while (bool)
10 System.out.println("Introduceti codul pin");
11 parola = scanner.nextLine();
12 if (parola.equals("9759")){
13 System.out.println("Bravo");
14 break;
15 }
16 }
17 }
18 }
Varianta 2: cu variabilă booleană:
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 boolean bool = true;
9 while (bool){
10 System.out.println("Introduceti codul pin");
11 parola = scanner.nextLine();
12 if (parola.equals("9759")){
13 System.out.println("Bravo");
14 bool = false;;
15 }
16 }
17 }
18 }
Varianta 3: clasică
1 package automat;
import java.util.Scanner;
2
3
public class MyClass{
4
public static void main(String[] args) {
5
Scanner scanner = new Scanner(System.in);
6
String parola ="0000"; //trebuie sa o initializam pentru
7
urmator,
8
//altfel ne va da eroare la executare
9
10
while ( ! parola.equals("9759")){ //NOT equals. Obse
11
System.out.println("Introduceti codul pin");
12 parola = scanner.nextLine();
13 }
14
15 System.out.println("Daca ati ajuns aici inseamna ca ati desc
16 }
17 }
Varianta a 4-a: De preferat în acest caz.
Totuși, obervați că a trebuit să inițializăm parola cu “0000” ca să nu ne dea eroare pe linia
cu while. E cam forțat. Ce făceam dacă parola era chiar “0000” ? Există pentru acest caz
varianta :

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).

1 public class Main {


2 public static void main(String[] args) {
3
4 String sir= "abcdfghij";
5 int index = 0;
6 while (sir.charAt(index) != 'e'){
7 index++;
8 if (index == sir.length()){
9 break;
10 }
11 }
12 //acum verificam care a fost conditia care ne-a scos din bucla.
13 //Am ajuns la capat sau am gasit 'f'-ul ?
14 if (index != sir.length()){
15 System.out.println("e se afla la indexul: " + index);
16 } else {
17 System.out.println("Returnam -1 pentru ca 'e' nu exista.");
18 }
19 }
20 }
Varianta 2
Bucla while are ambele condiții.
Verificăm totodată atât dacă am gasit caracterul, cât și dacă am depașit capătul șirului.

1 public class Main {


2 public static void main(String[] args) {
3
4 String sir= "abcdeghij";
5 int index = 0;
6 while ( index != sir.length() && sir.charAt(index) != 'e' ){
7 index++;
8 }
9 //acum verificam care a fost conditia care ne-a scos din bucla.
10 //Am ajuns la capat sau am gasit 'f'-ul?
11 if (index != sir.length()){
12 System.out.println("'e' se afla la indexul: " + index);
13 } else {
14 System.out.println("Returnam -1 pentru ca 'e' nu exista.");
15 }
16 }
17 }
Este foarte important ca ordinea să fie aceasta și să folosim operatorul && de
scurtcircuitare, pentru că dacă index ajunge să aibă valoarea sir.length() atunci
sir.charAt(index) ne va da eroare la rulare: StringIndexOutOfBoundsException.

Folosind operatorul de scurtcircuitare && nu se mai verifică și condiția a doua, care


oricum nu mai e relevantă dacă am depășit capărul șirului.

Exemplu - bucla while


Folosind bucla while, să se determine dacă caracterul e există în șirul de caractere dat.
Varianta 1:
Pe care poate 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).

public class Main {


1
public static void main(String[] args) {
2
3
String sir= "abcdfghij";
4
int index = 0;
5
while (sir.charAt(index) != 'e'){
6
index++;
7 if (index == sir.length()){
8 break;
9 }
10 }
11 //acum verificam care a fost conditia care ne-a scos din
12 bucla.
13 //Am ajuns la capat sau am gasit 'e'-ul ?
14 if (index != sir.length()){
15 System.out.println("e se afla la indexul: " + index);
16 } else {
17 System.out.println("Returnam -1 pentru ca 'e' nu
18 exista.");
19 }
20 }
}
Varianta 2: while are ambele condiții.
Verificăm totodată atât dacă am gasit caracterul, cât și dacă am depașit capătul șirului.

public class Main {


1 public static void main(String[] args) {
2
3 String sir= "abcdeghij";
4 int index = 0;
5 while ( index != sir.length() && sir.charAt(index) != 'e' )
6 index++;
7 }
8 //acum verificam care a fost conditia care ne-a scos din
9 bucla.
10 //Am ajuns la capat sau am gasit 'e'-ul?
11 if (index != sir.length()){
12 System.out.println("'e' se afla la indexul: " + index);
13 } else {
14 System.out.println("Returnam -1 pentru ca 'e' nu
15 exista.");
16 }
17 }
}
Este foarte important ca ordinea să fie aceasta:
1 while ( index != sir.length() && sir.charAt(index) != 'e' ){...}
și să folosim operatorul && de scurtcircuitare, pentru că dacă index ajunge să aibă
valoarea sir.length() atunci sir.charAt(index) ne va da eroare la rulare:
StringIndexOutOfBoundsException.
Folosind operatorul de scurtcircuitare && nu se mai verifică și condiția a doua,
care oricum nu mai e relevantă dacă am depășit capărul șirului.

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

 iniţializare – sunt oricât de multe iniţializări necesare


 condiţie – orice condiţie cât de complicată care rezultă în adevărat sau fals; instrucţiunile
se vor executa cât timp condiţia este adevărată
 increment – instrucţiuni care modifică valori şi care se execută la fiecare pas, după
instrucţiunile din for
Exemplu 1
1 for (int i = 0; i <7; i++) {
2 System.out.println(“mesaj ” + i);
3 }
Exemplu 2
Să se afişeze un mesaj introdus de 5 ori.

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:

1 for (int n = 0; n <5; n++)


Ce modificări observaţi? Ce se întâmplă dacă în loc de n++ scriem n = n + 2?

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 }

2. Scrieţi un program care citeşte un număr întreg şi numără de la 0 la acesta. (0 1 2 3…)


Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 int numar;
4
5 System.out.println("Introduceti un numar intreg pozitiv: ");
6 numar = keyboard.nextInt();
7
8 for (int i = 0; i <= numar; i++) {
9 System.out.println(i);
10 }

3. Scrieţi un program care citeşte 3 numere: un număr de la care pornim numărătoarea, un


număr până la care numărăm şi din cât în cât numărăm. Afişaţi numărătoarea. (0 2 4…)
Solutie
Scanner keyboard = new Scanner(System.in);
1
2 int numar,nrFinal,pas;
3
4 System.out.println("Introduceti un numar de pornire: ");
5 numar = keyboard.nextInt();
6
7 System.out.println("Introduceti un numar pana la care numaram: ");
8 nrFinal = keyboard.nextInt();
9
10 System.out.println("Introduceti valoarea de incrementare: ");
11 pas = keyboard.nextInt();
12
13 for ( ; numar <= nrFinal ; numar = numar + pas) { // prima parte a
14 anterior
15 // alternativ,
16 // for ( numar
17 pas)
18 System.out.println(numar);
19
}

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 }

5. Pentru programul de la punctul 4 afişaţi şi pătratul fiecărui număr.


Solutie
1 ...
2 System.out.println(Math.pow(i, 2));
3 ...

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 }

7. Scrieţi un program care afişează toate numerele de la 0 la 100. Pentru multiplii de 3


afişaţi mesajul “Tres”, pentru multiplii de 5 afişaţi mesajul “Cinco”, iar pentru numerele
care se împart şi la 3 şi la 5 afişaţi “TresCinco”.
Solutie
for (int i=0; i<=100; i++) {
1
2
if (i==0) {
3
System.out.println(i);
4
continue; // 'continue' ii spune buclei sa continue cu urmat
5
imediat,
6 // fara a mai executa si restul instructiunilor di
7 }
8
9
if (i%3==0 & i%5 ==0) {
10
System.out.println(i + " TresCinco");
11
} else if (i%3==0) {
12 System.out.println(i + " Tres");
13 } else if (i%5==0) {
14 System.out.println(i + " Cinco" );
15 }
16
17 }

8. Citiţi un şir de caractere de la tastatură. Afişaţi lungimea lui, poziţia şi valoarea


primului caracter, poziţia şi valoarea ultimului caracter şi fiecare caracter cu poziţia lui.
Puteţi folosi funcţia charAt(int) a clasei String. Număraţi de câte ori apare litera ‘a’ (fie a,
fie A). Afişaţi mesaje pentru fiecare parte.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 System.out.println("Introduceti un sir de caractere: ");
3 String sir = keyboard.next();
4
5 int contor = 0;
6 for (int i = 0; i < sir.length(); i++) {
7
8 System.out.println(i + " " + sir.charAt(i));
9
10 if (sir.charAt(i)=='a'|| sir.charAt(i)=='A') {
11 contor++;
12 }
13
14 }
15
16 System.out.println("Lungimea sirului este: " + sir.length());
17 System.out.println("A si a sunt in numar de " + contor);

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);

11. Scrieţi un program care citeşte un cuvânt de la tastatură şi îl afişează de 10 ori. În


cazul în care cuvântul începe cu o vocală, acesta trebuie afişat doar de 5 ori. Folosiţi un
SINGUR if şi un SINGUR for.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 System.out.println("Introduceti un cuvant");
3
4 String cuvant = keyboard.next();
5 int afisari = 10;
6
7 if ( ( cuvant.charAt(0) == 'a' ) || ( cuvant.charAt(0) == 'A' ) ||
8 ( cuvant.charAt(0) == 'e' ) || ( cuvant.charAt(0) == 'E' ) ||
9 ( cuvant.charAt(0) == 'i' ) || ( cuvant.charAt(0) == 'I' ) ||
10 ( cuvant.charAt(0) == 'o' ) || ( cuvant.charAt(0) == 'O' ) ||
11 ( cuvant.charAt(0) == 'u' ) || ( cuvant.charAt(0) == 'U' )
12 ) {
13 afisari = 5;
14 }
15
16 for (int x = 0; x < afisari; x++) {
17 System.out.println(x+1 + ". " + cuvant);
18 }

12. Scrieţi un program care afişează tabla înmulţirii cu 2.


Solutie
1 int a = 2;
2
3 for (int contor = 1; contor <= 100; contor++ ) {
4 System.out.println( "" + a + " x " + contor + " = " + contor*a);
5 if (contor % 10 == 0) System.out.println( "-----------");
6 }

13. Scrieţi un program care citeşte de la tastatură un număr de la 1 la 9 şi afişează o


piramidă după următorul model:
1

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 }

14. Scrieţi un program care să afişeze următoarea piramidă:


1

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

Opţional, folosiţi metoda printf pentru afişarea numerelor.


Solutie
1 Scanner keyboard = new Scanner(System.in);
2
3 System.out.println("Introduceti o putere a lui 2");
4
5 int nr = keyboard.nextInt();
6
7 for (int contorLinii = 0; contorLinii <= nr; contorLinii++) {
8
9 int doiLaPutere = 1;
10
11 // spatiile de la inceput
12 for (int i = 1; i<=nr-contorLinii; i++) {
13 System.out.print(" ");
14 }
15
16 // cifre crescatoare
17 for (int i = 0; i <= contorLinii; i++) {
18 System.out.printf("%5d", doiLaPutere);
19 doiLaPutere*=2;
20 }
21
22 doiLaPutere/=2; // pentru ca doiLaPutere a mai fost incrementat o
23 afisat
24 doiLaPutere/=2; // inca o decrementare pentru a porni afisarea in
25 serie
26
27 // cifre descrescatoare
28 for (int i = contorLinii-1; i >= 0; i--) { // e -1 ca sa n
29 System.out.printf("%5d", doiLaPutere);
30 doiLaPutere/=2;
31 }
32
33 System.out.println(); // pentru trecerea la linia urmatoare

}
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:

1 String[] flori = {“margareta”, “papadie”, “zambila”, “narcisa”};


2 String[] copie = Arrays.copyOf( flori, 4 );
Copierea se poate face și manual, element cu element, într-un array nou.
static void sort(long[]
a) Sorts the specified array into ascending numerical order

static void Sorts the specified array of objects into ascending order, according to the
sort(Object[] a) natural ordering of its elements.

Exerciţii tablouri unidimensionale


1. Se ia array populat şi se construiește un alt array identic cu acesta, în care se introduce
o valoarea suplimentară la indexul 3.
Solutie
1 String[] flori = { "trandafir", "margareta", "narcisa", "orhidee",
2 "garoafa", "frezie", "bujor" };
3
4 System.out.println("Primul array: " );
5
6 for (int a = 0; a < flori.length; a++) {
7 System.out.println(a + ". " + flori[a]);
8 }
9
10 // pentru un array primit din alta parte (user sau alta alta clasa)
11 // trebuie verificat daca este null
12 /* if (flori == null) {
13 System.out.println("Ai introdus un String null!!!!");
14 return;
15 } */
16
17 // array-ul nou
18 String[] floriNou = new String[flori.length + 1];
19 // copiem valorile neschimbate (pana la indexul 2 inclusiv)
20 int i = 0;
21 for (i = 0; i < 3; i++) {
22 floriNou[i] = flori[i];
23 }
24
25 // introducem noua valoare
26 Scanner sc = new Scanner(System.in);
27 System.out.println("Introduceti o floare noua"); // lalea
28
29 // variabila i is pastreaza ultima valoare la care a fost incrementa
30 floriNou[i] = sc.nextLine();
31
32 // copiem celelalte valori din primul array
33 for ( ; i < flori.length; i++) { // i este deja initializat in afa
34 de aici
35
36 floriNou[i+1] = flori[i];
37
38 }
39
40
41 // afisare array nou
42 System.out.println("\n" + "Noul array: " );
43 for (int j = 0; j < floriNou.length; j++) {
44 System.out.println(j + ". " + floriNou[j]);
}

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 }

4. Creaţi un vector care să reţină 10 numere aleatoare. Introduceţi un număr de la


tastatură şi afişaţi de câte ori găsiţi numărul respectiv în vector. Afişaţi şi un mesaj când
aţi găsit numărul. Schimbaţi programul astfel încât să afişaţi şi indexul pe care numărul a
fost găsit.
Schimbaţi programul astfel încât să reţineţi toţi indecşii pentru numărul respectiv într-un
alt vector pe care să îl afişaţi la final.

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].

5. Generaţi un vector cu 10 numere aleatoare. Creaţi un program care cere un număr de la


tastatură, caută numărul în vector şi afişează un mesaj cu numărul şi poziţia atunci când
acesta a fost găsit. Utilizaţi break sau o variabilă booleană.
6. Creaţi 3 vectori care reţin date despre 5 persoane. Poziţia din cei 3 vectori vă va indica
datele despre persoana respectivă. Primul vector este de tipul String şi va reţine numele
acestora. Al doilea vector este de tipul double şi va reţine notele acestora. Ultimul vector
este de tipul int şi va reţine un id pentru fiecare persoană. Daţi valori celor 3 vectori.
Afişaţi apoi informaţiile despre persoana respectivă.
Solutie
String [] nume = {"Kirk", "Spock", "Bones", "Chekov", "Uhura"};
1
double[] note = {6.5, 6.9, 5.9, 6.6, 6.3};
2
int[] ids = {12353, 11150, 12002, 12950, 12201};
3
4
// afisare valori
5
for (int i = 0; i < nume.length; i++) {
6
System.out.println("Nume: " + nume[i] + " | Nota: " + note[i] + " |
7 ids[i]);
8 }

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 }

10. Să se sorteze un array (vector) în ordine crescătoare. Practic implementăm noi


metoda Arrays.sort(int[] vectorulMeu)
Hints
 Varianta 1: Utilizând o buclă for parcurgem vectorul şi luăm valoarea cea mai mică și o
punem pe prima poziție într-un alt vector. Modificăm valoarea din primul vector la cea
mai mare valoare pe care o poate lua un integer (Integer.MAX_VALUE), şi reluăm
căutarea pentru următorul cel mai mic număr. Si aşa mai departe. La sfârşitul buclei,
primul array va fi compus doar din valori MAX_VALUE, iar cel de-al doilea array va
avea toate valorile iniţiale în ordine crescătoare.
 Varianta 2: folosind metoda bubbling. Se compara valorile din primii doi indecşi. Dacă
nu sunt în ordine, se inversează. Apoi se compară indexul 2 cu indexul 3. Dacă nu sunt în
ordine, se inversează. Tot așa până la final. Astfel, valorile urcă, asemenea bulelor dintr-
un pahar cu lichid (bubbling). Se parcurge din nou vectorul de mai multe ori, până când
nu mai au loc inversări. Pentru a ști dacă nu au mai avut loc inversări folosim o variabilă
de tip boolean. Mai multe detalii
pe: http://mathbits.com/MathBits/Java/arrays/Bubble.htm, dar încercați să rezolvați fără
să vă uitați la răspuns.
 Varianta 3: Prin recursivitate (backtracking).

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.

1 Array iniţial : |2|5|8|4|


2 Array modificat: |4|5|8|2|
2. Se dă un array cu cel puţin 2 poziţii populat cu valori oarecare (int, String etc.). Fără să
creaţi un alt array, inversaţi ordinea tuturor elementelor.

1 Array iniţial : |2|5|8|4|


2 Array modificat: |4|8|5|4|
Solutie
1 Random rand = new Random();
2
int[] arr = new int[11];
3
4
// populare si afisare array initial
5
for (int i = 0; i < arr.length; i++) {
6
arr[i] = rand.nextInt(9);
7
System.out.print(arr[i] + " ");
8
}
9
System.out.println();
10
11
// inversare
12
// parcurgem array-ul doar pana la jumatate si
13 // vom inversa fiecare valoare cu opusul sau din celalalt capat
14 // primul index cu ultimul, al doilea cu penultimul etc.
15 // pentru array-uri cu lungime impara, indexul din mijloc ramane
16 neschimbat
17 for (int i = 0; i < arr.length / 2; i++) {
18
19 int idxOpus = (arr.length-1) - i; // ultimul index e arr.length-1
20 System.out.println("Inversam " + arr[i] + " cu " + arr[idxOpus]);
21 int tempVal = arr[i];
22 arr[i] = arr[idxOpus];
23 arr[idxOpus] = tempVal;
24
25 }
26
27 // afisare array inversat
28 for (int i = 0; i < arr.length; i++) {
29 System.out.print(arr[i] + " ");
30 }
3. Se dă un array cu 5 poziţii populat cu valori de tip int. Rotiţi array-ul cu 1 poziţie la
dreapta - adică să mutaţi toate valorile pe indexul imediat următor din dreapta. Valoarea
de pe ultimul index va ajunge pe prima poziţie, ca în exemplu:

1 Array iniţial : |2|5|8|4|3|


2 Array modificat: |3|2|5|8|4|
Solutie
1 Random rand = new Random();
2
3 int[] arr = new int[11];
4
5 // populare si afisare array initial
6 for (int i = 0; i < arr.length; i++) {
7 arr[i] = rand.nextInt(9);
8 System.out.print(arr[i] + " ");
9 }
10 System.out.println();
11
12 // rotire la dreapta
13 // pastram ultima valoare separat
14 // si copiem pe rand valoarea din stanga
15 // la indexul din dreapta
16 // iar primul index va primi valoarea initiala de
17 // pe ultima pozitie
18 int tempVal = arr[arr.length-1];
19 for (int i = arr.length-1; i >= 0; i--) {
20
21 if (i > 0) arr[i] = arr[i-1];
22 else arr[i] = tempVal;
23 }
24
25 // afisare array rotit
26 for (int i = 0; i < arr.length; i++) {
27 System.out.print(arr[i] + " ");
28 }
8. For Each
For Each
O altă variantă pentru structura for învaţată este for each sau "enhanced for loop”
folosită special pentru colecţiile de date pe care le parcurge element cu element. De
exemplu, pentru a afişa elementele unui tablou din exemplul de la tablouri, putem scrie:
1 for (int x : tablou1) {
2 System.out.println(x);
3 }
Atenţie: cu for-each nu mai avem acces la indexul pe care se află elementul pe care
vrem să îl afişăm. Dar este indicat să folosim un for-each de fiecare dată când este
posibil.
Exerciţii
1. Creaţi un vector de 10 elemente, puneţi valori pe toate poziţiile. La final afişaţi-l de
două ori, folosind cele 2 for-uri diferite.
Solutie
1 int[] numere = new int[10];
2 numere[0] = 58;
3 numere[1] = 59;
4 numere[2] = 60;
5 numere[3] = 115;
6 numere[4] = 226;
7 numere[5] = 427;
8 numere[6] = 528;
9 numere[7] = 629;
10 numere[8] = 1222;
11 numere[9] = 3245;
12
13 System.out.println("Afisare for clasic");
14
15 for (int i = 0; i < numere.length; i++) {
16 System.out.println(i + ": " + numere[i]);
17 }
18
19 System.out.println("Afisare for-each");
20
21 for (int nr : numere) {
22 System.out.println(nr);
23 }

2. Se citeşte un număr n care reprezintă lungimea unui vector. Creaţi vectorul de


lungime n, puneţi valori aleatoare pe fiecare poziţie (între 1 şi 100) şi afişaţi vectorul.
Solutie
1 Scanner keys = new Scanner(System.in);
2
3 System.out.println("Cate numere sa generam?");
4 int lungime = keys.nextInt();
5
6 int[] numere = new int[lungime];
7
8 // populare
9 for (int i = 0; i < lungime; i++) {
10 int nr = (int) (Math.random() * 100 + 1);
11 numere[i] = nr;
12 }
13
14 //afisarea arrayului
15 for (int i : numere) {
16 System.out.println(i);
17 }

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");

4. Creaţi un vector cu n numere aleatoare între 0 şi 99 (n introdus de la tastatură). Afişaţi


vectorul, elementul minim, elementul maxim, suma elementelor, produsul elementelor
diferite de 0, media aritmetică a elementelor.
Solutie
1
Scanner keys = new Scanner(System.in);
2
System.out.println("Introduceti un numar: ");
3
int numere[] = new int[keys.nextInt()];
4
5
// populare
6
for (int i = 0; i < numere.length; i++) {
7
numere[i] = (int) (Math.random() * 100);
8 }
9
10 // afisare
11
12 int numarMinim = numere[0]; // initializam la prima valoare din arr
13 e cazul
14 int numarMaxim = numere[0];
15 long produs = 1L; // daca ramane neinitializat, va avea valoarea def
16 // am folosit long in loc de int deoarece produsu
17 // mari chiar si pentru un array cu 10 elemente
18 int sumaElementePentruMedie = 0;
19 int contorPentruAfisare = 0;
20
21 for (int nr : numere) {
22
23 System.out.println(contorPentruAfisare++ + ". " + nr);
24
25 if (nr < numarMinim) numarMinim = nr;
26 if (nr > numarMaxim) numarMaxim = nr;
27 if (nr > 0) produs *= nr;
28 sumaElementePentruMedie += nr;
29
30 }
31
32 System.out.println("Cel mai mic numar este: " + numarMinim);
33 System.out.println("Cel mai mare numar este: " + numarMaxim);
System.out.println("Produsul numerelor mai mari ca zero: " + produs);
System.out.println("Media tuturor numerelor: " + sumaElementePentruMe

Schimbaţi programul astfel încât să afişaţi pe ce poziţie se află minimul si maximul.

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);
// ...

5. Creaţi un array de String ce conţine iniţializări pentru elemente la declarare. Afişaţi


vectorul.
Solutie
1 String nume[] = {"Traian", "Emil", "Ion", "Nicolae", "Klaus"};
2
3 for (String s : nume) {
4 System.out.println(s);
5 }
9. Parcurgere ArrayList
ArrayList
Iterare
Un ArrayList se poate itera în 3 moduri:

1. cu for classic

1 for (int i = 0; i<lista.size(); i++){


2 if (lista.get(i).getMarca().equals(“Acer”)){
3 lista.remove(i);
4 }
5 }
2. cu for-each

1 for (Computer computer : lista) {


2 if (computer.getMarca().equals(“Toshiba”)){
3 lista.remove(computer);
4 }
5 }
Pentru a sterge un element dinamic din lista, in timp ce parcurgem lista, nu sunt, totusi,
indicate variantele de mai sus, întrucât pot apărea crashuri, ci varianta cu iterator.

3. folosind un iterator lista.listIterator() returneaza un iterator


1 ListIterator<Computer> iter = lista.listIterator();
Acest iterator este ca un cursor care se pozitioneaza la inceput inaintea primului element
si cu ajutorul metodei next() avanseaza inainte sau previous() inapoi si returneaza
elementul respectiv.
Iteratorul nu se pozitioneaza pe un element, ci intre elemente. A se vedea
in APIListIterator.

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:

1 Computer c1 = new Computer (”Toshiba”, 1800, 4);


2 Computer c2 = new Computer (”Acer”, 1400, 2);
3 Computer c3 = new Computer (”HP”, 2800, 8);
4 Computer c4 = new Computer (”Intel”, 2000, 4);
5 ArrayList<Computer> computere = new ArrayList<Computer>();
6 computere.add(c1);
7 computere.add(c2);
8 computere.add(c3);
9 computere.add(c4);
10
11 Computer altComputer = new Computer(“Acer”, 1400, 2);
12 boolean bool = computere.contains(altComputer); // va afișa true
13 computere.remove(altComputer);
Deși altComputer nu se regăsește în lista, dar are aceleași caracteristici cu c2,
va da true, iar la următoarea linie de cod practic va fi scos c2 din arraylistul de
computere.
Exerciţii
1. Creaţi un ArrayList care reţine valori de tipul Integer. Adăugaţi în acesta 10 copii ale
numărului -113. Afişaţi conţinutul acestuia pe ecran.
Nu folosiţi o buclă şi nici o variabilă pentru index. Va trebui să vă folosiţi de numere
literali pentru a face referire la fiecare poziţie.

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);

6. Creaţi un ArrayList care să reţină valori de tipul Integer. Populaţi ArrayList-ul cu 10


numere aleatoare între 1 şi 100. Copiaţi fiecare valoare din ArrayList într-un alt ArrayList
cu aceeaşi capacitate. Schimbaţi ultima valoare din primul ArrayList la -7. Afişaţi
conţinutul celor două ArrayList-uri.
7. Căutarea unei valori într-un ArrayList.
Creaţi un ArrayList care reţine valori de tipul Integer şi populaţi-l cu valori aleatoare
între 1 şi 50. Afişaţi aceste valori pe ecran, apoi cereţi utilizatorului să introducă un
număr întreg. Apoi căutaţi în ArrayList numărul introdus:
 dacă numărul se află în listă, afişaţi un mesaj; dacă găsiţi de mai multe ori numărul
respectiv, nu este nicio problemă dacă mesajul va fi afişat de mai multe ori.
 nu afişaţi un mesaj dacă valoarea nu a fost găsită.
Solutie
1 ArrayList<Integer> valori = new ArrayList<>();
2
3 // populare
4 for (int i = 0; i < 20; i++) {
5 valori.add( (int)(Math.random()*50+1) );
6 }
7
8 System.out.println(valori);
9
10 Scanner keyboard = new Scanner(System.in);
11 System.out.println("Introduceti un numar intre 1 si 50:");
12 int nrCautat = keyboard.nextInt();
13
14 // cautare valori
15 for (int i = 0; i<valori.size(); i++) {
16 if (valori.get(i) == nrCautat) {
17 System.out.println("Numarul a fost gasit");
18 }
19
20 }

8. Există sau nu?


Refaceţi exerciţiul 7, cu următoarele cerinţe pentru căutarea valorii:

 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:

 dacă numărul se află în listă, afişaţi poziţia lui;


 dacă numărul apare de mai multe ori, afişaţi de câte ori apare şi poziţiile pe care apare;
 dacă numărul nu se află în listă, afişaţi alt mesaj care să indice acest lucru.
10. Locarea valorii maxime din ArrayList.
Creaţi un ArrayList care să reţină valori de tipul Integer. Populaţi ArrayList-ul cu
numere aleatoare între 1 şi 100. Afişaţi valorile pe ecran. Folosiţi o căutare liniară pentru
a găsi valoarea maximă şi poziţia acesteia şi afişaţi-le.
Solutie
1 ArrayList<Integer> valori = new ArrayList<>();
2
3 // populare
4 for (int i = 0; i < 30; i++) {
5 valori.add( (int)(Math.random()*100+1) );
6 }
7
8 System.out.println(valori);
9
10 int pozitieMaxim = 0;
11
12 // cautare valori
13 for (int i = 0; i<valori.size(); i++) {
14
15 if (valori.get(pozitieMaxim) < valori.get(i) ) {
16 pozitieMaxim = i;
17 }
18
19 }
20
21 System.out.println("Valoarea maxima " + valori.get(pozitieMaxim) + "
22
23 // varianta fara autoboxing
24 // folosim metoda Integer.compareTo
25 int pozitieIntegerMaxim = 0;
26 for (int i = 0; i<valori.size(); i++) {
27 if (valori.get(i).compareTo(valori.get(pozitieIntegerMaxim)) > 0 )
28 pozitieIntegerMaxim = i;
29 }
30 }
31
32 System.out.println("Valoarea maxima " + valori.get(pozitieIntegerMaxi
pozitieIntegerMaxim);

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.

Creaţi şi o metodă separată pentru codul folosit la sortare.


12. Sortarea unui ArrayList de String-uri.
Creaţi un ArrayList care să reţina valori de tipul String. Adăugaţi 10 cuvinte aleatoare în
ArrayList (toate cu litere mici) într-o oarecare ordine. Afişaţi-le pe ecran. Folosind o
modalitate de sortare la alegere, aranjaţi valorile respective în ordine alfabetică şi afişaţi-
le din nou.

La fel ca la exerciţul anterior, creaţi o metodă de sortare.


Solutie
1 ArrayList<String> words = new ArrayList<>();
2 words.add("creati");
3 words.add("un");
4 words.add("arraylist");
5 words.add("care");
6 words.add("sa");
7 words.add("retina");
8 words.add("valori");
9 words.add("de");
10 words.add("tipul");
11 words.add("string");
12
13 System.out.println("Afisare ArrayList initial");
14 for (String s : words) {
15 System.out.println(s);
16 }
17
18 // sortare - metoda manuala (una dintre posibilitati)
19 // metoda similara cu bubble sort de la arrays
20
21 boolean isStillSwapping = true;
22 while (isStillSwapping) {
23
24 isStillSwapping = false;
25
26 for (int i = 0; i<words.size()-1; i++) {
27
28 if (words.get(i).compareTo(words.get(i+1)) > 0) {
29 String temp = words.get(i);
30 words.set(i, words.get(i+1));
31 words.set(i+1, temp);
32 isStillSwapping = true;
33 }
34
35 }
36
37 }
38
39
40 System.out.println("\n\nAfisare ArrayList sortat");
41 for (String s : words) {
42 System.out.println(s);
43 }
Alte posibilitati de sortare:
// folosind metoda de sortare din clasa Collections
1
Collections.sort(words);
2
3
// sau convertim intr-un array simplu, sortam cu metoda Arrays.sort,
4
ArrayList
5 String[] cuvinte = words.toArray(new String[words.size()]);
6 Arrays.sort(cuvinte);
7 words = new ArrayList<>(Arrays.asList(cuvinte));
Şi metoda:
1 public static void main(String[] args) {
2
3 // ...
4
5 sorteazaArrayListStringuri(cuvinte);
6
7 // ...
8
9 }
10
11 static void sorteazaArrayListStringuri(ArrayList<String> words) {
12 boolean isStillSwapping = true;
13 while (isStillSwapping) {
14
15 isStillSwapping = false;
16
17 for (int i = 0; i<words.size()-1; i++) {
18
19 if (words.get(i).compareTo(words.get(i+1)) > 0) {
20 String temp = words.get(i);
21 words.set(i, words.get(i+1));
22 words.set(i+1, temp);
23 isStillSwapping = true;
24 }
25
26 }
27
28 }
29 }

13. Sortarea propoziţiilor.


Creaţi un ArrayList care conţine valori de tipul String. Cereţi utilizatorului să introducă o
propoziţie sau o frază pe care o preluaţi într-un String cu metoda nextLine() din
Scanner. Folosind String.split(), împărţiţi acest String şi salvaţi şirurile de caractere
respective într-un ArrayList. Transformaţi toate şirurile de caractere în litere mici.
Folosind metoda de sortare de la exerciţiul anterior, puneţi cuvintele în ordine alfabetică
şi afişaţi-le 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;
}

}
}

10. Bucle Imbricate (Nested Loops)


Bucle Imbricate (Nested Loops)
Buclele imbricate apar atunci când o buclă conţine ca şi instrucţiune o altă buclă.

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 }

2. 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 *****
Solutie
1 for(int i = 0 ; i < 5; i++) {
2
3 for(int j = 0; j <= i ; j++) {
4 System.out.print("*");
5 }
6
7 System.out.println("");
8 }

3. Afișați în consolă următorul output:


1 0 1 2 3 4 5 6 7 8 9
2 0 1 2 3 4 5 6 7 8 9
3 0 1 2 3 4 5 6 7 8 9
4 0 1 2 3 4 5 6 7 8 9
5 0 1 2 3 4 5 6 7 8 9
6 0 1 2 3 4 5 6 7 8 9
7 0 1 2 3 4 5 6 7 8 9
8 0 1 2 3 4 5 6 7 8 9
9 0 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9
Solutie
1 for (int i = 0; i < 10; i++) {
2 for (int j = 0; j <= 9; j++) {
3 System.out.print(j + " ");
4 }
5 System.out.println();
6
7 }

4. Afișați în consolă următorul output:


1 1 0 0 0 0 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0 0
3 0 0 1 0 0 0 0 0 0 0
4 0 0 0 1 0 0 0 0 0 0
5 0 0 0 0 1 0 0 0 0 0
6 0 0 0 0 0 1 0 0 0 0
7 0 0 0 0 0 0 1 0 0 0
8 0 0 0 0 0 0 0 1 0 0
9 0 0 0 0 0 0 0 0 1 0
10 0 0 0 0 0 0 0 0 0 1
Solutie
1 for (int i = 0; i < 10; i++) {
2 for (int j = 0; j < 10; j++) {
3 if (i == j) {
4 System.out.print("1 ");
5 } else {
6 System.out.print("0 ");
7 }
8 }
9 System.out.println();
10 }

5. Afișați în consolă următorul output:


1 0 1 0 0 0 0 0 0 0 0
2 0 0 1 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0 0 0
5 0 0 0 0 0 1 0 0 0 0
6 0 0 0 0 0 0 1 0 0 0
7 0 0 0 0 0 0 0 1 0 0
8 0 0 0 0 0 0 0 0 1 0
9 0 0 0 0 0 0 0 0 0 1
10 0 0 0 0 0 0 0 0 0 0
Solutie
for (int i = 0; i < 10; i++) {
1
for (int j = 0; j < 10; j++) {
2
if (j==i+1)
3
System.out.print("1 ");
4
else
5
System.out.print("0 ");
6 }
7 System.out.println();
8 }
9

6. Afișați în consolă următorul output:


1 0 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 0 1 0 0
4 0 0 0 0 0 0 1 0 0 0
5 0 0 0 0 0 1 0 0 0 0
6 0 0 0 0 1 0 0 0 0 0
7 0 0 0 1 0 0 0 0 0 0
8 0 0 1 0 0 0 0 0 0 0
9 0 1 0 0 0 0 0 0 0 0
10 1 0 0 0 0 0 0 0 0 0
Solutie
1 for (int i = 0; i < 10; i++) {
2 for (int j = 0; j < 10; j++) {
3 if (i+j == 9) {
4 System.out.print("1 ");
5 } else {
6 System.out.print("0 ");
7 }
8 }
9 System.out.println();
10 }

7. Să se realizeze următorul output:


1 0
2 11
3 222
4 3333
5 44444
6 555555
Solutie
1 for (int i = 0; i < 6; i++) {
2 for (int j = 0; j <= i; j++) {
3 System.out.print(i);
4
5 }
6 System.out.println();
7 }

8. Să se realizeze următorul output:


000000
1
11111
2
2222
3 333
4 44
5 5
6
Solutie
for(int i=0;i<6;i++){
1
for(int j=0;j<6-i;j++){ // for(int j=6-1;j>0;j--) varianta
2
alternativa
3
System.out.print(i);
4
}
5
System.out.println();
6 }

9. Scrieţi un program care afişează tabla înmulţirii cu 10. Exemplu:


1 * 0 1 2 3 …
2
3 0 0 0 0 0
4 1 0 1 2 3
5 2 0 2 4 6
6 3 0 3 6 9
7 …
Solutie
System.out.println(" x| 0 1 2 3 4 5 6 7 8 9 10"
1
System.out.println("-----------------------------------------------"
2
for (int x = 0; x <= 10; x++) {
3
4
System.out.printf("%2d|", x ); // cautati aici pe wiki sau in J
5
// puteti folosi la fel de bine
6
println()
7
for (int y = 0; y <= 10; y++) {
8
System.out.printf("%4d", x * y);
9 }
10
11
System.out.println();
12
}

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 }

11. Parcurgere array Bidimensional


Exerciţii tablouri multidimensionale
1. Să se introducă numere aleatoare într-o matrice de 5 x 5. Să se afişeze elementele de pe
prima linie. Să se afişeze elementele de pe ultima coloană. Să se afişeze elementele de pe
diagonala principală şi cele de pe diagonala secundară.
Solutie
1 System.out.println("0. Generam o matrice:");
2 int[][] matrice = new int[5][5];
3 for (int i = 0; i<matrice.length; i++) {
4 System.out.print("|");
5 for (int j = 0; j<matrice[i].length; j++) {
6
7 matrice[i][j] = (int)(Math.random()*10);
8 System.out.print(matrice[i][j] + "|"); // afiseaza fara sa t
9
10 } // end bucla interioara
11
12 System.out.println(); // trece (afiseaza nimic) pe o linie noua
13 } // end bucla exterioara
14
15
16 System.out.println("\n1. Afisam prima linie");
17 for (int i = 0; i<matrice.length; i++) {
18 System.out.print("|");
19 for (int j = 0; j<matrice[i].length; j++) {
20
21 if (i == 0) {
22 System.out.print(matrice[i][j] + "|");
23 } else {
24 System.out.print(" |");
25 }
26 }
27
28 System.out.println();
29 }
30
31
32 System.out.println("\n\n2. Afisam ultima coloana");
33 for (int i = 0; i<matrice.length; i++) {
34 System.out.print("|");
35 for (int j = 0; j<matrice[i].length; j++) {
36
37 int ultimulIndex = matrice[i].length-1; // puteam folosi dir
38 array-ului
39 // in general e bine sa evita
40 if (j == ultimulIndex) {
41 System.out.print(matrice[i][j] + "|");
42 } else {
43 System.out.print(" |");
44 }
45 }
46
47 System.out.println();
48 }
49
50
51 System.out.println("\n\n3. Afisam prima diagonala");
52 for (int i = 0; i<matrice.length; i++) {
53 System.out.print("|");
54 for (int j = 0; j<matrice[i].length; j++) {
55
56 if (i == j) {
57 System.out.print(matrice[i][j] + "|");
58 } else {
59 System.out.print(" |");
60 }
61 }
62
63 System.out.println();
64 }
65
66
67 System.out.println("\n\n4. Afisam cealalta diagonala");
68 for (int i = 0; i<matrice.length; i++) {
69 System.out.print("|");
70 for (int j = 0; j<matrice[i].length; j++) {
71 int ultimulIndex = matrice[i].length-1;
72 if (j == ultimulIndex-i) {
73 System.out.print(matrice[i][j] + "|");
74 } else {
75 System.out.print(" |");
76 }
77 }
78
79 System.out.println();
80 }
81
// Afisarile 3 si 4 se pot combina folosind un singur if in bucla in
82 // if (i == j || j == matrice[i].length-1-i)

2. Se introduc numere aleatoare într-o matrice de dimensiuni aleatoare (între 1 şi 10 linii


şi coloane). Să se afişeze minimul şi maximul din matrice şi poziţiile pe care acesta se
află.
3. Să se introducă numere aleatoare într-o matrice de 4 x 4. Să se facă suma pe fiecare
linie, produsul elementelor pe fiecare coloană, să se afle maximul de pe diagonala
principală şi minimul de pe diagonala secundară.
Solutie
System.out.println("0. Generam matricea:");
1
int[][] matrice = new int[4][4];
2
for (int i = 0; i<matrice.length; i++) {
3
System.out.print("| ");
4
for (int j = 0; j<matrice[i].length; j++) {
5
6
matrice[i][j] = (int)(Math.random()*9+1); // genereaza numer
7
System.out.print(matrice[i][j] + " | ");
8
9
10 } // end bucla interioara
11
12 System.out.println();
13 }
14
15
16 System.out.println("\n1. Afisam suma liniilor");
17 for (int i = 0; i<matrice.length; i++) {
18 System.out.print("| ");
19 int sumaLinie = 0;
for (int j = 0; j<matrice[i].length; j++) {
20
System.out.print(matrice[i][j] + " | ");
21
sumaLinie += matrice[i][j];
22
}
23
System.out.print("Total: " + sumaLinie);
24
System.out.println();
25
}
26
27
28
System.out.println("\n\n2. Afisam produsul coloanelor");
29 // intai calculam produsul...
30 int[] produsColoane = new int[matrice.length]; // in acest array vo
31 for (int i = 0; i<matrice.length; i++) {
32 System.out.print(" | ");
33
34
for (int j = 0; j<matrice[i].length; j++) {
35 System.out.print(matrice[i][j] + " | ");
36 if (i == 0) { // initializam valoarea din array-ul de prod
37 inmultim
38 produsColoane[j] = matrice[i][j];
39 } else {
40 produsColoane[j] *= matrice[i][j];
41 }
42 }
43 System.out.println();
44 }
45
46 // ... apoi il afisam
47 System.out.print("Produs | ");
48 for (int i : produsColoane) {
49 System.out.print(i + " | ");
50 }
51
52
53 System.out.print("\n\n3. Afisam maximul primei diagonale: ");
54 int maxim = matrice[0][0]; // initializam la prima valoare din array
55 for (int i = 0; i<matrice.length; i++) {
56 for (int j = 0; j<matrice[i].length; j++) {
57 // comparam maximul doar cu numerele de pe prima diagonala
58 if (i == j) {
59 if ( maxim < matrice[i][j] ) maxim = matrice[i][j];
60 }
61 }
62 }
63 System.out.print(maxim);
64
65
66 System.out.print("\n\n4. Afisam minimul celeilalte diagonale: ");
67 int minim = matrice[0][matrice[0].length-1]; // initializam la valoar
68 for (int i = 0; i<matrice.length; i++) {
69 for (int j = 0; j<matrice[i].length; j++) {
// comparam minimul doar cu numerele de pe a doua diagonala
70
if (j == matrice[i].length-1-i) {
71
if ( minim > matrice[i][j] ) minim = matrice[i][j];
72
}
73
}
74
}
75
System.out.print(minim);
76

4. Se dă o matrice cu elemente aleatoare de dimensiuni aleatoare (între 3 şi 10 linii şi


coloane). Să se găsească elementul maxim din matrice. Să se afişeze vecinii acestuia
(afişarea va fi făcută aşa cum apar ei în matrice). Să se ţină cont de cazurile extreme
(când maximul este pe prima sau ultima linie, prima sau ultima coloană, sau în unul din
colţuri).
Solutie
1 System.out.println("0. Generam matricea:");
2 int lungimeRandom = (int)(Math.random()*7+3);
3
4 int[][] matrice = new int[lungimeRandom][lungimeRandom];
5
6 for (int i = 0; i < matrice.length; i++) {
7 System.out.print("|");
8 for (int j = 0; j<matrice[i].length; j++) {
9
10 matrice[i][j] = (int)(Math.random()*99+1); // genereaza num
11 System.out.printf("%4d |", matrice[i][j]);
12
13 // printf primeste (una dintre variante) un string si un numa
14 // si inlocuieste specificatorul %d din string cu numarul int
15 // daca intercalam si un numar (%4d), atunci printf va afisa
16 // aceeasi lungime, completand cu spatii daca este cazul
17
18 }
19
20 System.out.println();
21 }
22
23
24 System.out.print("\n\n1. Cautam maximul: ");
25
26 int maxim = matrice[0][0];
27 int coordI = 0;
28 int coordJ = 0;
29
30 for (int i = 0; i < matrice.length; i++) {
31
32 for (int j = 0; j<matrice[i].length; j++) {
33
34 if (maxim < matrice[i][j]) {
35 maxim = matrice[i][j];
36 coordI = i;
37 coordJ = j;
38 }
39
40 }
41
42 }
43
44 System.out.print(maxim + ", la pozitia (" + coordI + ", " + coordJ +
45
46 /* afisarea se face dupa urmatoarele coordonate
47
48 (i-1, j)
49 (i, j-1) (i, j) (i, j+1)
50 (i+1, j)
51
52 sau folosim direct indecsii si verificam ca:
53 i-1 si j-1 sa nu fie <0
54 i+1 si j+1 sa nu fie > matrice.length-1, respectiv matrice[i].lengt
55
56 */
57
58 System.out.println("\n\n2a. Afisam maximul si vecinii in matrice: "
59
60 for (int i = 0; i < matrice.length; i++) {
61 System.out.print("|");
62 for (int j = 0; j<matrice[i].length; j++) {
63
64 // afisam numarul maxim
65 if (i == coordI && j == coordJ) {
66 System.out.printf("%4d|", matrice[i][j]);
67 }
68
69 // afisam vecinul de deasupra
70 else if (i == coordI-1 && j == coordJ) {
71 System.out.printf("%4d|", matrice[i][j]);
72 }
73
74 // afisam vecinul de la stanga
75 else if (i == coordI && j == coordJ-1) {
76 System.out.printf("%4d|", matrice[i][j]);
77 }
78
79 // afisam vecinul de dedesubt
80 else if (i == coordI+1 && j == coordJ) {
81 System.out.printf("%4d|", matrice[i][j]);
82 }
83
84 // afisam vecinul de la dreapta
85 else if (i == coordI && j == coordJ+1) {
86 System.out.printf("%4d|", matrice[i][j]);
87 }
88
89 // altfel afisam spatiu gol
90 else System.out.print(" |");
91
92
93 }
94 System.out.println();
95 }
96
97
98 System.out.println("\n\n2a. Afisam doar maximul si vecinii: ");
99
100 // afisam vecinul de deasupra
101 if (coordI - 1 >=0) {
102 if (coordJ > 0) System.out.print(" "); // daca nu ne aflam
103 stanga
104 System.out.printf("|%4d|", matrice[coordI-1][coordJ]);
105 System.out.println();
106 }
107
108 // afisam vecinul de la stanga
109 if (coordJ - 1 >=0) {
110 System.out.printf("|%4d", matrice[coordI][coordJ-1]);
111 }
112
113 // afisam numarul maxim
114 System.out.printf("|%4d|", matrice[coordI][coordJ]);
115
116 // afisam vecinul de la dreapta
117 if (coordJ+1 < matrice[coordI].length) {
118 System.out.printf("%4d|", matrice[coordI][coordJ+1]);
119 }
120 System.out.println();
121
122 // afisam vecinul de dedesubt
123 if (coordI + 1 < matrice.length) {
124 if (coordJ > 0) System.out.print(" ");
125 System.out.printf("|%4d|", matrice[coordI+1][coordJ]);
}

5. Se consideră catalogul pentru o facultate. Acesta cuprinde materii, studenţi şi câte o


notă pentru fiecare student la fiecare materie. Exemplu:
1 Maria George Adrian
2 Programare 5 8 3
3 Matematica 10 4 9
Pe fiecare coloană se găsesc toate notele pentru un student, iar pe fiecare linie se găsesc
toate notele de la materia respectivă. Să se facă un program care afişează tabelul de mai
sus. Veţi avea nevoie de un vector pentru nume, un vector pentru materii şi o matrice
pentru note. Iniţializaţi cele 3 tablouri din cod.

6. Pentru problema anterioară, să se caute o notă în funcţie de numele studentului şi


materia la care se doreşte nota. Programul să nu fie case-sensitive.
Exerciţii bonus
1. Factori primi
Un program care descompune un număr introdus de la tastatură în factori primi.
Programul va crea și un vector cu numere prime pe care le va folosi:

 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.

12. Break şi Continue


Break şi Continue
Instrucţiunile break şi continue sunt folosite pentru a modifica flow-ul normal al
programului. Acestea sunt folosite în special la bucle. Spre exemplu break întrerupe o
buclă (cea mai interioară pentru care este aplicat), iar continue sare la iteraţia următoare
din bucla respectivă (cea mai interioară buclă care o găseşte). De exmplu, avem
următoarele cerinţe:

1. Să se adune numere până la întâlnirea lui 0.


2. Să se înmulţească numere şi să se evite înmulţirea cu 0.
1 public static void main(String[] args) {
2
3 int suma = 0;
4 int produs = 1;
Scanner sc = new Scanner(System.in);
5
int num;
6
7
// 1.
8
while (true) {
9
num = sc.nextInt();
10
if (num == 0) {
11
break; // opreste la indtroducerea lui 0
12
}
13
suma += num;
14 System.out.println("suma: " + suma);
15 }
16 System.out.println("suma final: " + suma);
17
18 // 2.
19 while (true) {
20 num = sc.nextInt();
21 if (num == 0) {
22 continue; // sare peste inmultirea cu 0
23 } else if (num == 1) {
24 break; // oprire la introducerea lui 1
25 }
26 produs *= num;
27 System.out.println("produs: " + produs);
28 }
29 System.out.println("produs final: " + produs);
30 }
31
Assignment
Rulaţi programul anterior şi observaţi cum funcţionează. Înlocuiţi, pe rând,
pe break cu continue şi pe continue cu break. Ce diferenţe apar?
Exerciţii
1. Se citesc numere la infinit. Să se facă suma numerelor citite. Să se oprească structura
repetitivă prin folosirea instrucţiunii break la introducerea unui număr negativ.
Solutie
1 do {
2 System.out.println("Introduceti un numar: ");
3 nr = k.nextInt();
4 if (nr < 0) break;
5 suma = suma + nr;
6 System.out.println("Suma este: " + suma);
7 } while (true);
8
9 System.out.println("Suma finala este " + suma);
10 k.close();

2. Se citesc numere la infinit. Să se afişeze numerele impare. Să se folosească


instrucţiunea break la introducerea lui 0.
Solutie
1 Scanner keyboard = new Scanner(System.in);
2 int nr;
3
4 while (true) {
5 System.out.println("Introdu un numar:");
6 nr = keyboard.nextInt();
7
8 if (nr == 0) {
9 System.out.println("ai bagat 0");
10 break;
11 }
12
13 if (nr % 2 != 0) {
14 System.out.println(nr);
15
16 }
17
18 }
19 keyboard.close();

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();

4. Se citesc numere. Să se adune numerele negative. Să se evite adunarea cu 0 prin


folosirea instrucţiunii continue. Să se oprească structura repetitivă la introducerea
numărului 7 prin instrucţiunea break. Să se afişeze suma la fiecare pas.
5. Rescrieţi programele anterioare astfel încât să folosiţi variabile booleene în loc
de breakşi / sau continue, acolo unde este posibil.
13. Labels
Labels: atribuirea de denumiri unor blocuri de cod
1 BuclaMare:
2 for (int i=0; i<100; i++) {
3 for (int j=0; j<100; j++) {
4 if ( condiție ) {
5 break BuclaMare;
6 }
7 }
8 }
9
10 Labeled loops:
11 outer:
12 for (int i=0; i<10; i++){
13 for (int j=0; j<10; j++){
14 if (conditie1){
15 break; //iese din bucla mica
16 }
17 if (conditie2){
18 break outer; //iese din bucla mare
19 }
20 }
21 }
Assignment
Să se realizeze următorul program: Chestionarul despre calitățile unui candidat la
președinție are 6 secțiuni. Prima secțiune are o întrebare. Cea de a doua: două întrebări.
Cea de a treia: trei întrebări, ș.a.m.d. Intervievatul poate răspunde cu: „DA”, “NU”, “Nu
stiu” sau “Nu raspund”. Programul va genera aleator răspunsul intervievatului. La o
întrebare, șansa să răspundă cu „DA”este de 40%, șansa să răspundă cu “NU” este tot de
40%, șansa să răspundă cu “Nu stiu” este de 10%, iar șansa să răspundă cu “Nu raspund”
este de 10%.

Dacă intervievatul răspunde cu “Nu stiu” la o intrebare, el va trece la următoarea


secțiune. Daca raspunde cu “Nu raspund”, se încheie interviul.

Cerinţa: să se afiseze Sectiunea numarul, Intrebarea numărul si ce raspunde.


Pentru testare, la început, faceţi să răspundă doar cu DA sau NU cu probabilitatea de 50%
- 50%.

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 }

14. Tipuri de Date: Random


Numere Aleatoare. Random
Pentru a genera numere aleatoare ne putem folosi de clasa Random. Pentru a folosi clasa
avem nevoie de următorul import:

1 import java.util.Random;
Apoi avem nevoie de un obiect pe care să îl folosim:

1 Random r = new Random();


Iar pentru a genera un număr întreg:

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.");

4. Modificaţi programul anterior astfel încât să găsiţi 3 numere aleatoare egale. Ce


observaţi? De câte încercări este nevoie spre deosebire de celălalt program?
5. Scrieţi un program în care să reţineţi 10 mesaje. La rulare, veţi afişa aleator unul din
mesaje.
6. Scrieţi un program pentru a ghici un număr generat aleator. Veţi afişa la început
intervalul între care numărul este ghicit, apoi veţi lăsa utilizatorul să aleagă un număr
până ghiceşte numărul iniţial. De fiecare dată când este introdus un număr, utilizatorul va
trebui să afişeze dacă acesta este mai mic, mai mare sau egal cu numărul ghicit. La
sfârşit, afişaţi şi numărul de încercări.
Hint
Vezi rezolvarea de la exercitiul 1 de aici.

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);

7. Creaţi un program care să genereze numerele aruncate de 2 zaruri. Afişaţi numerele şi


suma acestora. În cazul în care numerele sunt egale, afişaţi mesajul “dublu 6”, unde în loc
de 6 veţi pune numărul care se află pe ambele zaruri.
Solutie
Random rand = new Random();
1
2
for (int i = 0; i<100; i++) {
3
int nr1 = rand.nextInt(6)+1;
4
int nr2 = rand.nextInt(6)+1;
5
6 System.out.println("Am aruncat " + ((nr1 == nr2) ? "dublu " + nr1 +
7 nr2) );
8 }

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.

Ideea generală este ca fiecare task specific să fie bine individualizat.

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:

 Generarea unui număr aleator


 Citirea unei variabile de la utilizator
 Găsirea tuturor divizorilor unui număr
 etc
și care sunt apelate între ele, sau din metoda public static void main(String[]args)

Funcțiile au următoarea sintaxă:

1 public static int înregistreazăNumărDeLaUtilizator(){


2 ----------------------------------------
3 }
4
5 public static void afiseazaInConsola(String str){
6 ----------------------------------------
7 }
8
9 public static double genereazaNumarAleator() {
10 ----------------------------------------
11 }
12
13
14 public static int getInaltime(){
15 ----------------------------------------
16 }
Sintaxa:

 public – access modifier, modificator de acces care menționează că metoda poată fi


văzută din toate clasele din aplicație.
 static – un keyword pe care il vom intelege în viitorul apropiat
 void / int / double / String / boolean - return-type, adică ce returnează metoda
 getInaltime() - denumirea metodei. Parantezele sunt obligatorii
 În paranteze putem specifica niste variabile (parametri) care să primească valoarea unor
variabile din metoda care o apelează.
Exemple de apelare:

1 public static void main (String[] args) {


2 System.ouyt.println(); //println() e o metodă
3 int nrAleator = getNumarAleator();
4 ….....str.length():
5 afiseazaInConsolaNumarAleator(nrAleator);
6 ….........
7 daDrumulLaRadio();
8 }
Metodele care întorc ceva (diferite de void), trebuie să menioneze:

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

1 public void myFunction () {


2 ….........
3 }
4 public void myFunction(String str) {…..................}
5 public void myFunction(int myInt) {…..................}
6 public void myFunction(String str, int myInt) {…..................}
7 public void myFunction(int myInt , String str) {…..................}
8
9 public int myFunction2(String str) {…........}
10 public String myFunction3(String str) {…........}
11
12 private String myFunction4(String str) {…..............}
Recapitulare metode
definirea unei metode

1 public static return-type denumire (parametrii){


2
3 }
 denumirea + parametrii se numește Semnătura (Signuture-ul) metodei.
Return type-ul poate fi:

 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

public static String nume() {


1
//diverse operații complexe
2
String str = "abc";
3
//alte operatii
4
return str;
5
}
6
//observati keywordul String din prima linie
7 //ceea ce returneaza metoda trebuie sa se //potriveasca cu acest
8 keyword
Cu parametri
3. nu întoarce nimic
1 public static void nume(int x){
2 //diverse operații
3 //nu returneaza nimic
4 //observati keywordul void
5 }
4. întoarce ceva

public static boolean nume(String s, int i){


1
..................
2
if (conditie){
3
return true;
4
} else {
5
return false;
6
}
7
}
8 //observati keywordul boolean din prima linie
9 //ceea ce returneaza metoda trebuie sa se //potriveasca cu acest
10 keyword
Exerciţii
1. Realizati o metodă care primește un număr și returnează numărul de divizori.
Exemplu: 3 este divizorul lui 30 pentru că 30 se împarte
exact la 3.

La această metodă este suficient să parcurgem doar până la radicalul numărului.


2. Realizați o altă metodă care primește un număr și returnează dacă numărul este prim.

Indiciu: un număr prim are doar 2 divizori (pe 1 și pe el


însuși).

Alt indiciu: această metodă poate apela apela prima


metodă.

3. Realizați un program care primește de la tastatură un număr și afișează toate numerele


prime până la acest număr.

Indiciu: programul poate apela cea de a doua metodă.

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 }

2. Să se creeze o metodă public static void sayHello100Times() care afișează


"Hello" de 100 de ori. Să se invoce metoda.
Solutie
1 public static void main(String[] args) {
2 sayHello100Times();
3 }
4
5 public static void sayHello100Times() {
6 for (int i = 1; i <= 100; i++) {
7 System.out.println(i + ". " + "Hello");
8 // sau apelam metoda sayHello() de la ex. 1
9 }
10 }

3. Să se creeze o metodă care public static void afiseaza() care afișează


primele 100 de numere. Să se invoce metoda.
Hint
4. Să se creeze o metodă public static double genereazaNrAleator() care
returnează un numar generat aleator. Să se invoce metoda. Sa se afiseze numarul.
Solutie
1 public static void main(String[] args) {
2 double aleatorDouble = genereazaNrAleator();
3 System.out.println(aleatorDouble);
4 }
5
6 public static double genereazaNrAleator() {
7 return Math.random() * 10;
8 }

5. Să se creeze o metodă public static String


returneazăDenumireaLunii() care primeşte un numar între 1-12 (citit de la
tastatură) si returnează un string – denumirea lunii. Să se invoce metoda.
Solutie
1 public static void main(String[] args) {
2 Scanner tastatura = new Scanner(System.in);
3 System.out.println("Introduceti numarul lunii");
4 int numarLuna = tastatura.nextInt();
5 String lunaIntrodusa = returneazaDenumireaLunii(numarLuna);
6 System.out.println(lunaIntrodusa);
7 }
8
9 public static String returneazaDenumireaLunii(int numar) {
10
11 switch (numar) {
12 case 1: return "ianuarie";
13 case 2: return "februarie";
14 case 3: return "martie";
15 case 4: return "aprilie";
16 case 5: return "mai";
17 case 6: return "iunie";
18 case 7: return "iulie";
19 case 8: return "august";
20 case 9: return "septembrie";
21 case 10: return "octombrie";
22 case 11: return "noiembrie";
23 case 12: return "decembrie";
24 default: return "Nu ati introdus o luna valida";
25 }
26 }

6. Să se creeze o metodă public static void afiseazaNr(int nr) care afişează


numarul primit ca parametru. Numarul este introdus de la tastatura. Să se invoce metoda.
7. Să se creeze o metodă public static int ridicaLaPatrat(int nr) care
returnează patratul unui numar. Numarul este introdus de la tastatura. Să se invoce
metoda.
Solutie
public static void main(String[] args) {
1
Scanner tastatura = new Scanner(System.in);
2
System.out.println("Introduceti numarul:");
3
int numar = tastatura.nextInt();
4
int numarLaPatrat = ridicaLaPatrat(numar);
5
System.out.println("Patratul lui " + numar + " este " +
6
numarLaPatrat);
7
}
8
9 public static int ridicaLaPatrat(int nr) {
10 return nr * nr;
11 }

8. Să se creeze o metodă public static int lungimeSir(String sir) care


primește un şir de caractere introdus de la tastatură şi returnează lungimea lui. Să se
invoce metoda şi să se afişeze lungimea şirului.
Solutie
1 public static void main(String[] args) {
2 Scanner tastatura = new Scanner(System.in);
3 System.out.println("Introduceti sirul si apasati 'Enter':");
4 String sir = tastatura.nextLine();
5 int lungimeSir = lungimeSir(sir);
6 System.out.println("Ati introdus " + lungimeSir + " caractere.");
7 }
8
9 public static int lungimeSir(String sir) {
10 return sir.length();
11 }

9. Să se creeze o metodă public static boolean isFood() care citește un cuvant


de la tastatură si returnează true daca e cuvântul este "Food" și false dacă nu. Să se
afişeze rezultatul.

2. Semnatura. Supraincarcare. Pass by value


Semnătura metodelor. Supraîncărcare (Overloading)
Semnătura metodei este dată de numele acesteia şi lista de parametri (numărul şi tipul
fiecăruia). Într-o clasă nu putem avea metode cu aceeaşi semnătură, dar putem avea
metode cu același nume dacă semnătura lor diferă.

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 public void eat(String where) {


2 // implementation
3 }
4
5 public void eat(int howMuch) {
6 // implementation
7 }
8
9 public void eat(String where, int howMuch) {
10 // implementation
11 }
Deci pot exista într-o clasă mai multe metode cu același nume dacă:

1. au număr de parametri diferit


2. diferă tipul parametrilor
3. diferă ordinea lor
4. nu contează return-type-ul
Cu alte cuvinte, dacă semnătura metodelor este diferită. Semnătura unei metode (method
signature) înseamnă denumirea + parametri. Return-type-ul nu intră în semnătura
metodei.

Aceleași reguli se aplică și la supraîncărcarea constructorului. Constructorii se mai pot


apela unii pe alții:

1 public Computer (String marca, int ram, int procesor){


2 this (ram, procesor); // prima linie din constructor
3 this.marca = marca;
4 }
5
6 public Computer (int ram, int procesor){
7 super(); // prima linie din constructor
8 this.ram = ram;
9 this.procesor = procesor;
10 }
Tranferul parametrilor prin valoare şi referinţă
 Referințe. Implicații în transferul de parametri
După cum știți, obictele se alocă pe heap. Pentru ca un obiect să poată fi folosit, este
necesară cunoașterea adresei lui. Această adresă, se reține într-o referinţă. Limbajul Java
nu permite lucrul direct cu adresele de memorie, deoarece s-a considerat că această
facilitate introduce o complexitate prea mare de care programatorul poate fi scutit. Totuși,
în Java există noțiunea de referințe, oferind un mecanism de gestiune (management)
transparent.
Astfel, declararea unui obiect:

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.

Managementul transparent al pointerilor implică un proces automat de alocare și eliberare


a memoriei. Eliberarea automată poartă și numele de Garbage Collection și există o
componentă separată a JRE-ului care se ocupă cu eliberarea memoriei ce nu mai este
utilizată.

Un fapt ce merită discutat este semnificația atribuirii de referințe. În exemplul de mai jos:

1 Student s1 = new Student("Gigel", 6);


2 s2 = s1;
3 s2.averageGrade = 10;
4 System.out.println(s1.averageGrade);
se va afișa 10. Motivul este că s1 și s2 sunt două referințe către ACELAŞI obiect din
memorie. Orice modificare făcută asupra acestuia prin una din referințele sale va fi
vizibilă în urma accesului prin orice altă referință către el. În concluzie, atribuirea de
referințe nu creează o copie a obiectului, cum s-ar fi putut crede inițial.

Transferul parametrilor la apelul de funcții este foarte importat de înțeles. Astfel:

 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".

Apelul (2) metodei modificaObiect are ca efect modificarea obiectului referit de s cu


ajutorul metodei setName sau prin acces direct. Linia (2') va afișa textul: 10.

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.

Acest parametru se comportă ca un vector în interiorul metodei şi poate fi folosit ca atare.

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:

1 The max value is 56.5


2 The max value is 3.0
Exemplu 2
public static void main (String [] args){

1 metoda1(34, 363, 546, 235345);


2 metoda1(45, 43543, 577, 655, 2134, 21, 67, 8747, 134234, 25372);
3
4 metoda2(”asdg”, “fdgfd”, “hhads”, “hsed”);
5 metoda2(”asdg”, “fdgfd”, “hhads”, “hsed”, “dfgv”, “fdgr”, “fdyer
6 “dsgjkse”);
7
8 metoda3(telefon1, computer1, carte1, carte2, computer2, “fsdgsfg
9 bicicleta1);
10 metoda3(telefon3, bicicleta2 , telefon4, computer23);
11
12 }
13
14 public static void metoda1 (int... numere){ //adică număr variabil de
15 //la rulare se formeaza un array de tip int[] numere care contin
16 for (int numar : numere){
17 System.out.println(numar);
18 }
19 }
20
21 public static void metoda2 (String... siruri){ //adică număr variabil
22 uri
23 for (int i = 0; i < siruri.length; i++){
24 System.out.println(siruri[i]);
25 }
26 }
27
28 public static void metoda3 (Object... obiecte){ //adică număr variabi
29 //la rulare se formeaza un array de tip Object[] obiecte care co
30 parametrii
31 for (Object obiect : obiect){
32 System.out.println(obiect);
}
}
Exerciţiu varargs, format
Folosind System.out.printf (String string, Object…
args) și String.format (String string, Object… args)
afișați:

 "Știai că Gelu are 4 mere?"


 "Orașul Galați are 300,000 locuitori" (folosind virgula)
 "Orașul Piatra Neamț are 190,000 locuitori"
 "Constanta Pi = 3.14" scriind doar 2 zecimale si folosind constanta din clasa Math
4. Tipul metodelor
Return pentru metodele de tip void
1 public void afiseaza(int nr){
2 if (nr == 0){
3 System.out.println (“nr e 0. Eroare!”);
4 return;
5 }
6 System.out.println (“nr = ” + nr);
7 }
return; nu face altceva decat sa termine metoda. Dar el nu returneaza nimic, pentru ca
nu avem return nr; ci doar return;

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.

4. In metoda main(String[] args) se cere utilizatorului să introducă un număr şi se


va apela la metoda 3. Se va afişa numărul de numere prime pâna la acest număr.
Rezolvări
1 import java.util.Scanner;
2
3 public class NumerePrime {
4
5 /**
6 * Aceasta metoda primeste un numar intreg (int nr)
7 * si returneaza cati divizori are (inclusiv el insusi si 1)
8 */
9 public static int divizori(int nr) {
10 // aceasta variabila va contine numarul de divizori. Noi vo
11 variabile.
12 // De fiecare data cand gasim un nou divizor, incrementam c
13 int nrDeDivizori = 0;
14 for (int i=1; i<=nr; i++ ) {
15 //daca restul este 0, inseamna ca este un divizor.
16 if (nr % i == 0) {
17 // incrementam cu 1 valoarea variabilei.
18 nrDeDivizori++;
19 }
20 }
21 return nrDeDivizori;
22 }
23
24 /**
25 * Verificam daca un numar primit ca parametru e prim.
26 * Ne folosim de metoda (functia) creata anterior: divizori(
27 * Adica daca are 2 divizori
28 */
29 public static boolean isPrim(int x) {
30 // Varianta 1: mai dezvoltat, mai usor de inteles:
31 // metoda divizori(x) returneaza numarul de divizori
32 // pe care noi il captam (stocam) intr-o variabila numarDeD
33 // int numarDeDivizori = divizori(x);
34 // Un numar ca sa fie prim are doar 2 divizori: pe 1 si pe
35 // Daca numarul are doar 2 divizori, inseamna ca e prim.
36 // In cazul asta returnam true.
37 // Daca nu e prim returnam false
38 // A se observa keywordul boolean din definirea metodei
39 // public static boolean isPrim(int x)
40 // Cuvantul de dinaintea denumirii metodei (isPrim) inseamn
41 // in cazul nostru returnam un boolean
// spunem ca return-type-ul este de tip boolean
42
// if (numarDeDivizori == 2) {
43
// return true;
44
// } else {
45
// return false;
46
// }
47
48
// Varianta 2, mai direct, fara declararea unor variabile c
49
// si care fac consum de memorie si, din cauza declararii l
50
// pentru programe mari, cateva nanosecunde in plus pot sa
51
52 // metoda divizori(x) returneaza numarul de divizori
53 if (divizori(x) == 2) {
54 return true;
55 }
56 return false;
57 // a se observa ca nu am mai pus else. Este clar ca daca nu
58 // nu se mai rexecuta codul din if.
59 }
60
61 /**
62 * Aceasta metoda se foloseste de metoda pe care am scris-o
63 * si afiseaza toate numerele prime pana la un numar pe care
64 * si returneaza cate numere prime a gasit pana la numarul x
65 */
66 public static int numerePrime(int x) {
67 // cu aceasta variabila (numar) verificam toate numerele pa
68 // daca sunt prime
69 // Luam toate numerele pe rand, incepand cu 0 si mergem pan
70 int numar = 0;
71
72 // un contor care numara numerele prime gasite.
73 // la inceput avem 0 numere prime gsite
74 int contor = 0;
75
76 System.out.println("Numere prime:");
77 // putem folosi si o bucla for.
78 // while: cate vreme numar este mai mic sau egal cu x
79 while (numar <= x) {
80 // folosim metoda pe care am definit-o anterior: isPrim
81 // isPrim(int x) returneaza un boolean: true sau false
82 // scriem if( isPrim(numar) )....
83 // observati ca isPrim(numar) este true sau false.
84 // Nu are sens sa scriem if( isPrim(numar) == true) pen
85 el
86 // true sau false
87 if (isPrim(numar)) {
88 // afisam in consola numarul gasit.
89 System.out.print(numar + ", ");
// daca este numar prim, incrementam cu 1 valoarea
90
// cate numere prime am gasit pana in acest moment.
91
contor++;
92
}
93
94
// FOARTE IMPORATNT!!!!
95
// Nu uitati sa il incrementati pe numar.
96
// Altfel, nu mai iesim din bucla asta niciodata.
97
numar++;
98
} //end bucla while
99 System.out.println();
100 return contor;
101 }
102
103
104 public static void main(String[] args) {
105 // Primim un numar de la utilizator
106 // si afisam toate numerele prime pana la acest numar
107 // precum si cate numere prime sunt pana la acest numar
108 Scanner scanner = new Scanner(System.in);
109 System.out.println("Va rugam introduceti un numar intreg ma
110 int nr = scanner.nextInt();
111 System.out.println("Pana la acest numar sunt " + numerePrime
112 " de numere prime" );
113 // puteam face si asa:
114 // defineam o variabila care sa stocheze (sa retina) valoar
115 // metoda numerePrime()
116 // int numerePrimeGasite = numerePrime(nr);
117 // System.out.println("Pana la acest numar sunt " + numereP
118 // Dar prin definirea unei noi variabile folsim mai mult me
119 // (pentru aplicatii mari chiar conteaza fiecare economisir
120 // dar si marim timpul de executie al aplicatiei
121 // E adevarat ca il marim cu doar cateva nanosecunde, dar i
122 // daca putem reduce timpul de executie.
123 }
124 }
125
126 //Executie:
127 //Va rugam introduceti un numar intreg mai mare decat zero
128 //100
129 //Numere prime:
130 //2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 6
131 //71, 73, 79, 83, 89, 97,
132 //Pana la acest numar sunt 25 de numere prime

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?

Există un bug în formulele din ambele secvenţe de cod. Când (a + b + c) este un


număr impar, împărţirea sa la 2 va da un rezultat care se termină în .5, pe care îl pierdem.
Reparaţi ambele fişiere astfel încât împarţirea "(a + b + c) / 2" să devină "(a + b + c) /
2.0" peste tot unde apare. Este mai uşor să reparaţi fişierul care conţine metode sau
fişierul care nu conţine metode?
Adăugaţi încă un test pentru ambele fişiere: găsiţi aria unui triunghi cu laturile de 9, 9, şi
9. Cât de dificilă a fost această modificare pentru fişierul care foloseşte metode?

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
}
}

Clasa fără metodă:


1 public class HeronsFormulaNoFunction {
2 public static void main(String[] args) {
3 int a, b, c;
4 double s, A;
5
6 a = 3;
7 b = 3;
8 c = 3;
9 s = (a + b + c) / 2;
10 A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
11 System.out.println("A triangle with sides 3, 3, 3 has an are
12 );
13
14 a = 3;
15 b = 4;
16 c = 5;
17 s = (a + b + c) / 2;
18 A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
19 System.out.println("A triangle with sides 3, 4, 5 has an are
20 );
21
22 a = 7;
23 b = 8;
24 c = 9;
25 s = (a + b + c) / 2;
26 A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
27 System.out.println("A triangle with sides 7, 8, 9 has an are
28 );
29
30 a = 5;
31 b = 12;
32 c = 13;
33 s = (a + b + c) / 2;
34 A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
35 System.out.println("A triangle with sides 5, 12, 13 has an a
36 );
37
38 a = 10;
39 b = 9;
40 c = 11;
41 s = (a + b + c) / 2;
42 A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
43 System.out.println("A triangle with sides 10, 9, 11 has an a
44 );
45
46 a = 8;
47 b = 15;
48 c = 17;
s = (a + b + c) / 2;
A = Math.sqrt(s * (s - a) * (s - b) * (s - c));
System.out.println("A triangle with sides 8, 15, 17 has an a
);
}
}

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:

1 d = radical ( ( x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) )


Metoda trebuie să aibă numele getDistance() şi să returneze distanţa dintre cele 2
puncte. Folosiţi clasa Math pentru a calcula puterea unui număr şi rădăcina acestuia.
1 public class DistanceFormula {
2 public static void main(String[] args) {
3 // test the formula a bit
4 double d1 = getDistance(-2,1 , 1,5);
5 System.out.println(" (-2,1) to (1,5) => " + d1 );
6
7 double d2 = getDistance(-2,-3 , -4,4);
8 System.out.println(" (-2,-3) to (-4,4) => " + d2 );
9
10 System.out.println(" (2,-3) to (-1,-2) => " + getDistance(2,-
11 );
12 System.out.println(" (4,5) to (4,5) => " + getDistance(4,5,4,
13 }
14
15 public static double getDistance(int x1, int y1, int x2, int y2) {
16 // put your code up in here
17 }
}
Solutie
public static double getDistance(int x1, int y1, int x2, int y2) {
1
return Math.sqrt( Math.pow( (x2 - x1), 2) + Math.pow( (y2 - y1),
2
2));
3
}

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.

Metoda trebuie apelată folosind monthName(), şi trebuie să aibă un singur parametru


(un număr întreg), şi să returneze un String.
1 public class MonthName {
2 public static String monthName(int month) {
3 String result;
4
5 // Your code goes in here.
6
7 return result;
8 }
9
10 public static void main(String[] args) {
11 System.out.println("Month 1: " + monthName(1));
12 System.out.println("Month 2: " + monthName(2));
13 System.out.println("Month 3: " + monthName(3));
14 System.out.println("Month 4: " + monthName(4));
15 System.out.println("Month 5: " + monthName(5));
16 System.out.println("Month 6: " + monthName(6));
17 System.out.println("Month 7: " + monthName(7));
18 System.out.println("Month 8: " + monthName(8));
19 System.out.println("Month 9: " + monthName(9));
20 System.out.println("Month 10: " + monthName(10));
21 System.out.println("Month 11: " + monthName(11));
22 System.out.println("Month 12: " + monthName(12));
23 System.out.println("Month 43: " + monthName(43));
24 }
25 }
5. Forme geometrice
Scrieţi un program care calculează aria a patru forme geometrice diferite: triunghiuri,
pătrate, dreptunghiuri, şi cercuri. Trebuie să creaţi şi să folosiţi următoarele metode:

public static double areaCircle(int radius) // returns the


1 public static int areaRectangle(int length, int width) // returns the
2 rectangle
3 public static int areaSquare(int side) // returns the
4 public static double areaTriangle(int base, int height) // returns the
triangle
Programul va prezenta un meniu din care utilizatorul să aleagă care din volume să le
calculeze, apoi îi va cere valorile necesare pentru forma respectivă (lungime, lăţime, raza,
etc.). Apoi va trebui să transmiteţi parametrii respectivi în metodă şi să afişeze aria
rezultată.

 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

7. Ye Olde Keychain Shoppe


Scrieţi un program care vă afişează un meniu cu 4 opţiuni. Ar putea arăta în felul
următor:

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 }

8. Ye Olde Keychain Shoppe (cont.)


Următorul pas este să facem magazinul de breloace să funcţioneze.

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.

 addKeychains() va primi ca parametru un int şi va returna un int. Va cere


utilizatorului numărul de breloace pe care să îl adauge la comandă, şi va returna noul
număr de breloace.
 removeKeychains() va primi ca parametru un int şi va avea tipul returnat int. Va
cere utilizatorului numărul de breloace care să îl şteargă din comandă şi va returna
numărul de breloace rămase.
 viewOrder() va primi ca parametri 2 variabile de tipul int şi va avea ca tip
returnat void. Va afişa, pe 3 linii diferite, numărul de breloace din comandă, preţul
pentru fiecare breloc şi costul total al comenzii.
 checkout() va avea ca parametri 2 variabile de tip int, iar tipul returnat va fi void.
Va cere utilizatorului numele acestuia pentru a face corect livrarea, va afişa informaţii
referitoare la comandă, iar la final va mulţumi utilizatorului folosind numele acestuia
pentru comanda făcută.
Solutie
1 public class KeychainShoppeImpl {
2
3 public static void main(String[] args) {
4
5 int nrBreloace = 0;
6 int pretBrelocRon = 10;
7
8 int userInput;
9
10 do {
11 afiseazaMeniuPrincipal();
12 userInput = getUserInput(1, 4, "Choice does not exist, try
13
14 if (userInput == 1) {
15 nrBreloace = addKeychain(nrBreloace);
16
17 } else if (userInput == 2) {
18 nrBreloace = removeKeychain(nrBreloace);
19
20 } else if (userInput == 3) {
21 viewOrder(nrBreloace, pretBrelocRon);
22 }
23
24 } while (userInput != 4);
25
26 // n-ar trebui sa ajunga aici daca nu userInput nu e 4
27 checkout(nrBreloace, pretBrelocRon);
28
29 }
30
31
32 public static void afiseazaMeniuPrincipal() {
33
34 System.out.println("" + "\n"
35 + "*****************************" + "\n"
36 + "** Ye Olde Keychain Shoppe **" + "\n"
37 + "*****************************" + "\n");
38
39 System.out.println(""
40 + "1. Add Keychains to Order" + "\n"
41 + "2. Remove Keychains from Order" + "\n"
42 + "3. View Current Order" + "\n"
43 + "4. Checkout" + "\n"
44 );
45
46 System.out.println("Please enter your choice: ");
47 }
48
49 public static int getUserInput(int minInput, int maxInput, String ou
50
51 Scanner keyboard = new Scanner(System.in);
52 int userChoice;
53
54 while (true) {
55 if (keyboard.hasNextInt() ) { // preia input doar daca
56 userChoice = keyboard.nextInt();
57 if (userChoice < minInput || userChoice > maxInput) {
58 System.out.println(outOfRangeMessage);
59 continue;
60 }
61 break;
62 } else {
63 System.out.println("Invalid input, please try again: ")
64 keyboard.next();
65 continue;
66 }
67 }
68 return userChoice;
69 }
70
71 public static String getUserInput() {
72 Scanner keyboard = new Scanner(System.in);
73 return keyboard.nextLine();
74 }
75
76 private static int addKeychain(int nrBreloaceCurent) {
77 System.out.println("You have " + nrBreloaceCurent + " keychain
78 int breloaceNoi = getUserInput(1, 20, "Too many keychains for
79 again:");
80 nrBreloaceCurent += breloaceNoi;
81 System.out.println("You now have " + nrBreloaceCurent + " keyc
82 return nrBreloaceCurent;
83 }
84
85 private static int removeKeychain(int nrBreloaceCurent) {
86 System.out.println("You have " + nrBreloaceCurent + " keychain
87 int breloaceSterse = getUserInput(0, nrBreloaceCurent, "You do
88 again:");
89 nrBreloaceCurent -= breloaceSterse;
90 System.out.println("You now have " + nrBreloaceCurent + " keyc
91 return nrBreloaceCurent;
92 }
93
94 private static void viewOrder(int nrBreloaceCurent, int pretBreloc)
95 System.out.println("You have " + nrBreloaceCurent + " keychain
96 System.out.println("Keychains cost " + pretBreloc + " RON each
97 System.out.println("Total cost is " + getTotalCost(nrBreloaceC
98 }
99
100 private static void checkout(int nrBreloaceCurent, int pretBreloc)
101 System.out.println("What is your name?");
102 String userName = getUserInput();
System.out.println("(Keychains cost " + pretBreloc + " each)")
103
System.out.println("Total cost is " + getTotalCost(nrBreloaceC
104
System.out.println("Thanks for your order, " + userName);
105
}
106
107
108 private static int getTotalCost(int nrBreloaceCurent, int pretBrelo
return nrBreloaceCurent * pretBreloc;
109
}
}
9. Paritate
Scrieţi o metodă care arată în modul următor:

1 public static boolean isEven(int n)


Funcţia va trebui să returneze valoarea true dacă n este un număr par (se divide perfect
la 2) şi false altfel.
Scrieţi şi metoda următoare:

1 public static boolean isDivisibleBy3(int n)


Funcţia va întoarce valoarea true dacă numărul este divizibil cu 3, şi false altfel.
Scrieţi în funcţia main() o buclă for care generează numere de la 1 la 20. Folosiţi
instrucţiuni if în interiorul acestei bucle pentru a marca numerele care sunt pare prin
semnul "<" şi cu un "=" numerele divizibile cu 3 şi cu "both" dacă numerele sunt
divizibile şi cu 2 şi cu 3.
Solutie
1 public class Paritate {
2
3 public static void main(String[] args) {
4
5 for (int i = 1; i <= 20; i++) {
6 boolean par = isEven(i);
7 boolean div3 = isDivisibleBy3(i);
8
9 if (par && div3) System.out.println(i + ". " + "both");
10 else if (par) System.out.println(i + ". " + "<");
11 else if (div3) System.out.println(i + ". " + "=");
12 }
13 }
14
15 public static boolean isEven(int n) {
16 return n % 2 == 0;
17 }
18
19 public static boolean isDivisibleBy3(int n) {
20 return n % 3 == 0;
21 }
22
23 }

V. OOP I

1. Introducere Programarea Orientata pe Obiect


Introducere în Programarea Orientata pe Obiect
OOP = Object Oriented Programming. Veţi mai întalni uneori şi varianta în română POO.

Scurtă istorie a programării


Instrucțiunile pentru un calculator trebuie să fie într-un limbaj pe care acesta îl înțelege.
La nivel de hardware, calculatorul nu este nimic altceva decât milioane de switchuri care
sunt on/off, 1/0, plus/minus sau deschis/inchis (cum vreți voi). 1 este reprezentat pentru
on, iar 0 pentru off.

Î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.

Un program software traducea assembly language în limbaj binar. Aceste programe de


traducere se numesc assemblers.

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:

 FORTRAN (Formula Translator)


 COBOL (Common Business Oriented Language).
 Alte limbaje au apărut ulterior: Logo, Pascal.
Aceste limbaje se numesc procedurale. Ele folosesc un approach liniar, cu un singur
punct de intrare în program și un singur punct de exit pentru a rezolva o problemă.
Programul definește toate datele și toate instrucțiunile pentru a procesa aceste date.
Instrucțiunile se desfășoară în ordinea în care sunt scrise în program. Această
metodologie necesită multă muncă de mantenență. Orice modificare în mărimea, tipul sau
locația datelor necesită modificarea programului.
Funțiile au fost introduse acum pentru că programatorii au realizat că un bloc de cod
paote fi apelat de mai multe ori: pentru a scrie fișiere pe hard disk, trimite mesaje altor
coputere, calcularea unor probleme de matematică. Acesta au apărut în diverse biblioteci.
Programatorii puteau folosi aceste funcții în aplicațiile lor. Acest lucru a redus timpul
necesar scrierii programelor. Aceste biblioteci se numesc API (Application Program
Interfaces).

Totuși, și aceste limbaje evoluate obligau programatorul să gândească ca un computer.


Programatorii trebuiau să separe problemele în mulți pași pe care computerul să îi
efectueze. Trebuiau să descrie un program în termenii cum să le rezolve coimputerul.

Programarea orientată pe obiecte


Programarea oientată pe obiecte este diferită de cea procedurală. În timp ce în
programarea procedurală taskurile sunt descrise ca o secvență logică, în OOP taskurile ce
trebie efectuate sunt descrise în obiecte. Obiectele sunt create și stocate în memoria
computerului. Fiecare obiect conține datele și instrucțiunile pentru efectuarea taskurilor
asupra acestor date. Când un program rulează, sistemul de operare încarcă obiectele și
efectuează operații asupra lor când este instruit. Programul este văzut ca o colecție de
obiecte care interacționează unele cu altele.

O aplicație OOP = colecție de obiecte distincte care incorporează date și comportamente


Limbajele OOP = descriu taskuri pentru obiecte
Avantajele OOP:

 Obiectele fiind mici, pot rula pe deviceuri mici la viteze mari


 Obiectele deja definite pot fi refolosite de alti programatori în alte aplicații, scăzând
costurile
În limbajele procedurale, procedurile sunt reprezentate ca o rețea de rutine (funcții,
proceduri) care se apelează unele pe altele ca într-un call tree. De asemenea, structurile de
date și instrucțiunile asupra lor (comportamentele) sunt slab conectate.

Limbajul OOP: o colecție de obiecte discrete care incorporează structuri de date


și comportamente, strâns legate
Un obiect conține variabile și metode. Obiectele se construiesc pe baza unui clase. Clasa
este matrița de construire de obiecte.

Clase. Obiecte
Clasele reprezintă tipuri de date definite de utilizator sau deja existente în sistem. O clasă
poate conține:

 câmpuri (variabile membru, care definesc starea obiectului)


 metode (funcţii membru, ce reprezintă operații asupra stării)
Clasa = un șablon pentru crearea de obiecte de un anumit tip.
Exemple de obiecte:
 clienți
 conturi bancare
 animale
 obiecte care comunică cu baza de date
 obiecte care primesc requesturi de tip HTTP
 obiecte care returnează răspunsuri de tip HTTP
 obiecte care scriu fișiere, obiecte care citesc fișiere
 obiecte de tip service care manipulează alte obiecte (de tip domain: animale, clienți,
conturi bancare)
Cu excepția primitivelor, toate tipurile de date din Java sunt obiecte. Metoda public
static void main (String []args) este şi ea o metoda a unui obiect – al
obiectului generic al clasei în care se află.
Prin instanțierea unei clase se înțelege crearea unui obiect care corespunde tiparului
definit de clasa respectivă. În cazul general, acest lucru se realizează prin intermediul
cuvântului cheie new.
Un exemplu de clasă predefinită este clasa String. Ea se instanțiază astfel (nu este
necesară utilizarea new):
1 String s1, s2;
2 s1 = "Primul meu string";
3 s2 = "Al doilea string";
Această este varianta preferată pentru instanțierea string-urilor. De remarcat că și varianta
următoare este corectă, dar ineficientă, din motive ce vor fi explicate ulterior.

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.

De exemplu, avem clasa Student.

1 Student student1 = new Student();


2 Student student2 = new Student();
Am construit 2 obiecte de tip Student.

Keywordul new este folosit pentru a construi un nou obiect.


Variabilele student1 și student2 sunt stocate pe STACK. Ele conțin informații referitore
la adresele în memorie unde se găsesc obiectele create.

Toate obiectele se stochează pe HEAP.

Pașii de creare a unui obiect


1. Declararea variabilei de referință (student1) pentru obiect pe STACK (RAM). Se
inițializează un request pentru alocarea de memorie în HEAP (RAM).
2. Default initialization. Se setează valorile default pentru atribute în funcție de tipul
acestora, astfel: nume = null; varsta = 0; nota = 0;
3. Explicit initialization of values. nota = 10.
4. Executarea constructorului: nume = "Ionel", varsta = 20, nota = 9.
5. Asignarea adresei obiectului din HEAP în variabila de referință student1 din STACK
6. 2. Clase
Anatomia unei clase

Ce poate conţine o clasă:

1 public class Student {


2
3 // ATRIBUTELE CLASEI - se mai numesc fields, câmpuri, attributes
4 instanță
5 private String nume;
6 private int varsta;
7 private int nota;
8
9 // CONSTRUCTOR IMPLICIT
10 public Student() {
11
12 }
13
14 // CONSTRUCTOR
15 public Student(String nume, int varsta, int nota) {
16 this.nume = nume;
17 this.varsta = varsta;
18 this.nota = nota;
19 }
20
21 // ACCESSORS / GETTERS
22 public String getNume() {
23 return nume;
24 }
25
26 // MUTATORS / SETTERS
27 public void setNume(String nume) {
28 this.nume = nume;
29 }
30
31 public int getVarsta(){
32 return varsta;
33 }
34
35 public void setVarsta(int varsta){
36 this.varsta = varsta;
37 }
38
39 public int getNota(){
40 return nota;
41 }
42
43 public void setNota(int nota){
44 if (nota>=1 && nota<=10){
45 this.nota = nota;
46 }
}
47
48
//....alte metode
49
50
}
Constructorul
Constructorul este metoda care construiește un nou obiect din clasa respectivă. El trebuie
să poarte același nume cu clasa și cu fișierul – obligatoriu! Dacă clasa se
numește public class Student, fișierul trebuie să se numească tot Student.java,
iar constructorul: public Student(). Constructorul este tot o metdodă, dar observați
că nu are return-type.
Chiar dacă noi nu specificăm un constructor, compilerul va pune el în codul binar
constructorul default:
1 public Student(){
2 }
Cu constructorul default se construiesc obiecte ale căror atribute pot să nu fie inițializate.

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.

 this se referă la această instanță, la acest obiect.


1 this.nume = nume;
 this.nume este atribut al clasei (= variabilă de instanță) – nume.
 nume este o variabilă locală în constructor, primită ca parametru.
O dată creat obiectul putem apela atribute și metode din el. În principiu, am putea scrie
următorul cod:

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 public class DataOnly {


2 int i;
3 float f;
4 boolean b;
5 String s;
6 }
Declarăm un obiect de tip DataOnly și îl inițializăm:

1 DataOnly d = new DataOnly();


2 // setăm câmpul i al obiectului d la valoarea 1
3 d.i = 1;
4 // folosim valoarea setată
5 System.out.println("Câmpul i al obiectului d este " + d.i);
Observăm că pentru a utiliza un câmp/funcție membru dintr-o funcție care nu aparține
clasei respective, folosim sintaxa:

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:

1 Student student1 = new Student("Ionel", 20, 9);


2 Student student2 = new Student("George", 21, 8);
3 student2 = student1;
student2 acum pointeză către același obiect ca și student1. Studentul cu numele
George nu mai are nici o variabilă de pe stack care să pointeze către el și va fi șters de
Garbage Collector.

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 class Matematica {


public void afiseazaSumaPrimelor10() {
2 int suma = 0;
3 for (int i = 1; i <= 10; i++) {
4 suma += i;
5 }
6 System.out.println("Suma calculata in metoda este " + suma);
}
7 }
8
9
Pentru a apela o metodă putem folosi următoarea clasă de test:

1 public class MatematicaTest {


2 public static void main(String[] args) {
3 Matematica mate = new Matematica();
4 mate.afiseazaSumaPrimelor10();
5 }
}
6
Exemplul dat mai sus conţine o metodă de tipul void. Aceasta înseamnă că
metoda se execută şi nu întoarce nimic, deci nu ne oferă nicio informaţie.
Metodele care ne oferă informaţii au alt tip în afară de void şi întorc la finalul
acestora un răspuns. Metoda dată ca exemplu mai jos poate fi implementată în
clasa Matematica:

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 int suma = mate.getSumaPrimelor10();


2 System.out.println("Suma returnata de metoda este " + suma);
Unde metoda poate fi apelată ca în primul exemplu sau poate fi folosită oriunde
putem folosi un număr întreg. Dacă metoda are alt tip, aceasta poate fi folosită
oriunde putem folosi o valoare sau o variabilă de tipul respectiv.

1 System.out.println("Suma returnata de metoda este " + mate.getSumaPrimelor10());


Metodele pot fi customizate astfel încât să se comporte diferit. Pentru aceasta, e
nevoie de parametri. O metodă poate avea oricâţi parametri de orice tip. În
general, însă, dacă metoda are prea mulţi parametri e foarte probabil ca aceasta
să poată fi rescrisă cu mai multe metode. Următoarea metodă va calcula suma
primelor numere naturale, având ca parametru numărul la care să se oprească:

1 public int getSumaPrimelorNumere(int n) {


int suma = 0;
2 for (int i = 1; i <= n; i++) {
3 suma += i;
4 }
5 return suma;
6 }
7
Nu este obligatoriu ca o metodă cu parametri să returneze ceva. De exemplu,
putem avea următoarea metodă care afişează suma primelor numere:

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 String s1, s2;


2 s1 = "Primul meu string";
3 s2 = "Al doilea string";
4 System.out.println(s1.length());
System.out.println(s2.length());
5
Va fi afișată lungimea în caractere a șirului respectiv. Se observă că pentru a
aplica o funcție a unui obiect, se folosește sintaxa:

1 instantaClasei.numeDeFunctie(param1, param2, ..., paramn);


Iar pentru a crea o metodă se foloseşte sintaxa:

1 public tipReturnat numeMetoda(param1, param2, …, paramn) {


2 // lista instructiuni
3 }
Pentru a utiliza un câmp într-o funcție a clasei respective, folosim direct numele
câmpului, ca în exemplul următor.

Clasa VeterinaryReport este o versiune micșorată a clasei care permite unui


veterinar să țină evidența animalelor tratate, pe categorii (câini/pisici):

1 public class VeterinaryReport {


int dogs;
2 int cats;
3
4 public int getAnimalsNo() {
5 return dogs + cats; // utilizare câmp din același obiect pentru care s-a f
6 }
7
8 public void displayStatistics() {
System.out.println("Total number of animals is " + getAnimalsNo()); // ape
9 }
10 }
11
12
Clasa VeterinaryTest ne permite să testăm funcționalitatea oferită de clasa
anterioară.

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.

Crearea unui obiect de tip MyClass se face cu sintaxa:

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:

 referințele la obiecte se inițializează cu null


 variabilele de tip numeric se inițializează cu 0
 variabilele de tip logic (boolean) se inițializează cu false
Pentru a exemplifica acest mecanism, să urmărim exemplul:

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.

1 Computer computer = new Computer();


2 Computer computer2 = new Computer(String marca, int procesor, int ram);
iar în clasa Computer:
1
2 public class Computer {
3 String marca;
int procesor;
4
int ram;
5
6 public Computer() {
7 //constructorul default
8 }
9
10 public Computer(String marca, int procesor, int ram) {
this.marca = marca;
11 this.procesor = procesor;
12 this.ram = ram;
13 }
14 }
15
Unde this face referire la atributul clasei.

Dacă nu introducem nici un constructor, compilatorul va introduce constructorul default.


Dacă introducem un alt constructor, compilatorul nu va mai introduce constructorul
default, iar dacă noi vom construi un obiect cu acest constructor fără să îl definim manual
vom avea o eroare.

Să analizăm acum un exemplu general:

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 st = new Student(); // apel al constructorului 1


2 st = new Student("Gigel", 6); //apel al constructorului 2
3 st = new Student("Gigel"); //apel al constructorului 3
Atenție! Dacă într-o clasă se definesc doar constructori cu parametri, constructorul
default, fără parametri, nu va mai fi vizibil! Exemplul următor va genera eroare la
compilare:

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.

Asociere între 2 obiecte


1 Cont cont1 = new Cont(“argghwsd”, 'r', 0.0) ;
2 Client c3 = new Client (”Ionel Popescu”, 1990101123456L, cont1);
1 Client c3 = new Client (”Ionel Popescu”,
2 1990101123456L,
3 new Cont(“argghwsd”, 'r', 0.0) ) ;
Cum apelăm soldul?

1 c3.cont.sold = 24.87; //dacă atributele sunt public, ceea ce nu e de dorit.


2 c3.getCont().setSold(24.87);
Există mai multe tipuri de asocieri, le vom discuta în viitor.

 7. Cuvant cheie: this

This – referinţă pentru clasa curentă


Referinţa this
Keywordul this face referire la obiectul în cauză.
Apelurile de funcții membru din interiorul unei funcții aparținând aceleiași clase se fac
direct prin nume. Apelul de funcții aparținând unui alt obiect se face prefixând apelul de
funcție cu numele obiectului (exemplul VeterinaryTest/VeterinaryReport). Situația este
aceeași pentru datele membru.

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 public class Computer {


2 private String marca;
3 private int ram;
private int frecventaProcesor;
4
5 //constructor / constructori
6
7 //getteri, setteri
8
9 @Override
10 public boolean equals(Object obj) {
if (this == obj) return true;
11 //........
12 }
13 }
14
15
Apoi, în metoda main() avem:

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 Class Catel extends Animal{...}


2 Catel toto = new Catel();
3 toto.scoateSunet();
iar in metoda scoateSunet() din clasa Animal scriem:

1 if (this instanceof Catel){


2 System.out.println("Ham");
3 } else if (this istanceof Pisica){
4 System.out.println("Miau");
}
5
Exemplu 3
În metoda main():

1 Furnizor furnizor1 = new Furnizor (“Pepsi”);


Clasa Furnizor:

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

Pasarea unei instanțe cu ajutorul lui this.


Asocierea
Presupunem că avem următorul sistem.

 Furnizorul conține mai mulți clienți.


 Un client conține mai multe magazine.
 Clientul are și el o referință către furnizor.
 Magazinul are și el o referință către client.
 Clientul știe și el cine e Furnizorul lui, are o referință către furnizor.
 Magazinele știu și ele cine este proprietarul (clientul) şi au o referință către client.
public class Main
{
public static
1void main
2(String[] args){
3 Furnizor
4 furnizor1 = new
Furnizor
5(“Pepsi”);
}
}
1 public class Furnizor {
2 String nume;
Client client1;
3 Client client2;
4
5 public Furnizor (String nume) {
6 this.nume = nume;
7 client1 = new Client (“La Mama”, this); // pasăm instanța Furnizorului
8 client2 = new Client (“Mega Image”, this);
}
9
10 }
11
12
1
2 public class Client {
3 String nume;
Magazin magazin1;
4 Magazin magazin2:
5 Furnizor furnizor; // clientul știe cine e Furnizorul
6
7 public Client(String nume, Furnizor furnizor) {
8 this.nume = nume;
9 magazin1 = new Magazin (this); // pasăm instanța clientului, adică pe c1
magazin2 = new Magazin (this);
10 this.furizor = furnizor;
11 }
12 }
13
public class
Magazin {

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

Ciclul de viaţă al unui obiect


Obiectul este creat cu keywordul new care invocă constructorul. Obiectul există în
memoria RAM a calculatorului (pe HEAP) atâta vreme cât există variabile care să aibă
referință către el. Dacă nu mai există nici o referință către el, obiectul este la latitudinea
garbage collector-ului. Acesta este un program care rulează din când în când pentru a
șterge obiectele fără referință și a elibera memoria. În programele mici e posibil ca el să
nu ruleze niciodată. În aplicațiile mari, va rula când consideră necesar. Noi nu îi putem
spune când să ruleze, putem doar cel mult să îi recomandăm să ruleze, prin comanda:
1 System.gc();
Un obiect fără referințe nu mai poate fi recuperat, pentru că nu mai ai cum să faci referire
la el.

Î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ă:

 Mammal IS-A Animal


 Reptile IS-A Animal
 Dog IS-A Mammal
 Atunci : Dog IS-A Animal de asemenea
Exemplu

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.

 specificatorul de acces protected - specifică faptul că membrul sau metoda respectivă


poate fi accesată doar din cadrul clasei însăși sau din clasele derivate din această clasă.
Clasele nu pot avea acest specificator, doar membrii acestora!
 specificatorul de acces private - specifică faptul că membrul sau metoda respectivă
poate fi accesată doar din cadrul clasei însăși, nu și din clasele derivate din această clasă.
Clasele nu pot avea acest specificator, doar membrii acestora!
Pe lângă reutilizarea codului, moștenirea dă posibilitatea de a dezvolta pas cu pas o
aplicație (procedeul poartă numele de incremental development). Astfel, putem folosi un
cod deja funcțional.

Relația de tip is-a


Uneori, ca programatori, suntem puși în situația de a avea nevoie de clase care au unele
atribute și metode similare, dar care au și unele atribute și metode distincte.

Să presupunem că trebuie să realizăm o aplicație care să stocheze diferite localități din


România. Vom stoca localități de toate tipurile, toate dimensiunile, din toate județele.

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 :

super(denumire, numarDeLocuitori, judet);


Atenție, dacă superclasa nu are constructorul default (fără argumente) ci un alt
constructor, iar noi nu vom menționa keywordul super, vom avea o eroarea de compilare,
întrucât compilatorul va introduce keywordul super() automat care va apela un
constructor care nu există.
Dacă există deja un constructor scris de noi cu argumente, compilatorul nu mai introduce
constructorul default.

Ca o dovadă că se moștenesc și atributele private, apelaţi în metoda main():


1 oras.setDenumire(”Braila”);
Faceți o metodă toString() în clasa mamă (Localitate) și apoi, în
metoda main() scrieți:
1 System.out.println(oras);
Ce obținem?

Localitate [denumire=Braila, ….]


Deși moștenește atributele private, nu vom putea, totuși, scrie direct într-o metodă a
clasei Oras următorul cod: this.denumire = ”Iasi”;. Dar vom putea folosi setterul,
care se moşteneşte de asemenea, si care are access specifier public,
astfel: this.setDenumire(“Iasi”);, unde this se referă la instanța (obiectul) cu care
lucrăm, care are atribute și metode specifice.

Agregare vs. moștenire


Diferența dintre moștenire și agregare este de fapt diferența dintre cele 2 tipuri de relații
majore prezente între obiectele unei aplicații :

 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ă.

Beneficiile suprascrierii includ: abilitatea de a defini un comportament specific subclasei,


ceea ce înseamnă că subclasa poate implementa metodele super-clasei în funcţie de
cerinţele specifice ale acesteia. În termeni orientat obiect, suprascrierea înseamna să
suprascriem funcţionalitatea unei metode existente.

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:

1 Animals can move


2 Dogs can walk and run
În exemplul de mai sus, putem observa că obiectul b, chiar dacă este de tipul Animal
apelează metoda din clasa Dog. Motivul este următorul: la compilare, verificarea este
făcută pe tipul referinţei. Cu toate acestea, la rulare, JVM rulează metoda care aparţine
tipului instanţiat. Aşadar, în exemplul de mai sus, programul se va compila corect, clasa
Animal având metoda move. Apoi, la rulare se va executa metoda specifică clasei Dog.

Mai este un amănunt de care trebuie să ţinem seama. Avem următorul exemplu:

public class TestDog {


1 public static void main(String args[]){
2 Animal a = new Animal(); // Animal reference and object
3 Animal b = new Dog(); // Animal reference but Dog object
4 a.move(); // runs the method in Animal class
b.move(); //runs the method in Dog class
5 b.bark();
6 }
7 }
8
9
Codul de mai sus va produce următorul rezultat:

1 TestDog.java:30: cannot find symbol


2 symbol : method bark()
3 location:class Animal
4 b.bark();
^
5
Acest program va arunca o eroare de compilare, deoarece variabila b este de tipul
Animal, care nu are nicio metodă bark().

Reguli pentru suprascrierea metodelor


 Lista argumentelor ar trebui să fie exact la fel ca şi lista din metoda suprascrisă.
 Tipul returnat ar trebui să fie la fel sau un subtip a tipului declarat în metoda originală din
superclasă.
 Nivelul de acces nu poate fi mai restrictiv decât nivelul de acces al metodei suprascrise.
De exemplu, dacă metodele din superclasă sunt declarate public, atunci metoda din
subclasă nu poate fi declarată nici private nici protected.
 Metodele de instanţă pot fi suprascrise doar dacă sunt moştenite de subclasă.
 O metodă declarată final nu poate fi suprascrisă.
 O metodă declarată static nu poate fi suprascrisă, dar poate fi re-declarată.
 Dacă o metodă nu poate fi moştenită, atunci nu poate fi suprascrisă.
 O subclasă din acelaşi pachet ca şi clasa de bază poate suprascrie orice metodă care nu
este declarată private sau final.
 O subclasă dintr-un pachet diferit poate declara doar metodele non-final care sunt
declarate public sau protected.
 Constructorii nu pot fi suprascrişi.
 12. Cuvant Cheie: super

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 vs. super


Constructori

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

apelarea unei metode din clasa mamă pe care noi o


super.metoda() sau super.metoda(parametri) extindem
 15. Exercitii: Obiecte 2

Exerciţii clase şi obiecte


1. Adrese
1. Creați un proiect nou ce conține 2 clase: Adresa si Livrari. Clasa Adresa conține
următoarele câmpuri de tip String: strada, numar, oras, judet. Creați un fișier care
contine pe câte o linie, valori pentru atributele din clasa Adresa (adăugati 4 adrese).
Creați şi o metodă toString, în care afișați câmpurile datelor cum doriți.
2. În clasa Livrari (care conține metoda main) creați 4 instanțe de adrese cu valori pentru
fiecare atribut; rețineți instanțele clasei Adresa într-un vector. Afișarea datelor
completate se vor realiza într-un for.
3. Afișați datele pe care le-ați completat.

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:

Clasa Scoala Clasa Profesor Clasa Adresa

• 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 + "\"." );

2. Afişaţi numărul de elevi al şcolii


3. Afişaţi numărul de săli al şcolii

Solutie
1 System.out.println( "Scoala are " + scoala.nrElevi + " de elevi, care invata in "
2 + scoala.nrSali+ " sali." );

4. Afişaţi strada pe care se află şcoala Geo Bogza

Solutie
1 System.out.println( "Adresa scolii este " + scoala.adresa + ".");

5. Afişaţi numele primului profesor al şcolii

Solutie
1 System.out.println( "Primul profesor este " + scoala.profesor1 + ".");

6. Afisati materia profesor2 al scolii


Solutie
1 System.out.println( "Materia celui de-al doilea profesor este " + scoala.profesor2.

7. Afisati numele profesor4 al scolii. De ce dă eroare?


Solutie
1 System.out.println( "Profesor 4 este " + scoala.profesor4.nume + ".");
2 // profesor4 este null

8. Afişaţi materia pe care o predă directorul şcolii

Solutie
1 System.out.println( "Materia directorului este " + scoala.director.materie + ".");

9. Realizati schema variabilelor si a obiectelor pe stack si pe heap.

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 );

3. Pe câte căi se poate ajunge la denumirea cinema-ului de la promenada? Afişaţi


denumirea folosind toate căile posibile.
Solutie
1 System.out.println( movieplex.denumire );
2 System.out.println( promenada.cinema.denumire );

4. Pe câte căi se poate ajunge la denumirea cinema-ului de la afi? Afişaţi denumirea


folosind toate căile posibile.
Solutie
1 System.out.println( afi.cinema.denumire ); //De ce? Pt ca nu am creat o variabil

5. Realizaţi schema variabilelor şi a obiectelor pe stack şi pe heap.

Solutie

5. Agenţii de turism
Realizati un program în care vor exista 2 agentii de turism. Numiți-le cum vreți voi.

Prima agenție de turism oferă 2 sejururi, iar cea de a doua 3.

Există 3 hoteluri: Hotel 1 – Perla, Hotel 2 – Aeolis, Hotel 3 - Acrotiris

Agentia 1 Agentia 2

• Hotel 1 Perla - 1 noapte


Sejurul 1 • Hotel 2 Aeolis - 2 nopți
(circuit) • Hotel 3 Acrotiris- 1 noapte

Sejurul 2 • Hotel 2 Aeolis - 7 nopţi

Sejurul 3 • Hotel 3 Acrotiris - 7 nopţi

• Hotel 1 Perla - 1 noapte


Sejurul 4 • Hotel 2 Aeolis - 2 nopți
(circuit) • Hotel 3 Acrotiris - 1 noapte

Sejurul 5 • Hotel 1 Perla - 7 nopți


Preturi hoteluri:

 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

4. Clasele BasketballTeam și FootballTeam moștenesc elementele clasei Team şi


conțin câte o metodă ce afișează numele unei echipe de baschet, respectiv de fotbal.
Metodele se pot numi printBasketballTeamName(),
respectiv printFootballTeamName().
Solutie
1
public class BasketballTeam extends Team {
2
3 public BasketballTeam(String[] names, int noPlayer) {
4 super(names, noPlayer);
5 }
6
7 public void printBasketballName() {
8 System.out.println("BasketballTeam: " + name);
}
9
10 }
11
public class FootballTeam extends Team {
1
2 public FootballTeam(String[] names, int noPlayer) {
3 super(names, noPlayer);
4 }
5
6 public void printFootballName() {
System.out.println("FootballTeam: " + name);
7 }
8
9 }
10
11

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

6. Realizați modificările necesare astfel încât numele echipei pentru


clasele BasketballTeam și FootballTeam să fie introdus de la consolă.
Solutie
public class Test {
1
2 public static void main(String[] args) {
3
4 // ...
5
6 Scanner scan = new Scanner(System.in);
7 System.out.println("BasketballTeamName:");
String numeB = scan.next();
8
9 System.out.println("FootballTeamName:");
10 String numeF = scan.next();
11
12 BasketballTeam bt = new BasketballTeam(namesB, namesB.length);
13 bt.name = numeB;
14
15 FootballTeam ft = new FootballTeam(namesF, namesF.length);
ft.name = numeF;
16
17 // ...
18
19 }
20
21 }
22
23
24
 16. Clasa Object

Clasa Object
Toate clasele moștenesc clasa Object, și implicit toate metodele acesteia (sunt public și
protected):

Modifier and Type Method and Description

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.

Class<?> getClass() Returns the runtime class of this Object.

int hashCode() Returns a hash code value for 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

String toString() Returns a string representation of the object.

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()

Suprascrierea metodei equals()


Metoda este implementata pentru a verifica egalitatea a două obiecte în funcție de datele
pe care le stochează. Metoda .equals(Object object) primește un obiect generic, căruia
trebuie să îi facem cast la obiectul cu care îl comparăm.

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()

1 @Override //înseamnă că am rescris (sau suprascris/redefinit) metoda


public boolean equals(Object obj) {
2 if (this == obj)
3 return true;
4
5 if (obj == null)
6 return false;
7
if (getClass() != obj.getClass())
8
return false;
9
10 Computer other = (Computer) obj;
11
12 if ( marca == null) {
13 if (other.marca != null)
14 return false;
} else if (!marca.equals(other.marca))
15 return false;
16
17 if (frecventa == null) {
18 if (other.frecventa != null)
return false;
19 } else if (frecventa != other.frecventa)
20 return false;
21
22 if (memorie == null) {
23 if (other. memorie != null)
return false;
24 } else if ( memorie != other.memorie )
25 return false;
26
27 return true;
28 }
29
30
31
32
33
Metoda equals() se suprascrie de fiecare dată numai împreună cu metoda hashCode().
Totuși, pentru Array sau ArrayList, nu avem nevoie momentan de hashCode().
 18. Suprascrierea toString()

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ă.

1 public class Person {


2 private String firstName;
private String lastName;
3 private int age;
4
5 public Person(String firstName, String lastName, int age) {
6 this.firstName = firstName;
7 this.lastName = lastName;
8 this.age = age;
}
9
10 @Override
11 public String toString() {
12 return "First Name: " + firstName + ", Last Name: " + lastName;
13 }
14 }
15
16
1
public class TestToString {
2
3 public static void main(String args[]){
4
5 Person p1 = new Person("John", "Doe", 35);
6 Person p2 = new Person("Jane", "Doe", 20);
7
8 System.out.println(p1); // First Name: John, Last Name: Doe
9 System.out.println(p2); // First Name: Jane, Last Name: Doe
}
10 }
11
Putem alege să includem toate câmpurile sau doar unele dintre ele, la alegerea noastră.
Majoritatea timpului această metodă va fi de ajutor când facem debugging la cod.

 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

S-ar putea să vă placă și