Sunteți pe pagina 1din 23

Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.

ro/cursur i

Cursul 3
1. Tipurile de date primitive in limbajul Java
In limbajul Java exista urmatoarele tipuri de date primitive:
A. Tipul de date void este folosit pentru a arata lipsa unui tip de date (in engleza, void inseamna
gol, vid, lipsa, fara valoare. Este folosit acolo unde sintaxa instructiunii cere un tip de date, dar - in
situatia data - in locul respectiv nu trebuie indicata o anume valoare. Un exemplu este folosirea tipului
void in definirea metodei main().
B. Date logice: tipul boolean, care contine valorile logice true (adevarat) si false (fals).
C. Date sub forma de caractere: tipul char, care contine toate caracterele: litere, cifre, semne de
punctuatie, simboluri matematice etc.
D. Date numerice:
D1. Numere intregi de diferite lungimi
byte - numere intregi reprezentate intern pe un octet;
short - numere intregi reprezentate intern pe doi octeti;
int - numere intregi reprezentate intern pe patru octeti;
long - numere intregi reprezentate intern pe opt octeti;
D2. Numere reale (in virgula mobile - http://en.wikipedia.org/wiki/Floating_point ) cu diferite
precizii
float - numere reale in simpla precizie (reprezentate intern pe patru octeti);
double - numere reale in dubla precizie (reprezentate intern pe opt octeti).

1.1. Tipul boolean

Tipul de date boolean se refera la cele doua valori de adevar folosite in logica matematica si la
operatiile care se pot face asupra acestora.

Declaratia de tip se scrie sub forma:

boolean <nume>[=<valoare>] [,<nume>[=<valoare>]]*;

Valoarea implicita a variabilelor de tip boolean este false.

Exemplu: declaratia de tip

boolean beta, gamma=true, delta=false;

serveste pentru a declara ca variabilele beta, gamma, delta sunt de tipul boolean si, de asemenea,
pentru a defini valoarea initiala a variabilelor gamma si delta. Variabila beta primeste in mod
implicit valoarea false.

Multimea de valori a tipului de date boolean este formata din doua valori, care au semnificatiile
adevarat si respectiv fals.
• Reprezentarea externa (in programul scris in Java) a acestor valori logice se face prin literalii
true (adevarat) si false (fals), care sunt cuvinte rezervate.

1
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

• Reprezentarea interna (in memoria calculatorului) a acelorasi valori nu este specificata explicit
si nu este necesar sa fie cunoscuta de programator. In descrierea masinii virtuale Java se indica,
totusi, ca valorile logice sunt reprezentate intern pe patru octeti (la fel ca tipul de date int).
Daca toti bitii continuti in zona de memorie alocata unei variabile de tip boolean au valoarea
0 (zero) se considera ca zona respectiva contine valoarea logica false. Daca insa, in aceasta
zona, exista unul sau mai multi biti diferiti de zero, ea contine valoarea logica true.

Operatii definite pentru tipul boolean:

Atribuire: <variabila> = <valoare>


Comparatie: Pentru a compara intre ei doi operanzi de tip boolean se folosesc operatorii de
comparatie == si != cu semnificatiile este egal cu si, respectiv, este diferit de (nu este egal).
Expresiile de comparatie au forma

<operand1> == <operand2>
<operand1> != <operand2>

Rezultatul operatiei de comparatie este, de asemenea, o valoare de tipul boolean. Operatorii nu au


efect lateral, deci, dupa operatie, valorile operanzilor raman nemodificate. De exemplu, daca alpha si
beta sunt doua variabile de tipul boolean, atunci expresia alpha==beta va avea valoarea true daca
si numai daca ambele variabile au aceeasi valoare de adevar (ambele sunt adevarate sau ambele sunt
false). Dimpotriva, expresia alpha!=beta are valoarea true daca, si numai daca, valorile de adevar
ale celor doi operanzi sunt diferite. Situatia este similara daca cei doi operanzi nu vor fi variabile, ci
literali sau alti operanzi de tip boolean.

O eroare frecventa, facuta in special de programatorii neexperimentati, este confundarea operatorului


de atribuire (=) cu cel de egalitate (==). Este clar acum ca acesti doi operatori actioneaza in moduri
complet diferite: primul poate avea drept operand stang numai o variabila, iar efectul sau lateral este
modificarea valorii acestei variabile. Al doilea operator nu are efect lateral. Ambii operanzi pot fi
expresii logice, efectul direct al operatorului fiind ca se compara daca valorile acestor doua expresii
sunt identice.

Negatie logica: Expresia

!<operand_boolean>

are o valoare egala cu negatia logica a valorii operandului. In consecinta, daca operandul are valoarea
true, expresia are valoarea false si, invers, daca operandul are valoarea false, expresia de negatie
are valoarea true. Operatorul '!' (semnul exclamarii) este operatorul unar de negatie logica.

Conjunctie logica (AND): Expresiile

<operand_boolean1> && <operand_boolean2>


<operand_boolean1> & <operand_boolean2>

sunt expresii de conjunctie logica . In limba romana, operatorii && si & se citesc SI, iar in engleza
AND. Expresia are valoarea true daca, si numai daca, ambii operanzi au valoarea true. In toate
celelalte situatii, expresiile de mai sus au valoarea false. Deosebirea dintre cei doi operatori este
urmatoarea: daca se foloseste operatorul && si se constata ca primul operand are valoarea false, al

2
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

doilea operand nu se mai calculeaza, considerandu-se ca intreaga expresie are valoarea false. Daca
insa se foloseste operatorul &, atunci se vor calcula obligatoriu ambii operanzi.

Disjunctie logica (OR): Expresiile

<operand_boolean1> || <operand_boolean2>
<operand_boolean1> | <operand_boolean2>

sunt expresii de disjunctie logica. In limba romana, operatorii || si | se citesc SAU, iar in engleza OR.
Expresia are vsaloarea true daca unul din operanzi sau ambii operanzi au valoarea true si are
valoarea false daca, si numai daca, ambii operanzi au valoarea false. Deosebirea intre cei doi
operatori este urmatoarea: daca se foloseste operatorul || si primul operand are valoarea true, atunci
al doilea operand nu se mai calculeaza, considerandu-se ca intreaga expresie are valoarea true. Daca
insa se foloseste operatorul | , atunci se vor calcula obligatoriu ambii operanzi.

Sau exclusiv (XOR): Expresia

<operand_boolean1> ^ <operand_boolean2>

reprezinta operatia "SAU exclusiv", in engleza XOR. Aceasta expresie are valoarea true daca, si numai
daca, numai unul din cei doi operanzi are valoarea true. Daca ambii operanzi au valoarea true, sau
ambii au valoarea false, atunci valoarea expresiei este false.Simbolul ^ este operatorul "SAU
exclusiv (XOR)".

Efectul operatorilor de mai sus asupra unor operanzi de tip boolean este sintetizat in tabela de mai jos:

&& ||
<operand1> <operand2> ^
& |
true true true true false
true false false true true
false true false true true
false false false false false

1.2. Tipuri de date numerice

1.2.1.Tipuri de date intregi

In limbajul Java exista patru tipuri de date intregi, care difera prin lungimea zonei de memorie alocata
unei valori:
tipul byte - numere intregi cu semn cu lungimea de 1 octet (8 biti);
tipul short - numere intregi cu semn cu lungimea de 2 octeti (16 biti);
tipul int - numere intregi cu semn cu lungimea de 4 octeti (32 biti);
tipul long - numere intregi cu semn cu lungimea de 8 octeti (64 biti).

3
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Se stie ca pe o lungime de n biti se pot reprezenta 2 la puterea n valori. De aici rezulta cardinalul
multimii de valori pentru fiecare din tipurile de date mentionate mai sus.

Cu exceptia lungimii, celelalte aspecte ca reprezentarea interna, reprezentarea externa si operatiile


admise sunt similare pentru toate tipurile de date intregi si vor fi tratate impreuna precizandu-se, unde
este cazul, aspectele specifice fiecarui tip.

Declaratia de tip pentru tipurile de date intregi se scrie sub forma cunoscuta

<tip> <nume>[=<valoare>] [,<nume>[=<valoare>]]*;


in care
<tip> ::= byte | short | int | long

Valoarea implicita a variabilelor apartinand tipurilor de date intregi este 0 (zero) cu lungimea
corespunzatoare tipului respectiv.

De exemplu, instructiunea

int k=17, m2, gamma=-723865;

serveste pentru a declara ca variabilele k, m2 si gamma sunt de tipul int si pentru a initilaiza
variabilele k si gamma. Variabila m2 este initializata implicit cu valoarea 0.

Reprezentarea interna a numerelor intregi in masina virtuala Java se face in sistemul de numeratie
binar, folosind prentru reprezentarea numerelor negative complementul la 2. In acest cod, numerele
primul bit al numarului reprezinta semnul: 0 inseamna +, iar 1 inseamna -.

Reprezentarea externa (in programul scris in limbajul Java) a datelor de tipuri intregi se face prin
literali intregi.

Acestia sunt numere intregi, care pot avea in fata si semnul + sau - si sunt reprezentati in unul din
urmatoarele sisteme de numeratie:
- zecimal (cu baza 10); un astfel de literal este un numar obisnuit, care poate fi precedat de semn, dar
trebuie sa inceapa cu o cifra diferita de zero si nu are dreptul sa contina alte caractere (de exemplu
punct, virgula, apostrof);
- octal (cu baza 8); un astfel de literal este un simplu sir de cifre ale sistemului de numeratie octal
(cifrele 0, 1, 2, 3, 4, 5, 6, 7), care incepe obligatoriu cu cifra 0, nu contine alte caractere si poate fi
precedat de semn;
- hexazecimal (cu baza 16); un astfel de literal incepe cu caracterele 0x si contine numai cifre ale
sistemului de numeratie hexazecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). Literele de la A la F
sunt aici cifrele hexazecimale cu valori de la 10 la 15. Literalul poate fi precedat de semn.

Obs: In cazul tipului long literalul intreg (indiferent de forma de reprezentare) trebuie sa contina, de
asemenea, sufixul L.

Literalii intregi in sistemul zecimal sunt folositi in program pentru a scrie numerele intregi asa cum le
scrie omul in mod obisnuit si sunt singurii care pot avea semn. Intervalul in care pot avea valori acesti
literali va fi precizat de noi in sectiunile urmatoare, la descriereas fiecarui tip in parte. Exemple de
astfel de literali:

4
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

28
-116
246598376
-176487987035282442L
ultimul fiind un literal de tip long.

Literalii intregi de tip octal sau hexazecimal sunt folositi de obicei pentru a transcrie sub o forma mai
compacta si mai usor de citit de catre om reprezentarea interna binara a numarului respectiv. Se
foloseste aici faptul ca bazele de numeratie 8 si 16 sunt puteri ale lui 2. In aceasta situatie, la trecerea
de la sistemul binar la sistemul octal, fiecare grup de trei cifre binare (incepand de la dreapta) se
inlocuieste prin cifra corespunzatoare a sistemului octal, ca in tabela de mai jos:

octal binar
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

La trecerea inversa, din octal in binar, fiecare cifra octala se inlocuieste cu grupul corespunzator de trei
cifre binare.

In mod similar, la trecerea din sistemul binar in sistemul hexazecimal fiecare grup de patru cifre binare
se inlocuieste printr-o singura cifra hexazecimala, ca in tabela de mai jos.

hexazecimal binar hexazecimal binar


0 0000 8 1000
1 0001 9 1001
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111

Si in acest caz, la trecerea inversa, din hexazecimal in binar, fiecare cifra hexazecimala se va inlocui cu
grupul corespunzator de patru cifre binare.

Exemple: numerele intregi 108 si -108 se vor reprezenta in diferite sisteme de numeratie ca in tabela
de mai jos, in care s-a avut in vedere si faptul ca literalii octali trebuie sa inceapa cu 0, iar cei

5
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

hexazecimali cu 0x:

zecimal binar octal hexazecimal


108 01101100 0154 0x6C
-108 10010100 -0154 -0x6C

Literalii de tip long, asa cum s-a mentionat deja, trebuie sa aiba sufixul L. Astfel, numarul binar pe 64
biti
0000000000000000000000000000110001110101010111010100101011010001
se va scrie sub forma literalului hexazecimal
0xC755D4AD1L
sau a literalului octal
0616527245321L
iar convertind in sistemul zecimal, se obtine literalul
53508655825L
care este chiar numarul scris de noi obisnuit sub forma 53508655825. Atragem insa, inca o data,
atentia ca acest literal nu poate fi scris sub forme ca 53.508.655.825 sau 53'508'655'825 pentru a putea
fi citit mai usor, asa cum obisnuim in scrierea curenta.

Tipul byte: valoarea minima este 80 in hexazecimal (10000000 in binar) , deci -128 in sistemul
zecimal;
valoarea maxima este 7F in hexazecimal (01111111 in binar), deci 127 in sistemul
zecimal.
Intervalul de valori este deci [-128 ... 127], cuprinzand 256 valori.
Tipul short: valoarea minima este 8000 in hexazecimal, deci -32768 in sistemul zecimal;
valoarea maxima este 7FFF in hexazecimal, deci 32767 in sistemul zecimal.
Intervalul de valori este deci [-32768 ... 32767], cuprinzand 65536 valori.
Tipul int: valoarea minima este 80000000 in hexazecimal, deci -2147483648 in zecimal;
valoarea maxima este 7FFFFFFF in hexazecimal, deci 2147483647 in zecimal.
Intervalul de valori este deci [-2147483648 ... 2147483647], cuprinzand
4294967296 valori.
Tipul long: valoarea minima este 8000000000000000 in hexazecimal, deci -
9223372036854775808L in
sistemul zecimal;
valoarea maxima este 7FFFFFFFFFFFFFFF in hexazecimal, deci
9223372036854775807L in
sistemul zecimal.
Intervalul de valori este deci [-9223372036854775808L ...
9223372036854775807L], cuprinzand
18446744073709551616 valori.

Setul de operatori pentru datele de tipuri intregi este urmatorul:

a) operatorul de atribuire: =
b) operatori aritmetici unari: + -
c) operatori aritmetici binari: + - * / %
d) operatori de incrementare si decrementare: ++ --

6
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

e) operatori relationali: == != < <= > >=


f) operatori de deplasare: << >> >>>
g) operatori logici pe biti: ~ & | ^
h) operatori de atribuire combinati: += -= *= /= %= <<= >>= >>>= &= |=

Prezentam in continuare modul de utilizare al acestor operatori si operatiile pe care acestia le indica.

• Operatia de atribuire se realizeaza prin operatorul binar = si se scrie sub forma

<variabila> = <expresie>

in care operandul din stanga este o variabila de tip intreg, iar operandul din dreapta este o valoare de
acelasi tip cu operandul din stanga. Din punct de vedere sintactic, operandul din dreapta poate fi un
literal, o variabila sau o expresie, dar ceeace se atribuie este valoarea obtinuta din evaluarea acestei
expresii.

• Operatiile aritmetice pot fi unare sau binare. Aceste operatii nu au efect lateral, deci operanzii
raman nemodificati. Operanzii pot fi de oricaree din tipurile de date intregi, inclusiv de tipuri
diferite. In ce priveste tipul rezultatului operatiei aritmetice cu operanzi de tipuri intregi, se
aplica urmatoarea regula:
a) daca printre operanzi nu exista nici unul de tip long, rezultatul este de tipul int
(indiferent de tipurile operanzilor);
b) daca unul din operanzi sau ambii sunt de tip long, rezultatul este de tip long.

Operatorii aritmetici unari + si - se folosesc in expresii de forma:


+ <operand> are ca valoare insasi valoarea operandului;
- <operand> are ca valoare valoarea operandului luata cu semn schimbat.

Operatorii aritmetici binari se folosesc in expresii de forma:


<operand1> + <operand2> adunare;
<operand1> - <operand2> scadere;
<operand1> * <operand2> inmultire;
<operand1> / <operand2> impartire intreaga;
<operand1> % <operand2> restul impartirii intregi.
Prin impartire intreaga intelegem impartirea cu rezultat intreg (deci care poate avea si rest).
Cei doi operanzi pot fi de oricare din tipurile de date intregi, iar tipul rezultatului se stabileste conform
regulii de mai sus.

• Operatiile de incrementare si decrementare se realizeaza prin expresii de forma:

++<variabila>
reprezinta operatia de preincrementare: se aduna 1 la valoarea variabilei (deci se modifica
valoarea acesteia, obtinandu-se un efect lateral), dupa care valoarea astfel majorata se considera drept
valoare a expresiei;

--<variabila>
reprezinta operatia de predecrementare: se scade 1 din valoarea variabilei (deci se modifica

7
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

valoarea acesteia, obtinandu-se un efect lateral), dupa care valoarea astfel micsorata se considera drept
vsaloare a expresiei;

<variabila>++
reprezinta operatia de postincrementare: se aduna 1 la valoarea variabilei (efectul lateral), dar
drept valoare a expresiei se considera valoarea, pe care a avut-o variabila inainte de incrementare;

<variabila>--
reprezinta operatia de postdecrementare: se scade 1 din valoarea variabilei (efectul lateral), dar
drept valoare a expresiei se considera valoarea, pe care a avut-o variabila inainte de decrementare.

• Operatiile relationale sunt operatii binare de forma

<operand1> <operator_relational> <operand2>

in care <operand1> si <operand2> sunt operanzi apartinand unuia din tipurile numerice (chiar daca
acestea sunt diferite) iar operatoru relational este definit prin:

<operator_relational> ::= == | != | < | <= | > | >=

Rezultatul operatiei relationale este de tip boolean. Daca relatia este satisfacuta, atunci se obtine
valoarea true, altfel se obtine valoarea false.

Semnificatiile operatorilor relationali sunt urmatoarele:

== este egal cu;


!= este diferit de;
< este mai mic decat;
<= este mai mic decat sau egal cu;
> este mai mare ca;
>= este mai mare ca sau egal cu.

In toate cazurile mentionate, are loc o comparatie a valorilor celor doi operanzi. Aceste valori ale
operanzilor nu se modifica, in schimb rezultatul este valoarea logica adevarat sau, respectiv, fals, dupa
cum a fost sau nu satisfacuta relatia exprimata de operatorul utilizat.

• Operatiile de deplasare se realizeaza prin expresii de forma:

<operand1> <operator_de_deplasare> <operand2>

in care cei doi operanzi apartin unor tipuri de date intregi si

<operator de deplasare> ::= << | >> | >>>

Acesti operatori nu au efect lateral. Tipul rezultatului operatiei de deplasare se stabileste astfel: daca
operandul din partea stanga este de tip byte, short sau int, atunci rezultatul este de tip int; daca
insa operandul din stanga este de tip long, rezultatul este de tip long. Tipul operandului din dreapta nu
prezinta importanta, cu conditia sa fie intreg.

8
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Semnificatiile celor trei operatori de deplasare sunt urmatoarele: se deplaseaza bitii din zona de
memorie ocupata de valoarea operandului din partea stanga cu un numar de pozitii binare egal cu
valoarea operandului din partea dreapta astfel:

<< deplasare spre stanga, completandu-se cu 0 pozitiile binare ramase libere in partea dreapta;
>> deplasare spre dreapta "cu semn", in care pozitiile ramase libere in partea stanga se
completeaza cu prima cifra binara a numarului operandului deplasat; aceasta cifra se multiplica deci,
conservandu-se semnul operandului.

>>> deplasare spre dreapta "fara semn", completandu-se cu 0 pozitiile binare ramase libere in
partea stanga; in consecinta, daca operandul din stanga este negativ, rezultatul va avea semn pozitiv;

Deplasarea bitilor unui numar cu n pozitii binare catre stanga echivaleaza cu inmultirea acestuia cu 2 la
puterea n,iar deplasarea la dreapta cu semn (operatorul >>) corespunde impartirii intregi cu 2 la
puterea n. In cazul deplasarii la dreapta fara semn nu mai exista o astfel de relatie.

Exemple
• Sa consideram ca operandul din stanga are valoarea binara de tip byte 01001110 (78 in zecimal),
iar operandul din dreapta este 3. Efectele celor trei operatori vor fi:
a) 78 << 3 da ca rezultat numarul de tip int 00000000000000000000001001110000, adica
624 in zecimal, adica 78x8. Acest rezultat s-a obtinut astfel: s-a expandat valoarea initiala de tip
byte pe o lungime de patru octeti (corespunzatoare tipului int), apoi s-au deplasat toti bitii la
stanga cu trei pozitii, completandu-se la dreapta cu 0.
b) 78 >> 3 da ca rezultat numarul de tip int 00000000000000000000000000001001, adica 9
in zecimal, corespunzator cu catul impartirii intregi 78/8, deoarece, de data aceasta, deplasarea
s-a facut cu trei pozitii binare catre dreapta, iar bitii "iesiti din zona" s-au pierdut.
c) 78 >>> 3 da acelasi rezultat ca in cazul precedent, deoarece primul bit este 0.
• Sa consideram acum ca operandul din stanga, tot de tip byte, este -78, respectiv 10110010 in
binar, iar operandul din dreapta este 3.Efectele celor trei operanzi vor fi:
a) -78 << 3 da ca rezultat numarul de tip int 11111111111111111111110110010000, care, la
fel ca in exemplul precedent, s-a obtinut expandand valoarea operandului din stanga pe 4 octeti
si deplasand apoi toti bitii la stanga cu trei pozitii. Convertind acest numar in zecimal se obtine -
624.
b) -78 >> 3 da ca rezultat numarul de tip int 11111111111111111111111111110110, care s-a
obtinut in mod similar, dar deplasarea s-a facut cu trei pozitii spre dreapta, iar cele trei pozitii
ramase libere la stanga s-au completat cu 1, deci s-a pastrat semnul numarului. Convertind acest
numar in zecimal, se obtine numarul intreg negativ -10.
c) -78 >>> 3 da ca rezultat numarul d tip int 00011111111111111111111111110110, care s-
a obtinut la fel ca cel precedent, dar pozitiile binare ramase libere la stanga s-au completat cu 0,
deci numarul a devenit pozitiv. Convertind acest numar in zecimal se obtine 536870902.
• Operatiile logice pe biti sunt operatii fara efect lateral, de forma:

~<operand> complementarea operandului bit cu bit (NU logic pe biti);


<operand1>&<operand2> operatia de intersectie (SI logic pe biti) a celor doi operanzi;
<operand1>|<operand2> operatia de reuniune (SAU logic pe biti) a celor doi operanzi;
<operand1>^<operand2> operatia logica "SAU exclusiv" aplicata pe biti.

Toate aceste operatii se fac asupra reprezentarilor binare ale operanzilor, bit cu bit.

9
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

• In cazul complementarii (operatorul ~), fiecare bit 0 al operandului se inlocuieste prin 1 si,
invers, fiecare bit 1 se inlocuieste prin 0 (daca se admite ca bitul 0 inseamna fals, iar 1 inseamna
adevarat, aceasta este negatia logica (NU logic, NOT).
• Rezultatul aplicarii operatorului & (SI logic, AND) se obtine ca rezultat un numar binar care are
bitii 1 numai pe pozitiile in care ambii operanzi au biti 1, iar toate celelalte pozitii ale
rezultatului contin biti 0.
• Rezultatul aplicarii operatorului | (SAU logic, OR) se obtine punand biti 1 pe toate pozitiile in
care cel putin unul din cei doi operanzi are bit 1. In consecinta bitul 0 va apare numai pe
pozitiile in care ambii operanzi au bitul 0.
• Rezultatul aplicarii operatorului ^ (SAU exclusiv, XOR) este un numar binar care contine bitul
1 pe acele pozitii, pe care numai unul din cei doi operanzi contine bitul 1. Pe pozitiile in care
bitii ambelor numere sunt identici, la rezultat se pune bitul 0.

Exemple
• Sa consideram urmatorii doi operanzi de tip byte:
b1=58 in zecimal, deci 00111010 in binar;
b2=108 in zecimal, deci 01101100 in binar.
Rezultatul operatiei ~b1 se obtine astfel: se expandeaza operandul pe 4 octeti, obtinandu-se
numarul 00000000000000000000000000111010, apoi se ia complementul acestuia bit cu bit,
obtinandu-se numarul 11111111111111111111111111000101. Echivalentul acestuia in ziztemul
zecimal este numarul -59.
Pentru a fi mai usor de urmarit, la celelalte operatii noi vom lucra numai pe lungimea de un
octet, dar vom avea in vedere ca, in realitate, calculatorul lucreaza cu operanzii expandati pe 4 octeti
(corespunzator tipului int).
Rezultatul operatiei b1&b2 este 00101000 (s-a pus 1 numai pe pozitiile in care ambii operanzi
au bitul 1), ceeace corespunde cu numarul zecimal 40.
Rezultatul operatiei b1|b2 este 01111110 (s-a pus 1 peste tot unde unul din operanzi sau ambii
au bitul 1), ceeace corespunde cu numarul zecimal 126.
Rezultatul operatiei b1^b2 este 01010110 (s-a pus 1 numai pe pozitiile unde cei doi operanzi
au biti diferiti), ceeace corespunde cu numarul zecimal 86.

• Operatiile de atribuire combinata se realizeaza folosind operatorii binari in care atribuirea se


combina cu un alt operator binar. Sa consideram un operator de atribuire combinata al carui
simbol are forma
<operator_binar>=<expresie>

unde operatorul binar poate fi oricare, cu exceptia a insasi operatorului de atribuire. Remarcam ca, in
forma sintactica de mai sus, intre <operator_binar> si operatorul de atribuire (=) nu se lasa spatiu
liber, acestia constituind impreuna un nou operator, de atribuire compusa.

Semnificatia acestui operator este urmatoarea: o expresie de atribuire combinata scrisa sub forma

<variabila> <operator_binar>= <expresie>

este echivalenta ca semnificatie cu una scrisa sub forma

<variabila> = <variabila> <operator_binar> <expresie>

10
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Aceasta inseamna ca expresia se interpreteaza in modul urmator: se aplica mai intai


<operator_binar> celor doi operanzi (adica variabilei din partea stanga si valorii expresiei din partea
dreapta), dupa care rezultatul obtinut se atribuie ca valoare variabilei din partea stanga. Se observa,
deci, ca operatorii de atribuire combinata au efect lateral, deoarece modifica valoarea unui operand.
De asemenea, la fel ca in cazul operatiei de atribuire, valoarea unei astfel de expresii este identica cu
valoarea care se atribuie variabilei din partea stanga.

1.3. Tipurile de date reale

Sub aspect conceptual, datele de tipuri reale din programare corespund numerelor reale din matematica.
Exista, insa, si aspecte specifice, care tin de modul in care aceste date sunt reprezentate in memoria
calculatorului.

In limbajul Java exista doua tipuri de date reale:

tipul float - numere reale in simpla precizie, reprezentate intern pe 4 octeti;


tipul double - numere reale in dubla precizie, reprezentate intern pe 8 octeti.

In ambele cazuri, forma interna a acestor numere respecta principiul reprezentarii in virgula mobila,
numita si virgula flotanta (in engl.: floating point). In consecinta, inainte de a prezenta reprezentarea
interna, vom trata pe scurt principiile reprezentarii in virgula mobila.

1.3.1. Declaratia de tip

Pentru tipurile de date reale se foloseste declaratia de tip deja cunoscuta

<tip> <nume>[=<valoare>] [,<nume>[=<valoare>]]*;

in care <tip> ::= float | double

iar <valoare> este un literal de tip corespunzator variabilei care se initializeaza.

Valoarea implicita pentru variabilele de tipuri reale este 0.0 cu lungimea corespunzatoare tipului
respectiv.

1.3.2. Literali de tipuri reale

Pentru reprezentarea in program, sub forma de literali, a numerelor reale s-a adoptat urmatoarea forma
sintactica:

<mantisa>[{E|e}<exponent>][<sufix>]

Asa dar, se scrie mai intai mantisa, iar apoi, daca este necesar, se scriu exponentul, precedat de litera E
sau e, si sufixul. Daca nu se pune exponentul, se considera ca acesta este 0.
La mantisa, separarea partii intregi de partea fractionara se face prin punct (conform uzantei din
limba engleza).
11
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Sufixul este litera f sau F pentru tipul float si d sau D pentru tipul double. Daca sufixul lipseste,
se considera implicit tipul double.

0.127834E2 0.1238705E-2 0.47863E-10 -0.12807E21

1.3.3. Operatori si operatii pentru tipurile de date reale

In limbajul Java, tipurile de date reale admit urmatorii operatori:

a) operatorul de atribuire: =
b) operatori aritmetici unari: + -
c) operatori aritmetici binari: + - * / %
d) operatori de incrementare si decrementare: ++ --
e) operatori relationali: == != < <= > >=
f) operatori de atribuire combinati: += -= *= /= %=

Se poate constata cu usurinta ca sunt aceiasi operatori ca la tipurile de date intregi, cu exceptia
operatorilor de deplasare si a operatorilor logici pe biti, precum si a operatorilor de atribuire combinati
cu acestia.

• Operatiile corespunzatoare operatorilor specificati aici sunt similare celor descrise pentru
tipurile de date intregi. Singura deosebire este ca operatorul de impartire ( / ) indica, in acest
caz, operatia de impartire reala , adica impartirea la care se extrage si partea fractionara a
catului, in timp ce, in cazul operanzilor de tip intreg, el indica impartirea intreaga. In schimb,
operatorul % indica, la fel ca in cazul operanzilor de tip intreg, restul impartirii intregi.
• De exemplu, daca a si b sunt variabile de tip real (float sau double), avand valorile a=19.0 si
b=4.0, atunci operatia a/b da ca rezultat valoarea 4.25 iar operatia a%b da rezultatul 3
(adica a-4*b, unde 4 este catul impartirii intregi a lui a la b). In schimb, daca a si b ar fi fost
variabile de tip intreg, rezultatul operatiei a/b ar fi fost numarul intreg 4.

Tipul rezultatului operatiilor se stabileste astfel:


a) Tipul rezultatului operatiei de atribuire (simpla sau combinata) este acelasi cu tipul variabilei din
partea stanga. La atribuire exista insa urmatoarea restrictie: daca variabila din partea stanga este de tip
float, atunci valoarea care i se atribuie nu poate fi de tip double. Ea poate fi, insa atat de tip float,
cat si de oricare din tipurile intregi;
b) Tipul rezultatului operatiilor aritmetice depinde de tipul operanzilor:
- daca ambii operanzi sunt de acelasi tip, rezultatul are tipul operanzilor;
- daca unul din operanzi este de tip double, rezultatul este de tip double;
- daca unul din operanzi este de tip float, iar celalalt nu este de tip double (dar poate fi de orice alt
tip numeric) rezultatul este de tip float.
c) Tipul rezultatului operatiilor relationale este boolean.

Rezultate speciale ale operatiilor cu numere reale:

Rezultatul impartirii la zero:


- Daca cel putin unul din operanzii impartirii apartine unui tip real si deimpartitul este diferit de zero,
in timp ce impartitorul este egal cu zero, atunci rezultatul este Infinity, cu semnul depinzand de
semnele ambilor operanzi (sa nu uitam ca in limbajul Java, asa cum s-a aratat in sectiunea privind

12
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

multimile de valori ale tipurilor reale, pot exista zero pozitiv si zero negativ).
- Daca atat deimpartitul, cat si impartitorul, au valoarea zero, rezultatul este NaN.

Rezultatul operatiilor in care intervin valorile speciale :


- Daca unul dintre operanzi are valoarea NaN sau daca operatia respectiva nu este permisa sub aspect
matematic (0/0, Infinity/Infinity, Infinity-Infinity) , rezultatul este NaN;
- Daca unul din operanzi are valoarea Infinity iar celalalt este numar obisnuit, sau ambii operanzi au
valoarea Infinity, rezultatul se stabileste conform regulilor cunoscute din matematica.

Remarcam deci ca, spre deosebire de operatiile cu numere intregi, in limbajul de programare Java
operatiile cu numere reale nu pot sa conduca la rezultate absurde din punct de vedere matematic.

1.4. Tipul char

Tipul de date char serveste pentru reprezentarea caracterelor.

Caracterele sunt simboluri tipografice elementare: litere, cifre, semne de punctuatie, simboluri
matematice si altele. Majoritatea limbajelor de programare ofera, ca tip de date primitiv, si tipul
caracter. In limbajul Java, numele acestui tip de date este char.

1.4.1. Declaratia de tip

Forma generala a acestei instructiuni este cea cunoscuta, in care tipul este char:

char <nume>[=<valoare>] [,<nume>[=<valoare>]]*;

Valoarea implicita a variabilelor de tip char este caracterul Unicode reprezentat prin secventa
escape '\u0000' , ceeace echivaleaza cu valoarea numerica 0 (zero) reprezentata pe doi octeti.

1.4.2. Secvente escape

In programele scrise in limbajul Java, in locul caracterelor se pot folosi codificarile lor interne, scrise
sub forma de secvente escape. Acestea sunt succesiuni de caractere care incep cu \ (bara inversa, in
engleza backslash) si au una din formele urmatoare:
\ooo in care ooosunt trei cifre din sistemul de numeratie octal, de la 000 pana la 377;

\uhhhh in care hhhh sunt patru cifre hexazecimale;


\c in care c este unul din caracterele b, t, n, f, r, ", ' sau \ cu semnificatiile din tabelul de
mai jos:

Secventa Reprezentarea in
Semnificatia
escape Unicode

\b \u0008
deplasare cu o pozitie la
stanga (backspace)
\t \u0009
tabulare orizontala
(horizontal tab)

13
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

\n \u000a
trecere la linie noua
(linefeed)

\f \u000c
salt la pagina noua
(form feed)
\r \u000d
intoarcerea carului
(carriage return)
\" \u0022 ghilimele (double quote)
\' \u0027 apostrof (single quote)
\\ \u005c bara inversa (backslash)

• Secventele escape de forma \ooose folosesc pentru a indica reprezentarea in cod ASCII (deci
ooosunt numere octale cuprinse intre 000 si 377, corespunzatoare numerelor binare pe 8 biti de
la 00000000 la 11111111).
• Secventele escape de forma \uxxxxse folosesc pentru a indica reprezentari in Unicode (deci
xxxx sunt numere hexazecimale reprezentabile pe doi octeti (16 biti), de la 0000 pana la
ffff).
• Secventele escape pot inlocui oricare din caracterele din fisierul sursa, atat in cadrul sirurilor de
caractrere (intre ghilimele), cat si in afara lor, de exemplu in identificatori sau in cuvintele
cheie. De fapt, cand prelucreaza textul din fisierul sursa, compilatorul javac inlocuieste fiecare
caracter din acest fisier prin codul corespunzator in Unicode. Aceasta are loc atat in cazul
caracterelor obisnuite, cat si in cazul secventelor escape. Astfel, stiind ca reprezentarile in
Unicode ale literelor e si t sunt, respectiv, \u0065 si \u0074, instructiunea
System.out.println("Exemplu");
poate fi scrisa sub forma
Sys\u0074\u0065m.ou\u0074.prin\u0074ln("Ex\u0065mplu");

1.4.3. Literalii de tip char

Literalii de tip char se scriu sub forma

'<caracter>'
sau
'<secventa_escape'

deci punand intre apostrofuri fie caracterul propriuzis, fie secventa escape corespunzatoare. De
exemplu, litera e poate fi reprezentata prin literalul 'e' sau prin literalul cu secventa escape in
Unicode '\u0065' sau prin cel cu secventa escape in octal '\145', iar caracterul, prin care se
comanda trecerea la linie noua, poate fi reprezentat prin oricare din literalii cu secvente escape '\n'
sau '\u000a' sau '\012'.

Literalii de tip char, care contin secvente escape, se mai numesc si literali escape.

1.4.4. Literalii siruri de caractere

Trebuie sa se faca distinctie intre un caracter izolat si un sir de caractere. Sirurile de caractere nu sunt
date primitive.

14
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

• Reprezentarea interna a unui sir de n caractere se face sub forma unei zone de memorie cu
lungimea de 2n octeti, fiecare caracter fiind reprezentat prin codul sau numeric pe 2 octeti in
Unicode.
• Reprezentarea externa, in program, a sirurilor de caractere se face, dupa cum s-a aratat deja,
prin literali sir de caractere. Un astfel de literal este format dintr-un sir de caractere cuprins
intre doua perechi de ghilimele, deci are forma sintactica

"<caracter>*"

in care <caracter>poate fi un caracter obisnuit (afisabil) sau o secventa escape. In cazul caracterelor
" (ghilimele), ' (apostrof) si \ (backslash), folosirea secventelor escape respective este obligatorie.

Un literal de tip char, de forma '<caracter>', contine in el intotdeauna un caracter si numai unul,
in timp ce un literal sir de caractere contine un numar oarecare de caractere, inclusiv niciunul.

Exemple de literali siruri de caractere:


""
"sir de caractere"
"abc*def!+x@=54"
"prima linie\na doua linie"
"abc\\def"
"expo\'99"
Primul din acesti literali este un sir vid. In ultimii trei literali s-au folosit secventele escape \n, pentru
trecere la linie noua, \\ in loc de \ si \' in loc de '. Secventa escape poate fi si in Unicode sau in octal.

1.4.5. Operatorii si operatiile pentru tipul char


In limbajul Java, tipul char este un caz particular al tipurilor de date intregi. Datele de tip char sunt
reprezentate intern ca numere intregi fara semn pe doi octeti, deci au valori cuprinse intre 0x0000 si
0xFFFF in hexazecimal, respectiv intre 0 si 65535 in zecimal. Asa cum s-a aratat deja, particularitatea
datelor de tip char este ca acestea sunt interpretate drept coduri ale unor caractere si se reprezinta extern
fie prin caracterele respective, fie prin secvente escape. Avand in vedere cele aratate aici, operatorii
admisi pentru tipul de date char sunt aceiasi ca pentru tipurile de date intregi, iar operatiile
corespunzatoare sunt, de asemenea aceleasi, cu urmatoarele particularitati:
(a) la operatia de atribuire (simpla sau combinata), partea dreapta trebuie sa fie un literal de tip
caracter sau o variabila de tip tip char sau byte, sau o valoare numerica intreaga exprimata in
sistemul zecimal, hexazecimal sau octal si cuprinsa in intervalul 0x0000 .. 0xFFFF (in zecimal 0 ..
65535);
(b) este permisa operatia de concatenare (cu operatorul de concatenare +) intre un sir de caractere si
un caracter; de exemplu, operatia "abc"+'d' da ca rezultat sirul "abcd", iar operatia 'P'+"qrs" da
rezultatul "Pqrs". Desigur ca, in locul literalilor 'd' sau 'P', puteau fi variabile de tip char. In schimb,
acelasi simbol (+), situat intre doua variabile sau doi literali de tip char este interpretat drept operator
de adunare intre doua numere intregi (se aduna codurile numerice ale celor doua caractere).

2. Tipul referinta
• Limbajul de programare Java se incadreaza in paradigma Programarii Orientate pe Obiecte.
Fiecare obiect incapsuleaza o structura de date si un set de metode prin care se prelucreaza
aceste date. Obiectele care au aceeasi structura de date si aceleasi metode formeaza o clasa.
Pentru a se putea manipula obiectele, in limbaj au fost introduse variabile referinta.

15
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

• Variabila de tip referinta are ca valoare referinta la un obiect sau la un tablou. Nu exista, in
limbajul Java, referinte la date de tipuri primitive, ci numai la obiecte. In principiu, prin
referinta se intelege adresa obiectului respectiv din memoria masinii virtuale Java. Aceste
valori nu sunt, insa, accesibile programatorului: ele nu pot fi afisate sau modificate prin
program.

Declararea variabilelor referinta la obiect se face sub forma


<clasa> <nume_variabila>[= <initializare>] [,<nume_variabila>[= <initializare>]]*;
in care
<clasa> este numele clasei, careia ii apartine obiectul la care se face referinta;
<nume_variabila> este un identificator, care este numele variabilei referinta declarate;
<initializare> este specificarea valorii initiale a referintei, prin procedee care vor fi indicate de noi
in capitolele urmatoare.
• Daca o variabila referinta nu a fost initializata, ea are implicit valoarea null. Aceasta este o
valoare speciala, care are semnificatia ca variabila respectiva nu indica nimic.
• Tablourile sunt structuri de date care contin fie date primitive, fie obiecte. Declararea
variabilelor referinta la tablou se va explica, in capitolul urmator.
• Singura operatie care se poate efectua prin program asupra variabilelor referinta este cea de
atribuire. Toate celelalte operatii se fac asupra obiectelor la care fac referinta aceste variabile.
• Prin operatia de atribuire, unei variabile referinta i se atribuie ca valoare o referinta la un obiect
sau la un tablou, care apartine clasei specificate la declararea variabilei referinta respective.

Exemplu
Instructiunile
String s1="primul sir", s2="al doilea sir", s3, s4;
s3="alt sir";
s4=s2;
servesc pentru a declara ca s1, s2, s3 si s4 sunt referinte la obiecte din clasa String (clasa sirurilor de
caractere). Totodata, se initializeaza primele doua din aceste variabile cu referinte la sirurile "primul
sir" si, respectiv, "al doilea sir". Intrucat variabilele s3 si s4 nu au primit valori initiale, ele sunt
initializate implicit la valoarea null. Se atribuie apoi variabilei s3 o referinta catre sirul de caractere "alt
sir", iar variabilei s4 i se atribuie valoarea variabilei s1 (deci o referinta catre obiectul "primul sir");

3. Conversii de tip implicite si explicite


3.1. Conversii implicite
Daca, intr-o operatie binara, operanzii au tipuri diferite de cel al rezultatului, atunci, inainte de a se
efectua operatia respectiva, se face conversia valorilor operanzilor, astfel incat ele sa aiba acelasi tip cu

16
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

rezultatul. Daca aceasta conversie se poate face fara pierdere de informatie, ea se face in mod implicit
(automat), deci fara a fi indicata explicit de catre programator. Atragem atentia ca ceeace se converteste
nu este, de fapt, valoarea operandului propriuzis (acesta ramane nemodificat) ci o valoare temporara a
operandului, cu care acesta intra in calcul la efectuarea operatiei respective.

Exemple
(1) Fie v1 si v2 doua variabile de tip byte sau short. Operatia binara b1+b2 are, conform regulii
cunoscute, rezultat de tipul int. In consecinta, inainte de a se efectua aceasta operatie, ambii operanzi
vor fi conbertiti la tipul int. Aceasta inseamna ca se creaza doua valori temporare de tip int, egale
numeric cu cele ale operanzilor respectivi, si asupra acestora se efectueaza operatia. Conversiile sunt
posibile fara pierdere de informatie, intrucat reprezentarea interna (in binar) a tipului int este mai lunga
decat a tipurilor byte si short.
(2) Fie w o variabila de tip double si z o variabila de tip float. La efectuarea operatiei de atribuire
w=z se creaza o valoare temporara de tipul double egala numeric cu valoarea variabilei z si care se
atribuie variabilei w. Conversia este posibila fara pierdere de informatie, intrucat precizia de
reprezentare a datelor de tip double este superioara celei a datelor de tip float.
(3) Fie s o variabila de tip short si b o variabila de tip byte. La efectuarea atribuirii s=b valoarea
variabilei b este convertita din byte in short.
In tabela de mai jos sunt indicate cu X toate conversiile de tip care se pot realiza inplicit. In coloana din
stanga este tipul datei care este supusa conversiei, iar in capul tabelei (pe prima linie) tipul catre care se
face conversia.
byte short int long float double
byte X X X X X
short X X X X
char X X X X
int X X X
long X X
float X

3.2. Conversii explicite

Programatorul poate solicita in mod explicit, prin program, efectuarea unor conversii de tip. In acest
caz, este posibil ca la conversie sa aiba loc pierdere de informatie sau chiar denaturarea completa a
valorii convertite, deci programatorul isi asuma intreaga raspundere asupra consecintelor.
Pentru a solicita conversia explicita, se foloseste operatorul cast . Acesta este un operator unar, care
are forma
(<tip>)
deci numele tipului catre care se face conversia cuprins intr-o pereche de paranteze. Asa dar, expresia
(<tip>)<valoare>
are semnificatia ca se converteste valoarea din partea dreapta (care poate fi valoarea unui literal, a unei
variabile sau a unei expresii) intr-o valoare apartinand tipului de date scris intre paranteze
Exemplu: daca b este o variabila de tip byte, iar k este o variabila de tip int, expresia de atribuire
b=k nu este permisa, deoarece nu se poate face conversie implicita de la int la byte. In schimb,
programatorul poate solocita explicit aceasta conversie, scriind expresia respectiva sub forma
b=(byte)k

17
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Ceea ce inseamna ca se creaza o valoare temporara de tipul byte, obtinuta retinand numai cei 8 biti din
partea dreapta a reprezentarii binare a lui k, si aceasta valoare se atribuie lui b. Daca, intamplator, cei
trei octeti care au fost eliminati din fata reprezentarii interne a lui k aveau toti bitii 0, atunci prin aceasta
nu s-a pierdut informatie, adica valoarea numerica a lui b va fi, din punct de vedere matematic, egala cu
a lui k. Daca insa unul sau mai multi dintre bitii eliminati au valoarea 1, valoarea atribuita lui b va fi cu
totul diferita de cea a lui k.
In tabela de mai jos se indica prin X care sunt conversiile explicite permise intre tipurile de date
primitive.
byte short char int long float
byte X
short X X
char X X X
int X X X
long X X X X
float X X X X X
double X X X X X X

• Se permite folosirea operatorului cast si in cazurile, in care conversia se face implicit, dar nu
este necesar.
• Se observa ca nu exista posibilitatea de conversie intre tipul boolean si alte tipuri de date. In ce
priveste tipul referinta, acesta este supus unor reguli de conversie specifice, care vor fi
prezentate la studierea programarii orientate pe obiecte.

4. Structuri de control
• Instructiunea if - Instrucţiunea if (in diversele ei forme) permite unui program să
reacţioneze diferit, în funcţie de rezultatul obţinut la evaluarea unei expresii
logice.

// Algoritm pseudocod care testeaza daca un numar intreg este pozitiv

citeste n (nr intreg)


⎡daca n > 0 atunci

⎣ scrie "n este pozitiv"

// Programul Java care testeaza daca un numar intreg este pozitiv

class TestIF_1 {
public static void main (String args[]) {
int n=5; //o valoare arbitrara
if (n > 0) {
System.out.println("n este pozitiv”);
}

18
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i
}
}

• Instructiunea if-else
// Algoritmul pseudocod care testeaza daca un numar intreg este pozitiv
citeste n (nr intreg)
⎡daca n > 0 atunci
⎢ scrie " n este pozitiv"

⎢altfel

⎣ scrie " n nuestepozitiv"

// Programul Java care testeaza daca un numar intreg, citit de la tastarura, este pozitiv
import java.io.*;
class TestIfElse{
public static void main (String args[]) throws IOException{
BufferedReader in=new BufferedReader(new
InputStreamReader(System.in));
System.out.println(“Introduceti n: “);
int n=Integer.parseInt(in.readLine());
if (n > 0) {
System.out.println("n este pozitiv”);
}
else {
System.out.println("n este negativ sau zero");
}
}
}
• Instructiunea else-if
// Algoritmul pseudocod care testeaza daca un numar intreg este egal cu 0, 1, 2, 3 sau >3
citeste n (nr intreg)
⎡daca n = 0 atunci
⎢ scrie " n este 0"

⎢altfel

⎢ ⎡daca n = 1 atunci
⎢ ⎢ scrie " n este 1"
⎢ ⎢
⎢ ⎢altfel
⎢ ⎢ daca n = 2 atunci
⎢ ⎢ ⎡
⎢ ⎢ ⎢ scrie " n este 2"
⎢ ⎢ ⎢
⎢ ⎢ ⎢altfel
⎢ ⎢ ⎢ ⎡daca n = 3 atunci
⎢ ⎢ ⎢ ⎢
⎢ ⎢ ⎢ ⎢ scrie " n este 3"
⎢ ⎢ ⎢ ⎢altfel
⎢ ⎢ ⎢ ⎢
⎢⎣ ⎢⎣ ⎢⎣ ⎣ scrie " n > 3"

19
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

// Program Java care testeaza daca un numar intreg, citit de la tastarura, este egal cu 10, 1, 2, 3 sau este
mai mare decat 3

import java.io.*;
class TestElseIf {
public static void main (String args[]) throws IOException {
BufferedReader in=new BufferedReader(new
InputStreamReader(System.in));
System.out.println(“Introduceti n: “);
int n=Integer.parseInt(in.readLine());
if (n == 0) {
System.out.println("n este 0");
}
else if (n == 1) {
System.out.println("n este 1");
}
else if (n == 2) {
System.out.println("n este 2");
}
else if (n == 3) {
System.out.println("n este 3");
}
else {
System.out.println(" n > 3");
}
}
}

• Instructiunea for
// Algoritmul pseudocod
citeste n (nr natural )
⎡ pentru i ← 0, n − 1
⎢ scrie i

// Programul Java care afiseaza numerele mai mici decat un numar intreg citit de la tastarura
class TestFor {
public static void main (String args[]) {
System.out.print("Ciclu For ");
for (int i = 0; i < 30; i++) {
// ciclu for
System.out.print("contor = "+ i);
System.out.print(" ");
}
}
• Instructiunea while
Instrucţiunea while este întrebuinţată pentru execuţia repetată a unei instrucţiuni. Execuţia unei
instrucţiuni while începe cu evaluarea expresiei logice. Dacă după evaluarea expresiei se ajunge la

20
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

rezultatul true, se execută instrucţiunea. După executarea instrucţiunii se reevaluează expresia


logică. În cazul în care expresia este falsă, execuţia instrucţiunii while se termină. În caz contrar,
while îşi continuă execuţia.

Exemplu:
//Algoritmul pseudocod // Aplicatia Java
contorÅ0 public class TestWhile{
⎡cat_timp contor < 10 executa public static void main (String args[]){
int contor=0; //declara si
⎢ scrie contor //initializeaza contorul de iteratii
⎢ while (contor<10){ //testeaza valoarea
⎢⎣ contor = contor + 1 //contorului
System.out.println(„Contor = ” + contor);
//afiseaza valoarea
contor++; //incrementeaza contorul
}
}

Instrucţiunea do-while
Sintaxa instrucţiunii este următoarea :
do {
Instructiune
} while ( expresie logica )

Obs: do-while este similară cu while, cu excepţia faptului că instrucţiunea conţinută în cadrul
ciclului va fi executată cel puţin o dată. În cazul unui ciclu while este posibil ca instrucţiunea să nu
se execute niciodată, deoarece testul este efectuat la început, comparativ cu ciclul do-while, în
care testul este efectuat la sfârşit.
Exercitii propuse:
Ex1:

Se consideră algoritmul alăturat descris în


pseudocod.
S-a notat cu x%y restul împărţirii numărului natural x
la numărul natural nenul y şi cu [z] partea întreagă a
numărului real z.
a) Scrieţi numerele afişate dacă se citeşte valoarea
x=168.
b) Scrieţi o valoare care poate fi citită pentru
variabila x astfel încât, în urma executării
algoritmului, să se afişeze două valori egale.
c) Corespunzător algoritmului dat, scrieţi programul
Java si schema logica.

21
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Ex2:

Se consideră algoritmul alăturat, descris în


pseudocod.
S-a notat cu [z] partea întreagă a numărului real z, iar cu
x%y restul împărţirii numărului natural x la numărul natural
nenul y.
a) Scrieţi valoarea care va fi afişată dacă se citeşte
numărul x=140.
b) Scrieţi o valoare care poate fi citită pentru x (x≠1)
astfel încât valoarea afişată să fie 6.
c) Corespunzător algoritmului dat, scrieţi programul Java si
schema logica
d) Scrieţi valorile naturale din intervalul [7,28] care pot fi
introduse pentru variabila x, astfel încât, după executarea
programului, valoarea afişată să fie 1.

Ex3:

Se consideră algoritmul alăturat, descris în


pseudocod.
S-a notat cu [z] partea întreagă a numărului real z, iar cu
x%y restul împărţirii numărului natural x la numărul natural
nenul y.
a) Scrieţi ce se afişează dacă numărul citit este
n=9458.
b) Scrieţi cea mai mare valoare cu exact 3 cifre,
care poate fi citită pentru n astfel încât să se
afişeze, în această ordine, numerele 9 7.
c) Scrieţi programul Java corespunzător
algoritmului dat.
d) Scrieţi în pseudocod un algoritm echivalent celui
dat în care să se înlocuiască structura cât
timp...execută cu o structură repetitivă de alt
tip.

22
Informatica aplicata-note de curs constructii20092010@gmail.com; http://scdsd.bluepink.ro/cursur i

Ex4:

Se consideră algoritmul alăturat, descris în


pseudocod.
S-a notat cu [z] partea întreagă a numărului real z, iar cu
x%y restul împărţirii numărului natural x la numărul natural
nenul y.
a) Scrieţi valoarea care va fi afişată dacă se citeşte
numărul x=140.
b) Scrieţi o valoare care poate fi citită pentru x (x≠1)
astfel încât valoarea afişată să fie 6.
c) Scrieţi programul Java corespunzător algoritmului
dat.
d) Scrieţi valorile naturale din intervalul [7,28] care
pot fi introduse pentru variabila x, astfel încât, după
executarea programului, valoarea afişată să fie 1.

Ex5:
Se consideră algoritmul alăturat, descris în
pseudocod.
a) Dacă se citeşte pentru n valoarea 10, scrieţi
valorile care se afişează, în forma rezultată în
urma executării algoritmului,
b) Scrieţi o valoare formată din exact două cifre care,
dacă se citeşte pentru n, determină ca printre
tripletele de valori afişate să existe unul alcătuit
din trei numere consecutive.
c) Scrieţi programul Java corespunzător
algoritmului dat.
d) Scrieţi în pseudocod un algoritm echivalent cu cel
dat care să utilizeze exact două structuri
repetitive.

Tema: Se vor redacta raspunsurile la Ex1 – Ex5 in Wordpad/Word/OfficeOrg si


se trimite fisierul Ex1-Ex5.doc impreuna cu programele in Java (Ex1.java –
Ex5.java), in fisierul C3_nume+prenume.rar , prin e-mail, la adresa
constructii200920010@gmail.com. La subject: C3_nume+prenume;

Termen: 14 zile de la tinerea cursului.

23

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