Sunteți pe pagina 1din 60

INTRODUCERE

n urm cu ani, informatica prea o religie exotic, practicat n temple misterioase i ndeprtate, numite centre de calcul, n care plpie sute de luminie i se ntmpl o mulime de lucruri care depesc puterea de nelegere a oamenilor de rnd. Apoi, ncet-ncet, relaiile publiccalculator au devenit mai pmnteti, fr a pierde ns complet aura iniial. i azi ne impresioneaz mai mult dac cineva moduleaz scrnetele unei imprimante n aa fel nct s ne sugereze un fragment din simfonia lui Beethoven dect, s zicem, tirea c o echip de informaticieni, dup un timp de trud, au reuit s ajute o societate comercial s fac economii de milioane de lei. Pe de alt parte, o veste de genul celei n care cineva este somat de calculator c trebuie s achite o datorie de zero lei i zero bani, are mari anse de succes public, fcndu-ne s retrim satisfacia rutcioas cu care ne distram la coal cnd tocilarul clasei se dovedea dezorientat ntr-o anumit mprejurare. Oricum, procesul este ireversibil. Toate datele converg spre o implicare din ce n ce mai adnc a calculatoarelor nu numai n tiin, proiectare sau economie, dar, direct n viaa noastr de toate zilele. Se pune, atunci ntrebarea gndesc oare mainile n acelai mod ca i oamenii, ori vor putea ele gndi n viitor? Sunt oare limbajele prin care ne nelegem cu calculatorul adecvate firii noastre, i dac nu pn unde s-ar putea umaniza ? Oare, un contact cu calculatorul mai frecvent nu ar putea provoca mutaii n modul nostru de a gndi, ntr-o direcie nedorit ? S-ar putea imagina forme de simbioz om-calculator n aa fel nct personalitatea omului s nu aib de suferit, ci numai de ctigat ? tiina calculatoarelor este un domeniu relativ nou. Primele calculatoare au fost construite la mijlocul anilor 1940 i de atunci au avut loc dezvoltri spectaculoase. n anul 1946 Goldstine i von Neumann apreciau c 1000 de instruciuni reprezint o limit superioar rezonabil pentru complexitatea problemelor ce pot fi concepute ca rezolvabile cu ajutorul calculatorului. Dup ce a prevzut n 1981 c nici un program pentru calculatoare personale nu va necesita vreodat mai mult de 640 KB de memorie RAM, Bill Gates admite n 1995 c lucrurile s-au schimbat n ultimele dou decenii. Urmtoarele exemple ofer o imagine asupra gradului de complexitate la care au ajuns programele n zilele noastre: sistemul de rezervare a biletelor pentru o companie aerian coninea, n anul 1992, dou milioane de linii de cod n limbaj de asamblare; sistemul de operare System V versiunea 4.0 (UNIX) a fost obinut prin compilarea a 3.700.000 linii de cod; programele scrise pentru naveta spaial NASA au circa 40 de milioane de linii de cod; pentru realizarea sistemului de operare IBM OS360 au fost necesari 5000 de ani-om. 7

Creterea programelor n dimensiune i complexitate a depit cu mult progresele fcute n domeniul tehnicilor de programare. De aceea, programarea a devenit i a rmas mai mult o art dect o meserie. Daca am face o paralel cu ingineria construciilor, aceasta ar fi cam aa: dac dorim s construim o cuc pentru cine, putem s mergem prin grdin, s cutam lemne i cuie, s lum un ciocan i s ncepem s lucrm. Avem anse destul de bune s reuim, mai ales dac suntem ndemnatici. Dac totui nu reuim, putem ncerca a doua zi din nou cu alte lemne i alte cuie. Iar dac cinele nu ncape n cuc, putem ncerca a treia zi din nou cu mai multe lemne. Lucrurile stau radical diferit atunci cnd dorim s construim o cas pentru familia noastr. Atunci va trebui sau s angajm un arhitect care s ne fac un proiect, sau s cumprm un proiect standard de cas. Va trebui s negociem cu o firm de construcii preul, durata de realizare, calitatea finisajelor. Nu ne permitem s riscm economiile familiei pe o construcie care se va drma la a doua rafal de vnt. n plus, dac membrilor familiei nu le place orientarea ferestrelor sau peisajul, nu i putem schimba cu alii (n cel mai ru caz, ne schimb ei pe noi). Cu att mai mult, dac o firm pltete cteva milioane de dolari pentru a ridica un zgrie nori, reprezentanii acesteia vor fi foarte ateni cu cine i n ce condiii vor lucra. Ei vor dori garanii c proiectul este viabil, vor angaja mai multe firme de arhitectur pentru a-l verifica. De asemenea, studii geologice, de fizic a pmntului sau meteorologie vor fi obligatorii. Vor fi folosite cele mai performante materiale i se vor angaja cei mai competeni i cu experien constructori. Eecul nu mai este o opiune pentru contractantul proiectului. tim c inginerii constructori ntocmesc planuri, construiesc machete, studiaz proprietile materialelor folosite i fac rapoarte privind progresul operaiunilor. Construcii de o complexitate foarte mare au fost realizate n acest fel ntr-un mod raional i economic, la fel ar trebui s procedeze si in programare pentru ca dezvoltarea programelor s nu mai fie un proces impredictibil. Faimosul Bill Gates spunea despre rolul tehnologiei i informaiei c: modul cum culegi, administrezi i foloseti informaia fac din tine un ctigtor sau un nfrnt n via. Este tot mai evident faptul c n prezent existena fiecrui individ n parte, ca i a ntregii societi n ansamblul ei, capt un ritm din ce n ce mai alert, devine tot mai marcat de necesitatea cunoaterii rapide, complete i corecte a realitii nconjurtoare, pentru ca luarea deciziilor s fie fcut ferm, oportun i competent. Orice decizie are la baz informaii i date referitoare la obiectul activitii respective. Prelucrarea datelor trebuie fcut n concordan cu cerinele tehnologiei informaionale. Se pot astfel contura diferenele dintre date i informaii: Datele desemneaz elementele primare, provenind din diverse surse, fr o form organizat care s permit luarea unor decizii. Informaiile sunt date ce au un caracter de noutate, care mbogesc nivelul de cunotine ale celui care primete aceste informaii. 8

O dat care nu aduce nimic nou nu se poate considera informaie. Calculatorul trebuie s fie capabil s modeleze i s manipuleze aceast informaie. Prelucrarea datelor (numit i procesare) presupune totalitatea transformrilor, ca form i coninut a datelor. Tehnologia Informaiei (IT) reprezint totalitatea instrumentelor ce se bazeaz pe un calculator, folosite de oameni pentru a prelucra i transmite informaii. Tehnologia Informaiei (IT) este format att din echipamente necesare prelucrrii informaiei i comunicrii ei, ct i din software-ul necesar pentru obinerea informaiilor i transmiterea lor. Calculatorul este o main care prelucreaz automat informaia. Pentru a realiza acest lucru, calculatorului trebuie s i se furnizeze datele pe care trebuie s le prelucreze (datele de intrare) i o list de instruciuni (programul) care s i spun cum s prelucreze aceste date. n urma prelucrrii datelor calculatorul va furniza utilizatorului rezultatele obinute (date de ieire). Operaiile i ordinea n care acestea sunt executate de ctre calculator sunt transmise de ctre om prin intermediul programelor.

Capitolul I GENERALITI DESPRE SISTEMUL OCR I.1. Ce este OCR?


OCR este acronimul pentru Optical Character Recognition. Aceast tehnologie permite unei maini s recunoasc automat caractere printr-un mecanism optic. Fiinele umane recunosc multe obiecte iar n acest mod ochii notri sunt "mecanismul" optic. Dar n timp ce creierul "vede" aceste semnale de intrare, mai are i capacitatea s neleag aceste semnale, care variaz n funcie de fiecare persoan i de mai muli factori. Prin revizuirea acestei variabile, putem nelege provocrile cu care se confrunt tehnologia n curs de dezvoltare a unui sistem OCR. n primul rnd, dac am citit o pagin ntr-o alt limb dect a noastr, am putea recunoate diferite personaje, dar suntem n imposibilitatea de a recunoate cuvinte. Cu toate acestea, pe aceeai pagin, suntem de obicei n msur s interpretm caracterele numerice cci simbolurile pentru numere sunt universal folosite. Aceasta explic de ce multe sisteme OCR recunosc numai numere, n timp ce relativ puine sunt capabile s neleag gama complet de caractere alfanumerice. n al doilea rnd, exist o similitudine ntre forma simbolurilor numerice i cea alfabetic i multe altele. De exemplu, n timp ce la examinarea unui ir de caractere care combin litere i numere, nu exist diferen foarte puin vizibil ntre caracterul "O" i cifra "0". Ca oameni, putem reciti textul sau ntregul paragraf pentru a ne ajuta s determinm sensul exact. Aceast procedur, este mult mai dificil pentru o main. n al treilea rnd, noi ne bazm pe abilitatea de a ne ajuta s recunoatem i s deosebim caracterele. S-ar putea gsi c este foarte dificil de citit textul care apare pe un fundal foarte nchis, sau este imprimat peste alte cuvinte sau grafice. Din nou, sistemul OCR ar trebui s dispun de un sistem de programare pentru a interpreta doar datele relevante i s nu ia n considerare restul, care iar este o sarcin dificil pentru programatorii OCR. Exist i alte multe probleme pe care le ntmpin dezvoltatorii de sisteme de OCR de aceea este necesar o trecere n revist a istoriei dezvoltrii sistemelor, a progreselor, abilitile i limitrile sistemelor existente. Aceast analiz ar trebui s ajute s se determine dac OCR este aplicarea corect pentru nevoile companie noastre, i dac da, ce tip de sistem trebuie implementat. Recunoaterea optic a caracterelor (OCR) transform imagini de text, cum ar fi documentele scanate, n caractere de text. Cunoscut i sub numele de recunoaterea textului, OCR face posibil editarea i reutilizarea textului coninut de imaginile scanate. OCR utilizeaz o form de inteligen

10

artificial, cunoscut sub numele de recunoaterea modelului, pentru identificarea individual a caracterelor unui text dintr-o pagin, inclusiv semnele de punctuaie, spaiile i sfritul de linie.

OCR poate fi folosit n trei scenarii: Automat - OCR se execut automat dup fiecare scanare, mai puin cazul n care au fost modificate setrile prestabilite de scanare. Manual - OCR se execut manual pentru documentele care au fost scanate cu un alt program. Indexarea este un serviciu de sistem care v ajut s gsii rapid fiiere n computer utiliznd cutarea de text.

I.2. Necesitatea apariiei SISTEMULUI OCR


Problema care se punea era pstrarea documentelor n format hartie, documente care ocupau spaiu fizic i a mai intervinet i problema distrugerii mediului nconjurtor folosind n mod excesiv hrtia. Soluia a fost dat de sistmul de recunoatere optic a caracterelor n mod dinamic, care are capacitatea de a transforma caracterele de pe format hartie n format digital sub forma de text editatbil. Forma caracterelor este stocat ntr-o baz de cunotine la care se face apel atunci cand sistemul ncearc s identifice caracterul citit de pe formatul hartie cu un element din baza de cunostinte. Caracterele sunt stocate n baza de cunotine sub forma de matrici. Prin comparare se determin n mod iterativ similitudinea dintre cele dou caractere, programul afind n final caracterul care corespunde literei citite. OCR a fost folosit pentru a introduce date n mod automat ntr-un calculator pentru diseminare i de prelucrare. El a fost determinat de volumul mare de date de intrare i de varietatea datelor de intrare. Prima utilizare major a OCR a fost in industria petrolier, unde trebuiau procesate crile de credit n proiectele de vnzri. Aceast aplicaie oferea o recunoatere a cumprtorului dup cartea de credit pe care era imprimat un numr de cont folosit n introducerea unei tranzacii. Dispozitivele timpurii foloseau seturi de gurii care erau citite de calculator Aceste tranzacii i mai apoi necesitatea achiziionrii rapide de cari de credit, au fost dou cereri care au dus la necesitatea evoluiei sistemului OCR. Astfel s-a ajuns la documentele scanate i aparatura necesar unor astfel de operaii. S-a ajuns poate la unul din cele mai inovatoare maini scanerul Kurywell pe care l pot folosi inclusive nevztorii. Cu el, paginile scanate optic sunt convertite n cuvinte vorbite. Dar, OCR, nu a atins succesul care i se atibuise n 1950, i unul din principalele motive a fost c o mare parte din datele de intrare pe care ar fi putut s le foloseasc OCR, le-au preluat POS 11

Point Of Sale, pe care lanurile de benzinrii le folosesc n relaiile cu clienii i astfel au scpat de operaiile de scanare a crilor de credit, de prelucrarea facturilor de vnzri. Tentative de inginerie, pentru recunoaterea automat a caracterelor imprimate au nceput nc nainte de al doilea rzboi mondial. Dar pn la nceputul anului 1950 nu s-a gsit justificarea comercial pentru necesitatea finanrii cercetrii i dezvoltrii de tehnologie n acest domeniu. Acest impuls a fost furnizat de americani de la Bankers Association and the Financial Services Industry. Ei au contestat pn atunci toate principalele echipamente care veneau n ajutor pentru controlul automat al acestui proces. Dup rzboi, cu toate c sectorul bancar a ales n cele din urm Magnetic Ink Recognition (MICR), unii furnizori au propus utilizarea unei tehnologii de recunoatere optic a caracterelor. Cu toate acestea, OCR a fost nc n faz incipient, i un timp nu a fost acceptat n faa MICR, deoarece acesta avea marele avantaj c era relativ impenetrabil la schimbare, i la modificari frauduloase ct i la interferene cu non-cerneluri MlCR. La nceputuri "ochiul'' echipamentelor OCR au utilizat lumini, oglinzi, fante stabilite prin care lumina reflectat s treac i de un disc care fcea ca imaginea reflectat s fie rupt n bucele de alb i negru care apoi vor fi convertite n bii electronici de un tub. Acest lucru a permis s recunoasc un setul de caractere foarte limitate, special concepute. Pentru a realiza acest lucru, unitile necesare transportului sofisticat pentru documente care s fie procesate trbuiau s ruleze la o vitez constant i datele imprimate a trebuit s apar ntr-o locaie fix pe fiecare formular. Urmtoarea generaie de echipamente, introduse la mijlocul anilor 1960, a folosit un tub catodic, o fant de lumin, i foto multiplicatori ntr-o tehnic numit "curba urmtorul text" Aceste sisteme ofereau mai mult flexibilitate att n locaia de date i font ct i design de caractere care ar putea fi citite. Aceast tehnic a nsemnat un pas nainte prin faptul c a introdus conceptul de caractere scrise de mn, care ar putea fi citit n mod automat, dac ar fi utilizate anumite constrngeri. Aceast tehnologie a introdus, de asemenea, conceptul de albastru, cerneluri necitibile, deoarece sistemul era sensibil la spectrul ultraviolet. A treia generaie de dispozitive de recunoatere, introdus la nceputul anilor 1970, a constat din foto-diode Aceti mici senzori mici au fost aliniai ntr-o matrice, care puteau prelua imaginea reflectat a unui document ar trece la o vitez prestabilit. Aceste dispozitive au fost cele mai sensibile n infra-rou, n poriunea din vizual. Toate aceste au dus la aceast nou generaie de echipamente hardware.

I.3. Principiile i stadiul de dezvoltare n domeniul sistemelor OCR


Tehnologia de recunoaterea optic a caracterelor OCR este utilizat n operaiile de digitizare a datelor de tip text. n scop comercial, se folosete n magazine la citirea codurilor de bare de pe diferite produse. 12

Recurgnd la tehnologia de suprapunere peste matrice/tipar, OCR traduce formele i tipul specific/fontul caracterelor tiprite n codurile computerizate corespunztoare. Dei sistemele cele mai performante sunt capabile s recunoasc fonturi multiple, ele pot prelucra numai fonturi standard, cum ar fi Times Roman i Arial. O dat ce au fost recunoscute toate caracterele dintr-un cuvnt dat, cuvntul este confruntat cu un vocabular de rspunsuri poteniale pentru rezultatul final. Procesul de recunoatere a caracterelor segmenteaz apoi liniile textului sau cuvintelor n caractere separate, care sunt recunoscute dup modul de asamblare a formelor ce le constituie. Caracterele documentelor printate ocupa spaii uniforme pe tot cuprinsul unei pagini i aezate simetric de sus n jos, ceea ce permite sistemului OCR s citeasc textul caracter cu caracter. Segmentarea n caractere singulare constituie un punct slab de important crucial n procesul de recunoatere, pentru sistemele centrate pe prelucrarea formei, ntruct tehnologia de recunoatere OCR necesita imagini de calitate superioar, cu un contrast, cu caractere i claritate excelente. Un text mai puin dect perfect va determina i cele mai sofisticate sisteme OCR s produc diminuri considerabile ale gradului de acuratee, la procesarea unor imagini degradate. De exemplu, atunci cnd caracterele se distaneaz din cauza unei slabe caliti a imaginii; sau cnd multiple caractere se suprapun din cauza fundalului neclar sau tulbure dintre ele, acurateea procesului de recunoatere poate fi redus chiar i cu 20 de procente. Evaluarea gradului de acuratee aplicat asupra OCR este reprezentat de procentul de caractere citite corect pe o pagin data de text, iar sistemele prezint un mare grad de variaie, realiznd o acuratee ntre 95 i 99 procente. Orice valoare / coeficient situat sub 100 de procente poate avea drept consecin mari pierderi n cadrul productivitii. O ntreag aplicaie sau proces de verificare poate fi compromis, dac i numai 5 procente din date sunt fie introduse greit, fie citite incorect. Sistemele OCR trebuie s posede abilitatea de a corecta citirea rezultatelor: marcnd caracterele pe care sistemul nu le recunoate redirecionnd textul respins operatorilor umani, pentru procesare manual. Analiza imaginii utilizeaz un set de tehnici de recunoatere/identificare a tiparelor, care permite sistemelor computerizate s recunoasc i s interpreteze imaginile. Analiza imaginilor consta din dou etape: Procesarea/Prelucrarea i Analiza Imaginilor i Recunoaterea/Identificarea Tiparelor 1. Procesarea i analiza imaginilor include pai, cum ar fi: Restaurarea imaginii n scopul de a ameliora problemele stringente legate de calitate i facilitate a utilizrii

13

Extragerea caracteristicilor care urmeaz a fi folosite n stadiul ulterior de recunoatere/identificare a tiparelor. 2. Recunoaterea tiparelor include la rndul su: - Localizarea ariei de interes n cadrul imaginii originare - Extragerea datelor Apariia metodei de matrice de scanare, cuplat cu viteze mai mari i cu o putere de calcul mai mare, a condus la conceptul de "Procesarea Imaginilor" n recunoaterea optic. De exemplu, abilitatea de a schimba orice document ntr-un obiect digitizat electronic ar putea efectiv s nlocuiasc dispozitivele cu microfilm. Acest lucru ofer utilizatorului o metod mult mai convenabil de a sorta imaginile comparativ cu documentele actuale sau cu imaginile microfilm. Procesarea imaginii se bazeaz pe reele mai complexe dect a treia generaie de scanere OCR. Atunci cnd aceste scanere de imagine sunt cuplate cu logica OCR, ele ofer un instrument extrem de puternic pentru utilizatori. Recunoaterea imaginii poate fi fcut ntr-un mod off-line mai degrab dect n timp real un avantaj imens fa de versiunile timpurii ale dispozitivelor OCR. Acest lucru ofer un sistem logic mult mai puternic pentru a lucra de-a lungul timpului si necesit cerine mai putin riguroase att despre locaia informaiei, ct i despre fonturile caracterelor ce urmeaz a fi scanate. Un astfel de exemplu se gsete n cuplarea de imagini cu recunoatere convenabil cantitativ planificate pentru industria serviciilor financiare de procesare a cecurilor cea mai mare aplicaie de procesare a hrtiei cunoscut nc. Acest lucru va fi prima cstorie viabil a MICR cu tehnologia optic Care sunt aplicatiile ei? OCR a fost folosit pentru a introduce date n mod automat ntr-un calculator pentru diseminare i de prelucrare. El a fost determinat de volumul mare de date de intrare i de varietatea datelor de intrare. Prima utilizare major a OCR a fost in industria petrolier, unde trebuiau procesate crile de credit n proiectele de vnzri. Aceast aplicaie oferea o recunoatere a cumprtorului dup cartea de credit pe care era imprimat un numr de cont folosit n introducerea unei tranzacii. Dispozitivele timpurii foloseau seturi de gurii care erau citite de calculator Aceste tranzacii i mai apoi necesitatea achiziionrii rapide de cari de credit, au fost dou cereri care au dus la necesitatea evoluiei sistemului OCR. Astfel s-a ajuns la documentele scanate i aparatura necesar unor astfel de operaii. S-a ajuns poate la unul din cele mai inovatoare maini scanerul Kurywell pe care l pot folosi inclusive nevztorii. Cu el, paginile scanate optic sunt convertite n cuvinte vorbite. Dar, OCR, nu a atins succesul care i se atibuise n 1950, i unul din principalele motive a fost c o mare parte din datele de intrare pe care ar fi putut s le foloseasc OCR, le-au preluat POS Point Of Sale, pe care lanurile de benzinrii le folosesc n relaiile cu clienii i astfel au scpat de operaiile de scanare a crilor de credit, de prelucrarea facturilor de vnzri. 14

Capitolul II UNELTE HARDWARE I SOFTWARE FOLOSITE PENTRU REALIZAREA APLICAIEI II.1. C#


Viziunea iniial a Microsoft-ului asupra conceptului "Internet" este departe de coninutul reelelor web din zilele noastre. Microsoft consider Internetul viitor ca o lume a serviciilor, interdependente, dezvoltate de indivizi diferii, scrise n limbaje diferite, desfurate pe tipuri diferite de suport fizic, i gzduite de diferite sisteme de operare Internet. Oferta companiei pentru aceast nou lume este platforma .Net. De fapt, .Net nu este o platform n sensul tradiional; nu este un sistem software sau hardware comun. In schimb, .Net este o colecie de protocoale care permit diverselor aplicaii internet s se foloseasc de servicii disparate care ruleaz pe maini diferite. Un rezultat direct al strategiei firmei Microsoft este c versiunea de Microsoft Visual Studio include limbaje remodelate, modificate explicit s suporte platforma .Net. II.1.1. Avantajele C# 1. Dezvoltarea rapid de aplicaii: Unul din cele mai importante obiective ale Microsoft pentru C# este suport pentru RAD (Rapid Application Development). Aplicaiile internet trebuie s fie dezvoltate n timp internet; un nou limbaj trebuie s fie uor de nvat i depanat, i produce cod care se poate modifica uor. n timp ce VB si Delphi exceleaz n aceste domenii, C++ nu a fost tocmai un succes. Limbajul n sine este complex i greu de mnuit, i puine biblioteci C++ ofer interfee simple. n plus, managementul manual al memoriei i modelul de type-casting complex fac depanarea la C++ foarte dificil. n plus, cum se va arta n continuare, C++ nu protejeaz inerent mpotriva potenialelor probleme cauzate de incompatibiliti ale versiunilor. Cu tot efortul depus de Microsoft si Borland, C++ nu este potrivit pentru dezvoltare rapid a aplicaiilor. 2. Funcionare inter-platforme: Limbajele internet ar trebui s suporte, prin definiie, o funcionare inter-platforme. Deoarece internetul este o reea de sisteme disparate, serviciile trebuie s funcioneze pe o gam larg de hardware i software. n plus, software-ul orientat pe client ar trebui s ruleze pe mai multe tipuri de dispozitive, inclusiv PDA i telefoane mobile. O astfel de flexibilitate este o provocare pentru toate limbajele, cu excepia Java. In special VB produce doar aplicaii Windows pentru maini bazate pe Intel. Delphi, de asemenea , are aceleai restricii. Delphi pentru 15

Linux este disponibil deja, dar nu ofer nc suport pentru aplicaii internet. Nici VB i nici Delphi nu ndeplinesc condiiile pentru funcionarea independent de platform. 3. Acces la resursele caracteristice platformei: Programatorii cer tot mai mult acces la resursele specifice platformei, spune un studiu Microsoft. adesea este nevoie de astfel de acces pentru a scrie aplicaii int puternice. Visual J++ 6.0 ofere programatorilor acces la Windows API, ceea ce Java de obicei nu permite. n schimb, Java ofer funcionare independent de platform prin definirea unui cel mai mic numitor comun standard implementat de orice main virtual. Programatorii Java trebuie s codeze folosind acest standard mai puin puternic, n loc s profite de serviciile mai puternice oferite doar de anumite platforme. Astfel, Java nu reuete s ndeplineasc obiectivul de a da acces la resurse specifice platformei. 4. Suport pentru platformele COM si .Net: Microsoft a hotrt c suportul pentru COM i .Net este principalul obiectiv ce trebuie s-l ndeplineasc C#. Nici un alt limbaj nu suport platforma .Net, deoarece era nc n construcie. Spre deosebire de .Net, COM exist de ceva vreme, dar totui duce lipsa suportului unui limbaj puternic. Majoritatea limbajelor, incluznd C++ i Delphi, necesit ca programatorii s mai fac n plus o declarare IDL, o fabric de clase i mpachetri speciale pentru fiecare obiect COM creat. II.1.2. C# este un mediu RAD. 1. C# asigur colectarea spaiului disponibil n stilul limbajului Java: Una dintre cele mai semnificative caracteristici RAD ale limbajului C# este colectarea spaiului disponibil n stilul limbajului Java. La intervalele arbitrare din timpul execuiei, toate obiectele care nu mai sunt referite sunt n mod automat terse. Uurnd treaba programatorului de a elibera manual memoria, colectarea spaiului disponibil face generarea programelor mai uoar i fr eroare. Colectarea spaiului disponibil automata este totui consumatoare de timp i imprevizibil. n consecin, C# permite programatorilor s dezactiveze local colectarea spaiului disponibil, marcnd codul cu "nesigur", n situaiile n care este necesar realizarea performanei n timp real. 2. C# pune n aplicare un tip, un sistem valoare/referin n stilul limbajelor Java/Delphi: Pentru a sprijini RAD, C# folosete n continuare pointerul de C, C++ n favoarea tipului de sistem valoare/referinta Java si Delphi. n acest sistem, tipurile predefinite (ntreg, real, string, i aa mai departe), enumerrile, i structurile, sunt toate tipuri de valori. Operatorii de comparaie copiaz i verific valorile acestor tipuri de variabile. Interfeele, clasele, i "delegate"-urile sunt toate tipuri de referine. Operatorii de comparare copiaz i verific identitatea obiectelor la care se refer aceste tipuri de variabile. Acest tip de sistem este mai simplu dect pointerii din C++. Face mai uoar folosirea obiectelor i elimin multe din erorile ce apar n programele de C i C++.

16

3. n C# interfeele sunt declarate separat fa de clase: C# de asemenea sprijin un model de interfat Delphi i Java, unde interfeele sunt declarate n mod independent de clase. Este opusul modelului C++, unde interfeele sunt clase de baz abstracte. Ambele interfee i clase pot s moteneasc interfeele multiple. n timp ce clasele pot s moteneasc o singur clas de baz, interfeele nu pot s moteneasc clase deloc. Acest model evit problema multiplei moteniri, n care pot aprea conflicte. Nevoia pentru mecanismele complexe, ca de exemplu motenirea virtual, este de asemenea eliminat. Interfaa simplificat a C#-ului ajut la mrirea vitezei aplicaiei. 4. Declaraiile i definiiile metodelor de clas sunt combinate: C# simplific dezvoltarea aplicaiilor prin combinarea declaraiilor i definiiilor de metodele clasei, aa cum face Java. Programatorii de C++ trebuie s menin separate fiierele pentru declaraii (fiierul antet) i definiii (fiierul de implementare), complicnd dezvoltarea procesului software. Uurnd programatorul de nc un task, C# descoper automat relaii printre modulele sursei. Acolo unde C++ necesit, C# include (i Delphi "uses") C# nu are nevoie de nimic adiional pentru a localiza fiierele nrudite de surs. 5. C# folosete referirile metodelor, numii "delegate", n loc de pointerii la metode: C# folosete referinele la metode pentru a conecta repede obiectele i metodele. Numite i "delegate", aceste metode sunt asemntoare tipurilor procedurale ale limbajului Delphi. Hejlsberg a prezentat acel mecanism n Visual J++ dei el nu este parte standard a limbajului Java. Referinele la metoda sunt ntructva asemanatoare cu pointerii la metoda din C++, dar sunt de departe mult mai elegante, sigure, i folositoare. Un delegat este un tip de referin care ine semnatura metodei. O aplicaie s poat s desemneze oricare metod care potrivete aceast semnatur la o variabil "delegate". Cnd "delegate" este invocat, este chemat i metoda asociat. Spre deosebire de tipurile de proceduri Delphi, "delegates" suport i multicasting-ul. O aplicaie poate s desemneze multe metode la o variabil "delegat"; Cnd variabila este invocat, sunt apelate toate metodele. 6. C# folosete mecanismul Java pentru sincronizarea unui singur fir: Pentru a pune n aplicare sincronizarea firelor de execuie n C#, un programator pur i simplu marcheaz blocurile critice de cod. Unde un programator Java folosete cuvntul cheie "synchronised", un programator de C# folosete "lock"=lacat. Un mutex protejeaz blocul, permind numai unui fir s execute codul odat. 7. Declaraiile suprascrise explicite: n cele din urm, C# folosete declaraiile de suprascriere explicit pentru a sprijini RAD-ul. Declaraiile de suprascriere explicite sprijin dezvoltarea rapid a aplicaiilor, protejnd metoda claselor namespaces i expunnd accidental conflictele. Un programator al unei o clase C# derivate, trebuie n mod clar s marcheze o suprascriere de metod cu cuvntul cheie "override", aa cum face i n Delphi. Dac o clas derivat include o metod care are acelai nume ca metoda virtual din clasa de baz, compilatorul nu poate precis s deslueasc intenia autorului. Pe de alt parte, un conflict de nume ar putea foarte bine s apar accidental. Se ntampl n 17

special cnd clasa de baz i clasa derivat au fost implementate n mod independent de doi programatori, lucrnd poate n companii diferite, n astfel de caz, compilatorul va da un avertisment i va trata metodele clasei derivate ca o declaraie nou, nu ca pe o suprascriere. Dac, pe pe de alt parte, programatorul a decis n mod contient s foloseasc nume pentru o nou metod dintr-o clas derivat, care are acelai nume ca o metod virtual din clasa de baz, el sau ea poate s includ cuvntul cheie "new" pentru a mpiedica avertizarea dat de compilator. 8. Alte faciliti C#: Lund n considerare toate caracteristicile discutate deja, suport puternic pentru RAD pare a fi unul din principalele obiective ale Microsoft pentru C#. Sunt i alte nevoi de dezvoltare importante la care C# trebuie s raspund. Acestea includ dezvoltare independent de platform, acces la resurse tipice platformei, i suport pentru platformele COM i .NET. S examinm facilitile C# prin care se intenioneaz a satisface aceste nevoi. a. Funcionare independent de platform: C# rezolv problema funcionrii independente de platforma n acelai mod ca i Java. Compilatorul de C# genereaz un flux de cod binar care este interpretat de .Net runtime. Componenta runtime lucreaz ca i o main virtual Java. O aplicaie poate fi rulat pe orice main pe care a fost portat .Net runtime. b. Accesul aplicaiei la resurse specifice platformei: Spre deosebire de maina virtual Java, .Net runtime ofer acces programatic la resursele specifice platformei. Un program C# poate folosi, de exemplu, Windows API pentru a rula ca o aplicaie complet sub Windows 2000. Acelai program poate rula pe un PDA folosind subsetul Windows CE API. Bineneles, nu toate serviciile pe care aplicaia le asteapt vor fi disponibile pe toate mainile. De aceea, este responsabilitatea developerului s testeze software-ul pe toate platformele int, i s scrie cod special, dac este nevoie, care s permit funcionarea n absena unor servicii ateptate. c. Suport pentru COM i .Net: Pentru a sprijini att platforma COM, ct i .Net, C# include o important facilitate a limbajului, numit atribute. Un atribut este de fapt o clasa C# care <> codul surs pentru a oferi metainformaie. Atributele faciliteaz suportul oferit de C# unor tehnologii specifice precum COM sau .Net fr a ngreuna specificaiile limbajului in sine. De exemplu, C# pune la dispoziie clase de atribute care convertesc interfee C# n interfee COM. Altele convertesc clase C# n coclase COM. Nu este nevoie de IDL sau de vreo fabric de clase pentru a face aceste conversii. Unii comentatori ai limbajului au declarat c toate clasele C# sunt obiecte COM. Acest lucru nu corespunde tocmai adevrului, dar nu atributele corespunztoare, orice clas C# poate fi exprimat ca un obiect COM. Alt bibliotec de atribute oferit mpreun cu compilatorul de C# mpacheteaz clasele i funciile ca servicii Web. Un serviciu Web este un modul software gazduit care poate fi chemat prin internet folosind un protocol precum SOAP. SOAP mpacheteaz apelri de metode, mpreun cu parametrii i valorile returnate de acestea, n pachete de date XML. Serviciile Web pot fi scrise n multe limbaje i livrate pentru multe platforme software i hardware. Mai mult, mai multe servicii Web pot coopera i forma o ntreag aplicaie Web. Folosind 18

atributele corespunzatoare, un programator poate modifica cu urin orice clas sau funcie C# ntrun serviciu Web. II.1.3. Facilitati care nu se gasesc la C# Multe din facilitile pe care C# le folosete n aplicaiile Internet sunt alese din Delphi i Java. Totui Microsoft pretinde c C# descende din C i C++. De aceea vom examina unele caracteristici prezente la C++ i care lipsesc la C#. 1. Scopul i dereferirea operatorilor: C# nu folosete operatorul de scop C++ (::), n schimb se bazeaz pe echivalentul din Delphi i Java, punctul (.). Mai mult, deoarece se bazeaz pe sistemul valoare/ referin de tipul Delphi/ Java, C# adesea nu folosete operatorul de dereferire din C++ (->), n schimb, implementeaz din nou punctul. n timp ce operatorul punct suprancrcat poate aduce confuzie n rndul programatorilor de C++ care tocmai nva C#, le va fi familiar celor care au fost developeri Delphi sau Java. 2. Sintaxa declarrii referinei: Deoarece clasele, interfeele i tipurile delegate sunt implicit referine, la C# lipsete declaraia de referine de la C++. n loc, noul limbaj folosete o sintax similar cu declararea din Delphi a parametrilor transmii prin referint: - un parametru nemarcat este parametru de intrare; - cuvntul cheie ref indic un parametru de intrare-ieire (asemntor cu var-ul din Delphi); - cuvntul cheie out indic un parametru de ieire; - cuvntul cheie params indic o list de parametri de lungime variabil (asemntor cu varianta din Delphi de parametri iruri deschise). 3. Template-uri: La fel ca Java i Delphi, C# nu are template-uri. Prin urmare, nu are un mecanism pentru a sprijini declaraia puternic tipizat de colecii. n schimb, fiecare clas este n final derivat din clasa de baz comun object. O clas generic de colecie trebuie s fie o colecie de object C, necesitnd un downcast nesigur al membrilor ei spre tipul dorit. Totui, chiar fr aceste faciliti ale limbajului C++, C# este un limbaj puternic, proiectat cu faciliti asemntoare Java i Delphi pentru a permite dezvoltarea de aplicaii internet. Datorit orientarii spre main, i a lipsei de suport RAD, C++ nu ar fi fost o baz potrivit pentru un limbaj menit s fie folosit la a dezvolta aplicaii internet. Orice developer de C++ care trebuie s scrie aplicaii i servicii pentru platforma .Net, va fi sftuit s nvee C#. Iar acestea dou difer mai mult dect ar putea sugera numele.

II.1.4. Exemple de cod

19

n exemplul de mai jos vom arta cum C# face uz de resursele sistemului de operare (folosind o funcie API, InternetGetConnectedState). Aplicaia este folosit pentru a determina conectivitatea la internet a calculatorului gazd. using System ; using System.Runtime ; using System.Runtime.InteropServices ; public class InternetCS { //Creating the extern function... [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState( out int Description, int ReservedValue ) ; //Creating a function that uses the API function... public static bool IsConnectedToInternet( ) { int Desc ; return InternetGetConnectedState( out Desc, 0 ) ; } }

II.2. Achiziii de imagini


Imaginile sunt i un concept cu caracter informaional. Oamenii primesc pe cale vizual cea mai mare parte din informaia pe care sistemul lor senzorial o achiziioneaz. Oamenii preistorici au pictat, mult nainte de a scrie, transmind n acest mod informaii selectate. Probabil c am putea identifica aceste picturi din peteri ca primele imagini artificiale cu aplicabilitate grafic. Multe mii de ani imaginile artificiale au fost create de oameni prin metode grafice i au fost interpretate n mod natural tot de ctre oameni. Apariia i ulterior dezvoltarea calculatoarelor a oferit posibilitatea ca imaginile artificiale s fie create i memorate sub form numeric. Noul domeniu este grafica pe calculator i el este astzi foarte cunoscut i utilizat. Informaia, sub form de imagine de sintez, furnizat de o aplicaie de grafic pe calculator este legat de lumea nconjurtoare numai n msura n care se dorete ca aceast realitate s fie mai mult sau mai puin copiat. Decodificarea informaiei 20

transmise prin aceste imagini este fcut de oamenii care le privesc i care sunt utilizatorii finali ai aplicaiei. Din acest punct de vedere, imaginile au o rezoluie din ce n ce mai bun pentru a putea reprezenta ct mai bine detaliile. Numrul de culori este deasemenea din ce n ce mai mare pentru ca fidelitatea reprezentrilor s fie susinut i din acest punct de vedere. Se creaz n acest mod o realitate virtual aflat sub controlul total al programatorului care a proiectat-o. Dac ar fi necesar atunci s-ar putea oferi un text explicativ care s descrie toate obiectele incluse n scena virtual reprezentat printr-o astfel de imagine pentru c totul este cunoscut aprioric de ctre programator. Dezvoltarea tehnicii a creat, chiar naintea calculatoarelor, senzori care s ofere semnale electrice dependente de interaciunea dintre lumin i o scen cu obiecte. A aprut astfel posibilitatea de a produce imagini artificiale care ulterior s fie afiate pe dispozitive speciale i s fie privite de oameni. Coninutul acestor imagini achiziionate este puternic i direct legat de scena pe care o reprezint. Calitatea imaginilor de acest tip nu este, n majoritatea cazurilor, satisfctoare i ca urmare semnalele corespunztoare trebuie prelucrate pentru a elimina zgomotele sau pentru a amplifica alte caracteristici utile, de exemplu contrastul. Cele dou etape, achiziia i prelucrarea imaginilor, i pstreaz scopurile generale, dar i adapteaz tehnicile i metodele, i atunci cnd sistemul este completat cu un calculator i formatul imaginii este unul numeric. Imaginile achiziionate pot fi afiate, ca i imaginile de sintez, pentru a fi privite i analizate de un observator uman. Dac se dorete s se determine ce conine imaginea achiziionat fr a face apel la un observator uman atunci apare o problem nou, interpretarea sau nelegerea imaginilor folosind tehnici de inteligen artificial. Rezolvarea acestei probleme presupune adugarea unei noi etape dup achiziia i prelucrarea imaginii. Noua etap realizeaz o decodificare a informaiei coninute ntr-o imagine i poate fi asociat termenului generic de recunoatere a imaginilor. Pe lng fotografie i cinematografie, din punct de vedere istoric, primele aplicaii care au necesitat achiziia i prelucrarea imaginilor au fost aplicaiile militare, spaiale i medicale. Cele trei etape amintite anterior, achiziia, prelucrarea i recunoaterea imaginilor, se constituie n problemele principale ale domeniului vederii artificiale. O tendin natural ar fi aceea de a lucra cu imagini cu o ct mai bun rezoluie spaial i cu ct mai multe culori. n multe cazuri, echipamentele disponibile azi nu pot s-i ndeplineasc sarcinile att de repede pe ct este necesar i atunci vom constata c n aplicaiile de vedere artificial, imaginile au o rezoluie redus i sunt reprezentate cu nivele de gri. Privind numai imaginile folosite, s-ar putea trage concluzia c vederea artificial este mai puin spectaculoas dect grafica pe calculator. Totui, identificarea i localizarea automat ale unui obiect, care pe baza acestor informaii va fi manipulat corespunztor de un robot, este un exemplu de aplicaie care ne poate trezi interesul. Dei lucreaz cu imagini i folosesc multe tehnici i metode comune, cele dou domenii amintite mai sus, grafica pe calculator i vederea artificial, pstreaz o complementaritate care le 21

difereniaz principial. Sistemele de vedere artificial au fost dezvoltate avnd ca model inevitabil sistemele biologice i n special sistemul uman. O astfel de abordare este limitat din start de dou aspecte. n primul rnd, sistemul uman dispune de un avantaj net n ceea ce privete modul de prelucrare a informaiei pentru c se bazeaz pe un numr impresionant de uniti de prelucrare (nu de calcul), neuronii, care proceseaz n paralel informaia codificat ntr-o manier mult mai complex dect aceea numeric i binar. Sistemele artificiale sunt obligate s folosesc formatul numeric pentru informaie pentru c echipamentele care sunt disponibile sunt calculatoarele numerice. n al doilea rnd, tentativa de a copia propriul nostru mod de gndire este limitat de capacitatea nostr discutabil de autocunoatere. Noi oamenii, recunoatem cu uurin un obiect, chiar dac este parial ascuns de alte obiecte, dar nu putem s explicm cum am realizat aceast recunoatere i ca urmare nu putem s copiem metoda ntr-un algoritm sau ntr-o tehnic de inteligen artificial. Mai mult, datorit capacitii de nvare, de generalizare i a intuiiei, oamenii pot recunoate i obiecte pe care nu le-au mai vzut. De exemplu, oricine se poate pronuna n legtur cu un fruct chiar dac el este exotic, spre exemplu avogado, i nu l va confunda niciodat cu un bec chiar dac nu l-a mai vazut niciodat! Pentru sistemele de vedere artificiale recunoaterea se reduce, n cele mai multe aplicaii actuale, la o clasificare adic la identificarea unui obiect iniial necunoscut prin detectarea asemnrii cu unul din obiectele nvate iniial. Modul de funcionare i parametrii sistemului de vedere uman, sunt interesani din dou puncte de vedere: mai nti pentru c, aa cum s-a menionat deja, inevitabil sistemul biologic este un model pentru proiectarea sistemelor artificiale, iar, n al doilea rnd, pentru c operatorul uman este i el beneficiarul imaginilor rezultate n urma implementrii unor aplicaii specifice. Sunt prezentate n continuare principiile de funcionare i parametrii caracteristici, inclusiv comparativ, pentru senzorii de imagine n tehnologiile CCD i CMOS i se discut problema alegerii camerelor de luat vederi i a plcilor de achiziie i prelucrare de imagini. Formarea imaginii numerice se face printr-o succesiune de transformri: transformarea optic, transformarea geometric, eantionarea spaial i eantionarea n frecven. Trebuie avute n vedere noiuni definitorii legate de culori i de poziia pixelilor n imagine. Imaginile numerice ocup volume mari de memorie. O cale de a micora dimensiunea informaiei prelucrate i de a lucra cu informaii cu un grad mai mare de abstractizare este extragerea contururilor regiunilor din imagini. Operaiile care conduc la realizarea acestui deziderat sunt filtrri ale imaginilor numerice. Trebuie inclus descrierea tehnicilor de filtrare n domeniul frecven, n domeniul spaial, respectiv a utilizrii mtilor de convoluie. Un instrument util pentru aprecierea on-line a calitii imaginilor numerice, implicit i a rezultatelor filtrrilor aplicate, este histograma nivelelor de gri sau a culorilor. Prelucrrile care 22

conduc la o i mai mare esenializare a informaiilor despre imaginile numerice sunt acelea care segmenteaz imaginile identificnd i etichetnd regiunile componente. Trebuie avute n vedere tehnici de prelucrare, subiere sau nchidere, a contururilor pentru ca plecnd de la contururi s se poat defini regiunile. Cu metoda Hough se identific graniele regiunilor. n final, se abordeaz problematica identificrii i descrierii regiunilor. Dac scopul final este identificarea, clasificarea sau recunoaterea, obiectelor din lumea real crora le corespund regiunile din imagine atunci pasul urmtor trebuie s fie extragerea caracteristicilor cu care s se creeze formele (pattern). Se vor avea n vedere un numr de descriptori de contur (extrai pe baza granielor regiunilor) i de suprafa (care fac referire la regiune ca ansamblu, nu numai la graniele ei). Recunoaterea formelor trebuie eventual s ofere informaii despre poziia i/sau orientarea obiectelor corespunztoare n spaiul de operare. Forma, i deci decizia final de apartenen a obiectului la o clas de obiecte, nu trebuie s fie influenat de punctul de start de pe contur, de poziia sau de orientarea regiunilor corespunztoare n imagine. Exist descriptori care prin natura lor prezint anumite invariane, iar ali descriptori trebuie s fie normalizai n raport cu transformrile menionate. Identificarea obiectelor din spaiul de operare, prezente ca regiuni n imagini, este un proces de estimare a asemnrii prin msurarea distanelor dintre forme, privite ca vectori de caracteristici i asociate unor puncte n spaii multidimensionale. Pe de o parte, se dorete evidenierea prin exemple a posibilitilor de utilizare a metodelor i tehnicilor de achiziie i prelucrare de imagini pentru rezolvarea unor probleme practice, iar pe de alt parte se face o legtur ntre algoritmii generali prezentai anterior i modul n care ei pot fi nglobai n sisteme cu aplicabilitate efectiv. Aplicaiile sunt n domenii: sisteme de vedere robotice clasice, aplicaii de inspecie industrial, inspecia produselor alimentare, conducerea roboilor industriali, aplicaii tiinifice diverse. n anex sunt incluse un numr de exemple de utilizare a funciilor de prelucrare de imagini din pachetul de programe corespunztor al mediului de programare MatLab. Se dorete promovarea domeniului achiziiei, prelucrrii i recunoaterii imaginilor printr-o mai bun delimitare de alte domenii i printr-o evideniere a posibilitilor de aplicabilitate oferite de metodele i tehnicile aferente. Dei relativ nou, domeniul i-a creat, n timp, o baz teoretic i aplicativ solide. Rezultatele sunt incluse ntr-un numr impresionant de teze de doctorat, cri, reviste i lucrri ale manifestrilor tiinifice. Practic nu exist programe de studii universitare n domeniul utilizrii tehnicii de calcul i sistemelor de control, la faculti cu prestigiu recunoscut, care s nu includ cel puin un curs cu acest profil. Exist n continuare un obiectiv de atins. Se impune identificarea, implementarea i popularizarea unui numr tot mai mare de aplicaii practice care s susin caracterul concret i actual al acestui domeniu i s estompeze impresia depit c avem de a face cu aplicaii de ficiune tiinific ale mileniului urmtor. Ne aflm deja n mileniul urmtor! 23

II.3. Structura fiierelor TIFF


II.3.1. Ce este TIFF, i cum a aprut Formatul fiierelor TIFF, este un format de fiier bazat pe tag-ul pentru stocarea i interschimbabilitatea imagini raster. Prima versiune a caietului de sarcini TIFF a fost publicat de Aldus Corporation n toamna anului 1986, dup o serie de ntlniri cu diferii productorii de scanare i dezvoltatorii de software. El nu a avut la nceput un numr de versiuni, dar a trebuit etichetat Versiunea 3.0, deoarece erau dou versiuni anterioare de proiect. Versiunea 4.0 conine mbuntiri minore i cea mai mare parte a fost lansat n aprilie 1987. Versiunea 5.0, lansat n octombrie 1988, a adugat suport pentru paleta de culori de imagini i compresia LZW. Lempel-Ziv-Welch (LZW) este un compresor universal, fr pierderi de date. Algoritmul de compresie create de Lempel Avraam, Iacov Ziv, i Terry Welch a fost publicat de Welch n 1984 ca o bun punere n aplicare a algoritmului LZ78 publicate de Lempel i Ziv, n 1978. Domeniul de aplicare. TIFF descrie imaginea care de obicei vine de la scanere, grabbers cadru, paint i programe de returi foto. TIFF nu este un limbaj de imprimant sau limbaj de descriere a paginii. Scopul TIFF este de a descrie i s stocheze datele imagine raster. Un obiectiv principal al TIFF este de a oferi un mediu bogat n care cererile pot face schimb de date de imagini. Aceast bogie este necesar pentru a profita de diferite capaciti de scanere i alte dispozitive de imagistic. Dei TIFF este un format bogat, acesta poate fi utilizat cu uurin pentru scanere simple i aplicaii i din cauza numrului de cmpurile obligatorii mic. TIFF este un acronim al Tag(ged) Image File Format. Este unul din cele mai populare i flexibile tip de fiier n format raster. Desi este foarte cunoscut datorit flexibilittii si puterii de compresie, el este considerat n egal msur destul de complicat si misterios n acelasi timp. Aceasta deoarece formatul TIFF este extensibil si cu multe caracteristici de care un programator ar putea avea nevoie atunci cnd lucreaz cu imagini grafice. Din aceast cauz el este considerat si ca cel mai confuz format grafic. Tagged Image File Format are mai multe formate interne. Multe programe suport formatele de bay, ns nu suport toate formatele existente. Fisierul TIFF este organizat pe trei mari seciuni: 1. Antetul - n ciuda complexitii fiierului TIFF, acesta are un antet foarte simplu. El conine 3 cmpuri i are lungimea de 8 octei 2. Directorul Imaginii - Este o colecie de informaii folosite pentru a descrie imaginea bitmap care urmeaz. Poate prea puin cam confuz deoarece Directorul Imaginii poate aprea oriunde n fiier, dar acest lucru nu trebuie s v neliniteasc deoarece el este pus ntr-o list simplu nlnuit, 24

mpreun cu ceilali Directori, list spre care pointeaz Primul ID din Antet. Spre deosebire de structurile ntlnite pn acum n aceast serie de articole, structura Directorului Imaginii nu este fix, ea depinznd de tipul imaginii cruia i serveste ca i antet. n aceast structur se pot aduga sau scoate noi cmpuri, exact ca i paginile dintr-un dosar. 3. Zona de Date n care sunt stocate imaginile bitmap - Fiierele TIFF conin numai imagini de tip bitmap, dei cu ajutorul cmpurilor nu este exclus nici stocarea unor imagini vectoriale, sau a unor texte ( vezi i formatul GIF ). Dar acum s ne ndreptm privirea spre felul n care este stocat imaginea. Pentru aceasta avem nevoie de noiunea de bucat (sunt niste colecii de rnduri consecutive din imaginea bitmap). Din aceste trei seciuni avem nevoie doar de primele dou, existnd posibilitatea ca Zona de Date s lipseasc. TIFF are reputaia de a fi un format complicat datorit faptului c n interiorul fiierului numai antetul poate fi gsit la o locaie fix, restul seciunilor variind de la fiier la fiier. Fiecare Director al Imaginii mpreun cu bitmap-ul asociat formeaz un subfiier. Nu exist o limit a numrului de subfiiere pe care le poate contine un fiier TIFF. Formatul TIFF suport cei mai muli algoritmi de compresie. Versiunea 4.0, are inclui numai algoritmii Run Length Encoding, versiunea 5.0 adaug la acestea i algoritmul LZW, ntlnit i la formatul GIF, iar versiunea 6.0 adopt i algoritmul JPEG, algoritm care se descurc de minune cu mprirea fiierului n crmizi (o bucat dreptunghiular din imaginea bitmap, i a fost introdus datorit imaginilor TIFF foarte mari). II.3.2. Caracteristicile TIFF - TIFF este capabil s descrie tonuri de gri, o palet de culori, i toate colorile imaginilor n mai multe spai de culoare; - TIFF include un numr de scheme de compresie care permit dezvoltatorilor s aleag cel mai bun spaiu sau timp pentru aplicaiile lor; - TIFF nu este legat de anumite scanere, imprimante, sau hardware-ul computerului de afiare; - TIFF este portabil, dar aceasta nu favorizeaz anumite sisteme de operare, sisteme de fiiere, compilatoare sau procesoare; - TIFF este conceput pentru a fi extensibil, pentru a evolua cu graie la noile nevoi care apar; - TIFF permite includerea unui numr nelimitat de informaii private sau cu destinaie special. n 1994, Aldus Corporation a fuzionat cu Adobe Systems Incorporated, i astfel TIEF a evoluat rapid. n 1992, apruse versiunea 5.0, care a adus modificri de coninut tehnic i paginare, ca apoi versiunea 6.0, s aduc modificri majore n corpul principal al documentului, asfel: 25

- Informaiile sunt prezentate n caractere italice; - CMYK definiia imaginii; - s-a revizuit RGB seciunea Colorimetrie. - YCbCr definiia imaginii; - CIE L * a * b * definiia imaginii; - placate definiia imaginii; - compresie JPEG; - seciunea de compresie LZW mai clar explicat; - interaciunea dintre compresie = 2 (CCITT Huffman) i Photometricinterpretation a fost clarificat; - organizarea datelor necomprimate (compresie = 1) atunci cnd BitsPerSample este mai mare dect 8 a fost clarificat. Schimbri organizaionale - Pentru a face organizarea mai coerent, anexele au fost transformate n seciuni numerotate; - Documentul a fost mprit n dou pri, de referin i extensii, pentru a ajuta dezvoltatorii s fac alegeri mai bune i mai coerente de implementare. t. - Au fost adugate un index i cuprins. Modificrile fcute au adugat funcionalitate n aa fel nct s reduc la minimum probleme de compatibilitate cu fiiere i software-ul pe care s-au bazat pe versiunile anterioare. Obiectivul este ca fiiere TIFF s nu devin nvechit i c software-ul TIFF nu ar trebui s fie revizuite mai frecvent dect este absolut necesar. n special, fiierele Baseline TIFF 6.0 vor fi, n general, uor de citit chiar de ctre aplicaii mai vechi dect TIFF 5.0. TIFF este un format de fiier imagine. Acest document, este definit a fi o secven de octei numerotai de la 0 la N. Un fiier TIFF ncepe cu un antet 8-byte fisier indic spre un (image file Directory) IFD, care conine informatii despre imagine, precum i indicatori ctre imaginea de date reale. Un IFD const dintr-un numr de 2-octet care este numrul de intrri (de exemplu, numrul de cmpuri), urmat de o secven de cmp de 12 octei, urmat de 4-byte, offsetul urmatorului IFD (sau 0 n cazul n care nu este nici unul). Trebuie s existe cel puin 1 IFD ntr-un fiier TIFF i fiecare IFD trebuie s aib cel puin o intrare. Un cmp TIFF este o entitate logic, constnd din indexulul TIFF i valoarea sa. Acest concept logic este implementat ca o intrare IFD, plus valoarea real, dac aceasta nu se ncadreaz n valoarea / offset parte, ultimele 4 bytes de la intrarea IFD. Termeni TIFF domeniu i intrare IFD sunt interschimbabile n majoritatea contexte. Ordine de sortare nregistrri ntr-o IFD trebuie s fie sortate n ordine cresctoare de Tag. Reinei c acest lucru este nu ordinea n care cmpurile sunt descrise n acest document. Valori la care punctul List nregistrri nu trebuie s fie n orice ordine special n dosar. 26

Capitolul III BIBLIOTECA LEADTOOLS OCR .NET


LEADTOOLS OCR .NET conine unelte de programare pentru adugarea documentelor cu tehnologia OCR, rapid i uor, n aplicaii software. Folosind acest modul, programatorii pot efectua 27

recunoaterea caracterelor pe imaginii de documente i pot efectua texte de ieire n peste 20 de formate de fiiere. n plus se poate folosi pentru ieire i formatul PDF / A. Leadtools face dezvoltarea OCR mai uoar cu detectarea automat de zone, crearea de zone manual, auto orientarea, imagini de documente curate i utilizarea de valori prestabilite pentru imagini de documente comune i astfel mbuntete rezultatul recunoaterii. El suport peste 100 de limbi, precum i opiuni pentru documentele de ieire, cu opiuni pentru margini i paragrafe. Formatele acceptate de ieire includ: - Adobe Portable Document Format (PDF si PDF / A) - Microsoft Word (doc) - Hypertext Markup Language (HTML) - Text (ASCII i Unicode) - Microsoft rich text format (RTF) - Windows Enhanced Metafile (EMF) Dup Leadtools V16 a, aprut Leadtools.Forms.Ocr, care prezint un nou design, oferind: nivel nalt de proiectare, creterea uurinei de utilizare i alegerea mai multor motoare OCR. LEADTOOLS OCR .NET ofer sprijin pentru motoare OCR multiple prin : 1. LEADTOOLS OCR Advantage & nbsp include zone de detectare automat i manual, de ieire formatate, suport auto-orientare, ieiri de tip PDF i PDF / A, iar sprijinul pentru OMR este disponibil. 2. LEADTOOLS OCR Plus ofer funcii, proprieti, metode i evenimente care ncorporeaz uor zona de detectare automat i manual, de ieire formatate, auto-orientarea, dicionarele particularizate de ortografie i MICR (cerneal magnetic Character Recognition) de sprijin n aplicaiile folosite, ieiri de tip PDF si PDF / A i sprijinul ICR sunt de asemenea disponibile. 3. LEADTOOLS OCR Professional permite s se integreze cu uurin suport OCR, mai rapid i ct mai exact posibil n aplicaiile folosite, ofer de asemenea suport pentru limbile asiatice. OMR (Optical Mark Recognition), zonare Auto / Manual, ieirile formatate i PDF sunt opiuni standard, disponibile n toate motoarele de OCR, iar motoare suplimentare OCR sunt n etape de planificare i dezvoltare. Cu LEADTOOLS OCR .NET se poate dac se dorete, comutarea ntre oricare dintre motoarele OCR, fr s se schimbe codul surs sau logica programelor. Caracteristici cheie: - Suport pentru multi-threading i operaiunile bazate pe server OCR; - Crearea de documente OCR multiple documente n aplicaii, fiecare document conine propria list de pagini; - Selectarea limbii pentru utilizarea recunoaterii paginii OCR; - Utilizarea dicionarelor pentru mbuntirea rezultatelor OCR;

28

- Recunoate o serie de documente, inclusiv facsimile, documente cu fotocopii i machete complexe; - Salvarea documentului n oricare dintre multiple formate de documente de ieire, inclusiv PDF, MS Word, precum i text obinuit; - Corecteaz caracteristici ale documentelor cum ar fi: zgomot, ntunecare, iluminare pentru a obine cele mai bune posibil recunoateri de caractere; - Utilizarea inteligenei artificiale de a mbunti recunoaterea pe documente de acelai tip Software-ul nva ca rezultat al recunoaterii normale, i dobndete informaii suplimentare, prin utilizarea sistemului OCR de verificare text; - nva , salveaz i ncarc caracterele recunoascute pentru documente similare; - Segmenteaz pagini complexe, manual sau automat, n zone de text, imagine, i tabel. Instrumentele puternice de recunoaterea zonei includ: - recunoate pagini ntregi ca o zon; - specificaii manuale i de recunoatere pentru zonele multiple n cadrul fiecrei pagini; - segmentarea automat a zonei pentru crearea de zone multi-strat i recunoterea zonelor cum ar fi tabele, rigle, imagini i text; - diferite module de recunoatere specializate pentru fiecare zon, inclusiv OMR, MOR, MTX, i FireWorX; - afieaz paginile documentului cu sau fr zonele lor; - importul i exportul din zone i fiiere; - recunoate txtul i culori n tabele. Caracteristici suplimentare: * Recunoate text de la 5 la 72 puncte n practic orice font; * Recunoate mai multe limbi ntr-un singur document; * Recunoate i export text, alegnd dintr-o varietate de text, procesare de text, baze de date, foi de calcul sau formate de fiiere; * Proceseaz documentele n mod dubl pagin pentru cri i reviste. Module recunoscute: Trei module specializate de recunoaterea OCR sunt acceptate. Fiecare document poate conine mai multe zone de OCR, i fiecare zon poate folosi oricare din urmtoarele module OCR: 1. Modulul OCR OMR (Optical Mark Recognition) este folosit pentru a captura date marcate uman, cum ar fi studii sau teste. Un domeniu OMR poate fi un ptrat, un cerc sau chiar un semn de selectare pentru: - Numar nelimitat de zone OMR - Precizie de raportare 29

- Auto-detectare de cadre. 2. Modulul OCR MOR Acest modul se poate ocupa n condiii de siguran de formatul A3 (LQ, calitate aproape letter sau letter, bun n maini de scris mecanice imprimante cu laser sau cu jet de cerneal, i imprimante electrice. - Suport pn la 500 de zone, pe imagine - Suport OmniFont, Draftdot24 i-OCR A, metode de umplere - Ofer 3 nivele de precizie i vitez, exact, echilibrat i rapid - Ofer verificarea subsistemului pe baza de corecie. 3. Modulul OCR MTX (MTEXT). Acest modul se poate ocupa n condiii de siguran de format A3 (11.69 x 16.54 "), imagini portret i peisaj cu rezoluie 300 dpi. El recunoate imprimate pe main text de publicaii tiprite, imprimante cu laser sau cu jet de cerneal, i maini de scris electrice. Ieiri pentru maini de scris mecanice n bune condiii, calitate letter, calitate aproape letter i imprimante matriciale sunt deasemenea acceptate. Sunt suportate numai imagini cu o rezoluie n urmtoarele intervale: 90-110, 160-240, 280320, 400, 600. Acest modul nu proceseaz imagini mai mari de 6600 de pixeli, n lungime sau lime - Cel mai rapid din modulele OCR selectabile; - Suport pn la 64 zone, pe de o imagine; - Suport OmniFont, Draftdot9 i Draftdot24 metode de umplere; - Ofer 2 nivele de precizie i vitez, combinaii ntre exact, echilibrat i rapid - Ofer verificarea subsistemului pe baza de corecie; 4. Modulul OCR FireWorX OCR recunoate scris tiprit de main din publicaii tiprite, imprimante cu laser sau cu jet de cerneal, i maini de scris electrice. Ieire pentru maini de scris mecanice n bune condiii i din calitate letter sau aproape letter (LQ, NLQ). Imprimantele matriciale sunt deasemenea acceptate. Optimizat pentru vitez. - Suport pn la 2.500 de zone pe imagine; - Suport metode de umplere OmniFont. Medii suportate Librriile LEADTOOLS OCR .NET vin n ediii pentru Windows pe 32 i 64 de bii, care pot sprijini dezvoltarea de aplicaii software pentru oricare din mediile urmtoarele: - Windows Vista (32 i 64-bit); - Windows 2008 (32 i 64-bit); - Windows XP (32 i 64-bit); - Windows 2000. Putei ncepe s utilizai LEADTOOLS pentru .NET OCR n aplicaia dumneavoastr prin adugarea referinelor Leadtools.Forms.Ocr.dll i Leadtools.Forms.DocumentWriter.dll. Aceste 30

conin diferite interfee, clase, structuri i delegate utilizate pentru a programa cu LEADTOOLS OCR. De moment, kitul de unelte suport mai multe motoare, codul actual, care interacioneaz cu motorul este stocat ntr-un ansamblu separat care va fi ncrcat dinamic atunci cnd o instan a interfeei IOcrEngine este creat. Prin urmare, trebuie s v asigurai c referirea la motor, pe care plnuii s o folosii se afl alturi de Leadtools.Forms.Ocr.dll. Putei aduga motorul de asamblare ca o referire la proiectul dumneavoastra daca se doreste detectarea automat a dependenelor, chiar dac acest lucru nu este cerut de LEADTOOLS.

Capitolul IV APLICAIA TGRILA IV.1. Interfaa


Aplicaia TGril este realizat in Microsoft Visual C# 2008 i face parte din categoria Windows Form Applications, avnd o interfa intuitiv i uor de utilizat, realizat cu ajutorul formurilor. 31

Interfaa este constituit dintr-o zon n care sunt afiate abloanele pentru testele gril, respectiv testele gril ale elevilor i studenilor, deasupra creia se regsete o bar de meniuri ce permite accesarea diverselor funcii ale aplicaiei cu ajutorul mouse-ului. IV.1.1. Zona de afiare Zona de afiare este mparti n dou subzone, una pentru afiarea ablonului grilei, ce conine rspunsurile corecte la fiecare dintre cele 16 ntrebri, iar cea de-a doua pentru afiarea grilelor cu rspunsurile oferite de ctre persoanele care au susinut respectivul test gril. Iniial ambele subzone sunt dezactivate i rmn n aceast stare pn la ncrcarea unui ablon, respectiv a cel puin o gril. abloanele i grilele folosite reprezint fiiere cu imagini in format TIF, care la ncrcare sunt procesate cu ajutorul bibliotecilor OCR LEADTOOLS i transformate n iruri de caractere uor manipulabile. Prealabil ncrcrii unui ablon este necesar selectarea materiei la care s-a susinut respectivul test gril, ablonul ct i grilele coninnd elemente de recunoatere a materiei, n felul acesta evitndu-se eventualele ncurcturi : folosirea unor abloane sau grile ale altei materii dect cea dorit; folosirea unui ablon aparinnd unei materii i a unor grile aparinnd unei materii diferite de Deasemenea, ncrcarea unei grile se poate realiza doar dup ncarcarea unui ablon. Odat ncrcat un ablon, zona rezervat afirii acestuia va conine variantele de rspuns corecte pentru fiecare dintre cele 16 ntrebri componente. Un proces asemntor are loc i n momentul ncrcrii unei grile, cu diferena c pe lng afiarea rspunsurilor bifate n cadrul grilei, aplicaia afieaz numele i prenumele celui care a completat grila, mpreun cu nota obinut de persoana respectiv n baza rspunsurilor bifate pe gril. n cazul ncrcrii a mai multor grile n acelai timp, prima dintre acestea va fi afiat, oferindu-se posibilitatea comutrii de pe o gril pe alta cu ajutorul unor butoane de navigare. Aplicaia ofer posibilitatea salvrii notelor i a rspunsurilor regsite pe grile, in fiiere cu format text pentru eventuale verificri suplimentare n cazul unor nelmuriri sau reclamaii survenite ulterior. IV.1.2 Bara de meniuri Bara de meniuri este compus din 3 meniuri : Fiier, Examen i Ajutor. IV.1.2.1 Meniul Fiier Meniul Fiier (vezi Anexa 1, pag. 37, fig. 1) conine opiunile pentru lucrul cu fiierele : 32

cea a ablonului.

opiunea Deschide ablon este folosit pentru deschiderea unui ablon cu rspunsurile corecte din cadrul unui test gril i devine activ doar n momentul n care utilizatorul a ales o materie;

opiunea Deschide Gril este folosit pentru deschiderea uneia sau mai multe grile cu rspunsurile oferite de ctre persoanele ce au susinut testul gril i devine activ doar n momentul deschiderii unui ablon valid pentru materia selectat;

opiunea nchide Gril este folosit pentru a nchide grila curent. n cazul n care grila curent este singura gril deschis, zona rezervat afirii grilelor devine inactiv; optiunea nchide Toate Grilele este folosit pentru a nchide toate grilele deschise. n momentul nchiderii acestora, zona rezervat afirii grilelor devine inactiv; opiunea nchide ablon este folosit pentru a nchide ablonul curent. Odat cu nchiderea acestuia are loc i nchiderea tuturor grilelor deschise. n cazul n care grilele deschise nu au fost salvate, aplicaia solicit utilizatorului s specifice dac dorete sau nu salvarea grilelor, oferind posibilitatea de anulare a operaiunii de nchidere a ablonului;

opiunea Ieire este folosit pentru nchiderea aplicaiei. Odat cu nchiderea aplicaiei are loc i nchiderea ablonului curent ct i a grilelor deschise, aplicaia oferind posibilitatea salvrii eventualelor grile nesalvate sau anulrii operaiunii de nchidere a aplicaiei. IV.1.2.2. Meniul Examen Meniul Examen (vezi Anexa 1, pag. 37, fig. 2) conine opiunile pentru gestionarea

elementelor referitoare la examenul de tip gril : opiunea Materii este folosit pentru a selecta materia de care aparin testele gril ce urmeaz a fi procesate i este una dintre puinele opiuni disponibile la pornirea aplicaiei; opiunea Rezultate este folosit pentru afiarea notelor grilelor deschise; opiunea Salvare Note este folosit pentru salvarea ntr-un fiier text a notelor corespunztoare grilelor deschise la momentul respectiv; opiunea Salvare Grile este folosit pentru salvarea ntr-un fiier text a rspunsurilor bifate pe fiecare dintre grilele deschise la momentul respectiv. IV.1.2.3. Meniul Ajutor Meniul Ajutor (vezi Anexa 1, pag. 38, fig. 3) conine o singur opiune referitoare la informaiile despre aplicaie : autorul acesteia, drepturile de autor, anul realizrii etc.

IV.2. Cod
Codul aplicaiei are n componena sa dou pari distincte. Prima dintre acestea o constituie codul generat automat de ctre mediul de dezvoltare Visual C# (vezi Anexa 2, pag. 39) n momentul crerii sau modificrii de obiecte, respectiv a obiectelor deja existente, iar cea de-a doua parte a sa o 33

constituie codul scris de ctre dezvoltatorul aplicaiei. Acesta din urm se regsete n majoritatea fiierelor componente ale codului surs al aplicaiei. Fiecare dintre ferestrele aplicaiei are n spatele su o parte de cod scris de ctre dezvoltator, iar pe lng acesta, cod scris de ctre dezvoltator se mai gsete i n clasa Variabile din cadrul fiierului Class1.cs. Fereastra principal a aplicaiei conine cod care se execut n momentul alegerii uneia dintre opiunile din bara de meniuri i care are rolul de a deschide noi ferestre ale aplicaiei, ct i de deschidere, procesare i afiare a coninutului abloanelor, respectiv a grilelor. (vezi Anexa 3, pag. 50) Fereastra de alegere a materiei ale crei grile urmeaz a fi procesate conine cod surs ce se ocup de aflarea materiei selectate din lista de materii i de procesarea rspunsurilor returnate de ctre ferestrele ce se deschid prin intermediul acesteia. (vezi Anexa 4, pag. 58) Fereastra de adugare a unei noi materii conine cod surs ce se ocup de verificarea existenei deja pe lista de materii a materiei ce se dorete a fi adugat, ct i de adugare a acesteia n cazul n care nu exist deja pe list. (vezi Anexa 5, pag. 61) Clasa Variabile conine cod surs ce se ocup de citirea/scrierea unor variabile globale ce conin informaii necesare a fi folosite n diversele ferestre ale aplicaiei. (vezi Anexa 6, pag. 63)

IV.3. Butoane
Butoanele folosite n cadrul aplicaiei TGril se mpart n dou categorii : butoane care confirm sau anuleaz o anumit operaiune; butoane care deschid o nou fereastr n cadrul aplicaiei. Butoanele din prima categorie se regsesc n toate ferestrele aplicaiei, mai puin n fereastra principal, sub diferite forme : Accept/Renun, Da/Nu. n afar de acestea mai exist o serie de butoane ce se regsesc n cadrul festrelor de avertizare n privina unei anumite erori, cum ar fi cele care avertizeaz asupra formatului necorespunztor materiei respective a abloanelor sau a grilelor ce se doresc a se deschide. Butoanele din cea de-a doua categorie se regsesc n fereastra de selectare, adugare sau tergere a unei materii din lista cu materii i sunt folosite pentru a aduga o materie nou, respectiv pentru tergerea unei materii deja existente.

IV.4. Sistem de notare


Sistemul de notare const n atribuirea a 0,5 puncte pentru fiecare ntrebare, plus 2 puncte din oficiu. Pentru ntrebrile cu rspuns simplu, fiecare variant de rspuns corect valoreaz 0,5 puncte, 34

iar pentru ntrebrile cu rspuns multiplu, fiecare dintre cele 2 variante corecte valoreaz 0,25 puncte. Alegerea a mai mult sau mai puin de o variant n cazul ntrebrilor cu rspuns simplu, respectiv alegerea unei variante greite n cazul ntrebrilor cu rspuns multiplu, duce la excluderea din calculul notei a respectivei ntrebri.

IV.5. Siguran
Aplicaia conine secvene de cod ce au rolul de a verifica acurateea informaiilor preluate din fiierele cu imagini, fie ele abloane, fie grile. Astfel, n cazul n care se ncearc ncrcarea unui ablon, respectiv a uneia sau mai multe grile, ce aparin altei materii dect cea selectat n prealabil, utilizatorul este avertizat, iar operaiunea de ncrcare a ablonului, respectiv a grilelor, este anulat. Deasemenea, n momentul n care rspunsurile bifate pe ablon, respectiv gril, nu au fost procesate pentru toate cele 16 ntrebri, sau numrul uneia dintre ntrebri nu este lizibil, aplicaia avertizeaz utilizatorul asupra acestui fapt, indicnd repetarea procesului de achiziie a imaginii respective, anulnd operaiunea de ncrcare a ablonului sau a grilei.

CONCLUZII I PROPUNERI
Aplicaia Tgril este o aplicaie cu utilitate n toate domeniile nvmntului, uurnd procesul de corectare a testelor de tip gril, altfel un proces anevoios care necesit mult atenie i concentrare din partea examinatorului. Datorit nivelului avansat la care a ajuns tehnologia de recunoatere optic a caracterelor, aplicaia reuete cu uurint s extrag informaiile necesare punctrii lucrrii, din imaginile obinute prin fotografierea sau scanarea testelor gril. Lund n considerare faptul ca la ora actuala Tehnologia Informaiei a ptruns n toate domeniile de activitate i n casele tuturor aproape, opiunile de salvare automat a notelor si rspunsurilor n format electronic uureaz munca examinatorului i scade substanial timpii necesari comunicrii rezultatelor, fiind la

35

ndemn, afiarea acestora pe un sit de exemplu sau transmiterea lor prin intermediul potei electronice. Din punct de vedere al dezvoltrii ulterioare a aplicaiei, una dintre opiunile care poate fi foarte util, o reprezint posibilitatea transmiterii automate a rezultatelor spre un server al unitii de nvmnt, n felul acesta aducerea notelor la cunotina persoanelor examinate, din momentul calculrii acestora de ctre aplicaie, putndu-se face mult mai rapid i fr necesitatea interveniei umane. Deasemenea cu ajutorul unei aplicaii web realizate pentru serverul care centralizeaz informaiile transmise de ctre aplicaia Tgril, se poate oferi posibilitatea ca fiecare dintre persoanele examinate, n baza unui cont i a unei parole, s aib posibilitatea s verifice care erau rspunsurile corecte i unde anume a greit, pentru fiecare dintre ntrebri.

BIBLIOGRAFIE
1. Ion Smeureanu, Marian Drdal, Adriana Reveiu, Visual C# .Net, Editura CISON, Bucureti 2004 2. Tom Archer Inside C#, Microsoft Press, USA 2001 3. Charles Petzold - Programare Windows cu C#, Editura Teora 4. Horia Ciocrlie, Limbaje de programare. Concepte fundamentale, Editura de Vest, 2007. 5. Horia Ciocrlie, Universul limbajelor de programare, Editura Orizonturi Universitare, 2006. 6. Horia Ciocrlie, Petru Eles, Ioan Balla, Programarea concurent n limbaje de nivel nalt, Editura Facla, 1985. 36

7. Horia Ciocrlie, Tehnici fundamentale de programare, Editura Orizonturi Universitare, 2002. 8. Petru Eles, Horia Ciocrlie, Programarea concurent n limbaje de nivel nalt, Editura Stiinifica, 1991. 9. Horia Ciocrlie, Petru Eles, Conceptele fundamentale ale limbajelor de programare, notie de curs, 1995-2005. 10. Horia Ciocrlie, Rodica Ciocrlie, Utilizarea i programarea calculatoarelor, Editura Orizonturi Universitare, 2004. 11. Ioan Georgescu, Elemente de inteligen artificial, Editura Academiei Republicii Socialiste Romnia, Bucureti, 1985 12. Vladimir Creu, Structuri de date i algoritmi, vol. 1, Structuri de date fundamentale, Editura Orizonturi Universitare, 2000. 13. Vladimir Creu, Structuri de date i algoritmi, vol. 2, Structuri de date avansate, Editura Orizonturi Universitare, 2005. 14. Gregory R. Andrews, Concurrent programming: principles and practice, Benjamin/Cummings Publishing Company, 1991. 15. Lucian Sasu, Programare C# - note de curs 16. Programming C#, Jesse Liberty, 4th edition, 2005 17. John Sharp, Microsoft Visual C# 2005 Step by Step, Microsoft Press, USA, 2005 18. Stephen C. Perry, Core C# and .NET, Prentice Hall, 2005 19. http://msdn.microsoft.com/en-gb/vcsharp/default.aspx 20. John Sharp, Microsoft Visual C# 2008 Step by Step, Microsoft Press, USA, 2007

ANEXE Anexa 1
Meniul Fiier :

37

Fig. 1 Meniul Examen :

Fig. 2 Meniul Ajutor :

38

Fig. 3

Anexa 2
39

Codul surs generat automat de mediul Visual C# :


namespace TGrila { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fisierToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deschideSablonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deschideGrilaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.inchideGrilaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.inchideToateGrileleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.inchideSablonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.iesireToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.examenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.materiiToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.rezultateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.salvareNoteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.salvareGrileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ajutorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.despreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();

40

this.button1 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.button5 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); this.button7 = new System.Windows.Forms.Button(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fisierToolStripMenuItem, this.examenToolStripMenuItem, this.ajutorToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(793, 24); this.menuStrip1.TabIndex = 0; this.menuStrip1.Text = "menuStrip1"; // // fisierToolStripMenuItem // this.fisierToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.deschideSablonToolStripMenuItem, this.deschideGrilaToolStripMenuItem, this.inchideGrilaToolStripMenuItem, this.inchideToateGrileleToolStripMenuItem, this.inchideSablonToolStripMenuItem, this.toolStripSeparator1, this.iesireToolStripMenuItem}); this.fisierToolStripMenuItem.Name = "fisierToolStripMenuItem"; this.fisierToolStripMenuItem.Size = new System.Drawing.Size(44, 20); this.fisierToolStripMenuItem.Text = "&Fisier"; // // deschideSablonToolStripMenuItem // this.deschideSablonToolStripMenuItem.Name = "deschideSablonToolStripMenuItem"; this.deschideSablonToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.deschideSablonToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.deschideSablonToolStripMenuItem.Text = "Deschide &Sablon"; this.deschideSablonToolStripMenuItem.Click += new System.EventHandler(this.deschideSablonToolStripMenuItem_Click); // // deschideGrilaToolStripMenuItem // this.deschideGrilaToolStripMenuItem.Name = "deschideGrilaToolStripMenuItem"; this.deschideGrilaToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); this.deschideGrilaToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.deschideGrilaToolStripMenuItem.Text = "Deschide &Grila"; this.deschideGrilaToolStripMenuItem.Click += new System.EventHandler(this.deschideGrilaToolStripMenuItem_Click); // // inchideGrilaToolStripMenuItem // this.inchideGrilaToolStripMenuItem.Name = "inchideGrilaToolStripMenuItem";

41

this.inchideGrilaToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L))); this.inchideGrilaToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.inchideGrilaToolStripMenuItem.Text = "Inchide Gri&la"; // // inchideToateGrileleToolStripMenuItem // this.inchideToateGrileleToolStripMenuItem.Name = "inchideToateGrileleToolStripMenuItem"; this.inchideToateGrileleToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.T))); this.inchideToateGrileleToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.inchideToateGrileleToolStripMenuItem.Text = "Inchide &Toate Grilele"; // // inchideSablonToolStripMenuItem // this.inchideSablonToolStripMenuItem.Name = "inchideSablonToolStripMenuItem"; this.inchideSablonToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.B))); this.inchideSablonToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.inchideSablonToolStripMenuItem.Text = "Inchide Sa&blon"; this.inchideSablonToolStripMenuItem.Click += new System.EventHandler(this.inchideSablonToolStripMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(218, 6); // // iesireToolStripMenuItem // this.iesireToolStripMenuItem.Name = "iesireToolStripMenuItem"; this.iesireToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); this.iesireToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.iesireToolStripMenuItem.Text = "&Iesire"; this.iesireToolStripMenuItem.Click += new System.EventHandler(this.iesireToolStripMenuItem_Click); // // examenToolStripMenuItem // this.examenToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.materiiToolStripMenuItem, this.rezultateToolStripMenuItem, this.salvareNoteToolStripMenuItem, this.salvareGrileToolStripMenuItem}); this.examenToolStripMenuItem.Name = "examenToolStripMenuItem"; this.examenToolStripMenuItem.Size = new System.Drawing.Size(57, 20); this.examenToolStripMenuItem.Text = "&Examen"; // // materiiToolStripMenuItem // this.materiiToolStripMenuItem.Name = "materiiToolStripMenuItem";

42

this.materiiToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.M))); this.materiiToolStripMenuItem.Size = new System.Drawing.Size(213, 22); this.materiiToolStripMenuItem.Text = "&Materii"; this.materiiToolStripMenuItem.Click += new System.EventHandler(this.materiiToolStripMenuItem_Click); // // rezultateToolStripMenuItem // this.rezultateToolStripMenuItem.Name = "rezultateToolStripMenuItem"; this.rezultateToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R))); this.rezultateToolStripMenuItem.Size = new System.Drawing.Size(213, 22); this.rezultateToolStripMenuItem.Text = "&Rezultate"; // // salvareNoteToolStripMenuItem // this.salvareNoteToolStripMenuItem.Name = "salvareNoteToolStripMenuItem"; this.salvareNoteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); this.salvareNoteToolStripMenuItem.Size = new System.Drawing.Size(213, 22); this.salvareNoteToolStripMenuItem.Text = "Salvare &Note"; // // salvareGrileToolStripMenuItem // this.salvareGrileToolStripMenuItem.Name = "salvareGrileToolStripMenuItem"; this.salvareGrileToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.salvareGrileToolStripMenuItem.Size = new System.Drawing.Size(213, 22); this.salvareGrileToolStripMenuItem.Text = "&Salvare Grile"; // // ajutorToolStripMenuItem // this.ajutorToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.despreToolStripMenuItem}); this.ajutorToolStripMenuItem.Name = "ajutorToolStripMenuItem"; this.ajutorToolStripMenuItem.Size = new System.Drawing.Size(49, 20); this.ajutorToolStripMenuItem.Text = "&Ajutor"; // // despreToolStripMenuItem // this.despreToolStripMenuItem.Name = "despreToolStripMenuItem"; this.despreToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); this.despreToolStripMenuItem.Size = new System.Drawing.Size(158, 22); this.despreToolStripMenuItem.Text = "&Despre"; // // button1 // this.button1.BackColor = System.Drawing.Color.Goldenrod; this.button1.Enabled = false; this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;

43

this.button1.Location = new System.Drawing.Point(391, 27); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(10, 392); this.button1.TabIndex = 1; this.button1.UseVisualStyleBackColor = false; // // button4 // this.button4.BackColor = System.Drawing.Color.Goldenrod; this.button4.Enabled = false; this.button4.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.button4.Location = new System.Drawing.Point(783, 27); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(10, 289); this.button4.TabIndex = 4; this.button4.UseVisualStyleBackColor = false; // // button5 // this.button5.BackColor = System.Drawing.Color.Goldenrod; this.button5.Enabled = false; this.button5.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.button5.Location = new System.Drawing.Point(-1, 27); this.button5.Name = "button5"; this.button5.Size = new System.Drawing.Size(10, 392); this.button5.TabIndex = 5; this.button5.UseVisualStyleBackColor = false; // // button6 // this.button6.BackColor = System.Drawing.Color.Goldenrod; this.button6.Enabled = false; this.button6.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.button6.Location = new System.Drawing.Point(-1, 306); this.button6.Name = "button6"; this.button6.Size = new System.Drawing.Size(794, 10); this.button6.TabIndex = 6; this.button6.UseVisualStyleBackColor = false; // // button7 // this.button7.BackColor = System.Drawing.Color.Goldenrod; this.button7.Enabled = false; this.button7.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.button7.Location = new System.Drawing.Point(0, 27); this.button7.Name = "button7"; this.button7.Size = new System.Drawing.Size(793, 10); this.button7.TabIndex = 7; this.button7.UseVisualStyleBackColor = false; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(793, 421); this.Controls.Add(this.button7); this.Controls.Add(this.button6); this.Controls.Add(this.button5); this.Controls.Add(this.button4); this.Controls.Add(this.button1); this.Controls.Add(this.menuStrip1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MainMenuStrip = this.menuStrip1; this.MaximizeBox = false; this.MinimizeBox = false;

44

this.Name = "Form1"; this.ShowIcon = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Teste Grila"; this.Shown += new System.EventHandler(this.Form1_Shown); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem fisierToolStripMenuItem; public System.Windows.Forms.ToolStripMenuItem deschideSablonToolStripMenuItem; public System.Windows.Forms.ToolStripMenuItem deschideGrilaToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem iesireToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem examenToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem materiiToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem rezultateToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem ajutorToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem despreToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem inchideGrilaToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem inchideToateGrileleToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem inchideSablonToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem salvareNoteToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem salvareGrileToolStripMenuItem; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button4; private System.Windows.Forms.Button button5; private System.Windows.Forms.Button button6; private System.Windows.Forms.Button button7; } } namespace TGrila { partial class Form2 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose();

45

} base.Dispose(disposing);

#region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.listBox1 = new System.Windows.Forms.ListBox(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(213, 36); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 1; this.button1.Text = "Adauga"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(213, 94); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 2; this.button2.Text = "Sterge"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // button3 // this.button3.DialogResult = System.Windows.Forms.DialogResult.OK; this.button3.Location = new System.Drawing.Point(12, 162); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(75, 23); this.button3.TabIndex = 3; this.button3.Text = "Accepta"; this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // // button4 // this.button4.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.button4.Location = new System.Drawing.Point(132, 162); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(75, 23); this.button4.TabIndex = 4; this.button4.Text = "Renunta"; this.button4.UseVisualStyleBackColor = true; this.button4.Click += new System.EventHandler(this.button4_Click); // // listBox1 // this.listBox1.FormattingEnabled = true; this.listBox1.Location = new System.Drawing.Point(12, 12);

46

this.listBox1.Name = "listBox1"; this.listBox1.Size = new System.Drawing.Size(195, 134); this.listBox1.TabIndex = 5; this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged); // // Form2 // this.AcceptButton = this.button3; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.CancelButton = this.button4; this.ClientSize = new System.Drawing.Size(294, 197); this.Controls.Add(this.listBox1); this.Controls.Add(this.button4); this.Controls.Add(this.button3); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form2"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Selectare materie"; this.Load += new System.EventHandler(this.Form2_Load); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button private System.Windows.Forms.Button private System.Windows.Forms.Button private System.Windows.Forms.Button public System.Windows.Forms.ListBox } } button1; button2; button3; button4; listBox1;

namespace TGrila { partial class Form3 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing);

47

} #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(13, 9); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(258, 13); this.label1.TabIndex = 0; this.label1.Text = "Introduceti numele materiei care doriti sa fie adaugate"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(41, 35); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(203, 20); this.textBox1.TabIndex = 1; this.textBox1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyUp); // // button1 // this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; this.button1.Location = new System.Drawing.Point(41, 77); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 2; this.button1.Text = "Accepta"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.button2.Location = new System.Drawing.Point(169, 77); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 3; this.button2.Text = "Renunta"; this.button2.UseVisualStyleBackColor = true; // // Form3 // this.AcceptButton = this.button1; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.button2; this.ClientSize = new System.Drawing.Size(284, 112); this.Controls.Add(this.button2); this.Controls.Add(this.button1);

48

this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form3"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Adaugare materie"; this.Load += new System.EventHandler(this.Form3_Load); this.ResumeLayout(false); this.PerformLayout(); } #endregion private private private private System.Windows.Forms.Label label1; System.Windows.Forms.TextBox textBox1; System.Windows.Forms.Button button1; System.Windows.Forms.Button button2;

} }

namespace TGrila { partial class Form4 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // label1 //

49

this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(21, 9); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(250, 13); this.label1.TabIndex = 0; this.label1.Text = "Sunteti siguri ca doriti sa stergeti materia selectata ?"; // // button1 // this.button1.DialogResult = System.Windows.Forms.DialogResult.Yes; this.button1.Location = new System.Drawing.Point(51, 38); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 1; this.button1.Text = "Da"; this.button1.UseVisualStyleBackColor = true; // // button2 // this.button2.DialogResult = System.Windows.Forms.DialogResult.No; this.button2.Location = new System.Drawing.Point(167, 38); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 2; this.button2.Text = "Nu"; this.button2.UseVisualStyleBackColor = true; // // Form4 // this.AcceptButton = this.button1; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.button2; this.ClientSize = new System.Drawing.Size(292, 73); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form4"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Confirmare stergere materie"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2;

} }

50

Anexa 3
Codul surs al ferestrei principale :
using using using using using using using using using using using using using using using System; System.IO; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms; System.Text.RegularExpressions; Leadtools; Leadtools.Forms; Leadtools.Codecs; Leadtools.WinForms; Leadtools.Forms.Ocr;

namespace TGrila { public partial class Form1 : Form { private IOcrEngine _ocrEngine; private ICollection<OcrWord> _wordList; public Form1() { InitializeComponent(); Variabile.HomeDir = Directory.GetCurrentDirectory(); _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Plus, } _ocrEngine.Startup(null, null, null);

false);

private void iesireToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } private void materiiToolStripMenuItem_Click(object sender, EventArgs e) { Form2 AlegeMaterie = new Form2(); DialogResult rezultat = AlegeMaterie.ShowDialog(); if (rezultat == DialogResult.OK) { deschideSablonToolStripMenuItem.Enabled = true; inchideSablonToolStripMenuItem.Enabled = true; } } private void Form1_Shown(object sender, EventArgs e) { if (Variabile.MateriaCurenta == "") { deschideSablonToolStripMenuItem.Enabled = false; deschideGrilaToolStripMenuItem.Enabled = false; inchideGrilaToolStripMenuItem.Enabled = false; inchideSablonToolStripMenuItem.Enabled = false; inchideToateGrileleToolStripMenuItem.Enabled = false; } }

51

private void deschideSablonToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog DeschideSablon = new OpenFileDialog(); DeschideSablon.InitialDirectory = Variabile.HomeDir + "\\sabloane"; DeschideSablon.Filter = "Fisiere TIF (*.tif)|*.tif"; DeschideSablon.RestoreDirectory = true; if (DeschideSablon.ShowDialog() == DialogResult.OK) { Recunoastere(DeschideSablon.FileName); if (!ListaValida(Variabile.ListaCuvinte)) { MessageBox.Show("Sablonul selectat este neclar sau nu are formatul corespunzator", "Eroare incarcare sablon", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { Variabile.RaspunsuriCorecte = GetAnswers(Variabile.ListaCuvinte,Variabile.NrCuvLoad); DrawChecks('s'); deschideGrilaToolStripMenuItem.Enabled = true; } for (int i = 0; i < Variabile.ListaCuvinte.Length; i++) { this.textBox1.Text = this.textBox1.Text = Variabile.ListaCuvinte[i]; } } } private void Recunoastere(string fisier) { using (IOcrDocument ocrDocument = _ocrEngine.DocumentManager.CreateDocument()) { Leadtools.Forms.Ocr.IOcrPage ocrPage = ocrDocument.Pages.AddPage(fisier, null); ocrPage.RecognizeText(null); IOcrPageCharacters ocrPageCharacters = ocrPage.GetRecognizedCharacters(); int i = 0; foreach (IOcrZoneCharacters ocrZoneCharacters in ocrPageCharacters) { this._wordList = ocrZoneCharacters.GetWords(ocrPage.DpiX, ocrPage.DpiY, LogicalUnit.Inch); foreach (OcrWord word in this._wordList) { Variabile.ListaCuvinte[i] = word.Value; i++; } Variabile.NrCuvLoad = i; } } } private int lindex(string[] lista, string element) { string gasit=""; bool found = false; int i = 0; foreach (string elem in lista) { if (elem != null) { if (elem.ToLower() == element.ToLower()) { gasit = element;

52

} } else { } i++;

found = true; break;

break;

} if (found) { return i; } else { return -1; }

private bool ListaValida(string[] listacuv) { bool evalid = true; int i = 1; while (i <= Variabile.NrIntrebari) { if (lindex(listacuv, i.ToString())==-1) { evalid = false; break; } i++; } return evalid; } private string GetRangeAnswers(string[] listacuv, int startindex, int endindex, int curentq) { string raspuns = ""; for (int i = startindex+1; i <= endindex; i++) { string elem = ""; elem = listacuv[i].ToLower(); if (elem == "a" || elem == "b" || elem == "c" || elem == "d") { switch (elem) { case "a": raspuns = raspuns + "a"; break; case "b": raspuns = raspuns + "b"; break; case "c": raspuns = raspuns + "c"; break; case "d": raspuns = raspuns + "d"; break; } } } string raspuns1 = ""; if (raspuns.IndexOf("a") == -1) { raspuns1 = raspuns1 + "a"; } if (raspuns.IndexOf("b") == -1) {

53

raspuns1 = raspuns1 + "b"; } if (raspuns.IndexOf("c") == -1) { raspuns1 = raspuns1 + "c"; } if (raspuns.IndexOf("d") == -1) { raspuns1 = raspuns1 + "d"; } return raspuns1; } private string GetAnswers(string[] listacuv, int dimensiunelista) { string raspunsuri = ""; int pozcurq = lindex(Variabile.ListaCuvinte, "1"); int poznextq = lindex(Variabile.ListaCuvinte, "2"); int curq = 1; int nextq = 2; while (curq <= Variabile.NrIntrebari) { if (curq != Variabile.NrIntrebari) { raspunsuri = raspunsuri + curq.ToString() + GetRangeAnswers(listacuv, pozcurq, poznextq, curq); } else { raspunsuri = raspunsuri + curq.ToString() + GetRangeAnswers(listacuv, pozcurq, Variabile.NrCuvLoad-1, curq); } curq++; nextq = curq + 1; pozcurq = lindex(Variabile.ListaCuvinte, curq.ToString()); poznextq = lindex(Variabile.ListaCuvinte, nextq.ToString()); } return raspunsuri; } private void DrawChecks(char tipd) { int x = 0; int xpoz = 0; int ypoz = 70; if (tipd == 's') { xpoz = 392; } for (int i = 0; i < Variabile.NrIntrebari; i++) { for (int j = 1; j < 5; j++) { CheckBox checkb = new CheckBox(); checkb.Name = "CheckBox" + tipd.ToString() + (i+1).ToString() + j.ToString(); checkb.AutoSize = true; checkb.Appearance = Appearance.Button; if (i < 8) { x = xpoz + j * 30 + 50; } else { x = xpoz + j * 30 + 245; }

54

checkb.Location = new Point(x, ypoz + (i % 8) * 30); switch (j % 4) { case 1: checkb.Text = "a"; break; case 2: checkb.Text = "b"; break; case 3: checkb.Text = "c"; break; case 0: checkb.Text = "d"; break; } checkb.TextAlign = ContentAlignment.MiddleCenter; bool checkstate = GetCheckState(i + 1, j - 1, tipd); if (checkstate) { checkb.Checked = true; checkb.BackColor = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192))))); } else { checkb.Checked = false; checkb.BackColor = SystemColors.ButtonFace; } checkb.Enabled = false; this.Controls.Add(checkb); } Label eticheta = new Label(); eticheta.Name = "eticheta" + (i+1).ToString(); eticheta.Text = "Intrebarea " + (i+1).ToString(); eticheta.Location = new Point(x - 160, ypoz + (i % 8) * 30 + 5); eticheta.Anchor = AnchorStyles.Left; eticheta.AutoSize = true; eticheta.TextAlign = ContentAlignment.MiddleLeft; this.Controls.Add(eticheta); } } private bool GetCheckState(int x, int y,char tip) { bool ValCheck = false; string listarasp = ""; string charlist = "abcd"; if (tip == 's') { listarasp = Variabile.RaspunsuriCorecte; } else { listarasp = Variabile.RaspunsuriGrile[Variabile.NrGrilaCurenta]; } int pozi = listarasp.IndexOf(x.ToString()); if (x > 9) { pozi++; } int poze = listarasp.IndexOf((x + 1).ToString()); if (x == 16) { poze = listarasp.Length; } for (int contor = pozi; contor < poze; contor++){ if (listarasp[contor] == charlist[y]) { ValCheck = true;

55

break; } return ValCheck; }

private void deschideGrilaToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog DeschideGrila = new OpenFileDialog(); DeschideGrila.InitialDirectory = Variabile.HomeDir + "\\grile"; DeschideGrila.Filter = "Fisiere TIF (*.tif)|*.tif"; DeschideGrila.RestoreDirectory = true; DeschideGrila.Multiselect = true; if (DeschideGrila.ShowDialog() == DialogResult.OK) { bool totulok = true; int i = 0; foreach (string numefisier in DeschideGrila.FileNames) { Recunoastere(numefisier); if (!ListaValida(Variabile.ListaCuvinte)) { MessageBox.Show("Grila continuta de fisierul "+numefisier+" este neclara sau nu are formatul corespunzator", "Eroare incarcare sablon", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); totulok = false; break; } else { Variabile.RaspunsuriGrile[i] = GetAnswers(Variabile.ListaCuvinte, Variabile.NrCuvLoad); Variabile.NumeGrile[i] = GetNumeGrile(Variabile.ListaCuvinte, Variabile.NrCuvLoad); Variabile.PrenumeGrile[i] = GetPrenumeGrile(Variabile.ListaCuvinte, Variabile.NrCuvLoad); } i++; } if (totulok) { Variabile.NrGrilaCurenta = 0; Variabile.NrTotalGrile = i; CalculeazaNote(Variabile.RaspunsuriGrile, Variabile.NrTotalGrile); DrawChecks('g'); inchideGrilaToolStripMenuItem.Enabled = true; inchideToateGrileleToolStripMenuItem.Enabled = true; Label eticheta = new Label(); eticheta.Name = "etichetanume"; eticheta.AutoSize = true; eticheta.Text = "Studentul " + Variabile.NumeGrile[Variabile.NrGrilaCurenta] + " " + Variabile.PrenumeGrile[Variabile.NrGrilaCurenta] + " are nota " + Variabile.NoteGrile[Variabile.NrGrilaCurenta].ToString(); eticheta.Location = new Point(100, 330); this.Controls.Add(eticheta); } } } private string GetNumeGrile(string[] lista, int nrcuvinte) { string nume=""; for (int i=0;i<nrcuvinte;i++){

56

if (lista[i] == "Nume") { nume = lista[i + 1]; break; } } return nume; } private string GetPrenumeGrile(string[] lista, int nrcuvinte) { string prenume = ""; for (int i = 0; i < nrcuvinte; i++) { if (lista[i] == "Prenume") { prenume = prenume + lista[i + 1]; int j = i + 2; while (lista[j] != "An") { prenume = prenume + " " + lista[j]; j++; } break; } } return prenume; } private void inchideSablonToolStripMenuItem_Click(object sender, EventArgs e) { this.Controls.Remove(button1); } private void CalculeazaNote(string[] lista, int nrcuvinte) { for (int i = 0; i < nrcuvinte; i++) { string elem = lista[i]; string raspg = ""; string rasps = ""; double punctaj = 2.00; for (int j = 1; j <= Variabile.NrIntrebari; j++) { raspg = GetSelectedAnswers(elem, j); rasps = GetSelectedAnswers(Variabile.RaspunsuriCorecte, j); if (rasps == raspg) { punctaj = punctaj + 0.50; } } Variabile.NoteGrile[i] = punctaj; } } private string GetSelectedAnswers(string listarasp, int nrintrebare) { int pozitieintrebarecurenta = listarasp.IndexOf(nrintrebare.ToString()); int pozitieintrebareviitoare = listarasp.IndexOf((nrintrebare+1).ToString()); if (nrintrebare == 16) { pozitieintrebareviitoare = listarasp.Length; }

57

if (nrintrebare > 10) { return listarasp.Substring(pozitieintrebarecurenta, (pozitieintrebareviitoare - pozitieintrebarecurenta-1)); } else { return listarasp.Substring(pozitieintrebarecurenta+1, (pozitieintrebareviitoare - pozitieintrebarecurenta-1)); } } } }

58

Anexa 4
Codul surs al ferestrei pentru selectarea materiei :
using using using using using using using using using System; System.IO; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace TGrila { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button3_Click(object sender, EventArgs e) { Variabile.MateriaCurenta = listBox1.SelectedItem.ToString(); this.Dispose(); } private void button4_Click(object sender, EventArgs e) { this.Dispose(); } private void Form2_Load(object sender, EventArgs e) { if (Variabile.MateriaCurenta == "") { button3.Enabled = false; } else { button3.Enabled = true; } if (File.Exists(Variabile.cale)) { using (StreamReader sr = new StreamReader(Variabile.cale)) { int i = 0; while (sr.Peek() != -1) { Variabile.ListaMaterii[i] = sr.ReadLine(); listBox1.Items.Add(Variabile.ListaMaterii[i]); i++; } Variabile.NrMaterii = i; } } } private void button1_Click(object sender, EventArgs e) { Form3 AdaugareMaterii = new Form3(); DialogResult rezultat = AdaugareMaterii.ShowDialog();

59

if (rezultat == DialogResult.OK && Variabile.MateriaNoua != "") { this.listBox1.Items.Add(Variabile.MateriaNoua); }

private void button2_Click(object sender, EventArgs e) { int nrsel = listBox1.SelectedIndex; if (nrsel == -1) { MessageBox.Show("Trebuie sa selectati o materie pentru a fi stearsa", "Eroare stergere materie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { Form4 StergereMaterie = new Form4(); DialogResult rezultat = StergereMaterie.ShowDialog(); if (StergereMaterie.DialogResult == DialogResult.Yes) { if (File.Exists(Variabile.cale)) { using (StreamReader sr = new StreamReader(Variabile.cale)) { int i = 0; while (sr.Peek() != -1) { Variabile.ListaMaterii[i] = sr.ReadLine(); i++; } } File.Delete(Variabile.cale); using (StreamWriter sw = new StreamWriter(Variabile.cale)) { int i = 0; int nritems = listBox1.Items.Count; int selitem = listBox1.SelectedIndex; listBox1.Items.Clear(); while (i < nritems) { if (i != selitem) { sw.WriteLine(Variabile.ListaMaterii[i]); listBox1.Items.Add(Variabile.ListaMaterii[i] ); } i++; } if (i != 0) { Variabile.NrMaterii = i - 1; } else { Variabile.NrMaterii = i; } } } else { MessageBox.Show("Fisierul cu lista materiilor nu exista! Materiile trebuiesc adaugate din nou pe rand.", "Eroare stergere materie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); Variabile.NrMaterii = 0;

60

} } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedIndex != -1) { button3.Enabled = true; } } }

} }

61

Anexa 5
Codul surs al ferestrei de adugare a unei noi materii :
using using using using using using using using using System; System.IO; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace TGrila { public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != "") { Variabile.MateriaNoua = textBox1.Text; bool gasit = false; if (File.Exists(Variabile.cale)) { int i = 0; while (i<Variabile.NrMaterii) { if (Variabile.MateriaNoua.ToLower() == Variabile.ListaMaterii[i].ToLower()) { gasit = true; Variabile.MateriaNoua = ""; break; } i++; } if (!gasit) { using (StreamWriter sw = File.AppendText(Variabile.cale)) { sw.WriteLine(Variabile.MateriaNoua); Variabile.ListaMaterii[i] = Variabile.MateriaNoua; } } else { MessageBox.Show("Materia introdusa exista deja", "Eroare adaugare materie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } else { using (StreamWriter sw = new StreamWriter(Variabile.cale)) { sw.WriteLine(Variabile.MateriaNoua); Variabile.ListaMaterii[0] = Variabile.MateriaNoua;

62

} } } private void Form3_Load(object sender, EventArgs e) { button1.Enabled = false; } private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (textBox1.Text.Replace(" ", "") != "") { button1.Enabled = true; } else { button1.Enabled = false; } } } } }

63

Anexa 6
Codul surs al clasei Variabile
using using using using System; System.Collections.Generic; System.Linq; System.Text;

namespace TGrila { static class Variabile { private static string materiacurenta = ""; private static string[] listamaterii = new string[255]; private static string materianoua = ""; public const string cale = "materii.txt"; private static int nrmaterii = 0; private static string homedir = ""; private static string raspunsuricorecte = ""; private static string[] listacuvinte = new string[255]; private static int nrcuvinteload = 0; public const int NrIntrebari = 16; private static int qstartindex = 0; private static string[] raspunsurigrile = new string[255]; private static string[] numegrile = new string[255]; private static string[] prenumegrile = new string[255]; private static double[] notegrile = new double[255]; private static int nrgrila = 0; private static int totalgriledeschise = 0; public static string MateriaCurenta { get { return materiacurenta; } set { materiacurenta = value; } } public static string[] ListaMaterii { get { return listamaterii; } set { listamaterii = value; } } public static string MateriaNoua { get { return materianoua; } set { materianoua = value; }

64

} public static int NrMaterii { get { return nrmaterii; } set { nrmaterii = value; } } public static string HomeDir { get { return homedir; } set { homedir = value; } } public static string RaspunsuriCorecte { get { return raspunsuricorecte; } set { raspunsuricorecte = value; } } public static string[] ListaCuvinte { get { return listacuvinte; } set { listacuvinte = value; } } public static int NrCuvLoad { get { return nrcuvinteload; } set { nrcuvinteload = value; } } public static int QStartIndex { get { return qstartindex; } set { qstartindex = value; } } public static string[] RaspunsuriGrile { get { return raspunsurigrile; } set { raspunsurigrile = value; } } public static int NrGrilaCurenta { get { return nrgrila; } set { nrgrila = value; } } public static int NrTotalGrile { get { return totalgriledeschise; } set { totalgriledeschise = value; } } public static string[] NumeGrile { get { return numegrile; } set { numegrile = value; } } public static string[] PrenumeGrile { get { return prenumegrile; } set { prenumegrile = value; }

65

} public static double[] NoteGrile { get { return notegrile; } set { notegrile = value; } } } }

66

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