#InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Introducere in Programare cu Java: Invata Pas cu Pas cum sa programezi in Java Ramon Nastase _____________________________________________________________________ 1 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Copyright 2018 Ramon Nastase – Toate drepturile rezervate. Continutul acestei carti nu poate fi reprodus, duplicat sau transmis fara permisiunea directa scrisa din partea autorului. In niciun caz nu va fi suportata raspunderea juridica sau vina de catre editor pentru orice reparare, dauna sau pierderi financiare datorate informatilor din aceasta carte, direct sau indirect. Aviz juridic Aceasta carte este protejata prin drepturi de autor. Acest lucru este numai pentru uz personal. Nu puteți modifica, distribui, vinde, utiliza, cita sau parafraza orice parte sau continut al acestei carti fara consimtamantul autorului. Notificare privind renuntarea la raspundere Retineti ca informatiile continute in acest document sunt numai pentru scopuri educationale si divertisment. Au fost facute toate incercarile de a furniza informatii exacte, actualizate si fiabile. Nu sunt exprimate sau implicate garantii de niciun fel. Cititorii recunosc ca autorul nu se angajeaza in furnizarea de consultanta juridica, financiara, medicala sau profesionala. Continutul acestei carti a fost derivat din diverse surse. Prin citirea acestui document, cititorul este de acord ca in niciun caz autorul nu este responsabil pentru orice pierderi, directe sau indirecte, care apar ca urmare a utilizarii informatiilor continute in acest document, inclusiv, dar fara a se limita la omisiuni sau inexactitati. _____________________________________________________________________ 2 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Introducere In primul rand vreau sa te felicit si sa iti multumesc pentru faptul ca ai luat decizia de a investi in tine si de a deveni mai bun. Vreau sa iti spun ca acest ghid te va lua de la 0 (in domeniul programarii in Java) si te va duce la un nivel de baza astfel incat sa fii constient de modul in care functioneaza programarea si mai ales modul in care poti crea aceste programe. Odata ce vei parcurge aceasta carte, vei putea sa intelegi elementele de baza si cele medii care tin de programarea in Java. Practic vei fi capabil sa-ti creezi propriile programe si vei fi pregatit sa incepi sa aprofundezi conceptele de programare. Dupa terminarea cartii iti recomand sa te apuci de rezolvarea problemelor, cu scopul de a te ajuta pe tine sa devii un programator si mai bun astfel incat sa obtii oricand doresti un job in IT (in tara sau in strainatate). Hai sa-ti arat cateva dintre lucrurile pe care le vei invata aici: ● Cum arata domeniul IT si care sunt trendurile ● Ce poti sa faci cu JAVA ● Cum sa incepi programarea in Java in doar 30 de minute (instalare si crearea primului program) ● Elemente de sintaxa si programare in Java ● Folosirea instructiunilor conditionale (if, for, while, switch) ● Concepte de baza despre POO ● Lucrul cu fisiere si cu exceptii in Java ● Structuri de date folosite pentru crearea diferitilor algoritmi ● Si multe altele :) Aceasta carte este structurata pe 9 capitole care cuprind diferite teme, apartinand conceptelor de baza din Programare (in Java). Un lucru pe care vreau sa-l stii este faptul ca daca acum incepi pentru prima oara in IT, aceasta carte este un start destul de bun si iti va oferi tot ce ai nevoie cand vine vorba de elementele de baza. Tot ce ai tu de facut este sa urmezi pas cu pas informatiile si sfaturile din aceasta carte si sa depui efortul necesar pentru a ajunge acolo unde iti doresti. Asa ca iti doresc mult succes si spor la treaba. Ramon, cel care te sustine in procesul tau de crestere. PS: iar daca ai intrebari nu ezita sa ma contactezi pe email, Facebook sau Y ouTube. _____________________________________________________________________ 3 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Cuprins Introducere 3 Cuprins 4 Capitolul 0 - Introducere in Programare Ce poti face cu Java si de ce sa inveti programare? 1) Java pentru Android 2) Java pentru Programare Server Side De ce sa incepi cu programarea in Java? Cat de mare este concurenta cand vine vorba de programarea in Java? Ce oportunitati de angajare ai ca programator (in Romania)? Ce limbaje de programare poti sa inveti pentru a deveni programator? 7 7 7 8 8 8 8 9 Capitolul 1 - Introducere in Programare in limbajul Java De ce sa inveti Java? La ce te poate ajuta? De ce avem nevoie pentru a programa in Java? Cum instalez si cum pornesc Eclipse? Cum Creez un Proiect in IDE-ul Eclipse? Cum Creez Main Class in Eclipse ? Comentarii in Java Exercitii 11 11 12 13 14 18 22 23 Capitolul 2 - Variabile in Java Ce este o variabila? Variabile de tip numar (int, float, double) Variabile de tip String (siruri de caractere) Exercitii 24 24 24 26 29 Capitolul 3 - Instructiuni conditionale (if, for, while) 1.1) Instructiunea IF 1.2) Instructiunea ELSE 2) Instructiunea FOR 3) Instructiunea WHILE 4) Instructiunea SWITCH Exercitii 31 31 34 37 40 41 43 _____________________________________________________________________ 4 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 4 - Metode in Java Ce Este o Functie (Metoda) ? Metode care nu intorc un rezultat Metode care intorc un rezultat Exercitii 45 45 46 51 56 Capitolul 5 - Concepte de POO in Java 1) Concepte teoretice despre POO POO vs. Programare Procedurala Clase si Obiecte Beneficiile POO Scurt rezumat a celor discutate mai sus 2) Clase in Java Ce este o clasa? 3) Constructori si Destructori Ce este un constructor in POO? Ce este un destructor in POO? Folosirea constructoriilor in Java 4) Getters & Setter Exercitii 57 57 57 58 59 59 60 60 68 68 68 68 73 79 Capitolul 6 - Exceptiile in Programare si Operatiile cu Fisiere in Java I. Exceptii in Java Ce sunt exceptiile? Cum sunt generate exceptiile in Java? Cum tratam exceptiile in Java? Exercitii II. Operatii cu Fisiere in Java Exercitii 82 82 82 82 84 90 91 96 Capitolul 7 - Structuri de Date in Java Ce sunt structurile de date? Tipuri de structuri de date 1) Vectori (Arrays) Cum folosim un Vector in Java? 2) Liste inlantuite (Linked Lists) Ce este si cum functioneaza o Lista? Care sunt functiile unei Liste? 97 97 97 98 98 102 102 103 _____________________________________________________________________ 5 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Cum folosim o Lista (inlantuita) in Java? 3) Stiva (Stack) Ce este si cum functioneaza o Stiva? Care sunt functiile unei Stive? Cum folosim o Stiva in Java? 4) Coada (Queue) Ce este si cum functioneaza o Coada? Care sunt functiile unei Cozi? Cum folosim o Coada in Java? Cand folosim cozile si ce aplicabilitate practica au? 5) Dictionare (Hash Maps) Ce este si cum functioneaza un Dictionar? Care sunt functiile unei HashMap? Cum folosim un HashMap (Dictionar) in Java? Cand folosim Dictionarele si ce aplicabilitate practica au? BONUS: Capitolul 8 - Versiunea codului cu Git si GitHub Ce este Git si GitHub? Cum folosim Git pentru versionarea codului? Cum urcam codul pe GitHub? 103 107 107 107 108 112 112 112 112 113 116 116 117 118 119 121 121 122 123 _____________________________________________________________________ 6 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 0 - Introducere in Programare Ce poti face cu Java si de ce sa inveti programare? Marea majoritate a companiilor de IT cer ca programatorii sa cunoasca bine limbajul Java (sau un alt limbaj de programare) pentru ca acesta este un limbaj foarte raspandit si, bineinteles, extrem de utilizat. Cererea pentru programatori Java este tot mai mare deoarece acest limbaj este perfect pentru crearea de aplicatii. Comparandu-l cu C si C++, Java este mai usor de invatat si de scris. Acest limbaj a fost conceput sa fie mai usor de scris si sa genereze mai putine erori de programare (in comparatie cu C si C++). Daca nu vrei sa-ti bati prea mult capul cu detaliile in care te poti pierde, te sfatuiesc sa inveti Java pentru ca programarea este mai rapida in acest limbaj, iar proiectele tale vor prinde viata mai usor. Este atat de simplu si de usor de folosit incat si un incepator poate ajunge sa-l stapaneasca intr-un timp destul de scurt. Bineinteles, nu este mai usor de inteles decat Python, dar ocupa cu siguranta locul 2 dupa acesta atunci cand vine vorba de principii de programare si de sintaxa. 1) Java pentru Android Cererea tot mai mare de Java este justificata prin faptul ca Android este construit in Java. Asta inseamna ca aplicatiile pentru acest sistem sunt facute in Java si ca si tu poti oricand crea o astfel de aplicatie, doar cunoscand limbajul de programare tocmai mentionat. Nu ai nevoie decat de Eclipse si de ceva cunostinte solide de Java pentru a dezvolta diverse aplicatii pentru Android. Apartinand de Google, Android este open-source, asa ca poti sa-ti aduci oricand contributia la el. Tot ce se gaseste in Google Play este creat in Java, iar daca iti vei face timp sa intelegi si sa inveti acest limbaj, o sa ti se para usor si o sa vezi cum multe aplicatii pentru Android functioneaza. Daca te intrebai ce poti face cu Java, crearea de aplicatii pentru Google Play este o idee buna. _____________________________________________________________________ 7 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 2) Java pentru Programare Server Side Un alt lucru pe care il poti face cu Java este sa creezi aplicatii de corporate pentru business-uri foarte mari. Mai exact, sa-l folosesti pe partea de Server Side. IBM si Oracle folosesc tot timpul Java pentru partea lor de aplicatii. Daca vrei sa fii unul din programatorii care lucreaza la acesti giganti din industria IT, este absolut obligatoriu sa cunosti Java, ba chiar sa fii expert in domeniu. Bineinteles ca este nevoie de mult exercitiu si sa faci chiar nenumarate incercari prin crearea de aplicatii. Doar cu rabdare si studiu intens poti deveni un programator Java bun, mai ales ca acest limbaj de programare este usor de inteles si nu te poti trezi cu erori la fiecare pas atunci cand programezi. De ce sa incepi cu programarea in Java? Daca doar ce te-ai apucat de programare, te sfatuiesc sa incepi cu Java pentru ca este un bun punct de intrare in domeniu. Nu conteaza daca vrei sa te axezi pe algoritmica, programare GUI sau networking, in Java poti face toate aceste lucruri. In cazul in care nu te-ai hotarat inca, poti sa accesezi tutorialele de Java pe care le-am pregatit pentru tine si sa decizi cat de mult rezonezi cu acest limbaj. Pana la urma este OOP (Object Oriented Programming), deci inca de la inceput vei avea acces la ceea ce asta inseamna si iti vei da seama de cat de puternic este de fapt acest limbaj de programare. Cat de mare este concurenta cand vine vorba de programarea in Java? Daca te intrebai cate lume cunoaste programarea in Java, afla ca domeniul IT duce lipsa de astfel de programatori si companiile sunt in mare cautare de specialisti in Java (si nu numai), pentru ca cererea de aplicatii in acest limbaj este tot mai mare. Cu alte cuvinte, nu vei intampina probleme in gasirea unui loc de munca daca ajungi sa cunosti Java si poti crea aplicatii cat mai interesante folosindu-te de acest limbaj. Exista desigur si varianta crearii unei aplicatii de succes si comercializarea ei, ceea ce iti poate aduce o considerabila sursa de venit si recunoastere ca programator de succes. Acum este sansa ta, profita de ea! Ce oportunitati de angajare ai ca programator (in Romania)? Piata IT-ului din Romania este in continua crestere din 2012. In momentul de fata vorbim de peste 125.000 de IT-isti care lucreaza in IMM-urile si in multi-nationalele din Romania. Indiferent ca vorbim de dezvoltare software sau de livrare de servicii, putem fi de acord _____________________________________________________________________ 8 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ ca domeniul IT in momentul de fata reprezinta o reala oportunitate de cariera pentru oricine isi doreste sa o urmeze. Daca doresti sa te angajezi in IT, iti pot spune ca acesta este cel mai bun moment si iti recomand sa te grabesti. Iti recomand sa te grabesti pentru ca marea majoritate a companiilor angajeaza (si nu au doar 1 - 2 posturi deschise, ci zeci poate chiar sute). Ca sa-ti faci o idee de cat de mare este aceasta nevoie de personal, te las sa te convingi singur de aceste cifre: Facultatile de profil (IT/informatica) din Romania livreaza anual 6000 - 7000 de absolventi pe piata muncii, nevoia find cel putin dubla. Aici este oportunitatea, sansa ta de reusita. Si pot sa-ti spun ca daca faci tot ce iti sta in putinta sa inveti constant, sa dobandesti abilitati noi si sa exersezi incontinuu conceptele pe care le vei studia in aceasta carte (si dincolo de ea), eu sunt convins ca tu vei reusi. Tot ce ai nevoie sa faci este sa te hotaresti pe ce ramura a IT-ului vrei sa mergi (daca citesti aceasta carte, cel mai probabil, ai ales deja), sa faci research ce se cere in piata, de catre angajatori (la nivel de abilitati si tehnologii), si sa te apuci de treaba sa dobandesti acele abilitati astfel incat sa te angajezi in IT. Sper ca ai observat ca am spus abilitati si nu diplome. E important sa intelegi ca oricine se poate angaja in IT, intrebarea e cine isi va face o cariera din asta? (aka. va rezista si va evolua), cine va avea un succes real dpvd profesional si financiar?, cine va fi pasionat si cu adevarat implinit de ceea ce face zi de zi la locul de munca? Eu sper ca acesta vei fi tu. De aceea iti doresc mult succes si spor la invatat si mai ales la aplicat de-a lungul acestei carti. Ce limbaje de programare poti sa inveti pentru a deveni programator? Primesc foarte des aceasta intrebare si consider ca acum e un moment bun pentru a raspunde la ea. Pe scurt, raspunsul e … depinde. Depinde ce anume iti doresti, depinde ce anume te pasioneaza cand vine vorba de IT si pe ce ramura vrei sa dezvolti mai departe programe si aplicatii. Important de retinut este ca experienta nu consta in numarul de limbaje cunoscute, ci mai degraba in cunostintele acumulate in cadrul fiecarui limbaj de programare cunoscut, in parte. O intrebare des intalnita inainte de inceperea parcurgerii unui limbaj este urmatoarea: “Am nevoie de matematica in programare?”, raspunsul la aceasta intrebare este unul impartit. O intrebare auxiliara care trebuie adresata este: “Ce vrei sa faci cu limbajul pe care urmeaza sa il utilizezi?” , daca vrei sa lucrezi ca Web Developer si vei folosi limbaje din aceasta speta, cel mai probabil nu, dar daca vei lucra pe post de Machine Learning Expert, atunci probabil te vei lovi ceva mai mult de matematica. In orice caz, important este sa nu te lasi descurajat de matematica, un limbaj de programare poate fi invatat si fara aceasta, iar rolul ei nu este esential la _____________________________________________________________________ 9 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ inceput. Pe langa toate acestea, nu exista un limbaj “nefolositor”, fiecare are rolul sau si este adaptat pentru un anumit set de nevoi si cerinte. Acum hai sa vedem ce limbaj de programare poti sa inveti (in functie de ce iti doresti sa faci pe termen lung): ● C / C++ – Limbaje perfecte pentru proiecte low-level, des intalnite in reprogramarea sistemului de operare si utilizate de placutele Arduino, pentru diferite proiecte de automatizare / robotica. ● HTML + CSS + JavaScript – Un combo excelent pentru realizare de pagini web statice. Cel mai popular framework care include aceste limbaje de marcare este Bootstrap, un framework dezvoltat de catre creatorii aplicatiei Twitter. ● PHP – Realizarea Backend-ului pentru o pagina web interactiva, limbaj intalnit si in inlocuirea Shell Script-ului pe Linux. Doua dintre framework-urile populare pentru acest limbaj sunt Laravel si Symfony, de asemenea PHP-ul este adesea folosit impreauna cu SQL-ul, folosit in programarea bazelor de date. ● Java / C# / Swift – Limbaje destinate aplicatiilor mobile pentru Android, Microsoft sau Apple. ● Python, Perl, Ruby – Aceste trei limbaje, sunt catalogate ca limbaje de scripting, deoarece sunt cel mai des intalnite in automatizari. Ultimul dintre acestea, Ruby, poate fi folosit ca inlocuitor al PHP-ului, prin framework-ul Ruby on Rails, destinat Web Developing-ului. Cele de mai sus sunt cele mai populare din sutele de limbaje de programare existente. Unele din aceste limbaje sunt compilate (C/C++/C#), la acestea este nevoie de un compilator, iar altele sunt interpretate (Python, PHP, Perl), unde sistemul va citi linie cu linie pentru a pune in aplicare instructiunile. Cel mai important este sa iti alegi un limbaj care se potriveste nevoilor tale si sa incepi sa il practici si sa cunosti cat mai bine. In cele ce urmeaza vom studia in detaliu limbajul Java si iti voi explica pas cu pas cum sa-l setezi la tine pe laptop si cum sa te apuci in doar cateva minute de programat. Hai sa mergem la urmatorul capitol ;) _____________________________________________________________________ 10 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 1 - Introducere in Programare in limbajul Java In acest prim capitol introductiv in Java vom discuta despre acest limbaj, astfel incat sa stii de ce anume inveti Java. De asemenea vei afla cum sa-ti setezi mediul de dezvoltare (aka. IDE) astfel incat sa incepi sa programezi… si bineinteles vei afla cum sa-ti creezi primul program in limbajul Java. La sfarsitul acestui capitol (precum si a celorlalte) vei avea un set de exercitii practice pe care te invit sa le rezolvi, asta te va ajuta sa-ti imbunatatesti cunostintele practice de programare (in general si in Java). Focusul acestei carti va fi si pe partea teoretica, dar mai ales pe partea practica prin exemplele pe care ti le voi arata pe parcursul capitolelor si prin exercitiile de final de capitol (pe care te invit sa le rezolvi). Si acum, hai sa trecem la treaba :) De ce sa inveti Java? La ce te poate ajuta? Java este un limbaj de programare care a fost creat de James Gosling in anii ‘90. Dupa cum am mai spus, seamana foarte mult cu C++. Asta pentru ca C++ este si el limbaj orientat pe obiecte, insa Java e limbaj pur orientat pe obiecte. Pe langa asta, Java foloseste compilator si interpretor, intre timp ce C si C++ folosesc doar compilatorul. Avantajul folosirii limbajului Java fata de celelalte doua este ca, acesta este independent de platforma, deci poti rula codul executat pe un alt sistem de operare. Astfel, daca ai un program scris in Java si e gata compilat, il poti rula pe orice platforma care are JVM (Java Virtual Machine - Masina Virtuala Java - mediu in care programul Java e executat). Un alt super-avantaj (spune eu ca e super :D) consta in faptul ca in Java permite conectivitatea la bazele de date, fapt care ne ajuta sa cream si sa programam aplicatii mult mai eficient. In figura 1.1 de mai jos poti vedea tot procesul de editare, compilare si executie a codului in Java. IDE-ul Eclipse (despre care vom vorbi imediat), vine la pachet cu toate acestea, deci nu-ti fa griji. Programul tau va functia in urma apasarii unui singur buton :) Figura 1.1 _____________________________________________________________________ 11 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Java este un limbaj foarte cunoscut si de viitor, extrem de folosit de catre foarte multe tehnologii. Poate ai auzit de Android, sistem de operare pentru dispozitive mobile (smartphones, tablete, smartwatches, smart TVs etc.), care este construit in Java. Foarte utilizat de oameni in intreaga lume, Android foloseste Java pentru a functiona. Figura 1.2 Cunoscand limbajul de programare Java vei putea construi aplicatii in Android si pentru servere, mai ales pe partea de Enterprise, unde este foarte folosit. Hai sa incepem si sa vedem elementele de care ai nevoie pentru a incepe programarea in Java. In urmatoarele tutoriale o sa te invat sa scrii cod si sa iti exersezi modul in care programezi, pentru a te ajuta sa devii mai eficient. De ce avem nevoie pentru a programa in Java? Pentru a avea acces la Java, vei avea nevoie de Eclipse. Eclipse este un IDE, un mediu de dezvoltare in care tu poti sa scrii cod Java. Acest IDE va compila codul tau si ti-l va rula. Java functioneaza pe orice sistem de operare. Astfel ca, daca vei lua codul pe care l-ai scris intr-un fisier si vei incerca sa il rulezi pe MacOS, Windows sau Linux, acel cod va rula. Cu o simpla cautare a cuvantului “eclipse” in Google, vei primi rezultate ce te vor trimite la pagina de download a programului. Descarca Eclipse Oxygen de AICI. Ai si alte alternative, dar eu iti recomand Oxygen. Urmatorul pas este descarcarea altor programe care iti compileaza si iti fac programul in Java sa functioneze. Eclipse este doar un mediu grafic de dezvoltare. Ai nevoie Java Runtime Environment (JRE), care este practic locul in care va lucra programul tau, si Java Development Kit (JDK). Acestea doua iti recomand sa le descarci de pe site-ul Oracle, versiunea 1.8, folosind Java 1.8. Pe acest site vei avea tot ceea ce ai nevoie. _____________________________________________________________________ 12 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Este important sa treci prin acest proces de instalare pentru ca altfel nu vei putea rula programele. Odata ce esti pe site-ul de la Oracle, cauta, de exemplu, JDK. Vei primi rezultatele la tot ceea ce ai nevoie pentru a programa in Java. In cele mai multe cazuri, este vorba de varianta 64 de biti ce va trebui descarcata. Cauta JRE si fa acelasi lucru. Sau, daca nu vrei sa cauti, poti descarca cele 2 programe dand un click pe link-urile mai jos: ● JRE (Java Runtime Environment): https://goo.gl/CfGbzE ● JDK (Java Development Kit): https://goo.gl/ycgamA Cum instalez si cum pornesc Eclipse? Dupa ce ai descarcat Eclipse-ul, te poti apuca de descarcare. Dupa ce l-ai descarcat, da dublu click si treci prin procesul de instalare care este destul de simplu. La un moment dat, o sa observi ca ai mai multe resurse din care poti alege. Ai, de exemplu, Eclipse IDE for Java Developers, Eclipse IDE for Java EE Developers si asa mai departe. In Eclipse poti sa folosesti mai multe limbaje de programare si in mai multe scopuri. Poti sa folosesti Eclipse pentru C++, pentru JavaScript sau Web Development si pentru PHP. Eu iti recomand sa folosesti prima varianta, Eclipse IDE for Java Developers. Da click pe ea si aceasta se va instala, creandu-ti o iconita pe desktop sub numele de Java Eclipse Oxygen. Da dublu-click pe Java Eclipse Oxygen si vei vedea ca iti va cere sa iti creezi un workspace, adica un loc in care toate uneltele si toate proiectele pe care le creezi vor fi puse. Aici se va si salva tot ceea ce tu ai scris in cod, ca de fiecare data cand deschizi acest program sa poti ajunge la ceea ce ai scris. Apasa Launch si totul va fi default (dupa cum poti sa vezi si in figura 1.3). De fiecare data cand vei porni acest program vei primi aceasta intrebare despre worskpace. Vei putea selecta fiecare workspace pe care l-ai creat. _____________________________________________________________________ 13 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.3 Cum Creez un Proiect in IDE-ul Eclipse? Mai departe, primul lucru pe care poti sa il faci este sa creezi un proiect. Te vei duce la File, New, unde poti vedea ca ai mai multe optiuni. Ceea ce tu vei face este sa creezi un proiect in care vei pune codul tau. Dar nu vei pune acolo cod pur si simplu. Java functioneaza in felul urmator, ai nevoie de un proiect (gandeste-te la acest proiect ca la un folder), dupa care ai pachete (in acest proiect). Acestea contin la randul lor clase. In Java, fiecare fisier va determina o clasa. Aceasta este OOP (Object Oriented Programming), adica Programare Orientat pe Obiecte. Daca inca nu iti este clar ce sunt clasele, vei putea urmari sau citi un alt tutorial in care voi explica totul despre elementele esentiale in Programarea Orientata pe Obiecte. Nu voi intra acum in detalii. O sa iti explic mai tarziu ce sunt clasele, ce sunt obiectele si toti acesti termeni cu care va trebui sa te obisnuiesti. Dar sa trecem mai departe. _____________________________________________________________________ 14 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.4 Creeaza proiectul si alege-i un nume. Lasa totul pe default. Vei fi intrebat ce environment vei dori sa folosesti pentru a rula. Lasa elementele asa cum sunt. Daca nu ai instalat corect JDE-ul si JDK-ul, toate aceste lucruri despre care vorbesc nu vor aparea pe ecranul tau, iar programul nu va functiona. _____________________________________________________________________ 15 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 1 Figura 1.5 Daca totul este in regula, proiectul pe care tocmai l-ai inceput ti se va deschide. Apasand sageata din dreptul numelui proiectului, in stanga, vei vedea ca ai JRE System Library si SRC. Acestea sunt cateva librarii care exista by default si care contin cateva functii. Un limbaj de programare este slab fara functii si librarii scrise de alte persoane. Scopul sau este sa iti puna totul la dispozitie, iar tu sa te folosesti de functiile lui pentru a scrie cod mut mai rapid si mai eficient. _____________________________________________________________________ 16 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.6 Figura 1.7 _____________________________________________________________________ 17 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Cum Creez Main Class in Eclipse ? Dute la SRC si da click-dreapta. Vei vedea ca trebuie sa creezi o noua clasa si sa ii dai nume. Alege, de exemplu numele MainClass si apasa Finish. Ti se va crea o clasa in care vei putea scrie cod. Aceasta clasa o vei folosi pe post de Main. Java functioneaza la fel ca C++ cand vine vorba de clase. Numai scrierea este un pic diferita. Figura 1.8 Daca in C++ avem int main(), in Java avem public static void main() (figura 1.6), adica locurile in care noi vom crea si vom executa anumite functii, metode si clase pe care le-am creat. Aici se uneste toata ierarhia cu toate clasele. Aici vei pune tot, si aici (in main() ) vei rula toate functiile. Exista un fisier principal, de obicei numit Main Class, iar in rest vei avea diferite clase care vor da o anumita functionalitate programului. Toate aceste clase trebuie undeva executate si rulate rand pe rand, iar Main este tocmai pentru acest scop. Mai departe tot ce trebuie sa facem este sa incepem sa scriem cod. In primul rand (daca nu ai mai interactionat cu Java sau cu un alt limbaj de tip OOP), iti recomand sa scrii acest program care va afisa pe ecran un text: System.out.println("Hello World"); _____________________________________________________________________ 18 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.9 Codul tau va arata similar cu cel din figura 1.9 de mai sus, dupa care vei apasa pe butonul verde de “Run”, care va compila si va rula programul pe care l-ai creat (dupa cum poti sa vezi in figura 1.10 de mai jos). Figura 1.10 Dupa aceea te va intreba daca vrei sa salvezi programul si iti recomand sa apesi pe “OK” pentru a-l putea executa, iar rezultatul final va fi afisat in consola din Eclipse (sau oricarea ar fi IDE-ul tau). _____________________________________________________________________ 19 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.11 Aceasta linie de cod ne va afisa in consola textul "Hello World" cu un spatiu dupa aceasta. Daca vrem sa afisam un simplu text fara a adauga un spatiu la final atunci vom recurge la functia: System.out.print("Hello World"); Dupa cum poti sa vezi in figura 1.12 de mai jos, aceasta functie print ( de mai sus) este una similara cu println, doar ca se comporta putin diferit cand vine vorba de afisarea textului pe ecran sau in consola. Functia aceasta nu va afisa textul cu o linie noua dupa el dupa cum poti sa vezi in figura 1.11 de pe urmatoarea pagina. Totodata, in timp ce ai scris tot acest cod si diferitele functii, banuiesc ca ai descoperit si feature-ul de autocomplete a IDE-ului Eclipse (mai ales in momentul in care ai apasat butonul pentru "."). Este un feature pe care eu il consider extrem de util si care iti va salva mult timp (si nervi :D) pe masura ce vei incepe sa-ti creezi propriile programe si proiecte, precum si la job. Vei vedea pe parcurs ce inveti sa programezi mai bine si faci mai mult cat de util iti va fi. Astfel poti programa mult mai usor fara a avea nevoie de cunostinte legate de sintaxa exacta a liniei de cod. Java si Eclipse ne permit sa facem astfel de lucruri. _____________________________________________________________________ 20 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 1.13 Figura 1.14 _____________________________________________________________________ 21 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Comentarii in Java In Java, precum si in marea majoritate a limbajelor de programare, avem la dispozitie sa comentam diverse aspecte ale codului pe care noi il scriem. Aceste comentarii pot fi extrem de benefice din mai multe puncte de vedere: unul dintre ele ar fi faptul ca poti lasa comentarii despre ce face o secventa de cod - o functie, o clasa etc- (aka. documentezi codul astfel incat tu sau alte persoane sa inteleaga ceea ce face acesta). Un alt motiv ar fi sa invalidezi o secventa de cod deja existenta (adica vei face ca acea secventa sa nu fie compilata si executata). Acum propun sa iti arat 2 exemple astfel incat tu sa intelegi mult mai bine la ce ma refer: public class Main { public static void main(String args[]) { /acesta este un comentariu in care pot sa scriu orice / System.out.println("Se va afisa acest text"); } /* Testul de mai jos nu se va afisa */ //System.out.println("Acest text nu se va afisa"); } Rezultatul afisat pe ecran va fi: Figura 1.15 Dupa cum poti vedea in cele 2 exemple de mai sus, avem 2 moduri prin care putem lasa un comentariu: primul fiind cel cu //, iar cel al 2-lea fiind cel cu /* */. Ambele variante sunt folosite, doar ca varianta a doua ne permite sa comentam secvente mult mai lungi (care se intind pe mai multe randuri) de text. _____________________________________________________________________ 22 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Incepand cu acest capitol, la fiecare final de capitol iti voi pune la dispozitie un set de exercitii pe care tu sa le practici, ele te vor ajuta sa-ti intaresti in minte conceptele deja studiate si sa aprofundezi si mai mult studiul programarii. Setul de Exercitii #1 1) Scrie un program care sa afiseze prenumele tau pe primul rand, iar pe urmatorul rand numele. 2) Acum, modifica codul de la punctul anterior, astfel incat la afisare prima linie (adica primul rand) sa fie goala, a doua linie sa contina prenumele, a treia linie sa fie goala, iar pe a patra linie sa apara numele. Setul de Exercitii #2 1) Daca ar trebui sa scrii un program care afiseaza cate o litera din numele si prenume tau, cum l-ai scrie folosind doar cunostintele din acest capitol (fara a te complica cu alte functii sau metode): S t a n A n a Setul de Exercitii #3 1) Afiseaza prenumele astfel incat literele sa apara pe diagonala, in felul urmator: S t a n A n a _____________________________________________________________________ 23 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 2 - Variabile in Java In acest capitol trecem mai departe cu conceptele de programare si vorbim despre variabile. Vei vedea cum sa le folosesti pentru a face diferite lucruri in Java. Fie ca este vorba de calcule matematice, retinerea de valori sau manipulari cu sirurilor de caractere, o sa vezi cum poti folosi variabilele. Ce este o variabila? In programare variabila este o locatie de memorie care poate pastra o valoare de un anumit tip. Practic, este un mod prin care programul nostru poate retine (in memorie) anumite informatii de mai multe tipuri. Aceste tipuri difera de la caz la caz, dar in general acestea pot fi numere (naturale, intregi sau reale), caractere (sau siruri de caractere aka. string-uri), expresii booleane (True sau False - 1 sau 0). Un aspect important pe care doresc sa-l mentionez este faptul ca variabilele isi pot schimba valoarea pe care o stocheaza in memorie (de obicei prin mai multe moduri: prin schimbare manuala sau prin atribuiri, respectiv operatii matematice). In cele ce urmeaza le vom lua pe rand pe fiecare in parte si vom vedea cum le putem defini si folosi in programare. Variabile de tip numar (int, float, double) Pentru inceput, propun sa luam variabilele de tip numar si sa vorbim mai multe despre ele. Acestea pot fi de mai multe feluri, dupa cum am spus si mai devreme si anume: ● Numere naturale - unsigned int ● Numere intregi - int ● Numere reale - f loat s au double In exemplul de mai jos poti sa vezi cum se declara aceste variabile si cum le putem atribuii o valoarea. unsigned int x = 5; int y = -10; Acestea sunt exemple de variabile pe care tu le poti folosi in Java sau in alte limbje de programare. Int i nseamna integer, adica numere intregi. Pot fi atat valori pozitive, cat si negative, atata timp cat nu au virgula. Daca vrem numere cu virgula, adica numere rationale, putem folosi float: float a = 5.1f; float b = 6.2f; _____________________________________________________________________ 24 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Am pus f la final ca sa specificam clar ca acestea sunt float. Putem avea fie float, fie double. Sunt diferite moduri prin care putem defini aceste numere rationale. Figura 2.1 Acum, hai sa facem o operatie (matematica) cu aceste variabile (si anume sa calculam suma dintre x si y): int sum = x + y; Printam ceea ce am scris mai devreme pe ecran: System.out.println(sum); Dupa ce vom da Run, va aparea in partea de jos a ecranului suma, care este 15. Acum hai sa scriem putin mai frumos. Tot ceea ce scriem cu ghilimele in Java este un sir de caractere. Astfel, vom printa in consola: System.out.println("The total sum is:" + sum); Va trebui sa punem semnul plus “+” , deoarece “The total sum is:” reprezinta un string, iar sum e ste pur si simplu un numar. Noi va trebui sa facem o operatie ca “+”, in care suma se va atasa pur si simplu string-ului, devenind per total un string. Vom da Run din nou, si vom vedea cum pe ecran va aparea: The total sum is: 15 _____________________________________________________________________ 25 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 2.2 Si iata si rezultatul operatiei de mai devreme, il poti vedea afisat in consola din figura 2.3 de mai jos: Figura 2.3 Variabile de tip String (siruri de caractere) Mergand mai departe vom avea de-a face cu variabile de tip caracter si cele de tip String (aka. Siruri de caracter). Pentru a crea un caracter, vom folosi urmatoarea sercventa de cod: char a = 'a'; System.out.println(a); Hai sa cream si un String: String abc = "Abc"; System.out.println(abc); Daca rulam tot ceea ce am scris pana acum in program, va aparea pe ecran: a Abc _____________________________________________________________________ 26 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Daca ar fi sa scriem: abc = abc + "a"; cand vom da: System.out.println(abc); vom vedea pe ecran ca lui Abc i se va mai adauga inca o litera, inca un string care va fi a. Astfel, ceea ce va aparea printat pe ecran va fi: Abc Abca Te poti juca in foarte multe moduri cu string-urile. Poti face foarte multe. Toate variabilele (int, float) sunt scrise cu litere mici. Acestea sunt variabilele clasice embedded in Java, ce pot fi gasite in orice limbaj de programare, indiferent ca e vorba de C++, Python sau alte limbaje. Aici, string-ul este o clasa, o variabila mai speciala, pentru ca isi poate insusi anumite functii, anumite metode. De exemplu, daca inlocuim: System.out.println(abc); cu: System.out.println(abc.); vom primi foarte multe functii, sub-functii ale lui abc. (scris cu punct dupa cele 3 litere). Acestea ne ofera diferite valori sau informatii cu care putem sa folosim acest string si sa-l manipulam. Putem selecta: System.out.println(abc.length()); si vom primi numarul de caractere din acest sir abc. Vei observa ca nu putem sa facem acelasi lucru in: System.out.println("The total sum is:" + sum); adaugand: System.out.println("The total sum is:" + sum.length); Variabila int suma nu a fost conceputa in acest mod. Aceasta este frumusetea in Java. Putem folosi string-uri speciale care sunt de fapt clase in spate, care ne ofera anumite abilitati in plus cand vine vorba de functii. Si aceste functii sunt foarte benefice. Vei vedea, in timp, ca le vei folosi foarte, foarte des. Acesta este un avantaj al programarii in Java: poti crea astfel de clase si poti avea foarte multe functii in spate, ale diferitelor obiecte. _____________________________________________________________________ 27 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 2.4 Figura 2.5 Stiu ca am vorbit un pic mai detaliat despre programarea orientata pe obiecte, dar nu te ingrijora, vor urma alte tutoriale mai in detaliu. Pana atunci, poti incerca sa faci alte lucruri: adaugare de elemente, scaderi, diferite siruri, etc. Cauta pe Google alte diferite tutoriale despre cum sa faci lucruri in Java si aplica-le. _____________________________________________________________________ 28 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Felicitari pentru faptul ca ai ajuns la sectiunea de exercitii din acest capitol. Iata programele pe care te rog sa le creezi: 1) Creeaza cate o variabila de tipul: string, int si float, dupa cum urmeaza: Variabila de tip unsigned int va retine valoarea 20 Variabila de tip int va retine valoarea - 5 Variabila de tip float va retine valoarea 8 .73 Variabila de tip String retine valoarea “Java” Variabila de tip String retine valoarea “I mi place programarea in ” Variabila de tip String retine valoarea “ pentru ca suma acestor 2 numere este: ” Variabila de tip char retine valoarea “! ” Avand aceste variabile, afiseaza pe ecran un mesaj (care sa aiba cat de cat sens :D ) cu acestea. 2) Scrie un program care calculeaza valoarea pentru urmatoarele variabile de tip float: x = -7 + 4/3*5 y = -7 + 4/(3*5) z = (-7 + 4/3)*5 Afiseaza aceste valori in felul urmator pe ecran: x = …valoare care se va calcula pentru x… y = …valoare care se va calcula pentru y… z = …valoare care se va calcula pentru z... Observa care sunt diferentele dintre cele trei valori afisate. Acum incearca sa schimbi tipurile acestor variabile in int si ruleaza programul. Ce se intampla? _____________________________________________________________________ 29 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ _____________________________________________________________________ 30 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 3 - Instructiuni conditionale (if, for, while) In acest capitol vom discuta despre elementele de baza din programare (instructiunile) care fac logica programarii posibila. Aceste instructiuni ne contureaza programele si le ofera o logica (o structura) pe care sa o urmeze cu scopul de a ne ajuta sa rezolvam probleme mult mai complicate. Cand vorbim despre instructiunile conditionale ale limbajelor de programare, avem la dispozitie urmatoarele: ● Instructiunea if - daca se respecta conditia X, atunci se intampla Y ● Instructiunea w hile - cat timp se respecta conditia X, se intampla Y ● Instructiunea f or - pentru o anumita conditie X, (cat timp aceasta este respectata) se intampla Y ● Instructiunea switch - daca se respecta conditia X, atunci se intampla A, daca nu, se intampla B, daca nu, se intampla C, daca nu, se intampla D... 1.1) Instructiunea IF Daca ai mai avut de-a face cu programarea, atunci cel mai probabil te-ai intalnit cu aceasta instructiune IF. Ea este una dintre cele mai folosite si cunoscute instructiuni si este intalnita in marea majoritate a limbajelor de programare (C/C++, Java, Python, PHP, Ruby, Bash etc.). Functia ei este clara si simpla: sa verifice valoarea de adevar a unei expresii (ex: “5 > 3?” , aceasta expresie este adevarata). In cazul in care expresia este adevarata se va merge mai departe cu executarea instructiunilor din blocul IF. Asadar, sintaxa de cod pentru instructiunea IF arata in felul urmator: if ( conditie ) { instructiune 1; instructiune 2; ... } if ( conditie ) { instructiune 1; instructiune 2; ... } _____________________________________________________________________ 31 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ La nivel fundamental, cam asa arata instructiunea IF. Va exista o conditie care va rezulta o valoare de adevar (fie ea Adevarata sau Falsa). In cazul in care aceasta valoare este Adevarata (ex: 5 > 3), se vor executa instructiunea 1, instructiunea 2, instructiunea 3. Altfel, in cazul in care nu este adevarata conditia (de exemplu pentru 5 > 8), programul va trece de blocul de date if si nu se vor executa cele 3 instructiuni. Poate te intrebi ce reprezinta aceste conditii. Ei bine, conditiile din instructiunea IF pot fi operatii (comparatii) matematice, precum cele de mai jos: ● ● ● ● ● ● A > B - se verifica daca A este mai mare ca B A < B - se verifica daca A este mai mic ca B A >= B - se verifica daca A este mai mare SAU egal ca B A <= B - se verifica daca A este mai mic SAU egal ca B A == B - se verifica daca A este egal cu B A != B - se verifica daca A este diferit de B Toate acestea sunt operatii matematice care vor rezulta o valoarea de adevar: fie ea falsa sau adevarata. Daca instructiunea if are o conditie ADEVARATA, atunci va continua cu executarea instructiunilor din acoladele { }, in caz contrar (daca acea conditie este FALSA), se va trece peste acele instructiuni ( din { } ). Da-mi voie sa-ti dau un exemplu pentru a intelege mult mai bine : int a = 5; int res = 0; if ( a > 3 ) { res = a + 1; } System.out.println(res); Care crezi ca va fi rezultatul afisat al secventei de cod de mai sus? Dupa cum probabil ai raspuns, rezultatul este 6. Iar acum haide sa vedem de ce. Initial am declarat doua variabile (a si res), dupa care am creat un bloc de instructiuni, folosind IF, in care am testat (verificat) daca valoarea lui a este mai mare decat numarul 3. Expresia aceasta este adevarata pentru propozitia “5 este mai mare decat 3”, ceea ce inseamna ca programul nostru merge mai departe si intra in blocul de date IF, unde are loc acea operatie matematica si se atribuie lui res r ezultatul adunarii lui 1 cu 5, adica 6. _____________________________________________________________________ 32 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Astfel, in momentul afisarii, rezultatul res va fi 6 (dupa cum poti sa vezi si in figura 3.1 de mai jos). Daca expresia din IF ar fi aratat in felul urmator: int a = 5; int res = 0; if ( a > 8 ) { res = a + 1; } System.out.println(res); Atunci rezultatul ar fi fost total diferit: valoarea afisata a lui res, in acest caz, este 0. De ce? Pentru ca in cazul acesta a ( care are valoarea 5) este mai mic fata de 8, iar expresia (a > 8) devine falsa, deci programul nu va mai executa codul dintre acolade { }, ci va merge mai departe la afisarea valorii lui res. Toate acestea poti sa le vezi in figura de mai jos: Figura 3.1 In sectiunea de exercitii de la sfarsitul acestui capitol vei avea ocazia sa te joci mai mult cu aceasta instructiune IF pentru ca vei avea mai multe programe pe care sa le creezi cu scopul de a stapanii cat mai bine programarea :) _____________________________________________________________________ 33 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 1.2) Instructiunea ELSE Instructiunea IF este extrem de benefica, deoarece ne permite sa comparam sau sa luam anumite decizii logice pe baza rezultatului conditiei (adevarat sau fals). De multe ori in programare vor exista situatii in care trebuie sa comparam mai multe conditii si sa luam decizii specifice pe baza lor. Unele conditii sunt adevarate intr-o anumita situatie, iar altele nu. Forma generala a acestor conditii alternative poate arata in felul urmator: if ( conditie 1 ) { instructiune 1; .... } else { instructiune 2; ... } Dupa cum poti sa vezi, avem IF-ul cu prima conditie (care daca este adevarata va fi executata instructiunea 1) , iar in cazul in care aceasta conditie nu este adevarata se ajunge la executarea instructiunii 2 din else. Hai sa luam un exemplu prin care sa intelegi mult mai bine ce vreau sa spun: int a = 2; int res = 0; if ( a > 3 ) { res = a - 1; } else { res = a + 1; } System.out.println(res); In acest exemplu, poti sa vezi ca in cazul in care a este mai mare decat 3, atunci res v a avea valoarea a - 1. Daca aceasta conditie este falsa (a nu este mai mic decat 3, ceea ce in acest exemplu asa este), programul va trece de instructiunile din blocul if si va merge mai departe in blocul else, unde va executa instructiunea de adunare (res = a + 1), iar apoi va afisa rezultatul 3. Orice valoarea a lui a care nu respecta a > 3, va ajunge sa execute instructiunea din blocul else. _____________________________________________________________________ 34 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Daca ar fi sa mergem mai departe si sa fim si mai specifici in alegerea rezultatului dorit, putem structura IF-urile in formatul urmator: if ( conditie 1 ) { instructiune 1; .... } else if ( conditie 2 ) { instructiune 2; ... } else if ( conditie 3 ) { instructiune 3; ... } Iar mai jos poti sa vezi exemplul: int a = 2; int res = 0; if ( a > 3 ) { res = a - 1; } else if ( a == 3 ){ res = a; } else if ( a < 3 ) { res = a + 1; } else { System.out.println("Nu exista un rezultat pentru res"); } System.out.println(res); In exemplul de mai sus poti sa vezi un exemplu mai detaliat despre cum poti sa folosesti instructiunea IF, combinand si instructiunea ELSE. Indiferent ca este vorba de ELSE IF sau pur si simplu ELSE, putem executa instructiuni diferite daca conditia initiala (din primul IF) nu a fost indeplinita. Acesta este o metoda foarte buna pe care o putem folosi cand vrem sa rezolvam anumite probleme (cu programul nostru) pentru ca ne va fi mult mai usor sa _____________________________________________________________________ 35 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ filtram si sa executam instructiunile (codul) corecte. Iata, in figura 3.2 de mai jos poti sa vezi aceste exemple “puse in actiune” in Eclipse. Figura 3.2 _____________________________________________________________________ 36 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 2) Instructiunea FOR Mergand mai departe cu subiectul legat de instructiunile conditionale din programare, am ajuns la instructiunea FOR. O instructiune care ne permite sa-i spunem programului nostru sa execute un cod in mod repetat (atat timp cat se respecta o conditie). Gandeste-te in felul urmator: cum ar fi daca am avea 10 operatiuni de verificat, iar in urma fiecareia sa efectuam un anumit calcul sau sa afisam un rezultat. Cu cele invatate pana acum, am vazut ca se poate face asta, doar ca mica problema ar consta in faptul ca ar trebui sa facem totul manual. Practic, pentru fiecare operatiune de verificare (folosind IF), ar trebui sa scriem manual fiecare secventa de cod. Problema cu metoda asta e ca necesita mult timp, nu e scalabila, iar in timp va consuma multa memorie. Hai sa-ti dau un exemplu concret. Iata mai jos o secventa de cod scrisa cu instructiunea IF, fara a folosi IF ELSE ori ELSE: int i = 0; int suma = 0; int a = 5; if ( i == 0 ) { suma = suma + a; i++; } if ( i == 1) { suma = suma + a + i; i++; } if ( i == 2) { suma += a + i; i++; } if ( i == 3 ) { suma += a + i; i++; } System.out.println("Suma este: " + suma); _____________________________________________________________________ 37 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ In aceasta secventa de cod poti sa vezi ca am calculat o anumita suma in functie de variabila a si i. Rezultatul acestei sume este: 26. In aceasta situatie, a este pur si simplu o variabila int careia i-am asignat o valoare, iar i este un iterator (o variabila care contorizeaza numarul de procesari). Dupa fiecare calculare a sumei, acest iterator i va fi incrementat (prin i++) , iar valoarea acestuia va creste cu 1. In programarea in Java, C++, expresia i++ este echivalenta cu i = i + 1;. Acum hai sa-ti arat aceeasi secventa de cod, dar de data asta scrisa cu FOR: int suma = 0; int a = 5; for (int i = 0; i <= 3; i++) { suma += a + i; } System.out.println("Suma este: " + suma); Dupa cum poti sa vezi in aceasta secventa de cod, lucrurile au fost mult simplificate prin instructiunea FOR: 1. In care am declarat o variabila iterator i - int i = 0. 2. Urmata de o conditie - i <= 3 - care spune: “ruleaza aceasta bucla atat timp cat i are valoarea mai mica sau egala cu 3”. 3. Iar valoarea lui i este incrementata (i++ - creste cu 1) dupa fiecare iteratie, atat timp cat conditia este adevarata. Dupa cum poti sa vezi, in aceasta situatie, FOR face diferenta dpvd. al codului, al executiei acestuia si al memorie consumate. Toate sunt in favoarea celei de a doua secvente de cod. Ideea aici consta in task-uri repetitive, practic, bucle. Prin FOR putem crea bucle (loops) care sa verifice/opereze diferite secvente de cod, in mod repetat. Vei vedea putin mai tarziu in aceasta carte, cum putem folosi FOR atunci cand vine vorba de structuri de date (parcurgerea, modificarea, verificarea lor), de clase si obiecte, iar astfel vei avea o idee mult mai buna despre utilizarea acestei instructiuni. Dupa cum am spus si la inceputul acestui capitol instructiunile conditionale (IF, FOR, WHILE) stau la baza majoritatii limbajelor de programare si este modul prin care noi putem programa calculatorul, astfel incat sa ne folosim intr-un mod cat mai benefic (noua) si eficient de resursele acestuia. _____________________________________________________________________ 38 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ In figura 3.3 de mai jos poti sa vezi cum arata secventele de cod exemplificate mai devreme: Figura 3.3 _____________________________________________________________________ 39 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 3) Instructiunea WHILE Instructiunea WHILE are o functionalitate similara cu cea a FOR-ului, doar ca se foloseste putin diferit. Cand folosim WHILE putem gandi problema in felul urmator: cat timp se intampla X, executa Y. Pe de alta parte, cand folosim FOR, gandim problema in urmatorul mod: pentru o anumita conditie X, se intampla Y. Cele 2 abordari seamana, dar sunt usor diferite (sunt folosite in contexte diferite). Buclele FOR sunt folosite mai des in momentul in care se cunoaste numarul fix de iteratii care trebuie sa aiba loc pe parcursul rularii programului, iar WHILE folosim cand nu cunoastem acest numar. O bucla WHILE se poate folosi cand dorim sa rulam un program la infinit (prin while (1) { } ). Deci formatul standard pentru aceasta bucla este: int contor = 0; while ( contor < 100 ) { instructiune 1; ... contor++; } Sa reluam secventa de cod de mai devreme: int suma = 0; int a = 5; for (int i = 0; i <= 3; i++) { suma += a + i; } System.out.println("Suma este: " + suma); Iar acum iata aceeasi varianta, dar cu instructiunea while: int suma = 0; int a = 5; int i = 0; while ( i <= 3 ) { suma += a + i; i++; } System.out.println("Suma este: " + suma); _____________________________________________________________________ 40 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Iata cum arata in Eclipse expresia de mai sus: Figura 3.4 4) Instructiunea SWITCH Instructiunea initiala despre care am vorbit a fost IF (daca X este adevarat, atunci executa Y) , dar ce se intampla in momentul in care avem mai multe blocuri de verificare a unor expresii. Un raspuns care ne poate veni in minte ar putea fi: daca expresia A nu este adevarata, atunci ar putea fi adevarata expresia B, iar daca nici ea nu este, atunci expresia C. Lucrurile ar arata in felul acesta: if ( A ) { .... } else if (B) { .... } else if (C) { .... } ... _____________________________________________________________________ 41 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ else { .... } Aceasta este o varianta de solutionare a problemei noastre, dar nu este cea mai buna. O varianta si mai buna ar fi folosirea instructiunii SWITCH, instructiune care ne ajuta sa formam astfel de blocuri conditionale care arata in felul urmator: int nota = 5; switch(nota) { case 10: System.out.println("Excelent!"); break; case 8: System.out.println("Bravo"); case 7: System.out.println("Te-ai descurcat bine"); break; case 5: System.out.println("Ai trecut"); case 2: System.out.println("Ai picat. Mai incearca"); break; default: System.out.println("Nota nu a fost introdusa corect"); } In acest scenariu poti sa vezi ca, codul este mult mai bine structurat, iar SWITCH va trece prin fiecare case ( caz) pana cand va gasi matching-ul potrivit intre variabila nota si rezultatul asteptat. In cazul in care nu se gaseste nici o potrivire intre variabila si rezultatele specificate, atunci se va ajunge la default, c are ne va da rezultatul standard (in cazul acesta un mesaj de eroare) in caz de nepotrivire cu unul dintre cazurile specificate mai devreme prin case. De asemenea, in structura switch-ului (mai exact in cea a case-ului), poti sa vezi ca apare instructiunea break, care va opri parcurgerea intregului SWITCH si va iesi din functie, continuand cu rularea restului de program. Odata gasit, rezultatul asteptat (in aceasta situatie find vorba de al patrulea), programul va executa acea instructiune si va iesi din blocul switch(), continuandu-si executia instructiunilor pana la finalizarea sa. _____________________________________________________________________ 42 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Felicitari! Acum ai ajuns la sectiunea in care e timpul sa creezi tu (cu cele invatate) propriile programe folosind Java. Te rog sa incerci pe cat posibil sa faci singur aceste exercitii, sa faci research pe Google doar daca lipseste ceva esential sau nu mai stii ce ai gresit. 1) Creeaza un program care determina daca un numar (introdus de la tastatura) este par sau impar. Se va afisa (print) in terminal un mesaj similar cu: "Numarul introdus X este par", in cazul in care numarul este par, iar "Numarul nu este par" i n rest. PS: un numar este par daca se poate imparti la 2. Exemplu (2, 4, 8, 24150, etc.) 2) Creeaza un chestionar de intrebari simple pe care o persoana din departamentul de resurse umane le poate adresa la interviul de angajare. Vor exista 5 intrebari (similare cu cele de mai jos) pe care le vei adresa persoanei care va rula programul si care va putea sa le raspunda prin input, de la tastatura. In timpul executiei programului, acesta stocheaza datele, iar la sfarsitul acestor intrebari se vor afisa sub forma urmatoare: "Canditatul X a raspuns astfel la intrebarile de mai sus: ..." Intrebarile: "Cum te numesti ?", "Ce job iti doresti ?", "In cat timp crezi ca poti obtine acest job ?", "Care sunt pasii pe care trebuie sa-i urmezi pentru a te putea angaja ?", "De cand doresti sa incepi ?" 3) Creeaza un program care determina daca un cuvant (string) introdus de catre utilizator (de la tastatura) este Palindrom sau nu. Un palindrom este un sir de caractere care citit de la stanga la dreapta sau de la dreapta la stanga ramane neschimbat. Exemplu: lupul, capac, apa, cojoc - toate se citeste la fel din ambele parti. WHILE / FOR In aceasta parte a sectiunii practice ne vom juca putin si vom face putina matematica (de fapt, calculatorul, nu noi... :D ): 4.1) Calculeaza suma tuturor numerelor de la 1 la 100. Creeaza o varianta a programului folosind bucle FOR, iar alta varianta folosind bucle WHILE. Afiseaza rezultatul pe ecran intr-un format precum: "Suma numerelor de A la Z este... ". 4.2) Dinamizeaza programul prin adaugarea optiunii de introducere a celor 2 numere (nr. de inceput si cel de sfarsit) de la tastatura, de la punctul anterior. _____________________________________________________________________ 43 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 5) Creeaza un joc Piatră-hârtie-foarfecă la care participa 2 persoane. (Nota: folositi-va de clasa "Scanner" pentru a cere date de la jucatori; in momentul in care cineva castiga, printati un mesaj de felicitare si intrebati utilizatorii daca vor sa inceapa un joc nou). Amintiti-va regulile: Piatra bate foarfeca Foarfeca bate hartia Hartia bate piatra PS: folositi-va de conditiile discutate in lectiile anterioare (IF, FOR sau WHILE) _____________________________________________________________________ 44 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 4 - Metode in Java Continuam drumul nostru spre a invata programare cu un capitol in care vom vorbi despre functii. Vom vedea ce sunt functiile, de ce avem nevoie de ele si cum le putem folosi? L a sfarsitul acestui capitol vei avea o sectiune cu exercitii pe care te rog sa le rezolvi dupa ce termini de citit si de aplicat conceptele care vor fi explicate in urmatoarele randuri. Nu uita faptul ca, pentru a deveni programator ai nevoie de foarte multa practica. Nu ajunge doar sa stii si sa intelegi conceptele, ci ai nevoie sa le si faci. Deci sa trecem la treaba... Ce Este o Functie (Metoda) ? O functie este o modalitate prin care putem grupa codul nostru astfel incat sa poata fi folosit de mai multe ori (fara a necesita rescrierea acestuia). Practic, este o forma de a grupa, de a structura codul nostru, astfel incat noi sa scriem cod mai eficient, mai rapid si cu mult mai multa usurinta. Acest lucru este bine atat pentru noi cat si pentru program pentru ca astfel va consuma mai putine resurse si va fi mai usor de inteles datorita structurii sale. In POO (Programare Orientata pe Obiecte) despre care vom vorbi in detaliu in capitolul 5, functiile poarta denumirea de metode (“method” in engleza). Se practica acest lucru pentru a se face distinctia dintre POO si programarea procedurala (aka. cea clasica limbajul C). Exista mai multe tipuri de functii: ● functii (grupari de cod) care nu intorc nici un rezultat, adica functii void (ex: efectueaza o operatie “in spate”) ● functii (grupari de cod) care intorc un anumit rezultat (ex: numele unei persoane) Mai intai vom vorbi despre primul tip de functii, cele void. Dar in primul rand, hai sa vedem... _____________________________________________________________________ 45 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Metode care nu intorc un rezultat Acum vom lua un exemplu de program in care iti voi arata cum functioneaza aceste metode/functii. Pentru inceput, programul nostru in Java contine urmatoarea linie de cod: System.out.println("Hello!"); care va afisa in consola mesajul Hello! Ce vom face este sa cream o functie. Noi, in momentul de fata, ne aflam in MainClass (vezi figura 4.1), care in acelasi timp contine si functia main. Daca esti familiar cu C sau C++, acolo avem int main sau void main, o functie principala unde grupam elementele astfel incat programul nostru sa aiba o structura si un sens (urmand ca el sa poate fi executat). Noi aici vom crea o noua metoda numita helloFunction astfel: public static v oid helloFunction() {} Acesta este o functie publica, ceea ce inseamna ca poate fi accesata (mai multe despre asta vom vorbi in capitolul 5), apelata din mai multe clase sau programe. O sa vorbim despre asta mai incolo. Metoda este statica, adica isi pastreaza valoarea si este void, adica aceasta metoda dupa executarea ei nu va intoarce niciun rezultat. Un exemplu practic ar fi punerea unui fruct intr-o cana. Se pot intampla doua lucruri: fructul ramane in acea cana (adica nu intoarce un rezultat) sau fructul scoate ceva din acea cana (vine cu un rezultat, un output – acel fruct sau suc pe care l-am creat va curge). Acum vom merge mai departe si vom scrie putin cod in aceasta functie astfel incat ea sa faca ceva: public static void helloFunction() { System.out.println("Hello from function!"); } Dupa care venim in main s i o apelam, scriind “helloFunction();”. In consola va fi afisat mesajul “Hello from function!”, dupa cel de “Hello!” . Toate aceste concepte despre care am discutat mai devreme sunt exemplificate in figurile 4.1 si 4.2 de mai jos: _____________________________________________________________________ 46 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 4.1 Rezultatul secventei de cod din figura 4.1 este urmatorul: Figura 4.2 Hai sa facem lucrurile putin mai complexe si sa personalizam acest mesaj. Vom adauga intre parantezele de dupa Hello ceea ce se numeste un parametru. Vom pune String nume pentru ca vrem sa fie un nume, un text. Astfel ca functia noastra va arata: public static void helloFunction(String name) { System.out.println("Hello " + name + " from function!"); } Vom apela in main, scriind numele in parantezele, sub forma de parametru: hellofunction("John"); Iar rezultatul afisat va fi: “H ello John from function!” _____________________________________________________________________ 47 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Hello era mesajul intial, nume e ste un parametru adaugat, am introdus si semnul exclamarii. Practic, cu + facem concatenarea, adica legam de un string un alt string, apoi un al string, si venim cu un string total, un rezultat. Asta este, in mare, modul in care functioneaza si opereaza o astfel de functie. Un lucru pe care il mai putem face este sa apelam din nou functia Hello. Dupa helloFunction(“John”); vom scrie: String name = new String ("John"); helloFunction(name); Am scris name ca sa nu confundam numele de sus cu cel de jos. String este un obiect specific Java, si new String e ste modul in care am creat un nou obiect String si il voi initializa cu “John”. Practic, valoarea “John” i a locul lui name. Vom da Run, si pe ecran va aparea: Hello John! Figura 4.3 _____________________________________________________________________ 48 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Rezultatul secventei de cod din figura 4.3 este cel de mai jos: Figura 4.4 Mai putem sa adaugam si int a, respectiv int b ca parametru al functiei (metodei): public static void Hello(String nume, int a, int b) { nt sum = a + b; i System.out.println("Salutare" + nume + "!"+"\n " + String.valueOf(sum) ); } Daca facem aceasta modificare, suntem nevoiti sa schimbam si in clasa Main, modul in care va fi apelata functia Hello, din: Hello(“Ramon”); in Hello(name, 2, 3);. Dupa ce vom apasa pe Run, pe ecran va aparea 5. De fapt, ce am facut noi in aceasta functie Hello? ● Am adaugat alti doi parametri de tipul int (a si b): public static void Hello(String nume, int a, int b) ● am convertit int sum = a + b; intr-un String pentru a putea afisa in consola suma totala a celor 2 variabile: String.valueOf(sum); _____________________________________________________________________ 49 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 4.5 Rezultatul acestui cod este cel pe care il poti vedea in figura 4.6 Figura 4.6 Am printat acest String pe ecran. Cam atat cu metodele care nu intorc un rezultat (void) . In urmatoarea sectiune vom discuta despre metodele care pot intoarce un rezultat pe care noi sa-l putem folosi. _____________________________________________________________________ 50 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Metode care intorc un rezultat O functie (dupa cum am spus si mai devreme) reprezinta o grupare structurata a unei secvente de cod cu scopul de a face codul reutilizabil si usor de inteles (fapt care duce la edificentizarea volumului de munca depusa). Ca exemplu practic ne putem gandi la un blender care contine multe fructe. Ele toate vor ramane acolo. Nu vor putea fi turnate intr-un pahar. Acum vrem sa le si turnam intr-un pahar, astfel incat sa ne si putem folosi de rezultatul pe care aceasta metoda sau functie il genereaza. Vom lasa in Eclipse ceea ce am lucrat data trecuta. De data aceasta vom intoarce sum, mai precis: int sum = a + b; Ni se va spune ca aceasta variabila sum nu este folosita, dar noi vom intoarce, ii vom da return, scriind int in: public static void helloFunction(String name, int a, int b) { } ce acum va aparea: public static int helloFunction(String name, int a, int b) { } Eclipse ne spune ca avea, o problema, prin faptul ca aceasta functie trebuie sa intoarca un rezultat de tipul int. Si ce trebuie sa facem este sa scriem: return sum; In momentul in care rulam programul nu va aparea nicio modificare in consola. Vor ramane pe ecran: Hello! Hello John! In schimb, functia: helloFunction(name, 2, 3); Nu va face nimic. Ea intoarce un rezultat care il putem folosi mai departe (dar nu este absolut necesar). Totusi noi il vom folosi in modul urmator: int ret = in fata, si astfel functia va arata: int ret = helloFunction(name, 2, 3); Salvam rezultatul intors de functia helloFunction in variabila ret, dupa care il afisam: _____________________________________________________________________ 51 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ System.out.println(ret); Rulam acest program si vedem ca se intoarce aceasta valoare, care este 5. De acum putem sa mergem mai departe si sa facem absolut orice dorim cu aceasta valoare 5. O functie poate fi o functie matematica sau un algoritm care face ceva anume. Tot ceea ce noi trebuie sa facem este sa introducem anumite date, acea functie sau metoda ne va procesa datele in modul in care i-am spus, dupa care ne va da alte date. Iar acele date, output-ul sau datele finale, sunt ceea ce de fapt pe noi ne intereseaza si cu care vom putea merge mai departe sa generam alte date sau sa facem ceea ce dorim. Si cam asta am facut pana acum in acest tutorial. Cum in: public static int helloFunction(String name, int a, int b) { avem acest int, asta inseamna ca putem face orice altceva. Putem sa cream o alta functie: public static String userName(String name) { Si sa spunem ca avem aceasta functie care intoarce un String, va intoarce un sir de caractere – nume, user. ATENTIE: Vom scrie nume cu n mic pentru ca acesta este stilul de cod pe care cei care scriu Java il recomanda. Functia sau metoda trebuie sa inceapa cu litera mica, dupa care, pentru a diferentia, poti sa scrii cu litera mare. Dar sa revenim. Sub ceea ce am scris, vom scrie: String ret = "Your name is " + nume; return ret; Aceasta functie va afisa in consola urmatorul text: Your name is Dar nu este gata. Sus, in main, trebuie sa adaugam: System.out.println(userName("John")); Salvam, apasam pe Run si pe ecran va aparea: Your name is John _____________________________________________________________________ 52 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 4.1 In figura 4.1 poti sa vezi intregul cod pe care l-am scris pentru a crea programul, iar mai jos in figura 4.2 poti sa vezi rezultatul afisat. Figura 4.2 De ce? Pentru ca ni se va intoarce un String. Acest String poate fi foarte usor de printat pe ecran, dupa cum am si vazut. Ne putem folosi de el sau il putem printa, pur si simplu. De exemplu, daca ar fi sa stergem: System.out.println(userName("John")); si sa scriem: String temp = userName("John"); _____________________________________________________________________ 53 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ temp va lua valoarea pe care am trecut-o mai devreme. Si de aici putem sa facem ce dorim, cum ar fi sa adaugam in main: System.out.println(temp.length() + "- Total number of characters"); Rulam, si pe ecran va aparea: 17 – Total number of characters Si aceasta este o functie pe care o putem folosi in acest fel. De asemenea, putem sa adaugam si: System.out.println(temp + " and it has " temp.length() + " characters"); In figura 4.3 poti sa vezi intregul cod pe care l-am scris pentru a crea programul, iar mai jos in figura 4.4 poti sa vezi rezultatul afisat. Figura 4.3 _____________________________________________________________________ 54 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 4.4 Daca ai mai folosit Java pana acum, probabil aceste lucruri ti se par simple. Daca nu, iti recomand sa folosesti aceste functii. Metodele, atat cele void cat si non void, sunt foarte importante. Cam atat cu elementele de baza de programare in Java. Bineinteles, sunt mult mai multe. Dar incepand cu urmatoarele tutoriale vom vorbi mai mult despre programarea orientata pe obiecte. Vom intra in clase, vom vedea ce inseamna un camp, ce inseamna metodele dintr-o clasa, un constructor, un destructor, un getter, un setter, toate elementele de baza, cand vine vorba de acest gen de programare. _____________________________________________________________________ 55 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Dupa cum te-ai obisnuit pana acum, la fiecare final de capitol iti pun la dispozitie un set de exercitii pe care tu sa le practici. 1) Scrie o functie care primeste 3 parametri de tip real. Functia va returna 1 daca suma celor trei parametri formeaza un numar natural (aka, valoare fixa, fara virgula) si 0 in rest. Testeaza aceasta functie cu urmatoarele valori de intrare: 4.67, 8.93, 10.00 51.24, 33.10, 1.66 9.00, 8.01, 21.21 2) Scrie o functie care returneaza ultima cifra a unui numar natural. De exemplu, daca numarul este 234, functia va returna 4. 3) Aceste exercitii vor include cateva probleme de logica matematica: a) Folosind functia recursiva, scrie un program care sa ridice un numar x la o putere data y, pozitiva. b) Scrie o functie recursiva care sa returneze numarul de cifre al unui numar intreg. c) Folosindu-te de functiile scrise anterior scrie o funcție recursiva ce inverseaza ordinea cifrelor unui numar intreg pozitiv. 4) Scrieti o functie in Java prin care sa determinati numarul de cuvinte din urmatorul text. “Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus est odio, auctor eget massa quis, rhoncus porttitor est. Nunc eleifend malesuada mattis. Praesent sed lacinia urna. Integer non tincidunt justo. Duis nunc sapien, mattis sagittis felis vulputate, pharetra porta ante. Aliquam tortor ligula, pulvinar vitae ligula eu, efficitur tincidunt eros. Curabitur vitae lectus quis est elementum egestas. Vestibulum pulvinar nulla arcu, eu dignissim ante ornare vitae. Donec porta purus enim, a venenatis nisl luctus non. Curabitur porta fermentum elit sed rutrum. Ut vitae gravida velit, sed dictum eros. Pellentesque vel varius nisl. Fusce eget convallis urna.” Textul va fi primit ca parametru al functiei, iar rezultatul intors de aceasta va fi numarul de cuvinte al textului. _____________________________________________________________________ 56 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 5 - Concepte de POO in Java 1) Concepte teoretice despre POO POO - Programare Orientata pe Obiecte - (sau OOP - Object Oriented Programming) este o paradigma de programare care foloseste concepte abstracte (sub forma de clase si obiecte) pentru a crea modele bazate pe elemente din lumea reala. O aplicatie construita pe POO foloseste mai multe obiecte care comunica prin mesaje specifice pentru a rezolva diverse servicii (ale aplicatiei) solicitate. Aceste obiecte sunt capabile sa trimita mesaje (date), sa primeasca mesaje (date) si sa proceseze date. Scopul programarii orientate pe obiecte este de a incerca sa creasca flexibilitatea si mentenabilitatea programelor. Deoarece programele create folosind un limbaj orientat pe obiecte (cum este Java) sunt modulare, ele pot fi mai usor de dezvoltat si mai usor de inteles dupa dezvoltare. POO vs. Programare Procedurala Programele sunt alcatuite din module. Aceste module pot fi programe de sine statatoare (independente) care pot fi dezvoltate (codate) si testate separat fata de programul initial (ulterior acestea - mai multe module - putand fi asamblate pentru a forma un program complet). In limbajele de programare procedurale (cum ar fi C si Pascal) aceste module sunt de fapt proceduri, adica o secventa de instructiuni. In limbajul C, procedurile sunt functii care au un set clar de instructiuni (de tipul IF, FOR, WHILE etc.) cu scopul de a intoarce (sau nu) un rezultat (al acelei functii). In programarea procedurala se ia problema (care se doreste a fi rezolvata) si se sparge in mai multe bucati (sub proceduri). Astfel sub-procedurile rezolva bucati mai mici din problema initiala. Lucrurile continua asa pana cand problemele secundare (bucatile mai mici) sunt suficient de simple pentru a fi rezolvate de sub-procedura corespunzatoare ei. Dificultatea cu acest tip de programare consta in faptul ca intretinerea software-ului poate fi dificila si consumatoare de timp. Atunci cand se efectueaza modificari ale procedurii principale, aceste modificari pot intra in cascada, iar schimbarea poate avea un impact major asupra tuturor procedurilor din programul initial. _____________________________________________________________________ 57 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ O alternativa la programarea procedurala este programarea orientata pe obiecte. Scopul POO este cel de a rezolva dificultatile legate de programarea procedurala. In POO principalele module dintr-un program sunt clase, mai degraba decat proceduri. POO ne permite sa ne cream clase si obiecte care modeleaza elementele din lumea reala. Clase si Obiecte O clasa este o colectie de obiecte care au proprietati, operatii si comportamente comune. O clasa este o combinatie de stari (date) si comportament (metode). In POO o clasa este un tip de date, iar obiectele sunt instante ale acestui tip de date. De exemplu, putem crea o clasa Om(), care este o colectie a tuturor oamenilor din lume. Oamenii au un statut, cum ar fi inaltimea, greutatea, sexul, culoarea parului etc.. Ei au, de asemenea, un anumit comportament, o anumita limba pe care o vorbesc, o mancare preferata. Toate aceste caracteristici despre oameni sunt incapsulate (continute) in clasa Om(). Un obiect este o instanta a unei clase. Obiectele sunt unitati de abstractizare. Un obiect poate comunica cu alte obiecte folosind mesaje. Un obiect transmite un mesaj unui alt obiect, ceea ce duce la invocarea unei metode. Obiectele efectueaza apoi actiunile necesare pentru a obtine un raspuns de la sistem. Obiectele din lumea reala au 2 caracteristici in comun: toate au o stare si un comportament. O metoda de a gandi intr-un mod orientat pe obiecte este de a identifica starea si comportamentul obiectelor din lumea reala. Complexitatea acestor obiecte poate sa difere, unele obiecte au mai multe stari si comportamente considerabil mai complexe decat alte obiecte. Compara starea si comportamentul unui TV cu starile si comportamentele unei masini, sunt total diferite. Obiectele unei clase, dpvd conceptual, sunt similare cu obiectele din lumea reala. Un obiect isi stocheaza starea in campuri (aka. Variabile ale clasei) si isi expune comportamentele prin metodele sale (aka. Functiile clasei). Vom vedea in cele ce urmeaza mai multe detalii (si exemple) despre acestea. Un principiu fundamental al POO este incapsularea. Se ascund anumite stari interne a obiectelor, devenind necesar ca toate interactiunile sa fie efectuate utilizand metodele obiectelor. Cu alte cuvinte, campurile unei clase nu vor putea fi accesate (si modificate) in _____________________________________________________________________ 58 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ mod direct, ele nefiind vizibile (pentru ca sunt private), dar modificarile vor putea fi facute prin intermediul metodelor. Beneficiile POO Iata un sumar al beneficiilor cu care vine Programare Orientata pe Obiecte: 1. Modularitatea: Codul sursa pentru o clasa poate fi scris si mentinut independent de codul sursa pentru alte clase. Odata creat, un obiect poate fi usor transferat in interiorul sistemului. 2. Securitatea ridicata la nivel de cod: Interactionand doar cu metodele obiectului, detaliile implementarii interne raman ascunse de lumea exterioara. 3. Reutilizarea codului: Daca o clasa exista deja, puteti utiliza in programul dvs. obiecte din acea clasa. Acest lucru permite programatorilor sa implementeze / testeze / sa faca depanare pe obiecte complexe, specifice pentru sarcini, pe care apoi le puteti folosi in propriul cod. 4. Debugging mai usor: Daca un anumit obiect se dovedeste a fi o problema, il puteti elimina din program si puteti adauga/conecta, ca inlocuitor, un obiect diferit. Acest lucru este similar cu rezolvarea problemelor mecanice in lumea reala. Daca un surub se rupe, il inlocuiti pe el, nu intreaga masina. Scurt rezumat a celor discutate mai sus 1. In POO totul este un obiect. 2. Calculul se realizeaza prin obiecte care comunica intre ele, solicitand ca alte obiecte sa efectueze actiuni. Obiectele comunica prin trimiterea si primirea de mesaje. Un mesaj este o cerere de actiune, insotita de oricate argumente care ar putea fi necesare pentru a finaliza sarcinile. 3. Fiecare obiect are propria sa memorie alocata de catre OS. 4. Fiecare obiect este o instanta a unei clase. O clasa reprezinta pur si simplu o grupare de obiecte similare, cum ar fi Integer, String sau liste. 5. Clasa este depozitul pentru comportamentul asociat unui obiect. Asta inseamna ca toate obiectele care sunt instante din aceeasi clasa pot efectua aceleasi actiuni. _____________________________________________________________________ 59 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 2) Clase in Java Odata ce ai inteles mai multe lucruri despre POO si care este rolul acestui mod de structurare a datelor este timpul sa intram in partea concreta, practica, a lucrurilor. Pentru inceput vom relua definitia unei clase in Java, dupa care iti voi arata un exemplu de folosire a acestora. Ce este o clasa? O clasa este o colectie de obiecte care au proprietati, operatii si comportamente comune. O clasa este o combinatie de stari (date) si de comportamente (metode). In POO o clasa este un tip de date, iar obiectele sunt instante ale acestui tip de date. Iata mai jos o secventa de cod care ne demonstreaza modul de folosire al acestora: public class ClasaPrincipala { } Exemplul de mai sus creeaza o clasa denumita ClasaPrincipala. Mai jos vom crea functia principala (main), functie in care se pune cap la cap intreaga logica si structura a programului cu scopul de a fi executata. public class ClasaPrincipala { public static void main(String)[] args) { } } Vom ramane aici pentru cateva momente, pentru ca vreau sa iti spun mai multe lucruri. Repet ceea ce am spus mai devreme, dar cu alte cuvinte: Scopul unei clase este de a ne ajuta sa grupam si sa eficientizam munca noastra. Cu ajutorul unei clase vom face lucrurile mult mai bine si intr-un mod mult mai structurat. Avem un set de clase predefinite pe care le putem folosi deja in Java, precum si in alte limbaje de programare (cum ar fi C++, Python, Ruby si altele). In toate aceste limbaje exista deja anumite functii, anumite grupari, anumite clase care au scopul de a ne ajuta pe noi sa ne eficientizam munca. Ce rost ar avea un limbaj de programare fara functiile definite de catre o comunitate, de catre persoanele care au dezvoltat acel limbaj? Fiecare limbaj are specificul lui si ne ajuta sa ne facem munca mult mai eficient in anumite arii. De exemplu, cand facem programare in Java, e mai usor sa facem aplicatii pentru telefoane sau pentru servere. Cand facem programare in PHP, va fi mult mai usor _____________________________________________________________________ 60 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ sa ne ocupam de partea de web pentru ca acest limbaj a fost optimizat si gandit pentru asa ceva. Programarea in C ne ajuta sa facem lucruri care tin de sistemul de operare sau de programarea placutelor pentru ca acest limbaj este foarte rapid si asa a fost conceput. Vei vedea ca fiecare limbaj de programare are specificul lui. Dupa cum poate iti mai aduci aminte de la matematica (nu ca ar trebui sa fii expert in matematica, dar bazele din scoala generala ar ajuta mult), am facut numere reale, numere integer (adica intregi), float (adica numere reale) si asa mai departe. In engleza, “numerele intregi” se numesc “integer”. Sunt doua moduri in care putem defini un numar intreg: Integer x; int y; int y este o variabila clasica pe care ai vazut-o si in alte exemple din capitolele precedente. Dar declararea variabilei cu Integer este putin diferita. Integer este un tip de date (aka. O clasa) definita in Java care ne ofera mai multe functii/proprietati fata de o varianta clasica. Documentatia din Eclipse ne ofera mai multe detalii despre clasa Integer: “The Integer class wraps a value of the primitive type int in an object.” Practic, ne ofera un obiect (care trebuie initializat) care are mult mai multe proprietati si functii fata de un simplu int. Aceste variabile trebuiesc intializate si modul in care o vom face este in felul urmator (pentru int): Integer x; int y = 0; Modul in care initializam o variabila de tip Integer - sau o variabila care este de fapt un obiect pentru ca x in acest caz este de fapt un obiect al acestui Integer, adica x va prelua proprietatile, metodele, functiile care exista in aceasta clasa Integer s i le va putea folosi – va fi: Integer x = new Integer(5); I-am dat valoarea 5. Haideti sa printam acest lucru pe ecran: System.out.println(x); System.out.println(y); Cand vom rula cele doua, pe ecran va aparea: 5 0 _____________________________________________________________________ 61 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 5.1 Acum poate te gandesti “Ok, si ce sens au aceste x si y? De ce e unul Integer s i celalalt int?”. Ei bine, punand un punct “.” si scriind (figura 5.2): System.out.println(x.); putem sa apelam metodele care se afla in clasa Integer. Asta este frumusetea acestor obiecte, acestor clase si a programarii orientate pe obiecte. Faptul ca noi definim un obiect al unei clase si acel obiect poate sa preia proprietatile clasei respective. De exemplu, putem transforma acest Integer intr-un String. Deci 5 sa nu mai fie o cifra, ci o litera. Stiu ca nu suna foarte logic la prima vedere, dar sunt diferite moduri in care poti sa procesezi aceste date. Figura 5.2 _____________________________________________________________________ 62 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ De exemplu, in momentul in care introduci informatiile bancare si vrei sa cumperi ceva online, ai o grupare de litere si cifre. Ei bine, toate acele date vor fi tratate ca fiind String-uri s i apoi vor fi analizate. Deci vor fi String-uri, nu vor fi luate ca fiind numere intregi. Abia dupa ce vor fi luate ca String-uri si procesate, tranzactia va avea succes. Putem transforma x- ul in String, putem transforma acelasi x d in Integer s a fie un int (public int intValue () - asta este clasa care transforma acest Integer i ntr-un int), si tot asa. Exista foarte multe lucruri pe care le poti face aici. Pe langa acestea mai poti efectua anumite operatii foarte usor, cum ar fi: ● ● ● ● Definirea valoarea maxima (sau minima) prin comparatie a 2 variabile Integer Definirea valorii hash a unei variabile Aflarea celui mai mare bit Convertirea din int i ntr-un alt tip de variabila (char, String, float e tc.) Toate aceste operatii au loc cu ajutorul functiilor predefinite din clasa Integer. Vom alege functia toString si vom adauga un cuvant la intamplare care va fi, sa zicem, “cool”: System.out.println(x.toString() + " cool"); Vom rula si pe ecran va aparea: 5 cool Figura 5.3 Iata in cele 2 figuri 5.3, respectiv 5.4, codul si rezultatul in urma rularii secventei de cod: _____________________________________________________________________ 63 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 5.4 Variabila x, definita ca Integer, a fost afisata ca un String. Acelasi lucru poti sa il faci si cu String-uri. Poti sa iti definesti un obiect String, sa spunem: String a = new String("abc"); Asta inseamna ca acestui a ii putem face diferite lucruri cu functiile predefinite, scriind: a. si selectand fie length() pentru a afla lungimea totala a acestui sir sau specificand ca vrem sa luam un substring din acest String, de la 0 la 1: String b = a.substring(0, 1); System.out.println(a + "vs" + b); Dupa ce vom rula, pe ecran va aparea: abc vs. a b are valoarea a. Figura 5.5 Revenind in: System.out.println(x.toString() + "tare"); _____________________________________________________________________ 64 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ System.out.println(y); observam ca y nu are aceste proprietati. Nu ii putem atribui ceva. Nu are anumite functii in spate de care sa se foloseasca. Si atunci y, dupa cum poti sa vezi, este o variabila clasica. Este un tip de variabila clasica, din acelea int, float, double si asa mai departe. Deci nu il vom putea folosi pentru a face operatii mai complexe. Figura 5.6 Si acum sa vedem cum putem crea o clasa proprie si cum putem sa definim astfel de metode in aceste clase. Vom crea o noua clasa, ClasaMea, accesand New Class si numind-o: public class ClasaMea { } Este foarte important ca numele fisierului sa fie identic cu numele care va fi scris in linia de cod, mai ales daca este public. O sa vorbim in tutorialele urmatoare ce inseamna public, ce inseamna private. Pe scurt, cand o clasa este public i nseamna ca va putea fi apelata din alte clase. Adica aceasta clasa fiind public, o vom putea apela din ClasaPrincipala s au chiar dintr-un alt pachet. Vom discuta despre acest lucru mai tarziu. Daca ClasaMea ar fi private, in momentul care vom dori sa facem diferite lucruri cu ea, nu vom putea. Hai sa definim in ClasaMea: public int x; String public return } } class ClasaMea { a; String numeleMeu(String nume) { nume; _____________________________________________________________________ 65 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 5.7 Am creat doua variabile (int x si String a) , dupa care am creat o metoda care este public String, adica imi va intoarce un String c e se numeste numeleMeu si cere ca parametru un nume, si apoi am intors acest nume. Revenind in ClasaPrincipala, vom defini un obiect ce se va numi ClasaMea: ClasaMea ob1 = new ClasaMea(); Astfel am creat un obiect si l-am intializat. Daca vom scrie sub: ob1. vom vedea ca avem variabile declarate mai inainte: String a si int x. Vom lua o b1.x si ob1.a si le vom da valori: ob1.x = 10; ob1.a = " John"; Apoi vom printa in felul urmator: System.out.println(ob1.numeleMeu(ob1.a)); Dupa ce vom rula, pe ecran va aparea John Ce am facut aici este ca am apelat functia din ob1, functia din ClasaMea, si i-am dat variabila ca si parametru, mai exact variabila String a careia noi i-am atribuit o anumita valoare. In clasa principala, putem merge mai departe si adauga in: System.out.println(ob1.numeleMeu(ob1.a)); astfel: System.out.println(ob1.numeleMeu(ob1.a) + " numarul este: " + ob1.x); _____________________________________________________________________ 66 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 5.8 Figura 5.9 In consolo va aparea: John numarul este: 10 Ce am facut in acest tutorial este: ● am creat o clasa ● i-am creat acestei clase anumte variabile ● am adaugat anumite valori acestor variabile ● ne-am folosit de valori pentru a intoarce un anumit rezultat dintr-o functie din clasa pe care am definit-o separat ● am printat totul pe ecran _____________________________________________________________________ 67 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 3) Constructori si Destructori Acum ca ai inteles si ai vazut cum se folosesc clasele in Java, a venit momentul sa mergem mai departe si sa vorbim despre Constructori (si Destructori) in POO (aceste concepte se aplica in orice limbaj orientat pe obiecte si nu doar in Java). Ce este un constructor in POO? Constructorul unei clase este o functie interna, speciala a acelei clase care este apelata in momentul in care se creeaza o instanta a acelei clase. De exemplu: Proiect x = new Proiect(); In momentul in care rulam programul, in background va fi apelat constructorul clasei Proiect care poate sa faca urmatoarele operatiuni: ● Initializarea campurilor (variabilelor) clasei sau a celor date ca parametru ● Alocarea memorie pentru acestea sau alte campuri ale clasei In exemplele care urmeaza vei vedea cum declaram constructorii unei clase si cum ii putem folosi pentru o alocare cat mai eficienta a resurselor. Ce este un destructor in POO? Daca un constructor este folosit pentru initializarea variabilelor si alocarea de memorie pentru diferiti membri ai clasei, atunci destructorul este o componenta apelata in momentul in care se termina executia codului pentru dealocarea obiectului din memorie. Astfel gestiunea memorie va fi corect facuta (memoria alocata initial, fiind eliberata pentru folosirea acesteia de catre alte programe). In Java nu este necesara crearea unui destructor pentru ca acest proces are loc automat in momentul in care se termina executia programului. Folosirea constructoriilor in Java Vom crea un proiect nou pe care il vom putea denumi ProiectClase. Vom vedea clasa principala cu functia Main, unde adaugam toate elementele pentru a rula programul, si vom crea clasa Person prin care vom defini o persoana. Clasa Person va contine urmatoarele campuri principale care definesc o persoana: varsta, sex, nume si prenume, CNP. _____________________________________________________________________ 68 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Aceasta clasa, impreuna cu campurile care o compun, ne va ajuta sa colectam mai multe date despre persoanele care folosesc aplicatia (gandeste-te la o aplicatie de gestiune a clientilor, de exemplu). Permite-mi sa-ti dau un exemplu: In momentul in care vizitam un site web si introducem datele personale, in spate sunt anumite structuri sau clase ce iti cer acele date si le structureaza intr-un singur loc. Prin urmare, clasa Person ne va ajuta sa luam un cumul mare de date si sa le aranjam intr-un mod mai ordonat is mai clar, ca apoi sa putem interpreta si folosi informatia in diferite scopuri. Astfel, la inceput clasa noastra va arata in felul urmator: class Person { int age; String fname; String lname; String sex; } Te poti gandi la mai multe elemente care apartin unei persoane. Poti merge mult mai in detaliu, prin adaugarea altor caracteristici precum CNP, inaltime, studii etc. Iar acum, sa definim constructorul nostru: Person() { } In acest constructor vom trece o valoare default a campurilor definite mai sus, iar in momentul in care o instanta noua va fi creata (vezi urmatoarea secventa de cod), i se vor atribui chiar aceste valori: Person() { age = 20; fname = "Unknown"; lname = "Anonymous"; sex = null; } In main vom defini un obiect al clasei Person pe care il vom initializa (acesta devenind o instanta a clasei): Person A = new Person(); Acest constructor poate avea mai multi parametri daca il vom scrie: Person (int age, String fname) { _____________________________________________________________________ 69 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ } In momentul in care cream o instanta, trebuie sa adaugam o valoare pentru acea instanta. Astfel ca, constructorul initial pe care l-am definit astfel: “Person (int age, String fname)” va deveni: Person (int age, String fname) { this.age = age; this.fname = fname; } In acest caz keywordul this se refera la valoare, in contextul variabilelor din cadrul clasei. Aici, “this.age = age;” va fi aceasta variabila. Ii va atribui lui int age valoarea pe care o vom da. Vom folosi this. pentru a distinge intre cele doua variabile age pe care le avem. Ii vom putea atribui valoarea in Main, unde vom putea inlocui: Person A = new Person(20, "Adi"); cu: Person A = new Person(24, "Ramon"); sau alte valori pe care doresti sa le introduci. Scriind aceste valori, o sa vezi ca variabilei age i se va atribui valoarea 24 s i variabilei fname, valoarea Ramon. Si putem merge mai departe sa cream alt constructor, in functie de nevoile noastre: Person(int age, String fname, String lname) { this.age = age; this.fname = fname; this.lname = lname; } Inainte de a trece mai departe, vreau sa ma opresc si sa-ti arat codul intregii functii care arata in felul urmator: class Person { int age; String fname; String lname; String sex; Person() { this.age = 20; this.fname = "Unknown"; _____________________________________________________________________ 70 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ } this.lname = "Anonymous"; this.sex = null; Person (int age, String fname) { this.age = age; this.fname = fname; this.sex = null; } Person(int age, String fname, String lname, String sex) { this.age = age; this.fname = fname; this.lname = lname; this.sex = sex; } } Instanta A este goala in momentul de fata (in sensul in care nu are atribuite valori catre campurile definite in clasa). Acum putem testa cei 2 constructori definiti mai devreme astfel: Person A = new Person(); Exemplul de sus e pentru primul constructor, iar urmatorul pentru al doilea: Person B = new Person(20, "Adi"); Vom rula urmatoarea secventa de cod: System.out.println("This person is " + A.fname + " which has " + A.age + "years old"); System.out.println("This person is " + B.fname + " which has " + B.age + "years old"); Iar rezultatul care va aparea pe ecran este: This person is Unknown which has 20 years old. This person is Ramon which has 24 years old. Pentru a afisa pe ecran acest rezultat am fost nevoiti sa luam fiecare camp in parte si sa-l printam pe ecran. Avem o metoda si mai eficienta de a face acest lucru prin definirea _____________________________________________________________________ 71 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ unei functii toString, care practic ne permite sa customizam modul in care vrem sa printam obiectul din clasa noastra. Daca vrem sa printam datele persoanei A, vom creea in clasa Person urmatoarea functie: public String toString() { return "This person's name is: " + this.fname + " " + this.lname + " and he/she is " + this.age + + years old"; } Prin return, am intors valoarea clasei Person c a fiind un String. Vom printa din Main: System.out.println(A); si pe ecran vor aparea datele clasei: This person's name is: Unknown Anonymous and she/she is 20 years old. Vom face acelasi lucru pentru B, tot din Main: System.out.println(B); Pe ecran va aparea urmatorul text: This person's name is: Ramon null and he/she is 24 years old. In primul exemplu va aparea Unknown si Anonymous p entru ca asa a fost definit in primul constructor. _____________________________________________________________________ 72 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 4) Getters & Setter In aceasta sectiune vom discuta despre functiile de tip Getters & Setters si despre tipurile de acces ale claselor/functiilor/variabilelor: public, private si protected. Acestea din urma sunt moduri de “securizare” a accesului la diferite functii, clase, etc. Toate sunt parte a POO si vom discuta despre fiecare in parte, pe rand. Propun sa revenim la exemplul de mai devreme (cel cu clasa Person) si sa operam in aceasta clasa astfel incat sa intelegem ce sunt getters, setters si tipurile de acces la variabile, functii, clase etc. Vom incepe prin a lua urmatoarea secventa de cod, drept exemplu: public class Person { public void sayHello() { System.out.println(“Hello World, from Person!”); } } In secventa de cod de mai sus poti vedea ca am setat tipul de acces (aka. nivelul de securitate al codului) ca find public (atat pentru clasa cat si pentru functia acesteia). Asta inseamna ca in orice proiect in Java in care dorim sa apelam functia sayHello, a clasei Person, vom putea face asta pentru ca functia este publica. Daca ar fi fost private, aceasta functie NU ar fi putut fi apelata deloc dintr-un alt fisier, pachet, clasa (si nici din main). Haide sa facem asta prin adaugarea urmatoarei secvente de cod in clasa Person: private i nt age; private String fname; private String lname; Tipul private este pentru a nu putea apela variabilele (campurile) din alta parte. In Main vom primi o eroare ca variabilele age, fname s i lname nu mai sunt vizibile. Pentru a le putea din nou apela, trebuie sa cream mai multi getteri. Un getter este o metoda care arata in felul urmator: public int g etAge() { return t his.age; } Vom crea acest getter de mai sus in Person. Este public pentru ca vrem sa il apelam de oriunde. Revenim in Main s i inlocuim astfel: _____________________________________________________________________ 73 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ System.out.println("This person " + A.fname + " has " + A.age + " years old"); cu: System.out.println("This person " + A.fname + " has " + A.getAge() + " years old"); Facem acelasi lucru cu fname s i lname, in Person: public String get fName() { return this.fname; } si: public String get lName() { return this.lname; } In Main v om schimba astfel: System.out.println("This person " + A.getFname() + " has " + A.getAge() + " years old"); Dupa ce vom rula, pe ecran va aparea: This person John has 24 years old. Acesta este un mod mai securizat si curat de a apela variabilele create. Pur si simplu apelam metodele care intorc variabila respectiva. Pentru a modifica aceste variabile trebuie sa revenim in Person s i sa cream seteri: public void setAge(int age) { this.age = age; } age din aceasta linie de cod este parametrul pe care l-am introdus mai devreme. this.age este campul private int age. Continuam sa facem acelasi lucru si pentru restul functiilor: public void setFname(String fname) { this.fname = fname; } _____________________________________________________________________ 74 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ si: public void setLname(String fname) { this.lname = lname; } Astfel, codul complet din clasa Person v a fi urmatorul: public class Person { private i nt age; private String fname; private String lname; Person() { this.age = 0; this.fname = “None”; this.lname = “no one”; } public int getAge() { return this.age; } public String getlName() { return this.lname; } public String getfName() { return this.fname; } public void setAge(int age) { this.age = age; } public void setlName(String lname) { this.lname = lname; } public void setfName(String fname) { this.fname = fname; } _____________________________________________________________________ 75 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ public void sayHello() { System.out.println(“Hello World, from Person!”); } public String toString() { return "This person's name is: " + this.fname + " " + this.lname + " and he/she is " + this.age + " years old"; } } In Main, vom scrie pentru a modifica si a printa: A.setfName("Adi"); A.setAge(23); System.out.println(A); Pe ecran, va aparea modificat: This person's name is: Adi null and he/she is 23 years old Null apare pentru ca nu am definit lname. Putem sa il setam in Main: A.setlName("Nastase"); Dupa ce vom da Run, pe ecran va aparea: This person's name is: Adi Nastase and he/she is 23 years old Iata mai jos, in figurile 5.10 - 11, codul complet asa cum arata el in Eclipse: _____________________________________________________________________ 76 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Clasa Person Figura 5.10 _____________________________________________________________________ 77 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Clasa Main & Rezultatul final Figura 5.11 Ca un scurt rezumat la ce am vorbit pana acum: tipul public este pentru ca oricine sa ne poata folosi clasa, functia sau ce mai avem creat. Tipul private este pentru a folosi campurile doar in aceeasi clasa sau functie, iar tipul protected care inseamna ca putem accesa si folosi elementul creat (clasa, variabila etc.) doar in acelasi pachet (package, care se refera la “folderul” in care se afla proiectul in Java - initial denumirea acestuia find default). Acest pachet despre care vorbesc este de obicei creat la inceput (si se numeste default, dupa cum spuneam). Fiecare pachet are caracteristicile si functiile lui, iar daca functiile sunt protected, nu pot fi folosite in afara pachetului. Daca sunt private, nu pot fi folosite in afara fisierului. Numai public permite folosirea lor de oriunde. _____________________________________________________________________ 78 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Dupa cum te-ai obisnuit pana acum, la fiecare final de capitol iti pun la dispozitie un set de cateva exercitii care te ajuta pe tine sa si practici. 1) Definiti o clasa Fractie care modeleaza lucrul cu fractiile. Membrii acestei clase sunt: ● doua atribuite de tip double pentru numaratorul fractiei, respectiv numitorul ei; ● constructorul cu doi parametri de tip double, pentru setarea celor doua parti ale fractiei (numarator si numitor); ● un constructor fara parametri care apeleaza constructorul anterior; ● o metoda, cu un singur parametru, de calcul a sumei a doua fractii; ● o metoda toString utilizata pentru afisarea pe ecran a valorii fractiei; ● o metoda equals, cu un parametru de tip Object, care va returna true d aca fractiile sunt egale, respectiv false in sens contrar; ● o metoda main pentru testarea functionalitatii clasei. 2) Definiti o clasa Numar care are ca membru un numar intreg si contine metodele descrise mai jos. Implementati metodele astfel incat fiecare metoda sa efectueze o singura adunare. Instantiati un obiect de tip Numar in metoda main s i apelati metodele implementate. Ce principiu POO este evidentiat in acest exercitiu? //returneaza suma dintre nr (membrul clasei) si a public int suma(int a); //returneaza suma dintre nr, a si b public int suma(int a, int b); //returneaza suma dintre nr, a, b si c public int suma(int a, int b, int c); //returneaza suma dintre nr, a, b, c si d public int suma(int a, int b, int c, int d); _____________________________________________________________________ 79 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 3) Un produs este caracterizat prin nume (String), pret (double) si cantitate (int). Un magazin are un nume (String) si contine 3 produse. Creati clasele Produs si Magazin corespunzatoare specificatiilor de mai sus. In fiecare clasa, implementati constructorul potrivit, astfel incat caracteristicile instantelor sa fie setate la crearea acestora. Clasa Produs contine o metoda toString, care va returna un String sub forma “Produs <nume_produs> <pret_produs> <cantitate>“ si o metoda getTotalProdus care va returna un double, produsul dintre c antitate si p ret. Clasa Magazin contine o metoda toString care va returna String-ul corespondent tuturor componentelor magazinului si o metoda getTotalMagazin care va calcula suma totalurilor produselor si o va returna. Creati, intr-o metoda main, un obiect de tip Magazin, folosind obiecte anonime in cadrul instantierii. 4) Implementati clasa Punct care defineste un punct din spatiul 2D. Datele clasei (private): ● doua nr. intregi reprezentand cele doua coordonate ale punctului. Conctructorul clasei: ● un constructor fara parametri care instantiaza punctul O(0, 0). Metodele clasei: ● int getX() = intoarce abscisa punctului; ● void setX(int x) = seteaza abscisa punctului; ● int getY() = intoarce ordonata punctului; ● void setY(int y) = seteaza ordonata punctului; ● String toString() = returneaza un String de forma \textit{(x, y)}; ● double distance(int, int) = calculeaza distanta dintre 2 puncte; ● double distance(Punct p1) = calculeaza distanta dintre 2 puncte. Creati o clasa Test in acelasi pachet cu clasa Punct, care contine o metoda main care calculeaza distanta dintre punctele A(1, 2) si B(-1, 3). Puteti accesa datele clasei Punct in metoda main d in clasa Test? _____________________________________________________________________ 80 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 5) Sa se implementeze o clasa PasswordMaker care genereaza, folosind RandomStringGenerator, o parola pornind de la datele unei persoane. Aceasta clasa o sa contina urmatoarele: ● o constanta MAGIC_NUMBER avand orice valoare doriti ● un String constant MAGIC_STRING, lung de minim 20 de caractere, generat random ● un constructor care primeste: un String numit firstName, un String numit lastName si un int numit age ● o metoda getPassword() c are va returna parola Parola se construieste concatenand urmatoarele siruri: ● sirul format din ultimele (age % 3) litere din firstName ● un sir random de lungime MAGIC_NUMBER, generat cu RandomStringGenerator si cu un alfabet obtinut din 10 caractere obtinute random din MAGIC_STRING ● si sirul format prin conversia la String a numarului (age + lungimea lui lastName). Pentru subsiruri si alte metode utile consultati documentatia clasei String _____________________________________________________________________ 81 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 6 - Exceptiile in Programare si Operatiile cu Fisiere in Java I. Exceptii in Java Ce sunt exceptiile? O exceptie reprezinta un eveniment (neasteptat) care are loc in timpul executiei unui program. Aceasta exceptie (daca nu este tratata) poate duce la intreruperea programului si oprirea permanenta a acestuia. Exceptiile pot aparea in mai multe situatii cum ar fi: Imposibilitatea citirii unui fisier de pe disk (ex: File Not Found) Imposibilitatea crearii unui fisier pe disk (Insufficient Permissions) Imposibilitatea utilizarii (sau inexistenta) unei clase (Class Not Found) Depasirea lungimii maxime definite pentru un Vector/Array (Array Index Out of Bound) ● Imposibilitatea conectarii la un server ● ● ● ● Toate aceste exceptii precum si multe altele pot aparea (sub forma de eroare) atunci cand scriem programele noastre si facem greseli la nivel de comportament al codului nostru si nu la nivel de compilare (greseli de sintaxa in programare). Cum sunt generate exceptiile in Java? O exceptie este generata prin “aruncarea” sa in momentul in care o anumita conditie nu este respectata. Sa luam codul de mai jos sub forma de exemplu pentru a intelege mai bine: String s = null; if (s == null) { throw new Exception("Sirul este gol"); } In acest exemplu am creat un String p e care l-am initializat cu null (o valoare care indica faptul ca sirul e complet gol; nu are atribuit nimic), dupa care am testat daca acesta este gol. In cazul in care if-ul este valid, atunci va fi aruncata o exceptie (prin crearea unui instante de tipul Exception) care va anunta faptul ca sirul este gol, iar programul nu poate merge mai departe datorita acestui fapt. _____________________________________________________________________ 82 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exceptiile pot fi de 2 feluri: exceptii built-in (figura 6.1) si exceptii definite de catre user. Clasa Exception este clasa parinte a majoritatii exceptiilor din Java. O parte dintre exceptiile built-in le-am mentionat si la inceputul acestui capitol: ● ● ● ● ● ● ● FileNotFoundException NullPointerException ArithmeticException ClassNotFoundException IOException IndexOutOfBoundsException Si multe altele Figura 6.1 In aceasta sectiune ne vom concentra asupra exceptiilor built-in, iar in cele ce urmeaza iti voi arata cateva exemple de programe care genereaza exceptii si cum le putem trata. Iata mai jos un exemplu de cod care genereaza o exceptie: public class MyClass { public static void main(String args[]) { int[] vec = new int[15]; System.out.print("Vectorul este: "); for(int i = 0; i < 16; i++) { vec[i] = i; System.out.print(vec[i] + " " ); } } } _____________________________________________________________________ 83 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ In exemplul de mai sus, secventa de cod adauga in vector cate o valoarea numerica pentru fiecare pozitie a vectorului. Problema consta in faptul ca este depasita lungimea maxima a vectorului (pozitia a 16-a, desi au fost alocate doar 15), iar astfel, o eroare va fi generata. Iata in figura de mai jos exceptia aruncata in urma compilarii programului: Figura 6.2 Cum tratam exceptiile in Java? Pentru a rezolva aceasta problema (si pentru a permite codului nostru sa fie executat in continuare, fara intreruperi) trebuie sa prindem exceptiile care sunt aruncate, dupa care sa le tratam. Putem face asta in formatul urmator: public class MyClass { public static void main(String args[]) { nt[] vec = new int[15]; i try { System.out.print("Vectorul este: "); for(int i = 0; i < 16; i++) { vec[i] = i; System.out.print(vec[i] + " " ); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println(e.getMessage()); } } } Iar codul in Eclipse si rezultatul afisat in consola, in urma compilarii, este: _____________________________________________________________________ 84 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 6.3 Practic prin folosirea blocului de instructiuni try - catch putem sa ne protejam codul (si programul) nostru de o eventuala intrerupere care poate avea loc. In blocul try - catch am introdus codul principal care va fi executat instructiune cu instructiune. In momentul in care se arunca o exceptie, blocul catch o va prinde si o va trata (in functie de codul scris acolo). Iata alte exemple de cod care genereaza o parte din exceptiile mentionate la inceputul acestui capitol: _____________________________________________________________________ 85 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exemplul #1 - Divide by 0 In acest exemplu poti sa vezi cum are loc o operatie de impartire a unui numar la 0 si rezultatul generat de catre compilator: public class MyClass { public static void main(String args[]) { int a = 30, b = 0; int c = a/b; // nu se poate imparti la 0 System.out.println("Rezultatul= " + c); System.out.println("Programul a fost finalizat cu succes"); } } Iata rezultatul, in figura de mai jos: Figura 6.4 Pentru a rezolva aceasta problema, vom folosi blocul try - catch, care ne ve permite sa prindem o eventuala exceptie care ar putea fi aruncata de catre program. In secventa catch vom incerca sa prindem exceptia ArithmeticException. public class MyClass { public static void main(String args[]) { try { int a = 30, b = 0; int c = a/b; // nu se poate imparti la 0 System.out.println ("Rezultatul= " + c); } catch(ArithmeticException e) { System.out.println("Can't divide a number by 0"); } System.out.println("Programul a fost finalizat cu succes"); } } _____________________________________________________________________ 86 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Si rezultatul in urma rularii codului: Figura 6.5 Exemplul #2 - File Not Found In acest al doilea exemplu poti sa vezi cum are loc o operatie de citire a datelor dintr-un fisier si rezultatul generat de catre compilator: import java.io.*; public class MyClass { public static void main(String args[]) throws FileNotFoundException { // acest fisier nu exista File file = new File("E://file.txt"); FileReader fr = new FileReader(file); System.out.println("Programul a fost finalizat cu succes"); } } _____________________________________________________________________ 87 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Iata rezultatul in figura 6.6 de mai jos: Figura 6.6 Pentru a rezolva aceasta problema, vom folosi blocul try - catch, care ne ve permite sa prindem o eventuala exceptie care ar putea fi aruncata de catre program. In secventa catch vom incerca sa prindem exceptia FileNotFoundException, doar ca de data aceasta am sa te las pe tine sa scrii codul pentru prinderea exceptiilor (vezi sectiunea de exercitii de la sfarsitul acestei prime parti ale capitolului). Exemplul #3 - Null Pointer Exception In acest al treilea exemplu poti sa vezi cum are loc o operatie de folosire a unei variabile care a fost initializata cu valoarea null si rezultatul generat de catre compilator: public class MyClass { public static void main(String args[]) { // acesta variabila contine nimic, null String a = null; // incercam sa determinam lungimea variabilei a System.out.println(a.length()); System.out.println("Programul a fost finalizat cu succes"); } } Iata rezultatul in figura 6.7 de mai jos: Figura 6.7 _____________________________________________________________________ 88 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Pentru a rezolva aceasta problema, vom folosi blocul try - catch, care ne ve permite sa prindem o eventuala exceptie care ar putea fi aruncata de catre program. In secventa catch vom incerca sa prindem exceptia NullPointerException, doar ca de data aceasta am sa te las pe tine sa scrii codul pentru prinderea exceptiilor (vezi sectiunea de exercitii de la sfarsitul acestei prime parti ale capitolului). Exemplul #4 - String Index Out of Bounds In acest al patrulea exemplu poti sa vezi cum are loc o operatie de parcurgere a caracterelor dintr-un sir (ba chiar depasirea numarului total de caractere) si rezultatul generat de catre compilator: public class MyClass { public static void main(String args[]) { // acesta variabila contine un text random String text = “Random text for this example”; int lungime = text.length(); for(int i = 0; i < lungime + 1; i++) { System.out.print(text.charAt(i)); } System.out.println("Programul a fost finalizat cu succes"); } } Iata rezultatul in figura 6.8 de mai jos: Figura 6.8 Pentru a rezolva aceasta problema, vom folosi blocul try - catch, care ne ve permite sa prindem o eventuala exceptie care ar putea fi aruncata de catre program. In secventa _____________________________________________________________________ 89 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ catch vom incerca sa prindem exceptia StringIndexOutOfBoundsException, doar ca de data aceasta am sa te las pe tine sa scrii codul pentru prinderea exceptiilor (vezi sectiunea de exercitii de la sfarsitul acestei prime parti ale capitolului). ATENTIE: acestea au fost cateva exemple de erori pe care le poti avea atunci cand iti scrii programele in Java. Cand vine vorba de exceptii precum StringIndexOutOfBoundsException sau ArrayIndexOutOfBoundsException te incurajez sa rezolvi cauza acestei exceptii si NU sa pui codul intr-un bloc try - catch pentru ca aceasta solutie nu este una eficienta. Exercitii 1) Pentru fiecare exemplu (2 - 4) de mai sus care nu contine o solutie de tratare a exceptiilor, te invit sa rescrii codul astfel incat programul sa nu fie intrerupt si sa-si poata continua executia. _____________________________________________________________________ 90 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ II. Operatii cu Fisiere in Java Cand vine vorba de programare, o buna parte din timp vei lucra cu operarea sau manipularea de date (care sunt folosite de programul sau aplicatia la care lucrezi). In marea majoritate a cazurilor, aceste date se vor afla stocate pe disc (cel mai probabil in fisiere) sau intr-o baza de date. In aceasta sectiune vom invata cum sa gestionam citirea si scrierea dintr-un, respectiv intr-un fisier prin Java. Cand vine vorba de lucrul cu fisiere, in mare parte, poti face 2 lucruri: citirea, respectiv scrierea in acele fisiere. Nu este nimic special in legatura cu acest subiect, dar este important sa il ai in vedere pentru ca te vei intalni destul de des cu astfel de operatii. Alte moduri prin care programul tau poate obtine date (pe care sa le proceseze) sunt: ● De la alte programe prin fisierele locale (aflate pe acelasi PC/laptop, hard disk) ● De la alte programe prin retea (aflate pe anumite PC-uri/laptop-uri sau servere) ● Din program, datele fiind introduse de la tastatura. Citirea datelor de la tastatura in Java Inainte de a incepe sa citim datele dintr-un fisier, vreau sa-ti arat cum o poti face de la tastatura. Probabil ca ai mai interactionat cu citirea datelor de la tastatura in capitolul 2, in sectiunea de exercitii, iar daca nu ai reusit sa faci acel exercitiu, nici o problema pentru ca iti voi explica in cele ce urmeaza ce inseamna si cum o poti face. Citirea datelor de la tastatura (aka. Citirea datelor prin consola - din Eclipse, in acest caz) inseamna sa rulezi un program, iar aceasta sa-ti ceara introducerea datelor direct de la tastatura. Este o metoda foarte buna de antrenament si de verificare a faptului ca programul tau functioneaza corect. In aplicatii reale nu vei interactiona foarte mult cu acest mod, decat atunci cand ii ceri utilizatorului sa o faca (in rest vei opera cu fisere sau date transferate prin retea). Iata mai jos un exemplu de citire a datelor de la tastatura pe care te incurajez sa-l exersezi si sa-l adopti in programele tale pentru ca poate fi o metoda foarte buna de testare a programelor lor. System.out.println("Introdu adresa de email: "); Scanner scanner = new Scanner(System.in); String email = scanner.nextLine(); System.out.println("Adresa ta de mail este " + email); _____________________________________________________________________ 91 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ System.out.println("Introdu numele tau: "); String nume = scanner.nextLine(); System.out.println("Numele tau este " + nume); System.out.println("Introdu varsta ta: "); String varsta = scanner.nextLine(); System.out.println("Varsta ta este " + varsta); //modifica tipul variabilei din String in int int age = Integer.parseInt(varsta); In urma folosirii codului scanner.nextLine(), programul va stoca in variabila email prima linie de text care va fi introdusa in consola. Un aspect important consta in faptul ca liniile citite sunt de tipul String, iar asta iti ofera multa flexibilitate pentru ca astfel le poti interpreta si modifica asa cum doresti tu. Citirea si scrierea fisierelor in Java Cand vine vorba de citirea dintr-un fisier, este extrem de important ca acel fisier sa existe si sa-i fie precizata locatia exacta de pe disk, astfel incat sa fie citite datele din el. Daca locatia oferita programului nu este exacta si programul esuaza sa citeasca datele din fisier, atunci acesta (daca nu este scris corect) se poate opri din executie. In marea majoritate a cazurilor o exceptie este aruncata cand fisierul nu exista (de tipul FileNotFoundException) . Daca ajungem in aceasta situatie, e important sa tratam aceasta exceptie astfel incat programul nostru sa continue si sa nu-si inceteze executia. Asadar, indiferent daca esti pe Windows, Linux sau macOS iti recomand sa folosesti calea absoluta (adica locul exact unde se afla pe disc) pentru a arata unde se afla fisierul din care doresti sa faci operatia de citire. Iata mai jos un exemplu: public class FileReadTest { String fileLocationWindows = "C:\Users\Public\Desktop\fisierIntrare.txt"; String fileLocationLinux = "/home/ramon/Desktop/fisierIntrare.txt"; _____________________________________________________________________ 92 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ String fileLocationMac = "/Users/ramon/Desktop/fisierIntrare.txt"; FileReader in = null; try { //Daca esti pe Windows foloseste variabila fileLocationWindows //Asigura-te ca acest fisier exista si are orice fel de text in el in = new FileReader(fileLocationWindows); String dateFisier = new String(); int c; char tmp; while ((c = in.read()) != -1) { tmp = (char) c; //Intregul fisier va fi stocat in variabila dateFisier dateFisier += String.valueOf(tmp); } System.out.println(dateFisier); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); } finally { //Spunem Sistemului de Operare sa inchida fisierul deschis if (in != null) { in.close(); } } } Operatia de scriere intr-un fisier este mai usor de facut pentru ca nu trebuie sa existe fisierul in care vrem sa scriem. Daca fisierul destinatie (cel cu denumirea in care vrem sa scriem) nu exista, atunci programul il va crea automat, deci nu trebuie sa-ti faci griji. Important si aici este sa te asiguri ca oferi corect locatia de destinatie a fisierului. Iata mai jos un exemplu: String text = "Hello World, new world"; String fileDestination = "C:\Users\Public\Desktop\outFile.txt"; try { out = new FileWriter(fileDestination); _____________________________________________________________________ 93 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ //folosim aceasta secventa de cod pentru a scrie un flux de date //de tipul String intr-un fisier aflat pe Desktop out.write(text); } catch (IOException e) { System.err.println(e.getMessage()); } finally { if (out != null) { out.close(); } } In sectiunea de cod de mai jos poti vedea un exemplu complet de citire, respectiv scriere a unui text intr-un fisier. Programul citeste datele din fisierul input.txt si le scrie in fisierul output.txt. Daca nu introducem o locatie anume de unde dorim sa citim/scriem in fisier, programul va folosi locatia default (cea in care se afla proiectul tau Java). Pentru a afla aceasta locatie, avem la dispozitie functia System.getProperty("user.dir"). Aceasta functie o folosim pentru a afisa in consola locatia curenta, unde programul nostru in Java cauta (by default) fisierul input.txt, respectiv unde va crea fisierul output.txt. public class FileTest { public static void main(String[] args) throws IOException { String currentDir = System.getProperty("user.dir") System.out.println("Working Directory = " + currentDir); FileReader in = null; FileWriter out = null; try { in = new FileReader("input.txt"); out = new FileWriter("output.txt"); String dateFisier = new String(); int c; char tmp; _____________________________________________________________________ 94 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ while ((c = in.read()) != -1) { tmp = (char) c; //Intregul fisier va fi stocat in variabila dateFisier dateFisier += String.valueOf(tmp); } dateFisier += “ NOI DATE LA SFARSIT”; out.write(dateFisier); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } Acest program citeste datele dintr-un fisier, le stocheaza intr-o variabila de tipul String (dateFisier), dupa care le scrie intr-un alt fisier. Lucrul cu fisiere in Java este mult mai complicat fata de exemplul pe care ti l-am dat eu mai sus. Recomandarea mea este sa iei aceasta sectiune de cod si sa o folosesti (cat timp esti la inceput) pentru a citi tot textul dintr-un fisier (input) pe care ulterior sa-l manipulezi (sa elimini spatiile / sa identifici elementele care te intereseaza din fisier etc) folosind functiile clasei String. _____________________________________________________________________ 95 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Dupa cum te-ai obisnuit pana acum, la fiecare final de capitol iti pun la dispozitie un set de cateva exercitii pe care tu sa le practici. De aceasta data 1) Creeaza un program care citeste numerele din cele 3 fisiere atasate AICI. Dupa citire, aceste numere vor fi sortate in ordine crescatoare si vor fi scrise intr-un fisier nou denumit "rezultat.txt". Pe prima linie se va scrie cel mai mare numar dintre cele citite, urmat numarul total de elemente citite din cele 3 fisiere. Exemplu fisiere "rezultat.txt": 8181 45 3 4 5 19 ... Unde 8181 reprezinta cel mai mare numar dintre cele citite, iar 45 reprezinta numarul total de numere citite din cele 3 fisiere. Raspuns corect: 991 44 3 4 _____________________________________________________________________ 96 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Capitolul 7 - Structuri de Date in Java In acest capitol si in urmatorul vom discuta despre 2 elemente fundamentale din programare care ne fac viata mai usoara: Structuri de Date si Colectii. La sfarsitul acestui capitol iti va fi mult mai clar ce sunt acestea, unde si cand le poti folosi si mai ales de ce sa le folosesti. Haide sa incepem cu prima dintre cele doua. Ce sunt structurile de date? Structurile de date sunt fix ceea ce sugereaza titlul: structuri de date. Sunt anumite tipuri de date speciale care ne ajuta pe noi sa le structuram si sa le manipulam in functie de obiectivul nostru. Mai exact, structurile de date reprezinta o grupare de date care sunt organizate, stocate si manage-uite cu scopul de face accesul si modificarea (datelor) cat mai eficienta si mai usoara. Fiecare structura de date (ex: stive, cozi, vectori etc.) are un comportament, un mod de acces la date si functii specifice. Utilizarea acestora depinde foarte mult de context si, bineinteles, de problema care se doreste a fi rezolvata. In cele ce urmeaza vom discuta mai multe despre acestea, dar mai intai hai sa vedem de cate tipuri pot fi aceste structuri de date. Tipuri de structuri de date Cand vine vorba de structuri de date, avem mai multe tipuri din care putem alege in functie de nevoie. Iti voi enumera cateva dintre cele mai des folosite, dupa care vom incepe sa discutam (si sa le folosim) pe fiecare in parte: ● Vectori ● Liste (LinkedList, ArrayList) ● Stive (Stack) ● Cozi (Queue) ● Dictionare (HashMap, TreeMap) Acestea sunt doar o parte dintre structurile de date disponibile (si precreate deja in Java). Pe langa acestea mai exista multe altele care fie au fost implementate deja, fie necesita implementare (cum ar fi grafurile). Un aspect important pe care trebuie sa-l avem in considerare este faptul ca fiecare structura de date are rolul sau si utilitatea potrivita in anumite contexte. _____________________________________________________________________ 97 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ De exemplu, daca dorim sa stocam mai multe elemente si sa le accesam recurent (prin cautare), ar fi mai util sa utilizam un anumite structuri (dictionare sau multimi), in schimbul altora. De ce? Pentru ca timpii de accesare/cautare sunt mult redusi fata de alte structuri (liste, vectori, cozi etc.). Acum haide sa le luam pe rand si sa vorbim despre fiecare in parte: 1) Vectori (Arrays) Vectorii reprezinta structuri de date care pot stoca informatii in variabile structurate care au un scop bine definit. Acestea pot stoca numere (int, float etc.), caractere, sau chiar siruri de caractere. Declararea acestor siruri este foarte simpla, fiind asemanatoare cu declararea unei simple variabile. Deosebirea dintre o variabila si un sir, este ca variabila poate sa aiba alocata o singura valoare pe cand unui sir ii pot fi alocate mai multe valori. Iata in figura 7.1 un exemplu de Array/Vector (arr) cu 10 elemente (care nu au fost alocate deocamdata): Figura 7.1 In programare numaratoarea incepe de la 0, astfel prima pozitie a variabilei noastre "arr", declarata cu 10 pozitii este 0, iar ultima este 9. Atribuirea valorilor a unei anumite pozitii se face prin index (ex: [3], [5] ), care este valoarea aflata in parantezele drepte si determina pozitia careia ii va fi atribuita valoarea dorita. Cum folosim un Vector in Java? Mai jos este evidentiata diferenta dintre declararea unei variabile si declararea unui vector. Initializarea numarului de pozitii se face astfel. int var; int[] exempluVector; Acum, pentru a folosi acest vector, trebuie sa-l initializam (sa-i alocam o dimensiune fixa de memorie - astfel incat sa-l putem folosi), iar apoi sa alocam valori (de tipul int) pe diferite pozitii din acest vector. _____________________________________________________________________ 98 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ //declararea si alocarea de memorie int[] exempluVector = new int[15]; //atribuirea unui element la un anumit index exempluVector[12] = 5; exempluVector[7] = 12; Pana in acest moment, am creat o variabila de tip vector, i-am alocat o dimensiune si am alocat valori pe cateva pozitii din vector. Dar dupa cum poti observa, acest procedeu nu este prea scalabil (imagineaza-ti sa ai 1000 de pozitii intr-un vector si sa le aloci manual pe fiecare in parte…). Pentru a automatiza acest proces, vectorii sunt cel mai des intalniti impreuna cu buclele (for loops & while l oops). Aceste bucle sunt folosite in operatii repetitive care se folosesc de vectori. O secventa de cod prin care putem face asta este: for (int i = 0; i < 15; i++) { exempluVector[i] = 0; } Astfel toate valorile din vectorul de mai sus au fost initializate cu valoarea 0. Un subiect important care trebuie dezbatut este initializarea mai multor valori decat pozitii. In cazul in care valoarea lui "i" de mai sus ar fi depasit numarul de pozitii al variabilei "numar", in program s-ar fi regasit o eroare de tip "Array Index Out of Bounds" , o referire la iesirea din numarul de pozitii alocate variabilei. In acest caz, ca o recomandare, putem modifica valoarea 15 (care a fost pusa manual), cu functia exempluVector.length care va intoarce valoarea maxima alocata pentru vector (in momentul initializarii). In cazul in care vrem sa facem o operatiune cu acest vector (exemplu: sa adaugam elemente in el si sa printam valoarea acestora) putem face in felul urmator: int[] exempluVector = new int[15]; System.out.print("Vectorul este: "); for(int i = 0; i < exempluVector.length; i++) { exempluVector[i] = i + 2; System.out.print(exempluVector[i] + " " ); } Rezultatul afisat in urma rularii codului de mai sus va fi: Vectorul este: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 _____________________________________________________________________ 99 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Iata in figura de mai jos o ilustratie cu codul si rezultatul in urma compilarii acestuia in Eclipse. Figura 7.2 _____________________________________________________________________ 100 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii Dezvolta o aplicatie pentru reprezentarea vectorilor de numere intregi, si anume: ● ● ● ● ● ● ● ● ● ● se va determina un tip de date pentru astfel de reprezentari se va citi un vector de numere intregi se va afisa un vector de numere intregi se vor aduna componentele vectorului (vom prezenta doua metode: una cu transfer rezultat prin tipul rezultat si alta cu transfer prin linia de parametri) se va realiza operatia de inmultire a componentelor vectorului media elementelor din vector numarul de componente negative si numarul de componente pozitive din vector minimul si maximul dintre elementele vectorului sortarea ascendenta a vectorului cautarea unui anumit element (adica un numar, o valoare) in sir cu returnarea pozitiei pe care se gaseste; in cazul in care elementul (o valoare) se afla de mai multe ori pe pozitii diferite, vom avea ca rezultat prima pozitie pe care acesta se gaseste. Vectorul va contine 50 de elemente, numere intregi, generate aleator (vezi functia Random), de la -250 la 250. _____________________________________________________________________ 101 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 2) Liste inlantuite (Linked Lists) Ce este si cum functioneaza o Lista? Listele inlantuite sunt un tip de structuri de date, similare cu vectorii, care stocheaza mai multe elemente in serie. Fiecare element din lista se numeste nod si contine 2 lucruri importante: valoarea stocata in nod (partea din stanga) si informatia de memorie (pointer) cu privire la urmatorul nod (partea din dreapta). Ca mod de functionare listele seamana foarte multe cu vectorii, dar exista cateva diferente fundamentale: ● Vectorii au o dimensiune fixa (ex: 100 de elemente), iar Listele au o dimensiune dinamica ● Listele au nevoie de mai multa memorie alocata datorita celor 2 componente ale nodului, fata de o singura componenta a vectorului ● Pentru liste este mult mai usor (si mai eficient dpvd resurse) sa adaugi si sa stergi elemente in comparatie cu vectorii Figura 7.3 Un lucru pe care vreau sa-l retii este faptul ca exista 2 tipuri de Liste (LinkedList si ArrayList) cu urmatoarele caracteristici: ● LinkedList ○ Dimensiunea listei este dinamica ○ Adaugarea si eliminarea elementelor se face cu usurinta, de la cele 2 capete ale listelor ○ Accesul la un element se face mai greu (dureaza mai mult, pana cand lista este parcursa si elementul este gasit) ● ArrayList ○ Dimensiunea listei este dinamica ○ Adaugarea si eliminarea elementelor necesita mai mult timp si mai multe resurse ○ Accesul la orice element din lista se face mai rapid si cu usurinta _____________________________________________________________________ 102 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Nu este una mai buna fata de cealalta, dar cu ce vreau sa ramai din acest exemplu, este faptul ca aceste 2 tipuri de liste au atat puncte tari cat si puncte slabe, iar totul depinde de tine sa le cunosti si sa le utilizezi in cele mai bune momente posibile, astfel incat programul sa functioneze cat mai eficient posibil, cu un consum minim de resurse. Care sunt functiile unei Liste? Hai sa vedem care sunt (o parte din) functiile unui liste (LinkedList sau ArrayList): ● AddFirst – adauga un element in fruntea listei ● AddLast – adauga un element la sfarsitul listei ● RemoveFirst – sterge primul element din fruntea listei si il returneaza ● RemoveLast – sterge ultimul element din listei si il returneaza ● isEmpty – intoarce 1 daca lista este goala; returneaza 0 daca lista contine cel putin un element Acestea sunt functiile de baza pe care le vei folosi in marea majoritate a cazurilor, dar pe langa aceastea mai exista si multe altele. Vei avea ocazia sa le testezi pe masura ce vei progresa cu studiile tale ;) Cum folosim o Lista (inlantuita) in Java? Haide sa luam un exemplu concret de utilizare a listelor (LinkedList si ArrayList), astfel incat, tu, sa poti vedea functiile acestora si modul lor de lucru. Dupa cum poti sa vezi si in exemplul de mai jos, am creat o lista inlantuita (LinkedList) si folosim instanta creata pentru a exemplifica functiile pe care le avem la dispozitie: import java.util.*; //NU UITA SA INCLUZI functiile din Java Util public class ListTest { public static void main(String[] args) { // Crearea obiectului din lista LinkedList<String> list = new LinkedList<String>(); // Adaugarea elementelor in lista list.add("A"); _____________________________________________________________________ 103 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ list.add("B"); list.addLast("C"); list.addFirst("D"); list.add(2, "E"); list.add("F"); list.add("G"); System.out.println("Lista inlantuita: " + list); // Stergerea elementelor din lista list.remove("B"); list.remove(3); list.removeFirst(); list.removeLast(); System.out.println("Lista inlantuita dupa elementele eliminate: " + list); // Cautarea elementelor din lista if( list.contains("E") ) { System.out.println("Lista contine elementul 'E' "); } else { System.out.println("Lista nu contine elementul 'E'"); } // Numarul elementelor din lista System.out.println("Lungimea listei = " + list.size()); // Functiile get si set ale listei inlantuite String element = list.get(2); System.out.println("Element din lista, ales este : " + element); list.set(2, "Y"); System.out.println("Lista inlantuita dupa modificare : " + list); } } Dupa cum ai putut sa vezi mai sus (si in exemplele de mai jos) listele inlantuite au multe functii si aplicabilitati practice. Un exemplu real de folosire a listelor poate fi un browser web, mai exact istoricul de navigare al acestuia. In “spatele unui browser” se afla o lista inlantuita care va retine fiecare site pe care ai navigat in sesiunea curenta de browsing. _____________________________________________________________________ 104 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ In momentul in care apesi pe butonul “Back” sau “Forward” vei parcurge paginile stocate de catre aceasta lista. Destul de cool, nu? :) Un alt exemplu poate fi managementul memoriei unui calculator. In “spate” exista o lista inlantuita care mentine blocurile de memorie libere si cele utilizate (alocate). Iata in figura de mai jos o rezultatul in urma compilarii programului in Eclipse. Figura 7.4 _____________________________________________________________________ 105 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii 1) Creaza o lista care contine elementele: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100. Scrie in Java un program care ia aceasta lista si face o lista noua care contine doar elementele pare ale acestei liste. 2) Creaza o lista cu numele a 10 prieteni (numele nu trebuie sa fie distincte). Respectand ordinea, rezolva urmatoarele cerinte: ● Sorteaza lista de nume. ● Utilizand o lista auxiliara, determina numarul de aparitii al fiecarui nume. ● Determina numele care apare de cele mai multe ori in lista initiala. ● Determina numele care apar cel mai putin ori in lista initiala. ● Revenind la lista initiala de nume, inverseaza ordinea elementelor. _____________________________________________________________________ 106 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 3) Stiva (Stack) Ce este si cum functioneaza o Stiva? In programare stivele reprezinta un tip de date abstracte, extrem de benefice in mai multe contexte. Ele stau la baza alocarii de memorie, deci si la baza functionarii calculatoarelor (si a OS-urilor). Ca mod de functionare, stivele sunt de tipul LIFO (Last In First Out) si merg pe principiul: ultimul element adaugat in stiva este si primul element care iese din ea. Iata mai jos o ilustratie care exemplifica modul de functionare: Figura 7.5 Care sunt functiile unei Stive? Dupa cum am spus si mai devreme, stiva, ca structura de date, are anumite functii specifice. Aceste functii arata in felul urmator: ● Push – adauga un element (o entitate) in stiva. Adaugarea se poate face doar la varful stivei. ● Pop – sterge un element din stiva si il returneaza. Stergerea se poate face doar la varful stivei. ● Peek – intoarce elementul din varful stivei fara a efectua nicio modificare asupra acesteia. ● isEmpty – intoarce 1 daca stiva este goala; 0 daca are cel putin un element. _____________________________________________________________________ 107 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Iata in figura de mai jos exemplificate cele 2 functii principale ale stivei, cu scopul de a te face sa intelegi mai bine conceptul: Figura 7.6 Cum folosim o Stiva in Java? Haide acum sa cream o stiva si sa o folosim intr-un exemplu practic. In primul rand vom folosi clasa Stack, cu ajutorul careia ne vom crea o instanta prin care vom reprezenta stiva. Prin intermediul acestei instante vom putea folosi functiile deja create in aceasta clasa (push, pop, isEmpty s i peek). //In fisierul Stiva vom scrie public class Stiva { static final int MAX = 1000; //dimensiunea maxima a stivei int top; int a[] = new int[MAX]; Stiva() { top = -1; } boolean isEmpty() { return (top < 0); } _____________________________________________________________________ 108 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ boolean push(int x) { if (top >= (MAX-1)) { System.out.println("Stiva este plina"); return false; } else { a[++top] = x; System.out.println(x + " a fost adaugat in stiva"); return true; } } int pop() { if (top < 0) { System.out.println("Stiva este goala"); return 0; } else { int x = a[top--]; return x; } } int peek() { if (isEmpty() == false) { return a[top]; } return -9999; } } //intr-un alt fisier numit Main, vom scrie public class Main { public static void main(String args[]) { Stiva s = new Stiva(); s.push(10); s.push(20); s.push(30); System.out.println(s.pop() + " este primul element din stiva"); } } _____________________________________________________________________ 109 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Stiva, ca structura de date, este folosita de sistemul de operare in momentul in care aloca memorie programelor care au nevoie pentru a fi executate. De asemenea, stivele le poti folosi pentru a sorta, respectiv a procesa anumite tipuri (si formate) de date in diferite moduri. Foloseste-te de aceasta structura de date de tip LIFO oricand ai nevoie sa rezolvi o problema de programare, pentru ca este o resursa foarte buna pe care de acum incolo o vei putea accesa. Iata in figura de mai jos o ilustratie cu codul din Main si rezultatul in urma compilarii acestuia in Eclipse. Figura 7.7 _____________________________________________________________________ 110 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii 1) Scrie un program prin care sa testati functionalitatea unei stive. Stiva va contine 10 numere, generate aleator (vezi functia Random), de la 1 la 100. Afiseaza elementele din stiva in ordinea in care au fost procesate (LIFO). 2) Scrie un program cu ajutorul caruia sa sortezi elementele dintr-o stiva. Stiva va contine elementele: 9 -4 20 1 -1 44 -9 2. Nu ai acces decat la operatiile push(), pop(), top() si isEmpty(). _____________________________________________________________________ 111 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 4) Coada (Queue) Ce este si cum functioneaza o Coada? Cozile reprezinta un anumit tip de structuri de date, care au rolul de a retine/mentine datele, cu scopul de a fi procesate pe rand. Ca mod de functionare, cozile sunt de tipul FIFO (First In First Out) si merg pe principiul: primul element adaugat in coada este si primul element care iese din ea. Iata mai jos o ilustratie care exemplifica modul de functionare: Figura 7.4 Care sunt functiile unei Cozi? Dupa cum am spus si mai devreme, coada, ca structura de date, are anumite functii specifice. Aceste functii arata in felul urmator: Add (ENQUEUE) – adauga un element in coada. Adaugarea se poate face doar la finalul (back) cozii. ● Remove (DEQUEUE) – sterge primul element din coada si il returneaza. Stergerea se poate face doar la varful cozii (front). ● Peek – intoarce elementul din varful cozii fara a efectua nicio modificare asupra acesteia. ● isEmpty – intoarce 1 daca coada este goala; 0 daca are cel putin un element. ● Cum folosim o Coada in Java? Haide acum sa cream o coada si sa o folosim intr-un exemplu practic. In primul rand vom folosi interfata Queue, cu ajutorul careia ne vom crea o instanta prin care vom reprezenta coada. In Java, Queue find doar o interfata, trebuie sa o initializam cu o clasa, iar in acest caz am ales LinkedList ( listele inlantuite despre care vorbeam si mai devreme). Iata mai departe exemplul de utilizare a unei cozi in Java: _____________________________________________________________________ 112 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ import java.util.LinkedList; import java.util.Queue; public class QueueTest { public static void main(String[] args) { // Definirea instantei unei cozi cu proprietati de lista Queue<Integer> q = new LinkedList<Integer>(); // Adauga nr. {0, 1, 2, 3, 4} in coada for (int i = 0; i < 5; i++) { q.add(i); } // Afiseaza elementele din coada System.out.println("Elementele cozii: " + q); int elementSters = q.remove(); System.out.println("Elementul eliminat: " + elementSters); System.out.println(q); int head = q.peek(); System.out.println("Primul element din coda: " + head); int size = q.size(); System.out.println("Dimensiunea cozii: " + size); } } Cand folosim cozile si ce aplicabilitate practica au? In momentul in care dorim ca datele noastre sa fie procesate in ordine, folosirea unei cozi este recomandata. De asemenea, si in cazul in care aceste date trebuie sa fie procesate pe rang. In aceasta situatie iti sugerez sa te gandesti la un Router (echipament de retea care ne conecteaza la Internet). Acest Router primeste mai multe pachete din retea si le trimite in Internet. Ei bine, ia gandeste-te ce se intampla daca Router-ul primeste prea multe pachete si nu le poate procesa pe toate (pachetele care nu vor putea fi procesate, vor fi aruncate). _____________________________________________________________________ 113 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Ca un astfel de fenomen sa nu se intample, inginerii au adaugat pentru fiecare port/interfata a unui Router cozi, care sa retina fiecare pachet (care nu poate fi procesat) in parte. Aceste cozi se umple doar in momentul in care utilizarea interfetei este la 100%. Pe langa utilitatea in cazul echipamentelor de transmisie a pachetelor in retea, cozile se mai folosesc si in urmatoarele situatii: ● Memorie Cache - structurata sub forma unei cozi cu scopul de a procesa pe rand fiecare instructiune ● Functii de cautare - in timpul rularii algoritmilor de cautare, cozile pot fi folosite pentru retinerea de informatii (ex: algoritmul lui Dijkstra - foloseste o coada de prioritati - priority queue) ● Retinere a informatiilor care urmeaza a fi procesate Iata in figura de mai jos o ilustratie cu codul din Main si rezultatul in urma compilarii acestuia in Eclipse. Figura 7.8 _____________________________________________________________________ 114 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii 1) Scrieti un program prin care sa testati functionalitatea unei cozi. Coada va contine 15 numere, generate aleator (vezi functia Random), de la 1 la -100. Afisati elementele din coada in ordinea in care acestea sunt procesate (FIFO). 2) Sa se defineasca o clasa MyQueue care sa descrie o structura de date de tip coada. Datele clasei (private) vor fi urmatoarele: ● ● ● ● ● un obiect de tip MyArray (clasa inclusa in arhiva laboratorului); o constanta (Infinit) avand valoarea 9500; indicele primului element din coada; indicele ultimului element din coada; numarul de elemente din coada. Constructorul clasei va fi un: ● constructor fara parametri care se ocupa de initializarile membrilor. Metodele clasei: ● int getSize() = are ca rezultat numarul de elemente din coada; ● void enqueue(int value) = adauga o valoare in coada; ● int dequeue() = intoarce primul element din coada si il elimina, incrementand indicele corespunzator, fara a elimina efectiv elementul din obiectul de tip MyArray ( Infinit - coada vida); ● boolean isEmpty() = verifica daca este vida coada; ● String toString() = String cu elementele din structura de date. _____________________________________________________________________ 115 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ 5) Dictionare (Hash Maps) Ce este si cum functioneaza un Dictionar? In programare dictionarele reprezinta un sir de noduri (figura 7.9) care stocheaza o pereche de “(cheie, valoare)”. Astfel pentru fiecare cheie (unica) in parte va fi alocata o anumita valoare (care nu trebuie sa fie unica). Cheile trebuie sa fie unice pentru ca dictionarul foloseste o tehnica numita hashing. Hashing-ul este o metoda (un algoritm) prin care se genereaza o valoarea numerica (aka. hash), care identifica in mod unic acea cheie. Aceasta tehnica permite ca accesarea elementelor dintr-un dictionar sa fie facuta extrem de rapid in comparatie cu alte structuri de date. Motivul se datoreaza acestui hash, care permite dictionarului sa acceseze direct (aproape instant) indexul unde se afla perechea de (cheie, valoare) care doreste a fi accesata. Figura 7.9 In figura 7.9 de mai sus poti sa vezi structura dictionarului (care contine mai multe casute - noduri) si structura fiecarui nod in parte (care este alcatuit dintr-un hash, o cheie, o valoarea si adresa - locul unde se afla in memorie - urmatorului nod). Gasesti in figura de mai jos o ilustratie prin care vei putea intelege mai bine cum are loc maparea perechii cheie - valoarea intr-un dictionar. _____________________________________________________________________ 116 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Figura 7.10 Care sunt functiile unei HashMap? Dictionarele (HashMap) au cateva functii de baza care permit introducerea perechilor de cheie - valoare, cautarea acestora, stergerea lor etc. Hai sa aruncam o privire peste o parte din acestea: ● ● ● ● ● Put (cheie, valoare) – adauga o pereche de cheie - valoare in dictionar. Remove (cheie)– sterge elementul din dictionar care se afla la si il returneaza. Get (cheie) – intoarce elementul din dictionar care se afla la nodul <cheie> a efectua nicio modificare asupra acesteia. ContainsKey (cheie) - intoarce 1 daca dictionarul contine cheia cautata; 0 daca nu contine acea cheie. isEmpty – intoarce 1 daca dictionarul este goal; 0 daca are cel putin un element. Pe langa aceste functii, exista multa altele, dar am considerat ca acestea sunt cele de baza cu ajutorul carora vei putea profita de utilitatea acestei structuri de date. _____________________________________________________________________ 117 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Cum folosim un HashMap (Dictionar) in Java? Haide acum sa cream un dictionar si sa-l folosim intr-un exemplu practic. In primul rand vom folosi clasa HashMap, cu ajutorul careia ne vom crea o instanta prin care vom reprezenta un dictionar. Prin intermediul acestei instante vom putea folosi functiile deja create in aceasta clasa (put, get, remove, etc.). import java.util.*; public class HashDemo { public static void main(String args[]) { // Crearea unui dictionar de tipul HashMap HashMap<String, Double> dictionar = new HashMap(); / Adaugarea elementelor in dictionar / //- Persoana si contul bancar in EUR dictionar.put("Ana", 3434.34); dictionar.put("Alex", 123.22); dictionar.put("Dan", 1378.00); dictionar.put("Ion", 99.22); dictionar.put("Claudiu", -19.08); / Parcurgerea dictionarului prin folosirea unui for / or( Map.Entry<String, Double> entry : dictionar.entrySet()) { f System.out.print(entry.getKey() + ": "); System.out.println(entry.getValue()); } // Depozitarea a 1000 EUR in contul lui Ion double valoareCont = dictionar.get("Ion").doubleValue(); dictionar.put("Ion", valoareCont + 1000); System.out.println("Noul cont al lui Ion: " + dictionar.get("Ion")); } } _____________________________________________________________________ 118 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Cand folosim Dictionarele si ce aplicabilitate practica au? Dictionarele sunt folosite in tabelele de rutare pentru ca routerele trebuie sa decida unde sa trimita traficul: catre retea sau catre portul spre care poate trimite. Dictionarele sunt folosite: ● In retelistica, pe Routere, in crearea tabelelor de rutare. ● In stocarea parolelor in baza de date. Deoarece parolele sunt criptate, ele au un hash stocat in baza de date. In momentul in care tu trimiti parola, serverele lucreaza sa o puna intr-o functie si intr-un hash. Cheia este parola, hash-ul este valoarea acelei chei, deci acesta este un alt exemplu de dictionar. Iata in figura de mai jos o ilustratie cu codul din Main si rezultatul in urma compilarii acestuia in Eclipse. Figura 7.11 _____________________________________________________________________ 119 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Exercitii 1) Scrieti un program prin care sa asociati o valoare unei chei anume. Pentru asta folositi un HashMap c are va face asocierea intre numele unei persoane (cheia) si varsta ei (valoarea). Introduceti 5 persoane din cercul apropiat de prieteni dupa care afisati datele introduse in urmatorul format: “El este <nume>. Saluta-l pe <nume>. Are <varsta> ani si este tot mai fericit pe zi ce trece.” _____________________________________________________________________ 120 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ BONUS: Capitolul 8 - Versiunea codului cu Git si GitHub Ce este Git si GitHub? Hai sa vedem cum iti poti salva si cum iti poti apoi accesa codul in orice moment. Git si GitHub este din ce in ce mai utilizat si cerut de catre toti angajatorii. Reprezinta un software ce te ajuta la versionarea codului tau si chiar in management-ul codului sursa (SCM). Git-ul te ajuta sa iti salvezi codul scris, online. Iar cel mai mare avantaj este ca tu si ceilalti programatori dintr-un proiect puteti vedea schimbarile pe care le faceti in cod. Pe langa asta, poti si gasi anumite solutii pe problemele pe care le intampini in cod. Creatorul Linux, pe numele lui Linus Torvalds, este cel care s-a gandit la o metoda de versionare a codului, in momentul in care a considerat ca este nevoie ca mai multi programatori sa lucreze la versiunea sa de Linux. Hai sa vedem in ce context ai putea folosi Git-ul. De exemplu, daca vrei sa construiesti pe baza a ceea ce ai lucrat deja sau sa aduci si alte persoane care sa contribuie la munca ta, nu poti tine codul pe calculatorul tau pentru ca va deveni dificil ca si altii sa acceseze si sa lucreze cu ceea ce tu ai facut pana la momentul respectiv. Un alt exemplu ar fi ca, dupa ce ai scris cod si ai adaugat ceva acum 3 zile, te anunta testerul de software ca 90% din codul scris in ultimele 3 zile trebuie rescris, conform modificarilor in cerinta initiala (presupunand ca sunteti echipa mica). Prin GitHub te poti intoarce la versiunea de acum 3 zile si poti incepe sa lucrezi la asta fara ca tu manual sa stergi fiecare linie de cod adaugat in cele 3 zile. Bun bun, dar este folositor Git-ul pentru proiecte mari cu o echipa mai complexa? Raspunsul este da. Tocmai aici se vede cat de util poate fi. O echipa complexa inseamna o echipa care are membrii cu diferite roluri si chiar diferite drepturi pe proiect. Cei cu rol de tester pot colabora cu developerii, intre timp project managerul poate monitoriza cine, unde si ce a adaugat. _____________________________________________________________________ 121 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Simplu spus, prin folosirea Git, altii vor putea adauga si isi pot pune amprenta pe codul deja creat de tine. INTRA AICI pentru a afla mai multe despre Git si GitHub. Multi programatori folosesc GitHub pentru a-si stoca ceea ce au codat si pentru a-si crea un portofoliu pe care angajatorii il pot oricand vizualiza. Este extrem de important sa ai cont pe GitHub daca iti doresti o cariera in IT. Sa nu mai vorbesc ca poti colabora cu alti programatori ce vor aduce imbunatatiri codului tau. Pe langa GitHub, te mai poti folosi de GitLab si Atlantis, care fac exact aceleasi lucruri, dar au doar cateva mici diferente de design. Cum folosim Git pentru versionarea codului? De ce este important sa iti faci back-up la cod in Git? Versionarea codului este necesara, deoarece un program se scrie pe o perioada indelungata de timp, iar salvarile anumitor etape sunt absolut necesare pentru a te intoarce la versiunea codului pe care o doresti sau la versiunea care este corecta. Exemplele anterioare sunt doar cateva dintre cele simple, un intreg flow de dezvoltare al unui produs final fiind mult mai complicat in realitate, pentru echipele mari. Am amintit deja ca Git este foarte util atunci cand mai multi programatori lucreaza la acelasi cod si aduc propriile lor versiuni de cod, ce pot fi mai mult sau mai putin bune. Acum ca tot mai multi programatori aplica “laptop lifestyle”, adica isi iau laptopul si lucreaza cand, cat si mai ales de unde doresc ei atata timp cat au acces la Internet, este evident ca multi programatori care colaboreaza nu se afla in aceeasi tara, deci au diferite zone de timp (fusuri orare). Git-ul are avantajul de a mentine integritatea codului sursa . Asta datorita posibilitatii lucrului pe diferite “branch”-uri, adica pe diferite ramuri (pe care se lucreaza) care nu intra in conflict in momentul in care, sa zicem ca, mai multi programatori lucreaza pentru aceeasi aplicatie. Am putea sa ne uitam la un “repository” ca la un depozit in care practic chiar depozitam un intreg proiect, cu toate fisierele si folderele din care acesta este compus, dar care pe langa asta contine si un istoric al modificarilor/revizuirilor care au avut loc in fiecare fisier in parte. In Git, oricine care are o copie locala (pe propriul PC) al repository-ului are acces la intreaga baza de date a schimbarilor care au avut loc asupra codului, cu istoricul lor cu tot. _____________________________________________________________________ 122 #InvataProgramare - Introducere in Programare cu Java _____________________________________________________________________ Acum, daca tot avem o baza de date a intregului istoric al codului, cu toate fisierele si folderele din el, ce putem face cu acesta si cum anume? Pentru a interactiona cu codul, putem folosi linia de comanda sau un program cu interfata grafica. Mai concret: ● Putem clona istoricul sau putem interactiona cu el ● Putem crea branch-uri ● Putem da commit la ce am scris noi (acest commit se face local) ● Putem face merge ● Putem schimba si testa diferite versiuni ale codului, etc. Hai sa vedem comenzile pe care sa le dam pentru a configura contul de GitHub si cum se seteaza mai multi useri ce pot lucra la codul tau. Dupa asta vom adauga in Repository si vom modifica codul astfel incat munca ta sa evolueze in directia cea buna. Bineinteles, te poti oricand intoarce la anumite salvari ale codului tau, deci nu fi speriat daca ai gresit ceva. Este posibil ca oricand sa reincepi de la un nivel in care erai multumit. INTRA AICI pentru a vedea cum sa folosesti Git. Cum urcam codul pe GitHub? Stocand munca ta intr-o baza de date (repository) din GitHub, vei avea posibilitatea sa revii oricand la stadii din proiectele tale si sa inviti alte persoane sa contribuie la codul tau. Poti avea repository-uri publice si private, acestea din urma trebuind sa fie platite. Sunt multe alte platforme asemenatoare cu GitHub, dar aceasta este totusi cea mai cunoscuta pentru cod open source. Sa nu mai vorbesc ca marea majoritate a angajatorilor se ajuta foarte mult de ea si cer aplicantilor la job-urile lor sa-si prezinte portofoliul aici . Acum vei afla cum sa accesezi codul tau in GitHub, cum sa-l downloadezi si cum sa-l copiezi sau modifici. Bineinteles ca poti lua bucati de cod din anumite repository-uri si sa lucrezi la ele, dupa care sa le urci inapoi in repository-ul de care apartin si sa astepti sa vezi daca ai avut o contributie de succes, care multumeste pe toata lumea. Vei invata cum sa-ti creezi repository- urile tale si cum sa urci munca ta pe platforma. Poti vedea cine a adaugat ceva codul tau, urmarind commit- urile ce s-au facut. Urmareste acest video BONUS pentru a vedea cum poti face asta: INTRA AICI. _____________________________________________________________________ 123