CATEGORII DOCUMENTE |
In aceasta carte, au fost folositi mai multi termeni generali pentru discutarea semnificatiei limbajului Java. In capitolul de fata, vom studia mai atent blocurile de constructie folosite la scrierea programelor. Daca suntetifamiliarizati cu C sau C++, veti descoperi in Java multe constructii cunoscute. Va trebui insa sa va dezvatati de unele deprinderi dobandite in alte limbaje de programare.
Capitolul de fata explica elementele fundamentale ale limbajului de programare Java, de la conceptele generale si fluxul logic al programelor, pana la cuvintele cheie specifice.
Atomi
Limbajul de programare Java desemneaza blocurile de constructie ( elementele de baza ) printr-un termen special: atomi ( tokens ). Familiarizarea cu termenii si conceptele specifice este absolut necesara pentru programarea in Java.
Capitolul 4, "Limbajul Java: abecedar", a prezentat o serie de evenimente legate de compilarea si rularea aplicatiilor. In acest capitol, este explicata logica de lucru a compilatorului javac.
In timpul compilarii, javac citeste codul sursa si extrage din acesta informatii specifice, numite atomi, pentru prelucrarea ulterioara.
In primul rand, javacextrage din codul de octeti secventele Escape. Apoi, determina daca aceste secvente sunt terminatori de linie sau caractere de intrare. In continuare, javac elimina toate spatiile care nu fac parte din siruri de caractere: caracterul spatiu ASCII, caracterul CR ( carriage return ),caracterul salt la linie noua ( LF _line feed ) si tabulatorii. Apoi, compilatorul incepe extragerea atomilor.
Exista mai multe tipuri de atomi: identificatori, cuvinte cheie, valori literale, operatori, separatori si comentarii.
Identificatori
Compilatorul javac are nevoie de numele elementelor dintr-un program. De exemplu, el trebuie sa recunoasca numele variabilelor, ale metodelorsi ale elementelor componente ale claselor. Identificatorii sunt cuvinte rezervate Java sau nume date variabilelor, claselor si metodelor. Cuvintele rezervate sunt nume care pot fi folosite numai de Java. Utilizarea lor in orice alt mod va genera o eroare de compilare.
Identificatorii pot avea orice nume, cu conditia sa inceapa cu o litera din alfabet, cu simbolul dolar ( $ ) sau cu o liniuta de subliniere ( _ ). Va sfatuim insa sa nu folositi ca identificatori caracterul dolar sau liniuta de subliniere, deoarece aceste elemente sunt utilizate de bibliotecile Java. Ele va vor fi de ajutor la depanarea programelor. Puteti sa folositi liniuta de subliniere pentru crearea unor nume sugestive de identificatori, cum ar fi acest_program. Ca in toate limbajele de programare, este de preferat ca numele identificatorilor sa fie cat mai descriptive.
Dimensiunea numelor de identificatori
Deseori, Java pune la dispozitia programatorilor exact atata franghie cata este necesara pentru a putea realiza noduri interesante. De exemplu, compilatorul javac accepta cuvintele scrise cu litere mari cat si cele cu litere mici, asa cum accepta si cuvintele cheie.
Identificatorii Java fac diferenta intre literele mari si cele mici. De exemplu, char este un cuvant rezervat in Java. Aceasta inseamna ca puteti atribui unei variabile identificatorul Char, CHAR sau orice alta combinatie. Totusi, astfel de nume complica depanarea programelor. In sectiunea urmatoare, veti afla mai multe despre cuvintele rezervate.
Cuvinte cheie
Cuvintele cheie (keywords) sunt cuvinte rezervate, ceea ce inseamna ca nu pot fi folosite in alt scop decat cel pentru care au fost create. Prin urmare, cuvintele cheie sunt niste atomi de tip special. Ele se inscriu intotdeauna cu litere mici.
Cuvintele cheie Java sunt folosite in aplicatii pentru controlul fluxului, pentru identificatorii de clase, in declaratii si expresii. Tabelul 6.1 prezinta toate cuvintele cheie rezervate din limbajul Java. Cele care tin de elementele de baza ale limbajului sunt explicate in sectiunile respective din acest capitol.
Tabelul 6.1 Cuvinte cheie rezervate in limbajul Java
Cuvinte cheie pentru declararea datelor
Boolean
Byte
Char
Double
Float
Int
Long
Short
Cuvinte cheie pentru controlul buclelor
Break
Continue
Do
For
While
Cuvinte cheie conditionale
Case
Else
If
Switch
Cuvinte cheie pentru exceptii
Catch
Finally
Throw
Try
Cuvinte cheie pentru structuri
Abstract
Class
Default
Extends
Implements
Instance of
Interface
Cuvinte cheie pentru modificare si acces
Final
Native
New
Private
Protected
Public
Static
Synchronized
Threadsafe
Transient
Void
Cuvinte cheie diverse
False
Import
Null
Package
Return
Super
This
True
Urmatoarele cuvinte cheie sunt rezervate si nu sunt folosite in versiunea 1.0 a limbajului Java; este posibil sa fie incluse in versiunile ulterioare:
Byvalue
Cast
Const
Future
Generic
Goto
Inner
Operator
Outer
Rest
Var
Valori literale
Datele sunt reprezentate in Java prin valori literale. Ca si din alte limbaje de programare, valorile literale din Java se bazeaza pe reprezentari formate din caractere si numere. Tipurile valorilor literale sunt urmatoarele: intreg, in virgula mobila, boolean, caracter si sir de caractere.
Toate variabilele sunt formate dintr-o valoare literala si un tip de date. Diferenta dintre cele doua consta In faptul ca valorile literale sunt introduse explicit in cod. Tipurile de date contin informatii despre valorile literale, cum ar fi spatiul care trebuie rezervat in memorie si domeniul de valori al variabilei respective. (Despre tipurile de date vom discuta In sectiunea "Folosirea tipurilor de date".)
Valori literale intregi
Intregii sunt numere fara fractiuni zecimale, cum ar fi 1 sau 5280. Valorile literale intregi pot fi zecimale (in baza 10), octale (in baza 8), sau hexazecimale (in baza 16).
Numerele in baza 10 pot fi pozitive, zero sau negative. Valorile literale zecimale nu pot incepe cu cifra 0, cum ar fi 01234. Cifrele care urmeaza dupa prima pozitie pot avea orice valoare de la 0 la 9. Numerele care incep cu 0 sunt rezervate pentru valorile literale octale si hexazecimale. Ca urmare, atunci cand folositi valori literale zecimale, nu puteti sa le aliniati la dreapta cu zerouri plasate in fata. Cel mai mare numar pozitiv care poate fi reprezentat printr-o valoare literala zecimala este 232 - 1, adica 2.147.483.647. Limita inferioara este -232
adica -2.147.483.648.
Valorile literale octale incep cu 0 si pot contine orice cifra de la 0 la 7. Pot fi pozitive, zero sau negative. Cel mai mare numar pozitiv care poate fi reprezentat printr-o valoare literala octala este 231 - 1, adica 017777777777.
Valorile literale hexazecimale incep cu 0x sau oX si continua cu una sau mai multe cifre hexazecimale. Literele de la A la F folosite pentru reprezentarea valorilor literale hexazecimale pot fi mari sau mici. Numerele hexazecimale intregi pot fi pozitive, zero sau negative. Cel mai mare numar pozitiv care poate fi reprezentat printr-o valoare literala hexazecimala este 231 - 1, adica 0x7fffffff. Valorile literale hexazecimale pot contine caracterele 1 - 9, A - F si a - f.
Daca oricare dintre valorile de mai sus este depasita, se semnaleaza o eroare de compilare.
Valori literale in virgula mobila
O valoare literala in virgula mobila reprezinta un numar care contine un punct zecimal, cum ar fi 3.7. Standardele Java impun ca numerele in virgula mobila sa respecte specificatiile standard industriale, prevazute in IEEE-754.
Numerele in virgula mobila cu precizie simpla ocupa 32 de biti si sunt identificate prin litera f sau F. Numerele in virgula mobila cu precizie dubla ocupa 64 de biti si sunt identificate prin litera d sau D. In mod prestabilit, se folosesc numerele in virgula mobila cu precizie dubla. Prin urmare, 3.7 este un numar in virgula mobilacu precizie dubla, iar 3.7f este un numar in virgula mobila cu precizie simpla.
De unde stiti cand trebuie sa folositi un numar in virgula mobila cu precizie simpla si cand unul cu precizie dubla ? Aceasta depinde de marimea numarului. Daca exista posibilitatea ca numarul sa depaseasca una dintre limite sau daca aveti nevoie de o precizie mai mare decat cea oferita de numerele cu precizie simpla, folositi numere in virgula mobila cu precizie dubla.
Daca o valoare literala in virgula mobila, diferita de zero, este prea mica sau prea mare, se semnaleaza o eroare in timpul compilarii.
Cel mai mare numar in virgula mobila cu precizie simpla (ca valoare absoluta) este +3,40282347e+38f, iar cel mai mic (de asemenea ca valoare absoluta) este +1,40239846e-45f. Cel mai mare numar in virgula mobila cu precizie dubla este 1,79769313486231570e+308, iar cel mai mic este in valoare absoluta 4,94065645841246544e-324.
Observatie: Valorile literale in virgula mobila pot fi reprezentate si cu ajutorul exponentilor sau in notatie stiintifica, asa cum ati vazut in paragraful precedent. Litera e, mare sau mica, este folosita pentru delimitarea exponentului. Un astfel de exemplu este 2.1e3f; acesta este un numar in virgula mobila cu precizie simpla, reprezentand valoarea 2100.
Valori literale de tip boolean
Valorile literale de tip boolean sunt doua: true (adevarat) sau false (fals). Spre deosebire de alte limbaje de programare, aceste valori literale nu pot fi inlocuite cu 1 sau 0. Valorile literale de tip boolean sunt folosite pe scara larga in logica fluxului de control al programelor.
Valori literale de tip caracter
Programatorii folosesc deseori un singur caracter drept valoare. In Java se numesc valori literale de tip caracter. Ele se incadreaza intre apostrofuri, de exemplu 'y'.
Atribuirea unei valori literale de tip caracter devine mai interesanta atunci cand aceasta valoare este un apostrof, un backslash sau un caracter netiparibil. Caracterul backslash () este folosit pentru reprezentarea unor caractere netiparibile sau a unor caractere ce fac parte din anumite comenzi. De exemplu, valoarea ''' reprezinta caracterul apostrof ('). In tabelul 6.2 sunt prezentate cateva exemple de atribuire a unor valori literale de tip caracter.
Tabelul 6.2. Specificarea unor valori literale de tip caracter.
Descrierea secventei Escape Secventa Rezultat |
Orice caracter 'y' y Backspace (BS) 'b' Deplaseaza cursorul cu un caracter inapoi Tab orizontal (HT) 't' Tab Linefeed (LF) 'n' Salt la o linie noua Formfeed (FF) 'f' Salt la o pagina noua Carriage return (CR) 'r' Deplaseaza cursorul la inceputul liniei urmatoare Ghilimele duble '"' " Apostrof ''' ' Backslash '' Model de biti pentru o 'ddd' Valoarea octala ddd valoare octala Model de biti pentru o 'xdd' Valoarea hexazecimala dd valoare hexazecimala Caracter Unicode 'udddd' Caracterul Unicode reprezentat de codul ddddc |
In timpul compilarii, se semnaleaza o eroare daca dupa valoare urmeaza orice altceva decat un apostrof, sau daca dupa '' urmeaza altceva decat unul dintre caracterele b, t, n, f, r, ", ', , 0, 1, 2, 3, 4, 5, 6, sau 7.
Valori literale de tip sir de caractere
Valorile literale de tip sir de caractere incadrate de ghilimele, cum ar fi "Aceasta este o valoare literala de tip sir de caractere", "Salut, prieteni! "sau chiar" ", care reprezinta un sir de caractere nul. Compilatorul Java nu elimina spatiile din valorile literale de tip sir de caractere.
Valorile literale de tip sir de caractere pot fi concatenate. De exemplu, daca primul sir de caractere este "Acesta este inceputul ", iar al doilea sir de caractere este " unei relatii minunate", cele doua siruri de caractere pot fi concatenate. Reprezentarea este " Acesta este inceputul" + "unei relatii minunate". (Spatiile de langa semnul plus nu sunt necesare).
Valorile literale de tip sir de caractere nu se pot intinde pe mai multe linii;cele care depasesc lungimea unei linii trebuie despartite la declarare si concatenate atunci cand sunt folosite. In acest fel, programele sunt mai usor de citit si scade posibilitatea confundarii sirurilor de caractere cu comentariile.
Ca si in cazul valorilor literale de tip caracter, caracterul backslash este folosit pentru sirurile de caractere care nu pot fi reprezentate asfel. Ghilimelele pot fi reprezentate prin sirul de caractere " " ".
Separatori
Java foloseste urmatorii separatori: () ; , si ..
Compilatorul foloseste separatorii pentru impartirea codului in segmente. De asemenea, acestia pot forta precedenta evaluarii expresiilor aritmetice in cazul unei expresii. (Veti afla mai multe despre precedenta in sectiunea "Folosirea operatorilor in expresii "). In plus, separatorii sunt utili pentru localizarea vizuala si logica in programe.
Remarcati folosirea separatorilor in urmatoarea secventa de cod:
If (location < 10 ) {
In acest exemplu, parantezele indica ce expresie de tip boolean trebuie evaluata de compilator, anume daca valoarea variabilei location este mai mica decat 10. Acolada care urmeaza marcheaza inceputul blocului de cod care va fi executat in cazul in care expresia de tip boolean are valoarea true.
Operatori
Operatorii sunt simboluri folosite in operatii aritmetice si logice. Simbolurile aritmetice definesc operatii care pot fi efectuate cu numere (de exemplu, 2+3). Operatorii, cu exceptia semnului +, sunt folositi numai pentru calcule aritmetice. Operatorul + poate fi folosit si pentru siruri de caractere , asa cum ati vazut in exemplul de concatenare a valorilor literale de tip sir de caractere. In tabelele 6.3 - 6.7 sunt prezentati toti operatorii Java.
Operator Operatie Exemplu
+ Adunare g + h
_ Scadere g - h
* Inmultire g * h
/ Impartire g / h
% Modulo g % h
= Atribuie o valoare a = 7 a = 7
+= Aduna la valoare curenta g += h g = g+ h
-= Scade din valoare curenta g -= h g = g - h
*= Inmulteste cu valoare curenta g *= h g = g * h
/= Imparte valoarea curenta g /= h g = g / h
%= Operatie modulo asupra valorii g %= h g = g % h
curente
Tabelul 6.5. Operatorii de incrementare si decrementare folositi in limbajul Java
Operator Operatie Exemplu Semnificatie
+ + Incrementeaza cu 1 g++ sau ++g g = g + 1
- - Decrementeaza cu 1 g-- sau --g g = g - 1
Tabelul 6.6. Operatorii de comparatie folositi in limbajul Java (returneaza una din valorile
true sau false
Operator Operatie Exemplu Semnificatie
= = Egal g = = h Este g egal cu h?
! = Diferit g ! = h Este g diferit de h?
< Mai mic decat g < h Este g mai mic decat h?
> Mai mare decat g > h Este g mai mare decat h?
<= Mai mic sau egal cu g <= h Este g mai mic sau egal cu h?
>= Mai mare sau egal cu g >= h Este g mai mare sau egal cu h?
Tabelul 6.7. Operatorii pe biti folositi in limbajul Java.
Operator Operatie
AND (SI) pe biti
| OR ( SAU ) pe biti
^ XOR ( SAU EXCLUSIV ) pe biti
<< Deplasare la stanga
>> Deplasare la dreapta
>>> Deplasare la dreapta prin completare la stanga cu zerouri
Complement pe biti
<<= Deplasare la stanga urmata de atribuire
>>= Deplasare la dreapta urmata de atribuire
>>>= Deplasare la dreapta prin completare la stanga cu zerouri, urmata de
atribuire
x = y AND (SI ) pe biti urmat de atribuire
x |= y OR ( SAU ) PE biti urmat de atribuire
x ^= y XOR (SAU EXCLUSIV ) pe biti urmat de atribuire
Comentarii
Unii programatori cred ca daca un program este complicat , atunci este si greu de intretinut. Este loc sub soare si pentru acestia; sa speram ca nu este cazul si proiectelor noastre! Desigur, comentariile ar trebui sa apara in tot programul, pentru a explica rationamentul programatorului. Ele pot fi folosite si la blocarea unor secvente de cod in scopul testarii.
Comentariile sunt formate dintr-un marcaj de inceput, urmat, de obicei, de un text si de un marcaj de sfarsit. Uneori sunt folosite la separarea diferitelor segmente logice ale programului si , in acest caz, probabil nu vor contine text.
Tabelul 6.8. prezinta cele trei modalitati de indicare a comentariilor.
Tabelul 6.8 Marcaje de comentarii
Inceput Text Sfarsit
/* text */
/** text */
// text (tot ce urmeaza pana la sfarsitul liniei este ignorat
de compilator)
Comentariul /* este familiar programatorilor C. Comentariile /** sunt generate in mod automat de sistem. Cel de-al treilea stil de comentarii este familiar programatorilor C++.
Iata cateva exemple de comentarii:
/* Acesta este un exemplu de comentariu */.
/** Acesta este un alt exemplu de comentariu. El se poate intinde pe mai multe linii si compilatorul il va trece ca pe un comentariu pana cand va intalni caracterele */.
// Acest tip de comentariu nu se poate intinde
// pe mai multe linii decat daca fiecare linie
// incepe cu marcajul de comentariu
Comentariile pot aparea oriunde in cod, fara sa afecteze executia sau logica programului. Nu uitati sa incheiati comentariile, pentru a nu deruta compilatorul.
Atentie! Daca uitati sa incheiati un comentariu, veti obtine rezultate foarte ciudate la compilarea sau rularea programului. Compilatorul va interpeta drept comentariu toate instructiunile care apar pana la urmatorul marcaj de sfarsit, ceea ce va elimina o intreaga sectiune a programului.
Pe scurt, despre atomi
Atomii sunt blocuri de construcie elementare ale limbajului Java. Intelegerea lor este esentiala pentru progamarea in Java. In urmatoarele sectiuni, veti vedea cateva exemple de folosire a atomilor in Java.
Folosirea tipurilor de date
O variabila este un element care se modifica sau variaza. In Java, variabilele stocheaza date. Tipurile de date stabilesc ce fel de date pot fi stocate intr-o variabila si care sunt limitele acestora.
Iata un exemplu de folosire a tipurilor de date:
Char my _ letter;
Acest exemplu ilustreaza cele doua parti componente ale unei variabile : tipul variabilei ( char ) si identificatorul ( my _ letter ) . Tipul variabilei precizeaza faptul ca variabila my _ letter este de tip caracter ( char ). Amintiti-va ca acest cuvant ( char ) este rezervat; tipurile de date sunt definite intotdeauna printr-un cuvant rezervat. Variabila my _ letter are, in acest moment, valoarea null, care este valoarea prestabilita pentru tipul de date char. In sfarsit , caracterul punct si virgula (;) spune compilatorului unde se termina definirea variabilei.
Iata un alt exemplu de definire a tipurilor de date:
Int no _ of _ albums, b , YellowsRose , chair;
Acest exemplu de cod defineste patru variabile: no _ of _ albums, b , YellowsRose si chair. Toate sunt de tip int ( cuvant rezervat ). Puteti defini pe o linie mai multe variabile de acelasi tip, separand identificatorii prin virgule. Valoarea prestabilita pentru variabilele intregi este 0. La fel ca in exemplul anterior , definirea se incheie prin caracterul punct si virgula.
Exista doua tipuri principale de date in Java: referintele si tipurile de date primitive.
Tipurile de date pot fi stocate in variabile, transmise ca argumente si returnate ca valori. De asemenea, tipurilor de date li se pot aplica diferite operatii.
Observatie: Retineti ca definirea sau stabilirea unui tip pentru o variabila nu ii atribuie automat o valoare, ci doar identifica valori posibile ale variabilei.
Tipuri de date primitive
Tipurile de date primitive pot avea o singura valoare la un moment dat. Ele nu contin referiri la alte date si nici nu indica o secventa intr-un grup de date. Se numesc primitive deoarece constituie cea mai simpla forma de date integrata in Java. Toate celelalte date sunt combinatii ale tipurilor de date primitive. Cuvintele cheie pentru tipurile de date primitive sunt prezentate in tabelul 6.9.
Tabelul 6.9. Cuvintele cheie pentru tipurile de date primitive.
boolean
byte
char
double
float
int
long
short
Exista patru tipuri de date intregi : byte, int, long si short. Fiecare dintre ele are un domeniu specific de valori, asa cum se arata in tabelul 6.10.
Tabelul 6.10. Domeniile de valori pentru tipurile de date intregi.
Tip Lungime Valoare minima Valoare maxima
byte 8biti -128 127
short 16 biti - 32768 32767
int 32 biti - 2147483648 2147483647
long 64 biti - 9223372036854775808 923372036854775807
Java actioneaza interesant in timpul operatiilor cu valori intregi. De exemplu, o variabila numita Sma 11Number, de tip byte, este adunata cu o variabila numita Large Number, de tip int. Automat, ambele variabile devin de tip int, stocate pe 32 de biti. Cu alte cuvinte, variabila Sma 11 Number este extinsa la 32 biti.( Exceptie de la aceasta regula face situatia in care rezultatul operatiei este de tip boolean, cand variabilele nu mai sunt extinse. ) Prin urmare, ori de cate ori se aplica o operatie unor variabile intregi de lungimi diferite, cea mai mica dintre ele este extinsa la aceeasi lungime cu variabila mai mare.
Singura situatie in care se lanseaza exceptia ArithmetricException este cea in care se incearca impartirea la zero, asa incat, inaintea unei operatii de impartire, trebuie sa testati daca impartitorul nu este zero.
In sectiunea " Expresii conditionale " veti gasi cateva exemple de verificare a valorilor numerice.
Ceva la fel de interesant se intampla atunci cand valoarea unui numar intreg depaseste domeniul de definitie. In acest caz , nu este lansata exceptia ArithmetricException. In schimb, valoarea variabilei este "rulata" la celalalt capat al domeniului. Iata un exemplu:
Class Intwrap
Public static void main ( string args [ ] )
byte startNumber = 120;
byte SmallNumber;
int LargeNumber;
SmallNumber = StartNumber;
For ( LargeNumber=0;LargeNumber < 16; LargeNumber++)
System. Out. Println ( " StartNumber (" + StartNumber + ") +
LargeNumber (" + LargeNumber + ") = " +
SmallNumber);
SmallNumber++;
Dupa ce salvati codul sursa de mai sus intr-un fisier numit IntWrap.java, puteti sa il compilati cu urmatoarea comanda:
Javac IntWrap.java
Pentru rularea programului, lansati urmatoarea comanda:
Java IntWrap
Rezultatele afisate de acest program ar trebui sa arate astfel:
StartNumber (120) + LargeNumber (0) = 120
StartNumber (120) + LargeNumber (1) = 121
StartNumber (120) + LargeNumber (2) = 122
StartNumber (120) + LargeNumber (3) = 123
StartNumber (120) + LargeNumber (4) = 124
StartNumber (120) + LargeNumber (5) = 125
StartNumber (120) + LargeNumber (6) = 126
StartNumber (120) + LargeNumber (7) = 127
StartNumber (120) + LargeNumber (8) = -128
StartNumber (120) + LargeNumber (9) = -127
StartNumber (120) + LargeNumber (10) = -126
StartNumber (120) + LargeNumber (11) = -125
StartNumber (120) + LargeNumber (12) = -124
StartNumber (120) + LargeNumber (13) = -123
StartNumber (120) + LargeNumber (14) = -122
StartNumber (120) + LargeNumber (15) = -121
Tipul de date char
Tipul de date char este, de fapt, un numar intreg fara semn pe 16 biti care reprezinta o valoare Unicode. Cu alte cuvinte, este posibila determinarea unui caracter Unicode si secventelor Escape, folosind o reprezentare numerica. Retineti ca toate caracterele, tiparibile sau netiparibile, au o valoare Unicode. Deoarece Java stocheaza toate caracterele cu valori Unicode, codul poate fi folosit, teoretic, in orice limba scrisa din lume. Este unul dintre avantajele limbajului Java. Din nefericire, in acest moment nu se fac prea multe eforturi pentru unificarea pe plan international a modului in care functiile si metodele, de exemplu, tiparesc datele, denumirile monetare, timpul si numere in functie de formatele locale.
Observatie: Unicode este un set international de caractere. Respectand standardul Unicode, Java poate tipari cu usurinta textul in mai multe limbi.
Tipuri de date in virgula mobila
Tipul de date float arata ca variabila respectiva este un numar in virgula mobila, pe 32 de biti, si are precizie simpla. Tipul de date double arata ca variabila respectiva este un numar in virgula mobila, pe 64 de biti, si are precizie dubla. Iata cateva exemple de declarare a unor variabile in virgula mobila:
Float SquareFootage;
Double GrossNationalProduct;
Tipul de date boolean
Datele de tip boolean pot avea numai valorile true si false. Din punctul de vedere al limbajului Java, o valoare de tip boolean este o valoare logica de un bit.
Alte limbaje de programare folosesc valorile 0 pentru false si 1 pentru true. Puteti face ca Java sa imite acest mod de lucru, daca este necesar. Ca si in limbajul de programare C, x:=0 va converti valoarea intreaga x la o valoare de tip boolean, dupa regula ca 0 inseamna false si orice altceva inseamna true. Pe de alta parte, in expresia y?1:0, variabila de tip boolean y va fi convertita la 0 daca este falsa si la 1 daca este adevarata.
Daca limbajul dumneavoastra "nativ" este C sau C++, puteti privi variabilele de tip boolean intr-o noua lumina. Acestea reprezinta cel mai bun mod de a indica esecul sau reusita unei operatii.
Rezumatul tipurilor de date primitive
Tipurile de date primitive sunt obiectele de pe nivelul cel de mai jos al limbajului Java. Ganditi-va la ele ca la niste elemente de date negrupate, cum ar fi numerele sau caracterele. Tipurile de date primitive pot avea o singura valoare la un moment dat, in cadrul unei aplicatii. Daca programatorul nu specifica o valoare de initializare, Java initializeaza toate tipurile de date primitive cu o valoare prestabilita. Variabilele intregi si cele in virgula mobila sunt initializate cu 0. Datele de tip char sunt initializate cu valoarea null, iar cele de tip boolean cu false.
Tipuri de date referinta
Exista situatii in care variabilele trebuie sa fie grupate din punct de vedere logic, astfel incat sa poata fi manipulate, deoarece accesul la ele trebuie sa se faca secvential sau identificatorii indica obiecte alocate dinamic. Acestea se numesc tipuri de date referinta ( sau referinte )
Amintiti-va ca un tip de data primitiva contine valoarea reala a unei variabile. Referintele nu contin valoarea reala, ci adresa din memorie la care este stocata valoarea respectiva. Avantajul consta in faptul ca referintele pot contine adrese care indica o colectie de alte tipuri de date. Datele indicate pot fi, la randul lor, tipuri de date primitive sau referinte.
Exista trei tipuri de referinte: matrice, clase si interfete. Despre clase si interfete vom discuta pe larg in capitolul 7, " Construirea obiectelor".
Matricele
Matricele ( arrays ) reprezinta grupuri unidimensionale sau multidimensionale de variabile. Imaginati-va ca mergeti sa faceti cumparaturi impreuna cu cineva la fel de entuziast ca si dumneavoastra. La un moment dat, intrebati: " Care este al treilea obiect din lista ?" ( La mine acasa, raspunsul ar fi: " Ti-as raspunde, daca ti-as intelege scrisul". Acesta este intotdeauna un bun motiv pentru discutii colaterale ) Lista de cumparaturi se aseamana cu o matrice. Fiecare articol din lista reprezinta un element, cea mai mica parte a unei matrice. Acest element este identificat prin pozitia sa din matrice, asa cum se intampla cu al treilea obiect din lista de cumparaturi.
Elementele matricei pot fi tipuri primitive de date, precum float, char sau int.De asemenea pot fi clase sau interfete. Matricele pot contine, la randul lor, alte matrice. Daca sunt folosite corespunzator, matricele constituiemun instrument de lucru flexibil si puternic.
Puteti sa declarati o matrice, fara sa alocati memoria necesara ei. Cu alte cuvinte, este creata variabila, dar in memorie nu se rezerva spatiu pentru obiectele matricei pana cand aceasta nu este initializata sau pana cand elementelor matricei nu le sunt atribuite valori. In general, matricele sunt initializate cu cu comanda new care creeaza o noua instanta a referintei. Aceasta comanda este, conceptual, asemanatoare cu comanda malloc din C sau cu new din C++. In Java, declararea tipurilor de date referinta nu creeaza automat spatiu in memorie pentru acestea, ci doar rezerva spatiu pentru adresa care va indica pozitia datelor de tipul respectiv.
Fragmentul de cod care urmeaza ilustreaza declararea unei matrice, crearea acesteia si atribuirea unei valori pentru un element al sau:
Class Array
Public static void main ( String args [] )
int LISTSIZE= 5;
string[] ShoppingList;
int I = LISTSIZE;
// crearea matricei
SchoppingList = new String [LISTSIZE] ;
//initializarea matricei
ShoppingList[ 0 ] =" carrots";
ShoppingList[ 1 ] = "tofu ";
ShoppingList[ 2 ] =" rice milk ";
ShoppingList[ 3 ] = " onions ";
ShoppingList[ 4 ] =" pasta noodles ";
for ( I= 0; i < LISTSIZE; i++ )
System. out. println ( ShoppingList [ i] ) ;
Dupa ce salvati codul sursa intr-un fisier numit Array. java, puteti sa il compilati cu urmatoarea comanda:
Javac Array. java
Pentru rularea programului, lansati urmatoarea comanda:
Java Array
Rezultatele afisate de acest program ar trebui sa fie urmatoarele:
carrots
tofu
rice milk
onions
pasta noodles
Mai multe despre matrice
Matricele unidimensionale sunt asemanatoare listei de cumparaturi din exemplul anterior. Nu exista decat o modalitate de referire la elementele matricei:folosirea unui indice corespunzator numarului elementului la care vreti sa ajungeti. Numarul folosit pentru referirea la un anumit element al matricei se numeste component. Acest concept este reprezentat in Java astfel:
Char ShowArray [ ] = new char [5] ;
In acest exemplu, ShowArray este numele matricei [5] declara ca matricea contine 5 elemente. Toate elementele sunt de tip char. Referirea la elemente se face prin ShowArray [0] pana la ShowArray [4]. In Java, indicii pornesc de la 0 si ajung pana la dimensiunea matricei -1. Comanda new initializeaza elementele matricei cu valoarea nul 1. In acest caz, matricei ii este alocat spatiul necesar pentru atribuirea valorilor corespunzatoare elementelor. Referirea la elementele matricei se realizeaza prin folosirea indicilor sau a componentilor. Prin urmare, ShowArray [1] = "j" atribuie valoarea j celui de-al doilea component al matricei.
Toate elementele unei matrice trebuie sa fie de acelasi tip.
Observatie: Teoretic toate matricele declarate in Java sunt unidimensionale. In realitate puteti sa definiti o matrice de matrice, care functioneaza ca o matrice bidimensionala. (Am subliniat aceasta caracteristice, deoarece in specificatiile tehnice ale limbajului Java se precizeaza ca toate matricele sunt unidimensionale.
Matricele bidimensionale au nevoie de doua puncte de referinta deoarece datele sunt stocate intr-o grila de linii si coloane. Ganditi-va la matricele bidimensionale ca la celulele dintr-o foaie de calcul tabelar. Un element al matricei este indicat prin specificarea liniei si a coloanei , de exemplu [3] [4]. Aceasta inseamna ca elementul care urmeaza sa fie manevrat se afla in linia 4, coloana 5 a matricei. (Nu uitati ca numararea elementelor matricei porneste de la 0!).
Expresii
Principalele motive pentru crearea codului unui program constau in manipularea, afisarea si stocare datelor. Expresiile (sau formularele) constituie modalitatea de efectuare a calculelor in Java. Operatorii folositi in expresii opereaza asupra variabilelor si indeplinesc diferite sarcini ale programelor. Expresiile din Java sunt asemanatoare cu cele din C si C++, reprezentand un subset al acestora.
Variabilele trebuie sa fie declarate inainte de a fi folosite. Daca incercati sa operati cu o variabila nedeclarata, va fi semnalata o eroare de compilare.
Expresia book = 4 foloseste operatorul = pentru a atribui variabilei book valoarea 4. Este absolut necesar sa intelegeti ce asteapta Java de la fiecare operator si care este sintaxa corecta a expresiilor, pentru a putea realiza ceva in acest limbaj. Pregatiti-va sa va exprimati in Java.
Folosirea operatorilor in expresii
Toate expresiile au ca rezultat o valoare. Operatorii precizeaza compilatorului Javac cum sa manipuleze variabilele si celelalte date, pentru a obtine rezultate corespunzatoare.
Operatii unare
Un operator care manipuleaza o singura valoare se numeste operator unar. Operatorii binari actioneaza asupra 2 valori.
Operatiile unare sunt utile pentru modificarea "pe loc" a variabilelor. (Programatorii C si C++ sunt probabil, familiarizati cu acest concept, care poate fi total necunoscut programatorilor COBOL sau BASIC ). Aceasta inseamna ca o variabila poate fi prelucrata intr-o anumita instanta fara sa fie necesara folosirea unei variabile intermediare si reatribuirea valorii catre variabila originala. Grozav! In Java, aceasta este o operatie simpla. Tabelul 6.11 prezinta operatorii unari.
Tabelul 6.11 Operatori unari
Operator Operatie
- Negare unara
~ Complement pe biti
++ Incrementare
- - Decrementare
! Negare
Operatorii de incrementare si de decrementare modifica valoarea variabilei originale. De exemplu, dupa executarea operatiei g++, valoarea variabilei g va fi incrementata cu o unitate. In mod asemanator, operatorul de decrementare va scadea valoarea variabilei g cu o unitate. Ceilalti operatori unari nu modifica valoarea variabilei originale, dar permit programatorului sa lucreze cu o variabila temporara. De exemplu, dupa executarea operatiei !g, valoarea variabilei g ramane nemodificata.
Operatia de incrementare creste valoarea variabilei cu o unitate, ca in exemplul urmator:
GoUp ++; // GoUp este incrementat cu o unitate
Operatia de decrementare descreste valoarea variabilei cu o unitate, ca in exemplul urmator:
GoDown - -; // GoDown este decrementat cu o unitate
Operatorul de complementare pe biti inverseaza structura pe biti a variabilei. Bitii 0 sunt transformati in 1, iar bitii 1 sunt transformati in 0. Negarea unara inmulteste valoarea variabilei cu -1, inversand de fapt, semnul unei variabile intregi de la negativ la pozitiv si de la pozitiv la negativ. Dar, schimbarea de semn are efect numai pe durata operatiei. Variabila propriu-zisa nu este modificata.
In exemplul urmator, este ilustrata folosirea operatorului de negare unara.
OppositeMe = -15
CheckMe = - OppositeMe + 1; // CheckMe are valoarea 16
System.out.println (OppositeMe); // OppositeMe are tot valoarea - 15
Un operator de atribuire stocheaza o anumita valoare intr-o zona de memorie alocata unei variabile. De exemplu, in expresia g += 5;, 5 este adaugat la valoarea initiala a variabilei g, iar rezultatul obtinut inlocuieste vechea valoare. Iata cateva exemple:
G = 5; // atribuie variabilei g valoarea 5
G - = 7 ; // atribuie variabilei g rezultatul operatiei g - 7
G * = 8; // atribuie variabilei g rezultatul operatiei g * 8
G / = 4 ; // atribuie variabilei g rezultatul operatiei g / 4
G % = 3; // atribuie variabilei g rezultatul operatiei g % 3
Operatii binare
In timp ce operatorii unari actioneaza asupra unei singure variabile, operatorii binari actioneaza asupra a doua variabile si returneaza o valoare. Nu se modifica decat variabila in care este stocata valoarea rezultata.
Sa luam ca exemplu o expresie simpla: c = b + 5. In acest exemplu, b + 5 este o operatie binara. In urma efectuarii operatiei, nu se modifica decat valoarea variabilei c, careia I se atribuie rezultatul operatiei. Variabila b ramane neschimbata. In expresiile simple, acest lucru este evident. Nu se poate spune acelasi lucru in cazul expresiilor mai complicate. Uneori, operatiile unare, cum ar fi incrementarea, se combina cu operatii binare, pentru crearea unor expresii complexe, in care se modifica mai multe variabile. Incercati sa impartiti aceste expresii complexe in unele mai simple. In acest fel, veti simplifica foarte mult operatiile ulterioare de depanare si intretinere a codului.
Expresiile intregi complexe impun folosirea separatorilor, pentru evitarea unor rezultate imprevizibile. Separatorii (parantezele, de exemplu) vor preciza compilatorului ordinea exacta de executare a operatiilor. Cu alte cuvinte, separatorii stabilesc precedenta. De exemplu, rezultatul operatiei 2 * 3 + 4 este 10 , iar rezultatul operatiei 2 * (3 + 4) este 14. In al doilea caz, separatorii modifica precedenta naturala a limbajului Java. Dupa acest exemplu, este momentul sa discutam despre ordinea de evaluare.
Ordinea de evaluare in limbajul Java
Java evalueaza expresiile de la stanga la dreapta, ca in exemplul urmator:
Class test {
Public static void main (String args [ ] )
{
int ChangeYou, ChangeMe = 2;
ChangeYou = (ChangeMe+=2) * (ChangeMe+3); // aceasta este linia
// importanta
System.out.println ("ChangeMe = " + ChangeMe);
System.out.println ("ChangeYou = " + ChangeYou);
}
}
Iata care sunt rezultatele afisate de acest cod:
ChangeMe = 4
ChangeYou = 28
In aceasta expresie, variabilele ChangeMe si ChangeYou sunt declarate de tip int si sunt initializate cu valoarea 2. Apoi, valoarea variabilei ChangeMe este incrementata cu 2, rezultand valoarea 4. La noua valoare a variabilei ChangeMe se adauga 3, rezultand valoarea 7. Cele doua valori obtinute intre paranteze, 4 si 7, sunt inmultite, rezultand valoarea 28, care este atribuita variabilei ChangeYou.
Acesta este un exemplu minor. Chiar si in acest caz, ar fi fost mult mai bine ca expresia complexa sa fie descompusa in mai multe expresii simple. Exemplul arata ca nu orice este posibil este si de dorit. Dar, puteti observa modul in care Java executa expresiile, de la stanga la dreapta.
O alta situatie in care trebuie sa va amintiti ca evaluarea expresiilor are loc de la stanga la dreapta este atunci cand folositi o expresie continand operatori cu acelasi nivel de precedenta. Ca urmare, daca intr-o expresie apar operatorii + si _, Java va rezolva expresia in ordine de la stanga la dreapta.
In tabelul 6.12 sunt prezentati operatorii Java, in ordinea descrescatoare a precedentei. Operatorii de pe acelasi rand au acelasi nivel de precedenta si sunt evaluati in aceeasi ordine.
Tabelul 6.12 Precedenta operatorilor, in ordine descrescatoare
Nivelul cel mai inalt Nivelul cel mai scazut
[ ] ( )
- - ! ~ instanceof
new (tip) expresie
* / %
+ -
<< >> >>>
< > < = > =
= = ! =
d
^
dd
| |
?:
= op =
Separatorii [ ] si ( ) modifica precedenta. Toate operatiile dintre aceste paranteze vor fi executate inaintea celor din afara lor. In interiorul parantezelor, Java respecta regulile obisnuite de precedenta, ca in exemplul urmator:
ConfuseMe = ( 3 * 2 + 3 ) + ( 6 + 4 / 2 );
Valoarea variabilei ConfuseMe este 17. Inmultirea are intaietate fata de adunare, asa incat prima operatie executata este 3 * 2, iar rezultatul este adunat cu 3. In urmatorul set de paranteze, impartirea are intaietate fata de adunare, asa incat prima operatie executata este 4 / 2, iar rezultatul este adunat cu 6. Valorile obtinute in cele doua paranteze, 9 si 8, sunt adunate, iar rezultatul este atribuit variabilei ConfuseMe.
Folosirea matricelor in expresii
Puteti sa folositi matricele si elementele acestora ca pe orice alte variabile. Nu sunt necesare variabile intermediare. Iata cateva exemple:
TestArray [0] = 4;
TestArray [1] = TestArray [0] * 1996; //Atribuie celui de-al doilea element
// al matricei, TestArray[1], valoarea
// valoarea primului element, TestArray
// [0] inmultita cu 1996
TestArray [2] ++ // Incrementeaza valoarea celui de-al
// treilea element, TestArray [2], cu o
// unitate
AnotherArray [45] = "Sir de caractere" ; // Atribuie un sir de caractere celui de-al
// 46-lea element al matricei AnotherArray
Asa cum reiese din exemplul de mai sus, elementele matricelor pot fi folosite in expresii, la fel ca orice alta variabila. Structura matricelor reprezinta o modalitate de grupare a mai multor articole, cu scopul de a simplifica accesul la ele.
Folosirea variabilelor de tip char in expresii
In expresii nu apar tipuri de date numerice. Variabilelor de tip caracter li se pot atribui valori tot in cadrul expresiilor. In exemplul urmator, veti vedea un fragment de cod in care este citit un caracter de tastatura:
Observatie: Multe dintre conceptele aplicate in secventa de cod
care urmeaza nu au fost inca discutate, dar nu va
faceti griji. Vom ajunge in curand si la acestea.
/ *
Acesta este un exemplu privind modul in care poate fi citit un caracter de la tastatura si atribuit unei variabile
*/
// declara o noua clasa
class GetCharFromKeyboard {
// declara o metoda in cadrul clasei
public static void main (String args[ ] )
// exceptii care pot fi generate aici
throws java.io.IOException
// incepe blocul de cod pentru aceasta metoda
{
// declara variabila KeyboardChar de tip caracter
char KeyboardChar;
// atribuie variabilei KeyboardChar intrarea de la tastatura
KeyboardChar = (char) System.in.read ( );
// afiseaza variabila KeyboardChar pe ecran
System.out.println(KeyboardChar);
//sfarsitul blocului de cod pentru metoda main
}
// sfarsitul declaratiei clasei GetCharFromKeyboard
}
Declaratii
Declaratiile definesc tipul variabilelor. In aceasta sectiune, veti studia cateva exemple de declaratii. Declaratiile pot fi inserate in orice punct al codului, dar, pentru lizibilitatea programului, se recomanda sa le grupati la inceputul sectiunilor de cod.
Blocurile sunt sectiuni de cod incadrate de acolade ( { } ). Ele reprezinta niste unitati logice de cod care apeleaza metode, calculeaza expresii, afiseaza rezultate si asa mai departe. O variabila declarata in cadrul unui bloc este valida in blocul respectiv si in toate sub-blocurile acestuia, care formeaza domeniul de existenta al identificatorului. Domeniul unei variabile nu depaseste spatiul delimitat de acoladele blocului;aceasta inseamna ca o variabila declarata in cadrul unui bloc nu are nici o semnificatie in afara blocului respectiv.
Observatie: In Java, puteti sa refolositi numele de identificatori in
blocurile si sub-blocurile unui program. Aceasta inseamna ca in memorie pot exista la un moment dat mai multi identificatori cu acelasi nume. Fiti atent cum folositi aceasta caracteristica a limbajului! Compilatorul nu verifica ca variabila este apelata , daca tipul acesteia nu se schimba.
Iata un exemplu de mascare a unei variabile, prin declararea altei variabile cu acelasi nume:
Class ShowHiding {
Public static void main (String args [ ] )
{
int TableTop;
TableTop = 2;
. . .
Switch (AnyCommand) {
Case ' 1 ' :
Int TableTop = 4; // TableTop a fost declarata din nou
// si a primit valoarea 4
break;
. . .
}
. . . . / * intoarcere la bucla principala * /
System.out.println(TableTop); /* TableTop are tot valoarea 2*/
In acest caz, a doua declaratie a variabilei TableTop este valida numai pentru blocul comenzii case. Orice valoare atribuita acestei variabile este valabila numai pentru blocul respectiv de instructiuni. Dupa ce programul reia executia blocului principal, orice valoare atribuita noii variabile se pierde. Concluzia este ca trebuie sa aveti motive intemeiate pentru folosirea unui nume de variabila de mai multe ori in acelasi program. Aveti grija ca aceasta sa nu se intample din greseala.
La exemplul anterior, au fost combinate o instructiune de declarare si o instructiune de atribuire
Int TableTop = 4;
A fost declarata o variabila de tip int, cu numele de identificare TableTop si valoarea 4.
Declararea tipurilor de date intregi
Variabilele de tip intreg ( integer ) sunt declarate in functie de spatiul de memorie folosit. ( Aceasta problema a fost discutata pe larg in sectiunea "Tipuri de date intregi" ). Iata cateva exemple de declaratii de variabile intregi:
byte ByteVar; // 8 biti
short ShortVar; // 16 biti
int Intvar; // 32 biti
long LongVar; // 64 biti
Variabilele in virgula mobila ocupa 32 sau 64 de biti. Iata cateva exemple de declaratii de variabile in virgula mobila:
Float FloatVar; // 32 de biti
Double DoubleVar; // 64 de biti
Declararea datelor de tip caracter
Variabilele de tip char (caracter) pot stoca un singur caracter, spre deosebire de obiectele clasei String, care contin grupuri de caractere. Retineti ca datele de tip char contin un numar intreg, corespunzator codului de caractere Unicode. In fragmentul urmator de cod sunt declarate doua variabile de tip caracter:
Char MyChar ; // contine un caracter
Char MyChar = ' y ' ; // declara variabila MyChar si ii atribuie valoarea y
Declararea matricelor
Matricele sunt discutate in detaliu in sectiunile "Tipuri de date" si "Expresii", din acest capitol. Ele reprezinta liste unidimensionale de obiecte, care pot fi indicate prin componenti sau prin indici. Matricele pot include alte matrice, rezultand matrice unidimensionale.
Matricele sunt declarate astfel:
Char MyCharArray [ ]; // matrice unidimensionala
Char AnotherArray [ ] [ ] ; // matrice bidimensionala
Int IntegerArray [ ]; // matrice unidimensionala de numere intregi
Int [ ] IntegerArray; // echivalent cu int IntegerArray [ ];
Fluxul de control
In acest capitol, au fost explicate elementele de baza ale programarii in limbajul Java: atomi, tipuri, expresii si declaratii. Expresiile, operatorii si separatorii pot fi combinati pentru manipularea datelor in diferite moduri. Totusi, lipseste ceva: posibilitatea de a lua decizii intr-un program. Aceste decizii instruiesc programul in legatura cu expresiile pe care trebuie sa le rezolve si valorile pe care trebuie sa le atribuie unei variabile. Solutia acestor probleme este fluxul de control. Fluxul de control instruieste programul cum sa ia o decizie si ce prelucrari ulterioare sa efectueze, in functie de decizia luata. Prin fluxul de control, calculatorul incepe sa gandeasca in locul dumneavoastra!
Blocurile de constructie pentru fluxul de control sunt delimitatorii de bloc { si }, precum si cuvintele cheie if, while, do, for si switch. Acestea pot fi folosite pentru a controla modul de executie a programului, determinand daca o anumita conditie este adevarata sau falsa si executand o alta sectiune de cod, in functie de rezultatul testarii. Este ceea ce se numeste o expresie conditionala.
Blocuri si instructiuni
O instructiune este o linie de cod care se incheie cu caracterul punct si virgula. O instructiune poate fi o expresie, un apel de metoda sau o declaratie. Un bloc este un grup de instructiuni care formeaza o singura instructiune compusa. Blocurile grupeaza logic instructiunile, in scopul de a imbunatati lizibilitatea programului si a-I simplifica fluxul de executie.
Cum ii comunicati mediului Java unde incepe si unde se termina un bloc de instructiuni? Prin acoladele care incadreaza fiecare bloc. De exemplu, sectiunea urmatoare este considerata un bloc de cod:
{
Store = " Grocery";
Item [0] = "Spinach";
Item [1] = "tofu";
Item [2] = "rice";
}
Atunci cand programul ajunge la acest bloc de cod, incepe executia de la acolada deschisa { si nu executa nici o instructiune din afara blocului pana cand nu ajunge la acolada inchisa }. Acolada deschisa si acolada inchisa impreuna cu toate instructiunile dintre ele formeaza un bloc. Daca acoladele nu sunt perechi, Java nu stie unde incep si unde se termina blocurile de instructiuni.
Expresii conditionale
Expresiile conditionale executa, in general, o sectiune de cod, pe baza verificarii unei conditii. Sectiunile de cod pot fi formate dintr-o singura instructiune sau din blocuri de instructiuni. Expresiile conditionale sunt utilizate pentru luarea deciziilor in programe. Ele verifica daca o conditie este adevarata sau falsa si, in functie de acest raspuns, executa diferite sectiuni de cod.
If
Cea mai simpla , dar cea mai importanta expresie conditionala este instructiunea if. Aceasta construieste o expresie conditionala de forma:
If ( expresie ) instructiune;
sau
if ( expresie )
{
instructiune ( i );
}
Daca expresia dintre paranteze are valoarea de tip boolean true ( adevarat ), este executata instructiune. Daca expresia este evaluata ca falsa, instructiune este sarita si executia continua de la prima instructiune care urmeaza dupa instructiunea if . Exemplul de cod care urmeaza ilustreaza modul de lucru al acestei instructiuni:
Int number; // declara variabila
Number = System. io. read ( ); // citeste un caracter de la tastatura
If ( ( Number 2 ) = = 0 ) // testeaza daca numarul este par si
System. out. println ( " par " ); // in acest caz afiseaza " par "
Retineti faptul ca metoda System.io.read ( ) citeste un singurcaracter de la tastatura la un moment dat, ceea ce inseamna ca programul manevreaza numai numere de o singura cifra. Daca introduceti un numar de mai multe cifre, va fi testata numai prima cifra a acestuia.
In acest exemplu, programul citeste un numar de la tastatura, apoi testeaza daca acest numar este par. Daca numarul este par, este executata instructiunea System.out.println I programul se incheie sau trece la urmatorul bloc de instructiuni.
Iata cum poate fi extins exemplul de mai sus:
Int number; // declara variabila
Number = System. io. read ( ); // citeste un numar de la tastatura
If ( ( Number 2 ) = = 0 ) // testeaza daca numarul este par
{ // inceputul blocului
System. out. println ( " par " ); // afiseaza " par "
} // sfarsitul blocului
Instructiunea if are si o componenta optionala, care ii extinde functionalitatea: instructiunea else. Instructiunea care urmeaza dupa expresia if este executata numai daca expresia este evaluata ca adevarata. Instructiunea care urmeaza dupa else este executata numai daca expresia este evaluata ca falsa:
int number; // declara variabila
Number = System. io. read ( ); // citeste un caracter de la tastatura
if ( ( Number 2 ) = = 0 ) // testeaza daca numarul este par
{ // inceputul blocului if
System. out. println ( " par " ); // afiseaza " par "
} // sfarsitul blocului if
else // altfel, daca numarul nu este par
} // inceputul blocului else
System. out. println ( " impar " ); // afiseaza " impar "
} //sfarsitul blocului else
Puteti folosi instructiuni if imbricate, daca aveti nevoie de ramificari complexe:
Char KeyboardChar // declara variabilele
Int Number;
System.out.println ( " Introduceti un numar : " ) // afiseaza invitatia
// de introducere a numarului
Number = System.io.read ( ); // citeste un caracter de
// la tastatura
if ( ( Number % 2 ) = = 0 ) //testeaza daca numarul este par
{ // inceputul blocului if
if ( Number < 5 )
{ // inceputul blocului if imbracat
System .out.println ( " par si mai mic decat 5 " ); // afiseaza un
// mesaj pe ecran
} // sfarsitul blocului if imbracat
else // daca numarul nu este mai mic decat 5
{ // inceputul blocului else imbracat
System.out.println ( " par si mai mare sau egal cu 5" );
// afiseaza un mesaj pe ecran
} // sfarsitul blocului else imbracat
} // sfarsitul blocului if
else // daca numarul este impar
{ // inceputul blocului else
if ( Number < 5 )
{ // inceputul blocului if imbracat
System.out.println ( " impar si mai mic decat 5 " ); //afiseaza
// un mesaj pe ecran
} // sfarsitul blocului if imbracat
else // daca numarul nu este mai mic decat 5
{ // inceputul blocului else imbracat
System.out.println.( "impar si mai mare sau egal cu 5 " ) ;
//afiseaza un mesaj pe ecran
} //sfarsitul blocului else imbracat
} //sfarsitul blocului else
Instructiunile if sunt puternice si apar in majoritatea programelor.if este o structura fundamentala de control, deoarece va permite sa testati aproape orice conditie.
switch
O varianta a instructiunii if este instructiunea switch, care realizeaza o ramificare multipla in locul celor doua ramuri care apar in cazul instructiunii if. Instructiunea switch are urmatoarea forma generala:
Switch ( expresie )
{
case valoare:
instructiuni;
break;
case valoare:
instructiuni;
break;
-
-
-
default
instructiuni;
break;
}
Constructia incepe cu cuvantul cheie switch. Parantezele incadreaza expresia care trebuie evaluata, iar rezultatul poate fi de tip byte, char, short sau int. In continuare, trebuie sa existe o acolada deschisa, urmata de oricate constructii care incep cu cuvantul cheie case si se termina cu cuvantul cheie break, cu un numar oarecare de instructiuni intre ele. Ultima sectiune, default, este optionala; ea se incheie tot cu cuvantul cheie break. Instructiunea switch se termina cu o acolada inchisa. In aceasta descriere, instructiunea pare destul de complicata, dar ea este usor de folosit, asa cum demonstreaza exemplul urmator.
Fiecare cuvant cheie case este urmat de o valoare, care trebuie sa fie tot de tip byte, char , short sau int. Instructiunea switch evalueaza expresia dintre paranteze, apoi parcurge instructiunile case, pana gaseste o valoare care coincide cu expresia evaluata.. In acel moment, executa instructiunile incadrate de cuvintele cheie case si break corespunzatoare valorii respective. Cand ajunge la instructiunea break, programul continua executia cu prima instructiune care urmeaza dupa constructia switch. Daca nici o valoare nu coincide cu expresia evaluata si exista sectiunea default, sunt executate instructiunile acestei sectiuni. In cazul in care nu exista o sectiune default, executia programului continua dupa constructia switch.
Nu este obligatoriu ca fiecare instructiune case sa aiba o instructiune break asociata.Daca instructiunea break nu exista, executia continua cu urmatoarele instructiuni case, pana la intalnirea unei instructiuni break. Asigurati-va ca nu ati uitat sa scrieti instructiunile break, daca doriti ca programul sa se comporte asa cum am aratat mai sus.
Iata un exemplu:
Static void ParseChar ( char KeyboardChar )
{
switch ( KeyboardChar ) {
case :` s ` :
System.out.println ( " stanga " ) ;
break;
case ` d `:
System.out.println ( " dreapta " ) ;
break
case ` t ` : // remarcati absenta instructiunii break;
//se trece la urmatoarea instructiune
case ` n ` :
break;
case `h`; // remarcati si aici absenta instructiunii break
default:
System.out.println ( " Sintaxa este: ( s ) tanga, (d ) reaptea,
(t)erminare " ) ;
System.out.println ( " Introduceti un caracter valid. " ) ;
KeyboardChar = ` ` ;
break;
}
}
In acest exemplu, expresia evaluata este de tip char si , ca urmare, toate instructiunile case contin o valoare de tip char.
Atentie! O greseala frecventa de programare este omiterea instructiunii break in locuri in care aceasta este necesara; rezultatul consta in executarea unor secvente de cod suplimentare.
Instructiunile case nu pot evalua siruri de caractere sau obiecte, asa cum se intampla in C si C++. In Java pot fi folosite numai elemente ale caror valori pot fi evaluate ca numere intregi. Va amintiti, desigur, ca valorile de tip char pot fi evaluate ca numere intregi. De multe ori, va veti dori ca instructiunea case sa poata manevra si obiecte mai complexe. Daca lucrati cu unul dintre tipurile de date permise sau daca puteti construi un index care foloseste unul dintre aceste tipuri, instructiunea switch poate fi o metoda eficienta pentru realizarea unor ramnificari complexe.
Expresii ciclare
Expresiile de ciclare executa ciclic o sectiune de cod, pana la indeplinirea unei anumite conditii. Unele expresii de ciclare fac verificarea conditiei inaintate de intrarea in bucla, iar altele dupa executarea instructiunilor.
while
Bucla while este o constructie care executa in mod repetat un bloc de instructiuni, atata timp cat o conditie de tip boolean ramane adevarata. Mai intai este evaluata expresia conditionala. Este posibil ca instructiunile care formeaza corpul buclei sa nu fie executate niciodata, daca expresia este evaluata ca falsa. Buclele while pot avea una din formele generale.
While (expresie) instructiune;
Sau
While (expresie)
{
instructiuni;
}
Constructia while incepe cu cuvantul cheie while. Parantezele incadreaza o expresie, care trebuie sa fie evaluata printr-o valoare de tip boolean. In continuare, constructia contine o instructiune sau un bloc de instructiuni.
Atunci cand programul intalneste o bucla while, el evalueaza mai intai expresia de tip boolean. Daca in urma evaluarii rezulta o valoare adevarata, sunt executate instructiunile care urmeaza dupa instructiunea while, cele care formeaza corpul buclei. Cand se ajunge la sfarsitul buclei, expresia de tip boolea este evaluata din nou. Daca aceasta este falsa, executia continua cu instructiunea care urmeaza dupa bucla while. Daca expresia este adevarata, corpul buclei este executat din nou, pana cand expresia este evaluata ca falsa.
Iata un exemplu:
Char KeyboardChar = (char)System.in.read( );
While (KeyboardChar != 'q')
{
ProcessChar (KeyboardChar);
KeyboardChar = (char)System.in.read ( );
}
Expresia de ciclare verifica daca variabila KeyboardChar este egala cu caracterul q . In caz contrar, este executat corpul buclei, care va prelucra caracterul citit de la tastatura si apoi va citi un nou caracter. Operatia continua, pana cand este citit de la tastatura caracterul q. Remarcati in exemplul de mai sus faptul ca variabila keyboardChar a fost initializata prin citirea unui caracter, inaintea de executarea buclei. Daca aceasta initializare nu ar fi fost facuta in mod explicit, ar fi fost posibil ca instructiunile din bucla while sa nu fie executate niciodata, in functie de valoarea pe care ar fi avut-o variabila keqboardChar. Aceasta este o alta eroare de programare care apare frecvent. Chiar daca variabila KeyboardChar ar fi fost initializata cu o alta valoare, aceasta ar fi fost prelucrata inainte ca utilizatorul sa aiba ocazia sa introduca vreun caracter.
Executia buclei while continua pana cand expresia este evaluata ca falsa. Daca aceasta nu se intampla niciodata, este posibil ca executia buclei while sa continue la nesfarsit; este ceea ce se numeste o bucla infinita. Una din cauzele aparitiei buclelor infinite este omiterea unei instructiuni care sa modifice o parte a expresiei evaluate in corpul buclei. Daca expresia nu se modifica niciodata, ea va fi evaluata intotdeauna la fel si va determina aparitia unei bucle infinite.
do - while
Bucla do permite executia repetata a unui bloc de cod, pana o expresie de tip boolean este evaluata ca falsa. Este similara cu bucla while, cu exceptia faptului ca evaluarea expresiei are loc la sfarsitul buclei, nu la inceputul ei. Aceasta inseamna ca instructiunile din corpul buclei vor fi executate cel putin o data. Buclele do - while pot avea una din formele generale:
do instructiune ; while ( expresie );
sau
do
{
instructiuni;
}while ( expresie );
Constructia incepe cu cuvantul cheie do. Urmeaza o instructiune sau un bloc de instructiuni, apoi cuvantul cheie while si parantezele continand expresia care trebuie sa fie evaluata printr-o valoare de tip boolean.
Atunci cand programul intalneste o bucla do, el executa instructiunile care urmeaza dupa cuvantul cheie do. La terminarea instructiunilor din corpul buclei, este evaluata expresia de tip boolean. Daca aceasta este falsa, executia continua cu instructiunea care urmeaza dupa bucla do. In cazul in care expresia este adevarata, corpul buclei este executat din nou, pana cand expresia este evaluata ca falsa.
Iata un exemplu:
Do
{
KeyboardChar = (char)System.in.read( );
ProcessChar (KeyboardChar);
} while (KeyboardChar != "q")
In acest exemplu, este executat corpul buclei, care citeste un caracter si il prelucreaza. Apoi este evaluata expresia, pentru a verifica daca variabila KeyboardChar este egala cu caracterul q;in caz afirmativ, executia continua de la instructiunea care urmeaza dupa bucla do. In caz contrar, corpul buclei este executat din nou pana cand este citit caracterul q.
Comparati aceasta versiune cu exemplul anterior, care folosea o bucla while. Acum nu mai este necesara initializarea variabilei KeyboardChar, deoarece citirea unui caracter se face la inceputul buclei. Acesta este motivul principal pentru care programatorii prefera sa foloseasca bucla do.
Ca si in cazul buclei while, este posibila crearea unei bucle infinite, daca uitati sa scrieti in corpul buclei o instructiune care sa modifice o parte a expresiei evaluate.
for
Bucla for permite executia repetata a unui bloc de cod, pana cand o expresie de tip booleanesteevaluata ca falsa. Este asemanatoare cu bucla while, dar mai specializata. Ca si in cazul acesteia, expresia conditionala este evaluata la inceputul buclei. Bucla for va pune insa la dispozitiemijloace explicite pentru initializarea variabilei de ciclare si modificarea acesteia la sfarsitul buclei. Bucla for poate avea una din formele generale:
for (initializare; expresie; modificare) instructiune;
sau
for (initializare; expresie; modificare)
instructiuni;
Constructia incepe cu cuvantul cheie for. Parantezele incadreaza o initializare, o expresie si o modificare. Initializare poate fi orice tip de instructiune, insa de obicei scopul sau este de a initialiiza o parte a expresiei. Initializarea este urmata de caracterul punct si virgula si de o expresie. Ca si in cazul buclelor while si do, expresia trebuie sa fie evaluata printr-o valoare de tip boolean. Urmeaza un alt caracter punct si virgula si apoi o modificare. Aceasta poate fi o instructiune oarecare, insa de obicei este folosita pentru a modifica o parte a expresiei. Constructia se incheie cu o instructiune sau un bloc de instructiuni.
Atunci cand programul intalneste o bucla for, el executa mai intai instructiunea de initializare, apoi evalueaza expresia de tip boolean. Daca in urma evaluarii rezulta o valoare adevarata, sunt executate instructiunile care urmeaza dupa instructiunea for, cele care formeaza corpul buclei. Cand se ajunge la sfarsitul buclei, este executata instructiunea de modificare a variabilei de ciclare, apoi expresia booleana este evaluata din nou. Daca aceasta este falsa, executia continua cu instructiunea care urmeaza dupa bucla for. Daca expresia este adevarata, corpul buclei este executat din nou, pana cand expresia este evaluata ca falsa.
Iata un exemplu:
For (char KeyboardChar = ProcessChar (KeyboardChar) ; KeyboardChar != "q";
KeyboardChar = (char) System.in.read( ) )
{
ProcessChar (KeyboardChar);
}
In acest exemplu, variabila KeyboardChar este initializata prin citirea unui caracter. Apoi este evaluata expresia, pentru a verifica daca variabila KeyboardChar este egala cu caracterul q. In acest caz, executia continua cu prima instructiune de dupa bucla for. In caz contrar, este executat corpul buclei, care prelucreaza caracterul citit de la tastatura si citeste un alt caracter, pana cand este citit caracterul q.
Puteti folosi buclele for pentru parcurgerea unui domeniu de valori. Aceasta se face cu ajutorul matricelor sau al altor tipuri de indecsi. Iata un exemplu:
Int Array;
For (i=0; i< ArraySize; i++)
{
if (Array [i] < 0 )
{
System.out.println (" EROARE: a aparut un numar negativ, index="+i);
}
else
{
ProcessArray (Array[i]);
}
}
Aceasta bucla initializeaza variabila I cu valoarea 0 si parcurge matricea Array in cautarea valorilor negative, inainte de prelucrarea unei intrari. Aceasta este o metoda de scriere a codului compacta si usor de asimilat.
Ca si in cazul buclelor while si do, este posibila crearea unei bucle infinite, daca omiteti sa scrieti in corpul buclei o instructiune care sa modifice o parte a expresiei evaluate.
break
Constructia break poate fi folosita pentru intreruperea unei bucle de tip for, do si while. (In acest capitol, am discutat deja despre folosirea instructiunii break in cadrul instructiunii switch.) La aparitia unei instructiuni break, bucla curenta este oprita si executia continua de la instructiunea urmatoare.
Iata cum poate fi extinsa bucla for din exemplul de mai sus:
Int ix;
For (ix=0; ix < ArraySize; ix++)
{
if (Array[ix] < 0)
{
System.out.println("EROARE: a aparut un numar negativ,index="+ix);
Break;
}
ProcessArray (Array[ix] );
}
Ca si in exemplul anterior, acest cod va determina parcurgerea matricei Array, in cautarea elementelor negative. Insa, datorita instructiunii break, executia buclei for se intrerupe la gasirea primului element negativ. In acest exemplu, existenta unui element negativ poate fi considerata suficient de grava pentru a se renunta la orice prelucrare ulterioara. Remarcati ca nu este necesara o instructiune else, deoarece, in cazul aparitiei unei erori, executia programului continua de la prima instructiune de dupa bucla for, sarind peste toate instructiunile de prelucrare.
Constructia continue poate fi folosita pentru scurtcircuitarea partiala a buclelor for, do sau while. La aparitia unei instructiuni continue, executia se reia dela prima instructiune a buclei, sarind peste secventele de cod cuprinse intre instructiunea continue si sfarsitul buclei.
Bucla for prezentata mai jos foloseste constructia continue:
int ix;
for (ix=0; ix<ArraySize; ix++)
{
if (Array[ix]<0)
{
System.out.println("EROARE: aaparut un numar negativ,index= "+ix);
Continue;
}
ProcessArray(Array[ix]);
}
Ca si in exemplul anterior, acest cod va determina parcurgerea matricei Array, in cautarea elementelor negative. Insa, datorita instructiunii continue, la gasirea primului element negativ, executia nu mai continua in corpul buclei for. In acest exemplu, se poate considera ca existenta unui element negativ este ilegala si, prin urmare, acesta nu trebuie prelucrat. Totusi, situatia nu este suficient de grava pentru a se renunta la orice prelucrare ulterioara. Remarcati ca nici aici nu este necesara instructiunea else, deoarece, in cazul aparitiei unei erori, executia programului se reia de la prima instructiune din bucla for, sarind peste toate instructiunile de prelucrare.
Buclele etichetate
Instructiunile break si continue va conduc la sfarsitul sau la inceputul unei bucle. Ce faceti insa daca aveti mai multe bucle imbricate si vreti sa iesiti din toate deodata? Java va pune la dispozitie o extensia a instructiunilor break si continue, special in acest scop. Prin adaugarea unei etichete si referirea la aceasta intr-o instructiune break sau continue, puteti face ca executia programului sa continue de la inceputul sau de la sfarsitul buclei pe care o alegeti dumneavoastra.
Iata un exemplu:
Err:
For (ix=0; ix < ArraySize; ix++ )
{
for (j=0; j < ArraySize; j++ )
{
if (ArraySize[ix] [j] <0)
{
System.out.println ("EROARE: a aparut un numar negativ,
Þindex=" + ix + "," +j );
break err;
}
ProcessArray (Array [ix] [ jy] );
}
}
In acest exemplu, matricea Array este extinsa la doua dimensiuni si, pentru parcurgerea tuturor elementelor sale, sunt folosite doua bucle for. Daca apare un element negativ, executia programului se ramnifica spre sfarsitul buclei etichetate cu err, nu al buclei interioare, asa cum ar fi normal. Fara aceasta constructie, ar fi fost nevoie de inca o variabila de semnalare (semafor), testata in bucla exterioara. Eticheta trebuie sa apara imediat inaintea buclei pe care o marcheaza; daca este plasata in alta parte, va fi semnalata o eroare de compilare.
Iesirea din mijlocul unei bucle se realizeaza in C++ si in unele implementari ale limbajului C cu ajutorul unei instructiuni goto. Aceasta da posibilitatea saltului la orice punct din cod, ceea ce poate conduce la asa-numitul cod spaghetti. Desigur, recunoastem acest tip de cod in programele altora, dar niciodata in ale noastre! Conceptul buclelor etichetate din Java permite intreruperea buclelor, dar limiteaza domeniul de valori. Este o solutie de compromis.
Acest capitol trateaza elementele de baza ale limbajului de programare Java. Aveti la dispozitie numeroase exemple privind folosirea atomilor, a valorilor literale, a tipurilor de date, a expresiilor, a declaratiilor si a fluxului de control. Toate aceste elemente constituie fundamentul oricarui program sau aplicatii dezvoltate in Java. Capitolul poate fi folosit si ca referinta pentru sintaxa corecta a instructiunilor. Veti avansa pe calea dezvoltarii unor aplicatii puternice in Java, atunci cand veti combina aceste informatii cu cele din capitolul urmator.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1189
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved