programare in Java

February 9, 2017 | Author: Stefureac Silviu | Category: N/A
Share Embed Donate


Short Description

Download programare in Java...

Description

PROGRAMARE IN JAVA - Note de curs

1

Curs 1 Introducere Incepand cu anul 1977 incepe utilizarea pe scara larga a calculatoarelor personale, pretul acestora facandu-le accesibile tuturor. In 1981 IBM, cel mai mare producator de computere, lanseaza pe piata modelul sau de calculator personal – IBM PC (XT). Aproape peste noapte calculatoarele personale patrund in intreprinderi, organizatii si chiar in casele oamenilor. Initial aceste calculatoare erau folosite ca unitati independente, transferul informatiilor de la un calculator la altul se facea prin intermediul dischetelor. Pentru a eficientiza schimbul informatiilor intre calculatoarele personale acestea au fost interconectate fie prin legaturi telefonice fie in retele locale in cadrul aceleiasi cladiri (LANs – local area networks). Aceasta a dus la raspandirea aplicatiilor de calcul distribuit (distributed computing). In loc de a fi adunate si prelucrate centralizat, intr-un centru de calcul dotat cu calculatoare foarte performante, datele se procesau distribuit, pe calculatoare personale conectate in retea, amplasate in locurile in care informatia era obtinuta. Puterea de calcul a unui PC era suficienta pentru a asigura cerintele unui utilizator individual si comunicatia in retea. La ora actuala un PC de 1000$ are o putere de calcul impresionanta, fiind la fel de performant ca un calculator mare din anii 70, avand pretul de un milion de dolari. Informatia este distribuita prin retea unde unele calculatoare numite file servere au sarcina principala de a stoca programe si date iar altele numite clienti apeleaza la serviciile serverelor pentru a accesa si procesa distribuit aceste date. Prelucrarea distribuita a datelor presupune “cooperarea” intre aplicatiile executate pe calculatoarele client si cele executate de servere. Aplicatia client solicita un anumit serviciu aplicatiei server, aceasta din urma efectueaza prelucrarile necesare satisfacerii cererii clientului si ii transmite rezultatele solicitate. O aplicatie data de prelucrare distribuita consta nu dintr-un singur program executat pe un singur calculator ci din mai multe programe executate pe doua sau mai multe calculatoare interconectate in retea. O astfel de aplicatie se numeste aplicatie client/server. In anii 70 si 80 limbajele de programare uzuale in elaborarea sistemelor de operare si a aplicatiilor client /server de prelucrare distribuita in retea erau C si C++. Odata cu interconectarea retelelor locale LAN in retele WAN (wide area network) si dezvoltarea tehnologiilor Internet, limbajul de programare Java castiga rapid teren oferind perspective noi pentru dezvoltarea aplicatiilor bazate pe aceste tehnologii.

Limbaje masina, limbaje de asamblare, limbaje de nivel inalt Fiecare calculator “intelege” doar limbajul de programare specific procesorului cu care este prevazut. Acest limbaj “natural’ care consta dintr-un “vocabular” restrans de comenzi si un set de reguli sintactice de utilizare a comenzilor se numeste limbaj

2

CURS 1

masina. Fiecare comanda este reprezentata printr-un numar. Operanzii comenzii sunt si ele numere reprezentand fie valori ale datelor prelucrate de comanda fie registrul sau adresa locatiei de memorie in care datele prelucrate se afla sau unde va fi depus rezultatul. O instructiune masina ce poate fi executata de procesor consta deci din numarul asociat comenzii urmat eventual de numere desemnand operanzii comenzii. Programul masina consta dintr-o succesiune de instructiuni masina a caror executie duce la prelucrarea dorita a datelor initiale si obtinerea rezultatelor. Acest program masina, constand deci dintr-un sir de numere – cod si date, se poate incarca sub forma binara in memoria calculatorului si executat. Este evident ca un program masina nu poate fi executat decat pe un calculator dotat cu procesorul al carui set de comenzi a fost folosit la scrierea programului. Spunem deci ca programul masina nu este portabil fiind dependent de masina. Odata cu raspandirea calculatoarelor cererea tot mai mare de aplicatii programarea direct in limbaj masina a devenit ineficienta fiind prea greoaie. Din acest motiv, pentru a facilita elaborarea programelor, fiecarei comenzi elementare (numar) a procesorului i s-a asociat o succesiune de litere reprezentand abrevierea din limba engleza a comenzii respective. De exemplu pentru comanda de adunare s-a folosit mnemonica ADD (abreviere de la addition). Folosind mnemonicile programele puteau fi concepute, intelese, corectate si modificate mai usor. Setul de mnemonici ale comenzilor si regulile de constructie a instructiunilor constitue asa numitul limbaj de asamblare. Un program scris in limbaj de asamblare nu poate fi executat direct de calculator. Desi inteligibil pentru om, el nu poate fi “inteles” de calculator care asa cum am vazut “intelege” numai limbajul masina al procesorului cu care este echipat. In aceste conditii programul scris in limbaj de asamblare, pentru a putea fi executat, trebuie in prealabil “tradus” in limbaj masina. Aceasta “traducere” este o operatie de rutina prin care fiecare mnemonica a unei comenzi este substituita cu codul masina asociat. Fiind o operatie de rutina, aceasta “traducere” poate fi realizata automat de un program de calculator numit asamblor. Ca si programele masina, programele scrise in limbaj de asamblare se adreseaza unui anumit procesor. Fiecare tip de procesor are propriul sau set de comenzi masina si deci si propriul sau limbaj de asamblare. Mai mult, daca programul apeleaza functii ale sistemului de operare executia sa pe un calculator va fi conditionata nu numai de tipul procesorului ci si de prezenta sistemului de operare ale carui functii le apeleaza programul. Spunem in acest caz ca programul este dependent de platforma (procesor + sistem de operare). Pentru a nu rescrie programele pentru fiecare tip de calculator in parte si pentru a usura elaborarea, depanarea si modificarea lor s-au conceput asa numitele limbaje de nivel inalt. Acestea sunt limbaje artificiale, avand un vocabular si o sintaxa care permit descrierea unor operatii complexe. Primul limbaj de acest tip a fost FORTRAN (FORmula TRANslator). Acesta permitea in principal formularea unor instructiuni de calcul a expresiilor algebrice (formule) continand paranteze, variabile, constante, operatori, functii, intro forma apropiata de cea folosita in algebra. Datele puteau fi scalari – numere reale sau intregi - sau structuri similare vectorilor si matricilor. De asemenea limbajul prevedea instructiuni puternice de introducere si afisare a datelor de la si spre diferite echipamente periferice si pentru lucrul cu fisiere. Programele scrise intr-un limbaj de nivel inalt nu sunt dependente de platforma si din acest motiv pot fi usor insusite de nespecialisti in tehnica de calcul (ingineri, fizicieni, economisti, medici, etc.). Pentru a scrie un program intr-un limbaj de nivel inalt nu este necesar sa cunosti detalii despre calculatorul sau sistemul de operare sub care va fi executat acesta. Ca si programele in limbaj de asamblare, programele scrise in limbaj de nivel inalt nu pot fi “intelese” de calculator trebuind sa fie “traduse” in cod masina pentru a fi executate. Aceasta “traducere” se face prin substituirea fiecarei

PROGRAMARE IN JAVA - Note de curs

3

instructiuni cu codul masina a carui executie duce la realizarea prelucrarii descrise de instructiune. Spre deosebire de instructiunile in limbaj de asamblare instructiunile in limbaj de nivel definesc operatii de calcul complexe fiind substituite la traducere nu cu una ci cu mai multe instructiuni masina. Operatia aceasta de “traducere” a unui program scris in limbaj de nivel inalt in cod masina se numeste compilare si este realizata de programe specializate numite compilatoare. Codul masina generat de compilator se adreseaza evident unui anumit tip de procesor si unui anumit sistem de operare. Pentru a putea fi executat pe o alta platforma, programul sursa trebuie recompilat cu un alt compilator care genereaza cod masina pentru procesorul si sistemul de operare date. Cu alte cuvinte programul in cod masina obtinut prin compilare nu este independent de platforma. O alta varianta de executie a unui program scris in limbaj de nivel inalt consta in utilizarea unui program numit interpretor. Interpretorul preia succesiv cate o singura instructiune a programului sursa, o “interpreteaza” si o executa. Programele interpretate se executa mai lent decat programele compilate in cod masina. Pe de alta parte compilarea este un proces care dureaza si atunci in faza de elaborare a programului este preferabil sa folosim daca este posibil un interpretor si abia cand programul a fost definitivat sa il compilam. Primul limbaj interpretat a fost BASIC.

Limbajul C si C++ In anul 1970 la Bell Laboratories s-a inceput dezvoltarea unui nou sistem de operare pentru minicalculatoare, numit UNIX. O prima versiune a acestui sistem a fost scrisa pentru minicalculatorul DEC – PDP7 in limbajul B (creat de Martin Richards) orientat pentru programare de sistem. UNIX se dorea sa fie un sistem de operare portabil, scris in limbaj de nivel inalt, putand astfel sa fie compilat si instalat pe orice tip de minicalculator, cu conditia sa fie disponibil un compilator pentru limbajul de nivel inalt folosit. In 1972 pentru elaborarea unei noi versiuni UNIX, Dennis Ritchie pornind de la limbajul B il dezvolta creand limbajul C si compilatorul pentru DEC - PDP11. Odata cu raspandirea in mediul universitar a sistemului de operare UNIX si limbajul C devine din ce in ce mai cunoscut si folosit ca instrument de dezvoltare a UNIX. In prezent compilatorul limbajului C este disponibil pe toate tipurile de calculatoare ceea ce permite scrierea de aplicatii portabile mai ales dupa ce in 1983 limbajul a fost standardizat de American National Standards Committee on Computers and Information Processing. In 1989 standardul este aprobat de ANSI in cooperare cu ISO (International Standards Organization)(ANSI C). In 1980, tot la Bell Laboratories, Bjarne Stroustrup extinde limbajului C adaugandu-i facilitati necesare programarii orientate pe obiecte. Noua versiune a limbajului este numita C++. Conceptul de programare orientata pe obiecte revolutioneaza tehnologia de elaborare aprogramelor. Obiectele sunt componente software refolosibile, modeland obiectele din lumea reala. In aceasta abordare programele se construesc cu ajutorul acestor componente ca intr-un joc cu cuburi. Lucrul in echipa la proiectarea si dezvoltarea programelor folosind aceste componente modulare este mult mai productiva decat in cazul folosirii tehnologiilor utilizate anterior (modularitate, programare structurata). C++ permite scrierea programelor atat in stilul C clasic cat si in stilul orientat pe obiecte. Ulterior au aparut si alte limbaje de programare orientata pe obiecte cum ar fi Smaltalk elaborat de Xerox Palo Alto Research Center (PARC) si limbajul Java elaborat de Sun. Practic toate sistemele de operare aparute dupa 1972 au fost scrise in C/C++.

4

CURS 1

Limbajul Java Numarul de calculatoare personale este de sute de milioane in toata lumea si numarul acesta este in crestere. Totodata interconectarea acestora intr-o retea globala (Internet) este tot mai accentuata. Descoperirea microprocesorului a revolutionat si productia de sisteme numerice de conducere cu utilizarea lor in numeroase aplicatii industriale, comerciale sau casnice. Utilizarea microprocesoarelor face posibila aparitia unor utilaje si aparate inteligente – casa inteligenta nu mai este o fantezie scifi. Ca si calculatoarele personale si aceste aparate inteligente pentru a functiona eficient vor trebui sa fie interconectate in retea. De exemplu nu este greu de imaginat un sistem inteligent care sa – mentina constanta umiditatea pamantului in ghivecele cu flori si sa schimbe apa si sa mentina temperatura la pestisori in timp ce noi suntem plecati in vacanta. Mai mult, prin Internet vom putea de la orice distanta sa intram in legatura cu sistemul si sa aducem corectii la valorile prescrise pentru umiditate si temperatura, sa vedem imaginea acvariului cu pestisori pe displayul PC-ului si chiar sa le vorbim. Intrucat diversele aparate inteligente care vor fi comercializate nu vor fi echipate cu acelasi tip de procesor apare problema elaborarii unor aplicatii independente de platforma. Prevazand aceste evolutii, firma Sun a lansat in anul 1991 un proiect de cercetare numit Green. Rezultatul a fost un limbaj de programare derivat din C si C++, botezat de autorul sau James Gosling Oak dupa numele varietatii unui arbore ce crestea in fata geamului biroului sau. S-a descoperit mai tarziu ca un limbaj de programare cu acest nume exista deja si atunci, dupa ce au fost la o cafeanea la o cafea, cercetatorii au ales pentru noul limbaj de programare numele Java. Deoarece piata aparatelor inteligente nu se dezvolta asa de repede si datorita pierderii unui contract pentru care Sun concurase, programul Green a inceput sa aibe dificultati de finantare fiind pe cale sa fie abandonat. Din fericire pentru proiect si Java, in anul 1993 a aparut si a capatat o evolutie exploziva in Internet serviciul WorldWideWeb (WWW). Cercetatorii Sun implicati in proiect au sesizat imediat potentialul oferit de utilizarea limbajului Java in crearea asa numitelor pagini Web cu continut dinamic. Noile perspective au revitalizat proiectul Green astfel ca in Mai 1995 firma Sun face cunoscute rezultatele cercetarilor la o conferinta SunWorld. Aparitia java este imediat sesizata si apreciata de cercurile de afaceri interesate de aspectele utilizarii comerciala a serviciului WorldWideWeb. In aceste conditii Java nu se prezinta ca un limbaj academic cum a fost Pascal si nici ca un limbaj destinat uzului individual sau al unui grup de programatori caum este C. Java este un limbaj promovat de interesul cercurilor de afaceri pentru utilizarea comerciala a Internet in conexiune cu WWW.

Tehnologii de programare La inceputurile sale programarea se facea “dupa ureche” in functie de talentul, experienta si de capacitatea de analiza si sinteza a programatorului. La proiectarea programului se pornea de la reprezentare grafica (numita schema logica) a algoritmului de rezolvare a problemei. O astfel de schema logica este de fapt un graf orientat ale carui noduri sunt operatiile de prelucrare a datelor reprezentate prin simboluri grafice adecvate. Nodurile sunt conectate prin arce orientate care stabilesc succesiunea de efectuare a operatiilor. O astfel de abordare ofera prea multa libertate in proiectarea algoritmului. Nu intamplator, in acea vreme cea mai importanta instructiune discutata in manualele de programare era instructiunea de salt GOTO.

PROGRAMARE IN JAVA - Note de curs

5

Limbajul FORTRAN avea o multime de variante a acestei instructiuni. Datorita acestei lipse de restrictii in proiectarea fluxului de calcul adeseori codul sursa devenea foarte “incalcit” greu de inteles, de modificat si mai ales nesigur, in special in cazul programelor cu complexitate mare. Activitatea de cercetare a dus la aparitia in anii 60 a conceptelor programarii structurate care introducea o anumita disciplina in elaborarea programelor. Respectand principiile programarii structurate programele capata o structura precisa, sunt mai usor de inteles, de testat, depanat si de modificat. In aceasta abordare, la proiectarea programului nu mai este necesara elaborarea schemelor logice. Deoarece in acea perioada nu existau limbaje de programare care sa ofere suport pentru programarea structurata, Nicklaus Wirth a elaborat in 1971 limbajul de programare Pascal (dupa numele matematicianului Blaise Pascal – creator al primei masini mecanice de calcul) pentru a fi folosit la predarea programarii in mediile academice. Cu acest limbaj, Wirth a introdus si conceptul de structura de date –indisolubil legat de algoritmul ce sta la baza programului. Pascal a devenit in scurt timp limbajul preferat predat in universitati. Conceput in scopuri didactice limbajul avea o serie de slabiciuni care au facut sa nu fie agreeat pentru dezvoltarea aplicatiilor comerciale, industriale si guvernamentale. In anii 70-80 Departamentul Apararii al S.U.A. (DOD) a lansat o cerere pentru elaborarea unui limbaj de programare ce urma sa inlocuiasca sutele de limbaje de programare folosite la acea data in sistemele sale. Noul limbaj urma sa devina unicul limbaj de programare folosit in sistemele sale de calcul. Limbajul astfel obtinut s-a numit Ada (dupa numele primului programator al unei masini de calcul – construita de matematicianul Charls Babbage – Lady Ada Lovelace, fica poetului englez Lord Byron). Chiar daca este un urmas al Pascalului, limbajul Ada este mult diferit de acesta. El introduce printe altele mecanismul de multitasking care permite programatorului sa defineasca procesari ale datelor care decurg in paralel. C++ si Java prevad si ele acest mecanism sub denumirea de multithreading. Am vazut ca C++ si Java introduc in plus conceptul de programare orientata pe obiecte oferind si suportul necesar implementarii acestuia. Conceptul de obiect “incapsuleaza” la un loc datele si procedurile de prelucrare a acestora intr-o singura entitate, extinzand astfel conceptul de structura de date din Pascal.

Mediul de dezvoltare a aplicatiilor Java Programele Java parcurg cinci faze de dezvoltare: editare, compilare, incarcare, verificare si executie. Schematic aceste etape pot fi reprezentate ca in figura 1.1. Prima faza consta in editarea programului folosind un editor de text (cum ar fi Notepad-ul din Windows sau vi –ul din UNIX). Programul sursa va fi salvat intr-un fisier cu extensia java (de exemplu prg1.java) In a doua faza programul java este compilat folosind comanda javac (de exemplu javac prg1.java) pentru a lansa compilatorul. acesta “traduce” programul sursa in cod binar (byte code) – limbaj inteles de interpretor. Acest cod intermediar este salvat intr-un fisier cu extensia class (de exemplu prg1.class). Faza a treia consta in amplasarea codul binar din fisierul class in memorie de catre incarcator. Incarcarea se poate face de pe discul local sau prin retea. Exista doua tipuri de programe java – aplicatii si applet-uri. in cazul aplicatiilor java aceasta operatie este initiata de comanda java (de exemplu java prg1). Appleturile sunt destinate executiei de catre o masina virtuala java implementata de un browser (de exemplu Internet Explorer sau Netscape Navigator) in cadrul unui document HTML (

CURS 1

6

Figura 1.1 – mediul de dezvoltare al programelor Java HyperText Markup Language). Un applet poate fi executat si local cu ajutorul programului appletviewer.

Clase si Obiecte Java

In Java un program este constituit dintr-o comunitate de obiecte care interactioneaza intre ele in timpul executiei programului. Fiecare obiect component al programului are propriile sale proprietati si un anumit comportament specific.

PROGRAMARE IN JAVA - Note de curs

7

Un program este un sistem de procesare a datelor. Putem spune ca este similar unui storcator de fructe. Asa cum introducand portocale si energie electrica in storcator obtinem la iesire suc, tot asa introducand in program datele initiale obtinem la iesire rezultatele. Un program de calculator este o masina de prelucrare a informatiei asemanator storcatorului de fructe dar cu deosebirea ca este mult mai versatil. Un storcator de fructe, oricat de perfectionat, nu stie sa faca decat un singur lucru. Un program de calculator poate sa fie proiectat astfel incat sa modeleze nu numai procese si sisteme existente in lumea reala dar si lucruri care nu au existat si nu ar putea exista in realitate. La fel ca si majoritatea masinilor, un program de calculator este facut din diferite repere (parti) componente care interactioneaza intr-un mod definit cu precizie. O astfel de colectie de componente constitue un sistem motiv pentru care programele de calculator sunt numite uneori si sisteme informatice. In mod traditional, la elaborarea unui astfel de sistem de procesare a informatiei, proiectantul se concentreaza in special pe ce prelucrari trebuie sa faca programul. In cazul programelor complexe, problema este descompusa in subprobleme ce urmeaza a fi abordate separat. Daca unele din aceste subprobleme au inca un grad ridicat de complexitate, ele sunt la randul lor descompuse in subprobleme mai simple. O astfel de abordare de la complex la simplu prin detalieri succesive se numeste metodologie top-down de dezvoltare a programelor. Detalierea continua pana cand fiecare subproblema poate fi rezolvata de un subprogram numit subrutina, procedura sau functie in functie de limbajul de programare folosit. Programul obtinut are drept componente aceste proceduri care la executie interactioneaza pentru obtinerea rezultatului. In cazul unui program procedural datele sunt prelucrate similar cu prelucrarea unor piese intr-o linie de productie fiind transmise ca in figura 1.2 de la un punct de prelucrare la altul (de la o procedura la procedura) pana la procesarea completa.

Figura 1.2 – prelucrarea procedurala a datelor In cazul programelor orientate pe obiecte lucrurile stau oarecum diferit. Si aceste programe sunt sisteme constituite din componente care interactioneaza intre ele dar aceste componente nu implementeaza algoritmi de rezolvare a unor subprobleme ca procedurile. Aceste componente reunesc datele cu procedurile de prelucrare ale acestora intr-o singura entitate denumita obiect. La fel ca si obiectele din lumea reala, un astfel de obiect are o serie de proprietati – de exemplu culoare, dimensiune, coordonate. Totodata obiectul are un anumit comportament specific fiind capabil de a efectua in anumite conditii o serie de actiuni care ii modifica starea. Asa cum in cazul unei masini comanda de accelerare ii modifica parametrii de stare viteza si coordonate tot asa actiunile obiectului ii modifica valorile proprietatilor. Putem reprezenta un obiect ca in Figura 1.3. Obiectul executa actiunile 1, 2 si 3 asupra proprietatilor la solicitari venite din exterior de la alte obiecte. Spunem ca aceste actiuni sunt publice, fiind accesibile din afara obiectului.

8

CURS 1

Figura 1.3 Reprezentarea unui obiect Actiunea 4 este “interna” obiectului si nu poate fi solicitata din exterior. Spunem despre ea ca este o actiune privata. Proprietatile obiectului sunt si ele private, valorile lor neputand fi modificat direct din exterior ci numai prin actiunile obiectului insusi. Proprietatile obiectului se numesc variabile reprezentand de fapt datele supuse prelucrarii. Actiunile de care obiectul este capabil si care definesc comportamentul sau sunt de fapt proceduri ce se executa la apel asupra datelor interne ale obiectului. Aceste proceduri se numesc metode. Variabilele si metodele se numesc membri ai obiectului. Mai multe obiecte pot “coopera” intre ele pentru rezolvarea unei probleme asa cum motorul coopereaza cu carburatorul, pompa de benzina si rezervorul de combustibil pentru a deplasa un autoturism. In alta ordine de idei obiecte simple pot fi “asamblate” impreuna pentru a crea un obiect mai complex la fel cum obiectul autoturism se obtine din asamblarea impreuna a caroseriei, motorului, carburatorului, pompelor de apa si benzina, rezervorului si a altor repere. Motorul este la randul sau constituit din mai multe repere mai simple. Un program java este el insusi un obiect complex care poate fi construit folosind o serie de obiecte de complexitate mai redusa compuse la randul lor din obiecte mai simple, care la randul lor … Toate aceste obiecte componente coopereaza la rezolvarea problemei. In aceasta abordare proiectarea unui program orientat pe obiecte difera fundamental de proiectarea unui program procedural. Se porneste de la realizarea sau refolosirea unor obiecte simple pentru a construi obiecte din ce in ce mai complexe, obiectul rezultat in final fiind capabil sa prelucreze datele de intrare in modul dorit. Astfel proiectarea unui program orientat pe obiecte se aseamana cu proiectarea hardware. Circuitele integrate sunt obiecte cu un anumit comportament care se asambleaza pe placi de textolit cu cablaj imprimat rezultand un modul care el insusi este un obiect cu comportamentul dorit. Mai multe astfel de module se pot

PROGRAMARE IN JAVA - Note de curs

9

asambla impreuna pe un sasiu (sertar cu sloturi) pentru a forma un obiect mai complex. Mai multe sertare pot fi asamblate impreuna intr-un dulap cablat corespunzator rezultand un obiect si mai complex. La randul sau mai multe dulapuri de acest tip pot fi asamblate impreuna intr-o camera de comanda si interconectate intre ele rezultand un sistem extrem de complex care in esenta este si el un obiect. O astfel de abordare de la simplu la complex se numeste metodologie down-top de proiectare software (total diferita de metodologia top-down folosita la proiectarea programelor procedurale). La creare obiectele sunt personalizate printr-un nume (identificator ) cu ajutorul caruia ne putem referi la obiectul respectiv. Pentru a crea un obiect trebuie sa definim care sunt proprietatile si comportamentul acestuia. Aceasta definire se numeste clasa. Obiectele sunt instantieri ale clasei date. Asa cum toate autoturismele pot fi incadrate intr-o clase de obiecte numita Autovehicule caracterizate prin proprietatile model, capacitate cilindrica, culoare, numar locuri etc. si capabile de actiunile acelerare, franare, schimbare a directiei, aprindere faruri, semnalizare, etc. si obiectele software se incadreaza intr-o clasa. Crearea obiectului se face pe baza definitiei clasei careia apartine obiectul prin alocarea unui bloc de memorie si completarea acestuia cu datele si codul corespunzatoare. Zona de date a blocului de memorie se initializeaza cu valorile specificate la crearea obiectului. Avantajele programarii orientata pe obiecte sunt multiple: - obiectele construite pot fi testate usor fiecare in parte astfel ca la folosirea lor la realizarea unor obiecte mai complexe putem fi siguri de buna lor functionare. Aceasta duce la o mai mare siguranta a programelor. - obiectele odata realizate, pot fi refolosite si in alte aplicatii. - munca in echipa este evident mai eficienta. - Programele orientate obiect sunt mai usor de modificat prin simpla inlocuire a unora din obiectele componente. Asa cum pe placa de baza a unui PC putem inlocui un procesor mai lent cu altul mai rapid fara a modifica celalalte componente, tot asa putem inlocui un obiect cu un altul avand acelasi comportament dar la realizarea caruia s-au folosit algoritmi mai performanti. Noul obiect fiind compatibil la nivel de “interfata” cu obiectul inlocuit, celalalte obiecte componente nu trebuiesc modificate. Programul insa va fi mai eficient beneficiind de performantele imbunatatite ale noului obiect introdus. - Programele orientate obiect complexe sunt mult mai usor de proiectat si de inteles.

Mostenirea

Unul din avantajele majore al POO il constituie mostenirea. Aceasta ii permite programatorului sa nu reinventeze roata de fiecare data de cate ori incepe sa lucreze la un nou program. De ce sa fii nevoit sa rezolvi probleme pe care le-ai rezolvat odata, anterior sau pe care alti programatori le-au rezolvat deja inaintea ta. In cazul programarii procedurale aceasta problema era solutionata prin existenta unor biblioteci de functii. Functiile si procedurile de biblioteca pot fi apelate din programul nou creat de noi, codul acestora fiind cautat si extras din fisierul de biblioteca corespunzator si adaugat programului in cod masina obtinut la compilare prin operatia de editare a legaturilor (linkeditare). Utilizarea bibliotecilor de functii are insa o mare limitare – ea nu ofera un mecanism de extindere a capabilitatilor functiilor continute, acestea fiind deja in cod masina si neputand fi modificate. POO ofera un mecanism

10

CURS 1

elegant si revolutionar, numit mostenire, de a depasi aceasta limitare. Locul bibliotecilor de functii este luat in cazul POO de bibliotecile de clase. Clasele pot fi extinse prin adaugare de noi proprietati si metode fara a modifica codul lor initial. Aceasta se bazeaza prin definirea unei clase derivate din clasa de baza continuta eventual de biblioteca. Noua clasa “mosteneste” proprietatile si metodele clasei de baza carora li se adauga proprietatile s metodele specificate la definirea clasei de baza. O astfel de clasa derivata din clasa de baza se numeste subclasa a acesteia. O parte din bibliotecile de clase java sunt standard acompaniand compilatorul si interpretorul Java, altele putand fi furnizate de alti producatori de software independenti. De asemenea, programatorul poate sa creeze propriile sale biblioteci clase pe care sa le foloseasca in diferite aplicatii.

Crearea unui program Java Vom incepe prin a dezvolta o aplicatie Java extrem de simpla (traditionalul (HalloWorld) pentru a exemplifica structura unui astfel de program si etapele ce trebuiesc parcurse pentru a-l executa. Vom incepe prin a edita cu un program editor de text codul sursa al aplicatiei. Asa cum am am spus anterior, un program java este el insusi un obiect. Vom incepe prin a defini clasa a carei instantiere este aplicatia noastra: class HalloWorld { //Aici se vor adauga membrii clasei } Pentru ca aceasta clasa sa defineasca o aplicatie, ea trebuie obligatoriu sa contina metoda main care este apelata la lansarea in executie a programului. Metoda main este de fapt o functie (similara cu functiile C) care primeste ca parametri un vector de siruri de caractere reprezentand argumentele din linia de comanda cu care a fost lansat programul. In Java sirurile de caractere sunt (ca toate datele de altfel) obiecte apartinand clasei String. Un vector de astfel de obiecte este definit ca String[]. Aceasta functie trebuie sa fie accesibila din exteriorul obiectului pentru ca interpretorul sa poata cere executia acesteia, sa fie publica, motiv pentru care este declarata de tip public. Codul acestei functii este comun tuturor instantelor clasei metoda fiind declarata din acest motiv static. De asemenea main nu intoarce nimic fiind deci declarata void. Vom avea deci: class HalloWorld { public static void main(String[] arguments){ //Aici se va adauga codul functiei main } } In cazul exemplului nostru, dorim ca functia noastra sa afiseze mesajul Hallo world!. Pentru afisare vom solicita serviciile obiectului System care gestioneaza relatiile cu sistemul. Acesta are in componenta un obiect out care gestioneaza afisarea. Accesul la membrul out al lui System cu operatorul de acces “.” ( la fel cum se accesau membrii unei structuri in C): System.out . Acestei componente ii vom solicita sa afiseze mesajul nostru prin apelul metodei sale println. Vom obtine deci:

PROGRAMARE IN JAVA - Note de curs

11

class HalloWorld { public static void main(String[] arguments){ System.out.println(“Hallo world!”); } } Se observa ca instructiunea adaugata de noi la corpul functiei trebuie terminata ca si in limbajul C cu caracterul ";". Textul programului il vom salva intr-un fisier avand acelasi nume cu classa si extensia java (HalloWorld.java). Vom compila programul cu comanda javac HelloWorld.java rezultand fisierul HelloWorld.class continand byte-codul programului. Acest byte-cod il vom executa cu interpretorul java prin comanda java HelloWorld. Programul va afisa in fereastra DOS in care a fost executat mesajul Hello world! si se va termina (figura 1.4).

Figura 1.4 – Compilarea si executia unui program java

Sumar Pe parcursul acestui curs am discutat aspectele introductive legate de limbajul Java si POO. Am elaborat de asemenea un prim program java si am parcurs etapele necesare pentru executia acestuia: 1. Se editeaza programul cu un editor de text; 2. Se compileaza programul; 3. Se apeleaza interpretorul pentru executarea byte-codului generat de compilator. Parcurgand aceste etape am vazut cum se defineste o clasa si cum se declara in cadrul acesteia o metoda. De asemenea am vazut cum se apeleaza la serviciile unui alt obiect existent – in speta pentru afisarea unui mesaj am apelat metoda System.out.println(). Unde este un sir de caractere incadrat intre ghilimele. Aceasta metoda afiseaza sirul de caractere la consola sistemului (in fereastra DOS in care am rulat aplicatia) si trece cursorul pe randul urmator. Trebuiesc de asemenea remarcate urmatoarele detalii de sintaxa: • clasa se declara cu instructiunea class; • Programul Java este instantierea unei clase care contine metoda main; • Metoda main este de tip public static void si are ca parametru String[]; • Numele clasei trebuie sa fie acelasi cu numele fisierului in care se salveaza codul acesteia; • In textul programului pot fi introduse comentarii precedate de perechea de caractere “//” (la fel ca in C), compilatorul ignorand textul ce urmeaza acestor caractere pana la sfarsitul randului. • Instructiunile programului se termina cu caracterul “;”. Mai multe detalii privind cele de mai sus vor prezentate in cursurile urmatoare.

CURS 1

12

Exercitii 1. Cand compilati un program, ce faceti de fapt? a. Il salvati pe disc b. Il convertiti intr-o forma pe care calculatorul poate sa o inteleaga c. Il adaugati la colectia voastra de programe 2. Ce este o variabila? a. O valoare necunoscuta ce este precizata in timpul executiei programului b. Un text intr-un program ignorat de compilator c. Un loc unde vor fi pastrate de catre program informatii 3. Modificati programul HalloWorld introducand in codul sau diverse erori. De exemplu stergeti terminatorul “;” de la sfarsitul instructiunii de afisare sau modificati numele clasei din class HalloWorld{...} in class halloWorld{...}. Salvati programul si incercati sa il compilati si executati. Comparati mesajele de eroare obtinute cu erorile introduse.

PROGRAMARE IN JAVA - Note de curs

13

Curs 2 Algoritmi si structuri de control Inainte de a incepe scrierea unui program care sa rezolve o anumita problema, programatorul trebuie sa analizeze si sa inteleaga pe deplin in ce consta problema care sunt datele initiale, care sunt rezultatele ce trebuiesc obtinute si ce prelucrari trebuie sa sufere datele initiale pentru a se obtine rezultatele cerute. La proiectarea programului este esential atat sa determinam ce blocuri componente vom folosi pentru a construi programul cat si ce metodologie de elaborare vom utiliza pentru aceste blocuri. Metodologia prezentata in continuare de proiectare a structurii programelor este aplicabila nu numai limbajului java ci si in cazul majoritatii limbajelor de programare de nivel inalt. orice problema de calcul poate fi rezolvata prin efectuarea unor anumite operatii asupra datelor intr-o succesiune data. O astfel de succesiune de efectuare a operatiilor asupra datelor initiale care duce la solutionarea unei probleme date ( prin obtinerea rezultatelor dorite) se numeste algoritm. Sa analizam pe un exemplu importanta succesiunii corecte a efectuarii a operatiilor in rezolvarea corecta a problemei. Fie algoritmul de desteptare si plecare la cursuri a unui student: 1. Trezirea si jos din pat 2. Dezbraca-ti pijamaua 3. Fa un dus 4. Imbraca-te 5. Ia micul dejun 6. Pleaca la cursuri Executarea in aceasta ordine a operatiilor descrise mai sus face ca studentul nostru sa ajunga la cursuri intr-o forma corespunzatoare. Acum sa presupunem ca studentul ar executa aceleasi operatii intr-o ordine putin modificata: 1. Trezirea si jos din pat 2. Dezbraca-ti pijamaua 3. Imbraca-te 4. Ia micul dejun 5. Fa un dus 6. Pleaca la cursuri Aplicand acest algoritm, studentul nostru va ajunge la cursuri ud fleasca. Specificarea ordinii in care se executa diferitele instructiuni ale programului se face prin instructiuni de control. Inainte de atrece la scrierea programului este necesar deci sa determinam operatiile ce trebuiesc efectuate de acesta si succesiunea acestora adica sa determinam algoritmul de rezolvare a problemei care urmeaza sa fie implementat in final in limbajul de programare ales. Inainte de a fi transpus in program, algoritmul trebuie reprezentat intr-o forma sau alta pe hartie. Folosirea limbajului natural nu este cea mai buna solutie pentru descrierea algoritmului. O solutie o constitue utilizarea pseudocodului – un limbaj artificial neformal apropiat de un limbaj de programare dar

14

CURS 2

mai putin rigid in ce priveste respectarea regulilor sintactice. Pseudocodul nu este un limbaj de programare propriuzis, servind numai pentru reprezentarea algoritmului ceea ce reprezinta o etapa intermediara in elaborarea programului. El permite programatorului sa analizeze si sa proiecteze structura si componentele viitorului program. Implementarea algoritmului reprezentat astfel in program se face foarte usor prin inlocuirea instructiunilor scrise in pseudocod cu instructiunile echivalente ale limbajului de programare ales. Pseudocodul contine doar instructiuni executabile. Instructiuni declarative de forma int i; nu apar in aceasta etapa de proiectare a programului. O astfel de instructiune declarativa este de fapt o directiva data compilatorului pentru a aloca memorie variabilei i in care sa se pastreze in timpul executiei valorile luate de aceasta. Deoarece programul in pseudocod nu va fi compilat, nu va fi necesara in aceasta faza de conceptie declararea variabilelor ce intervin in program. Cu toate acestea unii programatori prefera sa specifice la inceputul pseudocodului programului lista variabilelor folosite si destinatia acestora. In mod normal, instructiunile sunt executate succesiv, una dupa alta in ordinea in care apar in program. O astfel de executie se numeste secventiala. Multe instructiuni Java pe care le vom discuta curand permit programatorului sa determine executarea (sa transfere controlul) unei alte instructiuni decat instructiunea imediat urmatoare din secventa. Abuzul in ce folosirea acestor instructiuni poate sa altereze grav structura programului ridicand mari dificultati in intelegerea, depanarea si modificarea acestuia. Am vorbit in cursul precedent de blamata instructiune goto care permitand transferul controlului in orice punct al programului, utilizata fara discriminare poate complica inutil programul. Astfel in anii 60, dupa cum am mai aratat, s-a formulat conceptul programarii structurate care duce la eliminarea folosirii acestei instructiuni. Cercetarile lui Bohm si Jacopini au dovedit prin enuntarea si demonstrarea in 1966 a teoremei de structura. Aceasta teorema afirma ca orice algoritm poate fi construit fara utilizarea lui goto folosind numai trei structuri de control: secventa, selectia si repetitia. Renuntarea la instructiunea goto a fost o adevarata provocare adresata producatorilor de software, programatorii trebuind sa–si modifice fundamental modul de gandire si stilul de programare. Analizele facute au demonstrat ca aplicarea principiilor programarii structurate au dus la o crestere impresionanta a eficientei productiei de software ( reducerea timpului de elaborare a software-ului si implicit a cheltuielilor). Explicatia acestui fenomen consta in imbunatatirea substantiala a structurii programelor ceea ce facea ca acestea sa fie mai clare, mai usor de depanat, testat si modificat. Desi limbajele C, C++ si Pascal mai pastreaza instructiunea goto, limbajul Java nu o mai contine in setul sau de instructiuni.

Secventa Structura secventa este implicita in Java. Daca nu se specifica altfel, instructiunile sunt executate secvential, una dupa alta in ordinea in care apar in program. Fragmentul de schema logica din figura 2.1 exemplifica o astfel de structura de control de tip secventa tipica, in care doua operatii de calcul sunt executate succesiv. O schema logica este o reprezentare grafica a unui algoritm folosind diferite simboluri grafice pentru reprezentarea operatiilor (dreptunghiuri, romburi, cercuri, elipse). In schema logica din figura 2.1 dreptunghiurile reprezinta blocuri de calcul ( specificand o actiune/operatie executata de program) iar cercurile noduri de conectare la restul schemei logice. Sagetile indica ordinea in care operatiile sunt efectuate.

PROGRAMARE IN JAVA - Note de curs

15

Figura 2.1 – secventa Intai valoarea variabilei unghi este adaugata la variabila total iar apoi variabila contor este incrementata cu 1. Java ne permite sa prevedem oricate instructiuni succesive intr-o secventa.

Selectia Selectia este o instructiune care introduce o ramificatie in fluxul de executie al instructiunilor programului. Executia instructiunilor se va desfasura pe o ramura sau alta in functie de indeplinirea unei conditii specificate. Java prevede trei tipuri de instructiuni de tip selectie: structura de selectie if , selectia dubla if/else si selectia multipla switch. Selectia simpla if determina executia unei operatii daca este este adevarata o conditie data. In cazul in care conditia nu este indeplinita (este falsa) se sare peste operatia conditionata trecandu-se la executia operatiei imediat urmatoare. O astfel de structura se numeste selectie simpla si poate fi reprezentata grafic prin schema logica din figura 2.2. Aici simbolul romb este un bloc de decizie. Daca valoarea de adevar a expresiei relationala inscrisa in acest bloc este adevarat ( variabila unghi are valoarea mai mare sau egala cu 60), se executa actiunea din blocul urmator (afisarea mesajului “Mai mare”). Daca valoarea de adevar este fals, atunci se sare peste aces bloc. de remarcat ca si aceasta structura de control if ca si secventa are un singur punct de intrare si un singur punct de iesire. Astfel de structuri cu un singur punct de intrare si un singur punct de iesire prezinta avantajul ca programatorul le poate conecta unul la altul folosindu-le ca elemente de constructie a programului la fel ca intr-un joc de cuburi. Aceasta confera algoritmului o structura clara, usor de inteles si modificat.

16

CURS 2

Figura 2.2 – selectia simpla Mai exista o singura metoda de combibnare a structurilor de control de acest tip si anume incuibarea. Structura descrisa mai sus poate transpusa in java astfel: ... if(unghi >= 60) System.out.println(“Mai mare”); ... Se observa ca limbajul java corespunde foarte bine pseudocodului folosit in descrierea algoritmului ceea ce face ca utilizarea pseudocodului la proiectarea algoritmilor sa fie un instrument extrem de util. Ca argument al instructiunii de selectie if poate fi prevazuta orice expresie care returneaza la evaluare o valoare de tip boolean.

Selectia dubla Structura de selectie dubla if/else permite programatorului sa specifice o actiune alternativa care se executa in cazul conditia nu este indeplinita. Aceasta structura se scrie in pseudocod astfel ... if(unghi >= 60) print “Mai mare” else print “Mai mic” ... Schema logica corespunzatoare acestei structuri este prezentata in figura 2.3.

PROGRAMARE IN JAVA - Note de curs

17

Figura 2.3 – selectia dubla Structura descrisa mai sus poate transpusa in java astfel: ... if(unghi >= 60) System.out.println(“Mai mare”); else System.out.println(“Mai mic”); ... Pe langa instructiunea if/else limbajul java mai prevede operatorul conditional ?: similar celui din limbajul C, avand sintaxa: ?: Daca la evaluarea expresiei booleene rezulta valoarea adevarat, operatorul evalueaza si intoarce valoarea expresiei 1 iar in caz contrar valoarea expresiei 2. Astfel instructiunea java: ... System.out.println(unghi>=60? “Mai mare”:”Mai mic”); ... va avea acelasi efect cu instructiunea if/else din exemplul anterior.Putem incuiba structurile de selectie duble ca in exemplul urmator: ... if(unghi < 90) System.out.println(“Ascutit”); else if (unghi == 90) System.out.println(“Drept”); else System.out.println(“Obtuz”); ...

18

CURS 2

Schema logica corespunzatoare acestei secvente de instructiuni este cea din figura 2.4

Figura 2.4 – Incuibarea selectiilor duble Este important de subliniat ca componenta else a structurii este intotdeauna asociata de compilator cu ultimul if, indiferent de indentarea textului. Indentarea are doar rolul de a imbunatati claritatea programului. Daca dorim sa asociem o componenta else cu un alt if decat cel precedent trebuie sa folosim acoladele ca in exemplul urmator. Secventa de mai jos: ... if(x > 10) if(y > 10) System.out.println(“x si y sunt mai mari ca 10”); else System.out.println(“x este mai mic sau egal cu 10”); ... va functiona incorect afisand mesajul x este mai mic sau egal cu 10 chiar daca x are valoarea 12 dar y este 5. Aceasta se datoreste faptului ca else este asociat cu if( y > 10) si nu cu if(x > 10), secventa corespunzand schemei logice din figura 2.5. Versiunea corecta se obtine folosind acoladele:

PROGRAMARE IN JAVA - Note de curs

19

... if(x > 10){ if(y > 10) System.out.println(“x si y sunt mai mari ca 10”); }else System.out.println(“x este mai mic sau egal cu 10”); ... Acoladele {} indica compilatorului ca cel de al doilea if este incuibat in corpul primului si deci componenta else apartine primului if.

Instructiuni compuse In mod normal instructiunea if accepta in corpul sau o singura instructiune. Daca prelucrarea ce trebuie executata este mai complexa si necesita mai multe instructiuni, acestea pentru a fi incluse in corpul lui if trebuiesc grupate intr-un bloc de instructiuni prin incadrarea intre acolade. Un astfel de bloc de instructiuni se numeste instructiune compusa. Exemplul urmator prezinta utilizarea instruciunilor compuse in corpul unei selectii duble: ... if(unghi >= 60) System.out.println(“Mai mare”); else{ System.out.println(“Mai mic”); System.out.println(“Mai mariti unghiul!”); } ... In acest exemplu daca variabila unghi are valoarea mai mica decat 60 este executat blocul de doua instructiuni incadrate de acolade, afisandu-se pe doua randuri mesajele Mai mic si Mai mariti unghiul! . Daca nu s-ar fi folosit acoladele mesajul Mai mariti unghiul! ar fi fost afisat in oricare din situatii.

Selectia multipla Fie urmatoarea instructiune formata din mai multe instructiuni de selectie incuibate: ... if(unghi == 30) System.out.println(“Unghi=30”); else if (unghi == 45) System.out.println(“Unghi=45”); else if (unghi == 60) System.out.println(“Unghi=60”); else if (unghi == 90) System.out.println(“Unghi=90”); else System.out.println(“Alte valori”); ... Pentru astfel de cazuri in care, in functie de valoarea intreaga pe care o ia o variabila, trebuie selectata si executata o anumita actiune din mai multe posibile (selectie multipla) limbajul java prevede instructiunea switch avand sintaxa:

20

CURS 2 switch ( ){ case : ; break; case : ; break; ... case : ; break; default:; break; }

Aici daca valoarea intreaga obtinuta prin evaluarea este se va efectua , daca este se va efectua , etc.Daca valoarea obtinuta nu este egala cu nici una din valorile , ,..., se va efectua specificata cu eticheta default. Folosind aceasta instructiune, instructiunea compusa din exemplul precedent poate fi inlocuita cu: ... switch(unghi){ case 30: System.out.println(“Unghi=30”); break; case 45: System.out.println(“Unghi=45”); break; case 60: System.out.println(“Unghi=60”); break; case 90: System.out.println(“Unghi=90”); break; default: System.out.println(“Alte valori”); break; } ...

Structura de control repetitiva while O structura de control repetitiva determina calculatorul sa repete ciclic o actiune atat timp cat o anumita conditie este indeplinita (este adevarata). Un exemplu de astfel de operatie repetata ar fi descris de : Cat timp mai sunt obiecte de cumparat pe lista mea de cumparaturi Cumpara urmatorul obiect din lista Instructiunea while corespunde lui “Cat timp”. Actiunea este descrisa de directiva “Cumpara urmatorul obiect din lista”. Conditia verificata de fiecare data inaintea efectuarii acestei actiuni este “mai sunt obiecte de cumparat pe lista mea de cumparaturi?”. Daca aceasta conditie este satisfacuta se executa o noua cumparatura. Repetarea continua pana la epuizarea listei de cumparaturi, caz in care evaluarea conditiei intoarce un rezultat fals. O astfel de structura repetitiva se numeste ciclu cu testul la inceput. Actiunea constituie corpul ciclului iar conditia se numeste invariantul ciclului (denumire justificata de faptul ca acest ciclu se executa atat timp

PROGRAMARE IN JAVA - Note de curs

21

valoarea rezultata din evaluarea conditiei este invariant adevarat). Ciclul se numeste ciclu cu testul la inceput deoarece evaluarea conditiei se face inainte de a se executa actiunea din corpul ciclului. Astfel este posibil ca aceasta actiune sa nu se execute nici o data (daca conditia are din start valoarea fals). Sintaxa instructiunii while este: while () Instructiunea se repeta cat timp valoarea booleana obtinuta din evaluarea expresiei este adevarat. Instructiunea poate fi simpla sau compusa (bloc de instructiuni). Exemplul urmator prezinta utilizarea instructiunii while: ... while(unghi < 360) unghi = unghi + 10; ... In acest exemplu variabila unghi este marita ciclic cu 10 pana cand valoarea acesteia depaseste 360. Daca valoarea initiala a acestei variabile a fost 5, valoarea la iesirea din ciclu va fi 365. Daca valoarea initiala este un multiplu de zece dar mai mica de 360, valoarea finala obtinuta este 360. Daca insa valoarea initiala este egala sau mai mare ca 360, actiunea de incrementare a sa cu 10 nu are loc, ciclul terminandu-se fara a se mai executa corpul sau deoarece conditia unghi < 360 este evaluata la valoarea fals de la inceput. Schema logica din figura 2.5 reprezinta structura repetitiva while din exemplul de mai sus.

Figura 2.5 Structura repetitiva while

22

CURS 2

Structura de control repetitiva while

Figura 2.6 – structura repetitiva do/while

Sumar Exercitii

PROGRAMARE IN JAVA - Note de curs

25

Curs 3 Date, variabile, expresii Asa cum am aratat, programele sunt sisteme care prelucreaza date. Desi in esenta aceste date sunt valori numere stocate in memoria calculatorului sub forma de numere intregi codificate in binar, la nivelul programului scris in limbaj de nivel inalt ele modeleaza obiecte ale lumii reale. Fiecare limbaj de nivel inalt pune la dispozitia programatorului o colectie mai mult sau mai putin bogata de tipuri de date uzuale prin care acesta sa poata reprezenta in program informatia supusa procesarii. In mod traditional calculatoarele sunt destinate sa prelucreze informatie numerica efectuand calcule cu numere intregi si reale. Din acest motiv din nici un limbaj de programare nu lipsesc aceste tipuri de date. De asemenea calculatoarele sunt frecvent folosite pentru prelucrarea informatiei de tip text numita informatie alfanumerica – caractere. Caracterele, sunt simboluri grafice cum ar fi litere, cifre, semne speciale, sunt codificate numeric prin asocierea fiecarui astfel de simbol a unui cod numeric standardizat (de exemplu codul ASCII – American Standard Code for Information Interchange). Si pentru acest gen de informatie limbajele de programare de nivel inalt prevad tipuri de date corespunzatoare. De asemenea, asa cum am constatat in cursul trecut, programele trebuiesc adesea sa opereze cu valori logice de tip adevarat si fals, motiv pentru care si pentru astfel de valori, numite booleene dupa matematicianul englez Bool, unele limbaje de programare (Pascal, Java) prevad un tip de date specific. Tipurile de date discutate sunt tipuri elementare, numite tipuri de date scalare. Pe langa tipurile de date scalare toate limbajele de nivel inalt permit definirea unor structuri omogene de date cum ar fi vectorii si matricile, formate din mai multe elemente de acelsi tip. In aceasta categorie ar putea intra si sirurile de caractere – privite ca un vector ale carui elemente sunt date de tip caracter. Totusi, unele limbaje (Pascal, Java) trateaza sirurile de caractere ca un tip distinct de date. Limbajele de nivel inalt moderne permit programatorului sa defineasca propriile tipuri de date sub forma de structuri eterogene (compuse din elemente de tipuri diferite) prin care acesta sa poata reprezenta si alte informatii decat cele uzuale. Asa cum in algebra pe fiecare multime de numere exista definit un set de operatii si limbajele de nivel inalt prevad pentru fiecare tip de date un set de operatori. Astfel avem operatori ce implementeaza operatiile cu numere intregi, alti operatori pentru operatii cu date de tip real, operatori ce opereaza cu date de tip boolean, cu caractere sau cu siruri de caractere. Exista de asemenea operatori relationali care permit compararea a doua date, evident ca de acelasi tip. Similar operatiilor din algebra, operatorii pot fi unari actionand asupra unui singur operand sau binari avand doi operanzi. Limbajele de nivel inalt permit construirea cu ajutorul operatorilor a unor expresii asemanatoare expresiilor algebrice. Termenii expresiei sunt date de acelasi tip sau de tipuri compatibile. La executia programului expresia este evaluata prin aplicarea operatorilor asupra termenilor dupa niste reguli precise. De exemplu

CURS 3

26

expresiile aritmetice se evalueaza ca si in matematica prin efectuarea calculelor de la stanga la dreapta, efectuandu-se intai operatiile multiplicative (inmultiri, impartiri) si apoi cele aditive (adunari, scaderi). Ordinea de efectuare a operatiilor poate fi controlata de programator prin folosirea parantezelor “( )”. Ca si in algebra, o expresie poate sa contina ca termeni si variabile. In programare variabila este o locatie de memorie destinata stocarii pe parcursul executiei programului a unui anumit tip de date. In programare variabila este caracterizata prin nume si tip. Numele permite accesul la datele memorate in acea variabila. Tipul variabilei este acelasi cu tipul datelor pe care este prevazut sa le stocheze aceasta. Daca numele unei variabile apare ca termen intr-o exprsie, la evaluarea acesteia, el este inlocuit cu data memorata in variabila. Pentru a memora o data intr-o variabila (operatie numita de atribuire) unele limbajele de programare de nivel inalt prevad operatorul de atribuire iar altele instructiunea de atribuire cu sintaxa: Desi sintaxa este identica, exista o diferenta intre instructiunea de atribuire si operatia de atribuire. In primul caz, valoarea rezultata din evaluarea expresiei este stocata in locatia de memorie desemnata de . In cel de al doilea caz este ea insasi o expresie a carei valoare este chiar valoarea ce a fost memorata in variabila. o astfel de expresie, incadrata de paranteze rotunde poate sa fie termen intr-o alta expresie. De remarcat este faptul ca prin se intelege chiar si o expresie cu un singur termen si fara nici un operator.

Numere intregi si reale Inainte de a fi folosita intr-un program java, o variabila trebuie sa fie declarata. Declaratia trebuie sa specifice numele si tipul variabilei pentru ca la compilare sa i se aloce un spatiu de memorie suficient pentru a putea stoca date de tipul declarat. De exemplu instructiunea: int scorMaxim; declara o variabila cu numele scorMaxim de tipul int. Denumirea tipulu int provine de la cuvintul englezesc Integer – intreg. Compilatorul va aloca pentru aceasta variabila o locatie de memorie dimensionata sa poata stoca numere intregi cu valori cuprinse intre -2,14 miliarde si +2,14 miliarde. Deoarece inca nu i s-a atribuit acestei variabile o valoare, continutul acestei locatii de memorie este neinitializat, continand o valoare arbitrara. Putem chiar la declarare sa atribuim variabilei o valoare intreaga prin operatorul de atribuire “=”: int scorMaxim = 40000; Instructiunea: float punctajMediu; declara o variabila cu numele punctajMediu de tipul float. Denumirea tipulu float provine de la termenul englezesc Floating point – virgula mobila – care desemneaza modalitatea de codificare a numerelor reale in memoria calculatorului. Deoarece in memorie nu pot fi memorate decat numere

PROGRAMARE IN JAVA - Note de curs

27

intregi, numerele reale sunt memorate ca o pereche de numere intregi. De exemplu modul de codificare in memorie a numarului real 123,456 poate fi prezentat simplificat astfel: numarul este transformat prin deplasarea virgulei in numarul real echivalent 0,123456 103 si memorat sub forma perechii de numere intregi (123456;3). Compilatorul va aloca pentru aceasta variabila o locatie de memorie suficient de incapatoare incat sa permita memorarea unor numere reale reprezentate in virgula mobila. Deoarece inca nu i s-a atribuit acestei variabile o valoare, continutul acestei locatii de memorie este neinitializat, continand o valoare arbitrara. Ca si in cazul variabilelor intregi putem atribui la declararea variabilei de tip float o valoare reala: float punctajMediu = 123.456; Numele variabilelor este un identificator. Un identificator poate fi orice combinatie de litere sau cifre cu conditia sa inceapa cu o litera. Caracterul “_” este asimilat literelor. De exemplu combinatiile Variabila1 sau Variabila_1 sau _X reprezinta identificatori valizi iar combinatiile 1X sau Variabila-1 nu sunt acceptati de compilator fie pentru ca incep cu o cifra ca in primul caz, fie datorita unui caracter care nu este nici litera, nici cifra (-), ca in cel de al doilea caz.

Alte tipuri numerice de variabile Pe langa tipul int limbajul Java mai prevede tipuri derivate pentru variabile care stocheaza date de tip intreg. Tipul byte determina dimensionarea locatiei de memorie pentru a pastra date cuprinse intre –128 si 127. Pentru o variabila de tip byte, compilatorul va aloca o locatie de memorie de un octet in timp ce pentru una de tip int memoria alocata este de 4 octeti. Tipul short determina dimensionarea locatiei de memorie la doi octeti pentru a pastra date cuprinse intre –32768 si 32767 iar tipul long 8 octeti pentrru a stoca numere intregi foarte mari cuprinse intre –9.223.372.036.854.775.808 si 9.223.372.036.854.775.807. Pentru cazul in care se doreste memorarea numerelor reale cu o precizie mai mare (cu mai multe zecimale) spatiul de memorie alocat trebuie dimensionat corespunzator. Pentru astfel de cazuri in locul tipului float se poate folosi tipul double (de la englezescul double precision – precizie dubla).

Caractere si siruri de caractere Asa cum am aratat mai inainte, caracterele desemneaza simboluri grafice cum ar fi litere, cifre, semne de punctuatie, alte semne speciale care pot sa apara intr-un text. Pentru codificarea in memorie a datelor de tip caracter, fiecarui simbol grafic i se asociaza un cod numeric unic – un numar intreg cuprins intre 0 si 255. Exista mai multe standarde pentru codificarea caracterelor, unul dintre acestea fiind codul ASCII. In tabelul de mai jos sunt extrase codurile numerice asociate literelor si cifrelor: Caracter A-Z a-z 0-9

Cod ASCII 65-90 97-122 48-57

CURS 3

28

Datele de tip caracter se reprezinta incadrate de apostroafe. De exemplu ‘C’ reprezinta caracterul C cu codul ASCII 67. O variabila de tip caracter (char) se declara si se initializeaza cu o instructiune de forma; char key = ‘C’; Sirurile de caractere se reprezinta incadrate cu ghilimele, ca de exemplu sirul “Hallo world!” afisat de primul nostru program java. Variabilele de tipul sir de caractere (String) se declara si se initializeaza ca in instructiunea de mai jos: String mesaj = “Hallo world!”; Daca vrem ca String-ul sa contina ghilimele ca in sirul de mai jos: Sunt student la Universitatea “Politehnica” din Bucuresti trebuie sa folosesc in locul ghilimelelor o secventa speciala de caractere \” , numita secventa escape: String mesaj = “Sunt student la Universitatea \“Politehnica\” din Bucuresti”; Acelasi lucru este valabil si pentru caracterul apostrof care se va specifica cu secventa escape \’ ca si pentru caracterul backslash \ folosind \\ . Secventele escape se folosesc si pentru introducerea in sir a unor caractere speciale de control al afisarii specificate in tabelul de mai jos: secventa escape \t \b \r \f \n

Caracter de control tab backspace carriage return formfeed new line

De exemplu folosind secventa escape \n instructiunea: System.out.println(“Aceasta melodie este interpretata de \n formatia RoMania”) Va afisa pe display doua randuri de text: Aceasta melodie este interpretata de formatia RoMania

Tipul de date boolean Java prevede si tipul boolean de date care pot avea doar doua valori, adevarat – true si fals - false. Pentru a memora astfel de date, pot fi declarate variabile de tipul boolean ca in exemplul de mai jos:

PROGRAMARE IN JAVA - Note de curs

29

boolean sfirsitJoc = false;

Exemplu de declarare a variabilelor in program Vom aplica cele discutate mai sus intr-un program concret declarand diverse tipuri de variabile, initializandu-le si afisandule valorile. Aplicatia noastra va consta in definirea clasei Variabile: class Variabile{ public static void main(String[] arguments){ // Declararea si initializarea variabilelor int scorMaxim=40000; double punctajMediu = 123.456; char key = ‘C’; String mesaj = “Hallo world!”; boolean sfirsitJoc = false; // Afisarea valorii variabilelor System.out.println(scorMaxim); System.out.println(punctajMediu); System.out.println(key); System.out.println(mesaj); System.out.println(sfirsitJoc); } }

Variabilele de tipurile discutate au fost declarate in cadrul metodei main care realizeaza si procesarea acestora. Spunem ca aceste variabile sunt locale metodei main. Programul de mai sus va fi editat si salvat in fisierul Variabile.java. Comenzile de compilare si executie a programului continut de fisierul Variabile.java precum si rezultatele afisate sunt redate in figura 3.1.

Figura 3.1 – Compilarea si executia aplicatiei Variabile.java

Exemplu de utilizare a expresiilor Scopul aplicatiei prezentate in continuare este de a face o introducere in modul de utilizare a expresiilor in cadrul unui program Java. class MotanulPacepa{ public static void main(String[] arguments){ int greutate = 3; System.out.println(“Motanul Pacepa cintareste “ + greutate); System.out.println(“Motanul Pacepa viziteaza ulcica cu smintana“); greutate = greutate + 1; System.out.println(“Motanul Pacepa cintareste acum “ + greutate); System.out.println(“Motanul Pacepa descopera gimnastica aerobica“);

30

CURS 3

greutate = greutate - 2; System.out.println(“Motanul Pacepa cintareste acum “ + greutate); System.out.println(“Motanul Pacepa cade in masina automata de ” + “spalat rufe“); greutate = greutate/2; System.out.println(“Motanul Pacepa cintareste acum “ + greutate); System.out.println(“Motanul Pacepa este clonat de 12 ori“); greutate = greutate + (greutate*12); System.out.println(“Cei 13 motani Pacepa cintaresc acum “ + greutate); } }

Programul de mai sus va fi editat si salvat in fisierul MotanulPacepa.java. Comenzile de compilare si executie a programului continut de fisierul Variabile.java precum si rezultatele afisate sunt redate in figura 3.2.

Figura 3.2 Compilarea si executia aplicatiei MotanulPacepa.java In programul de mai sus am utilizat cateva expresii numerice cu rezultat intreg pentru a calcula valori noi pentru variabila greutate atribuite acesteia prin operatorul de atribuire reprezentat cu semnul =. In cadrul acestor expresii au fost folositi operatori aritmetici binari care se aplica la operanzi de tip intreg. Acestia au fost reprezentati prin simbolurile + pentru adunare, - pentru scadere, * pentru si / pentru impartire. In una din expresii au fost folosite parantezele pentru a explicita ordinea de efectuare a operatiilor – ca si in algebra, la calculul expresiilor intai se executa operatiile din paranteze. De fapt o astfel de explicitare nu era necesara deoarece, asa cum am mai spus, implicit, la calculul expresiilor intai se efectueaza operatiile multiplicative si apoi cele aditive. De asemenea in cadrul programului apar frecvent ca argument al metodei System.out.println expresii cu rezultat de tip String cum ar fi de exemplu: “Motanul Pacepa cade in masina automata de ” + “spalat rufe“;

Aici simbolul + desemneaza operatia de concatenare a sirurilor de caractere, avand ca rezultat un String format din inlantuirea celor doi operanzi de tip String. Data de tip String rezultata este tramnsmisa ca argument metodei System.out.println. Prezinta interes si expresiile de forma String + int in care cei doi operanzi sunt de tipuri diferite. In acest caz, in baza unor reguli precise de conversie automata si de compatibilitate a tipurilor de date pe care le vom discuta in detaliu la momentul

PROGRAMARE IN JAVA - Note de curs

31

potrivit, termenul de tip int este convertit la tipul String dupa care se aplica operatorul de concatenare. Astfel in secventa: ... int greutate = 3; System.out.println(“Motanul Pacepa cintareste “ + greutate); ...

expresia “Motanul Pacepa cintareste “ + greutate

este evaluata astfel: 1. termenul greutate care este o variabila de tip int este inlocuit cu valoarea continuta adica 3. 2. Deoarece celalalt termen al expresiei este de tip String, aceasta valoare intreaga este convertita automat la valoarea de tipul String “3”. 3. Cei doi termeni de tip String, “Motanul Pacepa cintareste “ si “3” sunt concatenati rezultand sirul “Motanul Pacepa cintareste 3” care este transmis pentru afisare metodei println a obiectului System.out.

Operatori pentru date de tip intreg In exemplul precedent am vazut o serie de operatori care actioneaza asupra datelor de tip intreg (+, -, *, /). Pe langa acestia, limbajul Java ofera programatorului urmatorii operatori: ¾ operatorul modulo reprezentat in expresii prin simbolul %. Acest operator binar calculeaza restul impartirii intregi a primului operand la cel de al doilea operand. Astfel expresia 14 % 3 are ca rezultat valoarea 2 (restul impartirii lui 14 la 3). ¾ operatorii unari de incrementare reprezentati prin ++ si decrementare reprezentati prin -- au ca efect incrementarea respectiv decrementarea operandului cu 1. Acesti operatori accepta ca operanzi numai variabile de tip intreg. Actiunea acestor operatori depinde de locul pe care il ocupa in raport cu operandul. Daca operatorul de incrementare/decrementare se afla inaintea operandului (il prefixeaza) operandul este incrementat/decrementat iar noua valoare este folosita la evaluarea expresiei. In acest caz operatia efectuata asupra operandului se numeste preincrementare/predecrementare. Astfel daca variabila x contine valoarea 3, continutul lui x dupa aplicarea operatorului ++ este 4 iar valoarea rezultata din evaluarea expresiei ++x este 4, aceasta expresie fiind echivalenta cu expresia x = x + 1. Similar stau lucrurile si in cazul predecrementarii lui x. Expresia --x are valoarea 2, iar x va contine valoarea 2 dupa aplicarea operatorului de predecrementare. Expresia –x este echivalenta cu expresia x = x – 1. Cu totul altfel stau lucrurile in cazul in care operatorul de incrementare/decrementare se afla amplasat dupa operand (il postfixeaza). In acest caz operatia se numeste postincrementare/postdecrementare. In acest caz la evaluarea expresiei se foloseste valoarea continuta de operand. Abia dupa ce expresia a fost evaluata continutul variabilei careia i s-a aplicat operatia de postincrementare/postdecrementare este marit/micsorat cu 1. Astfel daca variabila x contine valoarea 3, continutul lui x dupa aplicarea operatorului ++ este 4 iar valoarea rezultata din evaluarea expresiei x++ este 3 deoarece la evaluarea ei s-a folosit valoarea continuta de x. Abia dupa ce expresia a fost evaluata se incrementeaza x. Similar, dupa evaluarea expresiei x—valoarea rezultata este 3 iar variabila x va contine valoarea 2.

CURS 3

32 ¾

Foarte des in programe apar atribuiri de forma: = unde este unul din operatorii +, -, *, / sau % , cum ar fi de exemplu x= x + 2 sau greutate = greutate + (greutate*12). Limbajul Java ofera posibilitatea de a scrie simplificat astfel de expresii folosind operatorii += , -=, *=, /= si %=. Astfel in loc de x= x+2 vom putea scrie x+=2 iar inloc de greutate = greutate + (greutate*12) putem scrie greutate+= (greutate*12).

Precedenta Operatorilor Asa cum am mai spus expresiile numerice se evalueaza de la stanga spre dreapta, intai efectuandu-se operatiile multiplicative (*, /,%) iar apoi cele aditive (+,-). Astfel de exemplu ordinea efectuarii operatiilor la evaluarea expresiei 6*2/4+5*3 este prezentata in figura 3.3. Trebuie avute in vedere urmatoarele aspecte: 1. Daca se codifica o expresie algebrica in program trebuie avuta in atentie ordinea de efectuarea operatiilor. Astfel de exemplu pentru a codifica expresia:

x y ⋅ z vom fi tentati sa scriem: x/y*z

Figura 3.3 – Ordinea de efectuare a operatiilor si precedenta operatorilor ceea ce este incorect. La evaluare se va imparti variabila x la variabila y iar rezultatul obtinut se va inmulti cu variabila z. Aceasta ar corespunde de fapt expresiei algebrice:

x y

⋅ z

O varianta de codificarea corecta in program este expresia:

PROGRAMARE IN JAVA - Note de curs

33

x/y/z impartind pe x la y si rezultatul astfel obtinut la z. O alta varia nta ar fi explicitarea ordinii dorite a efectuarii operatiilor prin folosirea parantezelor: x/(y*z) In acest caz se efectueaza intai operatiile din paranteze adica se inmulteste y cu z iar apoi variabila x este impartita la rezultatul astfel obtinut. 2. Neacordarea atentiei cuvenite ordinii de efectuare a operatiilor poate duce uneori la rezultate eronate. Astfel avand in vedere ca expresia 2/3 fiind o expresie cu termeni intregi, va avea si valoarea rezultata din evaluare tot o valoare intreaga. Astfel valoarea rezultata este 0. Avand deci in vedere ca expresia n/m (unde n si m sunt date de tip intreg ) are valoarea 0 daca n Warp speed table WELCOME TO GALAXY CLASS STARSHIP,USS Entreprise 1701-D, TO EXPLORE STRANGE, NEW WORLDS, TO SEEK OUT NEW LIFE, AND NEW CIVILISATIONS,TO BOLDLY GO WHERE NO ONE HAS GONE BEFORE. Stardate 48030.4581 The USS Entreprise, NCC -1701-D, is a Galaxy class starship built at the Utopia Plannitia Fleet Yards above Mars. It was comissioned in 2363, and is currently under command of Captain JeanLuc Picard. This latest starship is Starfleet‘s flagship and has already distingueshed in an impressive number of significant missions of

354

CURS 28

exploration, as well as in several crucial incidents defending the security of the Federation.

Fig.28.10 Utilizarea tabelelor pentru alinierea imaginii cu textul

PROGRAMARE IN JAVA - Note de curs

355

Curs 29 Ancore si legaturi Spatiul de afisare in fereastra browserului este limitat. Daca informatia continuta in document este mare, regasirea unui anume subiect prin cautare in toata pagina este dificila. Este ca si cand am avea o carte fara cuprins pe care am dori sa o deschidem la un anumit capitol. Pentru aceasta ar trebui sa o rasfoim cautand titlul capitolului dorit. HTML permite organizarea documentului prin definirea a hiperlegaturilor, puse in evidenta in textul paginii printr-o culoare distincta. Utilizatorul poate “naviga” prin document clicaind cu mouseul pe hiperlegaturi, browserul deruland automat pagina pana cind informatia asociata acestora apare in fereastra. In plus culoarea hiperlegaturii se schimba pentru ca utilizatorul sa stie ca a “vizitat-o” deja cel putin odata. Hiperlegaturile se bazeaza pe marcajul HTML tip ancora ,(Anchor) avand sintaxa: … Text_evidentiat …

Aceasta este o trimitere catre o zona din document marcata la randul sau cu o ancora avand sintaxa: … …

Text_evidentiat este textul care va apare in pagina colorat distinct si subliniat. Acest mecanism este cel care transforma documentele HTML din simple texte in hipertexte - pagini interactive organizate cu ajutorul hiperlegaturilor, folosite de utilizator pentru a se “teleporta” de la o zona la alta. Listingul 29.1 si figura 29.1 arata modul de folosire a hiperlegaturilor in cadrul documentului HTML. Listing 29.1 - Links.html USS Entreprise - Home Page WELCOME TO GALAXY CLASS STARSHIP,USS Entreprise 1701-D, TO EXPLORE STRANGE, NEW WORLDS, TO SEEK OUT NEW LIFE, AND NEW CIVILISATIONS,TO BOLDLY GO

356

CURS 29

WHERE NO ONE HAS GONE BEFORE. Stardate 48030.4581 The USS Entreprise, NCC -1701-D, is a Galaxy class starship built at the Utopia Plannitia Fleet Yards above Mars. It was comissioned in 2363, and is currently under command of Captain JeanLuc Picard. This latest starship is Starfleet‘s flagship and has already distingueshed in an impressive number of significant missions of exploration, as well as in several crucial incidents defending the security of the Federation. MISSION OBJECTIVES SPECIFICATIONS MISSION OBJECTIVES FOR GALAXY CLASS PROJECT Starfleet has long been charged with a broad spectrum of responsibilities to the citizens of the Federation and to the lifeforms of the galaxy at large. As the volume of explored space continues to grow, and with it the Federation itself, so do Starfleet's duties. These duties range from relatively mundane domestic and civil missions, to cultural contact and diplomacy, to defense, to our primary mission of exploration and research. Many of these responsibilities are best carried out with relatively small, specialized ships. Yet there continues to be an ongoing need for a small number of larger, multimission vehicles that are capable of implementing the complete range of Starfleet's objectives. This need has in fact grown as the volume of relatively unexplored space within Federation influence continues to expand. The Galaxy class starship represents Starfleet's most sophisticated achievement in multimission ship systems design. Go to top SPECIFICATIONS PROPULSION MISSION ENVIRONMENT/CREW TACTICAL DESIGN LIFE Go to top PROPULSION Sustainable cruise velocity of Warp Factor 9.2. Ability to maintain speeds of up to Warp 9.6 for periods of up to twelve hours. Fifth-phase dilithium controlled matter/antimatter reactor primary power.Sustainable field output to exceed 1,650 cochranes, peak transitional surge reserve to exceed 4,225% of nominal output (170 ns phase). Warp driver coils efficiency to meet or exceed 88% at speeds up to Warp 7.0. Minimum efficiency of 52% to be maintained through Warp 9.1. Life cycle of all primary coil elements to meet or exceed 1,200,000 cochrane-hours between neutron purge refurbishment. Secondary coil elements to meet or exceed 2,000,000 cochrane-hours between neutron purge refurbishment. warp field geometry to incorporate modified 55¡ Z-axis compression characteristics on forward warp lobe for increased peak transitional efficiency. Warp nacelle center-lines to conform to 2.56:1 ratio of separation to maximum field strength. Secondary (impulse) propulsion system to provide sublight velocities up to and including 0.92 lightspeed (c). Engine systems of choice to include but are not limited to at least two YPS 8063 fusion drive motors. All units to be equipped with subspace driver accelerators, field output not less than 180 millicochranes at 1.02 x 10¦K. Reactor modules to be fieldreplaceable. Independent impulse propulsion system of choice for primary hull to include but not be limited to YPS 8055 fusion drive motors. Go to top MISSION Ability to operate independent of starbase refurbishment for extended periods. Independent exploration mode capability of seven Standard years at nominal Warp 6 velocity for docked configuration.

PROGRAMARE IN JAVA - Note de curs

357

Ability to execute deep- space exploration missions including charting and mapping, first cultural contact scenarios, and full biologic and ecologic studies. Space allocation for mission-specific facilities: Habitable area to include 800,000 m® for mission-adaptable facilities including living quarters for mission-specific attached personnel. Ability to support a wide range of mission-related ongoing research and other projects (including sufficient habitable volume and power generation for facilities and operations) without impact on primary mission operations. Full spectrum EM, optical, subspace flux, gravimetric, particle, and quark population analysis sensor capability. Multimode neutrino interferometry instrumentation. Wide-band life sciences analysis capability pursuant to Starfleet life contact policy directive. Twometer diameter gamma ray telescope. Upgradable experiment and sensor array design. Ability to support both on-board and probe-mounted science instrumentation. Support facilities for auxiliary spacecraft and instrumented probes needed for short-range operations to include at least two independent launch, resupply, and repair bays. Go to top ENVIRONMENT/CREW Environmental systems to conform to Starfleet Regulatory Agency (SFRA)- standard 102.19 for Class M compatible oxygen-breathing personnel. All life- critical systems to be triply redundant. Life support modules to be replaceable at major starbase layover to permit vehiclewide adaptation to Class H, K, or L environmental conditions. Ability to support up to 5,000 non-crew personnel for missionrelated operations. Facilities to support Class M environmental range in all individual living quarters, provisions for 10% of quarters to support Class H, K, and L environmental conditions. Additional 2% of living quarters volume to be equipped for Class N and N(2) environmental adaptation. All habitable volumes to be protected to SFRA-standard 347.3(a) levels for EM and nuclear radiation. Subspace flux differential to be maintained within 0.02 millicochranes. Go to top TACTICAL Defensive shielding systems to exceed 7.3 x 10° kW primary energy dissipation rate. All tactical shielding to have full redundancy, with auxiliary system able to provide 65% of primary rating. Tactical systems to include full array of Type X phaser bank elements on both primary and stardrive (battle) sections capable of 5.1MW maximum single emitter output. Two photon torpedo launchers required for battle section, one auxiliary launcher in primary hull. Ability to separate into two autonomous spacecraft comprising a battle section, capable of warp flight and optimized for combat, and a primary section capable of impulse flight and defensive operations Full independent sublight operational capability for command section in Separated Flight Mode. Go to top DESIGN LIFE Spaceframe design life of approximately one hundred years, assuming approximately five major shipwide system swapouts and upgrades at average intervals of twenty years. Such upgrades help insure the continuing usefulness of the ship even though significant advances in technology are anticipated during that time. Minor refurbishment and upgrade to occur at approximately one-to five-year intervals, depending on specific mission requirements and hardware availability. Go to top

358

CURS 29

Fig.29.1a

Fig.29.1b

Fig.29.1c

PROGRAMARE IN JAVA - Note de curs

359

In figura 29.2 este prezentata diagrama legaturilor implementate in documentul HTML din exemplul nostru. Legaturile pot face trimiteri nu numai in cadrul aceluiasi document HTML ci pot referi documente HTML amplasate in alte fisiere. Astfel in cazul exemplului precedent este mai rational din punct de vedere structural ca informatiile privind obiectivele misiunii si specificatiile navei stelare Entreprise 1701-D sa fie inscrise in doua fisiere distincte denumite MissionObj.HTML si Specs.HTMLaccesul la acestea facandu-se prin legaturi din documentul principal continut intr-un fisier denumit de exemplu Index.HTML care joaca un rol similar cu cuprinsului unei carti. Sintaxa pentru o astfel de legatura la un document extern este : … Text_evidentiat …

Legaturile pot sa refere nu numai un anumit document ci si o pozitie specifica din acesta. In acest caz sintaxa legaturii este: … Text_evidentiat …

Zona referita de o astfel de legatura se marcheaza cu o ancora avand sintaxa: … Text_evidentiat …

Structura ansamblului de documente HTML interconectate prin legaturi este redata in figura 29.3. Continutul documentului Index.HTML este cel redat in Listingul 29.2 iar al fisierelor MissionObj.HTML si Specs.HTML in Listingul 29.3 respectiv 29.4. Explorarea cu navigatorul a acestui pachet de pagini Web este prezentata in figurile 29.4a si 29.4b.

360

CURS 29

Fig.29.2 Legaturi in documentul Links.HTML

Fig.29.3 Structura unui ansamblu de documente HTML interconectate prin legaturi

PROGRAMARE IN JAVA - Note de curs

361

Listing 29.2 - Index.html USS Entreprise - Home Page WELCOME TO GALAXY CLASS STARSHIP,USS Entreprise 1701-D, TO EXPLORE STRANGE, NEW WORLDS, TO SEEK OUT NEW LIFE, AND NEW CIVILISATIONS,TO BOLDLY GO WHERE NO ONE HAS GONE BEFORE. Stardate 48030.4581 The USS Entreprise, NCC -1701-D, is a Galaxy class starship built at the Utopia Plannitia Fleet Yards above Mars. It was comissioned in 2363, and is currently under command of Captain JeanLuc Picard. This latest starship is Starfleet‘s flagship and has already distingueshed in an impressive number of significant missions of exploration, as well as in several crucial incidents defending the security of the Federation. MISSION OBJECTIVES SPECIFICATIONS PROPULSION MISSION ENVIRONMENT/CREW TACTICAL DESIGN LIFE Listing 29.3 - MissionObj.html USS Entreprise - Mission Objectives MISSION OBJECTIVES FOR GALAXY CLASS PROJECT Starfleet has long been charged with a broad spectrum of responsibilities to the citizens of the Federation and to the lifeforms of the galaxy at large. As the volume of explored space continues to grow, and with it the Federation itself, so do Starfleet's duties. These duties range from relatively mundane domestic and civil missions, to cultural contact and diplomacy, to defense, to our primary mission of exploration and research. Many of these responsibilities are best carried out with relatively small, specialized ships. Yet there continues to be an ongoing need for a small number of larger, multimission vehicles that are capable of implementing the complete range of Starfleet's objectives. This need has in fact grown as the volume of relatively unexplored space within Federation influence continues to expand. The Galaxy class starship represents Starfleet's most sophisticated achievement in multimission ship systems design. Go to home page Listing 29.4 - Specs.html USS Entreprise - Specifications

362

CURS 29

SPECIFICATIONS PROPULSION Sustainable cruise velocity of Warp Factor 9.2. Ability to maintain speeds of up to Warp 9.6 for periods of up to twelve hours. Fifth-phase dilithium controlled matter/antimatter reactor primary power.Sustainable field output to exceed 1,650 cochranes, peak transitional surge reserve to exceed 4,225% of nominal output (170 ns phase). Warp driver coils efficiency to meet or exceed 88% at speeds up to Warp 7.0. Minimum efficiency of 52% to be maintained through Warp 9.1. Life cycle of all primary coil elements to meet or exceed 1,200,000 cochrane-hours between neutron purge refurbishment. Secondary coil elements to meet or exceed 2,000,000 cochrane-hours between neutron purge refurbishment. warp field geometry to incorporate modified 55¡ Z-axis compression characteristics on forward warp lobe for increased peak transitional efficiency. Warp nacelle center-lines to conform to 2.56:1 ratio of separation to maximum field strength. Secondary (impulse) propulsion system to provide sublight velocities up to and including 0.92 lightspeed (c). Engine systems of choice to include but are not limited to at least two YPS 8063 fusion drive motors. All units to be equipped with subspace driver accelerators, field output not less than 180 millicochranes at 1.02 x 10¦K. Reactor modules to be fieldreplaceable. Independent impulse propulsion system of choice for primary hull to include but not be limited to YPS 8055 fusion drive motors. Go to home page MISSION Ability to operate independent of starbase refurbishment for extended periods. Independent exploration mode capability of seven Standard years at nominal Warp 6 velocity for docked configuration. Ability to execute deep- space exploration missions including charting and mapping, first cultural contact scenarios, and full biologic and ecologic studies. Space allocation for mission-specific facilities: Habitable area to include 800,000 m® for mission-adaptable facilities including living quarters for mission-specific attached personnel. Ability to support a wide range of mission-related ongoing research and other projects (including sufficient habitable volume and power generation for facilities and operations) without impact on primary mission operations. Full spectrum EM, optical, subspace flux, gravimetric, particle, and quark population analysis sensor capability. Multimode neutrino interferometry instrumentation. Wide-band life sciences analysis capability pursuant to Starfleet life contact policy directive. Twometer diameter gamma ray telescope. Upgradable experiment and sensor array design. Ability to support both on-board and probe-mounted science instrumentation. Support facilities for auxiliary spacecraft and instrumented probes needed for short-range operations to include at least two independent launch, resupply, and repair bays. Go to home page ENVIRONMENT/CREW Environmental systems to conform to Starfleet Regulatory Agency (SFRA)- standard 102.19 for Class M compatible oxygen-breathing personnel. All life- critical systems to be triply redundant. Life support modules to be replaceable at major starbase layover to permit vehiclewide adaptation to Class H, K, or L environmental conditions. Ability to support up to 5,000 non-crew personnel for missionrelated operations. Facilities to support Class M environmental range in all individual living quarters, provisions for 10% of quarters to support Class H, K, and L environmental conditions. Additional 2% of living quarters volume to be equipped for Class N and N(2) environmental adaptation.

PROGRAMARE IN JAVA - Note de curs

363

All habitable volumes to be protected to SFRA-standard 347.3(a) levels for EM and nuclear radiation. Subspace flux differential to be maintained within 0.02 millicochranes. Go to home page TACTICAL Defensive shielding systems to exceed 7.3 x 10° kW primary energy dissipation rate. All tactical shielding to have full redundancy, with auxiliary system able to provide 65% of primary rating. Tactical systems to include full array of Type X phaser bank elements on both primary and stardrive (battle) sections capable of 5.1MW maximum single emitter output. Two photon torpedo launchers required for battle section, one auxiliary launcher in primary hull. Ability to separate into two autonomous spacecraft comprising a battle section, capable of warp flight and optimized for combat, and a primary section capable of impulse flight and defensive operations Full independent sublight operational capability for command section in Separated Flight Mode. Go to home page DESIGN LIFE Spaceframe design life of approximately one hundred years, assuming approximately five major shipwide system swapouts and upgrades at average intervals of twenty years. Such upgrades help insure the continuing usefulness of the ship even though significant advances in technology are anticipated during that time. Minor refurbishment and upgrade to occur at approximately one-to five-year intervals, depending on specific mission requirements and hardware availability. Go to home page

Se observa ca acum, cand informatia este distribuita in mai multe documente, structura acestora este mult mai clara. Fisierele de resurse referite intr-un document HTML nu trebuie sa se afle pe acelasi calculator cu acesta putand sa fie amplasate pe alte calculatoare server WWW. In acest caz fisierul tinta referit se specifica prin URL-ul acestuia. De exemplu pentru a prevedea o legatura cu banca de date a Federatiei, aflata pe un server WWW al Guvernului, pe Tera, capitanul Picard a localizat-o in pagina sa de Web prin urmatorul URL: http://www.Fed.guv/DataBank.HTML

Fig.29.4a

364

CURS 29

Fig.29.4b In listingul 29.5 se vede cum a adaugat Picard referirea la aceasta resursa in Index.HTML iar in figura 29.4a si b rezultatul incarcarii acestei resurse de catre navigator. Listing 29.5 - Index.html USS Entreprise - Home Page WELCOME TO GALAXY CLASS STARSHIP,USS Entreprise 1701-D, TO EXPLORE STRANGE, NEW WORLDS, TO SEEK OUT NEW LIFE, AND NEW CIVILISATIONS,TO BOLDLY GO WHERE NO ONE HAS GONE BEFORE. Stardate 48030.4581 The USS Entreprise, NCC -1701-D, is a Galaxy class starship built at the Utopia Plannitia Fleet Yards above Mars. It was comissioned in 2363, and is currently under command of Captain JeanLuc Picard. This latest starship is Starfleet‘s flagship and has already distingueshed in an impressive number of significant missions of exploration, as well as in several crucial incidents defending the security of the Federation. FEDERATION DATABANK MISSION OBJECTIVES SPECIFICATIONS PROPULSION MISSION ENVIRONMENT/CREW TACTICAL DESIGN LIFE

Liste Se observa ca in documentul Index.HTML apare o insiruire de legaturi la alte resurse. Limbajul HTML permite gruparea a mai multor blocuri de text in liste formatate. Si in cazul documentului nostru, este rational din punct de vedere structural sa grupam

PROGRAMARE IN JAVA - Note de curs

365

legaturile din pagina Web intr-o astfel de lista. HTML asigura mai multe formate diferite pentru liste: • neordonate (marcate cu buline) • ordonate (numerotate secvential) • de tip director (cu elementele aliniate pe orizontala) • de tip meniu (simple fara buline sau numerotare) Listele neordonate se definesc cu marcajele , cele ordonate cu marcajele , cele director delimitate cu , iar cele meniu cu ,. Elementele listei se delimiteaza cu marcajele ,.

Fig.29.5a

Fig.29.5b Structura de definire a unei liste este: element 1 element 2 …………………….

366

CURS 29

element n unde TIP este unul din marcajele UL,OL,DIR sau MENU. Elementele listei sunt blocuri de text ce pot contine si marcaje HTML. In listingul 29.6 si figura 29.6 este exemplificata utilizarea listelor ordonate si neordonate. Listing 29.6 - List.html USS Entreprise - Home Page WELCOME TO GALAXY CLASS STARSHIP,USS Entreprise 1701-D, TO EXPLORE STRANGE, NEW WORLDS, TO SEEK OUT NEW LIFE, AND NEW CIVILISATIONS,TO BOLDLY GO WHERE NO ONE HAS GONE BEFORE. Stardate 48030.4581 The USS Entreprise, NCC -1701-D, is a Galaxy class starship built at the Utopia Plannitia Fleet Yards above Mars. It was comissioned in 2363, and is currently under command of Captain JeanLuc Picard. This latest starship is Starfleet‘s flagship and has already distingueshed in an impressive number of significant missions of exploration, as well as in several crucial incidents defending the security of the Federation.

Fig.30.1 a executia scriptului Java

Fig.30.1 b afisarea documentului HTML In acest exemplu scriptul Java face urmatoarele: • inscrie in bara de stare a ferestrei sirul de caractere “Hallo World!”. • creaza o fereastra cu mesajul “Uitativa in bara de stare!” si un buton de confirmare. • astepta apasarea butonului. • dupa apasarea butonului, programul se termina.

386

CURS 30

Se observa ca desi documentul HTML a fost incarcat (titlul sau apare in bara de titlu a ferestrei si scriptul Java se executa )el nu a fost afisat pana cind nu s-a terminat executia scriptului. Scripturile Java pot fi amplasate oriunde in document. Putem sa folosim oricate perechi de marcaje , in cadrul documentului.cu urmatoarele observatii: • Definitiile de functii JavaScript (vom vedea mai tarziu ce sunt astea) se plaseaza obligatoriu in antetul documentului: Pagina Web cu functii JavaScript function func1(a,b,c){ … instructiuni JavaScript ale functiei func1 … } function func2(x,y,z){ … instructiuni JavaScript ale functiei func2 … } ……………………………………………….. function funcN(u,v,w){ … instructiuni JavaScript ale functiei funcN … } … corpul documentului HTML … • Functiiile trebuiesc definite inainte sa fie apelate. Functiile sunt sectiuni de cod JavaScript care realizeaza la executie o anumita prelucrare a datelor transmise ca argument (a,b,c in cazul functiei func1 sau x,y,z, in cazul lui func2 sau u,v,w in cazul lui funcN) ca si cand ar fi un fel de mini-programe. Ulterior, in alte sectiuni ale codului JavaScript din document, atunci cand este nevoie de o astfel de procesare a unor date, se apeleaza la serviciile functiei corespunzatoare. Apelul functiei se face prin numele acesteia transmitandu-I-se si argumente concrete pe care ea sa le prelucreze(de exemplu func2(3,5,7) este un apel la functia func2. In urma apelului, func2 incepe sa fie executata de browser prelucrand argumentele x, y, si z ale caror valori sunt initializate cu valorile specificate la apelul functiei, respectiv x=3, y=5 si y=7) Conditia ca acest mecanism sa functioneze este ca definitia functiei sa se gaseasca in documentul HTML inainte de sectiunea in care se produce apelul ei ca in exemplul din listimngul 30.3. Rezultatul executiei acestui script este redat in figura 30.2. Listing 30.3 – JavaLand.HTML Welcome to Java Land Bine ati venit”+unde+”!”); }//-->

Fig.30.2 Apelul functiilor • Tot codul JavaScript, inclusiv definitiile functiilor exista si sunt vizibile numai in cadrul paginii in care sunt prevazute. Daca vrem sa folosim acelasi cod si in alte pagini, trebuie sa il transcriem in toate paginile. • Scripturile Java este bine sa fie incadrate intre marcajele HTML de comentarii pentru ca sa nu fie afisate ca simplu text de browserele non-JavaScript ca in cazul documentului din listingul 30.4 Listing 30.4 – BunVenit.HTML Bun venit function bunVenit(unde){ document.write(“Bine ati venit”+unde+”!”); } bunVenit(“la noi”);

Un browser JavaScript va afisa in fereastra sa textul generat de functia bunVenit ca in cazul din figura 30.3.

Fig.30.3 Documentul BunVenit.HTML afisat de un browser JavaScript Un browser non-JavaScript ar afisa insa in ferseastra sa ceva in genul textului din figura 30.4, fara a interpreta programul nostru.

CURS 30

388

Fig.30.4 Documentul BunVenit.HTML afisat de un browser non-JavaScript Pentru a face invizibil codul JavaScript pentru browserele non-JavaScript, el trebuie incadrat de marcajele de comentariu . Pe de alta parte, marcajul -- > trebuie precedat de doua caractere “slash” (//) pentru a fi ignorat de interpretorul JavaScript al browserului ce executa codul. Combinatia // desemneaza un comentariu in limbajul JavaScript, interpretorul ignorand textul ce ii urmeaza pana la capatul randului. In caz contrar, combinatia de caractere -- > ar fi semnalata ca eroare deoarece nu face parte din limbaj si nu este “inteleasa” de interpretor. Listingul 3.5 exemplifica cum se ascunde codul scriptului pentru a nu fi afisat de browserele non-JavaScript. Listing 30.5 – Bun_Venit.HTML Welcome to Java Land Bine ati venit”+unde+”!”);// JavaScript }//- ->

• Nu conteaza unde sunt amplasate instructiunile scriptului in documentul HTML. Ele sunt intotdeauna interpretate ( executate ) dupa ce browserul a incarcat tot documentul dar inainte ca acesta sa fie afisat in fereastra.

Obiecte In viata de zi cu zi suntem obisnuiti sa avem de a face cu diferite obiecte, unele avand o structura simpla, altele destul de complexe, cum ar fi diferite echipamente electronice, masini, avioane, etc. sa luam ca obiect de referinta un televizor. Acest obiect cand este in functiune, are o serie de caracteristici, o sa le numim proprietati, cum ar fi starea (pornit/standby), luminozitatea (0..100%), contrastul (0..100%), saturatia de culoare (0..100%), volum sonor(0..100%), ton sonor (0..100%), 40 de canale avand fiecare asociata o frecventa de receptie. Setarea, acestor proprietati nu

PROGRAMARE IN JAVA - Note de curs

389

se face umbland cu surubelnita si letconul in maruntaiele sale (desi acest lucru este posibil, nu este recomandabil). Pentru aceasta televizorul nostru este prevazut cu telecomanda sau cu butoane de reglaj. Actionand asupra tastelor telecomenzii sau asupra butoanelor de reglaj, putem activa niste functii interne ale televizorului care actioneaza asupra proprietatilor modificandu-le la valorile dorite. Avind la dispozitie acest mecanism, utilizatorul nu trebuie sa cunoasca schema de principiu si de montaj a televizorului si sa fie un priceput electronist pentru a-l putea folosi. Iata un alt exemplu – un joc electronic ca cel din figura 30.5.

Fig.30.5 – Joc electronic Jocul este de fapt o cutie despre continutul careia nu stim nimic, o asa numita cutie neagra prevazuta cu o interfata cu butoane de comanda. Aceasta cutie conectata la un televizor, genereaza o imagine reprezentand pe ecran niste obiecte virtuale, de exemplu doua nave cosmice, avand si ele proprietati ca si obiectele reale: coordonatele fiecarei nave, cantitatea de combustibil in rezervoarele acestora, munitia disponibila, gradul de distrugere, directia si viteza de deplasare, etc. Proprietatile acestor obiecte virtuale se modifica actionand asupra comenzilor: accelereaza, franeaza, schimba directia, trage un proiectil, realimenteaza cu combustibil, etc. Apasarea tastelor de comanda determina cutia neagra sa initieze actiuni al caror rezultat consta in modificarea proprietatilor obiectelor virtuale reprezentate pe ecran. Datorita imaginatiei cu care este inzestrat, omul interpreteaza imaginea de pe ecran a navei spatiale ca pe un obiect asemanator celor din lumea reala – doar ca acest obiect evolueaza (isi modifica proprietatile) in spatele ecranului, intr-o lume virtuala. Aceasta nu il impiedica pe utilizator sa foloseasca comenzile pentru a manevra obiectul in fel si chip, ore intregi, ca si cand ar fi o jucarie reala, palpabila. Este drept ca acest obiect nu este intrutotul virtual fiind conectat la lumea reala printr-o interfata reala, pe care utilizatorul o tine strins si o butoneaza cu frenezie.

390

CURS 30

In figura 30.6 este reprezentata schematic aceasta legatura intre obiectul virtual si lumea reala prin intermediul interfetei.

Fig.30.6 Legatura dintre lumea reala si obiectul virtual prin interfeta In mod asemanator, in programarea orientata obiect, programatorul lucreaza cu obiecte virtuale asemanatoare celor prezentate. Sa analizam cazul unui joc pe calculator care simuleaza o batalie aeriana. Utilizatorul conduce avionul virtual de pe ecran cu ajutorul unui joystick similar cu mansa unui avion de vanatoare. Acest dispozitiv este interfata avionului virtual OV1 cu utilizatorul. Pana aici lucrurile stau asemanator cu cazul precedent. Dar cine conduce atunci avioanele inamice? In cazul precedent conducea partenerul de joc. Acum insa partenerul de joc este chiar calculatorul, mai precis un program manager al obiectelor virtuale. De fapt managerul este cel care prin intermediul driverului de interfata cu joystick-ul preia comenzile date de jucator le interpreteaza si le retransmite avionului virtual pilotat de acesta. Pentru celalalte obiecte virtuale ( avioane, rachete lansate)el elaboreaza singur comenzi pe baza unor strategii de joc prin care simuleaza comportamentul unor piloti inamici in cazul avioanelor sau sistemele de ghidarea automata in cazul rachetelor. Relatia utilizator – manager obiecte virtuale este reprezentata schematic in figura 30.7.

PROGRAMARE IN JAVA - Note de curs

391

Fig.30.7 Obiecte virtuale conduse de program Aceasta figura ne sugereaza mai curand o schema de conexiuni hardware decat o schema logica uzitata candva la proiectarea software-ului procedural. Intr-adevar, metodologia programarii orientate pe obiecte foloseste obiecte abstracte software, definite de programator pe care le asambleaza impreuna pentru a realiza un obiect abstract mai complex, exact la fel cum in proiectarea hardware se folosesc circuitele integrate (tot un fel de cutii nergre – nu trebuie sa le cunoastem schema pentru a le folosi – prevazute cu o interfata pentru aplicarea semnalelor de intrare)- pentru realizarea unor module hardware ca in figura 30.8. Modulele la randul lor intra in componenta unui sistem mai complex, cum ar fi un calculator sau un televizor. Acesta este la randul sau un obiect ale carui detalii de realizare sunt ascunse utilizatorului, fiind inchis (incapsulat) intr-o carcasa sigilata.Pentru a putea fi folosit, este prevazut cu o interfata (butoane, telecomanda) pin intermediul careia comunica cu utilizatorul .

Fig.30.8 Interconectarea a doua microchip-uri intr-in modul hardware Un obiect virtual, cum ar fi imaginea unui avion pe ecranul computerului, este asemanator cu varful unui iceberg. Asa cum icebergul are sub apa cea mai mare parte din volumul sau, si obiectul virtual are in spate, invizibil, un obiect software care incapsuleaza laolalta datele privind proprietatile si logica de comanda a actiunilor de modificare a acestora. Putem reprezenta schematic acest obiect ca in figura 30.9.

CURS 30

392

Fig.30.9 Obiectul software si obiectul virtual Evolutia pe ecran a avionului virtual este rezultatul afisarii imaginii sale in urma modificarii proprietatilor obiectului software (cum ar fi coordonatele ecran) prin executarea unei actiuni comandate prin interfata de catre un modul exterior. Actiunile de care este capabil obiectul se numesc metode asa cum datele sale interne se numesc proprietati. In programarea obiect stricta, proprietatile obiectului nu pot fi modificate direct din exterior (se spune ca sunt proprietati private ale obiectului). Modificarea lor din exteriorul obiectului este permisa numai indirect, prin apel la metodele publice ale obiectului (pot exista si metode private ce pot fi solicitate numai de alte metode ale obiectului - publice sau private – dar nu pot fi apelate din exterior).

Fereastra Browserului Ferestrele afisate de browserele HTML sunt obiecte avand proprietati si metode publice. Fereastra afisata de browser poate fi comandat prin instructiuni JavaScript incluse in documentul HTML incarcat in sensul modificarii proprietatilor si apelarii metodelor oferite de obiectul fereastra. In codul JavaScript, obiectul fereastra este desemnata prin numele window. Sa analizam intai care sunt proprietatile obiectului window. • Proprietatea status In partea de jos a ferestrei se afla bara de stare in care browserul afiseaza diferite mesaje care de regula il informeaza pe utilizator asupra desfasurarii procesului de incarcare a documentului HTML solicitat (vezi figura 30.10). Un astfel de mesaj este de exemplu Document Done inscris de browser in bara de stare pentru a semnala ca a terminat de incarcat si afisat o pagina Web. Ca proprietar al ferestrei in care este afisat documentul in care este incorporat, codul JavaScript are dreptul sa-si afiseze propriile

PROGRAMARE IN JAVA - Note de curs

393

Fig.30.10 – fereastra browserului si bara de stare mesaje in bara de stare. Pentru aceasta nu are decat sa seteze proprietatea status a obiectului window astfel ca aceasta sa contina sirul de caractere al mesajului. Sintaxa instructiunii care realizeaza aceasta operatie este: window.status = “mesajul JavaScript trebuie inscris intre ghilimele” ; Ca urmare a atribuirii de mai sus textul mesajului (fara ghilimelele ce il incadreaza in instructiune ) va aparea in bara de stare a ferestrei. • Proprietatea opener La lansarea in executie, browserul deschide pe ecran o prima fereastra. Din aceasta fereastra utilizatorul poate selectind din meniul File optiunea NewWindow (vezi figura 30.11) sa deschida alte noi ferestre, identice cu prima, in fiecare putand sa fie afisata o alta pagina de Web.

Fig.30.11 – Deschiderea unei noi ferestre Din fiecare fereastra la randul sau se pot deschide alte ferestre, etc. Proprietatea opener a unei ferestre date contine o referinta la fereastra parinte a acesteia. Asa cum vom vedea mai departe o fereastra noua poate fi deschisa si prin program apeland metoda open. Folosind informatia din proprietatea opener, un script java executat de aceasta noua fereastra poate accesa proprietatile si metodele ferestrei parinte. De exemplu un script java dintr-o fereastra copil poate afisa un mesaj in bara de titlu a ferestrei parinte cu instructiunea : window.opener.status = “Salutari, batrane!” ; • Proprietatatile frames Aceasta proprietate este un tablou de referinte la frame-urile ferestrei. Fiecare intrare in tablou este o referinta la un frame descendent al unui FRAMESET parinte. De

CURS 30

394

exemplu daca fereastra este divizata in dou frame-uri, primul este referit de frames[0] si al doilea de frames[1]. Numarul de frame-uri al ferestrei se poate obtine din proprietatea frames.length care contine indexul in tablou al ultimului frame(in cazul exemplului nostru frames.length are valoarea 1). Frame-urile sunt si ele obiecte cu proprietatile si metodele lor. Prin intermediul referintei la frame aceste proprietati si metode pot fi accesate de un script Java. Accesul la o proprietate sau o metoda a frame-ului prin referinta din tabloul frames se face cu apelul: Window.frames[I].proprietate_sau_metoda_obiect_frame Proprietatile si metodele obiectelor frame vor fi discutate ulterior. •

Obiectul self

Referinta self este un sinonim al referintei window prin care un script Java se poate referi la obiectul fereastra in cadrul careia se executa. Astfel apelurile self.status(“Hallo!”) si window.status(“Hallo!”) vor sunt echivalente. Vom discuta in continuare metodele obiectului fereastra. • Metoda alert( ) Apelul la aceasta metoda a obiectului fereastra determina afisarea unei ferestere de mesaj de avertizare, prevazuta cu un buton OK. Metoda afiseaza textul transmis ca argument si asteapta ca utilizatorul sa dea un clic pe buton confirmand ca a citit mesajul. Astfel in urma executiei instructiunii JavaScript: window.alert(“Datele introduse sunt incorecte”); Browserul va afisa pe ecran fereastra din figura 30.12.

Fig.30.12 Fereastra de avertizare generata de metoda alert • Metoda confirm( ) Aceasta metoda afiseaza un alt tip de fereastra de mesaj prevazuta cu doua butoane, OK si Reset-. Metoda afiseaza in aceasta fereastra textul mesajului si asteapta apasarea unuia dintre butoane. Daca se apasa Butonul OK, metoda intoarce valoarea booleana true (adevarat) iar daca se apasa pe Reset- atunci intoarce valoarea booleana false (fals). Apelul metodei se face cu: window.confirm(“Ati introdus adresa de e-mail [email protected]”); Fereastra de confirmare afisata de browser este redata in figura 30.13.

PROGRAMARE IN JAVA - Note de curs

395

Fig.30.13 Fereastra de confirmare generata de metoda confirm • Metoda prompt ( ) Aceasta metoda afiseaza o fereastra prevazuta cu un camp de editare in care utilizatorul poate tasta un sir de caractere si cu doua butoane - OK si Reset-. Metoda este apelata cu: window.prompt(“mesaj de afisat in fereastra”,”text implicit in campul de editare”); Metoda afiseaza in fereastra prompt mesajul si initializeaza campul de editare cu textul implicit dupa care asteapta apasarea pe unul din butoane. Utilizatorul poate edita textul implicit din campul de editare dupa care apasa pe unul din butoane. Daca apasa pe OK metoda va returna sirul de caractere introdus de utilizator. Daca apasa butonul Reset-, sirul intors este vid - “”, nu contine nici un caracter. Incarcand de exemplu documentul din listingul 30.6 browserul va afisa fereastra prompt din figura 30.14. Listing 30.6 - Prompt.HTML JavaScript window.prompt() window.prompt

Fig.30.14 Fereastra prompt Se editeaza textul din campul de editare astfel incat in locul adresei de e-mail [email protected] sa apara [email protected] ca in figura 30.15.

396

CURS 30

Fig.30.15 Editarea textului din campul de editare Daca se apasa pe butonul OK browserul va afisa fereastra de confirmare din figura 30.16.

Fig.30.16 rezultatul apasarii pe butonul OK Daca se apasa pe butonul Reset- fereastra de confirmare afisata va fi cea din figura 30.17.

Fig.30.17 rezultatul apasarii pe butonul Reset • Metodele focus( ) si blur( ) Metoda focus seteaza fereastra ca tinta a intrarilor de la tastatura.De exemplu instructiunea window.opener.focus( ); activeaza fereastra parinte a ferestrei curente (window.opener)apeland la metode focus a acesteia. Un alt mod de a realiza acelasi efect este apelul la metoda blur aferestrei curente. Aceasta metoda comuta de pe fereastra curenta pe fereastra parinte a acesteia: window.blur( ) • Metoda scroll( ) Fie documentul HTML din listingul 30.7. Incarcand acest document, browserul va afisa imaginea din figura 30.18.

PROGRAMARE IN JAVA - Note de curs

397

Listing 30.7 - Orbit1.HTML Orbit

Se observa ca imaginea este mai mare decat spatiul ferestrei si deci este vizibila numai partial. Coltul din stanga sus al ferestrei este plasat la coordonatele (0, 0) ale imaginii. Pentru a vedea o alta portiune a imaginii aceasta trebuie “defilata” la coordonate noi. Utilizatorul se poate folosi pentru aceasta de barele de defilare verticala si orizontala cu care este prevazuta fereastra.

Fig.30.18 Imaginea din fisierul Orbit1.jpg incarcata in fereastra browserului Defilarea se poate face si din document printr-o instructiune JavaScript care apeleaza metoda scroll ( ) a ferestrei. Aceasta metoda permite defilarea ferestrei la un punct de coordonate (x,y) in pixeli. Ca referinta este luat coltul din stanga sus al ferestrei care are coordonatele (0,0). Astfel de exemplu instructiunea window.scroll(0,0); va face ca fereastra curenta sa arate pagina Web incarcata incepand cu coltul din stanga sus. Fereastra curenta poate determina defilarea imaginii in fereastra parinte prin referinta window.opener: window.opener.scroll(0,150); In figura 30.19 este reprezentat efectul instructiunii window.scroll(122,162) constand in defilarea imaginii la coordonatele (122,162). • Metodele open( ) si close( )

398

CURS 30

Metoda open( ) permite o noua fereastra a browserului. Cand aceasta metoda este apelata fereastra curenta (in care se executa scriptul Java ramane pe loc si o noua fereastra este deschisa pe ecran. Sintaxa instructiunii de apel a acestei metode este: window.open(“url”,”nume_fereastra”,”caracteristica1, caracteristica2, ….”); unde url desmneaza locatia resursei ce trebuie incarcata in noua fereastra, nume_fereastra, numele intern, asociat ferestrei, care poate fi folosit pentru referirea ulterioara a acesteia.Lista de caracteristici caracteristica1, caracteristica2,… contine specificatii privind atributele ferestrei nou deschise cum ar fi dimensiunea, titlul, butoane de navigatie, etc.

Fig.30.19 Defilarea imaginii cu metoda scroll( ) Elementele acestei liste pot fi: • toolbar = yes/no - specifica daca bara de butoane standard Back/Forward/Home sa fie vizibila sau nu. • location = yes/no - specifica daca campul de inscriere a locatiei sa fie sau nu vizibil. • directories = yes/no - specifica daca butoanele din categoria What’s New si What’s Cool. • status = yes/no - specifica daca bara de stare sa fie vizibila sau nu. • menubar=yes/no - specifica daca bara de menu sa fie vizibila sau nu. • scrollbars=yes/no - specifica daca barele de defilare sa fie vizibile sau nu. • resizable=yes/no - specifica daca noua fereastra poate sau nu sa fie redimensionata de utilizator. • copyhistory = yes/no specifica daca noua fereastra sa fie mosteneasca de la fereastra parinte lista ultimelor pagini accesate in cursul sesiunii curente (istoricul).

PROGRAMARE IN JAVA - Note de curs • •

399

width = nr.pixeli - specifica latimea in pixeli a noii ferestre. height = nr.pixeli - specifica inaltimea in pixeli a noii ferestre.

Metoda close( ) determina atunci cand este apelata inchiderea ferestrei. Sintaxa instructiunii de apel este: window.close( );

Locatia In fereastra afisata de browser apare o caseta de editare unde utilizatorul poate sa inscrie URL-ul resursei Web pe care vrea sa o incarce (figura 30.20). Aceasta caseta este si ea un obiectavand numele location.

Figura 30.20 – Obiectul “location” • Proprietatea location.href Aceasta proprietate contine sirul de caractere al URL-ului resursei accesate de browser. Astfel pentru a determina browserul sa incarce documentul avand URL-ul http://www.server.ro/document.html, un script Java il va memora in proprietatea href a obiectului locatie: location.href=" http://www.server.ro/document.html" Odata inscrisa noua locatie, browserul va incarca documentul specificat in fereastra curenta. Astfel daca browserul incarca documentul href.html din listingul 30.8 va intalni in cadrul acestuia instructiunea JavaScript location.href="http://www.nexus3.org/mydir/location.html"; Executia aceastei instructiuni il va determina sa incarce documentul location.html al carui continut este redat in listingul 30.8, afisandu-l in fereastra imediat ce a terminat de afisat href.html. Fereastra afisata de browser este cea din figura 30.21. Listing 3.7 - Href.HTML location href() utilizare location.href Listing 30.8 - Location.HTML

400

CURS 30

OBIECTUL "location" OBIECTUL "location" Aceasta pagina a fost incarcata in urma executiei unei instructiuni JavaScript: location.href="http://www.nexus3.org/MYDIR/location.html";

Figura 30.21 - location.html Odata incarcat documentul location.html, incercati sa apasati butonul "Back" din bara de butoane a browserului si incercati sa explicati ce se intampla. Pentru a crea o fereastra noua in care sa fie incarcat si afisat documentul dat, scriptul Java poate folosi location.href la apelul metodei window.open( ) a ferestrei curente: window.open(location.href,"nume_fereastra","”caracteristica1, caracteristica2, ….”); • Proprietatea location.host Aceasta proprietate contine doar o parte din sirul de caractere al URL-ului paginii curente afisate de browser si anume cea care localizeaza calculatorul gazda. Astfel in cazul URL -ului din exemplul precedent, proprietatea host contine doar subsirul subliniat care desemneaza calculatorul gazda pentru serverul HTTP: http:// http://www.nexus3.org/mydir/location.html ¾ location.host contine sirul de caractere "http://www.server.ro" Browserul se conecteaza la serverul HTTP prin accesarea unui port "ascultat" de acesta. Valoarea implicita a numarului de port pentru protocolul HTTP este 80. Sunt insa servere HTTP configurate sa "asculte" pe alte numere de port decat cel implicit. Pentru ca browserul sa poata comunica cu un astfel de server in URL trebuie inclusa si specificarea portului de conectare. De exemplu daca serverul "asculta" pe portul 6001, URL-ul va fi: http://www.server.ro:6001/document.html

PROGRAMARE IN JAVA - Note de curs

401

iar proprietatea location.host va include si portiunea cu numarul portului a URL -ului curent: http://www.nexus3.org:6001/mydir/location.html ¾ location.host contine sirul de caractere "http:// www.nexus3.org:6001". • Proprietatile location.hostname, location.port si location.protocol Aceste trei proprietati contin, prima locatia calculatorului gazda al serverului HTTP a doua numarul portului pe care "asculta" acesta si ultima subsirul care specifica protocolul folosit la conectare. Daca in URL nu este specificat un numar de port, location.host si location.hostname au acelasi continut iar location.port contine un sir vid de caractere (""). http:// http://www.nexus3.org:6001/mydir/location.html ¾ location.host contine sirul de caractere "http:// www.nexus3.org:6001". ¾ location.host contine sirul de caractere "6001". ¾ location.protocol contine sirul de caractere "http:". • Proprietatea location.pathname Aceasta proprietate contine parte din sirul de caractere al URL-ului paginii curente afisate de browser care specifica calea spre documentul accesat in sistemul de fisiere al calculatorul gazda: http:// http://www.nexus3.org:6001/mydir/location.html ¾ location.pathname contine sirul de caractere "/mydir/location.html ". Atribuind o valoare noua acestei proprietati, de exemplu o cale spre un alt document HTML, browserul va accesa serverul pentru a incarca noul document. Astfel instructiunea JavaScript: location.pathname = "/mydir/altele/document.html"; va determina browserul sa incarce documentul document.html cu URL-ul http://www.nexus3.org/mydir/ altele/document.html aflat in subdirectorul altele din directorul mydir. •

Proprietatea location.hash

Atunci cand in URL este specificat nu numai documentul ce se incarca ci si o referire la o ancora din cadrul acestuia marcata cu , aceasta proprietate contine numele ancorei respective. Astfel in cazul cand URL-ul este: http://www.nexus3.org/mydir/ altele/document.html#ancora ¾ location.hash contine sirul de caractere "ancora ". •

Proprietatea location.search

402

CURS 30

Am vazut in capitolul precedent ca atunci cand intr-o pagina Web care contine un formular, utilizatorul apasa pe butonul submit, browserul emite o cerere catre serverul HTTP de a executa un program specificat de URL-ul transmis. URL-ul contine pe langa adresa programului si un sir de interogare pe care serverul il va pasa ca parametru programului la serviciile caruia a apelat browserul. Proprietatea location.search contine tocmai aceasta componenta din URL. Astfel in cazul cand URL-ul este: http://www.nexus3.org/mydir/program?DateFormular ¾ location.search contine sirul "DateFormular". 3.6 ISTORICUL NAVIGATIEI Browserele tin istoricul navigatiei de la un document la altul intr-un obiect numit hystory. Acest istoric este tinut sub forma unei liste de URL-uri ale paginilor vizitate. In figura 3.22 este prezentata fereastra history la browserul Netscape Navigator iar in figura 3.23 folder-ul history al lui Internet Explorer. Proprietatile obiectului history sunt history.current care contine URL-ul documentului curent - afisat in fereastra browserului - (avand deci acelasi continut cu location.href) si history.length care contine lungimea actuala a listei de pagini Web vizitate (numarul de elemente ale listei). Astfel in cazul exemplului din figura 30.22 acest numar este 4 iar in cazul celui din figura 30.23 este 3. Metodele obiectului history permit navigarea spre documaentele ale caror URL-uri sunt inscrise in lista istoricului navigatiei. • metodele history.back() si history.forward() Aceste doua metode au efecte similare apasarii butoanelor Back si respectiv Forward din bara de butoane a browserului, permitind navigarea inapoi in pagina precedenta si respectiv inainte la pagina care a fost parasita cu Back. • metodele history.go(deplasament_lista) si history.go(sub_sir) Aceste doua metode permit saltul la URL-ul unui element arbitrar din lista istoricului navigatiei. Astfel metoda history.go(deplasament) determina accesarea URL-ului aflat la deplasament-ul transmis ca argument, relativ la pozitia curenta in lista. Argumentul deplasament poate avea valori pozitive sau negative. Daca este pozitiv, navigarea se face inainte (forward) iar daca este pozitiv, inapoi (back). De exemplu instructiunea: history.go(1) este echivalenta cu history.forward( ) iar history.go(-1) este echivalenta cu history.back( ). In cea de a doua varianta, argumentul poate sa fie si un sir de caractere. Browserul va cauta intrarea in lista in care se regaseste partial sirul de caractere transmis ca

Fig.30.22 - Istoricul navigatiei la browserul Netscape Navigator

PROGRAMARE IN JAVA - Note de curs

403

Fig.30.23 - Istoricul navigatiei la browserul Internet Explorer argument si va accesa documentul respectiv. De exemplu pentru lista din figura 3.22 apelul history.go("href.html") va determina accesul la documentul href.html avand URL-ul http://www.nexus3.org/mydir/href.html aflat in lista la pozitia 2.

Obiectul Document Documentul incarcat de browser este si el tratat ca un obiect avand proprietati si metode. Numele atribuit de browser paginii Web curente este document. •

proprietatile document.bgColor si dogument.fgColor

In exemplele discutate pana acum, textul si imaginile documentului erau afisate pe un fondul gri al ferestrei browserului. Este posibila stabilirea unei culori a fondului pe care este afisat documentul. Aceasta se face cu atributul BGCOLOR (de la BackGroundColor)al marcajului : ….Textul documentului….. In sistemul RGB culorile de baza sunt rosu(red), verde(green) si albastru(blue). Celalalte culori se obtin prin combinarea culorilor de baza cu ponderi diferite. Culoarea fundalului se codifica prin combinatia rrggbb unde rr reprezinta ponderea componentei de culoare rosie exprimata cu doua cifre in baza 16 (HEX). Valorile pentru aceasta componenta pot fi cuprinse deci intre 00 si FF ( in zecimal asta corespunde domeniului 0…255). Combinatia de doua cifre HEX gg reprezinta ponderea componentei de culoare verde iar ponderea componentei albastre. Astfel daca specificam culoarea prin combinatiia #000000 fondul pe care va fi afisat documentul este de culoare neagra (0 rosu, 0 verde si 0 albastru). Daca combinatia este #FFFFFF asta inseamna ca componentele de rosu, verde si albastru sunt la maxim si deci culoarea rezultata este alb. Deoarece nu se cunoaste dinnainte ce posibilitati de a afisa culori are calculatorul pe care va fi incarcat si vizualizat documentul, pentru ca acesta sa fie vazut la fel si pe un calculator care poate afisa doar 16 culori si pe unul care afiseaza 16 milioane de culori, browserul prelucreaza codul culorii afisand numai 16 culori solide. Restul combinatiilor le afiseaza sub forma unei texturi care sugereaza culoarea care ar trebui sa rezulte in realitate. Astfel de exemplu combinatia #FFD700 corespunde unei culori de fond aurii dar nu are corespondent in cele 16 culori solide posibile si atunci est afisata de browser sub forma unei o texturi ca cea din figura 30.24.

CURS 30

404

Fig.30.24 - BGCOLOR="#FFD700" Culoarea fondului documentului este continuta de proprietatea document.bgColor si poate fi modificata printr-o instructiune JavaScript care atribuie acesteia o alta valoare decat cea initial continuta de aceasta. De exemplu instructiunea document.bgColor = "#008080" determina ca culoarea de fond a documentului sa devina cea din figura 30.25

Fig.30.25 - document.bgColor="#008080" O alta caracteristica a documentului este culoarea de afisare a textului obisnuit din document. Aceasta implicit este culoarea neagra. Se poate specifica o alta culoare tot in cadrul marcajului prin atributul TEXT: ….Textul documentului….. unde combinatia rrggbb specifica culoarea textului obisnuit din document. Proprietatea document.fgColor (de la ForeGroundColor) are valoarea setata de acest atribut al marcajului . Ea poate fi modificata prin program prin atribuirea unei alte valori diferite de cea originala. Astfel atribuirea: document.fgColor="#FFFFFF" va face ca textul sa fie afisat cu culoarea alba (trebuie sa fim atenti la alegerea culorii de fond pentru ca textul sa fie vizibil). • proprietatile document.alinkColor, document.vlinkColor si document.linkColor Pe lunga textul obisnuit, in document se afla si texte incadrate de marcaje de legatura de tipul text accentuat In pagina afisata, textul accentuat apare evidentiat prin subliniere si culoare distincta de cea a textului obisnuit. Odata afisate in pagina, legaturile se pot gasi in trei stari: ¾ legatura neselectata; ¾ legatura activata(selectata); ¾ legatura deja vizitata; Pentru ca utilizatorul sa distinga usor legaturile deja vizitate de cele pe care urmeaza eventual sa le viziteze si sa vada si ce legatura tocmai a activat, starea legaturii este evidentiata printr-o culoare distincta a textului accentuat. Browserul pastreaza informatia privind legaturile deja vizitate un numar de zile prestabilit dupa care le readuce la starea de legaturi nevizitate. Astfel, chiar si atunci

PROGRAMARE IN JAVA - Note de curs

405

cand revine la pagina respectiva dupa o perioada mai lunga de timp, utilizatorul va sti ce legaturi a vizitat la accesarile anterioare. Culoarea celor trei tipuri de legaturi este stabilita implicit de browser dar poate fi stabilita si prin atributele LINK, VLINK si ALINK ale marcajului : ….Textul documentului….. Atributul LINK stabileste culoarea pentru legaturile nevizitate, VLINK pentru cele vizitate si ALINK pentru legatura activata. Culorile implicite sunt : LINK=blue, VLINK=purple, and ALINK=red. Proprietatile document.linkColor, document.vlinkColor si document.alinkColor au valoarile setata de aceste atribute ale marcajului . Culoarea legaturilor poate fi modificata prin program prin atribuirea unei alte valori diferite de cea originala. Astfel atribuirile: document.linkColor="#00FFFF"; document.vlinkColor="#FF0000"; document.alinkColor="#00FF00"; va seta culoarea legaturilor nevizitate pe galben, a celor vizitate pe rosu si a celei activate pe verde. • proprietatea document.title Intr-un document HTML, in sectiunea HEAD, marcajele , incadreaza un text ce reprezinta titlul documentului si este afisat de browser in bara de titlu a ferestrei. Sirul de caractere al titlului este accesibil intr-un script Java prin proprietatea document.title. Textul afisat in bara de titlu a ferestrei poate fi schimbat prin atribuirea unei noi valori acestei proprietati: document.title = "Noul titlu al paginii Web" • proprietatea document.anchors Am vazut in capitolul precedent ca intr-un document HTML, in sectiunea BODY, marcajul amplaseaza in textul acestuia o "ancora" ce poate fi referita intr-o legatura din alt document sau din documentul curent. Proprietatea document.anchors este un tablou continand valorile (numele) tuturor "ancorelor" din pagina, in ordinea in care acestea au fost inscrise in textul documentului. accesul la elementele tabloului se face prin intermediul unui index care specifica numarului de ordine al ancorei: document.anchors[0] document.anchors[1] …………………….. document.anchors[6] Fiecare din elementele de mai sus contine numele unei ancore din textul documentului. Astfel daca in document au fost definite in ordine ancorele cu numele "Luni","Marti","Miercuri", "Joi","Vineri","Sambata","Duminica" aceste siruri de

406

CURS 30

caractere sunt continute si de elementele tabloului document.anchors[0], document.anchors[2], … , document.anchors[6]. Tablourile in limbajul JavaScript sunt si ele obiecte (pe care le vom discuta in capitolul ulterior). Astfel numarul de elemente din tablou este continut de proprietatea length a acestuia. In cazul nostru, numarul de ancore in textul documentului curent este dat de document.anchors.length. Desi este posibil sa modificam prin atribuire valorile inscrise in tabloul document.anchors acest lucru nu are sens deoarece ancorele joaca doar rolul de puncte de legatura pentru referinte din alte documente sau din documentul curent. Daca aceste referinte sunt facute chiar in documentul curent, ele nu vor mai fi valide, daca nu sunt actualizate corespunzator modificarilor in document.anchors. • proprietatea document.links Aceasta proprietate este similara cu cea precedenta cu deosebirea ca document.links este un tablou ce contine toate legaturile specificate cu marcajul , in ordinea in care acestea apar in document. Accesul la elementele tabloului se face printr-un index: document.links[0] document. links [1] …………………….. iar numarul de elemente din tablou este dat de proprietatea acestuia document.links.length. Valorile intrarilor din tablou pot fi modificate prin atribuire ca in exemplul de mai jos: document.links[3] = "http://www.nexus3.org/"; • proprietatea document.lastModified Aceasta proprietate contine un sir de caractere care specifica data calendaristica a ultimei modificari aduse documentului curent. Un script poate folosi aceasta informatie pentru a arata utilizatorului cat de "proaspata" este informatia continuta de pagina Web curenta. • proprietatea document.referrer Daca pagina curenta a fost incarcata prin selectarea unei legaturi dintr-o alta pagina, aceasta proprietate contine URL-ul paginii din care s-a facut referinta. Aceasta informatie poate fi folosita pentru a tine o evidenta statistica a locurilor din care a fost accesata pagina. • proprietatea document.URL Aceasta proprietate poate fi folosita pentru a determina browserul sa incarce in locul paginii curente un alt document, prin atribuirea: document.URL = "http://www.nexus3.org/alta_pagina.html"; • proprietatile document.Forms, document.Images si document.Applets Ca si in cazul ancorelor si legaturilor, aceste proprietati sunt tablouri continand referinte la formularele (definite cu marcajele ,), imaginile (definite cu marcajele ,) si respectiv appleturile Java (definite

PROGRAMARE IN JAVA - Note de curs

407

cu marcajele ,) din documentul curent. Amanunte despre aceste elemente ale documentului HTML vor fi discutate la momentul potrivit, pe parcursul capitolelor urmatoare. Pe langa proprietati, obiectului document are si trei metode ce pot fi apelate de un script Java. • metoda document.clear( ) Aceasta metoda sterge continutul ferestrei curente. Aceasta operatie nu afecteaza continutul documentul curent sau a variabilelor si proprietatilor obiectelor. Este o operatie pur cosmetica care doar sterge imaginea afisata in fereastra browserului pregatind locul pentru ca o noua afisare de informatii sa nu se suprapuna peste imaginea anterioara. • metodele document.write( ) si document.writeln( ) Aceaste doua metode permit afisare de text HTML in fereastra curenta. Ca parametru aceste metode primesc un sir de caractere continand textul in format HTML pe care dorim sa il afisam in fereastra. De exemplu daca dorim sa afisam in fereastra textul in format HTML Hallo World! instructiunea JavaScript folosita va fi: •

document.write("Hallo World!");

Diferenta dintre write si writeln consta in faptul ca dupa afisarea textului, metoda writeln adauga la sfarsitul sirului de caractere afisat un terminator de linie new_line (linie noua) de altfel ignorat de browser (daca chiar se doreste trecerea la o linie noua, se va inscrie la sfarsitul sirului de caractere marcajul HTML ). Aceasta caracteristica a functiei writeln este utila numai in cazul in care se afiseaza text preformatat incadrat de marcajele ,. In acest caz browserul ia in consideratie la afisare si caracterele de formatare ASCII - SPACE, TAB, LINE_FEED si CARRIAGE_RETURN, ignorate in mod normal. In listingul 30.9 este prezentata utilizarea metodei document.write( ) pentru afisarea in fereastra browserului. Imaginea obtinuta este redata in figura 30.26. Listing 30.9 - write.HTML document.write()

Fig.3.26 - metoda document.write()

408

CURS 30

Obiectele Formular Formularele definite intr-un document cu marcajele , sunt la randul lor obiecte. Asa cum am vazut, ele sunt referite de proprietatea forms a obiectului document. Accesul la un obiect formular se face prin intermediul referintei document.forms[i] unde i este numarul de ordine al formularului in document. In continuare sunt discutate proprietatile obiectelor formular astfel refrerite. • proprietatea document.forms[i].action Aceasta proprietate contine URL-ul programului apelat pentru prelucrarea sirului de interogare obtinut dupa completarea de catre utilizator a formularului si apasarea butonului Submit. Valoarea ei poate fi modificata prin atribuirea unei noi valori sub forma unui sir de caractere. Astfel atribuirea document.forms[0].action="Alt_URL"; modifica proprietatea action a primului formular din document. • proprietatea document.forms[i].method Aceasta proprietate contine metoda de transfer a sirului de interogare a serverului stabilita cu atributul METHOD din marcajul . Am vazut in capitolul precedent ca metodele posibile sunt doua: GET si POST. Metoda stabilita de marcajul poate fi modificata prin atribuirea unei noi valori proprietatii method ca in exemplul urmator: document.forms[0].method="get"; Aceasta atribuire stabileste pentru primul formular din document metoda de transfer GET. • proprietatea document.forms[i].elements Proprietatea elements reprezinta un tablou ale carui elemente sunt referinte la componentele formularului (casete de editare, de validare, butoane, etc.) inscrise in ordinea definirii lor in formular. Numarul de elemente ale tabloului este dat de proprietatea length a acestuia. De exemplu numarul componente ale primul formular din document este dat de document.forms[0].elements.length unde document este documentul curent, forms[0] este referinta la primul formular din tabloul forms (proprietate a obiectului document), iar elements este proprietatea obiectului formular referit de forms[0]. Acesta fiind la randul sau un tablou, lungimea sa (numarul de elemente pe care le cuprinde) este data de proprietatea length. Componentele formularului pot fi acesate prin referintele continute de tabloul elements. Astfel prima componenta este referita de elements[0], a doua de elements[1] si asa mai departe.

Obiectele Buton Pe langa butoanele Sumbit si Reset in cadrul unui formular pot fi definite si alte butoane fara o functionalitate precisa. Unui astfel de buton i se poate asocia o functie JavaScript. Apasarea de catre utilizator a unui astfel de buton declanseaza automat executia functiei JavaScript asociate. In cadrul formularului un astfel de buton se defineste tot prin marcajul :

PROGRAMARE IN JAVA - Note de curs

409

In definitie apare un atribut special, onClick = "functia_asociata", care desemneaza functia JavaScript asociata butonului si evenimentul care declanseaza executia acesteia. In listingul 30.10 este exemplificata utilizarea unui astfel de buton. Butonului cu numele intern test si eticheta Test ii este asociata o functie JavaScript numita mesaj. Evenimentul care declanseaza executia functiei este onClick care corespunde momentului cand browserul sesizeaza ca utilizatorul a clicait pe butonul respectiv. La apasarea butonului este automat executata functia JavaScript mesaj() care afiseaza o fereastra continand un mesaj de confirmare a evenimentului. Listing 3.10 - Button.HTML Apasare Buton Apasati butonul Test

In figura 30.27 sunt reprezentate imaginile ferestrei browserului care afiseaza documentul Button.HTML si fereastra de avertizare afisata de functia mesaj() care confirma apasarea butonului Test. Butoanele sunt la randul lor obiecte. Ele sunt accesibile dintr-un script Java prin referinta din tabloul document.forms[i].elements[j], unde i este i este numarul de ordine in document al formularului iar j este numarul de ordine al butonului in formular. Proprietatile unui control de tip button sunt numele acestuia name si valoarea (eticheta inscrisa pe suprafata butonului) value si tipul acestuia type. In cazul formularului din exemplul anterior, butonul Test este referit de document.forms[0].elements[0] deoarece formularul este primul formular din document(si de altfel singurul ceea ce ne este confirmat de faptul ca document.forms[0].length are valoarea 1 ) si deci are indexul i=0 iar butonul este primul si singurul control din formular (document.forms[0].elements.length are valoarea 1) avand deci indexul j=0. Proprietatile nume valoare si tip ale controlului sunt accesibile prin referintele document.forms[0].elements[0].name ("test"), document.forms[0].elements[0].value ("Test") si document.forms[0].elements[0].type ("button"). Obiectul button nu dispune decat de o singura metoda - click(), care emuleaza apasarea butonului de catre utilizator. Apelul prin referinta, dintr-un script Java, document.forms[0].elements[0].click() , la aceasta metoda are un efect similar apasarii de catre utilizatora butonului Test.

410

CURS 30

Fig.30.27 Controlul de tip "button" al unui formular

Obiectele Checkbox (Casete de validare) La definirea aceste controale poate fi precizata ca si in cazul butoanelor o functie JavaScript asociata cu evenimentul onClick. Ca obiecte, ele sunt o extensie a tipului button avand aceleasi proprietati si metode ca si acesta. In plus, casetele de validare mai au proprietatea checked care contine starea butonului sub forma unei valori booleene (TRUE - adevarat - daca este validat sau FALSE - fals - in caz contrar). O alta proprietate suplimentara a casetelor de validare este defaultChecked care specifica starea implicita a controlului la incarcarea documentului, stabilita cu atributul CHECKED, inainte ca utilizatorul sau vre-un script Java sa-l fi actionat. In listingul 30.11 este prezentat un exemplu de accesare a proprietatilor obiectului CHECKBOX. iar in figura 30.28 ferestrele afisate de browser dupa actionarea repetata a contrtolului. In fereastra de mesaj este specificata atat starea actuala cat si starea implicita a casetei de validare. Listing 30.11 - Checkbox.HTML Caseta de Validare Validati caseta alaturata

Fig.30.28 Controlul de tip "checkbox" al unui formular

Obiectele Radio (Grup de butoane interblocate) Obiectul radio desemneaza un grup de butoane interblocate fiind o extensie a tipului checkbox . Fata de obiectul checkbox, el are in in plus proprietatea length care specifica numarul de butoane cu interblocare cu acelasi nume care intra in componenta sa. Deoarece din obiectul radio fac parte mai multe butoane, atunci, obiectul este de fapt un tablou de length referinte la butoanele componente. Astfel daca grupul se numeste test, atunci document.forms[i].test.value ne da valoarea butonului i din grup. Proprietatea value contine valoarea asociata unui buton din grupul de butoane interblocate. Similar, document.forms[i].test.checked refera proprietatea checked a butonului i din grup.Proprietatea checked are valoarea booleana true daca butonul este validat si false nu este validat. Proprietatea defaultChecked specifica starea implicita a butonului interblocat la incarcarea documentului, stabilita cu atributul CHECKED, inainte ca utilizatorul sau vre-un script Java sa-l fi actionat (numai unul dintre butoanele grupului poate avea atributul CHEKED=true). Listingul 30.12 si figura 30.29 exemplifica definirea si utilizarea unui formular continand ungrup de butoane interblocate.

412

CURS 30

Fig.30.29 Utilizarea obiectului radio Listing 30.12 - Radio.HTML Butoane interblocate Validati unul dintre butoanele cu interblocare de mai jos: Buton 1 Buton 2 Buton 3

PROGRAMARE IN JAVA - Note de curs

413

Obiectul Select ( Lista tip Menu sau Menu Derulant) Obiectul select este si el ca si obiectul radio compus din mai multe elemente selectabile. El corespunde listei tip menu declarata in cadrul unui formular astfel: Optiunea 1 Optiunea 2 Optiunea 3 ……………………………………. Optiunea n Proprietatile obiectului sunt name - numele listei, type = "select" - tipul elementului, length care specifica numarul de optiuni din lista, options[] - un tablou ale carui elemente sunt obiecte corespunzand optiunilor definite cu marcajele , si selectedIndex care contine indexul optiunii selectate in tabloul options[] . Elementele tabloului options[] sunt la randul lor obiecte avand proprietatile text - un sir de caractere care contine textul optiunii delimat in document de marcajele ,, value - valoarea setata cu atributul VALUE sau implicit textul etichetei optiunii, acelasi cu cel continut de proprietatea text, defaultSelected continand o valoare booleana true daca optiunea era implicit selectata cu atributul SELECTED sau false in caz contrar. Obiectului i se pot asocia functii JavaScript ce vor fi executate la producerea unor evenimente cum ar fi onFocus - controlul este activat devenind tinta intrarilor de la tastatura, onBlur - controlul este dezactivat (acesta nu mai este tinta intrarilor de la tastatura) si onChange - produs cand controlul este dezactivat (nu mai este tinta intrarilor de la tastatura) si optiunea selectata initial la activare in momentul onFocus s-a schimbat. Listingul 30.13 si figura 30.30 exemplifica definirea si utilizarea unui formular continand o lista de tip menu. Listing 30.13 - Select.HTML Butoane interblocate Selectati una din optiunile din lista urmatoare: Optiunea 1 Optiunea 2 Optiunea 3

414

CURS 30



Fig.30.30 - Utilizarea obiectului select In exemplul nostru, pentru a simplifica notatiile, am stocat indexul optiunii selectate intr-o din meniu dat de document.forms[0].elements[0].selectedIndex "memorie" pe care am botezat-o mai simplu, pentru a o putea referi in textul scriptului, index . Acest "botez" care consta in alocarea unui bloc de memorie necesar stocarii unor valori si in asocierea unui nume (identificator) blocului alocat pentru a-l putea accesa prin intermediul acestuia. Aceste operatii s-au facut prin instructiunea declarativa: var index=document.forms[0].elements[0].selectedIndex;

prin care, suplimentar am si stocat o valoare in blocul de memorie astfel construit. Instructiunea declaratia var provine de la variable - variabila. Un astfel de obiect declarat cu var, capabil sa memoreze diferite valori, se numeste variabila (tocmai pentru ca poate sa stocheze - i se pot atribui - diferite valori, ceea ce il deosebeste de o constanta a carei valoare se stabileste obligatoriu la declarare si nu poate fi modificata sub nici un chip pe parcursul executiei scriptului). Putem face o similitudine cu cazul a doua dischete (figura 30.31) - una protejata la scriere si alta nu. Cea neprotejata la scriere corespunde unei variabile iar cealalta unei constante. Formatarea disketei, lipirea si inscriptionarea etichetei cu un "nume" corespunde declararii variabilei. Textul inscris pe eticheta dischetei ne permite sa o identificam printre alte dischete si sa ne referim ulterior la ea. Acest text de pe eticheta corespunde identificatorului (numelui) variabilei. Inscrierea unor date pe discheta corespunde operatiei de atribuire a unei valori variabilei. Evident ca asa cum nu putem sa inscriem date pe discheta pana nu am formatat-o si etichetat-o, asa nu putem atribui valori unei variabile pana ce aceasta nu a fost declarata.

PROGRAMARE IN JAVA - Note de curs

415

Fig.30.31 Variabila si constanta Revenind la obiectul select sa mai analizam un exemplu care de aceasta data creaza un element de formular de tip lista-menu cu defilare. Lista-menu cuprinde ca optiuni mai multe denumiri de culori. Selectarea uneia dintre culori determina executarea functiei JavaScript schimbaCuloarea() care face ca fondul documentului sa capete culoarea aleasa din lista-menu. Folosind attributul SIZE al marcajului lista-menu poate fi afisata ca o lista menu cu defilare. In exemplul din listingul 30.14 lista menu cu defilare astfel construita permite selectarea culorii de fond a documentului afisat. In figura 30.32 este prezentata pagina afisata de browser dupa ce din lista-menu cu defilare s-a selectat optiunea a 3-a (avand textul "bleuciel" si valoarea "#00FFFF"). Listing 30.14 - Menu.HTML Background Colors Selectati culoarea de fond din lista urmatoare: Implicita alba bleuciel verde

416

CURS 30

Fig.30.32 - Lista menu cu defilare Si in acest program am simplificat notatiile prevaziand functia cu argumente. Astfel, functia schimbaCuloarea() are argumentele colorList si index. Aceste argumente constitue parametrii formali ai functiei si sunt o varietate de obiecte similare variabilelor. Deosebirea consta in faptul ca pentru ei alocarea de memorie si atribuirea de valori se face automat, inainte de a se incepe executia functiei in timp ce pentru variabile alocarea de memorie se face la comanda (cu instructiunea declarativa var ) in timpul executiei functiei. Valoarea parametrilor formali este actualizata cu valoarea argumentelor folositi la apelul functiei (parametrii actuali). In cazul exemplului nostru, parametrii actuali au fost document.forms[0].elements[0] reprezentand referinta la elementul 0 al formularului 0 din document adica, chiar referinta la listamenu din formularul nostru (elementul 0 din formular) si document.forms[0].elements[0].selectedIndex reprezentand indexul in listamenu a optiunii selectate de utilizator. In urma selectarii unei optiuni din lista, parametrilor formali li se atribuie valorile parametrilor actuali adica in cazul functiei schimbaCuloarea() se fac atribuirile: colorList = document.forms[0].elements[0] index = document.forms[0].elements[0].selectedIndex dupa care se trece la executia functiei. Prin acest mecanism, codul sursa al instructiunilor pentru accesarea propriertatilor obiectelor devine mai simplu de scris si mai intuitiv. Astfel, daca nu am fi folosit parametri, accesul la proprietatea value a optiunii selectate s-ar fi facut cu referinta: document.forms[0].elements[0].options[document.forms[0].elements[0].s electedIndex].value

Ufffffffffffffffffff….. am obosit scriind asta. Asa, folosind parametrii formali, accesul la proprietatea value a optiunii selectate se face cu referinta: colorList.options[index].value

care este mult mai usor de scris dar si mai usor de inteles. Folosind variabile si parametri formali codul sursa al programelor devine mai usor de inteles ceea ce, implicit, usureaza si depistarea unor eventuale erori si aducerea unor modificari ulterioare programului.

PROGRAMARE IN JAVA - Note de curs

417

Obiecte Text, TextArea si Password Controalele text si textarea, componente ale unui formular sunt si ele tratate de JavaScript ca obiecte. Proprietatile si metodele acestor obiecte sunt similare. Diferenta dintre ele consta in faptul ca obiectul text permite editarea textului pe un singur rand iar textarea pe mai multe randuri. Proprietatile celor doua tipuri de obiecte sunt name - care specifica numele intern al obiectului, value - continand textul curent continut de caseta de editare, defaultValue valoarea implicita stabilita de atributul VALUE al marcajului cu care s-a definit controlul de tip text sau textarea in formular si in final type continand tipul controlului ("text" sau "textarea" ). Metodele obiectului sunt focus( )- care determina activarea controlului, acesta devenind tinta intrarilor de la tastatura, blur( ) - determinand dezactivarea controlului (acesta nu mai este tinta intrarilor de la tastatura) si select ( ) care selecteaza textul din campul de editare. Obiectului i se pot asocia functii JavaScript ce vor fi executate la producerea unor evenimente cum ar fi onFocus - controlul este activat devenind tinta intrarilor de la tastatura, onBlur - controlul este dezactivat (acesta nu mai este tinta intrarilor de la tastatura), onSelect - campul de editare este tinta intrarilor de la tastatura si utilizatorul a selectat o portiune din textul continut de acesta si onChange - produs cand controlul este dezactivat (nu mai este tinta intrarilor de la tastatura) si valoarea (textul) continuta initial la activare in momentul onFocus s-a schimbat. Listingul 30.15 si figura 30.33 exemplifica definirea si utilizarea unui formular continand un control de tipul text. Listing 30.15 - Text.HTML Text Selectati caseta de editare si urmati indicatiile din bara de stare:

418

CURS 30



Fig.30.33 -utilizarea obiectul text Controlului de tip password din cadrul unui formular este de fapt o caseta de editare asemanatoare cu cea de tip text, cu deosebirea ca in acest caz textul tastat nu este vizibil fiind mascat cu asteriscuri(*). Proprietatile sunt aceleasi ca si la obiectul text

Obiectul This Am vazut ca accesul la valoarea unui element j al formularului i din document se face cu referinta document.forms[i].elements[j].value

Am vazut de asemenea ca o astfel de referinta este prea lunga si incomoda, complicand textul sursa al scriptului. In exemplele anterioare am simplificat notatia folosind variabile si parametri formali. Limbajul JavaScript ofera insa si o cale mai naturala de a evita o astfel de constructie complicata. Astfel, atunci cand este plasat intre marcajele , de delimitare ale unui formular i al documentului curent, identificatorul this (acesta) refera acest formular fiind echivalent cu document.forms[i] si poate deci sa-l inlocuiasca. Pe de alta parte, un element j al formularului poate fi referit nu numai prin proprietatea this.elements[j] dar si prin numele sau intern specificat cu atributul NAME = nume_element al marcajului in care a fost definit: this.nume_element.

Obiectul Navigator Acest obiect este folosit de un script Java pentru a obtine informatii despre browserul care il executa. Proprietatile obiectului sunt: • proprietatea navigator.appCodeName Aceasta contine numele de cod al browserului. de exemplu pentru browserul Netscape aceasta proprietate este mozilla. • proprietatea navigator.appName Aceasta contine c real al browserului.

PROGRAMARE IN JAVA - Note de curs

419

• proprietatea navigator.appVersion Aceasta contine numarul de versiune al browserului. • proprietatea navigator.appAgent Aceasta contine informatia completa asupra browserului inclusiv numele de cod, numele, numarul de versiune si platforma (de exemplu Win95). • proprietatea navigator.plugins[] Aceasta proprietate este un tablou ale carui elemente specifica modulele plug-in instalate (de sunet, animatie, etc.). • proprietatea navigator.mimeType[] Aceasta proprietate este un tablou ale carui elemente specifica ce tipuri MIME de date este capabil sa afiseze browserul (text HTML, imagini GIF, JPG, sunet MID/WAVE etc.) Obiectul are si o metoda - navigator.javaEnabled() care daca este apelata, returneaza o valoare booleana true daca browserul are activata interpretarea codului Java si false in caz contrar.

Evenimente La discutarea obiectelor JavaScript discutate in acest capitol in unele cazuri ne-am folosit de termenul eveniment pentru a desemna momentele in care utilizatorul interactioneaza cu obiectul modificandu-i starea (onClick, onFocus, onBlur si onChange). Acestor evenimente le-am asociat in exemplele noastre functii JavaScript activate automat de browser la sesizarea producerii unui eveniment. Pentru unele obiecte cum ar fi ferestrele si documentele, evenimente sunt si incarcarea/creerea (onLoad) sau distrugerea (onUnload) lor ( asa cum si pentru noi nasterea si moartea sunt evenimente majore). Si acestor evenimente li se pot asocia functii JavaScript care sa fie activate la survenirea lor. In tabelul 30.1 sunt enumerate toate obiectele discutate pe parcursul acestui capitol cu proprietatile, metodele si evenimentele lor.

CURS 30

420

Tabel 30.1 Obiecte JavaScript OBIECT

Proprietati

Metode

Evenimente

window

frames[] frames.length status self parent top opener

alert() confirm() prompt() open() close() blur() focus() scroll()

onLoad onUnload onFocus onBlur onError

history

length

go() back() forward()

document

title location lastModified loadedDate bgColor fgColor linkColor vlinkColor alinkColor forms[] forms.length links[] links.length anchors[] anchors.length

write() writeln() clear() close() open()

onLoad onUnload

form

name method action target elements[]

submit() reset()

onSubmit onReset

button, submit, reset

name value type

click()

onClick

checkbox

name value status defaultChecked checked type

click()

onClick

radio

name value length defaultChecked checked type

click()

onClick

select

name length selectedIndex type options.length options[] continand aceste subproprietati: index name selected text value

text, textarea, password

name value defaultValue type

onFocus onBlur onChange

blur() focus() select()

onFocus onBlur onChange onSelect

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF