1 Introducere în Java 1

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "1 Introducere în Java 1"

Transcript

1 1 Introducere în Java 1

2 Ce este Java?! Proiectat de Sun pentru programarea aparaturii electronice! Limbaj orientat pe obiect cu biblioteci de clase! Foloses te o mas ină virtuală pentru rularea programelor Proiectat de Sun Java este un limbaj de programare orientat pe obiect dezvoltat la Sun Microsystems, Inc. A fost creat de James Gosling pentru a fi utilizat la programarea aparaturii electronice. Ca urmare a robustet ii s i a independent ei de platformă, Java a trecut de bariera industriei aparaturii electronice la aplicat iile de Web, apoi la aplicaţii locale şi client-server Biblioteci de clase Java cont ine o mult ime de clase predefinite s i metode care pot trata majoritatea cerint elor fundamentale ale unei aplicat ii. Kitul Dezvoltatorului Java (JDK - Java Developer s Kit) include clase pentru gestionarea de ferestre, intrare/ies ire s i comunicat ie în ret ea. Java mai cont ine un număr de utilitare care ajută la dezvoltarea aplicat iilor. Aceste utilitare tratează operat ii cum sînt: depanarea, descărcarea s i instalarea, documentarea. Foloses te Mas ina Virtuală Java Unul dintre punctele forte ale lui Java este independent a de platformă (mas ină + sistem de operare). O aplicat ie Java scrisă pe o platformă poate fi dusă s i rulată pe orice altă platformă. Facilitatea este deseori referită ca write once, run anywhere (WORA). Ea este dată de folosirea Mas inii Virtuale Java - Java Virtual Machine (JVM). Aceasta rulează pe o mas ină locală s i interpretează codul de bit i (byte code) convertindu-l într-un cod mas ină specific platformei. Echipa lui Gosling a pornit de la C++, dar programele nu erau sigure, parte a complexit ăt ii limbajului, dar s i datorit ă unor facilit ăt i distructive cum sunt poantorii. Pentru evitarea problemelor echipa lui Gosling a inventat un limbaj nou orientat pe obiect numit Oak (în memoria unui stejar impunător vizibil din biroul lui Gosling). Pentru cres terea robustet ii au eliminat construct iile de limbaj problematice, iar pentru a face aplicat iile neutre arhitectural, au specificat complet semantica limbajului s i au creat o mas in ă virtual ă pentru rularea programelor. Des i Oak a fost proiectat s ă semene cu C++ pentru a reduce timpul de înv ăt are, el a fost reproiectat intern pentru a elimina pericolele s i elementele redundante ale lui C++. Oak nu a reus it s ă se impun ă în domeniul pentru care a fost creat, dar, dup ă aparit ia WWW-ului s i-a g ăsit un nou drum pe care s ă evolueze. Oak a fost redenumit în Java (exista deja un limbaj cu numele Oak). Robust, compact, independent de platform ă s i flexibil a devenit ideal pentru crearea de aplicat ii Web. Fiind interpretat este mai lent ca C++, dar sc ăderea vitezei este neimportant ă atunci cînd domeniul de utilizare este cel de interact iune cu utilizatorul. 2

3 Avantaje Java! Orientat pe obiect! Interpretat s i independent de platformă! Dinamic s i distribuit! Cu fire de execut ie multiple! Robust s i sigur Orientat pe obiect Obiectul este o entitate caracterizată prin atribute s i un set de funct ii folosite la manipularea obiectului. Java este puternic tipizat, aproape totul fiind, la nivel de limbaj, un obiect. Principalele except ii sînt tipurile primitive (întregii s i caracterele). Interpretat s i independent de platformă Programele Java sînt interpretate în setul de instruct iuni ale mas inii native în timpul rulării. Deoarece Java se rulează sub controlul JVM, programele Java pot rula sub orice sistem de operare care dispune de JVM. Dinamic s i distribuit Clasele Java pot fi descărcate dinamic prin ret ea atunci cînd este cazul. În plus, Java asigură un suport extins pentru programarea client-server s i distribuită. Cu fire multiple de execuţie (Multithreaded) Programele Java pot cont ine mai multe fire în vederea execut ie concurente a mai multor sarcini. Multithreadingul este o facilitate internă lui Java s i a aflată sub controlul JVM care este dependent de platformă. Robust s i sigur Java are facilităt i interne de prevenire a coruperii memoriei. Java gestionează automat procesul de alocare a memoriei s i verificarea limitelor tablourilor. Interzice aritmetica poantorilor s i restrict ionează obiectele la zone impuse de memorie. Termenul de multithreading (fire de execut ie multiple) este specific calculului paralel s i apare în contextul medii de execut ie care pot intercala execuţia unor instruct iuni din mai multe surse independente de execut ie. Diferent a fat ă de multitasking const ă într-o partajare mai profund ă a mediului de execut ie la nivel de thread-uri în comparaţie cu multitasking-ul. Thread-urile pot fi identificate numai prin registrul num ăr ător de prorame (PC) s i registrul poantor la stiv ă (SP) atunci cînd partajeaz ă un singur spat iu de adrese s i o singur ă mult ime de variabile globale. Acesta este motivul pentru care comutarea între-thread-uri se face foarte repede deoarece informat ia de stare de salvat s i de ref ăcut este scurt ă. 3

4 Independent a de platforma! Codul Java este stocat în fis iere.java! Programul.java este compilat în fis iere.class! Codul de bit i este interpretat la rulare Problema limbajelor compilate La compliarea unei aplicat ii într-un limbaj tradit ional, cum ar fi C, codul scris de programator este convertit în limbajul mas ină al platformei pe care are loc compilarea. Programul compilat poate fi rulat numai pe mas ini care au acelas i procesor (Intel, SPARC, Alpha) cu cea pe care s-a făcut compilarea. Java este un limbaj independent de platformă Programele sursă Java sînt stocate în fis iere cu extensia.java. De exemplu, o aplicat ie Java care gestionează student ii unei sect ii ar putea cont ine fis erele studenti.java, materii.java s i note.java. Fiecare fis ier.java este compilat într-un fis ier.class cu acelas i nume. De exemplu, studenti.java se va compila în studenti.class. Fis ierele.class cont in cod executabil Java numit cod de bit i (bytecode) care are instruct iuni mas ină independente de platformă. Mas ina Virtuală Java (JVM - Java Virtual Machine) Mas ina Virtuală Java asigură mediul de execut ie pentru programele Java. JVM interpretează codul de bit i în instruct iuni mas ină native ale mas inii pe care programul este în curs de rulare. Aceleas i fis iere.class pot fi rulate fără modificare pe orice platformă pentru care există o JVM. Din acest motiv JVM este uneori numită s i procesor virtual. Se numeşte compilator un program care converteşte un alt program, dintr-un limbaj numit sursă în limbaj maşină (unicul limbaj înţeles de direct de către calculator ). După realizarea completă a conversiei, programul în limbajul maşină va rula foarte rapid pe calculator. Procesul de compilare se realizează în mai multe faze: analiza lexicală (colectează caracterele programului sursă sub forma atomilor lexicali), analiza sintactică (preia atomii lexicali şi construieşte o reprezentare a sintactică a programului în memorie), analiza semantică (verifică existenţa erorilor de tip), generare de cod (aici se va obţine prima formă a limbajului maşină). Deşi limbajul maşină generat de compilator ar putea fi rulat direct pe calculator deseori el trebuie rulat împreună cu alte programe dependente de sistemul de operare pe care urmează să fie rulată aplicaţia finală. De 4

5 exemplu, în cazul operaţiilor de intrare/ieşire, compilatorul va genera apeluri catre funcţiile de intrare/ieşire ale sistemului de operare (în Java acesul la sistemul de opeare se face pe baza unor biblioteci numite pachete standard ). Pentru ca aplicaţie să funcţioneze în contextul respectivului sistem de operare, compilatorul va trebui să lege respectivele porţiuni ale sistemului de operare la programul tradus. Operaţia de legare conectează programele scrise de utilizatori la programele sistemului de operare prin plasarea adreselor punctelor de intrare în sistemul de opeare în programul scris de utilizator. Se numşte interpretor un program care rulează alte programe. Interpretorul este un simulator al unei unităţi centrale care extrage şi execută instrucţiuni ale unui limbaj de nivel înalt (şi nu limbaj maşină). Din punctul de vedere al conversiei în limbajul maşină, Java a implemetat un compromis între compilatoarele şi interpretoarele pure. Aici, limbajul sursă este compilat la o formă intermediară (între limbajul Java şi limbajul maşină) foarte uşor de interpretat (deoarece a fost deja decodificat o dată) numită cod de biţi cu ajutorul lui javac apoi, acest cod intermediar este rulat pe interpretorul codului de biţi, java (se zice că acest limbaj maşină este pentru o maşină virtuală - Maşina Virtuala Java - care este implementată nu la nivel hardware ci la nivelui interpretorului codului de biţi). Deci, în Java programul sură trece prin analiza lexicală, sintactică generarea de cod intermediar, apoi interpretare pentru a obţine relutate. 5

6 Securitatea mediului Java Limbaj s i compilator Încărcătorul de clase (Class Loader) Verificatorul codului de bit i (Bytecode verifier) Interfat ă locală restrictivă Nivele de securitate în Java Limbaj s i compilator Limbajul este sigur prin proiectare. Construct iile care permit manipularea directă a poantorilor au fost eliminate pentru evitarea erorilor în execut ie s i a fragmentării memoriei. Încărcătorul de clase Încărcătorul de clase garantează separarea stocării claselor ce provin de la surse locale de cele de ret ea. În timpul execut iei, motorul mas inii caută mai întîi referint ele la clasele locale s i numai apoi clasele referite din interiorul acestora. Din acest motiv, clasele locale nu vor fi suprascrise de cele încărcate din ret ea. Astfel, se previne modificarea comportamentului deja cunoscut al claselor locale ca urmare a unei intervent ii externe (prin ret ea). Verificatorul codului de bit i În timpul rulării unui program Java, JVM poate importa cod de oriunde. Java trebuie să fie sigur de codul importat respectiv că el este dintr-o sursă de încredere. Pentru realizarea acestei sarcini, motorul va realiza o serie de teste denumite verificarea codului de bit i. Interfat ă locală restrictivă Accesul la sistemul de fis iere local s i la resursele de ret ea este controlat prin clase locale s i metode. Clasele sunt prin definit ie restrictive. Dacă un cod importat încearcă să acceseze sistemul de fis iere local, sistemul de securitate lansează un dialog cu utilizatorul. 6

7 Miniaplicat ii Java (Applets)! Cele mai vechi tipuri de aplicat ii! Folosite în pagini HTML! Pot include cont inut activ (formulare, imagini, sunet, filme)! Vizualizate în navigator s i pot comunica cu un server Miniaplicat ii Java O mare parte din popularitatea lui Java pornes te de la posibilitatea dezvoltării unor aplicat ii mici (applets, în engleză) care pot fi înglobate în pagini HTML s i descărcate prin ret ea atunci cînd pagina este vizualizată într-un navigator de Web. Există două tipuri de miniaplicat ii Java: cu s i fară încredere (trusted s i untrusted, în engleză). Miniaplicat iile fără încredere sînt restrict ionate din punctul de vedere al accesului local, cele de încredere au permisiunea accesării resuselor locale. Caracteristicile miniaplicat iilor Miniaplicat iile sînt de natură grafică, tinzînd să cont ină controale cum sînt butoanele, cutiile de text, listele de select ie. Totus i, miniaplicat iile pot să facă mult mai mult decît simpla afis are a unor controale (obiecte de interfat ă grafice). Iată o listă cu cîteva dintre posibilităt ile miniaplicat iilor:! vizualizarea de animat ii, imagini s i redare de sunete;! conectarea la baza de date aflată pe serverul de Web de pe care s-a descărcat miniaplicat ia;! comunicat ia cu un server de Web prin socluri (soket, în engleză);! comunicat ia cu o aplicat ia Java rulată pe sereverul de Web;! pot utiliza CORBA (Common Object Request Broket Architecture) pentru a comunica cu Java sau cu aplicat ii ne-java de pe server-ul de Web. OMG (Object Management Group) este un consort iu creat în scopul dezvolt ării de standare în programarea orientat ă pe obiect. CORBA specific ă condit iile în care un obiect respect ă specificat iile OMG, în principiu, specificat iile descriu standardul de interfat ă pentru aceste obiecte. 7

8 Aplicat ii Java! Crearea de aplicat ii de sine stătătoare: G JVM rulează aplicat ii independente G nu se încarcă clase prin ret ea! Crearea de aplicat ii client-server: G deserves te mai mult i client i dintr-o singură sursă G se încadrează în modelul multi-nivel pentru calcule pe Internet. Aplicat ii Java de sine stătătoare Des i, Java s i-a câs tigat popularitatea datorită miniaplicat iilor, e posibilă s i crearea unor aplicat ii de sine stătătoare (nu este nevoie de un navigator pentru rularea lor). Acestea sunt oarecum echivalentul programelor executabile din C şi C++. Aplicat ii client Miniaplicat iile Java pot fi rulate pe un sistem de operare local sub forma unor aplicat ii de sine stătătoare. Acest mod de lucru este specific dezvoltării de aplicat ii client (aplicaţia este descarcătă de pe un server dar rulată în navigator, care este clientul serverului de Web) s i este, uzual, fară restrict iile de securitate specifice miniaplicat iilor. De exemplu, aplicat iile Java pot accesa sistemul local de fis iere sau să stabilească conexiuni cu alte mas ini prin ret ea. Miniaplicat iile pot beneficia de aceste facilităt i doar dacă au fost înregistrare că sînt de încredere; restrict ia previne coruperea sistemului local de fis iere de către miniaplicat ii malit ioase. Caracteristici adit ionale ale miniaplicat iilor de încredere sînt:! accesul la sistemul de fis iere local;! accesul la o mas ină distinctă de server-ul de pe care s-a descărca miniaplicat ia;! lansarea în execut ie a unor programe noi sau încărcarea de biblioteci locale. Aplicat ii sever Aplicat iile Java pot fi, de asemenea, rulate pe o mas ină server dacă JVM este disponibilă pe platforma respectivă. Rularea pe server asigură dezvoltarea de aplicat ii după modelul celor 3 nivel specifice calculului pe Internet. Aplicaţia server rulează în mod continuu pe server şi trimite un răspuns unui client ca urmare a unei cerei efectuate de acesta. 8

9 Rularea aplicat iilor Java Sistem de operare JVM Aplicat ie Navigator JVM Miniaplicat ie Rularea aplicat iilor Java Toate aplicat iile Java, inclusiv miniaplicat iile, se rulează la nivelul JVM. JVV este pornită diferit, după cu programul este o aplicat ie Java sau o miniaplicat ie. Rularea aplicat iilor Aplicat iile se rulează prin unei JVM locale direct din sistemul de operare. JVM interpretează programul Java s i îl convertes te în instruct iuni mas ină specifice platformei. Rularea programului se face plecând de la metoda statică numită main() pentru o aplicat ie de sine stătătoare sau printr-o referint ă la o clasă de miniaplicat ie dintr-un fis ier HTML atunci cînd un program este încărcat din navigator. Rularea miniaplicat iilor O miniaplicat ie Java este un tip special de program folost în paginile Web. Atunci cînd navigatorul de Web cites te o pagină HTML cu marcajul de miniaplicat ie (<applet>) ve descărca miniaplicat ia prin ret ea pe sistemul local s i va porni miniaplicat ia în JVM care vine inclusă în navigator. 9

10 Funct ionarea JVM! Încărcătorul de clase al JVM încarcă clasele necesare fuct ionării aplicat iei! Verificatorul JVM verifică secvent ele ilegale de cod de bit i! Gestionarul de memorie al JVM eliberează memoria după terminarea aplicat iei Încărcătorul de clase al JVM Rularea unui fis ier cu extensia.class poate necesita s i alte clase pentru îndeplinirea scopului propus. Aceste clase sînt încărcate automat de încărcătorul (class loader) de clase în JVM. Clasele pot să fie stocate pe discul local sau pe un alt sistem, caz în care accesul se face prin ret ea. JVM foloses te variabila de sistem CLASSPATH pentru determinarea pozit iei fis ierelor locale.class. Clasele încărcate prin ret ea sunt păstrate într-un spat iu de nume separate de cel al claselor locale. Astfel se previn conflictele de nume s i înlocuirea sau suprascrierea unor clase standard prin clase malit ioasă. Verificatorul JVM Sarcina verificatorului este să determine dacă codul de bit i interpretat nu violează regulile de bază ale limbajului Java s i că acesta este dintr-o sursă de încredere. Validarea asigură inexistent a violării accesului la memorie sau execut ia unor act iuni ilegale. Gestionarea memoriei JVM urmăres te toate instant ele (variabilele obiect) utilizate. Dacă o instant ă nu mai este folosită JVM are obligat ia să elibereze memoria folosită de obiect. Eliberarea memoriei se face după ce obiectul nu mai este necesar nu neapărat imediat după aceea. Procesul prin care JVM gestionează obiectele care nu mai sînt referite se numes te colectare de gunoi (garbage collection). 10

11 Compilatoare JIT (Just-in-Time)! Cresc performant ele! Utile dacă acelas i cod de bit i se execută repetat! Optimizează codul repetitiv (ciclurile) Compilatoare JIT JVM traduce codul de bit i Java în instruct iuni native al mas inii pe care se rulează. Ce se petrece dacă acelas i cod trebuie executate din nou ceva mai tîrziu în program? În lipsa unui compilator JIT codul interpretat de la fiecare reluare a lui, chiar dacă a fost deja interpretata o dată ceva mai devreme deja. Avantajele compilatoarelor JIT Majoritatea JVM suportă deja compilare JIT. Compilatoarele JIT traduc codul de bit i numai la prima lui apartit ie; dacă acelas i cod va fi executat mai tîrziu, va fi automat asociat codului corespondent în limbaj mas ină. Compilatoatele JIT fac ca Java să funct ioneze mai repede în momentele în care se pune problema traducerii în mod repetat a unui cod de bit i în instruct iuni mas ină native. Efectul este spectaculos în cazul ciclurilor sau a funct iilor recursive. Unele compilatoare JIT sînt suficient de inteligenta ca să optimizeze traducerea unor secvent e de cod de bit i în instruct iuni native ale mas inii pe care se rulează aplicat ia. 11

12 Java s i calculul pe Internet! Calculul pe Internet are loc pe 3 nivele:! Java poate fi utilizat pentru oricare dintre aceste nivele Java s i calculul pe Internet Produsele firmelor serioase pentru calcule pe Internet trebuie să suporte construct ia de componente Java pentru trei nivele de aplicat ie, precum s i instrumete pentru esent iale pentru dezvoltare s i gestiune a alicat iilor. Suportul se implementează sub forma de instrumente, aplicat ii, baze de date, servere de aplicat ii s i interfet e pentru progrmarea aplicat iilor. Nivelul client Atunci cînd Java trebuie să fie rulat pe o mas ină client este tipic implementat într-o miniaplicat ie executata din navigator care poate comunica cu server-ul de pe care afost descărcat. Nivelul serverului de aplicat ii Java poate fi utilizate pe server-ul de aplicat ii pentru implementarea unor componente partajate s i reutilizabile ce t in de logica aplicat iei. Java mai poate fi utilizat la acest nivel de miloc pentru a furniza interfet ede control pentru aplicat ii generate sub forma unor pagini Web. Nivelul serverului de date Acest server stochează date, dar mai poate stoca s i executa cod Java, în particular acest cod manipulează intensiv date sau fort ează reguli de validare specifice datelor. Termenul de client-server apare în contextul sistemelor distribuite. Aplicat ia distribui ă este o colect ie de aplicat ii a c ăror distribut ie este transparent ă la nivelul utilizatorului astfel încît la aplicat ia pare s ă fie stocat ă pe o singur ă mas in ă local ă. Într-o ret ea de calculatoare utilizatorii simt c ă lucreaz ă pe o mas in ă particular ă, iar pozit ia lor în ret ea, stocarea datelor înc ărcarea s i funct ionalitatea mas inii lor nu este transparent ă. Sistemele distribite folosesc, uzual, o anumit ă form ă de organizare cliet-server. Clientul este o aplicat ie sau un proces care solicit ă un serviciu de la un alt calculator sau proces, denumit server. Server-ul este o aplicat ie care furnizeaz ă un anumit serviciu altor programe, numite client. Conexiunea între client s i server se face la nivel de mesaje transmise prin ret ea s i foloses te un protocol pentru codificareea cererilor clientului s i al rapsunsurilor server-ului. Server-ul poate s ă ruleze continuu în as teptarea cererilor sau s ă fie pornit de o aplicat ie care controleaz ă un grup de server-e. Acest model permite plasarea clent ilor s i a serevr-elor independent, în nodurile ret elei, posibil pe hardware-uri s i pe sisteme de operare diferite pentru a-s i îndeplini funct iile (server rapid/client lent). 12

13 Ce este JDK? Mediul de dezvoltare JDK Sun cont ine:! Compilator! Componentă de vizualizare a miniaplicat iilor! Interpretor al codului de bit i! Generator de documentat ie Componentele Sun JDK sunt:! compilatorul java javac, el compilează codul sursă Java în codul de bit i (bytecode) Java;! appletviewer este componenta pentru vizualizarea miniaplicat iilor, aceasta cites te un document HTML, descarcă miniaplicat iile referite în document s i le afis ează într-o fereastră proprie. Se foloses te ca o alternativă la navigatorul de Web pentru testarea miniaplicat iilor Java;! interpretorul codului de bit i Java, java, care este motorul ce rulează aplicat iile Java;! generatorul de documentat ie în format HTML pe baza codului sursă Java este javadoc. Alte scule JDK! depanatorul de clase Java este jdb (asemănător cu depanatoarele dbx sau gdb din UNIX);! javakey pentru generarea cheilor de certificare s i a codului Java de încredere (trusted);! jar pentru generarea de arhive de calse şi de resurse;! dezasamblorul codului de bit i Java într-un format inteligibil pentru oameni, javap;! aplicat ia de versionare a claselor, serialver. 13

14 Pachete Java! echivalentul bibliotecilor C! pachetele standard sunt pentru lucrul cu: Limbajul Ferestre Miniaplicaţii Intrare/Ieşire Comunicaţie în reţea Pachete Java Pachetele asigură bazele pentru funct ionarea lui Java s i sunt implementate sub forma unor serii de clase cu metode grupate după funct ionalitate. Pachetele Java sunt echivalentul bibliotecilor din C. De exemplu, există un grup de clase care ajută la crearea s i utilizarea conexiunilor de ret ea, acestea sunt toate cont inute în pachetul java.net. Pachetul de bază al limbajului Java este classes.zip. Pachete Java standard Aceste pachete cont in clasele fundamentale pentru toate aplicat iile s i miniaplicat iile Java, cîteva mai importante sunt: s Pachet Java Rol Clase incluse java.lang javax.swing java.applet java.io java.net Colecţia claselor de bază din Java. Conţine rădăcina ierarhiei de clase Java, Object, definiţiile tuturor tipurilor primitive etc. Clase pentru suportul scrierii miniaplicaţiilor. Colecţia de clase de intrare/ieşire (inclusiv pentru accesul la fişiere) Object, String, Thread, Runtime System Window, Button, Menu, Graphics Applet, AudioClip File, InputStream, OutputStream Socket, DatagramPacket, URL, InetAddress 14

15 Împacheta ri, platforme şi versiuni Java Împachetări:! J2SE - Java 2 Platform, Standard Edition! J2EE - Java 2 Platform, Enteprise Edition! J2ME - Java 2 Micro Edition Platforme (SO + UCP):! Solaris, Windows... + SPARC, Intel... Versiuni:! Java release 1.0, 1.1; Java release 2, versiunea 1.2, 1.3, 1.4, 1.5, 1.6 Împachetări Java Tehnologia Java bazată pe JVM este strucurată pe trei tipuri de produse proiectate în funcţie de cerinţele particulare ale pieţei de software:! J2SE - Java 2 Platform, Standard Edition: se foloseşte pentru applet şi aplicaţii care rulează pentru un singur calculator;! J2EE - Java 2 Platform, Enteprise Edition: pentru aplicaţii client/server distribuite;! J2ME - Java 2 Micro Edition: pentru crearea de aplicaţii care rulează pe un dispozitiv consumator (PDA, telefon celular etc.). Fiecare pachet de tehnologii Java are o ediţie SDK (Software Development Kit) prin care se pot crea, compila, executa programele în tehnologie Java pentru o platformă particulară. Platforme Java Familia de produse a tehnologiilor Java este strâns legată de J2SE SDK deoarece majoritatea programatorilor îşi încep cariera pe PC-uri prin scrierea de applet-uri. Sun a dezvoltat Java 2 Platform, Standard Edition SDK pentru următoarele platforme: Sistem de operare Solaris OE Microsoft Windows Solaris OE Procesor chip SPARC pe 32 biţi chip Intel pe 32 de biţi chip SPARC pe 64 de biţi 15

16 Sistem de operare Procesor Linux Intel Versiuni Java Prima versiune a lui Java a fost 1.0. Acesta a apărut pe piaţă sub denumirea de JDK 1.0, în anul 1996 şi conţinea maşina virtuală Java, bibliotecile de clase şi instrumentele specifice pentru dezvoltare (compilator etc.) aplicaţiilor. Evoluţia versiunilor de limbaj este prezentată în tabelul următor: Versiune An JDK JDK JDK 1.2 (cunoscut şi sub denumirea de Java 2) 1998 JDK JDK JDK 1.5 (cunoscut şi sub denumirea de Java 5) 2004 JDK 1.6 (Java 6) 2006 Începând cu JDK 1.2 toate versiunile au fost numite, pe scurt, Java 2. În timpul evoluţiei lui Java, modificările aduse limbajului iniţial au fost puţine, schimbări majore au avut însă loc la nivelul bibliotecilor acestuia şi al integrării limbajului în contextul unor tehnologoo software strâns legate de Java. Numerotarea de 2 (din Java 2) arată că limbajul a progresat, intrând oficial în perioda lui modernă, însă din dorinţa de a păstra continuitatea numerotării versiunilor de bibliotecă s-a acceptat că întregul limbaj să fie versionat pe baza acestora. Dincolo de modificările şi adăugirile de limbaj, în Java 2, apare pentru prima oară conectarea lui la un mediu de dezvoltare al aplicaţiilor. În afară de JDK, mai nou, Sun furnizează, şi separat componentele (JVM şi bibliotecile) necesare rulării de aplicaţii Java (fără posibilitatea dezvoltării de aplicaţii) sub denumirea de JRE (Java Runtime Environement). 16

17 2 Instalarea, configurarea JDK J2SE şi rularea unei aplicat ii Java 17

18 Instalrea şi configurarea JDK J2SE 1. Descărcare J2SE de la jdk-6-windows-i586.exe 2. Instalare JDK în C:\Program Files\Java\jdk Despachetare surse (src.zip) şi documentaţie (jdk-6-doc.zip de la ) 4. Configurare SO: Control Panel > System > Advanced > Environment Variables PATH 5. Verificarea configurării: Start > Run > cmd cu path şi java- version Instalarea JDK Ultima versiune de JDK se descarcă de pe site-ul Sun-ului ( pentru Windows, împachetarea J2SE fiind sub forma fişierului executabil jdk-6-windows-i586.exe. Acesta conţine şi JVM-ul care se va instala automat împreună cu JDK-ul. După instalare calea jdk/bin trebuie adăugată în lista fişierelor executabile pentru ca sistemul de opearare să găsească automat pe javac, java etc. Pentru aceasta, în Windows XP, mergem la Control Panel > System > Advanced > Environment Variables. 18

19 Aici, căutăm prin User Variables până găsim pe PATH, unde vom scrie pe C:\Program Files\java\jdk1.6.0\bin, apoi apăsam butonul OK. Deschideţi o consolă windows nouă (din Start > Run >... >cmd) în directorul în care se află stocat fişierul sursă Java (mai jos acest director este D:\My Documents\Cursuri\Curs Java\cod), apoi verificaţi dacă instalarea şi configurarea este corectă prin path şi java -version. Path ne arată că am introdus corect calea, iar java -version că JVM-ul s-a instala corect. Instalarea surselor de biblioteci şi documentaţiei Java Fişierele care conţine sursele bibliotecilor din JDK se instalează într-o formă comprimată în fişierul src.zip. Este recomandată decomprimarea şi instalarea lui pentru accesul la codul sursă în directorul src. Documentaţia este conţinută într-un fişier separat de JDK ce trebuie descărcat de pe pentru J2SE, versiunea 6 acesta este jdk-6-doc.zip. Acest fişier se va decomprima în directorul docs şi aeste în format HTML. Va putea fi vizualizate cu orice navigator de Internet începând cu index.html. Cel mai simplu este să se pună un bookmark în navigator către acest fişier. 19

20 Structură de directori ai JDK-ului va fi în final: jdk (numele versiunii actuale este jdk1.6.0, se modifică funcţie de versiune) *) bin (compilator java şi alte instrumente de dezvoltare) *) demo (exemple de aplicaţii Java) *) docs (documentaţia bibliotecile în HTML, după decomprimarea lui jdk-6-doc.zip) *) include (fişiere pentru compilarea metodelor native) *) jre (fişierele mediului de execuţie Java) *) lib (fişierele de bibliotecă) *) src (fişierele sursă de bibliotecă, după decompimarea lui src.zip) 20

21 Etapele genera rii unei aplicat ii Java Etapa: 1 Editarea: Salut1 salvare pe disc cu extensia.java 2 Compilarea: javac Salut1.java Salut1.class 3 Rularea: java Salut1 A. Încărcătorul de clase copiază conţinutul lui Salut1.class de pe disc în RAM B. Verificatorul codului de biţi se asigură că sistemul de securitate Java nu este violat C. Interpretorul citeşte din RAM şi traduce codul de biţi în limbaj maşină şi îl execută. Etapele necesare rulării unei aplicaţii Java Stocarea textul sursă. Toate programele Java sunt formate din obiecte. Există două tipuri de obiecte: tipurile de date fundamentale (numite unori, primitive sau de bază) şi tipurile de date definite de utilizator, numite clase. Tipurile primitive sunt definite la nivelul limbajului Java, iar clasele sunt definite de către programator sau de către alţi dezvoltatori. În continuare se prezintă o aplicaţia Java, formată dintr-o clasa numită Salut1, care va afişa pe ecran textul Salut!. Extensia fişierului sursă trebuie sa fie.java, iar numele acestuia Salut1. Numele clasei şi cel al fişierului sursă trebuie să fie acelaşi. Conţinutul fişierului sursă Java Salut1.java este: // Salut1.java public class Salut1 { // executia unei aplicatii Java incepe cu metoda main. public static void main( String args[] ) { System.out.println("Salut!" ); // terminare metoda main // terminare clasa Salut1 Explicarea liniilor codului sursă Java Linia // Salut1.java reprezintă un comentariu care se întinde pe o singură linie (începând cu primul carater de după // şi până la trecerea la linia nouă) din textul sursă. Comentariile ajută la înţelegerea codului Java explicând rolul unor secvenţe de cod. Ele nu apar în programul executabil, liniile în cauză fiind ignorate de către compilator. Atunci când este nevoie de comentarii mai lungi, ce 21

22 trebuie să se întindă pe mai multe linii, se va folosi perechea de delimitatori /*, */. Limbajul Java este case sensitive adică face diferenţa între scrierea cu litere mari şi mici. Dacă în loc de main se va scrie Main aplicaţia nu se va rula. public se numeşte modificator de acces, acesta permite definirea controlul accesului altor porţiuni de program la această porţiune de cod. class reprezintă începutul unei declaraţii de clasă şi este urmată de numele clasei (mai sus, Salut1). Orice aplicaţie Java trebuie conţină cel puţin o singură declaraţie de clasă. Clasa reprezintă un şablon pentru descrierea stării şi a comportamentului asociat unui obiect din acea clasă. Procesul de creare a unei obiect pe baza unei clase se numeşte instanţiere. Starea unui obiect este stocată în variabilele membri, iar comportamentul ei se implementează prin metode. { - acolada deschisă marchează începutul corpului declaraţiei de clasă şi va avea întotdeauna corespondentă o acoladă închisă - ce marchează terminarea declaraţie de clasă. Porţiunea de cod sursă delimitată de aceste acolade poartă denumire de bloc. Linia este locul de pornire a programului public static void main( String args[] ). Numele main este urmat de o paranteză rotundă (, un parametru şi o paranteză rotundă închisă ). Prezenţa parantezei spune compilatorului Java că main este o metodă şi nu o altă construcţie de limbaj. Atunci când dorim să rulăm o clasă pe JVM trebuie să-i specifică doar numele, interpretorul Java apelând automat metoda main a clasei. Metoda main este precedată de trei modificatori: public - care permite ca orice altă clasă să poată apela metoda main; static - spune că metoda main nu operează cu obiecte (deoarece în momentul pornirii aplicaţiei încă nu avem obiecte), tehnic vorbind aceasta nu-l are pe this (vezi referint a this). În general, metoda main este cea care construieşte obiectele necesare programului. Dacă însă dorim să apelăm numai metode ale clasei nu mai este necesară construct ia (aceasta se face cu operatorul new) lui; construct ia este obligatorie dacă se doreşte accesarea de metode sau de variabile de instant ă (vezi conceptul de clasă); void - indică faptul că metoda main nu întoarce o valoare. Linia {System.out.println("Salut!"); este echivalentă cu liniile (în sensul că din punctul de vedere al compilatorului Java efectul compilării este acelaşi - rezultă acelaşi cod de biţi - dar pentru o citire şi înţelegre mai uşoară se preferă cea de a două scriere - cu spaţii şi pe mai multe linii): { System.out.println( "Salut!" ); Aici acoladele marchează începutului şi terminarea corpului metodei main. Metoda are o singură instrucţiune care foloseşte un pachet de intrare/ieşire pentru afişarea în fereastra din care s-a rulat aplicaţia a textului Salut!. Textul de afişat se scrie între ghilimele şi poartă denumirea de şir de caractere sau mai pe scurt, şir. Metodele în Java pot avea parametri, metoda System.out.println face afişarea parametrului şir. Caracterul ; se numeşte terminator şi face ca metoda să fie considerată o instrucţiune Java. Clasa System este din pachetul java.lang şi conţine, printre altele, metode pentru interacţiune între JMV şi mediul extern (recunoaşte carecteristicile platformei pe care rulează). Prin System se pot accesa fişierele standard de intrare (in), ieşire (out) şi de erorare (err). 22

23 Este o eroare de sintaxă dacă un şir nu este cuprins în ghilimele la nivelul programului sursă sau dacă se omite un caracter terminator de instrucţie ;. Compilarea programului sursă Java Pentru compilarea programului Java stocat în fişierul Salut1.java se va folosi compilatorul javac astfel: javac Salut1.java. Compilatorul Java va crea fişierul Salut1.class ce conţine codul de biţi al aplicaţiei. Rularea aplicaţiei Java Deoarece codul de biţi este o reprezentare intermediară programului Java el nu poate fi rulat direct de sub sistemul de operare. Rularea necesită JVM care se porneşte cu java Salut1. JVM trebuie să primească numele clasei de rulat, în exemplul prezentat acesta este Salut1. Dacă numele clasei este acelaşi cu cel al fişierului în care acesta este stocat, căutarea clasei se va face automat pe baza numelui de fişier care are extensia.class. Erori în scrierea unei aplicat ii Java 1. Eroarea de sintaxă : apare atunci când compilatorul nu recunoaşte o linie de cod, reprezentând o violare a regulilor de scriere din limbaj. Compilatorul afişează un mesaj de eroare pentru ca programatorul să o poată identifica şi corecta. 2. Eroare de nerespectare a unor convenţii de limbaj:! O clasă public trebuie să aibă numele fişierului în care se stochează identic cu cel a numelui clasei! Extensia fişierului trebuie să fie obligatorui.java pentru fişierul care conţine declaraţiile de clasă. Erorile de sintaxă se mai numesc şi erori de compilare deoarece compilatorul le detectează în faza de compilare. Aplicaţia nu va putea fi rulată decât după corectarea tuturor erorilor de sintaxă. 23

24 Variabile! Variabila = nume dat unui grup de locaţii de memorie ce la un moment dat, stochează o singură valoare! Orice variabilă trebuie declarată! Caraterizată prin: nume, valoare, tip, persistenţă şi vizibilitate.! Variabilele pot fi iniţializate în momentul declarării Tip Nume Valoare int i = 5; La nivel conceptual, variabila este o abstactizare a componentei electrice numite memorie internă. La nivel de limbaj variabila reprezintă un nume simbolic, numit şi identificator, prin intermediul căruia vom putea accesa şi stoca valori în RAM-ul calculatorului. În Java orice variabilă trebuie declarată explicit, adică pentru fiecare nume de variabilă din program este obligatoriu să avem o line de forma Tip Nume = [Valoare iniţială]; ce se citeşte, variabila cu numele Nume se declară de tipul Tip. Declaraţia leagă (asociază) de numele variabilei un grup de caracteristici. Variabila poate fi declarată în orice locaţie din bloc, dar este preferabil să fie scrisă la începutul acestuia. Se pot declara mai multe variabile într-o singură linie.în Java variabilele sunt de două feluri: locale (declarate într-o metodă) şi câmp (declarate într-o clasă). Caractersticile legate de numele variabilei prin declaraţie sunt: Numele variabilei este formula prin care variabila este identificată în textul aplicaţiei Java. Valoarea variabilei este conţinutul locaţiilor de memorie alocate în RAM. Modul de interpretare al locaţiilor este determinat de tipul variabilei. Tipul asociat unei variabile prin declaraţie determină mulţimea valorilor şi a operatorilor ce pot acţiona asupra variabilei. Java este un limbaj puternic tipizat, adică tipul oricărei expresii, în particular a unei variabile, trebuie să poată fi determinat în momentul compilării. Persistenţa defineşte intervalul de timp din execuţia aplicaţiei Java în care se zice ca variabila există (în sensul că i se alocă o anumită regiune de RAM). Variabilele locale există atât timp cât metoda în care s-au declarat este activă în sensul că aceasta se rulează. Variabilele câmp există atât timp cât obiectul al cărui membru sunt există. Dacă variabila câmp este şi statică câmpul va exista cât timp clasa respectică rămâne încărcată în JVM Vizibilitatea defineşte porţiunea de cod din care un nume de variabilă este recunoscut de compilator. În afara acestei porţiuni de cod utilizarea respectivului nume va genera o eroare de sintaxă. Pentru variabilele declarate în interiorul unui bloc, vizibilitatea începe din locul declaraţiei şi se termină la acolada de închidere a blocului. Este posibil într-un bloc intern acelaşi numele de variabilă să fie redeclarat, situaţie în care vizibilitatea numelui extern nu o include pe cea a numelui intern. Iniţializarea variabilelor se poate face explicit, adică ele primesc o valoarea explicită în momentul delcarării. Dacă această valoare implicită nu este dată, variabilele de tipul întreg primesc valorea 0. 24

25 Nume de variabile! Numele unei variabile trebuie să înceapă cu o literă din alfabet sau underscore ( _ ) sau $! Următoarele caractere pot conţine şi cifre, dar nu spaţii sau operatori (+, -, *, / etc.)! Nu se poate folosi un cuvânt rezervat al limbajului Java pe post de nume de variabilă! Lungimea numelui este nelimitată! Este semnificativă scrierea cu litere mari sau mici OK - a x1 masa x2 masa$ideala masa_ideala Greşit - masa#ideala a-1 x*1 for if 1x Variabile locale Variabilele locale sunt declarate într-o metodă sau un bloc de cod Java. Din acest motiv vizibilitatea şi persistenţa lor este restrânsă la respectiva porţiune de cod. Acestea vor putea fi acceste (sunt vizibile) numai în interiorul respectivului bloc (variabilele declarate în afara metodelor pot fi accestate din orice metodă) şi vor avea alocat un spaţiu propriu în RAM atât timp cât blocul de cod respectiv se rulează. O variabilă locală trebuie să primească valoare înainte de a fi utilizată într-o expresie, altfel compilatorul va da un mesaj de eroare. Fie declaraţia: int i = 5; Aceasta declară o variabilă cu numele i de tipul int şi care are valoarea iniţială 5. Variabila, ca rezultat al unui proces de abstractizare, constă dintr-un grup de caracteristici (o denumire alternativă este cea de atribute). Procesul de asociere a unei valori unei caracteristici de variabilă poartă denumirea de legare (binding). Unele dintre carateristicile variabilei sunt cunoscute la momentul compilării, de exemplu numele şi tipul acesteia. Se zice că aceste caracteristici sunt legate static (static binding). Alte caracteristici, de exemplu valoarea - cu excepţia cazului când aceasta este iniţializată explicit, se leagă în timpul rulării aplicaţiei. Se zice că ele sunt legate dinamic (dinamic binding). 25

26 Cuvinte cheie rezervate Tipuri primitive Modificatori Instruct iuni Tipuri definite de utilizator boolean byte char double float int long short void false null true abstract final native private protected public static synchronized transient volatile break case catch continue default do else finally for if return switch throw try while class extends implements interface throws import package instanceof new super this Se numeşte gramatică o mulţime de definiţii formale ce alcătuiest structura sintactică (numită, pe scurt şi sintaxă) a unui limbaj. Gramatica este definită în termenii unor reguli de generare ce descriu ordinea constituenţilor dintr-o propoziţie. Fiecare regulă are o parte stângă, numită categorie sintactică şi o parte dreaptă formată dintr-o secvenţă de simboluri. Simbolurile pot fi terminale sau neterminale. Un simbol terminal corespunde unui constituent de limbaj care nu mai are structură sintactică internă (este un element minimal de limbaj). Cuvintele cheie reprezintă o mulţime de simboluri terminale care fac parte din sintaxa limbajului Java. Restricţia de bază referitoare la acesta este cea conform căreia nu se pot da nume de variabile (sau alte elemente de limbaj definite de programator) care sa aibă aceeaşi scriere cu acestea. Pe lângă cuvintele cheie de mai sus, numele const şi goto sunt şi ele rezervate şi nu pot fi folosite ca nume de variabile. 26

27 Tipuri de date în Java! Tipuri de date primitive: 6 tipuri de date numerice: - întregi: byte, short, int, long - reali: float, double 1 tip de dată pentru caractere: char 1 tip de dată bolean: boolean! Tipuri de date definite de utilizator: clasele: class intefeţele: interface tablourile Tipuri de date primitive Tipurile de date primitive sunt implementate la nivelul JVM. Tipic pentru Java este că numele lor începe cu literă mică. Astfel, float este un tip de data primitiv, în timp ce Float este un obiect. Tipuri întregi Tipurile întregi se folosesc pentru manipularea numerelor ce nu au parte zecimală. Valorile numerice întregi pot fi atât negative cât şi pozitive, se mai spune că pot fi cu semn. Tipurile întregi din Java sunt: Tip Spaţiu alocat Domeniu de valori byte 1 octet -128 la 127 short 2 octeţi -32,768 la 32,767 int 4 octeţi -2,147,483,648 la 2,147,483,647 long 8 octeţi -9,223,372,036,854,775,808 la -9,223,372,036,854,775,807 Exemple de valori întregi: în baza 10: 1, 2, L în baza 8 (numărul este prefixat cu 0): 07 în baza 16 (numărul este prefizăt cu 0x): 0xaa Tipuri reale Tipurile reale se folosesc pentru manipularea numerelor ce au pare zecimală. Ele se repezintă în virgulă flotantă conform standardului IEEE 745. Tipurile reale din Java sunt: 27

28 Tip Spaţiu alocat Domeniu de valori Precizie float 4 octeţi aproximativ ± E+38F 7 zecimale double 8 octeţi aproximativ ± E zecimale La tipul double precizia este dublă faţă de tipul float. Exemple de valori reale: float: 1.34F; double:.337, E108, 3.0, 3.46D\ Tipul caracter Tipul char se foloseşte pentru stocarea caracterelor individuale, spre deosebire de tipul obiect String ce se foloseşte pentru stocarea şirurilor de caractere. Codificarea caractereleor în Java respectă standardul Unicode pentru reprezentarea caracterelor în orice limbă pe 16 biţi (2 octeţi). Primele 256 de caractere corespund cu mulţimea de caractere ISO Latin 1 din a cărei parte este şi codificarea ASCIII. Exemple de valori caracter: A - litera A din alfabet \u03c0 - valoare definită prin codificare Unicode în hexazecimal a lui π \n - caracter special - line feed Majoritatea valorilor de tipul caracter se afişează pe ecran, există totuşi un grup de caractere neafişabile acesta fiind rezevate pentru comanda dispozitivelor de afişare. Tipic, ele încep cu backslash \ urmate de un alt caracter Tipul bolean Tipul boolean are două valori distincte, false şi true. Se foloseşte pentru evaluarea unor condiţii locice. Nu se poate converti la o valoare întreagă Tipuri de date definite de utilizator Clasele, intefeţele, tablourile sunt tipuri de date definite de utilizator. După definirea acestora de vor putea declara variabile de acel tip după modalitatea utilizată la tipurile primitive. 28

29 Literali Literalii reprezintă valori care nu sunt stocate în variabile.! numerici: - întregi: (Implicit int) (int în baza 10) (int în baza 8) 0x0 0xff 0X1FF (int în baza 16) 1L 022L 0x1FFFL (long) - reali: (Implicit double)! nenumerici: - booleeni: - caracter: - şir: (double) 1.23e E-9 (double) 6.3f 5.62F 4.12E9F (float) true false a \n \077 \u005f Salut/n Literalii şir se formează prin cuprinderea între ghilimele a unui grup de caractere. Pentru manipularea acestra se va folosi un tip obiect numit String, implementet la nivel de bibliotecă în Java şi nu tipul primitiv char ce poate stoca numai o singură valoare. Erori la declararea de variabile Fie următoarele declaraţii de variabile: 1 byte b = 130; 2 short s1 = 123, s2 3 int i = b*b*b*b; 4 long l = i+i+i; 5 double new=73.8; 6 boolean mergeinvacanta = true; 29

30 7 boolean max = s1>b; 8 char sal= Salutare! ; 9 char amic = a ; Linia 1: b este o variabilă de tipul byte, deci poate stoca valori în domeniul -128, 127. Compilatorul va da un mesaj de eroare deoarece valoarea de iniţializare este în afara domeniului admis. Linia 2: Este omis terminatorul de instrucţiune (;) de la sfărşitul declaraţiei. Linia 5: Declaraţia este incorectă deoarece new este cuvânt rezervat în Java; Linia 8: Variabilele de tipul char pot stoca o singură valoare. Dacă se foloseşte String în loc de char e Ok. Iată două aplicaţii ce folosesc declaraţii de variabile locale şi pachete Java diferite pentru a calcula masa ideala în funcţie de vârsta şi înalţinea unei persoane: Varianta 1: import java.util.scanner; public class MasaIdealaV1 { public static void main(string[] args) { //declaratii de variabile locale double masa, varsta, inaltimea; Scanner intrare; intrare = new Scanner(System.in); //afisarea pe ecran a textului Ce varsta ai: System.out.print("Ce varsta ai: "); //citirea unui numar real de la tastatura varsta = intrare.nextfloat(); System.out.print("Ce inaltime ai: "); inaltimea = intrare.nextfloat(); //formula de calcul a masei ideale masa = * (inaltimea-150) * (varsta - 20); System.out.println("Masa ideala (barbat) = " + masa + " kg"); System.out.println("Masa ideala (femeie) = " + 0.9*masa + " kg"); Varianta 2: import javax.swing.joptionpane; public class MasaIdealaV2 { public static void main(string[] args) { //declaratii de variabile locale float masa, inaltimea; 30

31 int varsta; //afisarea pe ecran a ferestrei de dialog Ce varsta ai: String intrare = JOptionPane.showInputDialog("Ce varsta ai: "); //citirea unui numar real de la tastatura varsta = Integer.parseInt(intrare); intrare = JOptionPane.showInputDialog("Ce inaltime ai (in cm): "); inaltimea = Float.parseFloat(intrare); masa = 50F F * (inaltimea-150f) F * (varsta - 20F); String masaideala = "Barbat = " + masa + " kg\n"; masaideala = masaideala + "Femeie = " + 0.9*masa + " kg"; J O p t i o n P a n e. s h o w M e s s a g e D i a l o g ( n u l l, ideala",joptionpane.information_message); m a s a i d e a l a, " M a s a 31

32 Constante Java În Java cuvântul cheie final defineşte o constantă. Se declară la fel ca şi o variabilă însă poate primi valoare o singură dată. Prin convenţie, numele constantelor se scriu cu majuscule. final double PI = ; Dacă constanta este declarată într-o metodă, ea va fi vizibilă numai în interiorul acesteia. În situaţia în care se doreşte ca o constantă să fie vizibilă la nivel de clasă se zice că declarăm o constantă de clasă şi tebuie să folosim cuvintele cheie static final. Declaraţia ei se scrie în afara metodelor clasei şi va fi de forma: public static final double PI = ; 32

33 Comcepte de programare orientata pe obiect Abstractizare Trecerea de la realitate la un model (o simplificare a realităţii) Clasă Tip de dată definit de utilizator ce realizează încapsulare a datelor (câmpuri) şi a operaţiilor (metodele) ce se pot face cu datele Instanţiere procesul de creare a unei variabile de tipul clasă prin folosirea lui new Obiect denumire dată unei variabile de tip clasă Soluţionarea unei probleme implică izolarea ei de realitate. Se numeşte abstractizare procesul prin care se elimină detaliile realităţii fiind păstrate numai acele aspecte ce se consideră a fi relevante pentru soluţionarea problemei. Prin procesul de abstractizare se obţine un model al realităţii. Activitatea de trecere de la acest model la universul sistemului de calcul folosit pentru în scopul obţinerii rezultatelor poartă denumirea paradigmă sau metodologie (tehnologie) de programare. În paradigma programării orientate pe obiect, modelarea realităţii de face prin conceptul de obiect. Obiectul este o abstractizare unei realităţi. Realitatea poate să fie palpabilă (ceva fizic) sau o idee (un concept) a cărei stare trebuie reprezentată. Obiectul este o unificare între datele şi mulţimea operaţiilor ce pot fi efectuate cu acestea. Utilizatorul unui obiect nu trebuie să cunoască tipurile de date reprezentate în obiect ci doar operaţiile prin care acestea se pot modifica, se zice că reprezentarea internă a datelor este încapsulată (ascunsă) de exterior, dar poate fi manipulată prin operaţii specifice. Clasa descrie un model sau un şablon de stare şi de comportament pentru obiecte. Definiţia unei clase constă în date (câmpuri) şi metode (proceduri de calcul). Clasa este un tip de dată definit de utilizator pe baza căreia se vor crea noi obiecte din respectiva clasă. Definiţia unei clase constă în:! modificatori de acces: definesc vizibilitatea clasei în raport cu alte clase (public);! class: cuvânt cheie care anunţă Java ca urmează un bloc pentru definirea unei clase;! câmpuri: variabile sau constante care sunt folosite de obiectele clasei (x şi y);! constructori: metode care controlează starea iniţială a oricărui obiect din clasă(punct() şi Punct(double abscisa, double ordonata));! metode: funcţii care controlează valorile stocate în câmpuri (setx(), sety()...). Exemplul următor defineşte o clasă cu numele Punct. //Definitia unei clase public class Punct { 33

34 //Campuri private double x; private double y; //Constructori Punct() { setx(0); sety(0); Punct(double abscisa, double ordonata) { setx(abscisa); sety(ordonata); // Metode public void setx(double abscisa) { x = abscisa; public void sety(double ordonata) { y = ordonata; public double x() { return x; public double y() { return y; public double distantaorigine() { return Math.sqrt(x*x+y*y); public String tostring() { return "<" + x + "," + y + ">"; public class Grafica { public static void main(string[] args) { Punct p1; //declararea var. obiect p1 de tipul clasa Punct Punct p2 = new Punct(-1,7); //decl. + creare + initializare p1 = new Punct(); //creare + initializare obiecte p1 System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); p1.setx(12); p2.sety(13.345); System.out.println("p1 = " + p1.tostring()); System.out.println("p2 = " + p2); Rezultate: p1 = <0.0,0.0> p2 = <-1.0,7.0> 34

35 p1 = <12.0,0.0> p2 = <-1.0,13.345> 35

36 3 Operatorii limbajului Java 36

37 Tipuri de operatori În Java avem 5 tipuri de operatori.! atribuirea! aritmetici! pe biţi! relaţionali! booleeni Variabilele şi constantele se folosesc pentru stocarea datelor la nivelul aplicaţiei. Operatorii sunt caractere speciale prin care Java este anunţat despre operaţia ce trebuie să o facă cu operanzii asupra cărora acţionează. Operatorii au un efect şi întorc un rezultat. Ei combină datele în expresii pentru a produce valori noi. Operatorul de atribuire Operatorul de atribuire dă unei variabile o valoarea a unui literal sau o valoarea ce se obţine ca urmare a evaluării unei expresii. Operatorii aritmetici Operatorii aritmetici realizează operaţiile aritmetice de bază (adunare, scădere, înmulţire şi împărţire) cu operanzii. Pot fi utilizaţi pentru toate tipurile numerice. Operatorii pe biţi Operatorii pe biţi permit interacţiunea cu reprezentarea internă pe biţi ale tipurilor numerice întregi permiţând acţiunea la nivel de bit. Dacă operatorii aritmetici tratează o valoare numerică unitar, cei pe biţi permit modificarea individuală a fiecărui bit din valoarea întreagă. Operatorii relaţionali Operatorii relaţionali permit compararea a două valori. Rezultatul comparaţiei este bolean şi poate fi utilizat pentru setarea unor valori sau pentru controlul execuţiei programului. Operatori booleeni (logici) Operatori booleeni pot fi utilizaţi numai cu valori boleene sau ca rezultat întotdeauna o valoare boleană. 37

38 Formă: nume = expresie Atribuirea expresie din stânga lui = se evaluează apoi valoarea ei se copiază în nume int i, i1=0, i2 = 1; i1=10; i2=15; i1=i2=7; i=(i1=(i2=7)); În limbajul Java orice expresie produce un rezultat, iar tipul rezultatului este determinat de operatorul folosit şi de către tipul operanzilor. Dacă analizăm expresia a + b, atunci a şi b se numesc operanzi, iar + operator; efectul operatorului este acela de adunare, iar rezultatul lui este suma valorilor numerice stocate în variabilele a şi b. Atribuirea, care are simbolul =, este un operator, asemenea lui + astfel, când undeva în program se scrie a = b el va avea un efect şi un rezultat. Efectul este cel de evaluare a expresisei din drepta lui =, la noi aceasta este valoarea stocată în b şi de copiere a valorii expresiei evaluate în a, iar rezultaul este valoarea copiată, adică valoarea lui b. Deseori, acest rezultat nu este folosit mai departe, deşi utilizarea lui ar fi corectă. Majoritatea operatorilor Java produc un rezultat fără a modifica valorile operanzilor. Există însă operatori, asemenea celui de atriburie, care modifică valoarea unui operand. Această acţiune poartă denumirea de efect secundar, în engleză side effect. În cazul operatorului =, denumirea este forţată deoarece aici efectul de modificare este cel primar. Java are însă o clasă întreagă de operatori care produc efecte secundare ce vor fi discutaţi în continuare (atribuirea compusă). Atribuirea poate fi şi multiplă, situaţie în care asociativitatea operatorului de atribuire este de la dreapta la stânga. 38

39 Operatorii aritmetici Realizează operţiile aritmetice de bază; Operanzii pot fi numerici (literali sau variabile) int a,b,c,d,e; a = 1 + 2; // + pentru ADUNARE b = 1-2; // - pentru SCĂDERE c = a * 2; // * pentru ÎNMULŢIRE d = c / b; // / pentru ÎMPĂRŢIRE e = a % 2; // % pentru RESTUL ÎMPĂRŢIRII Operanzii unei operaţii aritmetice trebuie să fie numerici, iar rezultatul va fi şi el numeric. Câteva dintre problemele arimeticii simple în Java sunt:! în expresiile în care participă operatorii aritmetici, ordinea evaluării lor este dată de prioritatea şi asociativitatea lor. *, / şi % au prioritatea mai mare decât + şi -, motiv pentru care aceste operaţii vor fi evaluate înainte de adunare şi scădere;! parantezele rotunde modifică prioritatea evaluărilor aritmetice, aceasta începând de la parantezele cele mai interioare;! împărţirea între întregi întoare rezultat întreg (eventuala parte zecimală este ignorată);! împărţirea întreagă cu 0 generează o excepţie;! împărţirea reală cu 0. întoarce infinit (Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY) sau rezultat nenumerice (Not A Number Double.NaN). Aritmetica numerelor întregi Toate operaţiile aritmetice se fac cu tipurile int sau long, valorile byte, char sau short fiind automat promovate la int înainte de efectuarea operaţiilor, rezultatul fiind şi el un int. Similar, dacă un operand este de tipul long, iar celălat nu, acesta va fi automat promovat la long, iar rezultatul va fi long. Dacă însă se încercă atribuirea unui rezultat cu reprezentare mai lungă unei variabile ce are un tip cu reprezentare (în octeţi) mai scurtă se primeşte o eroare la compilare. Terminologia folosită în situaţia în care se doreşte stocarea unei valori de un tip într-o variabilă de un alt tip se numeşte forţare de tip (type casting). Forţarea de tip poate produce rezultate ciudate, fie codul: byte b1 = 1, b2 = 2, b3; b3 = b1+b2; // eroare, rezultatul este de tip int b3 = (byte) (b1+b2) // aici avem forţare de tip - asa merge, dar pot // apărea ciudăţenii dacă, b1 şi b2 iau valoarea 120 fiecare, rezultaul va fi incorect. Forţarea de tip face ca reprezentarea pe biţi a valorii să fie copiată din sursă în destinaţie. Dacă rezultatul nu încape în destinaţie se pierd date. 39

40 Promovarea s i fort area de tip Conversie: Trecerea de la o reprezentare internă a unui tip de date la o alta. Promovare: conversie către un tip cu domeniu mai larg Forţare: convesrie către un tip cu domeniu mai îngust Ficare tip de dată are o reprezentare specifică în limbajul Java (de exemplu, numerele reale în virgulă flotantă sunt reprezentate prin M - mantisa, E - exponent şi B - bază, valoarea numărului fiind calculat E prin expresia M*B ). Conversia unei variabile sau expresii de la un tip la altul poate conduce la nepotriviri legate de modul de efectuare a calculelor cu respectivele tipuri de date şi de probleme legate spaţiul alocat pentru stocarea rezultatului. Cel mai des compilatorul va recunoaşte pierderea preciziei şi nu va permite compilarea programului, există însă şi cazuri când rezultatul obţinut va fi incorect. Pentru rezolvarea acestei probleme tipurile asociate variabilelor trebuie să fie promovate către tipuri cu un domeniu mai larg sau convertite forţat la tipuri cu domeniu mai mic. Fie atriburile: int n1 = 102; int n2 = 13; byte n3; n3 = (n1 + n2); //4 octeti pentru stocarea valorii //4 octeti pentru stocarea valorii //1 octet pentru stocarea valorii // <--- aici compilatorul va da eroare Practic, codul de mai sus ar trebui să funcţioneze deoarece un byte, care este un int mai mic, este în stare să stocheze valoarea 115. Totuşi, compilatorul nu va face atribuirea, ci da va o eroarea "possible loss of precision" pentru că o valoarea byte este mai mică decât una int. Rezolvarea problemei se face fie convertind tipul expresiei din dreapta operatorului de atribuire (=) aşa încât să se potrivească cu tipul variabilei din sânga, fie variabila din stânga (n3) se declară ca fiind de un tip de mai larg. Soluţia problemei, prin schimbarea tipului lui n3, este: int n1 = 102; int n2 = 13; int n3; n3 = (n1 + n2); Promovarea de tip Există situaţii în care compilatorul modifică tipul unei variabile la un tip care suportă un domeniul de valori mai larg. Această acţiune de conversie poartă denumirea de promovare. Unele promovări se fac automat de către compilator pentru evitarea pierderii preciziei rezultatelor. Situaţiile acestea apar atunci când:! se atribuie un tip mai mic unui tip mai mare; 40

41 ! se atribuie un tip întreg unui tip real (deoarece nu există zecimale care să se piardă). Fie declaraţia: long varsta = 37; Valoarea întreagă (int) 37 este atribuită unei variabilei varsta de tipul long. Promovarea valorii întregi se va face automat înainte de atribuire ei variabilei de tipul long deoarece această conversie nu pune probleme. Înainte de a fi atribuit variabilei, rezultatul unei expresii este plasat într-o locaţie de memorie temporară. Dimensiunea locaţiei va fi întotdeauna egală cu cea a unui int sau, în general, cu dimensiunea celui mai mare tip de dată folosit în expresie. De exemplu, dacă expresia înmulţeşte două tipuri int, locaţia va avea dimensiunea unui tip int, adică 32 de biţi (4 octeţi). Dacă cele două valori care se înmulţesc dau o valoarea care este dincolo de domeniul tipului int (de exemplu 77777* = 6,049,339,506 nu poate fi stocată într-un int), valoarea va trebui trunchiată pentru ca să încapă în locaţia de memorie temporară. Acest fel de calcul va conduce, în final, la rezultat incorect pentru că variabila care va stoca rezultatul va conţine valoarea trunchiată (indiferent de tipul folosit pentru variabila ce va stoca rezultatul). Pentru rezolvarea acestei probleme, cel puţin una dintre tipurile participante în expresie trebuie să fie long pentru a asigura cel mai larg domeniu posibil al variabilei temporare. Promovările atutomate sunt prezentate în continuare: char \ --> int --> long --> float --> double byte --> short / Observaţi că nu se fac promăvări automate între tipul boolean şi orice alt tip de dată. Forţarea de tip Forţarea de tip este o conversie ce scade domeniul în care poate lua valori variabila prin modificarea tipului variabilei. Situaţia apare atunci când, de exemplu, o valoarea long este convertită la una int. Acţiunea se face pentru ca unele metode acceptă numai argumente de un anumit tip sau pentru atribuirea de valori unor variabile cu tip mai mic sau pentru economie de memorie. Sintaxa de forţare a conversiei de tip este: nume = (tip_destinatie) valoare; unde:! nume este numele variabilei la care i se atribuie valoarea;! valoare este valoarea care se atribuie lui nume;! (tip_destinatie) este tipul la care se va converti valoare. Obesrvaţi că utilizarea parantezelor rotunde este obligatorie. O soluţie pentru exemplul prezentat prin forţarea conversiei de tip este: int n1 = 102; //32 de biti pentru stocarea valorii int n2 = 13; //32 de biti pentru stocarea valorii byte n3; //8 biti de memorie rezervata n3 = (byte)(n1 + n2); // nu exista pierdere de date 41

42 Forţarea conversiei de tip trebuie utilizată cu grijă. De exemplu, dacă n1 şi n2 ar fi conţinut valori mai mari, forţarea conversiei de tip ar fi trunchiat o parte din date rezultânt o valoarea incorectă. Iată o situaţie de evitat: int i; long l = L; i = (int) (l); //valoarea numarului este trunchiata La forţarea conversiei de la tipul float sau double, care au parte fracţionară, la unul întreg, de exemplu, int, toate zecimalele se pierd. Totuşi, această metodă este utilă atunci când dorin ca dintr-un număr real să facem unul întreg. Un dintre situaţiile necesare în practică este realizarea împărţirii reale între numere întregi. Codul care urmează exemplifică utilizarea forţării de tip în acest scop: public class fortareconversii { public static void main(string args[]) { char c = 'a'; int n = 1111; float f = 3.7F, rez; c = (char) n; //fortare de conversie 'barbara' rez = f + (float)n / 2; //impartirea este reala System.out.println("a, rez: " + c + ", " + rez); Rezultate: a, rez:?, Promovarea la întregi Dacă expresia conţine tipuri întregi şi operatori aritmetici (*, /, -, +, %) valorile sunt automat promovate la tipul int (sau mai mare dacă este cazul) şi numai după aceea se rezolvă operatorii. Această conversie poate conduce la depăşire sau pierderea preciziei. În exemplul următor primii doi operanzi dintre cei trei cu numele de a, b şi c sunt automat promovaţi de la tipul short la tipul int înainte de adunare: short a, b, c; a=1; b=2; c=a+b; În ultima linie, valorile lui a şi b sunt convertite la tipul int, apoi se adună şi dau un rezultat de tip int. Operatorul = încearcă să apoi să atribuie rezultatul int unei variabile short (c). Această atribuire este însă ilegală şi generează o eroare de compilare. Codul va lucra corect în condiţiile în care:! c se declară de tipul (int c);! se forţează conversia valorii expresiei a+b la short în linia de atribuire prin: c=(short)(a+b); Promovarea la reali Asemenea tipurilor întregi care sunt implicit int, în unele circumstanţe, valorile atribuite tipurilor reale 42

43 sunt implicit de tipul double, cu excepţia cazului în care este explicit specificat tipul float. Linia următoare va cauza eroare la compilare deoarece se presupune că literalul 23.5 este de tip double, iar aceasta nu poate fi "înghesuit" într-o variabilă de tipul float. float f1 = 23.5; Pentru ca linia să fie considerată corectă se pot folosi următoarele variante:! se adaugă un F după 23.5 pentru a spune compilatorului că valoarea este float: float f1 = 23.5F;! se forţează conversia lui 23.5 la tipul float prin: float f1 = (float)23.5; 43

44 Incrementarea s i decrementarea operatorul ++ creşte cu 1 valoarea operandului operatorul -- scade cu 1 valoarea operandului există două forme de scriere: int i = 1, j; j = ++i; // prefixată: i se incrementează // apoi de atribuie valoarea lui i j = i++; // postfixată: se atribuie // valoarea lui i, apoi se // incrementează i Una dintre necesităţile curente la nivelul aplicaţiilor este aceea de adunare sau de scădere a lui 1 din valoarea unei variabile. Rezultatul poate fi obţinut sprin folosirea operatorilor + şi - după cum urmează: varsta = varsta + 1; zileconcediu = zileconcediu - 1; Totuşi, incrementarea sau decrementarea sunt operaţii atât de comune încât există opratori unari (au un singur operand) specifici în acest scop: incrementarea (++) şi decrementarea (--). Ei pot fi scrişi în faţa (pre-increment, pre-decrement) sau după (post-increment, post-decrement) o variabilă. În forma prefixată operaţia (incrementarea sau decrementarea) este realizată înainte de orice alte calcule sau atribuiri. În forma prefixată, operaţia este realizată după toate calculele sau eventualele atribuiri, astfel încât valoarea originală este cea folosită în calcule şi nu cea actualizată. Următorul tabel prezintă operatorii de incrementare şi decrementare: Operator Rol Exemplu Comentarii ++ pre-increment (++variabila) int i = 5; int j = ++i; post-increment (variabila++) int i = 5; int j = i++; -- pre-decrement (--variabila) int i = 5; int j = --i; i este 5 şi j este 6. i este 5 şi j este 5. Valoarea lui i este atribuită lui j înainte de incrementarea lui i. Dim acest motiv valoarea atribuită lui j este 5. i este 5 şi j este 4. 44

45 Operator Rol Exemplu Comentarii post-decrement (variabila--) int i = 5; int j = i--; i este 5 şi j este 5. Valoarea lui i este atribuită lui j înainte de decrementarea lui i. Din acest motiv valoarea atribuită lui j este 5. Iată în comtinuare câteva exemple clasice de utilzare a celor doi operatori: int contor = 10; int a, b, c, d; a = contor++; b = contor; c = ++contor; d = contor; System.out.println(a + " " + b + " " + c +" " + d); Rezultate: Fie codul: int a, b; a = 1; b = ++a * 7; Exisă însă o diferenţă subtilă între forma prefixată şi postfixată. Presupunând că facem o incrementare (++), în forma prefixată (++a) incrementarea se face prima oară, apoi rezultaul expresiei este chiar operand mai departe în expresie. În cazul liniei de forma: b = a++ * 7; operatorul de incrementare are forma postfixată (a++). Aici, valoarea curentă a lui a este valoarea expresiei, aceasta va mai fi stocată într-o locaţie temporară, însă această valoare nu va fi folosită în continuarea evaluării expresiei. După evaluarea întregii expresii valoarea din locaţia temporară este crescută cu 1 şi atribuită lui a. În concluzie, incrementarea şi decrementarea sunt operatori unari (acţionează asupra unui singur operand), au efecte secundare, iar rezultaul lor poate fi folosit în continuare în expresii. Rezlultatul poate fi valoarea operandului înainte (la formele post-fixate) sau după (la formele pre-fixate) ce incrementarea sau decremantarea a avut loc. 45

46 Operatori relat ionali (de comparare) Întorc rezultate de tipul boolean > mai mare >= mai mare sau egal < mai mic <= mai mic sau egal!= diferit = = egal int i = 1, j=4; boolean rez; rez = (i == j); // rez ia valoarea false rez = (i < j); // rez ia valoarea true Operatorii relaţionali, unori numiţi şi de comparare a expresiilor, se folosesc la testarea unor condiţii între două expresii şi întorc un rezultat de tipul boolean. Sintaxa generală a unei comparaţii este: rezultat = expresie1 operatorrelational expresie2 Operator relaţional Denumire true dacă false dacă < Mai mic expresie1 < expresie2 expresie1 >= expresie2 <= Mai mic sau egal expresie1 <= expresie2 expresie1 > expresie2 > Mai mare expresie1 > expresie2 expresie1 <= expresie2 >= Mai mare sau egal expresie1 >= expresie2 expresie1 < expresie2 46

47 Operator relaţional Denumire true dacă false dacă == Egal expresie1 == expresie2 expresie1!= expresie2!= Inegal (Diferit) expresie1!= expresie2 expresie1 == expresie2 Deseori, operatorii relaţionali se folosesc împreună cu cei logici pentru a forma expresii logice complexe. În exemplul următor se testează dacă valoarea stocată în variabila y este în domeniul [x, z] definit prin variabilele x şi z. public class OpRelationali { public static void main(string args[]) { double x = 11., y = 12., z = 13.; boolean indomeniu; indomeniu = x <= y && x <= z; System.out.println("este " + y + " in domeniul [ " + x +"," + z + " ]?: " + indomeniu); Rezultatul: este 12.0 in domeniul [ 11.0,13.0 ]?: true Una dintre aplicaţiile specifice ale operatorului == este evitarea erorii de împărţire cu zero. Pentru aceasta expresia cu care urmează să se împartă este testată dacă are valoarea 0, dacă este 0 împărţirea este evitată, altfel împărţirea se poate realiza. Una dintre erorile cele mai comune la testarea valorii unei expresii cu constanta 0 este folosirea lui = în locul lui ==. 47

48 Operatori logici (booleeni) Permit formarea de expresii logice pe baza rezultatelor operatorilor relaţionali cu fără scurtcircuitare nume && & ŞI SAU INCLUSIV ^! NU int i=1, j=2, k=3; boolean rez=true; rez = (i<j) & (i==1); // false rez =!rez; // true SAU EXCLUSIV Operatorii logici, uneori numiţi şi booleeni, trebuie să aibă operanzi booleeni (adică de tipul boolean) şi generează rezultate booleene. Denumirea lor a fost dată în cinstea matematicianului britanic George Boole ( ). El a pus la punct un sistem matematic ce operează valorile de adevăr: true (adevărat), flase (fals) şi funcţiile logice: AND (ŞI), OR (SAU) şi NOT (NU). Funcţiile logice au fost implementate, în Java, sub forma operatorilor logici care au scrierea && pentru AND, pentru OR şi! pentru NOT. Operatorii logici se definesc prin tabele de adevăr. Acestea reprezintă toate combinaţiile posibile ale operanzilor împreună cu rezultatele corespondente operatorului logic. Expresiile care conţin operatori logici se evaluează cu scurtcircuitare. Evaluarea se face de la stânga la dreapta (această ordine de evaluare este garantată numai pentru operatorii logici) şi imediat ce valoarea expresiei logice devine cunoscută evaluarea celorlaţi operanzi se termină. && şi permit utilizarea evaluării cu scurtcircuitare, dacă expresia din stânga operatorului a a determinat deja valoarea întregii expresii logice, expresia din dreapta lui nu se mai evaluează. Dacă în e1 && e2, e1 ia valoarea false, e2 nu se mai evaluează deoarece oricum rezultatul va fi false. Dacă în e1 e2, e1 ia valoarea true, e2 nu se mai evaluează deoarece rezultatul este oricum true. Există şi operatori logici care se evaluează fără scurtcircuitare. Ei au o scriere diferită, astfel pentru ŞI se scrie & iar pentru SAU se scrie. Utilizarea lor se face în situaţii în care scurtcircuitarea poate produce rezultate ciudate, de exemplu fie expresia func1() && func2(), dacă funcţia func1() va întoarce rezultatul false funcţia func2() nu va mai fi apelată. Vor exista, deci, cazuri în care 48

49 func2() nu va fi apelată, iar dacă aceasta face ceva semnificativ în cod lipsa apelului va duce la rezultate eronare. Tabel de adevăr pentru S I && false true false false false true fals true Tabel de adev r pentru SAU false true false false true true true true Tabel de adev r pentru SAU EXCLUSIV ^ false true false false true true true false 49

50 Operatori pe biti Operanzii pot fi de orice tip de întreg şi au ca rezultat o valoarea întreagă Operează cu decompunerea binară a operanzilor Operator ~ NU unar pe biţi & ŞI pe biţi Denumire SAU (INCLUSIV) pe biţi ^ SAU EXCLUSIV pe biţi >> deplasarea la dreapta >>> deplasarea la dreapta cu completare cu 0 << deplasare la stânga În calculatoare, se numeşte bit (binary digit), cea mai mică unitate de informaţie a cărei valoare se poate stoca. Operatorii pe biţi (bitwise) tratează operanzii sub forma unui şir de biţi şi nu sub forma unui singure valori în baza 10. Şirurile se obţine prin transcrierea numerelor din baza 10 în baza 2. Operatorii pe bit i acţionează asupra celui de al N-elea bit al operanzilor folosind o funcţie booleană pentru a genera un rezultat la nivelul aceluiaşi bit N. De exemplu dacă dorim să facem & (ŞI) pe biţi între valoarea 14 şi 7 trebuie să transformăm operanzii în şiruri binare, astfel 14 în baza 10, adică , devine 1110 în baza 2, adică , iar 7 în baza 10 devine 0111 în baza 2, apoi între biţii corespunzători aceleiaşi poziţii se face & pe biţi după cum se vede în tabelul următor. Valoarea în baza 10 Valorile bitului N (baza 2) Bit "3" Bit "2" Bit "1" Bit "0" (10) (2) 7(10) (2) 50

51 Valoarea în baza 10 Valorile bitului N (baza 2) Bit "3" Bit "2" Bit "1" Bit "0" (10) & 7(10) (2) 14 (10) & 7 (10) dă, în final, valoarea 6 (10). Asemenea operatorilor logici şi cei pe biţi se definesc cu ajutorul tabelelor de adevăr. Tabelele de adevăr pentru operatorii &,, ^ şi ~: a b a & b a b a ^ b ~ a ŞI pe biţi, adică operatorul &, produce 1 numai dacă ambii operanzi sunt 1. SAU pe biţi, adică operatorul, produce 0 doar dacă ambii biţi sunt 0. SAU EXCLUSIV pe biţi, adică operatorul ^, produce 1 dacă exact unul dintre operanzi este 1. NU pe biţi, adică operatorul ~, inversează toţii biţii operandului. Imversarea însemnă că orice bit 1 trece în 0 şi invers. Deplasarea la stânga, adică operatorul <<, are forma valoare << numar şi deplasează la stânga toţi biţii lui valoare cu un număr de poziţii (puteri ale lui 2) specificat în numar. Pentru fiecare poziţie deplasată bitul cel mai semnificativ se pierde, iar bitul cel mai puţin semnificativ se completează cu valoarea 0. Deplasarea la stânga cu o poziţie corespunde înmulţirii cu 2 a lui valoare. Deplasarea la dreapta, adică operatorul >>, are forma valoare >> numar şi deplasează la dreapta toţi biţii lui valoare cu un număr de poziţii (puteri ale lui 2) specificat în numar. La fiecare deplasarea la dreapta cu o poziţie biţul cel mai puţin semnificativ se pierde, iar noua valoarea care se obţine împărţirea la 2 a valorii iniţiale (restul se pierde). Bitul cel mai semnificativ, care stochează semnul numărului, în urma deplasării la dreapta trece şi el la dreapta, iar poziţia pe care a fost se va completa cu valoarea înaintea de deplasare, adică semnul numărului se păstrează. Deplasarea la dreapta fără semn, adică operatorul >>>, are forma valoare >>> numar şi deplasează la dreapta toţi biţii lui valoare cu un număr de poziţii (puteri ale lui 2) specificat în numar fără a păstra însă semnul valorii. În locul valorii se semn care corespunde celui mai semnificativ bit se pune valoarea 0. În Java toate tipurile întregi, cu excepţia lui char, sunt cu semn. Aceasta înseamnă că ele pot reprezenta atât valori negative cât şi pozitive. Codificarea numerelor întregi cu semn se face prin 51

52 complement faţă de 2, adică numerele negative se reprezintă prin inversarea valorilor biţilor (adică 0 trece în 1 şi 1 trece în 0), după care se adună 1 la rezultat. Presupunând că se lucrează cu valori de tipul byte (adică pe 8 biţi), valoarea -14(10) se codifică prin (2). Se pleacă de la 14 în baza 10, care în binar este , apoi se inversează biţii şi se obţine , la această valoare se adună 1 şi rezultă Pentru a decodifica un număr negativ se vor inversa biţii lui, apoi la valoarea obţinută se adună 1. Pentru -14(10), care în binar este , trebuie să reţinem semnul "-", apoi, după inversarea biţilor se obţine , adică +13 (10), după adunarea lui 1 vom avea , adică valoarea numerică de +14. Motivul pentru care Java foloseşte această codificare este problema reprezentării lui 0. Valoarea 0, reprezentată prin , în urma aplicării procedurii de complementare dă Aceasta este o valoare negativă a lui 0 care în aritmetica numerelor întregi creează probleme. Pentru evitarea acestora se adună 1 la valoarea obţinută, caz în care se obţine Bitul de 1 obţinut însă nu mai poate stocat într-un byte deoarece el are spaţiu numai pentru 8 biţi, iar rezultatul are 9 biţi, rezultatul final fiind primii 8 biţi, adică Deoarece Java foloseşte complementul faţă de 2 pentru reprezentarea numerelor negative unii operatori pe biţi produc rezultate ciudate. Cel mai semnificativ bit al reprezentării (bitul corespunzători puterii celei mai mari ale lui 2) este numit şi bit de semn deoarece el defineşte semnul valorii numerice (pentru 0 - numărul este pozitiv, iar pentr 1 numărul este negativ). Operaţiile pe biţi care îl modifică sunt cele generatoare de probleme. public class opbiti { public static void main(string args[]) { int a = 14, b = 4; int c; c = a & b; System.out.println(a + " & " + b + " = " + c); System.out.println(binar(a,32) + " & "); System.out.println(binar(b,32)); System.out.println(" "); System.out.println(binar(c,32) + "\n"); c = a b; System.out.println(a + " " + b + " = " + c); System.out.println(binar(a,32) + " "); System.out.println(binar(b,32)); System.out.println(" "); System.out.println(binar(c,32) + "\n"); c = a ^ b; System.out.println(a + " ^ " + b + " = " + c); System.out.println(binar(a,32) + " ^ "); System.out.println(binar(b,32)); System.out.println(" "); System.out.println(binar(c,32) + "\n"); c = ~a; System.out.println("~" + a + " = " + c); System.out.println( binar(a,32) + " ~ "); System.out.println(" "); System.out.println( binar(c,32) + "\n"); c = a << 2; System.out.println( a + " << 2 = " + c); System.out.println( binar(a,32) + " << 2 "); System.out.println(" "); System.out.println( binar(c,32) + "\n"); c = a >> 2; 52

53 System.out.println( a + " >> 2 = " + c); System.out.println( binar(a,32) + " >> 2 "); System.out.println(" "); System.out.println( binar(c,32) + "\n"); c = a >>> 2; System.out.println( a + " >>> 2 = " + c); System.out.println( binar(a,32) + " >>> 2"); System.out.println(" "); System.out.println(binar(c,32) + "\n"); a = -14; c = a >> 2; System.out.println( a + " >> 2 = " + c); System.out.println( binar(a,32) + " >> 2"); System.out.println(" "); System.out.println(binar(c,32) + "\n"); c = a >>> 2; System.out.println( a + " >>> 2 = " + c); System.out.println( binar(a,32) + " >>> 2"); System.out.println(" "); System.out.println(binar(c,32) + "\n"); public static String binar(int x, int n) { int c = 0; StringBuffer BufBinar = new StringBuffer(""); while (x!= 0 && c < n) { BufBinar.append(((x % 2 == 0)? "0" : "1")); x >>>= 1; ++c; while (c++ < n) BufBinar.append("0"); BufBinar.reverse(); return BufBinar.toString(); Rezultate: 14 & 4 = & = ^ 4 = ^ 53

54 ~14 = ~ << 2 = << >> 2 = >> >>> 2 = >>> >> 2 = >> >>> 2 = >>>

55 Atribuirea compusa Operatorul de atribuire poate fi combinat cu orice operator aritmetic binar astfel încât în loc de: (expresie1) = (expresie1) op (expresie2) se poate scrie : expresie1 op = expresie2 double total = 0., suma =1., procent=0.5; total = total + suma; //1. total+=suma; //2. total*=procent+1.5; //4. Java dispune de o familie întreagă de operatori ce permit scrierea scurtată a unor forme de expresii. Iniţial, aceşti operatori facilitau compilarea mai eficientă a codului. Fie secvenţa de cod: int a = 1; int b = 2; b = b + a; //adunare traditionala b += a; //adunare compusa În varianta "tradiţională" operatorul de atribuire va face evaluarea expresiei din dreapta lui, rezultatul va fi stocat într-o zonă de memorie temporară, apoi va fi copiat în locaţia stânga egalului. Prin scrierea lui += în locul lui = compilatorul va putea evita faza de manipulare prin zona temporară, rezultatul fiind depus direct în b. Azi, majoritatea compilatoarelor optimizează deja această procedură ineficientă din Java adică, deşi noi scriem b = b + a, compilatorul va genera codul pentru b += a. Scrierea poate fi utilizată cu toţi operatorii binari. Toată această familie de operatori de atribuire va produce şi efecte secundare deoarece generează un rezultat dar şi modifică valoarea opreandului din stânga. Conform celor spuse se pot scrie următoatele expresii: b += a; //b = b + a b -= a; //b = b - a b *= a; //b = b * a b /= a; //b = b / a b %= a; //b = b % a 55

56 Prioritatea operatorilor Java Prioritatea determină ordinea de rezolvare a operatorilor Dacă într-o expresie avem mai mulţi operatori consecutivi de aceeaşi prioritate, atunci se aplică regula asociativitaţii Utilizarea parantezelor rotunde redefineşte priorităţile Prioritate Simbol Asociativitate ~! (tip) operatori unari de la dreapta la stânga (DS) 2 * / % înmulţire împărţire rest de la stânga la dreapta (SD) adunare scădere concatenare SD 4 << >> >>> deplasări (>>> completare cu 0) SD 5 < > <= >=instanceof relaţionali SD 6 ==!= Egalitate SD 7 & ŞI logic / pe biţi SD 8 ^ SAU EXCLUSIV logic / pe biţi SD 9 SAU logic / pe biţi SD 10 && ŞI logic SD 11 SAU logic SD 12?: Operatorul condiţional DS 13 = op= operatorii de atribuire DS În Java orice expresie are un tip (primitiv sau referin tǎ) determinat în faza de compilare. În cazul unor expresii complexe într-o singurǎ linie de program, Java foloseşte un grup de reguli numite "de 56

57 precedenţă" pentru a determina ordinea de rezolvare a operatorilor. Aceste reguli asigură consistenţa operaţiilor aritmetice în cadrul programelor Java. La nivel principial, prelucrarea sau rezolvarea operatorilor se face în următoarea ordine:! ( ): operatorii din interiorul unor perechi de paranteze; dacă perechi de paranteze sunt cuprinse în alte perechi de paranteze, evaluarea pleacă de la perechea cea mai interioară;! ++, : operatorii de incrementare şi decrementare;! *, /: operatorii de multiplicare (înmulţire) şi diviziune (împărţire), evaluaţi de la stânga la dreapta;! +, -: operatorii de adunare şi scădere, evaluaţi de la stânga la dreapta. În tabelul anterior, precedenţa cea mai mare este notată cu 1, iar cea mai scăzută cu 13. În cazul în care expresiile conţin operatori aritmetici, care apar alăturaţi şi au aceeaşi precedenţă, evaluarea lor se face conform regulilor de asociativitate, respectiv de la stânga la dreapta. Fie expresia: c = 23-6 * 4 / ; Valoarea atribuită lui c depinde de ordinea în care vom prelucra operatorii expresiei. De exemplu, dacă prelucrarea se face strict de la sânga la dreapta, fără a ţine cont de precedenţa operatorilor, expresia va avea valoarea 3.6(6). Valorea reală însă a expresiei în Java este de -4. Pentru a indica modul de aplicare al regulilor de precedenţă în cazul acestei expresii aceasta se va rescrie expresia folosind parantezele: c = 23 - ((6 * 4) / 3) ; Orice expresie este evaluată automat pe baza regulilor de precedenţă. Dacă acestea nu corespund ordinii de evaluare pe care o dorim este obligatorie folosirea prantezelor rotunde. Iată un exemplu în continuare: c = (((23-6) * 4) / 3) ; se va evalua astfel: c = ((17 * 4) / 3) ; c = (68 / 3) ; c = 22.6(6) ; c = 34.6(6) - 31; c = 3.6(6); //3.6(6), unde (6) este perioada Regulile de precedenţă se aplică nu numai în cazul operatorilor aritmetici, ci pentru toţi operatorii Java. Dacă o expresie are mai mulţi operatori consecutivi de aceeaşi precedenţă se va aplica regula asociativităţii pentru determinarea ordinii de evaluare. public class Operatori { public static void main(string args[]) { int a, b, c, d, e, f, g; double da, db, dc, dd, de; boolean ba, bb, bc, bd; System.out.println("Aritmetica cu int"); 57

58 a=1+1; b=a*3; c=b/4; d=c-a; e=-d; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("e = " + e); System.out.println("\nAritmetica cu double"); da=1+1; db=da*3; dc=db/4; dd=dc-da; de=-dd; System.out.println("da = " + da); System.out.println("db = " + db); System.out.println("dc = " + dc); System.out.println("dd = " + dd); System.out.println("de = " + de); System.out.println("\nAritmetica cu modulo"); a=42; da=42.65; System.out.println(a + "%10 = " + a%10); System.out.println(da + "%10 = " + da%10); System.out.println("\nConversii"); System.out.println("(int)"+ da + " = "+ (int)da); //fortarea conversiei de la doubela la int System.out.println("\nOperatori logici"); ba = false; bb = true; bc = da > db; //? 42.5 > 6 = true bd = ba && bc bc; System.out.println(ba + " && " + bb + " " +bc + " = " + bd); /* bd = ba & 1/(e+d) < 3; //NU se face scurtcircuitare pt operandul 2 * aplicatia va crapa */ bd = ba && 1/(e+d) < 3; //se face scurtcircuitare pt operandul 2 System.out.println(ba + " && 1/(" + e + d + ") < 3 = " + bd); System.out.println("\nOperatori pe biti"); a = 3; // 0011 in binar b = 6; // 0110 in binar c = a b; d = a & b; e = a ^ b; f = (~a & b) (a & ~b); g = ~a & 0x0f; System.out.println("a = " +Integer.toBinaryString(a)); //11 System.out.println("b = " +Integer.toBinaryString(b)); //110 System.out.println("c = " +Integer.toBinaryString(c)); //111 System.out.println("d = " +Integer.toBinaryString(d)); //10 System.out.println("e = " +Integer.toBinaryString(e)); //101 System.out.println("f = " +Integer.toBinaryString(f)); //101 System.out.println("g = " +Integer.toBinaryString(g)); //1100 System.out.println(Integer.toBinaryString(a)+" << 2 =" + Integer.toBinaryString(a << 2)); System.out.println("\nFunctii matematice si constante"); 58

59 System.out.println("sqrt(" + a + ") = " + Math.sqrt(a)); //radical de ordinul 2 System.out.println("sin(" + a + ") = " + Math.sin(a)); //sinus System.out.println("cos(" + a + ") = " + Math.cos(a)); //cosinus System.out.println("tan(" + a + ") = " + Math.tan(a)); //tangenta System.out.println("atan(" + a + ") = " + Math.atan(a)); //arctangenta System.out.println("exp(" + a + ") = " + Math.exp(a)); //e la a System.out.println("log(" + a + ") = " + Math.log(a)); //log natural System.out.println("pow(" + a + ",3) = " + Math.pow(a,3)); //a la 3 System.out.println("PI = " + Math.PI); //PI System.out.println("E = " + Math.E); //E Rezultate: Aritmetica cu int a = 2 b = 6 c = 1 d = -1 e = 1 Aritmetica cu double da = 2.0 db = 6.0 dc = 1.5 dd = -0.5 de = 0.5 Aritmetica cu modulo 42%10 = %10 = Conversii (int)42.65 = 42 Operatori logici false && true true = true false && 1/(1-1) < 3 = false Operatori pe biti a = 11 b = 110 c = 111 d = 10 e = 101 f = 101 g = << 2 =1100 Functii matematice si constante sqrt(3) = sin(3) = cos(3) = tan(3) =

60 atan(3) = exp(3) = log(3) = pow(3,3) = 27.0 PI = E =

61 S iruri de caractere în Java Şir de caractere = o secvenţa de caractere de lungime arbitrară Java NU are implementat un tip primitiv şir de caractere String clasă Java predefinită în pachetul java.lang.string pentru manipularea şirurilor de caractere String s; //declaratia unei variabile şir String sal = Salut ; //decl. cu iniţial. Operatori: atribuirea (=) concatenarea (+) atribuirea compusă (+=). public class Siruri { public static void main(string[] args) { String s1, s2; String s3 = "Vasile"; //Vasile este un literal s2 ="Ion"; //Ion este un literal //concatenare s1 = s2 + s2; //lungimea unui sir de caractere System.out.println("Lungimea sirului: " +s1 +" este de " +s1.length()+" caractere"); //subsir System.out.println("Un subsir: " + s1.substring(0,3)); //editarea sirurilor s1 = s1.substring(0,3) + "-" + s1.substring(3,s1.length()); System.out.println("Editarea: " + s1); //testarea egalitatii sirurilor System.out.println("s1: " + s1+"\ns2: "+s2); System.out.println("Egalitatea lui s1 cu s2: " + s1.equals(s2)); System.out.println("Egalitatea lui Ion cu s2: " + "Ion".equals(s2)); /* comparatia sirurilor 61

62 * intoarce < 0 daca s1 vine inainte de s2 in dictionar * intoarce 0 daca s1 si s2 sunt egale * intoarce > 0 daca s1 este dupa s2 in dictionar */ System.out.println("Compararea lui s1 cu s2: " + s1.compareto(s2)); Rezultate: Lungimea sirului: IonIon este de 6 caractere Un subsir: Ion Editarea: Ion-Ion s1: Ion-Ion s2: Ion Egalitatea lui s1 cu s2: false Egalitatea lui Ion cu s2: true Compararea lui s1 cu s2: 4 Clasa String are mai bine de 50 de metode. Inspectarea acestora se face cel mai simplu utilizând documentaţia JDK. Compilatorul Java aloca spaţiu pentru literalii şir în memorie iar operatorul de atribuire va stoca adresa respectivă în variabila şir. Din acest motiv, testarea egalităţii a două şiruri nu se poate face cu operatorul 62

63 ==, deoarece el va compara adresele la ca sunt stocate cele două şiruri în RAM şi nu conţinutul respectivelor locaţii. Clasa String nu are o metodă pentru modificarea unui caracter al şirului, se zice că obiectele clasei şir sunt imuabile (immutable) - stabile, de neschimbat. Pentru modficarea conţinutului unei variabile şir trebuie să creăm un şir nou. 63

64 4 Instruct iunile limbajului Java 64

65 Rularea programelor Programele sunt alcătuite din instrucţiuni. Implicit, instrucţiunile se rulează secvenţial. Există situaţii în care se fac devieri de la rularea secvenţială:! Decizia sau ramificarea: if, switch! Ciclul: do, for, while! Saltul sau transferul: break, continue, apel de metodă O aplicaţie Java este formată din instrucţiuni. Procesul prin care JVM îndeplineşte o instrucţiune se numeşte rulare sau execuţie. În Java terminarea rulării unei instrucţiuni se poate face cu succes, cu excepţie sau cu eroare. O instrucţiune este formată din una sau mai multe expresii care se rulează ca o singură acţiune. De exemplu x = 5 este expresie, în timp ce x = 5; este deja o instrucţiune. O expresie terminată în caraterul ; se numeşte instrucţiune, iar caracterul ; se numeşte terminator de instrucţiune. Tot i ns trucţiuni sunt: x = 5.3*(4.1/Math.cos(0.2*y)); res pect i v System.out.println(x);. Instrucţiuni sunt inclusiv declaraţiile simple sau multiple, cu sau fără iniţializare. Instrucţiunile vor fi plasate în clase pentru alcătuirea aplicaţiei funcţionale. Implicit, aplicaţia Java începe din metoda main, iar instrucţiunile se rulează secvenţial, adică de sus în jos, în ordinea scrierii lor în aplicaţie pâna la terminarrea rularii tutror instrucţiunilor. În situaţia unei aplicaţii complexe rularea poate devia de la prelucrarea secvenţială astfel, există posibilitatea ramificării la nivelul rulării unor porţiuni de cod pe baza unor condiţii (if, switch), repetarea unui grup de instrucţiuni atânt timp cât o expresie de control este adevărată (while, do while, for), saltul de la o instrucţine la o alta în program (break, continue). 65

66 SECVENT A Secvenţa este alcătuită din:! instruncţiuni simple! blocuri numite şi instrucţiuni compuse Instrucţiune simplă: expresie; Blocul grup de instruncţiuni cuprinse între acolade { Instruncţiunea simplă Instrucţiune simplă este orice exprsie terminată în caracterul ;, iată câteva exemple: int x = 1, y = 2, z; z = x+ y; x=y++; z++; Instrucţiunea vidă Instruc tiunea vidǎ constǎ într-un ;. Ea nu are efect la nivelul execu tiei instruc tiunilor aplica tiei. De exemplu, dacǎ considerǎm instruc tiunea simplă expresie;iar partea de expresie lipses te, se ob tine o instruc tiune vidǎ. În practicǎ, se foloses te pentru a da posibilitatea ca aplica tia sǎ poatǎ fie completatǎ, de exemplu, cu instruc tiuni în locuri nu eram siguri cǎ va fi nevoie de acestea. Un alt avantaj este cel de evitare al unor erori datorate scrierii "mecanice" a lui ;, fie secven ta de cod: if (x < 0) { x = -x; ; Caracterul ; de dupǎ este legal, însǎ compilatorul îl considerǎ o instruc tiune vidǎ. Un alt motiv al instruc tiunii vide este situa tia în care dorim sǎ reprezentǎm, în aplica tie, starea de "fǎ mimic". Instruncţiunea compusă sau blocul Mai multe instrucţiuni pot fi grupate cu ajutorul acoladelor într-o instrucţiune compusă, numită şi bloc. { int x = 1; System.our.println( x = + x); ++x; Instrucţiunea compusă este este sintactic echivalentă cu instrucţiunea simplă. Nu se scrie ; după acolada de închidere. Orice variabilă declarată într-un bloc are presistenţa limitată la interiorul blocului în care s-a declarat. În afara blocului variabilă respectivă încetează să mai existe. 66

67 DECIZIA - if! if se foloseşte pentru programarea unei decizii şi are forma generală: if (expr_boleana) instructiune1 [else instructiune2]! expr_boleana trebuie să fie scrisă între paranteze rotunde şi să aibă un rezultat boolean! dacă este nevoie de mai multe instrucţiuni trebuie folosită instrucţiunea compusă în locul celei simple Instrucţiunea if Permite ramificarea rulării în aplicaţie pe baza valorii luate de expr_boleana. Expresia boleană determină care dintre ramuri este rulată după cu urmează:! dacă valoarea expresiei boleene este true se rulează instrucţiune simplă instructiune1! dacă valoarea expresiei boleene este false se rulează i n s t r u cţiunea simplă instructiune2 Porţiune cu else este opţională, dacă este omisă atunci nu se va rula nimic în situaţia în care expr_boleana ia valoarea false Dacă se doreşte ca instrucţunea if să aibă efect asupra unui grup de instrucţiuni acestea trebuie puse înt-un bloc. Blocul ne permite ca în locul unei instrucţiuni simple Java să avem voie să scriem un grup de instrucţiuni Java. Exemplu: if (i>0) System.out.println( i -= + i); if (i>0) { System.out.println( i -= + i); i=i%2; 67

68 if-uri imbricate! apar atunci când una dintre instrucţiunile simple din if este la rândul ei un if if (expr_boleana1) if (expr_bolenan2) instructiune1 [else instructiune2] [else instructiune3] Dacă este cazul instrucţiunile if pot fi imbricate (cuprinse una în alta). Deoarece partea de else este opţională se poate ajunge la situaţia în care pune problema aparteneţei lui else. if (expr_boleana1) if (expr_bolenan2) instructiune1 else instructiune3 Regula este aceea că else se asociază cu cel mai apropiat if. Dacă acestă asociere implicită nu este convenabilă atunci se pot folosi acoladele pentru a o modifica. Când trebuie să luam o singură decizie dintre mai multe avem de a face cu o multidecizie. Aceasta se poate programa cu o secvenţă de if-uri după cum urmează. Dacă expr_boleanai este true atunci se rulează instructiunei (i = 1, 2, 3), altfel se ajunge la instructiune4. secventa A if (expr_boleana1) instructiune1 else if (expr_boleana2) instructiune2 else if (expr_boleana3) instructiune3 else instructiune4 secventa B 68

69 Operatorul condit ional? :! este o alternativă la if else! este ternar (are 3 operanzi) având forma: expr_boleana? expr1 : expr2! dacă expr_boleana este true ia valoarea lui expr1, altfel pe a lui expr2 Cei trei operanzi formează o expresie condiţională. Primul operand (expr_boleana) trebuie să fie o expresie boleană (de exemplu o condiţie), al doilea operand (expr1) este valoarea pe care expresia condiţională o întoarce dacă expresia boleană ia valoarea true. Al treilea operand (expr2) este valoarea expresiei condiţionale dacă expresia boleană ia valoarea false. Fie linia de cod: System.out.println(nota >=5? Admis. : Respins. ); Dacă valoarea din variabila nota este mai mare sau egală cu 5, atunci expresia condiţională ia valoarea Admis., atfle ia valoarea Respins.. O aplicaţie este determinarea minimului dintre două valori: int a = 5, b =3; int minim; minim = (a > b)? b : a; System.out.println( Minimul este: + minim); 69

70 Erori specifice lui if int a = 3, b = 2; if (a > 0) if (b < a) System.out.println( b < a ); else System.out.println( a < 0 ); int a = 3; if (a = 5) System.out.println( a este 5 ); int a = 3; if (a%2 == 1) ; System.out.println( a este impar ); Eroarea Asocierea dintre if-uri şi else este greşită, secvenţa de cod fiind echivalentă cu: if (a > 0) { if (b < a) System.out.println( b < a ); else System.out.println( a < 0 ); adică else-ul ţine de al doilea if. Pentru ca acesta să ţină de primul trebuie să folosim acoladele astfel: if (a > 0) { if (b < a) System.out.println( b < a ); else System.out.println( a < 0 ); Eroarea Aici în locul opreratorului de testare a egalităţii (= =) s-a folosit cel de atribuire (=). Java va da eroare la compilare deoarece expresia de testat trebuie să fie boleană. Eroarea S-a pus caracterul ; după testul din if. Compilatorul nu dă eroare deoarece tratează if-ul având drept corp o instrucţiune vidă. 70

71 DECIZIA - switch! switch se foloseşte pentru programarea unei multidecizii, are forma generală: switch (expr_intreaga) { case expr_const1: instructiune1 break; case expr_const2: instructiune2 break; [default:] instructiune3 break;] Instrucţiunea de decizie switch se utilizează atunci când avem de rulat o secvenţă dintre mai multe posibile. Valoarea expresiei de test (expr_intreaga) trebuie să fie de tipurile: byte, char, short sau int. Tipurile long, float, double sau alte tipuri de obiecte (String etc.) sunt interzise. Valoarea expresiei de test se compară, secvenţial, cu expresiile constante (expr_consti) care etichetează instrucţiunile instructiunei. Dacă s-a găsit egalitate rularea începe de la instrucţiunea următoare (cea care vine imediat după cele : ale lui case) şi ţine până la întâlnirea unui break, moment în care rularea se conţinuă cu secventa B. Dacă nu se găseşte nici o egalitate rularea va continua cu instrucţiunile următoare etichetei default. Eticheta default este opţională, dacă aceasta lipseşte switch-ul nu va face nimic în lipsa găsirii unei egalităţi. Etichetele trebuie să fie expresii constante (au valori cunoscute în momentul compilării). În acest scop se pot folosi literali sau variabile final. 71

72 import java.util.*; public class Switch { public static void main(string[] args) { Scanner intrare = new Scanner(System.in); System.out.print("Selecteaza optiunea (1,2,...,7): "); int optiune = intrare.nextint(); switch (optiune) { case 1: case 2: case 3: case 4: case 5: System.out.println("La munca cu tine"); break; case 6: System.out.println("La chef cu tine"); break; case 7: System.out.println("Relaxeaza-te sau revino-ti!"); break; default: System.out.println("Aici, pe Terra, avem numai 7 zile!"); break; //terminare switch //terminare main // terminare clasa Switch Rezultate: Selecteaza optiunea (1,2,...,7): 5 La munca cu tine 72

73 CICLAREA în Java! 3 instrucţiuni de ciclare: while do while for! toate ciclurile au 4 porţiuni: # iniţializarea # test de continuare # corpul # iteraţia Denumirea de ciclare sau iteraţie se foloseşte pentru a descrie rularea repetată a unui grup (bloc) de instrucţiuni până când o anumită condiţie ajunge să fie îndeplinită. Ciclarea este caracterizată printr-o mulţime de condiţii iniţiale, o condiţe de terminare şi un pas de iterare. Iniţializarea Constă în atribuirea de valori iniţiale unor variabile ce sunt modificate prin iterare şi testate pentru continuarea corpului ciclului. Teste de continuarea Este o valoarea de tipul boolean ce determină reluarea rulării instrucţinilor din corpul ciclului. Dacă expresia de terminare se evaluează la valoarea true corpul se reia, dacă este false reluarea se termină şi se continuă cu secvenţa următoare ciclului. Corpul Este o singură instrucţiune simplă sau una compusă care va fi reluată până la îndeplinirea condiţiilor de terminare respectiv atunci când expresia de test ia valoarea false. Iterarea Reprezintă codul ce se rulează după rularea corpului dar înainte de realizarea testuui de realuare a ciclului. Se foloseşte pentru controlul rulării instrucţiunii de ciclare. Trebuie să realizeze avansul către condiţia de terminare a ciclului. 73

74 CICLUL while! cel mai simplu ciclul Java, are forma: while (conditie) instructiune! conditie se scrie între paranteze! corpul este format dintr-o instructiune simplă sau un bloc i:5 int i = 5; //initializare while (i >= 0) //test System.out.println("i: " + i--); while (i < 5) { System.out.println("i: " + i); ++i; i:4 i:3 i:2 i:1 i:0 i:-1 i:0 i:1 i:2 i:3 i:4 Ciclul while reia rularea lui instructiune atât timp cât conditie are valorea true. Corpul lui while nu se va rula dacă conditie este false. Dacă conditie are valoarea false de la început, corpul ciclului nu se va rula. 74

75 Aplicat ia 1 - while Cunoscându-se valoarea depunerii iniţiale şi rata anuală se cere să se determine numărul de luni necesar pentru a cumula în cont o sumă impusă de bani. Dobânda se calculează lunar şi se cumulează (se adună) cu valoarea din luna anterioară din cont. Spaţiul datelor Estre mulţimea variabilelor foloşite pentru reprezentarea şi soluţionarea cerinţei impuse. Numele variabilei Semnificaţie Tipul Valoarea iniţială depunere valoarea depunerii iniţiale double dată de intrare dobandaan valoarea dobânazii anuale double data de intrare scop valoarea ce se doreşte a fi atinsă double dată de intrare cont valoarea curentă în cont double depunere luni rezultat: numărul de luni necesar atingeriui scopului int 0 Spaţiul transformărilor Este dat de mulţimea operaţiunilor efectuate asupra spaţiunlui de date pentru găsirea soluţiei. Datele de intrare se modifică ca urmare a citirii valorilor corepunzătoare de la tastatură. Calculul dobânzii pe lună: dobânda pe lună = dobandaan / 100 / 12 Se împarte cu 100 deoarece dobânda pe an se dă în procente şi cu 12 deoarece anul are 12 luni. Dacă suma existenă în cont se înmulţeşte cu această valoare se obţine câştigul lunar pe suma totală din cont. Cumularea lunară a dobânzii: cont = cont + cont * dobânda pe lună Valoarea nouă a contului va fi cea veche la care se mai adaugă câştigul ca urmăre a dobânzii lunare. Actualizarea lunii luni = luni + 1 Variabila se actualizrează prin creştere cu o unitate până când scopul nu s-a atins. Atingerea scopului duce la afişarea valorii acestei variabile şi la terminarea aplicaţiei Descrierea în cuvinte a soluţiei: Citeşte scop Citeşte depunere 75

76 Citeşte dobandaan in % // iniţializări cont = depunere; luni = 0; // actualizarea contului pe luna // pana cand scopul este atins Repetă cât timp (cont <= scop) { dobandalunara = cont * dobandaan / 100 / 12; //calcul dobanda lunara cont = cont + dobandalunara; //cumulare dabanda lunara luni = luni + 1 //crestere luna //afisare rezultat(e) Afisare luni Codul java: import java.util.*; public class Dobanda { public static void main(string[] args) { // citirea datelor de intrare Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); double scop = in.nextdouble(); System.out.print("Care e suma initiala? "); double depunere = in.nextdouble(); System.out.print("Dobanda anuala %: "); double dobandaan = in.nextdouble(); // initializare double cont = depunere; int luni = 0; // actualizarea contului pe luna // pana cand scopul este atins while (cont <= scop) { // dobanda pe luna se calculeaza din cont double dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; // afisarea rezultatului System.out.println("Ajungi la suma dorita in " + luni + " luni."); Rezultate: De ce suma ai nevoie? Care e suma initiala? 7800 Dobanda anuala %: 5 Ajungi la suma dorita in 60 luni. 76

77 Aplicat ia 2 - while Să se calculeze şi să se afişeze media aritmetică a unei clase formate din 5 elevi. Media fiecărui elev este un număr întreg care se citeşte de la tastatură. Spaţiul datelor Numele variabilei Semnificaţie Tipul Valoarea iniţială notaelev media unui elev int data de intrare obţinută prin conversie contorelev numără elevii pentru care s-au citi mediile int 1 total suma mediilor elevilor citite de la tastatură int 0 mediaclasa rezultat: media aritmetică a clasei double sirnota nota introdusă de la tastatură sub formă unui şir de caractere String data de intrare Spaţiul transformărilor Totalizarea mediilor individuale total = total + notaelev Suma mediilor individuale presupune o adunare repetată ce se termină atunci când s-au prelucrat toti elevii. Această sumă se realizează pe măsură ce se citeşte câte o medie de elev. Valoarea nouă a totalului este cea anterioară (veche) la care se adună ultima medie citită. Descrierea în cuvinte a soluţiei: //initializari total = 0; contorelev = 1; //totalul mediilor individuale Repetă cât timp (contorelev <= 5) { Citeste notaelev total = total + notaelev //insumeaza media individuala citita contorelev = contorelev +1 //creste contor elev //calcul medie clasa mediaclasa = total / 5. //afisare rezultat Afisare mediaclasa) Codul Java: 77

78 import javax.swing.joptionpane; public class Media { public static void main(string[] args) { int total; int contorelev; int notaelev; double mediaclasa; String sirnota; //initializari total = 0; contorelev = 1; //totalul mediilor individuale while (contorelev <= 5) { sirnota = JOptionPane.showInputDialog("Nota pentru elev " + contorelev); notaelev = Integer.parseInt(sirNota); // sunt scrieri alternative ale instructiunilor total = total + notaelev; //total+=notaelev; contorelev= contorelev +1; //++contorelev; //calcul medie clasa mediaclasa = total / 5.; //afisare rezultat JOptionPane.showMessageDialog(null, "Media clasei este: " + mediaclasa); Rezultate: 78

79 CICLUL do while! are plasată condiţia de realuare a ciclului la capăt: do instructiune while (conditie);! conditie se scrie între paranteze! corpul este format dintr-o instructiune simplă sau un bloc int i = 5; do { System.out.println("i = " + i); i--; while (i > 0); i=5 i=4 i=3 i=2 i=1 Ciclul do while lucrează după acelaşi pricipiu cu ciclul while cu excepţia că expresia de reluare a ciclului conditie se evaluează după ce corpul a fost rulat o dată. Instrucţiunea se utilizează atunci când corpul ciclului trebuie rulat cel puţin o singură dată. 79

80 Aplicat ia 1 - do while Acesta este o implementare folosind ciclul do while a aplicaţie 1 de la ciclul while. import java.util.scanner; public class DobandaV1 { public static void main(string[] args) { // citirea datelor de intrare double scop, depunere, cont, dobandaan, dobandalunara; int luni; String raspuns; Scanner in = new Scanner(System.in); System.out.print("De ce suma ai nevoie? "); scop = in.nextdouble(); System.out.print("Care e suma initiala? "); depunere = in.nextdouble(); System.out.print("Dobanda anuala %: "); dobandaan = in.nextdouble(); // initializarei cont = depunere; luni = 0; // actualizarea contului pe luna // pana cand scopul este atins do { // dobanda pe luna se calculeaza din cont dobandalunara = cont * dobandaan / 100 / 12; cont += dobandalunara; luni++; System.out.println("Dupa " + luni + " luni ai acumulat " + cont + " RON"); System.out.print("Iti ajunge suma acumulata? (D/N): "); raspuns = in.next(); while (raspuns.equals("d")) ; Rezultate: De ce suma ai nevoie? 1000 Care e suma initiala? 970 Dobanda anuala %: 12 Dupa 1 luni ai acumulat RON Iti ajunge suma acumulata? (D/N): D Dupa 2 luni ai acumulat RON Iti ajunge suma acumulata? (D/N): D Dupa 3 luni ai acumulat RON Iti ajunge suma acumulata? (D/N): D Dupa 4 luni ai acumulat RON Iti ajunge suma acumulata? (D/N): N Process exited with exit code 0. 80

81 CICLUL for! realizează gruparea celor 4 porţiuni tipice ale unui ciclu: for(initializare;conditie;iteratie) instructiune for (int i = 0; i < 5; ++i) System.out.println(i); i=0 i=1 i=2 i=3 i=4 Semantica lui for poate fi cuprinsǎ în urmǎtorii pas i: se evalueazǎ ini tializare, aceasta se face o singurǎ datǎ la intrarea în ciclu (nu s i la reluarea acestuia); se trece, apoi, la evaluatea lui conditie, aceastǎ condi tie de reluarea a ciclului este indenticǎ cu cea de la while, ea se evalueazǎ la fiecare reluare, inclusiv dupǎ ini talizarea lui; dacǎ conditie la evaluare dǎ true se trece la rularea lui instructiune dupǎ terminarea execu tiei corpului se trece la evaluarea lui iteratie din acest moment reluarea se face de la evaluarea lui conditie dupǎ scenariul deja descris. Partea de ini tializare poate con tine s i declara tii, din acest punct de vedere urmǎtoarele cicluri sunt echivalente ca s i rezultate: int i; for (i = 0; i < 5; ++i) System.out.println(i); for (int i = 0; i < 5; ++i) System.out.println(i); Vizibilitatea variabilelor declarate în ini tializare se terminǎ odatǎ cu terminarea ciclului for. Componentele ini tializare, conditie s i iteratie sunt op tionale, dar caracterele ; care le separǎ sunt obligatorii. ini tializare s i iteratie pot sǎ con tinǎ o listǎ de expresii separate prin virgulǎ care se evalueazǎ de la stânga la dreapta. Valorile acestor expresii se pierd dacǎ nu sunt stocate în variabile. conditie trebuie sǎ fie de tipul logic, iar dacǎ este absentǎ se considerǎ cǎ are valoarea true. În baza celor scrise, câteva forma valide for sunt: // - aceasta secventa de cod // realizeaza calculul factorialului de la 1 la 7 int i, j; for (i=1, j=i; i < 8; ++i, j*=i) System.out.println(i + "! = " + j); // - afiseaza cifrele de la 0 la 4 int i = 0; 81

82 for ( ; i < 5; ++i) System.out.println(i); // - acelasi efect cu secventa de cod int i = 0; for ( ; i < 5;) System.out.println(i++); // - ciclu for infinit for ( ; ;) {... În primul exemplu ( ) ini tializarea con tine douǎ expresii prin care i ia valoarea 1 s i j valoarea lui i, iar iteraţia (avansul) constǎ în incrementarea lui i s i modificarea lui j la produsul dintre valoarea lui curentǎ s i ce a lui i. În exemplul al doilea ( ) expresia de ini tializare a fost omisǎ s i mutatǎ înainte de începerea ciclului for. Observa ti cǎ prezen ta lui ; este obligatorie. În cel de al treilea ( ) exemplu este omisǎ s i expresia de iteraţie, dar ea a fost inclusǎ în corpul forului. Observa ti cǎ, s i în acest caz, prezen ta lui ; este obligatorie. În cel de al patrulea ( ) exemplu toate cele trei expresii au fost omise. Lipsa lui conditie fiind interpretatǎ ca s i true rezultatul este un ciclu infinit. Crearea unor astfel de cicluri ar fi absurdǎ dacǎ nu ar exista o posibilitate de a le pǎrǎsi (instruc tiunea break este cea care permite ies irea for ta tǎ unui ciclu s i va fi prezentatǎ în continuare). 82

83 Erori specifice ciclurlor int i = 3; while (i < 7); System.out.println(i--); System.out.println( gata. ); int i = 3; while (i < 7) System.out.println(i); -i; int suma = 0; for( ;i<10; suma+=i++); System.out.println(i); Eroarea Ciclul while are un ; în plus după condiţia de testat pentru reluarea ciclului fiind echivelant cu:... while (i <7) ;... Java nu dă eroare la compilare considerând că are de a face cu o instrucţiune vidă. Eroarea while nu are, asemenea lui for, interaţia (expresia de avans către terminarea ciclului) inclusă în corpul ciclului. Expresia -i nu face pare din corpul while-ului deoarece nu s-au folosit acolade, respectiv valoarea lui i rămâne neschimbată. Se obţine un ciclu while infinit deorece valoarea expresiei ce ar trebuie să asigure părăsirea ciclului rămâne pe veci neschimbată. Eroarea Aici valorea lui i nu s-a iniţializat. Iteraţia este continuată cât timp i este mai mic ca 10. Caracterul ; face ca instrucţiunea vidă să fie corpul ciclului for. Expresia de iterare adună pe i la suma şi apoi incrementează pe i. 83

84 Saltul cu break! realizează părăsirea unui switch sau ciclu! părăsirea se face transferându-se rularea la prima instrucţiune următoare;! permite ieşire prematură, deci şi forţată din cicluri while (true) { System.out.println(i); if (i >= 20) //iesire pt. i>=20 break; ++i;... Instruc tiunile de ciclare prezentate (while, do while, for) realizau testul pentru reluare sau terminare la începutul sau la sfârs itul ciclurilor. Uneori, prin natura problemei de rezolvat, acest test trebuie realizat undeva prin mijlocul corpului ciclului sau trebuie realizat în mai multe puncte ale corpului ciclului. Java furnizeazǎ o metodǎ generalǎ de pǎrǎsire a unui ciclu prin instruc tiunea break. Sintaxa instruc tiunii este: break; Pǎrǎsirea ciclului, prin combinarea lui if cu break, se va putea face atunci când o anumitǎ condi tie este îndeplinitǎ. Controlul va fi predat imediat instruc tiunii care care urmeazǎ, secven tial, ciclului. Existǎ grupuri de programatori care evitǎ folosirea lui break deoarece instruc tiunea nu este stric necesarǎ la scrierea aplica tiilor. Aplica tia anterioarǎ ar putea fi modificatǎ asttfel: while (i <= 20) {... pentru evitarea scrierii lui break. O instruc tiune break terminǎ instruc tiunea de ciclare în corpul cǎreia este scrisǎ. Existǎ însǎ posibilitatea realizǎrii unor cicluri imbricate (un ciclu este în corpul altui ciclu). Utilizarea unui break în aceastǎ situa tie va duce la terminarea unui singur ciclu, s i anume, a celui din corpul cǎruia face parte break-ul. Pentru pǎrǎsirea mai multor cicluri se poate folosi instrc tiunea break etichetatǎ care va fi prezentatǎ imediat. 84

85 Saltul cu continue! se poate utiliza numai în cicluri! abandonează interaţia curentă şi transferă controlul la sfârşitul corpului ciclului for(int an = 1990; an <= 2020; ++an) { if ((an % 100 == 0) && (an % 400!= 0)) continue; //saltul se face la ++an if (an % 4 == 0) System.out.println(an); În cadrul ciclurilor, atunci când corpul acestora are mai multe instruc tiuni, existǎ situa tii în care un grup de instruc tiuni se dores te a fi sǎrit, fǎrǎ însǎ a pǎrǎsi ciclurile. În acest scop Java pune la dispozi tia programatorului instruc tiunea continue. Aceasta poate fi folositǎ numai în cicluri s i are ca efect continuarea execu tiei unui ciclu începând cu etapa urmǎtoare execu tiei complete a corpului acestuia (expresia de test pentru reluare corpului la while s i do while sau interaţie la for). Itera tia curentǎ este abandonatǎ s i se trece la intera tia urmǎtoare. Secvenţa de cod prezentată permite determinarea anilor bisec ti. Itera tia în cazul în care anul este divizibil cu 100 dar nu este cu 400 este sǎritǎ folosind continue dupǎ cu se vede mai sus. 85

86 break s i continue etichetate! se utilizează în cazul ciclurilor imbricate! permit saltul în afara ciclului curent! eticheta este un nume dat instrucţiunii în care se va realiza saltul afara1: for (j=0; j<=3; ++j) { afara2: for (k=0; k<=3; ++k) { if (j+k <= 1) { System.out.println(j + " " + k + " > break"); break afara2; if (j+k >= 5) { System.out.println(j + " " + k +" > continue"); continue afara1; if (k == 0) continue afara2; System.out.println(j + " / " + k + " = " + (double)(j/k)); //for(k=... //for(j=... Posibilitatea scrierii unor cicluri imbricate pune problema ies irii definitive dintr-o astfel de situa tie sau de continuare a ciclului în care ciclul curent este imbricat. break s i continue pot fi utilizate cu etichete. Acestea pot marca punctele de pǎrǎsire sau de reluare la nivelul ciclurilor. În cazul lui break saltul se va face la prima instruc tiune urmǎtoare etichetei. Pentru continue saltul se face la urmǎtoarea itera tie a ciclului marcat prin etichetǎ. Rezultate: 0 0 > break 1 0 > break 2 / 1 = / 2 = > continue 3 / 1 = > continue Linia break afara2; produce saltul la instruc tiunea marcatǎ cu afara2:. Acesta este ciclul for (k=0; k<=3; ++k)... Pentru acest break valoarea lui k pleacǎ întotdeauna de la 0. Linia continue afara1; facǎ ca linia de afis are a împǎr tirii sǎ fie omisǎ, iar continuarea se face cu un j actualizat. Des i break s i continue sunt utile în cazul ciclurilor imbricate, folosirea lor este de evitat prin regândirea logicii ciclurilor în care participǎ. Folosirea intensivǎ a acestora va conduce la un cod neclar s i greu de depanat. 86

87 Aplicat ia 1 - for Să se scrie o aplicaţie pentru calcului lui n! = 1*2*3*... *n, cu 1! = 1. import java.util.*; public class factorial { public static void main(string[] args) { Scanner in = new Scanner(System.in); System.out.print("n: "); int n = in.nextint(); long fact = 1; for(int i = 1; i<=n ; ++i) fact=fact*i; //sau fact*=i; System.out.println(n+"! = "+fact); Rezultate: n: 5 5! = 120 n: ! = 0 Observaţi că valoarea lui 555! nu se mai poate reprezenta folosind tipul long. Dacă precizia sau domeniul de valori a tipurilor întregi sau reale nu sunt suficiente în Java se pot folosi clasele BigInteger sau BigDecimal din pachetul java.math. Aceste sunt create pentru manipularea unor valori numerice arbitrar de mari. Aplicaţia anterioară a fost rescrisă folosind în locul lui long pe BigInteger. Aici, crearea unei valori de tipul BigInteger se face cu BigInteger.valueOf(valoare). Operatorii matematici sunt înlocuiţi cu metode, pentru * se va folosi multiply. import java.math.biginteger; import java.util.*; public class factorialb { public static void main(string[] args) { Scanner in = new Scanner(System.in); System.out.print("n: "); int n = in.nextint(); BigInteger fact = BigInteger.valueOf(1); for(int i=1; i<=n ; ++i) fact = fact.multiply(biginteger.valueof(i)); //fact = fact * i; System.out.println(n + "! = " + fact); Rezultate: n: ! =

88 Aplicat ia 2 - for Aplicaţia constă într-un applet ( o aplicaţie ce se rulează în navigator). Codul Java al aplicaţiei. import java.awt.graphics; import javax.swing.japplet; public class for_v1 extends JApplet { public void paint( Graphics g ) { // apel metoda paint mostenita din JApplet super.paint( g ); for ( int c = 1; cr <= 10; c++ ) g.drawline( 10, 10, 250, c * 10 ); // terminare paint // terminare clasa for_v1 Codul HTML al aplicaţiei ce va fi stocat în fişierul text for.html: <HEAD> <APPLET CODE="for_v1.class" WIDTH=500 HEIGHT=120> </APPLET> </HEAD> R u l a r e a aplicaţiei se poate cu aplicaţia appletviewer.exe s a u d i n navigatorul de Internet. Pentru r u l a r e a d i n a p p l e t v i e w e r d e c h i d e m o c o n s o l ă ş i s c r i e m : appletviewe r for.html Acelaşi fişier for.html va putea fi deschis 88

89 în IE sau Mozilla Firefox după cum se vede în continuare. 89

90 5 Concepte de programare orientata pe obiect în Java 90

91 Ce este programarea orientata pe obiect (POO)! este o metodologie (paradigmă) de proiectare a programelor! este inspirată din realitate şi se bazează pe conceptul de modelare pe obiect! trecerea de la realitate la model se face prin abstractizare! câteva caracteristici: G G asigură reutilizarea şi adaptarea simplă a codului; conduce la un cod mai puţin vulnerabil la manipulări eronate. Programarea orientată pe obiect (object oriented programming, în engleză) este o metodologie de scriere a programelor. În programare, modul de abordare a scrierii aplicaţiei, adică metoda, mai poartă şi denumirea de paradigmă (vine din grecescul paradeigma care înseamnă a demonstra ). Fiecare paradigmă a fost pusă la punct cu un scop precis, câteva dintre caracteristicile celei obiectuale sunt: # reutilizarea codului; # întreţinere uşoară; # adaptarea codului cât mai simplă la situaţii noi; # minimizarea vulnerabiltăţii codului la utilizarea greşită din partea programatorilor care în refolosesc. Într-o descriere foarte generală, în programarea orientată pe obiect, aplicat ia de realizat este privită în termenii manipulării unor entităt i numite obiecte s i nu prin prisma act iunilor care trebuiesc implementate (cum se face în programarea structurată). POO are drept sursă lumea înconjurătoare. Omul, în viaţa de toate zilele, îşi propune să fie cât mai concret în descrierea lumii care îl înconjoară. El, dă nume scurte obiectelor înconjurătoare pentru ca să le poată identifica cât mai exact. De exemplu, spunem LOGAN, în loc de automobilul produs la Uzina de Automobile din Piteşti, în colaborare cu Renault. Toate aceste nume particulare ascund însă în spatele lor denumiri mai generale cum sunt: automobile, atomi, stele, oceane, oameni etc. Deseori, un obiect are la bază altele. Trăim, astfel, într-o lume orientată pe obiect. O descriere a termenului de obiect este dată de Booch prin "Un obiect are stare, comportament şi identitate; structura şi comportamentul similar al obiectelor este definit prin clasele lor comune; termenii de instanţă şi obiect sunt echivalenţi". Mai general, un obiect este ceva căruia i se poate aplica un concept. Conceptul este o idee sau o notaţie comună, mai multor obiecte înconjurătoare. Obiectul, din viaţa de toate zilele, în programarea orientată pe obiect este implementat ca o structură de dată (abstractă) încapsulată cu un grup de subrutine denumite metode, care acţionează asupra datelor. Structura obiectului rezultă ca urmare a abstractizării. Abstractizarea implică o generalizare, prin 91

92 ignorarea sau ascunderea detaliilor, în vederea separării unor proprietăţi sau caracteristici ale unei entităţi de obiectul fizic sau de conceptul pe care îl descrie. Ca urmare, în programarea orientată pe obiect, căutarea şi definirea proprietăţilor obiectelor din lumea reală definesc specificul acestei paradigme. Proiectarea orientată pe obiect conduce la o aplicat ie formată din colect ii de obiecte care cooperează. Între obiectele aplicaţiei se stabilesc relaţii de legatură, iar cooperarea între obiecte se face prin mesaje transmise între acestea. Etapele tipice acestei paradigme de proiectare sunt: identificarea claselor s i a obiectelor, identificarea semanticii acestora, identificarea relat iilor s i descrierea interfet elor s i a implementărilor de clase s i de obiecte. Câteva nume care au avut contribuţii importante în crearea şi dervoltarea POO sunt:! Grady Booch, de la Rational, care a dezvoltat renumitul instrument de modelare numit "Rose";! Kirsten Nygaard şi Ole-Johan Dahl, inventatorii limbajului Simula, primul limbaj de programare orientat pe obiect şi inventatorii proiectării orientate pe obiect;! Adelle Goldberg, Kay Alan şi Dan Ingallas fondatorii limbajului obiectual Smalltalk şi coautori ai lui "Smalltalk-80";! Brax Cox, creatorul limbajului Objective-C, care implementează în limbajul C facilităţile legate de identificarea obiectelor şi mecanismul de mesaje din Smalltalk;! Meyer Bertrand creatorul limbajului Eiffel;! Bjarne Stroustrup, inventatorul limbajului C++, o extensie a limbajului C, probabil, unul dintre cele mai populare limbaje de programare orientate pe obiect. 92

93 Conceptul de obiect - definit ii! depinde de contextul în care se lucrează: G G G filozofic: o entitate ce se poate recunoaşte ca fiind distinctă de altele - are identitae proprie proiectarea oo: o abstractizare a unui obiect din lumea reală teoria tipurilor: o structură de date împreună cu funcţiile de prelucrare a lor! se defineşte prin atribute şi operaţii! atributele definesc starea, operaţiile permit modificarea stării. Din punctul de vedere al aplicaţie din care face parte obiectul el trebuie să asigură o parte din funcţiile necesare funcţionării întregii aplicaţii. Termenul de modelare a obiectelor se foloses te pentru a descrie procedura de căutare a obiectelor prin care să descriem problema de rezolvat. Obiectele sunt descrise prin atribute s i operat ii. Atributele sunt caracteristici care se modifică, iar operat iile sunt act iuni pe care obiectul le poate face. De exemplu, pisica are culoare, rasă s i masă (greutate), acestea ar fi câteva dintre atribute ei, ea pot prinde s oareci, mânca, dormi sau mieuna, acestea ar fi câteva dintre act iunile specifice pisicii. Într-un model de obiecte toate datele sunt stocate sub formă de atribute ale obiectelor. Atributele unui obiect vor putea fi manipulate prin act iuni sau operat ii. Singura modalitate de modificare a atributelor este prin utilizarea operat iilor. Atributele pot fi uneori obiecte. Funct ionarea la nivelul unui model de obiecte este definită prin operat ii. Un obiect poate accesa şi utiliza operaţiile unui al obiect. Operaţiile sunt cele ce modifică starea obiectului. Modelarea orientată pe obiect este despre găsirea obiectelor şi a dependenţelor între acestea. Dependenţele între obiecte reprezintă modul în care ele se aranjează, în sensul legăturilor - a relaţiilor, a asocieriilor - care se formează, pentru a ne soluţiona problema. De regulă, indentificarea obiectelor unui model de obiecte se face pe bază de substantive şi verbe. Sunbstativele vor fi obiecte, iar verbele operaţii. Relaţii între obiecte Agregarea, cunoscută în literatura de specialitate sub prescurtarea de relaţie has-a, apare atunci când un obiect este compus din mai multe sub-obiecte. Comportamentul obiectului complex este definit prin comportamentul părţilor componente, distincte şi aflate în interacţiune. În procesul de descompunere al unui obiect în obiecte mai simple, acestea, deseori, vor putea fi reutilizate în alte aplicaţii. Agregarea ne permite deci, reutilizarea componentelor unei aplicaţii într-o altă aplicaţie. Delegarea, cunoscută în literatura de specialitate sub prescurtarea de relaţie uses-a, apare atunci când un obiect, format total sau parţial din alte obiecte, lasă obiectele componente să îi definească comportamentul. Obiectul nu are un comportament implicit, la nivel de interacţiune cu alte obiecte, acesta fiind moştenit de la sub-obiectele lui. 93

94 Conceptul de clasa! clasa este o generalizare a unei mulţimi de obiecte! definiţia unei clase se face prin specificarea: G G G variabilelelor care îi definesc starea - variabile de instant ă; metodele prin care se modifică starea - metode de instant ă; relaţiile cu alte clase. class nume_clasa extends nume_parinte { //STARE - ATRIBUTE tip v_1;... tip v_n; //METODE - OPERATII tip metoda_1(lista parametri) { corp_1... tip metoda_k(lista parametri) { corp_k //TERMINARE definitie de clasa Clasa reprezintă un termen general asociat procesului de clasificare. Scopul clasificării este cel de încadrare a unui obiect într-o colecţie de obiecte similare ce poartă denumirea de clasă. Toate obiectele clasei au aceleaşi atribute şi fac aceleaşi operaţii, dar starea lor diferă şi au o identitate proprie. Un obiect particulat poartă denumirea de instantă. Din punctul de vedere al programatorului clasa reprezintă un nou tip de date. Clasa este o definiţie statică, prin care descriem un grup de obiecte. Clasa este un şablon (un tip), un concept, în timp de obiectele există în realitate (în timpul rulării programului). De exemplu, String reprezintă o clasă, iar variabilele de tipul String reprezintă obiecte ale aplicaţiei. Clasa String este una singură, în timp ce numărul obiectelor de tipul String nu este limitat. În procesul de proiectare a claselor apare situaţia în care mai multe clase distincte au părţi comune. Părţile comune pot fi cuprinse într-o singură clasă şi moştenite la nivelul unor clase ulterioare. Moştenirea, cunoscută în literatura de specialitate sub prescurtarea de relaţie is-a, apare atunci când o clasă are ca părinte o altă clasă. Prin moştenire, noua clasă preia toate caracteristicile clasei moştenite, la care mai poate adăuga unele noi. Astfel, noua clasă o extinde pe cea moştenită, fiind o specializare a acesteia. Moştenirea creşte claritatea proiectului şi productivitatea, deoarece noi clase pot fi create pe baza unora existente. 94

95 Definiţia unei clase presupune descrierea precisă a formei şi a naturii acesteia. Pentru aceasta trebuie specificate datele (atributele) pe care le conţine şi codul (operaţiile) care va opera cu respectivele date. Datele, se vor stoca în variabile ce poartă denumirea de variabile de instanţă, iar operaţiile se implementează în metode. Variabilele şi metodele unei clase poartă denumirea comună de membri. Variabilele de instanţă au această denumire deoarece sunt proprii fiecărei instaţieri de clasă, adică fiecărui obiect din clasa respectivă. Datele unui obiect sunt distincte, separate de datele unui alt obiect din aceeaşi clasă. Exemplul alăturat defineşte în clasa Punct:! două variabile de instanţă: private double x; private double y;! doi constructori: Punct() Punct(double abscisa...)! şase metode: public void setx(double abscisa) public void sety(double ordonata) public double x() public double y() public double distantaorigine() public String tostring() Clasa Grafica, are metoda main(), este punctul de plecare al aplicaţiei şi defineşte două obiecte, P1 şi P2, din clasa Punct. Aici se prezintă:! modul în care se declară obiectele unei clase: Punct p1;! modul în care se alocă spaţiu unui obiect, prin folosirea operatorului new: p1 = new Punct();! modul în care se referă o metodă publică dintr-un obiect: p1.setx(12); public class Punct { /*Atributele clasei, permit stocarea STARII */ private double x; private double y; /*Constructorii clasei, permit initializarea obiectelor din clasa Punct */ Punct() { setx(0); sety(0); Punct(double abscisa, double ordonata) { setx(abscisa); sety(ordonata); /*Metodele clasei, permit accesul si modificarea starii obiectelor din clasa Punct */ public void setx(double abscisa) { x = abscisa; public void sety(double ordonata) { y = ordonata; public double x() { return x; public double y() { return y; public double distantaorigine() { return Math.sqrt(x*x+y*y); public String tostring() { return "<" + x + "," + y + ">"; public class Grafica { public static void main(string[] args){ Punct p1; Punct p2 = new Punct(-1.,7.); p1 = new Punct(); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); p1.setx(12); p2.sety(13.345); System.out.println("p1 = " + p1.tostring()); System.out.println("p2 = " + p2); 95

96 Crearea obiectelor! obiectele se creeaza cu operatorul new refobiect = new nume_clasa();! new realizeaza urma toarele act iuni: G aloca memorie pentru nou obiect; G apeleaza o metoda speciala de init ializare numita constructor; G întoarce o referint a la noul obiect. În Java obiectele se creează cu operatorul new. În aplicat ia anterioară se crează două instant e ale clasei Punct prin liniile de cod: Punct p2 = new Punct(-1,7); p1 = new Punct(); Prima linie declară şi creează variabila obiect p2, iar cea de a doua creează variabila p1, ea fiind deja declarată anterior. Operatorul new are ca efect alocarea de spat iu în RAM pentru obiect şi are ca rezultat o referint ă către obiectul creat. Respectiva referint ă se va stoca în variabila obiect, mai sus p1 şi p2, prin care vom putea accesa tot i membrii obiectului în cauză. Reprezentarea grafică a clasei Punct se poate da sub forma alăturată. Pe baza acestei clase vor crea două variabile obiect sau instant e, p1 şi p2. Spat iul de date pentru instant a p1 va fi reprezentat grafic pentru a descrie etapele parcurse la crearea unui obiect. În momentul declarării obiectului p1 prin linia Punct p1; în RAM se alocă spat iu în RAM pentru o referint ă căte un obiect. Spat iul de date alocat în RAM constă într-o locat ie cu numele p1 în care este stocată o valoarea specială null. Această valoarea specială arată faptul că obiectului încă nu i s-a alocat spat iu. În etapa următoare, operatorul new alocă spat iu pentru obiect pe baza definit iei de clasă, apelează constructorul clasei pentru a init ializa variabilele de instantă x şi y cu valorile 0 şi 0, apoi întoarce o referint ă (o adresă de RAM ce se reprezintă grafic ca o săgeată cu vârful de la instant ă către spat iul alocat obiectului) către nou obiect ce va fi stocată în variabila obiect p1. 96

97 Conceptul de referint a! prin referint a se înt elege adresa unei locat ii de RAM! membrii unui obiect se acceseaza printr-o referint a la obiect stocata în variabila obiect: p1.setx(12);! la declarare, variabilele obiect sunt init ializate automat cu null: Punct p1; este Punct p1 = null;! valoarea null poate fi comparata cu alte referint e: if (p1 == null) p1 = new Punct();! distrugerea unui obiect se face prin setarea referint ei lui la null: p1 = null; RAM-ul este organizat sub forma unui tablou liniar de elemente numite locat ii. Fiecare locat ie este indentificată unic printr-un număr întreg numit adresă şi poate stoca o valoare. În reprezentările grafice utilizate pentru descrierea stării spat iului de date dreptunghiul reprezintă o locat ie (sau un grup de locat ii consecutive), numele variabilei se scrie în stânga dreptunghiului fiind echivalentul adresei locat iei. În interiorul dreptunghiului se va scrie valorea stocată în respectiva locat ie. Valorile numerice stocate în locat ii sunt dependente de tipul de date folosit la declararea variabilei. Pentru tipurile primitive locat iile cont in reprezentarea binară a valorilor atribuite respectivelor variabile. În cazul variabilelor obiect, locat iile stocează adresa de început în RAM a grupului de locat ii alocat de new pentru stocarea instant ei. O variabilă ce stochează o adresă poartă denumirea de referint ă (denumiri altenative sunt pointer - din engleză sau poantor - din franceză). Atribuirea în situat ia referint elor are ca efect obt inerea a două variabile ce referă acelaşi obiect. Prin atribuire ajungem să avem mai multe variabile obiecte distincte care referă însă un singur obiect. 97

98 Încapsularea (encapsulation) s i vizibilitatea membrilor! vizibilitatea membrilor este controlata prin specificatorii de acces: G public G private G protected! încapsularea asigura : G protect ia datelor prin accesul la acestea numai prin intermediul unei intefet e publice (public) G izolarea pa rt ilor vizibile prin interfat a de implementarea interna (private)! avantajele încapsula rii: G nu pot fi realizate modifica ri ilegale ale datelor, deoarece accesul direct la ele este restrict ionat G gruparea datelor şi a operat iilor ce se pot realiza cu ele permit depistarea uşoara a eventualelor probleme G modifica rile interne ale clasei nu se reflecta şi în afara ei (daca se pa streaza aceeaşi interfat a ), ca urmare restul programului nu trebuie modificat Membrii public vor fi vizibili pentru orice port iune de cod din aplicat ie. Membrii private vor fi vizibili numai pentru membrii clasei din care face parte. Membrii protected sunt vizibili numai prin moştenire. Condit iile de implementare corectă a încapsulării:! toate variabilele de instant ă sunt declarate cu private;! numai metodele public ale obiectului vor putea fi utilizate pentru accesul la datele private ale acestuia; În continuare se prezintă o astfel de implementare a clasei Punct: 98

99 În această implementare x, y şi distanta sunt toate declarate private, deci invizibile pentru un utilizator al clasei. Modificarea valorilor acestor variabile de insstant ă se face numai sub controlul metodelor:! automat la crearea instant ierea obiectelor prin act iunea automată a c o n s t r u c t o r i l o r : P u n c t ( ), Punct(double x, double y)! prin apelul metodelor: setx(double x), sety(double y) Vizualizarea valorilor stocate în variabilele provate se face cu metodele: x(), y() şi distantaorigine(). public class Punct { //Campuri private double x; private double y; private double distanta; //Constructori Punct() { setx(0); sety(0); distanta = 0; Punct(double x, double y) { setx(x); sety(y); actualizaredistanta(); // Metode public void setx(double x) { this.x = x; actualizaredistanta(); public void sety(double y) { this.y = y; actualizaredistanta(); public double x() { return x; public double y() { return y; public double distantaorigine() { return distanta; private void actualizaredistanta() { distanta = Math.sqrt(x*x+y*y); public String tostring() { return "<" + x + "," + y + ">"; 99

100 Metode! metoda implementeaza o operat ie cu datele obiectului! metodele se implementeaza sub forma unor proceduri sau funct ii (întorc valori cu return) ce realizeaza anumite operat ii! metodele pot fi definite numai într-o deninit ie de clasa, astfel: vizibilitate tip nume_met([lista parametri]) { corp_1 tip - defineşte tipul de date întors de metoda nume_met - defineşte numele metodei [lista parametri] - o secvent a opt ionala de perechi tip nume separate prin virgule Operat iile unei clase se definesc cu ajutorul metodelor. Metodele din Java sunt echivalentul procedurilor şi funct iilor din alte limbaje de programare, cu except ia ca ele trebuie scrie obligatoriu în interiorul definit ie de clasă (nu există conceptul de metodă globală în Java). Vizibilitatea controlează cine anume va putea apela metoda. Pentru public acesta va fi apelabilă din toată aplicat ia, pentru private numai de alte metode din clasa în care s-a definit. Dacă metoda întoarce o valoare, adică este o funct ie, ea va avea specificat unul dintre tipurile deja discutate şi o instruct iune de salt necondit ionat return expresie ca va genera întoarcerea în codul apelant cu valoarea lui expresie. Dacă metoda nu întoarce valoare, adică este o procedură, tipul ei va fi obligatoriu void şi nu va cont ine instruct iune return. Pentru ca operat ia implementată la nivelul unei metode să aibă loc aceasta trebuie apelată. Prin apel, va se realiza rularea instruct iunilor cuprinse în corpul metodei. Terminarea metodei se face la rularea unei instruct iuni return, din corpul ei sau, în lipsa lui return, la atingerea acoladei de inchidera a corpului ciclului. La terminarea rulării unei metode rularea aplicat iei va continua cu instruct iunea imediat următoare celei de apel a metodei. Port iune de cod din care se face apelul metodei se numeşte cod apelant, iar port iune de cod corespunzătoare metodei apelate se numeşte cod apelat. Metoda poate avea zero sau mai mult i parametri. Parametrii sunt valori transferate metodei în momentul apelului acesteia. Aceste valori, dacă există, vor putea fi prelucrate în corpul metodei pentru a produce rezultatele întoarse cu return. 100

101 Apelul metodelor şi metodele de transfer al parametrilor! sintaxa generala pentru apelul unei metode este: refobiect.nume_met(argumente)! parametrii sunt variabile ce primesc valori în momentul apelului şi se numesc argumente! valorile parametrilor ce sunt tipuri de date primitive se transfera prin valoare! la transferul prin valoare, metodei, i se transfera o copie a valorilor parametrilor din programul apelant Aplelul de metodă Apelul unei metode se face se face cu ajutorul operatorului punct. Forma generală a unui apel de metodă este refobiect.nume_met(argumente), în situat ia exemplului de mai sus apelul de metodă este p1.setx(12). Parametrii şi argumente Metodele nu au nevoie de parametri. Folosirea parametrilor perminte însă o generalizare a meteodei în sensul că aceasta va putea opera cu mai multe date de intrare şi/sau în mai multe situat ii uşor distincte. Termenul de parametru se foloseşte pentru o variabilă definită la nivelul metodei care primeste o valoare în momentul apelării metodei. Persistent a şi vizibilitatea parametrilor este limitată la corpul metodei. Termenul de argument se foloseşte pentru o valoarea care se transferă metodei atunci când aceasta este apelată. Astfel, în exemplul prezentat abscisa este parametru, iar 12 este argument. Apel prin valoarea Exită două tipuri de parametri în Java: tipuri primitive şi referint e la obiecte. În cazul ambelor categorii de parametri apelul se face întotdeauna prin valoare. Respectiv metoda primeşte o copie a argumentelor prin stivă şi nu va putea să modifice cont inutul init ial al argumentelor ce se transferă în parametrii din 101

102 interiorul metodei. În cazul parametrilor de tipul referint ă la obiect se poate modifica starea obiectului utilizând metodele puse la dispozit ie în acest scop, dar nu se pot modifica referint ele originale ale argumentelor de tipul referint ă la obiect în corpul metodei. Iată un exeplu: Este imposibilă modificarea unui argument de tip primitiv prin parametrii metodei. Pentru aceasta s-a scris metoda dubleazax() ce ar trebui s a dubleze valorea argumentului x cu valoarea init ială 5. Observat i în rezultate că deşi în corpul metodei dublarea se face, la terminarea metodei şi revenirea din aceasta, valoarea dublată se pierde. Iată cum lucrează Java: 1. parametrul a este init ializat cu o copie a valorii stocate în argumetul x, adică cu o copie a lui 5; 2. a este dublat, adică devine 10, dar x rămâne 5; 3. metoda se termină, iar parametrul îşi încetează persistent a, deci variabila a nu mai există. În siuat ia în care parametrul (vezi metoda schimbax()) este o referint ă la un obiect, Java lucrează astfel: 1. parametrul x primeşte o copie a referint ei către obiectul p1; 2. metoda setx() este aplicată asupra referint ei la obiect, obiectul PunctOK fiind referit în acest moment de x şi p1; 3. metoda se termină şi parametrul x încetează să mai existe. public class GraficaOK { public static void main(string[] args) { double x = 5; PunctOK p1 = new PunctOK(); PunctOK p2 = new PunctOK(-1.,7.); System.out.println("in afara lui dubleazax x este: " + x); dubleazax(x); System.out.println("in afara lui dubleazax x este: " + x); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); interschimba(p1, p2); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); schimbax(p1); System.out.println("p1 = " + p1); //modificarea valorii argumentului //NU se reflecta in codul apelant public static void dubleazax(double a) { a = 2. * a; System.out.println("in dubleazax x este: " + a); //metoda de interschimbare NU lucreaza //ca urmare a transferului prin valoare public static void interschimba(punctok x, PunctOK y) { PunctOK aux = x; x = y; y = aux; //lucreaza corect public static void schimbax(punctok x) { x.setx(100); Rezultate: in afara lui dubleazax x este: 5.0 in dubleazax x este: 10.0 in afara lui dubleazax x este: 5.0 p1 = <0.0,0.0> p2 = <-1.0,7.0> p1 = <0.0,0.0> p2 = <-1.0,7.0> p1 = <100.0,0.0> Metoda poate modifica starea unui parametru obiect deoarece primeşte copie o referint ei la obiectul init ial. Atât copia cât şi argumentul referă însă acelaşi obiect. 102

103 Constructori! defineşte starea init iala a obiectelor! are acelaşi nume cu clasa! este apelat automat dupa crearea obiectului, înainte ca operatorul new sa se termine;! nu întorc o valoarea de un anumit tip (nici ma car void) public nume_clasa(){... ;! sintactic sunt identice cu metodele (pot avea parametri) Constructorii clasei PunctOK sunt prezentat i în secvent a de cod alăturată. Observat i că există doi contructori ce poartă numele clasei, diferent a între ei fiind parametrii. În măsura în care este uitată definirea lor, Java utilizează un constructor implicit (default constructor), fără argumente şi fără nici un fel de cod, ce permite, măcar crearea obiectelor din clasa respectivă şi init ializarea la valori implicite a variabilelor de instant ă. Constructorul implicit poate fi scris şi explicit dacă init ializările implicite (toate datele numerice iau valoarea 0, Boolean false iar obiectele null) nu sunt cele dorite. Constructorul implicit PunctOK() va fi apelat automat la creare unui obiect prin linia ce cod PunctOK p1 = new PunctOK();, iar constructorul PunctOK(double x, double y) va fi apelat automat la crearea unui obiect cu linia de cod PunctOK p2 = new PunctOK(-1.,7.);. Java identific a constructorul ce trebuie să-l apeleze pe baza numă rului şi tipurilor parametrilor şi a argumentelor. public class PunctOK { //Campuri... //Constructori PunctOK() { setx(0); sety(0); distanta = 0; PunctOK(double x, double y) { setx(x); sety(y); actualizaredistanta();

104 104

105 Supraînca rcarea (overloading)! permite folosirea aceleiaşi sintaxe pentru obiecte de tip diferit! la nivel de metode de clasa, apare atunci când avem mai multe metode cu acelaşi nume, dar cu declarat ii de parametrii dinsticte! supraînca rcarea este o forma polimorfism! Java se foloseşte de tipul şi/sau de numa rul parametrilor din apel pentru a determina care dintre metodele supraînca rcate sa le apeleze În exemplul prezentat clasa PunctOK are mai mult i constructori. Deşi constructorii au acelaşi nume, au număr şi/sau tipuri de parametrii distinct i. Compilatorul determină care dintre constructori urmează să fie apelat prin compararea numărului şi a tipurilor de parametri din definit ia constructorului cu numărul şi tipurile valorilor argumentelor folosite în apelul contructorului. Dacă o astfel de corespondent ă nu se poate stabili sau se pot stabili, simultan, mai mult de o singură corespondent ă biunivocă va genera o eroare legată de rezolvarea supraîncărcătrii (overloading resolution). Supraîncărcarea în Java este posibilă atât la nivel de constructori cât şi la nivel de metode. Descrierea completă a unei metode se realizează pe baza numelui metodei împreună cu tipurile parametrilor acesteia. Aceste informat ii poarte denumire de semnătura metodei (method signature). Tipul întors de metodă nu face parte din semnătura metodei, atfel nu putem avea două metode cu acelat i nume şi parametri, dar cu tip întors diferit. 105

106 Referint a this! this este argument implicit al orica rei metode! this este o referint a la obiectul curent! this poate fi folosit în corpul orica rei metode ale obiectului curent public void setx(double x) { this.x = x; actualizaredistanta(); Obiectul curent poate fi referit în Java prin folosirea cuvântului cheie this. Toate metodele unei instant e primesc ca argument implicit pe this. Obiectul curent este obiectul al cărei metode a fost apleată. public class Punct { //Campuri private double x; private double y; private double distanta;... Exemplul alăturat prezintă modul de utilizare în cod a lui this. Dintre situat iile în care se doreşte folosirea explicită a lui this amintesc:! numele unei variabile de instant ă este identic cu cel al unui parametru de metodă (vezi exemplul alăturat), în această situat ie accesul la variabila i n s t a n t a s e f a c e p r i n this.nume_var_instanta;! este necesară transferarea unei referint e la obiectul curent ca argument, unei alte metode;! un constructor al unei clase apelează un alt constructor al aceleiaşi clase (permite evitarea reluării unor secvenţe de iniţializare). // Metode public void setx(double x) { this.x = x; actualizaredistanta(); public void sety(double y) { this.y = y; actualizaredistanta();

107 Moştenirea! moştenirea permite crearea unor ierarhii de clasificare! extends se foloseşte în Java pentru a descrie moştenire între clase class nume_subclasa extends nume_superclasa { ada ugarea de noi variabile şi metode! reprezentarea grafica a moştenirii se face printr-o sa geata (care se citeşte moşteneşte de la )! clasa care exista se numeşte superclasa, clasa de baza sau clasa pa rinte, noua clasa se numeşte sublclasa, clasa derivata sau clasa copil Moştenirea permite crearea de noi clase pe baza unora existente. Noua clasă se numeşte subclasă şi se defnieşte prin extinderea unei clase deja exisntente numită superclasă. La definirea subclasei se vor specifica numai diferent ele fat ă de superclasă. Cele mai generale variabile şi metode sunt plasate în superclasă iar cele mai specializate în subclasă. În situat ia în care unele metode ale superclasei nu sunt corerspunzătoare subclasei acestea pot şi suprascrise. Aplicat ia ce urmează îşi propune să creeze o bibliotecă grafică. Comceptul de bază aici este cel de cooronate pe care se va baza acela de punct. Clasa de bază va fi deci Coordonate iar cea derivată din aceasta este Punct. Noua clasă are adăugate variabila de instant ă nume, metoda setnume() şi suprascrisă metoda tostring(). Deşi există două metode cu acelaşi nume tostring() în superclasă şi însubclasă, Java va ştii să apeleze metoda dorită corect. Constructorii noi clase sunt Punct(), Punct(double x, double y) şi public Punct(double x, double y, String nume). Fiecare subclasă poate accesa constructorul superclasei iar codul comun poate fi scris în superclasă şi apelat în subclasă prin folosirea lui super. Noua clasă însă nu moşteneşte constructorii clasei de bază ea beneficiind în mod direct numai de constructorul implicit. Deşi subclasa include tot i membrii superclasei, aceasta nu va putea membrii care au fost declarat i cu private. 107

108 public class Coordonate { private double x; private double y; Coordonate(){ setx(0); sety(0); Coordonate(double x, double y){ setx(x); sety(y); public void setx(double x) { this.x = x; public double getx() { return x; public double gety() { return y; public void sety(double y) { this.y = y; public String tostring() { return "(" + x + "," + y + ")"; public class Punct extends Coordonate { private String nume; public Punct() { super(); setnume("p"); public String tostring() { return nume +"(" + getx() + "," + gety() + ")"; public class Mostenire { public static void main(string[] args) { Coordonate c1 = new Coordonate(); Coordonate c2 = new Coordonate(1,2); Punct p1 = new Punct(); Punct p2 = new Punct(1,1); Punct p3 = new Punct(1,2,"P3"); Punct p4 = new Punct(c1); System.out.println(c1); System.out.println(c2); System.out.println(p1); System.out.println(p2); System.out.println(p3); System.out.println(p4); c1 = p1; System.out.println(c1); c1 = c2; System.out.println(c1); Rezultate: (0.0,0.0) (1.0,2.0) P(0.0,0.0) P(1.0,1.0) P3(1.0,2.0) P(0.0,0.0) P(0.0,0.0) (1.0,2.0) public Punct(double x, double y) { super(x,y); setnume("p"); public Punct(double x, double y, String nume) { this(x,y); setnume(nume); public Punct(Coordonate c) { this(c.getx(),c.gety()); setnume(nume); public void setnume(string nume){ this.nume = nume; 108

109 Referint a super! super este o referint a la clasa de baza! se utilizeaza la apelul constructorilor din clasa de baza! trebuie sa fie fie prima linie în constructorul clasei derivate! se poate apela constructorul orica rei clase de baza! se poate referi oricare membru al superclasei Apelul unui constructor al superclasei: super(lista parametri) Referirea unui membrul al superclasei: super.membru Aplicat ia anterioară prezintă modul de utilizare a lui super. Asemenea lui this, ce avea două semnificat ii:! o referint ă de tip argument implicit la metodele obiectului;! o referint ă la obiectul în cauză prin care se pot apela alt i construcori ai aceleiaşi clase; şi cuvântul cheie super are două semnificat ii asigurând:! apelul unei metode din superclasă;! apelul constructorilor superclasei. De exemplu, în codul următor, metoda tostring() a clasei derivate Punct poate fi rescrisă utilizând pe super pentru apelul tostring() din clasa de bază Coordonate astfel: public String tostring() { return nume + super.tostring(); //return nume +"(" + getx() + "," + gety() + ")"; 109

110 Polimorfism! polimorfismul defineşte abilitatea de a avea mai multe forme! în OOP apare atunci când o variabila, în timpul rula rii, este ataşata unor obiecte de tipuri distincte! moştenirea genereaza subclase între care avem o dependent a de tipul is-a! is-a reprezinta un principiu de substitut ie - conform lui se poate folosi o subclasa în locul unei superclase! variabilele Java sunt polimorfice Din exemplul prezentat vom analiza liniile de cod: Coordonate c1 = new Coordonate(); Coordonate c2 = new Coordonate(1,2); Punct p1 = new Punct(); c1 = p1; //atribuire polimorfica System.out.println(c1); c1 = c2; System.out.println(c1); P(0.0,0.0) //c este un p (1.0,2.0) // c este un c Observat i că c1 şi c2 sunt obiecte declarate din clasa Coordonate, iar p1 este din clasa Punct. În aceste condit ii variabila c1 ajunge să refere două tipuri distincte de obiecte. La utilizarea lui System.out.println(c1) este aplelată automat metoda tostring() a obiectului în cauză (linia este echivalentă cu System.out.println(c1.toString())). Atunci când c1 referă obiectul p1 se va apela metoda tostring() a clasei Punct, iar atunci când c1 referă pe c2 se va apela tostring() a clasei Coordonate. JVM va şti tipul actual al obiectului la care c1 se referă, motiv pentru care va apela corect metoda dorită. Faptul ca variabila obiect c1 poate referi, în timpul rulării aplicat iei, tipuri multiple poartă denumirea de polimorfism. Selectarea automată a metodei de apelat, în timpul rulării aplicat iei, poartă denumirea de legare dinamică (dynamic binding). Procedura de aplicare a legării dinamice este, principial, următoarea: 1. Compilatorul caută pentru obiectul în cauză tipul şi numele metodei. Pot exista mai multe metode cu acelaşi nume într-o clasă şi în superclase. Compilatorul va determina toate metodele candidate la apel din clasă şi superclase; 110

111 2. Compilatorul determină tipul argumentelor din apelul de metodă. Dacă între metodele cu acelaşi nume există una care are parametrii ce se potrivesc cel mai bine cu argumentele apelului atunci metoda în cauză va fi selectată pentru apel. În acest moment compilatorul ştie numele metodei şi tipul parametrilor metodei ce urmează să fie apelată. 3. Dacă metoda este private, static, final sau constructor compilatorul vă şti precis care metodă urmează să fie apelată. Acestă situat ie poartă denumirea de legare statică (static binding). Altfel, determinarea metodei de apelat depinde de tipul actual al argumentelor şi legarea dinamică trebuie să fie utilizată. 4. În timpul rulării aplicat ie JVM trebuie să apeleze metoda pe baza tipului actual de obiect la care variabila obiect se referă. Dacă tipul actual este subclasa Punct atunci se aplelează respectiva metodă, dacă nu este găsită se va trece la superclasă etc. Deoarece această căutarea este mare consumatoare de timp şi ar trebui derulată pentru fiecare apel de metodă, JVM, determină în avans pentru fiecare clasă o tabelă a metodelor (method table) care cont ie lista tuturor semnăturilor de metode împreună cu argumentele cu care acestea sunt apelate. La apelul efectiv al unei metode JVM realizează o căutare numai în această tabelă. Linia de cod c1 = p1; poartă denumirea de atribuire polimorfică. Într-o astfel de atribuire tipul sursei (p1) este diferit de tipul destinat iei (c1). Atribuirea în sensul opus este însă imposibilă, adică nu se va putea scrie p1 = c1; deoarece nu orice coordonată este şi un punct (nu se poate aplica principiul substitut iei). Totuşi, aşă cum în cazul tipurilor simple putem face conversii cu fort are de tip, adică putem face dintr-un double un int prin codul: double x = ; int i = (int) x; şi în cazul obiectelor este posibilă conversia unei referint e la obiect de la o clasă la o alta. O astfel de conversie este însă corectă numai contextul unei ierarhii şi se scrie astfel: p1 = (Punct) c1; Compilatorul verifică dacă valoarea stocată într-o variabilă de un anumit tip nu produce probleme (este de alt tip sau în afara domeniului permis). În cazul obiectelor, atunci când se atribuie referint ei de subclasă o superclasă, trecerea este oarecum echivalentă cu cea de la un domeniu mai îngust la unui mai larg, deoarece superclasa este mai generală decât subclasa. Atribuirea inversă este însă problematică deoare se încercă o trecere de la put in la mai mult. Din acest motiv compilatorul trebuie anunt at explicit că urmează o conversie cu ajutorul operatorului de fort are de tip. 111

112 6 Except ii, tablouri în Java 112

113 Except ii! Surse de erori: date de intrare, probleme cu dispozitive fizice, cod Java neglijent;! Except ia este o condit ie de eroare ce modifica rularea normala a programului: se face o împa rt ire cu zero, se introduc date de intrare greşit etc. JAVA are un mecanism de tratare a acestor situat ii cu instruct iunile try - catch;! În Java eroarea se defineşte ca o situat ie anormala de funct ionare din care nu se mai poate reveni: JVM are o problema interna de funct ionare sau ra mâne fa ra RAM. Există situaţii în care apar probleme în timpul execuţiei instrucţiunilor unui program ca urmare a unor erori. Câteva dintre aceste erori tipice sunt: Introducerea eronată a datelor: de exemplu, se aşteptă introducerea de la tastatură a unui număr întreg iar utilizatorul introduce un şir de caractere - 17w3 - deoarece atinge două taste simultan la introducerea întregului (pe w şi pe 3 ); un alt exemplu ar fi scrierea incorectă a unui URL atunci când aplicaţia cere introducerea acestuia de la tastatură (în loc de se scrie http;// adică pe locul lui : se scrie ; ) situaţia în care pachetul de reţea din Java v-a semnala eroarea fără milă; Erori datorate unor dispozitive hardware: de exemplu, în timpul tipăririi imprimata rămâne fără hârtie, server-ul de web ale cărui pagini le vizualizăm cade sau în timpul scrierii pe disc acesta rămâne fără spaţiu; Erori de programare: de exemplu o secvenţă de instrucţiuni nu îşi face treaba corect, se face o împăţire cu zero, se încearcă referirea unui element de tablou inexistent etc. În limbaje de nivel înalt tradiţionale erorile sunt tratate prin utilizarea unor coduri de eroare ce trebuie testate înainte de a continua execuţia programului. La nivel de pseudocod o astfel de aplicaţie are forma: Tratarea erorilor în limbaje tradiţionale (C, Pascal) cod_de_eroare1=0 grup de instrucţiuni1 dacă (cod_de_eroare1 0) atunci { instrucţiuni pentru tratarea erorii 1 cod_de_eroare2=0 grup de instrucţiuni2 dacă (cod_de_eroare2 0 atunci { instrucţiuni pentru tratarea erorii 2 Tratarea erorilor în Java try { grup de instrucţiuni1 grup de instrucţiuni2 catch(cod de eroare1) { instrucţiuni pentru tratarea erorii 1 catch(cod de eroare2) { instrucţiuni pentru tratarea erorii 2 113

114 Acest mod de programare a problemei erorilor intercalează instrucţiunile de program cu cele de tratare a erorilor. Problemele ce apar din această cauză sunt:! programul nu este lizibil (se citeşte greu), se modifică greu, iar depanarea lui este dificilă;! viteza aplicaţiei scade deoarece după fiecare grup de instrucţiuni care ar putea genera erori intervine testul prin care se decide între continuarea rulării aplicaţiei sau tratare a erorii. În Java termenul de excepţie (exception) arată că, datorită unei probleme, o instrucţiune nu s-a putut executa în condiţii normale de către JVM. JVM detectează automat aceste situaţii oprind şi terminând imediat execuţia programului. Numele de excpţie vine de la faptul că deşi a apărut o problemă situaţia nu este frecventă (adică regula, este execuţia normală, iar eroare este situaţia excepţională). Limbajul Java separă detaliile de tratare a erorilor (instrucţiuni pentru tratarea erorii ) de secvenţa de instrucţiuni care le-ar putea genera (grup de instrucţiuni1) codul devenid în acest lizibil. try (încearcă) însemnă că la nivel de cod se încercă ceva ce ar putea genera o excepţie, iar catch (prinde) însemnă că excepţia respectivă este tratată printr-un grup de instrucţiuni specifice. Fie următoare aplicaţie Java: public class ExMat { public static void main(string[] args) { int a, b, c; for (int i = 0 ; i < 7 ; ++i ) { a = (int) ( Math.random() * 10 ); b = (int) ( Math.random() * 4 ); System.out.print( i + ") " + a + "/" + b ); c = a / b; // linia 8 - aici apare exceptia System.out.println( "=" + c ); Rezultatele afişate de aceasta la o rulare ar putea fi: 0) 7/2=3 1) 6/1=6 2) 9/3=3 3) 7/1=7 4) 5/2=2 Exception in thread "main" java.lang.arithmeticexception: / by zero at ExMat.main(ExMat.java:8) 5) 8/0Process exited with exit code 1. Corpul ciclului for se reia de cel mult 7 ori (i = 0, 1, 2,..., 6), totuşi pentru i = 5 (la cea de a 6-a reluare) aplicaţia crapă la execuţia liniei 8 (c = a / b) cu mesajul de eroare java.lang.arithmeticexception: / by zero. În limbajele tradiţionale, întoarcerea unui cod de eroare nu implică şi obligativitatea testării acestuia. Fie schema următoare: Prinderea erorilor în limbaje tradiţionale (C, Pascal) Prinderea erorilor în Java metoda1 Eroarea se prinde aici metoda1 Ex. se prinde direct Cod de eroare Cod de eroare metoda2 metoda2 Cod de eroare Cod de eroare metoda3 Eroarea apare aici metoda3 Excepţia apare aici 114

115 Aici avem metoda1 care apelează metoda2 şi care apelează metoda3. Într-un limbaj tradiţional, dacă eroarea apare în metoda3 aceasta v-a fi luată în considerare numai după ce se revine din metoda2 în metoda1. Aici apar două probleme:! prima constă în faptul că eroarea nu este tratată atunci când apare ci atunci când există posibilitatea ca aceasta fie tratată deci, eroare şi codul de tratare a acesteia, sunt desincronizate;! a doua problemă constă în volutariatul tratării acesteia, adică tratarea ei este lasată la latitudinea programatorului, aceasta nefiind obligatorie. În Java, prin mecanismul de interceptare a excepţiilor, aceste probleme nu mai apar astfel:! atunci când apare o excepţie, JVM transferă controlul direct proţiunii de cod care tratează excepţia;! dacă o metodă a generat o excepţie (thrown an exception), aceasta nu se poate ignora, ea trebuie prinsă şi tratată undeva, altfel compilatorul semnalează eroarea (except ie fac erorile din timpul execut ie aplicat iei). 115

116 Clasificarea except iilor în Java! Orice except ie este un obiect creat folosind o subclasa a clasei de baza java.lang.throwable;! subclasa Error include erorile din care nu se mai poate reveni - programul se termina ;! subclasa Exception include erorile din care se poate reveni - corectarea situat ie execpt ionale se face în rutina de tratare a erorii (exception handler) În Java, excepţia este un obiect care se instanţiază pe baza unei subclase a clasei java.lang.throwable. Ierarhia de clasă are două subclase mari: Error şi Exception. Subclasa Error corespunde unor situaţii de erori deosebit de grave, mediul rămâne fără memorie sau are o eroare internă. Programatorul nu poate face mare lucru în aceste situaţii, cel mult poate forţa terminarea aplicaţiei într-o manieră elegantă, în locul celei abrupte. Clasa Exception este cea pe care programatorul o utilizează uzual în situaţia în care programul nu se poate rula în condiţii normale. Aceasta are la rândul ei mai multe subclase dintre ele, RuntimeException, este utilizată des. O RuntimeException apare din cauza unei erori de programare, orice altă excepţie apare ca urmare a unor cauze externe care opresc programul din execuţie (de exemplu, datele de intrere nu sunt introduse corect). Excepţiile din subclasa RuntimeException sunt tratate diferit de celelalte de către compilator. Orice alte erori se prind şi se tratează după cum urmează. 116

117 Tratarea erorilor în Java! secvent a de instruct iuni ce pot genera erori se cuprind într-un bloc try;! pentru fiecare except ie se foloseşte un bloc catch pentru tratarea ei; try { //cod care poate genera erori catch(tipexceptie1 ob) { //rutină pentru tratarea excepţiei 1 catch(tipexceptie2 ob) { //rutină pentru tratarea excepţiei 2... finally { //cod de executat înainte de terminarea // blocului try! daca este cazul, orice preluca ri finale se fac în blocul finally Instrucţiunile unei metode care urmeză să fie monitorizate pentru excepţii trebuie cuprinse în blocul format dintre acoladele instrucţiunii try. Instrucţiunea try conţine un grup de instrucţiuni, numite şi bloc, ce urmează să fie executate. Dacă o problemă apare între instrucţiuni atunci se generează o excepţie (generarea are ca efect întreruperea execuţiei codului şi saltul la codul de tratare a excepţiei). Prinderea excepţiei generate se face folosind clauza catch, iar tratarea ei prin codul cuprins între acoladele respectivului catch. Prin tipexceptie se înţelege tipul excepţie care a generat eroarea. O instrucţiune try poate avea orice număr de clauze catch. Programatorul are posibilitatea ca o excepţie de un anumit tip să o prindă şi să o trateze prin rearucarea ei ca şi o nouă excepţie. O altă posibilitate ar fi ca excepţia să nu fie tratată la nivelul metodei în care aceasta a apărut. În această situaţie excepţia este pasată metodei apelante (metoda din care s-a apelat metoda în care a apărut excepţia). În general, dacă o excepţie nu este tratată în metoda apelată aceasta este pasată metodei apelante. Această procedură de propagare a excepţiei se repetă până când se ajunge la metoda main. Dacă nici aici excepţia nu este tratată atunci aplicaţia se termină brusc şi anormal. Excepţiile sunt obiecte generate automat de JVM în situaţii de eroare. catch Clauza catch se declară cu parametru, acesta specificând tipul de execpţie care va fi tratat. Tipul parametrului trebuie să fie obligatoriu Throwable sau o subclasă a lui. Când apare o excepţie toate clauzele catch asociate acestuia sunt parcurse, dacă se găseşte un parametru de catch de acelşi tip cu cel al obiectului excepţie generat în try se vor executa instrucţiunile corespunzătoare acelui bloc 117

118 catch. throw Utilizatorul poate genera manual excepţii prin folosirea instrucţiunii throw (ea se foloseşte pentru regenerarea unei excepţii în exemplu următor). Forma generală a instrucţiunii este throw obiectthrowable. Existe două metode pentru crearea unui obiect Throwable, prin folosirea unui parametru în catch sau prin folosirea operatorului new ( de exemplu, throw new InputMismatchException("*** Prea... 1 numar real. ***");). La atingerea acestei instrucţiuni codul se opreşte din execuţie, orice instrucţiuni următoare ne mai fiind executate, execuţia fiind transferată celui mai apropiat try. Aici se verifică dacă există un catch ce are aceaşi tip cu cel al excepţiei, dacă nu se trece la umătorul try etc. throws Dacă o metodă ar putea genera o excepţie pe care nu o tratează trebuie să specifice acest comportament către metoda apelantă. Pentru aceasta în declaraţia metodei se se foloseşte clauza throws urmată de o listă a tipurilor posibile de excepţii. Procedura este obligatorie pentru toate tipurile de excepţii mai puţin Error şi RuntimeException. Forma generală a declaraţie de metodă ce include clauza throws este: tip nume_metodă(listă_de_parametri) throws listă_de_excepţii { //corp metodă finally La generarea unei excepţii execuţia secvenţială a programului se întrerupe continuându-se cu un grup de salturi. În funcţie de anumite condiţii, este posibil să revenim prematur dintr-o metodă, această situaţie poate genera probleme uneori. Pentru păstratea continuităţii execuţie codului a fost creată instrucţiunea finally. Ea defineşte un bloc de instrucţiuni care se execută întotdeauna, indiferent dacă excepţia a fost sau nu prinsă, după un try - catch. Instrucţiunea este utilizată, tipic, pentru a face curăţenie după try ( închiderea unor fişiere şi eliberarea unor resurse alocate înainte de revenirea din metodele generatoare de excepţii). Este obligatoriu ca o instrucţiune try să aibă asociată o instrucţiune catch sau una finally. Aplicat ia 1 - try, catch, throw, throws Aplicaţia ce urmează este formată din două fişiere Functie.java şi TestExceptii.java. Ea trebuie să evalueze valoarea unei funcţii F(x) definită în metoda F din clasa Functie. 118

119 Această metodă generează excepţie de tipul ArithmeticException. Excepţiile sunt generate deoarece pentru x = -2 expresia x/(x+2) nu se poate calcula, iar pentru x (4.5, 5] radicalul are argumentul negativ. Metoda citeste_real() se foloseşte pentru a citi o valoare numerică reală (sau întreagă) de la tastatură. Reluarea citirii se face de cel mult 3 ori, după care aplicaţia se opreşte deoarece se generează o eroare ca nu este prinsă în aplicaţie. În această situaţie aplicaţie afişează starea stivei pentru a putea determina precis linia şi codul în care a apărut eroarea. Clasa Functie.java: import java.util.*; public class Functie { public double F(double x) throws ArithmeticException{ if (x < 1.) { if (x == -2.) throw new ArithmeticException("Impartire cu 0"); return x/(x+2); else if (x <= 5.) { if (x > 4.5) throw new ArithmeticException("Argument radical negativ."); return Math.sqrt(4.5-x); else return Math.sin(x)/x; public double citeste_real() throws InputMismatchException { Scanner in = null; int contorerr = 0; //contor erori, pt. 3 aplicatia se opreste. double x; while(true) { in = new Scanner(System.in); try { x = in.nextdouble(); break; //daca nu sunt erori se iese din ciclu catch (InputMismatchException e) { ++contorerr; System.out.printf("Eroare(%d) la citire, trebuie sa introduci o valoarea reala.\n", contorerr); if ( contorerr == 3 ) throw new InputMismatchException("*** Prea prost ca sa bage 1 numar real. ***"); return x; Clasa TestExceptii.java: public class TestExceptii { public static void main(string[] args) { 119

120 Functie F1 = new Functie(); double x1, x2; System.out.print("x1="); x1 = F1.citeste_real(); System.out.print("x2="); x2 = F1.citeste_real(); for(double x=x1;x<=x2;++x) { try { System.out.printf("%6.3f %10.7f\n",x, F1.F(x)); catch (ArithmeticException e) { System.out.printf("%6.3f %s\n",x, e); Rezultate posibile: x1=-7 x2= java.lang.arithmeticexception: Impartire cu java.lang.arithmeticexception: Argument radical negativ Process exited with exit code 0. sau: x1=werw Eroare(1) la citire, trebuie sa introduci o valoarea reala. werw Eroare(2) la citire, trebuie sa introduci o valoarea reala. wrwe Eroare(3) la citire, trebuie sa introduci o valoarea reala. Exception in thread "main" java.util.inputmismatchexception: *** Prea prost ca sa bage 1 numar real. *** at Functie.citeste_real(Functie.java:36) at TestExceptii.main(TestExceptii.java:8) Process exited with exit code 1. Se poate observa cum aplicaţia, deşi întâlneşte situaţii excepţionale, nu se termină brusc şi abrupt, ci ca urmare a tratării acestora, ajunge să se termine normal. 120

121 Propagare except iei codului apelant! se foloseşte throws în declarat ia metodei;! nu avem un bloc catch pentru except ie;! este un catch în metoda public double F(double x) throws ArithmeticException {... throw new ArithmeticException("/ cu 0");... apelanta care prinde except ia. public static void main(string[] args) {... for(double x=x1;x<=x2;++x) { try { System.out.printf("%6.3f %10.7f\n",x, F1.F(x)); catch (ArithmeticException e) { System.out.printf("%6.3f %s\n", x, e); În aplicaţia 1 se prezintă modul în care o excepţie apărută la nivelul metodei F este propagată în metoda main, de unde se realizează apelul lui F prin linia F1.F(x). Metoda main poartă denumirea de cod apelant, iar metoda F de cod apelat. Deoarece metoda apelată nu prinde excepţia ci o lasă să se propage declaraţia acesteia conţie pe throws ArithmeticException. În general, dacă am dori ca şi metoda apelantă să realizeze propagarea excepţie mai departe şi declaraţia ei ar trebui să conţină pe throws ArithmeticException. Conceptual, propagarea erorii în codul apelant se face atunci când la nivel local, în codul apelat, nu putem da o interpretare clară a problemei apărute. 121

122 Generarea manuala a unei except ii! except ia se genereaza manual cu throw new obexcept ie() ;! în declarat ia metodei se foloseşte throws. public double F(double x) throws ArithmeticException {... throw new ArithmeticException("/ cu 0");... Generarea manuală a unei excepţii predefinite în ierahia de excepţii Java sau a unei definite de utilizator se face cu instrucţiune throw. Orice excepţie generată în acest fel trebuie pusă şi în clauza throws a metodei. Dacă se vor genera mai multe excepţii dintr-o metodă, toate numele respectivelor excepţii trebuie scrise în listă, separate prin virgulă. Există însă şi excepţii care nu trebuie puse în listă şi anume Error, RuntimeException. Motivul pentru care aceste nu trebuie scrise explicit constă în numărul mare de situaţii (JVM rămâne făra memorie, împărţire cu zero, indice de tablou ilegal etc.) în care ele pot să apară în diferite porţiuni de cod. Aceasta ar implica scrierea lor în fiecare declaraţie de metodă pentru fiecare porţiune de cod. Conform celor spuse în loc de public double F(double x) throws ArithmeticException se poate scrie mai scurt doar public double F(double x) deoarece ArithmeticException este o subclasă a lui RuntimeException. Generarea manuală a unei excepţii permite ca la prinderea unei excepţii să se genereze în locul acesteia o alta. Un cod tipic este: catch (exceptie1 e) { throw new exceptie2(... ); Aici s-a prins excepţia excepţie1, însă în codul de tratare a excepţiei se generează o alta, şi anume excepţie2. 122

123 Crearea unei except ii noi! o except ie noua se creaza prin extinderea clasei Exception. public class ExceptiiAritmetice extends Exception{ private String mesaj; public ExceptiiAritmetice(String m) { super(m); mesaj = m; public String tostring() { return "\nexceptie: " + mesaj; Programatorul poate să-şi creeze propriile excepţii prin extinderea clasei Exception. La crearea unei subclase a lui Exception programatorul are deja o nouă clasă funcţională în care nu trebuie să implementeze nimic. Exception nu defineşte metode noi, însă le moşteneşte de la Throwable. Nu este cazul extinderii clasei RuntimeException deoarece ea este creată pentru a lucra cu erori comune ce nu trebuie tratate explicit mai mult decât sunt deja. Extinderea excepţiilor are rost în situaţia unor particularităţi specifice ale aplicaţiei. Aplicat ia 2 - extindere Exception Aplicaţia care urmează perintă modul în care se extinde clasă Exception la clasa ExceptiiAritmetice. public class ExceptiiAritmetice extends Exception{ private String mesaj; public ExceptiiAritmetice(String m) { super(m); mesaj = m; public String tostring() { return "\nexceptie: " + mesaj; public class TestEx2 { public static int cat(int a, int b) throws ExceptiiAritmetice { if (b == 0) throw new ExceptiiAritmetice("Imparire cu zero!"); return a / b; { public static void main(string[] args) int a, b, c; a=1; b=0; System.out.print(a + "/" + b ); try { c = (int)cat(a,b); System.out.println( "=" + c ); catch (ExceptiiAritmetice e) { System.out.println(e); 123

124 Tablouri (arrays)! tabloul este o colect ie de elemente de acelaşi tip;! un element poate stoca o singura valoare;! elementele se identifica unic printr-un numa r întreg numit indice;! tipul elementelor poate fi simplu sau obiect;! numa rul de elemente de tablou se fixeaza în momentul crea rii acestuia. Tabloul este o colect ie de date, numite şi elemente ale tabloului, identice ca tip - tipul se mai numeşte şi tip de bază - ce pot fi identificate unic prin indice. Numărul de dimensiuni ale tabloului depinde de limbaj, dar în general, nu este limitat. Se zice că un tablou este multidimensuional dacă foloseşt mai mulţi indici pentru accesarea unui element de tablou. Mai sus se prezintă modul de reprezentate a două tablouri, unul de întregi (tipul de bază este int) şi unul de obiecte (tipul de bază este Coordonate). O variabilă de tip primitiv - un scalar - poate fi privită ca un tablou cu dimensiunea zero. Un tablou cu o singură dimensiune este cunoscut sub numele de "vector", iar unul cu două dimensiuni sub denumirea de "matrice". În majoritatea limbajelor imperative, o referinţă la un element de tablou se scrie sub forma a[i,j] unde, a este numele tabloului, iar i şi j sunt indexuri. Elementele tabloului sunt de obicei stocate în locaţii de memorie consecutive. Limbajele diferă de obicei prin metoda de stocare a datelor pe rânduri continue sau pe coloane continue. Tablourile sunt folosite pentru stocarea unui grup de valori care priimesc un singur nume şi care se vor accesa într-o ordine imprevizibilă (de exemplu, o structură de dată numită listă se pretează mult mai bine pentru stocarea unor valori care se accesează secvenţial). 124

125 Etapele lucrului cu tablouri! declararea tabloului: int []a;! crearea unui obiect tablou: a = new int[4];! init ializarea tabloului: int[] a = {1, 7, 23, 1;! indicele [0, nr_elem-1] > altfel apare except ia array index out of bounds! accesul la un element: a[indice] Pentru a putea utiliza un tablou cu tipul de bază dintre cele primitive trebuie să:! declarăm o variabilă de tipul tablou având nume_tablou, ce v-a stoca o referinţă către tablou prin: tip [] nume_tablou; sau tip nume_tablou []; în acest moment nume_tablou se init ializează cu valoarea specială null; această valoare se modifică la adresa tabloului după utilizarea operatorului new;! creăm tabloul folosind operatorul new specificând lungimea acestuia (numărul maxim de elemente pe care îl poate stoca); lungimea trebuie să fie o valoare întreagă de tipul int (constantă sau expresie care se calculează în momentul rulării aplicaţiei)! init ializăm tabloul cu valori diferite de cele cu care acesta se init ializaeză implicit de către Java. Valorile de iniţializare implicită pentru tablouri: char boolean byte, short, int, long float, double \u Unicode 0000 (Java foloseşte codificarea Unicode) false Deşi un tabloul este un obiect, nu există o clasă de tipul tablou. Java creează automat o clasă pentru fiecare tablou de tipuri primitive sau de clase. Pentru a afla numărul de elemente dintr-un tablou folosim notaţia nume_tablou. length. 125

126 Aplicat ia 1 - tablou de tipul int, citire şi afişare Aplicaţia următoare exemplifică modul de citire şi de afişare a elemtelor unui taboul. Tabloul are numele a şi numărul maxim de elemente fixat la 5. Valorile sunt citite de la tastatură iar afişarea se face prin două metode. import java.util.scanner; import javax.swing.*; public class TablouPrimitive { public static void main(string[] args) { final int NRELEM = 5; //lungimea tabloului int [] a; //declararea tabloului Scanner intrare; String iesire = "Indice\tValoarea element\n"; intrare = new Scanner(System.in); a = new int[nrelem]; //crearea tabloului; //citire elemente tablou for(int i = 0; i < a.length;++i) { System.out.print("a[" + i +"] = "); a[i]= intrare.nextint(); //pt. cea de a 2-a metoda de afisare iesire+= i +"\t"+ a[i] + "\n"; //metoda 1: afisare simpla de elemente tablou for(int i = 0; i < a.length;++i) System.out.println(a[i]); //metoda 2: afisare cu fereastra de dialog JTextArea fereastraiesire = new JTextArea(); fereastraiesire.settext(iesire); JOptionPane.showMessageDialog(null,fereastraiesire,"indice - valoare tablou", JOptionPane.INFORMATION_MESSAGE); Rezultate: a[0] = 12 a[1] = 45 a[2] = 33 a[3] = 21 a[4] =

127 Etapele lucrului cu tablouri de obiecte! declararea tabloului: PunctOK puncte[]; //sau PunctOK[] puncte;! crearea unui obiect tablou: puncte = new PunctOK[3];! init ializarea obiectelor din tablou: puncte[i] = new PunctOK(i,2*i); În situaţia lucrului cu tablouri de obiecte, etapele sunt indentice cu cele descrise la tablourile de primitive, cu excecţia că aici iniţializarea elementelor de tablou este obligatorie şi nu opţională. Aplicat ia 2 - tablou de obiecte, init ializare şi afişare Aplicaţia are la bază clasa PuncteOK. Se creează un tablou de obiecte PuncteOK cu numele puncte. Iniţializarea obiectelor din tablou se face în ciclul for cu linia puncte[i] = new PunctOK(i,2*i);. Rezultatele afişate se obţin prin iniţializarea fiecărui obiect PuncteOK cu x = i şi y =2*i. public class TablouObiecte { public static void main(string[] args) { //declarare tablou PunctOK puncte[]; 127

128 //creare tablou de obiecte puncte = new PunctOK[3]; for(int i = 0; i < puncte.length;++i) { //initializarea obiectelor din tablou puncte[i] = new PunctOK(i,2*i); //afisarea elementelor de tablou for(int i = 0; i < puncte.length;++i) System.out.println(puncte[i]); Rezultate: <0.0,0.0> <1.0,2.0> <2.0,4.0> Aplicat ia 3 - sortarea cresca toare a elementelor unui tablou // Sortarea crescatoare a unui tablou de intregi import javax.swing.*; public class sorttab { int a []; //tabloul int asort[]; //clona int n; //numarul de elemete de tablou sorttab(int n) { this.n = n; //tabloul initial a = new int[n]; //tabloul sortat asort = new int [n]; //generam aleator n numere de la 0 la 100 //de tipul int si le stocam in a for(int i=0; i<n ; ++i) a[i] = (int)(100*math.random()); //copiem tabloul a in asort try { System.arraycopy(a,0,asort,0,n); catch(arraystoreexception e) { System.out.println(e); //sortarea public void bubblesort( ) { boolean esteinterschimbare = true; while (esteinterschimbare) { esteinterschimbare = false; 128

129 for ( int i = 0; i < asort.length-1; ++i ) { if ( asort[i] > asort[i+1] ) { swap(asort,i,i+1); esteinterschimbare = true; //interschimbarea a 2 elemente de tablou private void swap( int tablou[], int i, int j ) { int aux; aux = tablou[i]; tablou[i] = tablou[j]; tablou[j] = aux; //afisare tablou initial public String afisare(string txt) { String rez; rez = txt; for (int i=0; i<a.length; ++i ) rez += " " + a[ i ]; return rez; //afisarea tablou sortat public String afisaresort(string txt) { String rez; rez = txt; for (int i=0; i<asort.length; ++i ) rez += " " + asort[ i ]; return rez; public static void main(string args[]) { sorttab st; String rez; st = new sorttab(17); rez = st.afisare("a - Tablou initial:\n"); st.bubblesort(); // sortare tablou rez += st.afisaresort("\n\nasort - Tabloul cu elementele sortate:\n"); JTextArea ferrez = new JTextArea(); ferrez.settext( rez ); JOptionPane. showmessagedialog(null, rez, "Sortare crescatoare",joptionpane.information_message); 129

Metode iterative pentru probleme neliniare - contractii

Metode iterative pentru probleme neliniare - contractii Metode iterative pentru probleme neliniare - contractii Problemele neliniare sunt in general rezolvate prin metode iterative si analiza convergentei acestor metode este o problema importanta. 1 Contractii

Διαβάστε περισσότερα

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a. Definiţie Spunem că: i) funcţia f are derivată parţială în punctul a în raport cu variabila i dacă funcţia de o variabilă ( ) are derivată în punctul a în sens obişnuit (ca funcţie reală de o variabilă

Διαβάστε περισσότερα

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate. Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi" Iaşi 2014 Fie p, q N. Fie funcţia f : D R p R q. Avem următoarele

Διαβάστε περισσότερα

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE. 5 Eerciţii reolvate 5 UNCŢII IMPLICITE EXTREME CONDIŢIONATE Eerciţiul 5 Să se determine şi dacă () este o funcţie definită implicit de ecuaţia ( + ) ( + ) + Soluţie ie ( ) ( + ) ( + ) + ( )R Evident este

Διαβάστε περισσότερα

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică Gh. Asachi Curs 14 Funcţii implicite Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi" Iaşi 2014 Fie F : D R 2 R o funcţie de două variabile şi fie ecuaţia F (x, y) = 0. (1) Problemă În ce condiţii ecuaţia

Διαβάστε περισσότερα

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM Seminar S ANALA ÎN CUENT CONTNUU A SCHEMELO ELECTONCE S. ntroducere Pentru a analiza în curent continuu o schemă electronică,

Διαβάστε περισσότερα

MARCAREA REZISTOARELOR

MARCAREA REZISTOARELOR 1.2. MARCAREA REZISTOARELOR 1.2.1 MARCARE DIRECTĂ PRIN COD ALFANUMERIC. Acest cod este format din una sau mai multe cifre şi o literă. Litera poate fi plasată după grupul de cifre (situaţie în care valoarea

Διαβάστε περισσότερα

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare 1 Planul în spaţiu Ecuaţia generală Plane paralele Unghi diedru 2 Ecuaţia generală Plane paralele Unghi diedru Fie reperul R(O, i, j, k ) în spaţiu. Numim normala a unui plan, un vector perpendicular pe

Διαβάστε περισσότερα

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea Serii Laurent Definitie. Se numeste serie Laurent o serie de forma Seria n= (z z 0 ) n regulata (tayloriana) = (z z n= 0 ) + n se numeste partea principala iar seria se numeste partea Sa presupunem ca,

Διαβάστε περισσότερα

riptografie şi Securitate

riptografie şi Securitate riptografie şi Securitate - Prelegerea 12 - Scheme de criptare CCA sigure Adela Georgescu, Ruxandra F. Olimid Facultatea de Matematică şi Informatică Universitatea din Bucureşti Cuprins 1. Schemă de criptare

Διαβάστε περισσότερα

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile Metode de Optimizare Curs V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile Propoziţie 7. (Fritz-John). Fie X o submulţime deschisă a lui R n, f:x R o funcţie de clasă C şi ϕ = (ϕ,ϕ

Διαβάστε περισσότερα

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Aplicaţii ale principiului I al termodinamicii la gazul ideal Aplicaţii ale principiului I al termodinamicii la gazul ideal Principiul I al termodinamicii exprimă legea conservării şi energiei dintr-o formă în alta şi se exprimă prin relaţia: ΔUQ-L, unde: ΔU-variaţia

Διαβάστε περισσότερα

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE ABSTRACT. Materialul prezintă o modalitate de a afla distanţa dintre două drepte necoplanare folosind volumul tetraedrului. Lecţia se adresează clasei a VIII-a Data:

Διαβάστε περισσότερα

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă. III. Serii absolut convergente. Serii semiconvergente. Definiţie. O serie a n se numeşte: i) absolut convergentă dacă seria modulelor a n este convergentă; ii) semiconvergentă dacă este convergentă iar

Διαβάστε περισσότερα

Curs 4 Serii de numere reale

Curs 4 Serii de numere reale Curs 4 Serii de numere reale Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi" Iaşi 2014 Criteriul rădăcinii sau Criteriul lui Cauchy Teoremă (Criteriul rădăcinii) Fie x n o serie cu termeni

Διαβάστε περισσότερα

5.4. MULTIPLEXOARE A 0 A 1 A 2

5.4. MULTIPLEXOARE A 0 A 1 A 2 5.4. MULTIPLEXOARE Multiplexoarele (MUX) sunt circuite logice combinaţionale cu m intrări şi o singură ieşire, care permit transferul datelor de la una din intrări spre ieşirea unică. Selecţia intrării

Διαβάστε περισσότερα

Metode de interpolare bazate pe diferenţe divizate

Metode de interpolare bazate pe diferenţe divizate Metode de interpolare bazate pe diferenţe divizate Radu Trîmbiţaş 4 octombrie 2005 1 Forma Newton a polinomului de interpolare Lagrange Algoritmul nostru se bazează pe forma Newton a polinomului de interpolare

Διαβάστε περισσότερα

Curs 1 Şiruri de numere reale

Curs 1 Şiruri de numere reale Bibliografie G. Chiorescu, Analiză matematică. Teorie şi probleme. Calcul diferenţial, Editura PIM, Iaşi, 2006. R. Luca-Tudorache, Analiză matematică, Editura Tehnopress, Iaşi, 2005. M. Nicolescu, N. Roşculeţ,

Διαβάστε περισσότερα

III. Reprezentarea informaţiei în sistemele de calcul

III. Reprezentarea informaţiei în sistemele de calcul Metode Numerice Curs 3 III. Reprezentarea informaţiei în sistemele de calcul III.1. Reprezentarea internă a numerelor întregi III. 1.1. Reprezentarea internă a numerelor întregi fără semn (pozitive) Reprezentarea

Διαβάστε περισσότερα

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1 Functii definitie proprietati grafic functii elementare A. Definitii proprietatile functiilor. Fiind date doua multimi X si Y spunem ca am definit o functie (aplicatie) pe X cu valori in Y daca fiecarui

Διαβάστε περισσότερα

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor. Fiind date doua multimi si spunem ca am definit o functie (aplicatie) pe cu valori in daca fiecarui element

Διαβάστε περισσότερα

4. CIRCUITE LOGICE ELEMENTRE 4.. CIRCUITE LOGICE CU COMPONENTE DISCRETE 4.. PORŢI LOGICE ELEMENTRE CU COMPONENTE PSIVE Componente electronice pasive sunt componente care nu au capacitatea de a amplifica

Διαβάστε περισσότερα

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE 5.5. A CIRCUITELOR CU TRANZISTOARE BIPOLARE PROBLEMA 1. În circuitul din figura 5.54 se cunosc valorile: μa a. Valoarea intensității curentului de colector I C. b. Valoarea tensiunii bază-emitor U BE.

Διαβάστε περισσότερα

Sisteme diferenţiale liniare de ordinul 1

Sisteme diferenţiale liniare de ordinul 1 1 Metoda eliminării 2 Cazul valorilor proprii reale Cazul valorilor proprii nereale 3 Catedra de Matematică 2011 Forma generală a unui sistem liniar Considerăm sistemul y 1 (x) = a 11y 1 (x) + a 12 y 2

Διαβάστε περισσότερα

Criptosisteme cu cheie publică III

Criptosisteme cu cheie publică III Criptosisteme cu cheie publică III Anul II Aprilie 2017 Problema rucsacului ( knapsack problem ) Considerăm un număr natural V > 0 şi o mulţime finită de numere naturale pozitive {v 0, v 1,..., v k 1 }.

Διαβάστε περισσότερα

Laborator 11. Mulţimi Julia. Temă

Laborator 11. Mulţimi Julia. Temă Laborator 11 Mulţimi Julia. Temă 1. Clasa JuliaGreen. Să considerăm clasa JuliaGreen dată de exemplu la curs pentru metoda locului final şi să schimbăm numărul de iteraţii nriter = 100 în nriter = 101.

Διαβάστε περισσότερα

Esalonul Redus pe Linii (ERL). Subspatii.

Esalonul Redus pe Linii (ERL). Subspatii. Seminarul 1 Esalonul Redus pe Linii (ERL). Subspatii. 1.1 Breviar teoretic 1.1.1 Esalonul Redus pe Linii (ERL) Definitia 1. O matrice A L R mxn este in forma de Esalon Redus pe Linii (ERL), daca indeplineste

Διαβάστε περισσότερα

Integrala nedefinită (primitive)

Integrala nedefinită (primitive) nedefinita nedefinită (primitive) nedefinita 2 nedefinita februarie 20 nedefinita.tabelul primitivelor Definiţia Fie f : J R, J R un interval. Funcţia F : J R se numeşte primitivă sau antiderivată a funcţiei

Διαβάστε περισσότερα

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0 Facultatea de Hidrotehnică, Geodezie şi Ingineria Mediului Matematici Superioare, Semestrul I, Lector dr. Lucian MATICIUC SEMINAR 4 Funcţii de mai multe variabile continuare). Să se arate că funcţia z,

Διαβάστε περισσότερα

Problema a II - a (10 puncte) Diferite circuite electrice

Problema a II - a (10 puncte) Diferite circuite electrice Olimpiada de Fizică - Etapa pe judeţ 15 ianuarie 211 XI Problema a II - a (1 puncte) Diferite circuite electrice A. Un elev utilizează o sursă de tensiune (1), o cutie cu rezistenţe (2), un întrerupător

Διαβάστε περισσότερα

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor Facultatea de Matematică Calcul Integral şi Elemente de Analiă Complexă, Semestrul I Lector dr. Lucian MATICIUC Seminariile 9 20 Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reiduurilor.

Διαβάστε περισσότερα

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale. 5p Determinați primul termen al progresiei geometrice ( b n ) n, știind că b 5 = 48 și b 8 = 84 5p Se consideră funcția f : intersecție a graficului funcției f cu aa O R R, f ( ) = 7+ 6 Determinați distanța

Διαβάστε περισσότερα

Seminar 5 Analiza stabilității sistemelor liniare

Seminar 5 Analiza stabilității sistemelor liniare Seminar 5 Analiza stabilității sistemelor liniare Noțiuni teoretice Criteriul Hurwitz de analiză a stabilității sistemelor liniare În cazul sistemelor liniare, stabilitatea este o condiție de localizare

Διαβάστε περισσότερα

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0 SERII NUMERICE Definiţia 3.1. Fie ( ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0 şirul definit prin: s n0 = 0, s n0 +1 = 0 + 0 +1, s n0 +2 = 0 + 0 +1 + 0 +2,.......................................

Διαβάστε περισσότερα

10. STABILIZATOAE DE TENSIUNE 10.1 STABILIZATOAE DE TENSIUNE CU TANZISTOAE BIPOLAE Stabilizatorul de tensiune cu tranzistor compară în permanenţă valoare tensiunii de ieşire (stabilizate) cu tensiunea

Διαβάστε περισσότερα

a. 11 % b. 12 % c. 13 % d. 14 %

a. 11 % b. 12 % c. 13 % d. 14 % 1. Un motor termic funcţionează după ciclul termodinamic reprezentat în sistemul de coordonate V-T în figura alăturată. Motorul termic utilizează ca substanţă de lucru un mol de gaz ideal având exponentul

Διαβάστε περισσότερα

Subiecte Clasa a VIII-a

Subiecte Clasa a VIII-a Subiecte lasa a VIII-a (40 de intrebari) Puteti folosi spatiile goale ca ciorna. Nu este de ajuns sa alegeti raspunsul corect pe brosura de subiecte, ele trebuie completate pe foaia de raspuns in dreptul

Διαβάστε περισσότερα

Asupra unei inegalităţi date la barajul OBMJ 2006

Asupra unei inegalităţi date la barajul OBMJ 2006 Asupra unei inegalităţi date la barajul OBMJ 006 Mircea Lascu şi Cezar Lupu La cel de-al cincilea baraj de Juniori din data de 0 mai 006 a fost dată următoarea inegalitate: Fie x, y, z trei numere reale

Διαβάστε περισσότερα

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent Laborator 3 Divizorul de tensiune. Divizorul de curent Obiective: o Conexiuni serie şi paralel, o Legea lui Ohm, o Divizorul de tensiune, o Divizorul de curent, o Implementarea experimentală a divizorului

Διαβάστε περισσότερα

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3 SEMINAR 2 SISTEME DE FRŢE CNCURENTE CUPRINS 2. Sisteme de forţe concurente...1 Cuprins...1 Introducere...1 2.1. Aspecte teoretice...2 2.2. Aplicaţii rezolvate...3 2. Sisteme de forţe concurente În acest

Διαβάστε περισσότερα

Valori limită privind SO2, NOx şi emisiile de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili

Valori limită privind SO2, NOx şi emisiile de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili Anexa 2.6.2-1 SO2, NOx şi de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili de bioxid de sulf combustibil solid (mg/nm 3 ), conţinut de O 2 de 6% în gazele de ardere, pentru

Διαβάστε περισσότερα

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R În cele ce urmează, vom studia unele proprietăţi ale mulţimilor din R. Astfel, vom caracteriza locul" unui punct în cadrul unei mulţimi (în limba

Διαβάστε περισσότερα

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005. SUBIECTUL Editia a VI-a 6 februarie 005 CLASA a V-a Fie A = x N 005 x 007 si B = y N y 003 005 3 3 a) Specificati cel mai mic element al multimii A si cel mai mare element al multimii B. b)stabiliti care

Διαβάστε περισσότερα

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice 4. Măsurarea tensiunilor şi a curenţilor electrici oltmetre electronice analogice oltmetre de curent continuu Ampl.c.c. x FTJ Protectie Atenuator calibrat Atenuatorul calibrat divizor rezistiv R in const.

Διαβάστε περισσότερα

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:, REZISTENTA MATERIALELOR 1. Ce este modulul de rezistenţă? Exemplificaţi pentru o secţiune dreptunghiulară, respectiv dublu T. RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii

Διαβάστε περισσότερα

Laborator 4 suport teoretic Tipuri de date utilizate în limbajul de programare C.

Laborator 4 suport teoretic Tipuri de date utilizate în limbajul de programare C. Laborator 4 suport teoretic Tipuri de date utilizate în limbajul de programare C. Toate valorile parametrilor unei probleme, adică datele cu care operează un program, sunt reprezentate în MO sub formă

Διαβάστε περισσότερα

Subiecte Clasa a VII-a

Subiecte Clasa a VII-a lasa a VII Lumina Math Intrebari Subiecte lasa a VII-a (40 de intrebari) Puteti folosi spatiile goale ca ciorna. Nu este de ajuns sa alegeti raspunsul corect pe brosura de subiecte, ele trebuie completate

Διαβάστε περισσότερα

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER 2. Circuite logice 2.4. Decodoare. Multiplexoare Copyright Paul GASNER Definiţii Un decodor pe n bits are n intrări şi 2 n ieşiri; cele n intrări reprezintă un număr binar care determină în mod unic care

Διαβάστε περισσότερα

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane Subspatii ane Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane Oana Constantinescu Oana Constantinescu Lectia VI Subspatii ane Table of Contents 1 Structura de spatiu an E 3 2 Subspatii

Διαβάστε περισσότερα

prin egalizarea histogramei

prin egalizarea histogramei Lucrarea 4 Îmbunătăţirea imaginilor prin egalizarea histogramei BREVIAR TEORETIC Tehnicile de îmbunătăţire a imaginilor bazate pe calculul histogramei modifică histograma astfel încât aceasta să aibă o

Διαβάστε περισσότερα

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2 .1 Sfera Definitia 1.1 Se numeşte sferă mulţimea tuturor punctelor din spaţiu pentru care distanţa la u punct fi numit centrul sferei este egalăcuunnumăr numit raza sferei. Fie centrul sferei C (a, b,

Διαβάστε περισσότερα

CIRCUITE LOGICE CU TB

CIRCUITE LOGICE CU TB CIRCUITE LOGICE CU T I. OIECTIVE a) Determinarea experimentală a unor funcţii logice pentru circuite din familiile RTL, DTL. b) Determinarea dependenţei caracteristicilor statice de transfer în tensiune

Διαβάστε περισσότερα

Codificatorul SN74148 este un codificator zecimal-bcd de trei biţi (fig ). Figura Codificatorul integrat SN74148

Codificatorul SN74148 este un codificator zecimal-bcd de trei biţi (fig ). Figura Codificatorul integrat SN74148 5.2. CODIFICATOAE Codificatoarele (CD) sunt circuite logice combinaţionale cu n intrări şi m ieşiri care furnizează la ieşire un cod de m biţi atunci când numai una din cele n intrări este activă. De regulă

Διαβάστε περισσότερα

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui - Introducere Αξιότιμε κύριε Πρόεδρε, Αξιότιμε κύριε Πρόεδρε, Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui Αγαπητέ κύριε, Αγαπητέ κύριε, Formal, destinatar de sex

Διαβάστε περισσότερα

Αντικειµενοστρεφής Προγραµµατισµός

Αντικειµενοστρεφής Προγραµµατισµός 16 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη

Διαβάστε περισσότερα

Declaraţii de variabile, tipuri, funcţii

Declaraţii de variabile, tipuri, funcţii Declaraţii de variabile, tipuri, funcţii 2 noiembrie 2004 Declaraţii de variabile, tipuri, funcţii 2 Puţinǎ teorie sintaxa: regulile gramaticale care descriu un limbaj un şir de simboluri (text) face parte

Διαβάστε περισσότερα

Instalare hardware. Configurare Software 1. Configurarea exemplul unui sistem de operare calculator Microsoft Windows 7.

Instalare hardware. Configurare Software 1. Configurarea exemplul unui sistem de operare calculator Microsoft Windows 7. Manual de utilizare ROUTER 4 în 1 - ΩMEGA O31 - Router Wireless N 150M. Vă mulțumim pentru achiziționarea routerului ΩMEGA Wireless. Am făcut toate eforturile pentru a se asigura că dispozitivul îndeplinește

Διαβάστε περισσότερα

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB 1.7. AMLFCATOARE DE UTERE ÎN CLASA A Ş AB 1.7.1 Amplificatoare în clasa A La amplificatoarele din clasa A, forma de undă a tensiunii de ieşire este aceeaşi ca a tensiunii de intrare, deci întreg semnalul

Διαβάστε περισσότερα

Curs 4. RPA (2017) Curs 4 1 / 45

Curs 4. RPA (2017) Curs 4 1 / 45 Reţele Petri şi Aplicaţii Curs 4 RPA (2017) Curs 4 1 / 45 Cuprins 1 Analiza structurală a reţelelor Petri Sifoane Capcane Proprietăţi 2 Modelarea fluxurilor de lucru: reţele workflow Reţele workflow 3

Διαβάστε περισσότερα

Geometrie computationala 2. Preliminarii geometrice

Geometrie computationala 2. Preliminarii geometrice Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic Geometrie computationala 2. Preliminarii geometrice Preliminarii geometrice Spatiu Euclidean: E d Spatiu de d-tupluri,

Διαβάστε περισσότερα

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni Problema 1. Se dă circuitul de mai jos pentru care se cunosc: VCC10[V], 470[kΩ], RC2,7[kΩ]. Tranzistorul bipolar cu joncţiuni (TBJ) este de tipul BC170 şi are parametrii β100 şi VBE0,6[V]. 1. să se determine

Διαβάστε περισσότερα

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca Conice Lect. dr. Constantin-Cosmin Todea U.T. Cluj-Napoca Definiţie: Se numeşte curbă algebrică plană mulţimea punctelor din plan de ecuaţie implicită de forma (C) : F (x, y) = 0 în care funcţia F este

Διαβάστε περισσότερα

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice 1 Conice pe ecuaţii reduse 2 Conice pe ecuaţii reduse Definiţie Numim conica locul geometric al punctelor din plan pentru care raportul distantelor la un punct fix F şi la o dreaptă fixă (D) este o constantă

Διαβάστε περισσότερα

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu INTRODUCERE Laborator 1: ÎN ALGORITMI Întocmit de: Claudia Pârloagă Îndrumător: Asist. Drd. Gabriel Danciu I. NOŢIUNI TEORETICE A. Sortarea prin selecţie Date de intrare: un şir A, de date Date de ieşire:

Διαβάστε περισσότερα

13. Grinzi cu zăbrele Metoda izolării nodurilor...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...

13. Grinzi cu zăbrele Metoda izolării nodurilor...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate... SEMINAR GRINZI CU ZĂBRELE METODA IZOLĂRII NODURILOR CUPRINS. Grinzi cu zăbrele Metoda izolării nodurilor... Cuprins... Introducere..... Aspecte teoretice..... Aplicaţii rezolvate.... Grinzi cu zăbrele

Διαβάστε περισσότερα

VII.2. PROBLEME REZOLVATE

VII.2. PROBLEME REZOLVATE Teoria Circuitelor Electrice Aplicaţii V PROBEME REOVATE R7 În circuitul din fiura 7R se cunosc: R e t 0 sint [V] C C t 0 sint [A] Se cer: a rezolvarea circuitului cu metoda teoremelor Kirchhoff; rezolvarea

Διαβάστε περισσότερα

Curs 2 Şiruri de numere reale

Curs 2 Şiruri de numere reale Curs 2 Şiruri de numere reale Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi" Iaşi 2014 Convergenţă şi mărginire Teoremă Orice şir convergent este mărginit. Demonstraţie Fie (x n ) n 0 un

Διαβάστε περισσότερα

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite Capitolul 4 Integrale improprii 7-8 În cadrul studiului integrabilităţii iemann a unei funcţii s-au evidenţiat douăcondiţii esenţiale:. funcţia :[ ] este definită peintervalînchis şi mărginit (interval

Διαβάστε περισσότερα

SEMINARUL 3. Cap. II Serii de numere reale. asociat seriei. (3n 5)(3n 2) + 1. (3n 2)(3n+1) (3n 2) (3n + 1) = a

SEMINARUL 3. Cap. II Serii de numere reale. asociat seriei. (3n 5)(3n 2) + 1. (3n 2)(3n+1) (3n 2) (3n + 1) = a Capitolul II: Serii de umere reale. Lect. dr. Lucia Maticiuc Facultatea de Hidrotehică, Geodezie şi Igieria Mediului Matematici Superioare, Semestrul I, Lector dr. Lucia MATICIUC SEMINARUL 3. Cap. II Serii

Διαβάστε περισσότερα

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument:

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument: Erori i incertitudini de măurare Sure: Modele matematice Intrument: proiectare, fabricaţie, Interacţiune măurandintrument: (tranfer informaţie tranfer energie) Influente externe: temperatura, preiune,

Διαβάστε περισσότερα

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3) BARAJ DE JUNIORI,,Euclid Cipru, 8 mi 0 (brjul ) Problem Arătţi că dcă, b, c sunt numere rele cre verifică + b + c =, tunci re loc ineglitte xy + yz + zx Problem Fie şi b numere nturle nenule Dcă numărul

Διαβάστε περισσότερα

3. Momentul forţei în raport cu un punct...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...4

3. Momentul forţei în raport cu un punct...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...4 SEMINAR 3 MMENTUL FRŢEI ÎN RAPRT CU UN PUNCT CUPRINS 3. Momentul forţei în raport cu un punct...1 Cuprins...1 Introducere...1 3.1. Aspecte teoretice...2 3.2. Aplicaţii rezolvate...4 3. Momentul forţei

Διαβάστε περισσότερα

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36]. Componente şi circuite pasive Fig.3.85. Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36]. Fig.3.86. Rezistenţa serie echivalentă pierderilor în funcţie

Διαβάστε περισσότερα

V O. = v I v stabilizator

V O. = v I v stabilizator Stabilizatoare de tensiune continuă Un stabilizator de tensiune este un circuit electronic care păstrează (aproape) constantă tensiunea de ieșire la variaţia între anumite limite a tensiunii de intrare,

Διαβάστε περισσότερα

CARACTERISTICILE LIMBAJULUI DE PROGRAMARE

CARACTERISTICILE LIMBAJULUI DE PROGRAMARE CARACTERISTICILE LIMBAJULUI DE PROGRAMARE Pentru a putea executa cu ajutorul calculatorului algoritmii descrişi în pseudocod, aceştia trebuie implementaţi într-un limbaj de programare, adică trebuie să-i

Διαβάστε περισσότερα

riptografie şi Securitate

riptografie şi Securitate riptografie şi Securitate - Prelegerea 21.2 - Sistemul de criptare ElGamal Adela Georgescu, Ruxandra F. Olimid Facultatea de Matematică şi Informatică Universitatea din Bucureşti Cuprins 1. Scurt istoric

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Εργαστήριο 2 Βασικοί Τύποι Μεταβλητών Java

Διαβάστε περισσότερα

Examen AG. Student:... Grupa:... ianuarie 2011

Examen AG. Student:... Grupa:... ianuarie 2011 Problema 1. Pentru ce valori ale lui n,m N (n,m 1) graful K n,m este eulerian? Problema 2. Să se construiască o funcţie care să recunoască un graf P 3 -free. La intrare aceasta va primi un graf G = ({1,...,n},E)

Διαβάστε περισσότερα

Εμπορική αλληλογραφία Ηλεκτρονική Αλληλογραφία

Εμπορική αλληλογραφία Ηλεκτρονική Αλληλογραφία - Εισαγωγή Stimate Domnule Preşedinte, Stimate Domnule Preşedinte, Εξαιρετικά επίσημη επιστολή, ο παραλήπτης έχει ένα ειδικό τίτλο ο οποίος πρέπει να χρησιμοποιηθεί αντί του ονόματος του Stimate Domnule,

Διαβάστε περισσότερα

Limbaje de Programare Curs 3 Iteraţia. Reprezentare internă. Operatori pe biţi

Limbaje de Programare Curs 3 Iteraţia. Reprezentare internă. Operatori pe biţi Limbaje de Programare Curs 3 Iteraţia. Reprezentare internă. Operatori pe biţi Dr. Casandra Holotescu Universitatea Politehnica Timişoara Ce discutăm azi... 1 Iteraţia 2 Reprezentare internă 3 Operaţii

Διαβάστε περισσότερα

Aparate de măsurat. Măsurări electronice Rezumatul cursului 2. MEE - prof. dr. ing. Ioan D. Oltean 1

Aparate de măsurat. Măsurări electronice Rezumatul cursului 2. MEE - prof. dr. ing. Ioan D. Oltean 1 Aparate de măsurat Măsurări electronice Rezumatul cursului 2 MEE - prof. dr. ing. Ioan D. Oltean 1 1. Aparate cu instrument magnetoelectric 2. Ampermetre şi voltmetre 3. Ohmetre cu instrument magnetoelectric

Διαβάστε περισσότερα

14. Grinzi cu zăbrele Metoda secţiunilor...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

14. Grinzi cu zăbrele Metoda secţiunilor...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3 SEMINAR GRINZI CU ZĂBRELE METODA SECŢIUNILOR CUPRINS. Grinzi cu zăbrele Metoda secţiunilor... Cuprins... Introducere..... Aspecte teoretice..... Aplicaţii rezolvate.... Grinzi cu zăbrele Metoda secţiunilor

Διαβάστε περισσότερα

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)). Teoremă. (Y = f(x)). Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism Demonstraţie. f este continuă pe X: x 0 X, S Y (f(x 0 ), ε), S X (x 0, ε) aşa ca f(s X (x 0, ε)) = S Y (f(x 0 ), ε) : y

Διαβάστε περισσότερα

8 Intervale de încredere

8 Intervale de încredere 8 Intervale de încredere În cursul anterior am determinat diverse estimări ˆ ale parametrului necunoscut al densităţii unei populaţii, folosind o selecţie 1 a acestei populaţii. În practică, valoarea calculată

Διαβάστε περισσότερα

1.3 Baza a unui spaţiu vectorial. Dimensiune

1.3 Baza a unui spaţiu vectorial. Dimensiune .3 Baza a unui spaţiu vectorial. Dimensiune Definiţia.3. Se numeşte bază a spaţiului vectorial V o familie de vectori B care îndeplineşte condiţiile de mai jos: a) B este liniar independentă; b) B este

Διαβάστε περισσότερα

Fișiere de tip Script, Function și CallBack - uicontrol.

Fișiere de tip Script, Function și CallBack - uicontrol. Fișiere de tip Script, Function și CallBack - uicontrol. Obiectivele lucrării de laborator: - Prezentarea și descrierea fișierelor Script și Function - Prezentarea și implementarea parametrului Callback

Διαβάστε περισσότερα

CURS 11: ALGEBRĂ Spaţii liniare euclidiene. Produs scalar real. Spaţiu euclidian. Produs scalar complex. Spaţiu unitar. Noţiunea de normă.

CURS 11: ALGEBRĂ Spaţii liniare euclidiene. Produs scalar real. Spaţiu euclidian. Produs scalar complex. Spaţiu unitar. Noţiunea de normă. Sala: 2103 Decembrie 2014 Conf. univ. dr.: Dragoş-Pătru Covei CURS 11: ALGEBRĂ Specializarea: C.E., I.E., S.P.E. Nota: Acest curs nu a fost supus unui proces riguros de recenzare pentru a fi oficial publicat.

Διαβάστε περισσότερα

Curs 2 DIODE. CIRCUITE DR

Curs 2 DIODE. CIRCUITE DR Curs 2 OE. CRCUTE R E CUPRN tructură. imbol Relația curent-tensiune Regimuri de funcționare Punct static de funcționare Parametrii diodei Modelul cu cădere de tensiune constantă Analiza circuitelor cu

Διαβάστε περισσότερα

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy Metode Runge-Kutta Radu T. Trîmbiţaş 8 ianuarie 7 Probleme scalare, pas constant Dorim să aproximăm soluţia problemei Cauchy y (t) = f(t, y), a t b, y(a) = α. pe o grilă uniformă de (N + )-puncte din [a,

Διαβάστε περισσότερα

2. Circuite logice 2.2. Diagrame Karnaugh. Copyright Paul GASNER 1

2. Circuite logice 2.2. Diagrame Karnaugh. Copyright Paul GASNER 1 2. Circuite logice 2.2. Diagrame Karnaugh Copyright Paul GASNER Diagrame Karnaugh Tehnică de simplificare a unei expresii în sumă minimă de produse (minimal sum of products MSP): Există un număr minim

Διαβάστε περισσότερα

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice Teme de implementare in Matlab pentru Laboratorul de Metode Numerice As. Ruxandra Barbulescu Septembrie 2017 Orice nelamurire asupra enunturilor/implementarilor se rezolva in cadrul laboratorului de MN,

Διαβάστε περισσότερα

Subiecte Clasa a V-a

Subiecte Clasa a V-a (40 de intrebari) Puteti folosi spatiile goale ca ciorna. Nu este de ajuns sa alegeti raspunsul corect pe brosura de subiecte, ele trebuie completate pe foaia de raspuns in dreptul numarului intrebarii

Διαβάστε περισσότερα

z a + c 0 + c 1 (z a)

z a + c 0 + c 1 (z a) 1 Serii Laurent (continuare) Teorema 1.1 Fie D C un domeniu, a D şi f : D \ {a} C o funcţie olomorfă. Punctul a este pol multiplu de ordin p al lui f dacă şi numai dacă dezvoltarea în serie Laurent a funcţiei

Διαβάστε περισσότερα

FLUXURI MAXIME ÎN REŢELE DE TRANSPORT. x 4

FLUXURI MAXIME ÎN REŢELE DE TRANSPORT. x 4 FLUXURI MAXIME ÎN REŢELE DE TRANSPORT Se numeşte reţea de transport un graf în care fiecărui arc îi este asociat capacitatea arcului şi în care eistă un singur punct de intrare şi un singur punct de ieşire.

Διαβάστε περισσότερα

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1)

Ecuatii exponentiale. Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. a x = b, (1) Ecuatii exponentiale Ecuatia ce contine variabila necunoscuta la exponentul puterii se numeste ecuatie exponentiala. Cea mai simpla ecuatie exponentiala este de forma a x = b, () unde a >, a. Afirmatia.

Διαβάστε περισσότερα

Υποστηρικτικό υλικό Σημειώσεις

Υποστηρικτικό υλικό Σημειώσεις ΔΙΑΔΙΚΤΥA : Υπηρεσίες, Τεχνολογία, Εφαρμογές Τμήμα Πληροφορικής Α.Π.Θ. Υποστηρικτικό υλικό Σημειώσεις Διδάσκοντες : Α. Βακάλη Γ. Παπαδημητρίου Εαρινό εξάμηνο 2000 2001 ΜΕΡΟΣ ΙΙ J A V A ΔΙΑΔΙΚΤΥA : Υπηρεσίες,

Διαβάστε περισσότερα

Noţiuni introductive

Noţiuni introductive Metode Numerice Noţiuni introductive Erori. Condiţionare numerică. Stabilitatea algoritmilor. Complexitatea algoritmilor. Metodele numerice reprezintă tehnici prin care problemele matematice sunt reformulate

Διαβάστε περισσότερα

Functii Breviar teoretic 8 ianuarie ianuarie 2011

Functii Breviar teoretic 8 ianuarie ianuarie 2011 Functii Breviar teoretic 8 ianuarie 011 15 ianuarie 011 I Fie I, interval si f : I 1) a) functia f este (strict) crescatoare pe I daca x, y I, x< y ( f( x) < f( y)), f( x) f( y) b) functia f este (strict)

Διαβάστε περισσότερα

I. Noţiuni introductive

I. Noţiuni introductive Metode Numerice Curs 1 I. Noţiuni introductive Metodele numerice reprezintă tehnici prin care problemele matematice sunt reformulate astfel încât să fie rezolvate numai prin operaţii aritmetice. Prin trecerea

Διαβάστε περισσότερα

Laborator 6. Integrarea ecuaţiilor diferenţiale

Laborator 6. Integrarea ecuaţiilor diferenţiale Laborator 6 Integrarea ecuaţiilor diferenţiale Responsabili: 1. Surdu Cristina(anacristinasurdu@gmail.com) 2. Ştirbăţ Bogdan(bogdanstirbat@yahoo.com) Obiective În urma parcurgerii acestui laborator elevul

Διαβάστε περισσότερα