Screen Sarver

Cuprins

1.Limbajul de programare Pascal

2.Unit-ul Graph

3.Proceduri și funcții utilizate de unit-ul Graph

4.Ce este un screen saver?

5.Descrierea programului

6.Necesitați minime de sistem

7.Fișierele ce compun lucrarea

8.Utilizare

9.Detalii tehnice

10.Explicații suplimentare cu privire la obținerea

mișcării

11.Explicații cu privire la desenare

12.Bibliografie

ANEXA

program ScreenSave

42 pagini

=== Screen Sarver ===

Cuprins

1.Limbajul de programare Pascal

2.Unit-ul Graph

3.Proceduri și funcții utilizate de unit-ul Graph

4.Ce este un screen saver?

5.Descrierea programului

6.Necesitați minime de sistem

7.Fișierele ce compun lucrarea

8.Utilizare

9.Detalii tehnice

10.Explicații suplimentare cu privire la obținerea

mișcării

11.Explicații cu privire la desenare

12.Bibliografie

Informatica sa nascut ca stinta in al treilea patrat al secolului al XX-lea, fiind dezvoltata dintr-un pilon al altei stiinte cibernetica. Un aspect singular al stiintei informaticii este dezvoltarea si importanta ei in viata sociala este strans legata de inventae si dezvoltarea calculelor electronice. Ea s-a inchegat ca stiinta interdisciplinara, inprumutand instrumente din matematica:teoria informatie, cercetarea operationala, teoria algoritmilor, limbajele formale etc., din fizica:componente magnetice, componentele electronice combinationale, componente de calcul etc., din biologie: functile creierului de memorare si gandirea, comunicarea intre organisme, genetica etc.

Definitie. INFORMATICA este stiinta care studiaza metodele, tehnicele si mijloacele de prelucrare automata a datelor in scopul obtinerii informatiilor.

Denumirea stiintei a aparut prin contragerea din exprimarea franceza information automatoque, care sintetizeaza esenta ei. Patea anglo-americana prefera sa o numeasca insa Computer Science, impropriu intr-un fel, deoare ce prezinta calculatorul ca esenta a acestei stiinte, el fiind doar mijlocul principal de prelucrare. Activitatile omului reprezinta, in mare parte, prelucrari de date si informatii. Informatica ofera posibilitate definirii unei corespondente intre gandirea umana si reprezentarea codificata a ei. Problema devine mai complexa cand se lucreaza cu informatii compuse prin subordonare. Este nevoie de o structura care sa defineasca foarte clar relatiile dintre informatiile din cadrul compunerii. Aceasta proprietate de structura o poseda limbalul informatic, care impune o anume structura a frazei in care fiecare parte a ei desmneaza , codifica, un sens. Problema limbajului este o problema centrala in informatica. Deoare ce limbajul nutural nu realizeaza destul de riguros legatura dintre forma si sens, informatica si-a cerut propriile limbaje, cu gramaticile lor, astfel incat sa existe o asemenea legatura intre forma si sens, incat semnificatia unei fraze sa se deduca, fara ambiguitate, din sintaxa sa.

Limbajul de programare este un limbaj artificial, deosebit de limbajul natural, creat in mod intentionat pentru a servi la comunicarea unui algoritm de prelucrare sub forma de program de lucru pentru calculator. Din punct de vedere matematic, limbajul de programare este un limbaj formal, definit de:

o multime finita de simbolui de baza, numite alfabet;

omultime de siruri construite din interiorul alfabetului, numite cuvinte, care au asociat un sens si carealcatuiesc vocabularul limbajului;

o multime finita de reguli de selectare a cuvintelor pentru generarea de propozitii corecte in limbajul respectiv, numita gramatica.

Limbajul pascal este un limbaj inalt, realizat in 1970 de cater profesorul Niklaus Wirth de la Politehnica din Zurich, initial pentru scop didactic, in vederea predari „artei” programarii calculatoarelor. Denumirea limbajului a fost data in memoria savantului Bluise Pascal, creatorul primei masini mecanice de adunat (1642). O combinatie importanta la raspandirea si succesul acestui limbaj a avut-o firma americana Borland International Inc. Prin crearea versiunii Turbo Pascal, o versiune rapida care ofera programatorolor un Mediu Integrat de Dezvoltare a programelor (Integrated Development Environment –IDE). Acest mediu cuprinde: editor de texte sursa, compilator, depanator simbolic, editor de legatura cu bibleotecile, un sistem prompt de documentare, manager de ferestre.

Alfabetul limbajului pascal- reprezinta o submultime a setului de caractere recunoscute de calculator. Cu ajutorul elementelor alfabetului se vor construi cuvinte ale limbajului Pascal. Alfabetul limbajului Pascal contine:

– literele mari si mici ale alfabetlui englez;

– cifrele sistemului de numeratie in baza 10;

24 de caractere speciale: + – * / = < > ., ; : ’ _ ^ @ # $ ( ) [ ] { } si spatiul (blanc).

Identificatorii – sunt cuvinte ale vocabularului care au rol de a denumi elemente ale programului (constante, variabile, programul insusi, subprograme, instructiuni, operatori etc.) care trebuie referitte in mod simbolic. Constructia unui identificator este corecta daca el se prezinta ca o succesiune de caractere din submultimea formata din litere, cifre si _ (semnul de subliniere – underline) si primul caracter folsit este litera sau _. Compilatorul Turbo Pascal nu face distinctie inter literele mari si cele mici dinrt-nu identificator, iar ca lungime, ia in considerare numai primele 63 de caractere din identificator. O grupa speciala de identificatori o formeaza cuvintele cheie ale limbajului Pascal, numite si cuvinte rezervate, care au o definire fixa si nu pot fi folosite in alt context. Aceste cuvinte sunt:

Reguli de utilizare a identificatorilor:

orice identificator trebuie sa fie declarat inainte de a fi folosit, pentru a putea fi cunoscut de cater compilator;

nu se folosesc cuvinte destinate in alt scop decat au fost definite;

pentru a inlesni urmarirea programului din punct de vedere al algoritmului pe care il codifica, se recomanda construirea identificatorilor asociata semnificatiei elementului denumit (de ex. max ar fi un identificator care poate fi asociat usor semnificatiei de valoare maxima).

Separatori si comentari

Separatorii sunt caracterte din multimea {;,spatiu, Lf si CR }. Perechea (CF, LF) formeaza codul de sfarsit de linie si defapt este terminator de linie de fisier text, nu separator propriu in sintaxa limbajului Pascal. Declaratiile si instructiunile se separa prin caracterul ; (punct si virgula).

Comentariile sunt constructii de tip text incadrat intre acolade sau intre (* si *) fara a combina cele doua tipuri de incadrari. Rolul comentarilor este de a face un program mai usor de inteles prin plasarea unor explicatii din loc in loc, putand ocupa si mai multe linii din text, cu explicatii ce realizeaza anumite secvente din program. Ele nu sunt traduse in cod masina neavand caracter de instructiune.

Tipuri de date simple

Datele se gasesc sub forma de constante si variabile si au definit un tip de reprezentare conform multimii informationale din care iau valorile. O imagine globala asupra tipurilor de date recunoscute in limbajul Pascal este data in schema de mai jos.

reale intregi

predefinite logice

simple (standard) caracter

ordinale enumerat

utilizator

Tipuri de date tablou subdomeniu sir de caractere structurate articol

multime

adresa fisier

(referinta)

Pentru constante limbajul Pascal dispune de:

– declarare – prin simpla aparitie a valorii, in scriere conforma tipului de prezentare;

definire – prin utilizarea cuvantului rezervat const, ocazie in care constanta primeste nume de recunoastere (identificator).

Exista doua forme de definire:

const identificator_de_constanta = valoare; {constanta simbolica simpla;

valoarea nu se poate modifica pe parcursul programului}

si const identificator: tip = valoare; {variabila initializata in faza de compilare;

valoarea se poate modifica pe parcursul programului }

Pentru variabile este absolut necesara definirea explicita in sectiunea var, ceea ce inseamna:numele, tipul si statutul (variabila alocata la o adresa absoluta sau la o adresa relativa). Tipurile de date simple, sau nestructurata, se grupeaza in doua categorii dupa caracterele de ordonat si numarabil ale multimi informationale din care ia valori in:

tipul real – multimea informationala este ordonata dar numarabila (intre oricare doua elemente exista in realitate o infinitate de alte elemente);

tipul ordinal – multimea informationala este ordonata si numarabila (dat fiind un element, succesorul lui se obtine prin adunare cu 1 ).

Scrierea si citirea datelor

Citirea si scrierea datelor sunt operati de transfer din exterior in memoria interna de lucru si respectiv, din memoria interna catre exteriorcare intra sau ies in/din prelucrare. Citirea datelor se face prin sintaxa de apel a proceduri care este: read (lista de variabile) si readln (lista de variabile). Unde lista de variabile este o enumerare de identificatori de variabile separati prin virgule. Pentru readln lista poate fi vida si atunci nu se mai scriu nici parantezele. Scrierea datelor se face prin apelul procedurilor de afisare: write (lista de expresii) si writeln (lista de expresii).

Instructiunile limbajului pascal

Instructiunile limbajului Pascal reproduc structurile fundamentale ale algoritmalui definite de programare structurata, pentru a crea o „legatura” intre progamarea nestructurata si programarea structurata, limbajul Pscal ofera programamatorilor posibilitatea de a defini etichete in program si o instructiune de ramificare neconditionata – GO TO eticheta – insa poate crea dezordinii in conceperea programelor. In rest, limbajul Pascaldispune de urmatoarele instructiuni, care vor fi grupate paragrafele urmatoare, dupa structurile pe care le definesc:

instructiuni de apel a unui subprogram.

instructiunea de atribuire;

instructiunea compusa (blocul de instructiuni);

instructiunea vida;

instructiunea case;

instructiunea if;

instructiunea while;

instructiunea repeat;

instructiunea for;

instructiunea with.

Instructiunea de apel a unui subprogram. In general, prin subprogram se intelege un program care realizeaza o prelucrare generala astfel incat el poate fi „lipit” in structura unui program mai complex ca mod relativ independent. In limbajul pascal se definesc doua tipuri de subpograme: functiile(definesc un calcul si creiaza obligatoriu si creiaza un rezultat pe care il foloseste programul ce le apeleaza) si poocedurile (care definesc un proces mai complex, cu sau fara calcule si deci, cu sau fara rezultate, al caror efect de prelucrare este folosit in programul care le apeleaza. Apelul unui subprogram nu necesita o instructiune speciala, este suficient sa apara numele subprogramului urmat sau nu de o lista de parameri efecrivi scrisi inter paranteze rotunde si separati prin virgule, in functie de care subprogramul se executa.

Instructiunea de atribuire. In limbajul Pascal definirea este sintaxa: identificator := expersie. Dupa evaluarea expresiei, valoarea rezultata se atribuie variabilei desemnate de identificator astfel:

prin duplicare. Se copiaza in variabila valoarea expresiei, si daca variaba si valoarea au acelasi tip de reprezentare;

prin conversie. Se efectueaza o operatie de conversie a valorii expresiei la tipul de reprezentare a variabilei, daca este recunoscuta drept posibila aceasta conversie;

nu se face atribuirea si se anunta un mesaj de eroare de compilare – type mismatch, dupa operatia de conversie nu se pot realiza, cele doua elemente fiind de tipuri de reprezentare incompatibile (sisteme diferite de codificare interna);

prin transferarea in zona variabilei a ordinelor mai putin semnificative ale valoriicalculate si care pot incapea in zona de reprezentare a variabilei.

Instructiunea compusa (blocul de instructiuni). O instructiune compusa este un bloc de instructiuni care se declara in limbajul Pascal prin scrierea acestor instructiuni intre „parantezele”n figurate prin cuvintele rezervate begin si end. Instructiunea compusa este tratata ca o singura instructiune, executia ei constand in executarea comenzilor pe care le contin intre begin si end. Instructiunea compusa poate cuprinde, la randul ei, alte instructiuni compuse.

Mediul integrat de dezvoltare a programelor este un sistem de esrvici oferite programului decatre firma furnizoare a programului respectiv. Pentru limbajul Pascal MID ofera serviciu pentru:

editarea programelor;

actualizarea lor (modificari, adaugaturi, stergere ale unor elemente de texte sursa);

copierea programelor pe disc sau incarcarea lor pe discul de memorie;

compilarea, executarea si depanarea programelor.

Din sistemul MS-DOS, activarea acestui mediu se face numai prin linia de comanda > turbo , pentru Turbo pascal si > bp , pentru Borland Pascal. In continuarea comenzii de activare apare fereastra de editare, care pune la dispozitie lista de comenzi principale (Main meniu), lista cheiurilor activabile si in care editorul de texte incorporat este pregatit deja sa primeasca liniile textului sursa ale programului. Iesirea din MID se face direct, prin tastare combinata ALT si xsau din Main men – File – Exit.

Ferestre de comunicare cu utilizatorul . Interfata asigurata de MID se bazeaza pe lucrul cu doua ferestre principale:

fereastra de editare, a carei setare initiala este: scris galben pe fond albastru;

fereastra de iesire date (pe care apare si ecoul la tastarea datelor, numita fereastra output, a carei serare intiala este: scris alb pe fond negru.

Sistemul dispune si de o serie de ferester secundare, pe care programul le poate activasi utiliza in cazuri speciale: fereastra de urmarire a executiei (watch), fereastar de urmarire a apelurilor de subprograme (call stack), ferestrele de setare a unor optiuni. Lucrul cu ferestre oferite de MID este dirijat de optiuni ale comenzilor window si debug din cadrul meniului principal. O fereastara activa este remarcata pe ecran prin faptul ca are cenarul trasat prin linie dubla, iar cursorul se gaseste in spatiul ei. La un anumit moment numai una dinter ferestre este activa. Comutarea dintr-o fereastra in alta se poate face prin tastarea cheii F6 sau cu ajutorul optiunilor din cadrul comenzii Window ameniului principal. De asemenea, utilizatorul poate alege sa ocupe tot ecranul cu fereastra activa (tasta F5 sau meniul principal – window – zom) sau sa ierarhizeze ferestrele pe ecran (meniul principal – window – tile sau cascade).

Comenzile principale. La activarea MID se intra in starea de comanda prin punerea la dispozitie (activare) alistei de comenzi din meniul principal. Daca acest lucru nu se realizeaza automat (deselectarea la instalarea produsului ), atunci se utilizeazaa cheia F10.

Lansarea comenzilor principale

Exista teri moduri de lansare a unei comenzi din meniul principal:

Prin selectare. In conditi in care s-a activat meniul principal (tasta F10), una dintre comenzi apare marcata (scrisa pe alt fond). Acest marcaj reprezinta comanda selectata si daca este cea cautata, se va apasa tasta enter pentru a descide lista ei de optiuni. Daca se doreste alta comanda, atunci se face osimpla deplasare cu sagetile la comanda dorita.

Direct, prin codul comenzii. Tot in conditile in care este activat meniul principal, se apasa tasta corespunzatoare literei_cod al comenzii. Aceasta litera este puas in evidenta in numele comenzii prin alta culoare si este de regula prima litera.

Prin scurtcircuitare (shortcut key). Acest mod de lansare nu necesita activarea meniului principal. Comanda poate fi lansata in orice moment al lucrului prin apasarea combinata a tastelor ALT si litera-cod al comenzii.

Lista de comenzi principale. Se vorv dezvolta numai comenzile absolut necesare pregatiri programe lor mai usoare. Este bine sa se creeze obisnuinta de a folosi tastele de scurtare a actiunilor (shortcut keys) acolo unde exista (de exemplu F2 pentru salvare ). Daca se doreste renuntarea la comanda se va folosi mai comod, tasta Esc. Unele optiuni ale comenzi deschid ferestre auxiliare pentru setarea sau alegerea altor optiuni. In aceste ferestre, in aceste ferester trecerea de la o optiune la alta se face cu tasta TAB, iar o setare se scimba in general apasand bara de spatiu.

Comanda File. Contine optiuni pentru lucrul cu fisiere:

crearea de fisiere noi (New) si apoi salvarea lor pe suportul extern(Save as…),

incarcarea unor fisiere existente pe disc(Open),

salvarea continutului fisierlui in lucru (Save),

pregatirea imprimantei pentru listarea unui fisier (Printer setup – la folosire se dazactiveaza Send highlighting escape codes prin tastarea barei de spatiu),

listarea la imprimanta a unui fisier (Print),

comutarea in sistemul MS – DOS (Dos Shell, se revine tastand Exit in linia de comanda MS – DOS),

schimbarea cai de lucru pe disc (Change dir),

iesirea din MID.

Comanda Edit. Contine pperatiuni de editere a fisierului sursa utilizand editorul detexte incorporat. Acest editor ofera facilitati minime in comparatie cu editoarele specializate si anume copierea, mutarea si stergerea de blocuri text marcate (Copy, Cut, Paste, Delete). Prin blocul detexte se intelege o grupa compacta de caractere formata din una sau mai multe linii text. Marcarea se face prin conducerea cursorului peste zona respectiza cu ajutorol sagetilor de apasare si tinand tasta sift apasata. O inlesnire paare prin punerea la dispozitia utilizatorului a unui fisier de lucru in care editorul retine blocurile prelucrate (mutate, copiate) anterior. Acest fisier de lucru se vizualizeaza in fereastra deschisa prin optiunea clipboard, iar inlesnirea consta in faptul ca se poate lucra cu blocurile stocate aici in alte portiuni ale textului sursa utilizand optiunile decopiere, alipire, muteare. Deselectarea unui bloc se realizeaza prin tastarea combinata CTRL si KH. De asmenea , Editorul MID ofera serviciile de baza de editare:

deplasarea in text – realizata cu ajutorul: sagetilor dierctionale, cu tasta end (salt la sfarsitde rand), cu tasta home (salt la inceput de rand), cu tastele Page Up si Page Down (salturi ecran cu ecran, sau pagini de text), prin combinarea CTRL cu Home (salt la inceputul ferestrei) sau cu End (salt la sfarsitul feresteri), prin combinarea tastei Sift cu Page Up (salt la inceputul fisieruluisursa) sau cu Page Down (salt la sfarsitul fisierului sursa);

stergerea unui caracter curent (tastand backssace –pentru caracterul din stanga cursorului si tasta del/delete pentru caracterul pe care este cursorul);

inserarea unui caracter – prin simpla apasare alui, apare in stanga cursorului, intercalandu-se intre caracterele care exisra acolo;

supra scrierea unui caracter – peste caracterele de la cursor catre dreapta se suprapun, inlocuindu-le caracterele nou tastate, numai daca tasta ins/insert a fost apasata o data inainte de acest lucru. Ca o atentionare vizuala, in regim de supra suprascriere cursorul apare ca un dreptunghi clipitor. Revenirea la starea normala de scriere (prin ineserare) se face apasand inca o data tasta insert.

stergerea unei linii – se poate face in mai multe moduri: prin stergerea pe rand a caracterelor linie, prin marcarea liniei ca bloc ce se poate sterge apoi cu optiunea Delete a comenzii Edit, sau prin apasarea comuna a tastelor CTRL si Y;

inserarea unei linii vide – se poate face in mai multu moduri: prin tasrare ENTERdupa linia vida dupa care va aparea linia vida, prin pozitionarea la inceputul liniei urmatoare dupa care se tasteaza ENTER si apoi se urca cursorul pe linia vida curenta, sau prin pozitionarea la inceputul liniei urmatoare si apasarea combinata a tastelor CTRRL si N.

Editerul incorporat are in vedere cuvintele rezarvate ale limbajului Pascal si le prezinta in alb.

Comanda Search. In etapa de editare sunt necesare operatii de cautare mai rapida a unor cuvinte sau grupuri de litere pentru a vedea daca exista definite, sau sunt schimbate cu ceva, sau pentru a le inlocui cu altele. Aceste operati sunt asigurate de optiunile Fiind si Replece ale comenzii. Este deschisa o fereastra auxiliara in care utilizatorul face setarile ce ii sunt necesare pentru functionarea particulara a acestor perlucrari.

Comanda Compile. Programul in forma de text sursa si incarcat in memoria de editare, este tradus in limbajul Pascal in limbaj cod masina actionand optiunea Compile a comenzii cu acelasi nume. Lansarea comenzi se face in modul in care sa descris mai sus. Deoarece scopul principal al MID este sa ofere serviciu de punere in lucru a programelor utilizatorului, comanda Compile are prevazuta o scurtatura (ALT si F9). Daca programul este scris corect sintactic, apare mesajul succes: press any key. Prin apasarea unei taste se revine in starea de editare. Daca programul are greseli sintactice, prima dintre ele este semnalata printr-un mesaj si MID terce automat in starea de editare indicand linia la care a aparut eroarea, urmand ca utilizatorul sa o corecteze si sa reia procesul. In urma compilari rezulta textul obiect (fisier cu extensia obj).

Comanda Run. Textul obiect nu intra direct in executie. Din cadrul optiunilor comenzi Run se alege oiptiunea cu acelasi nume. Ea are rolul de a tece textul obiect prin faza de editare de legaturi(inglobarea bibleotecilor mentionate in program, sau a referintelor la acesta), rezultand textul executabil (fisier cu extensia .exe) si apoi de a lansa in executie acest fisier executabil. Si actiunea Run are un shortcut key, CTRL cu F9 util de retinut.

Comanda Debulg. La executia unui program se poate intampla sa apara erori. Unele sunt semnalate prin mesuje lamuresc in mare parte asupra erorii, deoarece se intalneste o operatie pe care calculatorul nu o cunoaste sau o gasaste in contradictie cu ce i s-a spus pana atunci. Altele nu provoaca mesaje de eroare din partea calculatorului dar provoaca rezultate eronate. Acestea sunt mai geru de depistat la o analiza mai sumara a aggoritmului. Din acest motiv MID ofera posibilitatea de a urmari pas cu pas executia programului astfel incat utilizatorul sa poata vadea care este fraza la care apare altceva in variabilele din program edcat s-a asteptat el. Pentru a depana astfel programul este nevoie, in principal, de doua locuri:

activarea ferstrei auxiliare watch (optiune cu acelasi nume al comenzi Debug. La mediul turbo Pascal aceasta optiune se afla sub comanda Windows). In aceasta fereastra se vor aduce sub observare variabilele care sunt banuite de provocarea erori (aducerea se face cu Add Watch sau pe scurt cu tasta Insert. Se tasteaza numele variabilei si enter);

executarea programului pas cu pas (optiunea Trace into de la comanda run, sau pe scurt tasta F7). La o apasare a tastei F7se executa o linie de programe care are ca efect modificarea valorilor unor variabile din fereastra de urmarire. Actiunea se repeta pana cand descopera eroarea.

Acele operati din program care solicita intrarea devdate vor comuta comuta urmarirea din fereastra de editer in fereastra oupt. Aici se va tasta valoarea ceruta la acel pas si apoi ENTER pentru a trece iar in fereastra de editare unde sunt urmarite instructiunile. Informatiile de iesier se pot urmari, in pararel cu executia pas cu pas, in fereastra output Acestea se activeaza cu operatia cu acelasi nume din comanda Debug (Winow la Turbo Pascal). Utizizatorul isi poate organiza ecranul pentru a avea la dispozitie toate cele trei ferestre (de editare, wach si output) utilizand optiunile de lucru cu ferestre de la comanda Window (size/move, tile). In momentul in care se renunta la urmarirea pas cu pas, revine in starea initiala a rularii se face utilizand optiunea Program reset a Comenzi Run. Comanda Debug mai dispune de optiunea User Screen (pe scurt Alt cu F5) pentru a trece din fereastra de editare in fereastra deoutput in scopul citirii rezultatelor executiei programului. Acest lucru este necesar, deoarece imediat dupa executia programului, MID comuta i fereastra de editare (daca programul nu are prevazute prelucrari de asteptare de tipul readln, sau repeat until keypressed, sau alte modalitati care nu au fost expicitate pana acum). Comutarea inapoi, din fereastra output in cea de editare se face prin tastare F5.

Comanda Options. Din ortiunile acestei comenzi intersecteaza deocamdata optiunea Compiler… pentru a stabili doua moduri de lucru necesare:

verificarea automata a valorilor daca acestea nu ies din marcajele stabilite – optiunea rutime errors dupa care Range checking;

alegerea cu coprocesorul matematic – numeric processing – 8087/80287.

Comanda Window. Facilitatile oferite de optiunile acestei comenzi au fost tratate pana acum, avand in vedere faptul ca se realizeaza modul de dialog cu utilizatorul al Mid prin intermediul ferestrelor. In plus, mai trebuie mentionate unele shotcut keys utile: ALT cu F3 – pentru inciderea ferestrei active; ALT cu numarul ferestrei – pentru a activa fereastra cu acel numar.

Comanda Help. MID incorporeaza un sistem de documentare imediata (Online Help). Pentru documentare se poate utiliza acest sistem prin activitatea comenzii Help (pe scurt F1), sau se poate plasa cursorul sub elementul din text pentru care dorim documentare si se apasa tastele CTRL si F1. Iesirea din fereastra auxiliara de documentare se face prin tastare Esc.

Limbajul Pascal ofera instrumente performante de definire si utilizare a informatiilor compuse, sau structurate, prin tipurile de structuri de care dispune:

structura de tip tablou; 4. structura de tip multime;

structura de tip sir de caractere; 5. structura de tip fisier.

structura de tip articol;

Limbajulm Pascal dispune de un tip de data specific acsstei structuri adica tipului de caractere sir de caractere si anume tupul string, care ofera facilitati deosebite in lucru cu sirurile de caractere, fara a fi nevoie sa le definim ca tablouri de caractere, fara a mai fi nevoie sa le definim ca tablouri de caractere in care prelucrarile sunt mai greoaie.

Astfel, limbajul Pascal are in unit-ul SYSTEM pregatite perelucrarile sumarizate mai jos.

obtinerea lungimi unui sir din octetul 0 se poate face cu functia length(sir);

extragerea unui subsir dintr-un sir dat, incepand cu o anume pozitie si cu o anume lungime se poatr face cu functia copy(sir, pozitie, lungime). Pozitie si lungime sunt de tip integer;

determinarea pozitiei dintr-un sir careincepe cu un subsir cautat se poate face cu functia pos(subsir, sir). Daca acesta intoarce valoarea 0, subsirul cautat nu exista in sirul dat;

stergerea din cadrul unui sir dat a unui subsir de o anumita lungime, care incepe la o anume pozitie in sirul dat se poate face cu proceduradelete (sir, pozitie, lungime);

inserarea (intercalarea) unui sir-nou in cadrul unui sir_dat, incepand de la o anumepozitie se poate face cu procedura insert(sir_nou, sir_dat,pozitie);

opreatia de conversie a unui sir de caractere intr-o valoare numerica se poate face cu procedura val(sir, numar, cod-eroare), unde cod_eroare esteun integer prin care se comunica succesul conversiei (valoare 0) sau insuccsul (o valoare care reprezinta numarul de caractere pe care le-a putut converti).

Cea mai generala metoda de compunerea datelor de deferite tipuri intr-o structura unitara o ofera regula de structura numita inregistrare, sau articol, recunoscuta in limbajul Pascal prin cuvantul rezervat record. Acest tip de structura devine necesar cand utilizatorul doreste prelucarea informatiilor care descriu entitati complexe si eterogene. Limbajul Pascul pune la dispozitie o instructiune al carui efect se manifesta numai asupra textului sursa si prin care programul poate arata compilatorului mult mai usor dependentele ierarhicein referirea campurilor unde identificator_inregistrare precizeaza numele inregistrarii pentru care instructiunea actioneaza asupra compurilor subordonate. In acest mod, pe parcursul actiunii instructiunii, campurile respective nu mai trebuie precedate de numele inregistrarii, acesta fiind fixata de catre with.

Revenire la limbajul pascal.

Limbajul de programare PASCAL a fost elaborat de Nikolaus WIRTH, profesor la Universitatea tehnică din Zurich(Elvetia) și a fost prezentat în revista Acta Informatică 1 (1970).

Popularitatea limbajului se datorează în mare măsură lucrării perechii de autori K.Jensen si N.Wirth: „Pascal – User Manual and Report”, care a cunoscut o răspândire mondială și a fost editată în diferite țări. La răspândirea limbajului a contribuit într-o măsură decisivă firma americană BORLAND, care a elaborat un compilator excelent de calculatoare IBM-PC. Acest compilator este inclus într-un mediu de programare avansat, care conține în afară de un editor profesional de texte și un asamblator integrat. Elementele limbajului standard Pascal au fost îmbogățite substanțial, iar limbajul astfel obținut a fost denumit TURBO PASCAL. Atributul Turbo se referă la rapiditatea compilatorului.

Principalele structuri ale limbajului au fost preluate din limbajul Algol 60; extensiile față de acest limbaj se referă, principal, la posibilitatea de structurare a datelor și a programului. Limbajul poate fi considerat ca o alternativă modernizată a limbajelor Algol 60 si PL/1.

Deși limbajul inițial a fost proiectat pentru scopuri didactice, posibilitățile oferite depășesc cu mult acest cadru, la ora actuala fiind un instrument puternic pentru problemele științifice, inginerești și chiar de gestiune.

Caracteristicile cele mai importante ale limbajului Turbo Pascal sunt: este puternic tipizat, oferind o gamă variată de tipuri predefinite, precum și posibilitatea definirii tuturor tipurilor utilizator, cu controale extinse asupra legalității utilizării datelor;

-este modularizat, asigurând un control riguros asupra vizibilității numelor din program;

existența unui număr mare de proceduri și funcții predefinite;

posibilitatea divizării unui program complex în piese relativ independente, care să poată fi programate și compilate separate.

Afișarea informațiilor pe ecranul calculatorului se realizează prin intermediul plăcii grafice și a driver-ului grafic asociat acesteia.

Placa grafica sau adaptorul de ecran este componenta hard a calculatorului, care asigură gestiunea memoriei ecran și controlul monitorului video.

Driver-ul grafic este componenta software care comandă placa grafică.

Memoria ecran aparține plăcii grafice, ea păstrează informațiile care se afișează « instantaneu » pe ecran(în realitate imaginea de pe ecran este generată de aproximativ 50 de ori pe secundă). Memoria ecran poate fi adresată ca o memorie obișnuită.

Placa grafică tratează ecranul în doua moduri :text și grafic.

În modul text, fiecare caracter care urmează să apară pe ecran este păstrat în memoria ecran pe doi octeți :

– primul cuprinde codul ASCII al caracterului ;

– al doilea cuprinde caracteristicile caracterului(atributele) :

culoare,iluminare,culoarea fondului, clipire.

In modul grafic, memoria ecran cuprinde pentru fiecare pixel(element de imagine) de pe ecran un cod reprezentat pe biți, prin care se determină culoarea pixelului. Datorită acestui mod de codificare, memoria ecran poate cuprinde imaginea codificată a mai multor ecrane. Zona din memoria ecran necesară pentru memorarea unui ecran se numește pagina video.

La un moment dat, numai una din paginile video apare pe monitor: aceasta se numește pagină vizibilă.

In Turbo Pascal, prin subprogramele unit-ului Crt ecranul este tratat în modul text, iar prin subprogramele unitului Graph el este tratat în modul Help ale meniului Borland Pascal 7.0 și cuprinde exemple executabile pentru fiecare subprogram din unit-ul Graph sau Crt.

Unit-ul Graph

Inițializarea modului grafic

Unit-ul Graph pune la dispoziția utilizatorului 79 de subprograme de grafică păstrate în fișierul Graph.tpu. Utilizarea lor este posibilă, dacă se declară în uses unit-ul Graph.

Performanțele programelor de grafică depind de cele ale plăcii grafice din componenta calculatorului cu care se lucrează. O anumită placă grafică poate lucra în mai multe moduri grafice, caracterizate printr-o anumită rezoluție a imaginii (numărul de pixeli ai imaginii), un anumit număr de culori și pagini video.

Fiecărui mod grafic îi corespunde un diver grafic specific.

Orice program Turbo Pascal de grafică trebuie să cuprindă:

1.inițializarea unui mod grafic acceptat de placa grafică;

2. apelarea subprogramelor pentru realizarea graficii dorite;

3. revenirea la modul video inițial (folosit anterior inițializării modului grafic).

Inițializarea unui mod grafic se realizează prin apelul procedurii InitGraph.

Apelul are forma:

InitGraph(driver, mod_grafic, cale)

unde: -driver este o variabila de tip Integer ale cărei valori reprezintă codul unui driver grafic;

– mod_grafic este o variabila de tip Integer ale cărei valori reprezintă codul unui mod grafic;

– cale este o expresie de tip string ale cărei valori reprezintă calea pentru fișierele cu extensia BGI, care conține driver-ele

grafice(BGI=Borland Graphic Interface).Dacă aceste fișiere se găsesc în directorul curent, nu mai este necesară specificarea căii; în acest caz, valoarea parametrului cale este șirul vid:

InitGraph(driver,mod_grafic,);

Executarea procedurii InitGraph consta în:

1.selectarea modului grafic și încărcarea driver-ului grafic:

a) specificați prin parametrii mod_grafic și driver;

b) cu cea mai mare rezoluție, dintre cele admise de placa grafică dacă variabila driver s-a inițializat cu constanta detect (inițializat cu 0 în unit-ul Graph); în acest caz se detectează automat tipul plăcii grafice existente în calculator;

2.alocarea dinamica în HEAP a unei zone de 4KB necesara în executarea subprogramelor de hașură a unor figuri.

Inițializarea poate eșua; în acest caz, procedura inițializează variabila Grapherror cu codul erorii. Aceasta variabilă este inițializată în urma executării unor proceduri din unit-ul Graph; dacă nu sunt erori, valoarea ei este 0. Utilizatorul are acces la valoarea acestei variabile prin funcția GraphResult, fără parametri. Aceasta funcție returnează valoarea variabilei Grapherror și , apoi, o reinițializează cu 0.

Funcția GraphErrorMsg returnează mesajul de eroare asociat unui anumit cod de eroare. Apelul funcției are forma:

GraphErrorMsg(cod_eroare);

unde cod_eroare este o expresie de tip Integer.

Revenirea la modul video inițial se realizează prin apelul procedurii CloseGraph, care nu are parametri. Prin executarea acestei proceduri se realizează totodată și eliberarea memoriei ocupată în HEAP în urma executării procedurii InitGraph.

Proceduri și funcții utilizate de unit-ul Graph

1.DetectGraph. Procedura DetectGraph testează hardware-ul determină driverul și modul utilizabil; ea se definește prin:

procedure DetectGraph(var gd, gm:integer);

unde gd reprezintă codul driverului, iar gm reprezintă codul modului utilizabil. După revenirea din procedura DetectGraph în mod obligatoriu trebuie apelată procedura InitGraph care va încărca efectiv driverul detectat. În cazul în care nu se detectează un driver grafic, variabila gd va avea valoarea -2; în acest caz funcția GraphResult va returna de asemenea valoarea -2.

2.InitGraph Procedura InitGraph inițializează sistemul grafic, prin încărcarea driverului grafic corespunzător echipamentului, pune sistemul în mod grafic, după care redă controlul programului apelat. Procedura se definește prin:

procedure InitGraph(var gd:integer; var gm:integer; cd:string);

unde gd si gm va conține valorile returnate de InitGraph : codul corespunzător driverului și modului grafic. Variabila cd de tip string în momentul apelat conține calea spre driverul *.BGI, unde sunt stocate fișierele corespunzătoare driverelor. Daca variabila cd este un șir vid, driverul actual va căuta în unitatea și directorul actual.

3.GetDriverName Funcția GetDriverName returnează numele driverului grafic actual. Funcția se definește prin:

function GetDriverName:string;

Funcția este apelabilă după activarea procedurii InitGraph.

4.GetGraphMode Funcția GetGraphMode returnează numele modului grafic actual; ea se definește prin:

function GetGraphMode:integer;

Valoarea returnată variază între 0 și 5, în funcție de driverul grafic actual.

5.GetModeName Funcția GetModeName returnează numele modului grafic actual. Funcția se definește prin:

function GetModeName (gm:word):string;

unde gm reprezintă codul modului grafic.

6.GetMaxMode Funcția GetMaxMode returnează numărul maxim de moduri folosibile (corespunzătoare driverului actual). Funcția se definește prin :

function GetMaxMode :integer ;

7.GetModeRange Procedura GetModeRange determină valoarea cea mai mică și valoarea cea mai mare a codului modului grafic ce se poate utiliza, corespunzătoare unui driver dat. Procedura se definește prin:

procedure GetModeRange (gd:integer; var LoMode,HiMode:integer);

unde gd este codul corespunzător driverului grafic, iar variabilele de tip întreg LoMode și HiMode vor obține valoarea minimă și maximă a modului grafic. Dacă driverul este neacceptat, valorile returnate sunt -1.

8.GraphDefaults Procedura GraphDefaults poziționează pointerul curent în colțul stâng sus de coordonate (0,0) și variabilele sistemului grafic la valorile implicite. Procedura se definește prin:

procedure GraphResult;

9.GetMaxX Funcția GetMaxX returnează numărul de ordine al coloanei din dreapta (rezoluția x) a driverului și al modului actual. Funcția se definește prin:

procedure GetMaxX:integer;

10.GetMaxY Funcția GetMaxY returnează numărul de ordine al liniei situate la baza (rezoluția y) a driverului și al modului actual. Funcția se definește prin:

procedure GeMaxY:integer;

11.GetX Funcția GetX returnează abscisa x a cursorului actual; aceasta se definește prin:

function GetX:integer;

12.GetY Funcția GetY returnează ordonata y a cursorului actual; funcția se definește prin:

function GetY:integer;

Atât la funcția GetX, cât și la funcția GetY, dacă pe ecran s-a definit o fereastră, valorile returnate definesc coordonata relativă la fereastră.

13.CloseGraph Procedura CloseGraph termină modul grafic și va apare ecranul dinaintea inițializării acestui mod. Procedura se definește prin:

procedure CloseGraph;

14.SetGraphMode Recuplarea din modul caracter în modul grafic este realizată prin procedura SetGraphMode, care este definita prin:

procedure SetGraphMode (md:integer);

unde mg definește modul grafic al plăcii actuale. Aceasta procedură realizează și ștergerea ecranului.

Utilizatorul are posibilitatea să instaleze atât un driver cât și un set de caractere propriu.

15.InstallUserDriver Instalarea unui driver propriu se realizează cu funcția InstallUserDriver, care se definește prin:

function InstallUserDriver (Name:string;AutoDetect:pointer):word ;

unde Name reprezintă numele fișierului, care este driverul utilizatorului, iar AutoDetect este adresa funcției de detectare opțională; dacă funcția de detectare nu există, variabila trebuie să conțină nil. Funcția InstallUserDriver returnează un cod (de tip word) care reprezintă numărul de driver pe care-l va primi driverul utilizator astfel instalat. Dacă tabela driverelor este plină, funcția va returna valoarea grError=-11.

16.InstallUserFont Instalarea unui set de caractere propriu se realizează cu funcția InstallUserFont, care se definește prin:

function InstallUserFont (FontFileName:string):integer;

unde FontFileName este numele fișierului fizic care conține setul de caractere. Funcția returnează codul (de tip întreg) corespunzător setului instalat. Dacă tabla cu tipurile de caracter este plină, funcția va returna valoarea zero.

17.RegisterBGIdriver Funcția RegisterBGIdriver –pe baza unei valori ce reperează un set de caractere – returnează un cod (de tip întreg) ce reprezintă numărul driverului. Funcția se definește prin:

function RegistreBGIdriver (driver:pointer):integer;

unde driver conține adresa driverului.

18.RegistreBGIfont Funcția RegistreBGIfont – pe baza unei valori ce reprezintă un set de caractere – returnează un cod (de tip întreg) care reprezintă numărul setului de caractere. Funcția se definește prin:

function RegistreBGIfont (font:pointer):integer;

unde font conține adresa setului de caractere.

19.SetVisualPage Procedura SetVisualPage fixează pagina vizuală; ea este definită astfel:

procedure SetVisualPage (nrpag:word);

unde nrpag definește numărul paginii vizuale (numerotarea de la zero).

20.SetActivPage Procedura SetActivPage fixează pagina activă pentru echipamentul grafic de ieșire; ea este definită astfel:

procedure SetActivPage (nrpag:word);

unde nrpag definește numărul paginii active (numerotare de la zero).

Prin fereastră se înțelege o zona dreptunghiulară a ecranului, care în particular poate să coincidă cu întregul ecran. Procedura ViewPort are ca efect ca toate comenzile de desenare/scriere să opereze în regiunea rectangulară definită. Toate înscrierile pe ecran se referă la fereastra actuală, până la o noua schimbare a ferestrei.

Procedura ViewPort se definește în felul următor:

procedure SetViewPort (x1,y1,x2,y2:integer; Clip:boolean);

unde x1,y2 sunt coordonatele absolute stânga sus ale ferestrei active, iar

x2,y2 coordonatele absolute dreapta jos a ferestrei (în continuare toate coordonatele vor fi relative la fereastră). Variabila booleană clip definește dacă liniile din afara ferestrei sunt sau nu vizibile.

Ce este un screen saver?

Screen saver-ul sau în traducere aproximativă “economizor de ecran”, este un program special, folosit pentru a diminua uzura monitorului, pe perioadele de pauză, deci pentru a mării durata de viață a monitorului. Screen saver-ul este de obicei un desen sau o imagine animată cu aspect estetic dar fără o funcționalitate anume, care apare pe ecran atunci când nu s-a folosit mouse-ul sau tastatura, o perioadă de timp prestabilită. Aceste desene sau imagini, (grafica) nu depind decât de imaginația designer-ului sau a programatorului. Durata de viață a unui monitor depinde foarte mult și de folosirea unui screen saver.

Descrierea programului

Programul Screen_Saver, cu codul sursă în fișierul “SS_CEAS.PAS” este un program Pascal. Acesta este un protector de ecran care rulează în modul DOS. Acest program folosește funcțiile grafice ale limbajului de programare Turbo Pascal.

Screen saver-ul afișează pe ecran în mod grafic, două obiecte: un ceas și un calendar, care afișează ora curentă respectiv data curentă a sistemului. Ceasul, este afișat asemenea unui ceas mecanic (cu limbi), iar data este afișată printr-un calendar al lunii curente, fiind marcată ziua respectivă, după cum se vede în figurile de mai sus. Aceste obiecte sunt într-o mișcare continuă și independentă una de alta, iar direcția de mișcare și-o schimbă când atinge marginile ecranului (ricoșează). Pentru ca acest screen saver, să fie într-adevăr un screen saver, are fondul negru iar mișcarea obiectelor are ca scop evitarea imprimării acestora pe ecran.

Observație: Ceasul și data afișată, este ceasul și data curentă a calculatorului pe care rulează.

Necesitați minime de sistem

Procesor: 486 sau mai nou

Memorie: maxim 1MB (programul rulează in mod DOS real)

Placă grafică: VGA

Spațiu HardDisk aproximativ 50KB

Sistem de operare: MS-DOS

Opțional: mouse

Fișierele ce compun lucrarea

/APLICAT/SS_CEAS.EXE – Programul executabil.

/APLICAT/EGAVGA.BGI – Driver-ul plăcii video VGA.

/APLICAT/UTILS.TPU – Forma compilată a unitului UTILS.PAS.

/APLICAT/CITESTE.TXT – Informații despre lucrare.

/SURSE/SS_CEAS.PAS – Program sursă Pascal.

/SURSE/UTILS.PAS – Unitul cu proceduri folosite de program.

/SURSE/CITESTE.TXT – Informații despre lucrare.

Utilizare

Acest screen saver poate fi folosit de orice alt program care suportă instalarea de screen saver.

Exemplu: Pentru a fi folosit în “Dos Navigator”, se va redenumi fișierul “SS_CEAS.EXE” în “SS_CEAS.SS”, se va copia în directorul în care este instalat Dos Navigator-ul, împreună cu fișierul “EGAVGA.BGI”. Apoi în caseta de dialog “Screen Saver Setup” accesată prin meniul “Options” – “Configuration” – “Screen Savers” se va selecta “SS_CEAS.SS”

Detalii tehnice

Programul are următoarea structură :

Variabile structură ceas, structură calendar

Procedură Actualizează cadru

Actualizează ceas

Actualizează calendar

Sfârșit procedură

Procedură Afișează cadru

Afișează ceas

Afișează calendar

Sfârșit procedură

Program principal

Repetă

Actualizează cadru

Afișează cadru

Până când s-a apăsat o tastă sau s-a mișcat mouse-ul

Sfârșit program.

Toate datele despre ceas respectiv calendar (coordonate, viteze de mișcare, etc.) sunt reținute în două variabile structurate una pentru ceas și alta pentru calendar.

Pentru fiecare cadru se apelează procedurile “Actualizează cadru” și “Afișează cadru”.

Procedura “Actualizează cadru” înglobează procedurile “Actualizează ceas” și “Actualizează calendar” care schimbă datele din structurile ceasului și respectiv a calendarului, în funcție de deplasarea acestora pe ecran și a trecerii timpului.

Procedura “Afișează cadru” se ocupă de afișarea unui nou cadru ștergând ecranul, apelând procedurile “Afișează ceas” și “Afișează calendar” care actualizează imaginea de pe ecran în funcție de noile date din structurile obiectelor ceas și calendar și apoi schimbând pagina video activă.

Explicații suplimentare cu privire la

obținerea mișcării

Ambele obiecte (ceasul și calendarul) conțin în structura lor câte doua câmpuri de forma

X,Y : integer

(denumite coltx, colty pentru calendar și centrux, centruy pentru ceas) care conțin coordonatele pe orizontală respectiv verticală ale obiectelor din care fac parte.

De asemenea acestea mai conțin câte doua câmpuri de forma

dx:dy : integer

folosite pentru stocarea valorii componentei vectorului viteză pe orizontală respectiv pe verticală.

La fiecare nou cadru valoarea componentelor x și y se schimba astfel

x:=x+dx

y:=y+dy

realizându-se astfel înaintarea cu puțin a obiectului vizat in direcția vectorului vitezei.

Apoi dacă x sau/și y au valoarea 0 sau rezoluția ecranului componentele dx sau/și dy se inversează astfel:

dacă x=0 sau x=rezoluția pe orizontală dx=-dx

dacă y=0 sau y=rezoluția pe verticală dy=-dy

Astfel se realizează “ricoșarea de marginile ecranului”

Explicații cu privire la desenare

Desenarea este realizată în cadrul procedurii DisplayFrame care este apelată la fiecare ciclu pentru a desena fiecare cadru. Această procedură se folosește de posibilitatea de a avea doua “pagini video”.

Aceasta înseamnă că avem două suprafețe grafice în care putem desena sau pe care le putem afișa, dar nu oricum. Ambele suprafețe grafice au dimensiunea ecranului grafic una singură fiind vizibilă (conținutul ei este afișat pe monitor) și una singură fiind activă (în care procedurile grafice acționează). O pagină video poate fi în același timp și activă și vizibilă, în această situație ne având rost să folosim două pagini.

Situația utilă și de care se folosește și programul prezentat este aceea în care o pagină este activă iar cealaltă este vizibilă. În acest fel putem desena, iar apoi putem afișa imaginea desenata, dintr-o dată, imaginea ne fiind astfel vizibilă până când nu este desenată complet.

Întorcându-ne la prezentarea programului structura procedurii DisplayFrame este următoarea:

var pagina:integer;

procedure DisplayFrame

begin

WaitRetrace;

SetActivePage(pagina);

Cleardevice;

DisplayCeas;

DisplayCalendar;

(*Aici se pot pune alte proceduri de desenare*)

SetVisualPage(pagina);

pagina:=1-pagina;

end;

Instrucțiunea

WaitRetrace;

așteaptă momentul când are loc oprirea fluxului de electroni al monitorului pentru a desena în acest răstimp – evitând astfel efectul de clipire.

Instrucțiunea

SetActivePage(pagina);

schimbă pagina activă astfel încât să fie diferită de pagina vizibilă. Se ascunde astfel imaginea până când aceasta este complet desenată.

Instrucțiunea

ClearDevice

șterge pagina video activă și marchează momentul de început în care pot fi folosite instrucțiunile grafice.

Acum se vor desena obiectele grafice. Toate desenările se vor face în acest loc.

Instrucțiunile

SetVisualPage(pagina);pagina:=1-pagina;

marchează terminarea desenării și stabilirea paginii active astfel încât să apară pe ecran imaginea desenată de procedurile anterioare.

Variabila pagina reține pagina vizibilă iar instrucțiunea

pagina:=1-pagina;

este echivalentă cu

If pagina=1 then pagina=0 Else pagina=1;

ceea ce comută variabila pagina între 0 și 1.

STELIAN NICULESCU, SORIN EFTENE

“Algoritmi și limbaje de programare” – Manual pentru clase de informatică Clasa a IX-a

Editura Didactică și pedagogică R.A. – București, 1995

BOGDAN PĂTRUȚ

“Manual de informatică clasa a X –a – Programarea calculatoarelor”

Editura Teora

GHEORGHE MUSCĂ, FLORIAN MORARU, FLORIN MUNTEANU

“Informatică aplicată – Manual pentru liceele de informatică clasa a XI – a, alternativa A”

Editura Didactică și pedagogică R.A. – București, 1998

BOGDAN PĂTRUȚ

“Învățați Limbajul Pascal în 12 lecții”

Editura Teora

RADU MÂRȘANU, MANOLE VELICANU

“Informatică aplicată – Manual pentru clasele de informatică Clasele XI – XII”

Editura Petrion – București

RADU MÂRȘANU, ADRIAN VASILESCU

“Informatică Aplicată – Manual pentru liceele de informatică clasa a XII – a”

Editura Petrion – București

ANDREI CIOROIANU

“Programe Turbo Pascal în detaliu”

Editura Teora – 1998

ANEXA

program ScreenSave;

uses utils,graph,crt,dos;

var Xasp,Yasp:word; {retin valoarea returnata de GetAspectRatio}

MaxX,MaxY:integer; {retin rezolutia ecranului}

const LUNG_ORA=30; {constante ce definesc lungimile limbilor}

LUNG_MIN=55; {si raza cadranului}

LUNG_SEC=40;

RAZA_CEAS=70;

type CeasRecord=record {structura ceasului}

centrux,centruy:integer; {coordonatele centrului cadranului}

{coordonatele capatului limbilor}

orax,oray:integer;

minx,miny:integer;

secx,secy:integer;

{vectorii viteza}

dx:integer;

dy:integer;

strtimp:string; {retine afisajul electronic}

end;

var cer:CeasRecord; {CEas Record – implementarea structurii ceasului}

{proceduri implementate mai jos in program, declarate aici pentru a fi

recunoscute peste tot in program}

procedure InitCeas; forward;

procedure UpdateCeas; forward;

procedure DisplayCeas; forward;

const LUNG=190; {constante ce reprezinta lungime}

LAT=190; {si latimea calendarului}

type CalendRecord=record {Structura calendarului}

coltx,colty:integer; {coordonatele coltului din stanga sus}

stran,strluna,strzisapt:string; {retin anul, luna si ziua saptamani pentru a fi afisate}

ian,iluna,izi,izisapt:word; {ca mai sus dar sun numere intregi}

dx,dy:integer; {vectorii veteza de miscare a calendarului}

end;

var car:CalendRecord; {CAlendar Record / implementarea structurii calendarului}

{proceduri implementate mai jos in program, declarate aici pentru a fi

recunoscute peste tot in program}

procedure InitCalendar; forward;

procedure UpdateCalendar; forward;

procedure DisplayCalendar; forward;

{initializeaza programul}

procedure Init;

begin

{initializeaza modul grafic}

UtilInitGraph(VGA,VGAMed,'c:\');

{initializeaza rezolutia}

MaxX:=GetMaxX;

MaxY:=GetMaxY;

Randomize;

{initializeaza raportul proportilor intre oriyontala si verticala}

GetAspectRatio(Xasp,Yasp);

{initializeaza structurile ceasului si a calendarului}

InitCeas;

InitCalendar;

{initializarea contorului de cadre pe secunda – definit unitul utils}

InitFrameCounter;

end;

{inchide programul}

procedure Done;

begin

{inchide contorul de cadre pe secunda}

DoneFrameCounter;

{inchide modul grafic}

CloseGraph;

{goleste bufferul tastaturii – pentru a nu se da comenzi inainte}

FlushKeybBuffer;

end;

{Initializeaza structura ceasului}

procedure InitCeas;

begin

with cer do

begin

{Punem ceasul in mijloc}

centrux:=MaxX div 2;

centruy:=MaxY div 2;

{si ii aplica viteza de 2 pixeli pe cadru inspre stanga jos}

dx:=2;

dy:=2;

end;

end;

{Actualizeza structura ceasului}

procedure UpdateCeas;

var ora,min,sec,sec00:word;

strora,strmin,strsec:string;

begin

with cer do

begin

{Muta ceasul la noua coordonata}

centrux:=centrux+dx;

centruy:=centruy+dy;

{Testeaza daca s-au atins marginile si

modiica vectorii viteza in consecinta}

if centrux>maxx-RAZA_CEAS then dx:=-dx

else if centruy>maxy-round(RAZA_CEAS*(xasp/yasp)) then dy:=-dy;

if centrux<0+RAZA_CEAS then dx:=-dx

else if centruy<0+round(RAZA_CEAS*(xasp/yasp)) then dy:=-dy;

{calculeaza capetele limbilor (capetele opuse centurlui cadranului)}

gettime(ora,min,sec,sec00);

orax:=centrux+round(cos(((ora mod 12)/12+min/(60*12))*-2*PI+pi/2)*LUNG_ORA);

oray:=centruy+round((Xasp/Yasp)*sin(((ora mod 12)/12+min/(60*12))*2*PI-pi/2)*LUNG_ORA);

minx:=centrux+round(cos((min/60+sec/(60*60))*-2*PI+pi/2)*LUNG_MIN);

miny:=centruy+round((XAsp/Yasp)*sin((min/60+sec/(60*60))*2*PI-pi/2)*LUNG_MIN);

secx:=centrux+round(cos((sec/60)*-2*PI+pi/2)*LUNG_SEC);

secy:=centruy+round((Xasp/Yasp)*sin((sec/60)*2*PI-pi/2)*LUNG_SEC);

{Compune sirul de caractere ce va fi afisat digital in mijlocul ceasului}

str(ora,strora);

if ora in [0..9] then strora:='0'+strora;

str(min,strmin);

if min in [0..9] then strmin:='0'+strmin;

str(sec,strsec);

if sec in [0..9] then strsec:='0'+strsec;

strtimp:=strora+':'+strmin+':'+strsec;

end;

end;

{Afiseaza ceasul}

procedure DisplayCeas;

var strnumar:string;

inumar:integer;

unghi:real;

begin

setcolor(1);{setlinestyle(0,0,0);}

with cer do begin

{Rama circulara a ceasului}

circle(centrux,centruy,RAZA_CEAS-3);

circle(centrux,centruy,RAZA_CEAS);

setfillstyle(SOLIDFILL,9);

floodfill(centrux+RAZA_CEAS-2,centruy,1);

{Numerele de pe cadran ce indica ora 1..12}

settextjustify(CENTERTEXT,CENTERTEXT);

setcolor(11);

for inumar:=1 to 12 do

begin

str(inumar,strnumar);

unghi:=(inumar/12)*2*pi-pi/2;

outtextxy(round(centrux+cos(unghi)*(RAZA_CEAS-10)),round(centruy+(Xasp/Yasp)*sin(unghi)*(RAZA_CEAS-10)),strnumar);

end;

{Afiseaza ceasul digital de pe cadran}

outtextxy(centrux,centruy+RAZA_CEAS div 3,strtimp);

{Deseneaza limbile}

setcolor(3);

setlinestyle(0,0,3);

line(centrux,centruy,orax,oray);

setlinestyle(0,0,2);

line(centrux,centruy,minx,miny);

setlinestyle(0,0,1);

line(centrux,centruy,secx,secy);

end;

end;

{Initializeaza structura calendarului}

procedure InitCalendar;

begin

with car do

begin

{pune calendarul aproximativ in mijlocul ecranului}

coltx:=MaxX div 2;

colty:=MaxY div 2;

{Imprima o viteza de 2 pixeli in sus si la stanga}

dx:=-2;

dy:=-2;

end;

end;

{Actualizeaza structura calendarului}

procedure UpdateCalendar;

begin

with car do

begin

{Compune sirurile de caractere ce reprezinta denumirea

zilei saptaminii, denumirea lunii si anul, ce vor fi afisate}

getdate(ian,iluna,izi,izisapt);

if izisapt=0 then izisapt:=7;

str(ian,stran);

strluna:=luni[iluna];

strzisapt:=zile[izisapt];

{Deplaseaza calendarul la noua coordonata}

inc(coltx,dx);

inc(colty,dy);

{Testeaza daca s-a atins una din marginile ecranului

si actualizeaza vectorii viteza}

if coltx+LUNG>maxx then dx:=-dx

else if round((colty+LAT)*(Xasp/Yasp))>maxy then dy:=-dy;

if coltx<0 then dx:=-dx

else if colty<0 then dy:=-dy;

end;

end;

{afiseaza calendarul}

procedure DisplayCalendar;

{Functia returneaza in ce zi a saptamanii cade prima zi a lunii.

zi – numarul zilei in luna

zisapt – numarul zilei in saptamana; 0-luni,..,5-sambata,6-duminica}

function PrimaZiLuna(zi,zisapt:byte):byte;

var descazut:integer;

begin

descazut:=(zi mod 7);

if zisapt<descazut then inc(zisapt,7);

PrimaZiLuna:=zisapt-descazut;

end;

var i:byte;

y:integer;

stri:string;

contzi:integer;

coordy,coordx:integer;

contzisapt:byte;

begin

with car do

begin

{afiseaza rama calendarului}

setcolor(LIGHTBLUE);

setlinestyle(0,0,3);

rectangle(coltx,round(colty*(Xasp/Yasp)),coltx+lung,round((colty+lat)*(Xasp/ Yasp)));

setlinestyle(0,0,0);

{afiseaza linia de dedesuptul denumirii lunii}

line(coltx,round((colty+(LAT / 9))*(Xasp/Yasp)),coltx+LUNG,round((colty+(LAT / 9))*(Xasp/Yasp)));

{afiseaza linia de deaspura zilei saptamanii}

line(coltx,round((colty+(LAT / 9)*8)*(Xasp/Yasp)),coltx+LUNG,round((colty+(LAT / 9)*8)*(Xasp/Yasp)));

{afiseaza linia din dreapta anului}

line(round(coltx+(LUNG / 10)),round((colty+(LAT / 9))*(Xasp/Yasp)),

round(coltx+(LUNG / 10)),round((colty+(LAT / 9)*8)*(Xasp/Yasp)));

{afiseaza denumirea lunii}

setcolor(LIGHTCYAN);

settextjustify(CENTERTEXT,BOTTOMTEXT);

outtextxy(round(coltx+LUNG/2),round((colty+LAT/9)*(Xasp/Yasp)),strluna);

{afiseaza anul}

settextjustify(RIGHTTEXT,CENTERTEXT);

y:=round((colty+LAT/9)*(Xasp/Yasp));

for i:=1 to length(stran) do

begin

y:=round(y+LAT/9);

{ putpixel(coltx+LUNG div 10,y,10);}

outtextxy(round(coltx+LUNG/12),y,stran[i]);

end;

{afiseaza ziua saptaminii}

settextjustify(CENTERTEXT,CENTERTEXT);

outtextxy(round(coltx+(LUNG / 2)),round((colty+(LAT / 17)*16)*(Xasp/Yasp)),strzisapt);

SetTextJustify(LEFTText,BOTTOMText);

{afiseaza antetul L M M J V S D}

OutTextXY(round(coltx+LUNG/21*3),round((colty+LAT/9*2)*(Xasp/Yasp)),' L M M J V S D');

{Afiseaza zilele lunii sub forma de tabel}

SetTextJustify(RIGHTText,BOTTOMText);

contzisapt:=PrimaZiLuna(izi,izisapt);{cand cade prima zi din luna}

coordy:=round((colty+LAT/9*3)*(Xasp/Yasp));{initializare coordy la primul rand}

for i:=1 to GetNoDays(ian,iluna) do

begin

{daca avem o noua saptamana}

if contzisapt=7 then

begin

{muta pe orizontala la inceput}

contzisapt:=0;

{trecerea la urmatorul rand}

coordy:=round(coordy+LAT/9*(Xasp/Yasp));

end;

{trecerea la urmatoarea coloana}

coordx:=round(coltx+LUNG/21*4.5+contzisapt*LUNG/21*2.7);

{marcheaza ziua curenta}

if i=izi then rectangle(coordx-20,coordy-10,coordx,coordy);

{aici are loc scrierea efectiva a cifrelor, una cate una}

str(i,stri);

OutTextXY(coordx,coordy,stri);

{urmatoarea zi}

inc(contzisapt);

end;

end;

end;

{Apeleleaza actualizarea structurii ceasului

Apelata in ciclul principal}

procedure UpdateFrame;

begin

UpdateCeas; {actualizeaza structura ceasului}

UpdateCalendar; {actualizeaza structura calendarului}

end;

{Apeleaza pe langa altele afisarea ceasului si a calendarului}

const pagina:word=0; {pagina video vizibila (2 pagini 0 si 1)}

procedure DisplayFrame;

begin

{asteapta momentul cand are loc oprira fluxului de electroni al monitorului pentru a desena in acest rastimp – evitand astfel efectul de clipireefectul}

WaitRetrace;

{schimbarea paginii active astfel incat sa fie diferita de pagina vizibila

se ascunde astfel imaginea pana cand aceasta este complet desenata}

SetActivePage(pagina);

{sterge ecranul}

cleardevice;

{afiseaza ceasul si calendarul}

DisplayCeas;

DisplayCalendar;

{Afiseaza notele de copyright}

SetTextJustify(LEFTTEXT,BOTTOMTEXT);

OutTextXY(0,maxy,'Copyright (C) Socianu Cristian ATESTAT 2001');

SetTextJustify(RIGHTTEXT,BOTTOMTEXT);

{afiseaza numarul de cadre pe secunda}

outtextxy(maxx,maxy,strfps+' cadre / secunda');

{desenul este complet -> se afiseaza}

SetVisualPage(pagina);

pagina:=1-pagina;

end;

begin

Init; {grupeaza toata initializarea programului}

repeat

NewFrame; {avem un nou cadru}

UpdateFrame; {actualizam structurile ceasului si al calendarului}

DisplayFrame; {generam grafica}

{pana cand s-a apasat o tasta sau pana cand s-a miscat mouse-ul (daca exista)}

until keypressed or (HasMouse and mousemoved);

Done; {grupeaza toata terminarea programului}

end.

unit utils;

interface

{impacheteaza procedure standard InitGraph}

procedure UtilInitGraph(GraphDriver,GraphMode:integer;CaleBGI:string);

{asteapta sa aiba loc o reimprospatare completa a ecranului,reduce sclipirea dar limiteaza numarul de frame-uri pe secunda}

{Obs:numarul de cadre pe secunda se schimba o data cu schimbarea parametrilor in program (numar_bile etc..) in salturi 36 -> 72 daca este folosita aceasta functie}

procedure WaitRetrace;

{Proceduri pentru utilizarea mouse-ului}

procedure MouseInit;

procedure MouseShow;

procedure MouseHide;

procedure MouseData(var buton,x,y:word);

{returneaza TRUE daca s-a miscat mouse-ul din pozitia in care era la inceputul programului, altfel FALSE}

function MouseMoved:boolean;

{Functii pentru evaluarea numarului de cadre pe secunda}

procedure InitFrameCounter; {a se pune la inceputul ciclului}

procedure DoneFrameCounter; {a se pune la sfarsitul ciclului}

procedure NewFrame; {a se apela o data pentru fiecare cadru}

{Returneaza numarul de zile continute in luna Luna din anul An}

function GetNoDays(An,Luna:byte):byte;

{Goleste bufferul tastaturii;

se foloseste pentru a nu se putea da comenzi inainte ca acestea sa fie cerute}

procedure FlushKeybBuffer;

{proceduri de ascundere si reafisare a cursorului text}

procedure hidecursor;

procedure showcursor;

{De aici se va citi numarul de cadre pe secunda}

var ifps:word; {sub forma de numar}

strfps:string[3]; {sub forma sir de caractere}

{Daca exista mouse si este instalat}

HasMouse:boolean;

{Vectori ce retin denumirea lunilor si ale zilelor saptamanii}

const luni:array[1..12] of string=('Ianuarie','Februarie','Martie','Aprilie',

'Mai','Iunie','Iulie','August','Septembrie',

'Octombrie','Noiembrie','Decembrie');

zile:array[1..7]of string=('Luni','Marti','Miercuri','Joi',

'Vineri','Sambata','Duminica');

implementation

uses crt,dos,graph;

Procedure WaitRetrace; assembler;

asm

mov dx,3dah

@Loop1: in al,dx

test al,8

jz @Loop1

@Loop2: in al,dx

test al,8

jnz @Loop2

end;

procedure UtilInitGraph(GraphDriver,GraphMode:integer;CaleBGI:string);

var gr : integer; {pentru retinerea codului de eroare}

a,b : integer; {pentru retinerea GraphDriver si GraphMode

deoarece se schimba la apelarea lui InitGraph}

begin

a:=Graphdriver;

b:=GraphMode;

{Incearca cu calea data}

InitGraph(GraphDriver,GraphMode,CaleBGI);

gr:=GraphResult;

Graphdriver:=a;

GraphMode:=b;

{eroare -> incearca cu calea implicita c:\bp\bgi}

if (gr=grFileNotFound) then

begin

CloseGraph;

CaleBGI:='c:\bp\bgi';

InitGraph(GraphDriver,GraphMode,CaleBGI);

gr:=GraphResult;

Graphdriver:=a;

GraphMode:=b;

end;

{eroare -> cere utilizatorului calea}

if (gr=grFileNotFound) then

repeat

CloseGraph;

write('Dati directorul cu drivere BGI : ');

readln(CaleBGI);

if eof then break;

InitGraph(GraphDriver,GraphMode,CaleBGI);

gr:=GraphResult;

Graphdriver:=a;

GraphMode:=b;

until gr<>grFileNotFound;

{eroare -> nimic de facut

se tipareste un mesaj de eroare

si se iese}

if gr<>grOK then

begin

CloseGraph;

case gr of

grNoInitGraph :writeln('Initializarea sistemului grafic a esuat.');

grNotDetected :begin

Writeln('Nu s-a reusit identificarea placii grafice.');

Writeln('Calculatorul dvs. nu poate fi folosit in mod grafic sau e nevoie ');

writeln('de un driver special.');

end;

grFileNotFound :writeln('Fisierul .BGI nu a fost localizat.');

grInvalidDriver :writeln('Fisierul .BGI nu e valid.');

grNoLoadMem :writeln('Memorie insuficienta pentru driver-ul grafic.');

grNoScanMem :writeln('Memorie insuficienta pentru folosirea instructiunii FillPoly.');

grNoFloodMem :writeln('Memorie insuficienta pentru folosirea instructiunii FloodFill.');

grFontNotFound :writeln('Fisierul .CHR nu a fost localizat.');

grNoFontMem :writeln('Memorie insuficienta pentru incarcarea fisierului .CHR.');

grInvalidMode :writeln('Parametrii GraphDriver si/sau GraphMode incorect precizati.');

grError :writeln('Eroare generala a initializarii sistemului grafic.');

grIOerror :writeln('Eroare de intrare/iesire detectata de rutinele grafice.');

grInvalidFont :writeln('Fisierul nu contine un stil de caractere valid.');

grInvalidFontNum:Writeln('Numarul stilului de caractere nu e valid.')

end;{case}

writeln('Program se va termina');readln;

halt(1);

end;

end;

procedure mouseinit;assembler;

asm

mov ax,0;

int $33

cmp ax,0

jz @NOMOUSE

mov hasmouse,1

jmp @GATA

@NOMOUSE:

mov hasmouse,0;

@GATA:

end;

procedure mouseshow;assembler;

asm

mov ax,1

int $33

end;

procedure mousehide;assembler;

asm

mov ax,2

int $33

end;

procedure mousedata(var buton,x,y:word);assembler;

asm

mov ax,3;

int $33;

les di,buton

mov word ptr es:[di],bx

les di,x

mov word ptr es:[di],cx

les di,y

mov word ptr es:[di],dx

end;

var firstx,firsty,firstbuton:word; {folosite pentru retinerea pozitiei

mouse-ului de la inceputul programului}

function mousemoved:boolean;

var nowx,nowy,nowbuton:word;

begin

mousedata(nowbuton,nowx,nowy);

if (nowbuton<>firstbuton) or (nowx<>firstx) or (nowy<>firsty)

then mousemoved:=true

else mousemoved:=false;

end;

var frames:word; {numararea apelurilor NewFrame de la inceputul secundei}

time:word; {incrementat la fiecare intrerupere}

Int1CSave:Pointer; {folosit la salvarea vectorului initial 1Ch}

{handler-ul vectorului de intrerupere}

procedure TimerHandler;interrupt;

begin

if time>18 then {daca a trecut o secunda}

begin

ifps:=frames; {avem numarul de cadre pe secunda}

str(ifps,strfps); {si il stocam in ifps si strfps de unde le poate folosi utilizatorul}

time:=1; {reinitializam numararea}

frames:=0; {cadrelor}

end

else inc(time); {daca inca nu a trecut o secunda continuam numararea}

end;

{instaleaza handler-ul vectorului de intrerupere 1Ch}

procedure InitFrameCounter;

begin

GetIntVec($1C,Int1CSave);

SetIntVec($1C,Addr(TimerHandler));

end;

{dezinstaleaza handler-ul vectorului de intrerupere 1Ch}

procedure DoneFrameCounter;

begin

SetIntVec($01C,Int1CSave);

end;

{inca un cadru}

procedure NewFrame;

begin

inc(frames);

end;

const nr_zile:array[1..12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31);

function GetNoDays(An,Luna:byte):byte;

begin

if (luna=2) and (an mod 4=0) and (an mod 400<>0) then GetNoDays:=29;

GetNoDays:=nr_zile[luna];

end;

procedure FlushKeybBuffer;

begin

while keypressed do readkey;

end;

procedure hidecursor;assembler;

asm

mov ax,$0100

mov cx,$2607

int $10

end;

procedure showcursor;assembler;

asm

mov ax,$0100

mov cx,$0506

int $10

end;

{initializarea unit-ului}

begin

mouseinit;mousehide;

mousedata(firstbuton,firstx,firsty);

end.

Similar Posts