Tutorial Pascal

download Tutorial Pascal

of 66

Transcript of Tutorial Pascal

Tutorial PascalPascal, de la inceputuri pana acumPascalul original Limbajul Pascal a fost scris in 1971 de Niklaus Wirth, profesor la Politehnica din Zurich, Elvetia. Pascalul a fost intentionat ca o versiune simplificata, in scopuri educationale, a limbajului Algol, care aparuse in 1960. Cand a aparut Pascalul, existau deja multe limbaje, dar numai putine erau folosite pe scara larga, ca Fortranul, C, Assembler, etc. Ideea de baza a noului limbaj de programare a fost ordinea, controlata printr-un concept puternic de tip de data, necesitand declaratii si programare structurata. A fost imaginat ca o unealta de predare pentru studentii la programare. Turbo Pascal... a fost odata... Faimos in lumea intreaga, compilatorul de Pascal de la Borland, denumit Turbo Pascal, a aparut in 1983, fiind bazat pe "Pascal - manualul utilizatorului", de Jensen si Wirth. Acest compilator de Pascal a fost unul din cele mai bine vandute compilatoare din toate timpurile, si a facut popular acest limbaj de programare pe platformele PC, multumita simplitatii si puterii lui. Turbo Pascal a introdus un mediu de dezvoltare integrat (IDE = integrated development environment) unde puteai edita programul (intr-un editor compatibil cu WordStar, un editor de texte), puteai rula programul, verifica si corecta erorile. Suna ca si ceva obisnuit acum, dar atunci trebuia sa iesi din editor inapoi in DOS, sa folositi compilatorul de la linia de comanda, sa scrii undeva numerele liniilor unde ai avut erori, sa redeschizi editorul sa corectezi si tot asa. Mai mult, firma Borland a vandut Turbo Pascal cu 49 de dolari, in timp ce compilatorul de Pascal de la Microsoft costa cateva sute de dolari. Acei multi ani de succes ai Turbo Pascal au contribuit la faptul ca Microsoft, in cele din urma, n-a mai lucrat la compilatorul lor de Pascal. Pentru ca sa vedeti de unde a inceput totul, puteti da jos de pe net prima versiune de Turbo Pascal. Nu va speriati, totusi, a fost doar prima Turbo Pascal... acum... In zilele noastre, Turbo / Borland Pascal nu prea mai e folosit, decat in scoli, dar a avut era lui de glorie. Motivul pentru care nu mai e folosit e destul de simplu: crearea unui program pentru Windows sau Linux (cu GUI = graphical user interface), chiar si in Borland Pascal 7.0 for Windows, dureaza foarte mult si cam doare. Nerecomandat incepatorilor ! Cu toate acestea, Pascal a fost si va ramane un limbaj accesibil celor care nu stiu programare. Odata stapanit bine, poate fi o rampa de lansare catre majoritatea celorlalte limbaje de programare.

Interfata Turbo Pascal 7.0 Mediul integrat (IDE) Turbo Pascal prezinta o bara de meniu orizontala, in partea de sus (meniul principal). Are 10 optiuni:

File Face cam ce face orice meniu File din zilele noastre. Deschide fisier nou, salveaza, etc. Edit Ce credeti ? idem Search Meniul de cautare al aproape oricarui editor de text. Run Ofera modalitati de rulare a programului (normal, pas cu pas), oprirea lui pentru modificari si posibilitatea de a porni programul cu anumiti parametri. Compile Compileaza programul (transforma codul sursa in cod masina, pentru a putea fi inteles si rulat de procesor) si faciliteaza crearea unui proiect, prin setarea unui "primary file" (programul care e rulat cand utilizatorul da aceasta comanda este cel setat prin primary file, asa ca nu mai aveti probleme cand dati Ctrl+F9, daca sunteti intr-un unit. Debug Vizualizarea valorilor variabilelor unui program, in timpul rularii acestuia, afisarea ultimului ecran al programului, puncte de intrerupere (breakpoint-uri), etc Tools Cateva programe care pot ajusta crearea programului, prin modificarea parametrilor pentru crearea lui, verificarea programului pentru a vedea unde "papa" mult timp, etc. Options Puteti seta directoarele implicite pentru unituri, culorile folosite de editor, salvarea preferintelor si (foarte) multe altele. Window Posibilitati de aranjare a ferestrelor Help Destul de usor de inteles ce face asta... doar ca Helpul e in engleza (sper ca nu se astepta cineva sa fie in romana )

E clar ca, in majoritatea timpului, nu veti avea nevoie de cele mai multe din optiunile oferite de meniu, asa ca am sa dau mai jos o lista de scurtaturi de la tastatura pentru cele mai uzuale functii:

COMBINATII UZUALE DE TASTE IN BORLAND PASCAL 7.0

ALT + X F2 F3

inchide Borland Pascalul (l-am pus primul pentru a putea iesi repede din el, daca aveti probleme salveaza fisierul curent deschide un fisier (unul nou sau unul salvat) )

COMBINATII UZUALE DE TASTE IN BORLAND PASCAL 7.0

SHIFT + DEL CTRL + INS SHIFT + INS ALT + F5 ALT + F9

comanda CUT comanda COPY comanda PASTE arata ultimul ecran al programului (ultimele afisari) verifica erorile de sintaxa si compileaza programul reseteaza programul (in caz ca il aveti pornit in modul pas cu pas) pentru alte modificari adauga o variabila a carei valoare va fi afisata pe parcursul executarii programului cu cursorul pus pe un anumit cuvant, va deschide Help-ul la sectiunea respectiva cu cursorul pus pe un cuvant care e numele unui fisier cu extensia .PAS din directorul curent, deschide si acel fisier (de ex. un unit)

CTRL + F9 verifica erorile de sintaxa, compileaza si ruleaza programul CTRL + F2 CTRL + F7 CTRL + F1 CTRL + ENTER

La lucru in Turbo Pascal 7.0 Pentru a incepe un program nou, in primul rand trebuie sa aveti Pascalul pornit. Selectati File / New si veti avea un nou fisier, denumit NONAMEXX.PAS (XX simbolizand al catelea fisier nou deschis este acesta). Alta solutie este sa alegeti File / Open, introduceti un nume, iar fisierul va fi automat salvat (bineinteles, gol).

Acum ca aveti in fata tot ce va trebuie, nu aveti DECAT sa scrieti programul, sa-l verificati de erori (poate fi verificat de erori compilandu-l, dar si rulandu-l direct, fiindca inainte de a-l rula il si verifica... ce descoperire )

Foarte "originalul" program care afiseaza Hello World este mai jos. Spor la joacaLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Begin 2. Write('Hello World'); 3. ReadLn;

4. End.Veti invata in urmatoarele tutoriale ce inseamna si ce fac aceste 4 linii de mai sus, momentan e de ajuns sa stiti ca puteti modifica Hello World de mai sus cu orice text vreti voi si ca va trebui sa apasati tasta Enter pentru a iesi din program.

Partile unui program Pascal

Cele trei parti principale ale unui program Pascal sunt: antetul (header-ul) programului, declaratiile in care se descriu obiectele asupra carora vor avea loc prelucrarile (in cadrul programului pe care il analizam, vom considera numai declararea variabilelor) si partea principala a programului in care se scriu instructiunile (ansamblul operatiilor ce urmeaza a fi executate). O structura vizuala a unui program Pascal ar arata in felul urmator:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. PROGRAM Nume_Program;2. 3. CONST 4. (* declaratii de constante *) 5. 6. TYPE 7. (* declaratii de tipuri *) 8. 9. VAR 10. (* declaratii de variabile *) 11. 12. (* declaratii de subprograme (functii si proceduri) *) 13. 14.BEGIN 15. (* instructiuni *) 16. END. De remarcat ca un program functional necesita doar ultimele 3 linii din schita de mai sus, iar compilatorul nu va avea nimic impotriva. Bineinteles, nu veti putea folosi variabile, constante, tipuri sau subprograme. Pentru a intelege aceasta structura, deloc complicata, sa analizam fara graba un program Pascal care calculeaza si afiseaza volumul unui paralelipiped. Este vorba de un program care declara variabile, citeste valorile acestora, efectueaza un calcul simplu si afiseaza rezultatul.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. PROGRAM volumul;2. {calculeaza si afiseaza volumul unui paralelipiped} 3. VAR lungime, latime, inaltime, volum: real; 4. BEGIN 5. writeln('Introduceti valori: lungime, latime, inaltime'); 6. readln(lungime, latime, inaltime); 7. volum := lungime * latime * inaltime; 8. writeln('Volumul paralelipipedului= ', volum:9:5,' metri cubi')

9. END. {volumul}Cand programul este rulat, pe ecran se va afisa:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Introduceti valori: lungime, latime inaltime 2. 8.3 7.25 6.29 3. Volumul paralelipipedului= 378.50075 metri cubi De remarcat ca sirul "8.3 7.25 6.29" a fost introdus de la tastatura, fiind valorile pentru lungime, latime, respectiv inaltime. Examinand acest program, vom putea vedea urmatoarele elemente: Antetul (header-ul) programului Prima linie contine antetul programului. Program este un cuvant rezervat cu care incepe (optional) un program (Borland) Pascal. El este urmat de numele programului: volumul si de simbolul punct si virgula. Simbolul punct si virgula (" ; ") este un separator de instructiuni. Este strict necesar, bineinteles, cu unele mici exceptii, care le voi semnala la momentul potrivit. O restrictie importanta a identificatorilor este aceea ca nu pot contine in interiorul lor blancuri (spatii). Comentariile A doua linie a programului "volumul" este numita un comentariu. Orice sir de caractere delimitat de seturile { si } sau (* si *) reprezinta un comentariu. Comentariile sunt folosite pentru a mari inteligibilitatea programelor (ele fiind ignorate de compilatorul Pascal), usurand astfel munca de intelegere si corectare a acestora. Daca se doreste imbricarea comentariilor, acest lucru se face alternand acoladele cu (*. Ex. modul corect:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. (* comentariu1 {comentariu imbricat} comentariu2 *) 2. { comentariu1 (*comentariu imbricat*) comentariu2 } modul incorectLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. (* comentariu1 (*comentariu imbricat*) comentariu2 *)Setul de acolade { si } mai este folosit si pentru directivele de compilare. Comentariile fac programul mai usor de inteles. Daca va scrieti programele fara comentarii veti putea avea nevoie de o perioada de reacomodare cu codul cand veti reveni pentru a-l modifica. In general, in partile de cod mai serioase sau mai complicate, se obisnuieste sa se foloseasca cateva comentarii. In plus, daca aveti de gand sa modificati codul pentru un alt scop decat cel initial, este bine sa faceti un comentariu in care sa explicati ce doriti sa faceti.

Remarcati in ultima linie a programului prezenta comentariului {volumul}, tocmai pentru a reaminti cititorului numele programului care s-a incheiat. Comentariile pot fi plasate oriunde in cadrul programului, dar nu in interiorul identificatorilor. Declararea variabilelor Cuvantul cheie var (prescurtare de la variables) incepe actiunea de declarare a variabilelor. Fiecare variabila trebuie sa poarte un nume. Programul volumul foloseste patru variabile (lungime, latime, inaltime, volum) identificate in faza de analiza structurata a programului. Acestea sunt grupate astfel: Variabile de intrare: lungime: lungimea paralelipipedului latime: latimea paralelipipedului inaltime: inaltimea paralelipipedului Variabile de iesire: volum: volumul paralelipipedului Nu trebuie sa va speriati de denumirea pompoasa (de intrare, de iesire). Variabilele se declara la fel, indiferent de rolul lor. Denumirile sunt folosite doar pentru a usura intelegerea rolului acestor variabile in program. Tipuri de date In Pascal exista doua tipuri (simple) de date pentru variabile numerice: intregi si reale. Variabilele intregi pot lua valori numai numere intregi, cum ar fi: 6, -19, 0 sau 73700. Un calculator poate reprezenta numai o submultime finita de intregi. O valoare intreaga poate fi salvata in memoria unui calculator doar daca respectiva valoare apartine intervalului (-maxint1, maxint), undemaxint este o constanta predefinita. In majoritatea implementarilor limbajului Pascal constanta maxinteste egala cu 32767. Daca o variabila Pascal va avea o valoare fractionara, variabila trebuie sa fie de tip real. Intr-un program (Borland) Pascal tipul fiecarei variabile utilizate trebuie sa fie declarat. Omiterea declararii unei variabile folosite in partea principala a programului va genera o eroare. In programul pe care-l analizam (volumul), declararea variabilelor s-a facut utilizand enuntul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. VAR lungime, latime, inaltime, volum: real;Odata intalnit acest enunt, compilatorul afla ca toate cele patru variabile sunt de tip real. Zona de memorie alocata variabilelor Fiecarei variabile din program i se asociaza o locatie de memorie pe care v-o puteti imagina ca pe o cutie avand inscriptionate: nume si tip. Continutul cutiei este dat de valoarea curenta a variabilei. Tipul defineste categoria valorii din cutie. Programul refera variabila prin nume. Partea principala a programului reprezinta zona activa, executabila a programului. Cuvintele rezervate BEGIN si END delimiteaza instructiunile care descriu algoritmul principal al problemei de rezolvat.

Enunturile (instructiunile) write / writeln Enunturile write / writeln sunt utilizate pentru afisarea pe un suport de informatie (de regula monitorul) a rezultatelor obtinute in urma prelucrarilor, a mesajelor catre utilizator etc. Write si WriteLn reprezinta in Pascal doi identificatori (de procedura) predefiniti (standard). De remarcat ca daca dati unui program numele "write" (sau "writeln"), nu mai aveti voie sa folositi in program nici un enunt write (sau writeln) cu sensul predefinit (adica sa afiseze un text, variabila, etc). Ori de cate ori se va executa un enunt write / writeln, calculatorul va afisa ad-litteram tot ceea ce este inclus intre apostrofuri, precum si valorile oricarei variabile sau expresii aflate intre paranteze. In plus fata de write, Writeln va trece la linie noua dupa afisarea propriu-zisa. Pentru separarea elementelor din corpul instructiunii se folosesc virgulele. Primul enunt din programul analizat (volumul) determina calculatorul sa scrie pe ecran mesajul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Introduceti valori: lungime, latime inaltime dupa care va muta cursorul la inceputul liniei urmatoare. Fara un astfel de mesaj este greu sa ne dam seama ca este timpul sa se tasteze ceva. Writeln forteaza calculatorul sa afiseze tot ceea ce s-a specificat in interiorul parantezelor si sa treaca la linie noua. La un enunt write, cursorul va ramane pe pozitia imediat urmatoare ultimul caracter scris cu acest enunt. Writeln poate fi folosit si fara parametri pentru a muta cursorul cu o linie mai jos. Enuntul readln In momentul in care s-a executat instructiuneaLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. readln(lungime, latime, inaltime);calculatorul asteapta de la utilizator sa introduca trei numere. Primul va fi atribuit variabilei lungime, cel de-al doilea variabilei latime si in sfarsit cel de-al treilea variabilei inaltime. Nu uitati ca toate cele trei variabile sunt de tip real! Aceste valori pot fi tastate pe o singura linie, cu spatii intre ele, sau cate una pe linie. De remarcat ca valorile (folosind instructiunile Read / ReadLn) nu sunt citite pana la apasarea tastei Enter. Utilizarea combinatiei write-readln in locul combinatiei writeln-readln De foarte multe ori, in programarea calculatoarelor se foloseste combinatia write-readln in locul combinatiei writeln-readln. Avantajul combinatiei write-readln este acela ca valoarea care se introduce va aparea pe aceeasi linie a ecranului cu cererea, in loc sa apara pe o linie proprie, cum s-ar fi intamplat in cazul folosirii combinatiei writeln-readln.

Enuntul de atribuire (asignare) Enuntul ce urmeaza dupa enuntul readlnLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. volum :=lungime*latime*inaltime; se numeste enunt de atribuire intrucat el calculeaza ceva (produsul dintre lungime, latime si inaltime) si atribuie (asigneaza, afecteaza) rezultatul variabilei din stanga simbolului ":=". Partea dreapta a acestui enunt este un exemplu de expresie aritmetica. Formatarea afisarii Ultimul enunt din programul volumul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. writeln('Volumul paralelipipedului= ',volum:9:5,' metri cubi');afiseaza intr-o forma explicita rezultatul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Volumul paralelipipedului= 378.50075 metri cubiRemarcati forma de prezentare a rezultatului. Pentru inceput, sirul de caractere "Volumul paralelipipedului", urmat de rezultatul propriu-zis, afisat insa intr-un sablon de 9 caractere, dintre care cinci reprezinta cifre zecimale. Acest mod de afisare a fost stabilit de specificatorul de format ":9:5" (9 caractere, din care 5 cifre zecimale). In cazul in care rezultatul ar fi avut 10 caractere (4 cifre inaintea virgulei, 5 cifre zecimale), specificatia ":9" nu era luata in seama. In cazul in care ar fi fost mai putine caractere (8 sau 7), atunci primul / primele caractere erau completate cu spatii. Specificatia de format " : x : y " este facultativa, dar fara acest specificator de format, volumul calculat ar fi fost afisat in notatie exponentiala (stiintifica), care este mai greu de citit. In sfarsit, sirul de caractere "metri cubi" completeaza imaginea rezultatului. Spatii albe (whitespace) Spatiile albe (spatiile, tab-urile, sfarsiturile de linie) sunt ignorate de Pascal, cu exceptia (evidenta) a sirurilor de text (stringuri) care sunt intre apostroafe. Totusi, pentru a usura munca oamenilor (a programatorului si a celor care mai vad codul) se recomanda spatierea cat mai ordonata a codului si, foarte important, indentarea codului. Folosirea TAB-ului pentru a indenta codul este nerecomandata, luandu-se in considerare diferentele posibile la intelegerea acestui caracter (2, 4, 8 spatii + posibilitati de a-l redefini in compilatorul dvs.). Identificatori Asa cum am aratat mai sus, identificatorii sunt definiti cu numele dorite. Totusi, exista cateva reguli de baza, de la care nu va puteti abate: Trebuie sa inceapa cu o litera din alfabet englezesc sau cu caracterul "_" (underline, underscore). Poate continua cu orice litera, cifra sau underline

Nu poate contine anumite caractere speciale (~ ! @ # $ % ^ & * ( ) + ` - = { } [ ] : " ; ' < > ? , . / |), multe avand intelesul lor in Pascal. Unele compilatoare de Pascal nu pun nicio restrictie asupra lungimii identificatorilor, dar altele folosesc doar primele cateva caractere (Borland Pascal foloseste primele 63 de caractere - n-am testat niciodata ). Problema des intalnita la identificatorii lungi este faptul ca incetinesc scrierea programului de catre programator. Lungimea identificatorilor este bine sa fie limitata la 10, maxim 15, caractere, in majoritatea cazurilor. Constante Constantele sunt identificatori ai unor valori ce sunt definite la inceputul programului. Valorile asignate constantelor nu pot fi schimbate in decursul rularii programului. Mai jos aveti o lista de constante declarate ca: Integer, Real, Caracter, String, Boolean (in aceasta ordine). Aceste tipuri de date vor fi explicate in tutorialul urmator.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. const numar = 2; 2. alt_numar = 3.14; 3. litera = 'G'; 4. nume = 'Ionut'; 5. DoWait = False;

{numar intreg} {numar real} {caracter} {sir de caractere (string)} {valoare logica (boolean)}

Constantele sunt, de obicei, folosite pentru a tine o valoare des utilizata in program, care s-ar putea sa fie nevoie sa fie schimbata. Ganditi-va ca vreti sa faceti un program care deseneaza un dreptunghi in relief (3D). Pentru aceasta va trebui sa desenati dreptunghiul de mai multe ori, cu diferite culori, pentru a realiza efectul 3D. Daca la primul dreptunghi veti pune marimea laturii 50, la al doilea 49 si tot asa, veti vedea ca atunci cand vreti sa modificati programul, va trebui sa modificati fiecare numar. Alternativ, cu constante, in secventa de cod de mai jos:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. { ... } 2. const latura_mare = 50; 3. latura_mica = 20; 4. { ... } 5. begin 6. { ... } 7. Deseneaza Dreptunghi (latura_mare, 8. Deseneaza Dreptunghi (latura_mare 9. Deseneaza Dreptunghi (latura_mare 10. Deseneaza Dreptunghi (latura_mare 11. Deseneaza Dreptunghi (latura_mare 12.{ ... } 13. end.

2, 4, 6, 8,

latura_mica) latura_mica latura_mica latura_mica latura_mica -

2) 4) 6) 8)

Atentie: acest program nu va rula in Pascal. Este dat doar pentru exemplificare. Secventele { ... } desemneaza cod care e posibil sa existe.

Variabile Variabilele sunt identificatori ai unor valori de anumite tipuri, specificate in declaratie. Spre deosebire de constante, pot fi declarate mai multe variabile de acelasi tip pe o singura linie. Mai jos aveti o lista de declarare de variabile. Aceste tipuri de date vor fi explicate in tutorialul urmator.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var index, numar, suma, produs: Integer; 2. valoare_pi, valoare_e: Real; 3. litera: Char; 4. nume, prenume: String; 5. AmTerminat: Boolean;Variabilele sunt folosite pentru valori care se pot schimba in decursul programului. Variabilele pot fi folosite si in loc de constante, declarandu-le valoarea in program. Asignare Operatia de asignare este operatia prin care variabilele primesc valori. Pentru a asigna o variabila se foloseste urmatoarea sintaxa:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. variabila := valoare; Secventa := se numeste operatorul de asignare. valoare trebuie sa fie de acelasi tip cu tipul declarat al variabilei. Exemple (folosind declararea de variabile de mai sus):LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. index := 1; 2. numar := 15;3.

4. 5. 6. 7. 8.

litera := 'k'; litera := #65; {caracterul A majuscula} nume := 'Bitcell'; prenume := '.info'; nume := nume + prenume; {da, sirurilor de caractere li se poate aplica operatorul de adunare, caz in care sirurile vor fi concatenate} 9. {in acest exemplu, variabila "nume" va primi valoarea "Bitcell.info"} 10. 11. AmTerminat := (litera = 'X') and (litera = 'x'); {comparatii care returneaza un rezultat boolean, True sau False} 12. 13. valoare_pi := 22 / 7; {nu este chiar valoarea lui pi, dar pentru un exemplu merge} 14. 15. valoare_e := (numar / index) + suma; 16.

In Pascal, operatorii aritmetici sunt:

OPERATORI ARITMETICI IN PASCAL

Operator + * / div mod

Operatie adunare sau semn pozitiv scadere sau semn negativ inmultire impartire catul impartirii intregi restul impartirii intregi

Operanzi reali sau intregi reali sau intregi reali sau intregi reali sau intregi intregi intregi

Rezultat real sau intreg real sau intreg real sau intreg real intreg intreg

Dupa cum se vede in tabelul de mai sus, div si mod pot fi folosite doar cu numere intregi. Operatorul de impartire / poate fi folosit si cu numere intregi, si cu numere reale, dar va returna intotdeauna un numar real. Celelalte operatii functioneaza pe si numere intregi, si pe numere reale. De tinut minte e faptul ca atunci cand intr-o operatie folosim si numere intregi, si numere reale, rezultatul va fi intotdeauna un numar real. Fiecarei variabile ii poate fi asignat o valoare de acelasi tip cu ea. Acesta este motivul pentru care nu se poate asigna o valoare reala unui intreg. Totusi, anumite tipuri de date vor converti valoarea catre un tip mai mare de date. Asta se intampla, de exemplu, cand se asigneaza o valoare intreaga unei variabile reale.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. numar_intreg := 170;2. numar_real := numar_intreg; In acest caz numarul intreg 170 va fi convertit in numar intreg, iar variabila numar_real va avea valoarea170.0. Schimbarea unui tip de data in alt tip se numeste typecasting (selectare de tip). Typecasting-ul din exemplul de mai sus este un exemplu de typecasting implicit (se intampla fara a se specifica aceasta intentie de catre programator). Majoritatea compilatoarelor moderne de Pascal suporta si typecasting-ul explicit, cu o sintaxa doar putin diferita de cea a limbajului C. Codul de mai jos da un exemplu al typecasting-ului explicit.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var numar8biti: byte; 2. numar16biti: integer;3. begin 4. numar16biti := 1000; 5. numar8biti := byte(numar16biti);

6. write(numar8biti); 7. end.In acest exemplu asignam o valoare intreaga, reprezentata intern pe 16 biti, unei variabile intregi reprezentata pe doar 8 biti, specificand ca vrem sa schimbam tipul variabilei in byte (reprezentare interna de 8 biti). Acesta este typecasting-ul explicit si, in Pascal, se face prin a pune paranteze in jurul valorii careia ii vrem schimbate reprezentarea si punand tipul dorit in fata parantezei. In exemplul de mai sus, variabila pe 8 biti va primi valoarea de 232 (byte-ul cel mai putin semnificativ din valoarea pe 2 bytes initiala). Punctuatie si indentare Avand in vedere ca Pascal ignora spatiile albe (vezi mai sus), punctuatia este necesara pentru a spune compilatorului unde se termina o instructiune. Caracterul care indica terminarea unei instructiuni este, in general, punct si virgula ;. Caracterul care indica terminarea programului este punctul .. Trebuie sa aveti un caracter ; dupa: numele programului fiecare definitie de constanta fiecare definitie de variabila fiecare definitie de tip aproape toate instructiunile Ultima instructiune inainte de o instructiune end nu necesita sa aiba ; la sfarsit. Totusi, nu se intampla nimic sa puneti si in acest caz. De fapt, e chiar recomandat sa puneti in acest caz, datorita faptului ca e posibil sa adaugati o alta instructiune dupa instructiunea care nu are terminator ( ; ) si va veti trezi cu erori de compilare. Indentarea NU este necesara, din punctul de vedere al compilatorului. Cu toate acestea, indentarea este una dintre cele mai importante lucruri in programare, oferind claritate codului. Alta problema cu indentarea este indentarea facuta folosind tasta TAB. Caracterul TAB, fiind afisat in diferite feluri in diferite editoare, duce la neclaritati si/sau imprastierea codului pe latime. (Eu, ca programator, refuz sa lucrez pe o bucata de cod care nu e scrisa cat mai clar posibil. Daca e strict necesar sa lucrez pe ea, primul lucru de care ma ocup este indentarea codului.) Alt lucru important (si care ajuta la claritate) e punerea fiecarei instructiuni pe linie separata. Sa luam o bucata de program si sa vedem ce si cum. Aceasta este bucata de cod, indentata si clara.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. const spaced = ' '; 3. select = ' * '; 4. var c: char; 5. sel: integer;

6. begin 7. clrscr; 8. c := #0; 9. sel := 1; 10. {afisam meniul initial} 11. TextColor(Yellow); 12. TextBackground(Blue); {galben pe albastru pentru optiunea selectata} 13. WriteLn(select, '1. BitCell.info'); (luat dintr-un exemplu)

Aceeasi bucata de cod, scrisa cu picioarele (figura de stil

)

LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. 2. 3. 4.

uses crt; const spaced = ' '; select = ' * '; var c: char; sel: integer; begin clrscr; c := #0; sel := 1; {afisam meniul initial} TextColor(Yellow); TextBackground(Blue); {galben pe albastru pentru optiunea selectata} WriteLn(select, '1. BitCell.info');

Instructiuni conditionale si bucleLa inceputurile informaticii, programarea se facea mai mult dupa ureche, programatorul fiind liber sa foloseasca orice structuri oferite de limbajul de programare in care lucra, fara sa tina cont de posibilitatea ca un alt programator ar avea mari dificultati daca ar incerca sa corecteze / dezvolte programul facut de el. Salturile neconditionate (GOTO) si structurile cu mai multe puncte de intrare sau iesire erau un lucru foarte obisnuit. In mai 1966, Bohm si Jacopini au demonstrat ca orice algoritm poate fi compus din numai trei structuri de calcul: structura secventiala structura alternativa structura repetitiva In 1968, Dijkstra a publicat un articol denumit "Un caz impotriva structurii GOTO" (A Case against the GO TO Statement), care de fapt este metodologia a ceea ce astazi numim programare structurata. Programarea structurata este, in conceptia celor mentionati mai sus, cel mai simplu mod de a crea un program care este usor de inteles si usor de corectat / dezvoltat. Sa luam cele trei structuri de mai sus in ordine. Structura secventiala Este cea mai usoara structura intalnita intr-un program. In programul de mai jos (care face suma a doua numere citite de la tastatura) :

LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var a, b: integer;2. begin 3. write('Dati a: '); readln(a); 4. write('Dati b: '); readln(b); 5. write('Suma celor doua numere este ', a + b); 6. readln; 7. end. , nu intalnim alta structura de calcul decat cea secventiala. Cu asta vreau sa spun ca toate instructiunile vor fi folosite, pe rand, in ordine, fara ca vreuna din instructiuni sa se repete. Suna ca o reteta usoara de mancare, nu ? Exact asa si este. Structura alternativa Este o structura de calcul care permite, in functie de anumite conditii, executarea (sau neexecutarea) unei anumite instructiuni sau secventa de instructiuni. Programul de mai jos vrea sa faca suma a doua numere, in afara de cazul in care primul numar este 0 (zero), caz in care aduna al doilea numar cu el insusi :LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var a, b: integer;2. begin 3. write('Dati a: 4. write('Dati b: 5. If a 0 Then 6. Else 7. readln; 8. end. '); readln(a); '); readln(b); write('Suma celor doua numere este ', a+b) write('Suma celor doua numere este ', b+b);

Deci, am pus o conditie si in functie de ea executam o parte sau alta a codului. Parca suntem in viata. Ne ofera cineva ceva, dar noi nu acceptam decat daca pretul e mai mic sau egal cu o anumita suma, pentru ca altfel ni se pare prea mare pretul. Structura repetitiva Este o structura de calcul care permite, in functie de anumite conditii, executarea unei anumite instructiuni sau secventa de instructiuni de N ori (unde N poate fi 0, 1 sau mai mult). Programul de mai jos citeste doua numere de la tastatura si va aduna primul numar cu el insusi de atatea ori cat e valoarea celui de-al doilea :LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var a, b, suma: integer;2. begin 3. write('Dati a: '); readln(a); 4. write('Dati b: '); readln(b); 5. suma := 0; 6. For b := 1 To b Do 7. suma := suma + a; 8. write('Suma este ', suma);

9.

10. end.

readln;

Este simplu, doar adunam valoarea din A de B ori, altfel spus inmultim A cu B. Totusi, scopul acestui program nu e de a face inmultirea, ci de a explica structura repetitiva Aceste trei structuri de calcul s-au dovedit de-a lungul timpul a fi, intr-adevar, singurele strict necesare crearii unui program, motiv pentru care nici nu o sa explic in aceste tutoriale cum se folosesc, in Pascal, salturile neconditionate (desi exista aceasta posibilitate). Instructiuni conditionale Avem la dispozitie doua tipuri de instructiuni conditionale in Pascal: If ... Then ... [Else ... ] si Case. Sa incepem cu inceputul. Structura If ... Then ... [Else ... ] Are doua sintaxe, putin diferite. Cea mai obisnuita este mai jos:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. If conditie 2. Then instructiune1 3. Else instructiune2;conditie este o comparatie sau orice altceva care returneaza o valoarea logica (True sau False), cum ar fisuma = 5 ("=" semnifica egalitate, nu atribuire !) instructiune1 si instructiune2 pot fi orice fel de instructiuni, inclusiv instructiunea compusa. Atentie:In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) nu numai ca nu este necesar dupa instructiune1, ci este interzis sa fie pus acolo. A doua varianta a acestei structuri conditionale este cea in care nu avem ramura de else :LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. If conditie 2. Then instructiune1;

Atentie:In cazul folosirii acestei sintaxe, semnul " ; " (punct si virgula) este strict necesar dupainstructiune1. Sa exemplificam aceste structuri prin programul de mai jos:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var varsta: integer; 2. sex: char;3. begin

4. 5.6.

write('Ce varsta aveti ? '); ReadLn(varsta); write('Sunteti baiat sau fata ? (M / F) : '); ReadLn(sex); If (sex = 'f') or (sex = 'F') Then WriteLn('Sex feminin') Else WriteLn('Sex masculin'); If varsta > 17 Then WriteLn('Persoana majora'); ReadLn;

7. 8. 9.

10.

11. 12.

13. 14.

15. End.

Pentru a intelege programul, sa-l luam pas cu pas. Am definit doua variabile, una de tip integer (valoare numerica) denumita varsta si una de tip Char (un singur caracter) denumita sex. Dupa citirea de la tastatura a valorilor pentru aceste doua variabile, verificam daca variabila sex e cumva litera F. De remarcat ca am folosit operatorul logic OR pentru a verifica daca variabila are valoarea f sauF, ambele insemnand faptul ca sexul este feminin, caz in care afisam acest lucru. Pe ramura de Else, stiind ca sexul nu este feminin, am pus direct afisare ca sexul este masculin, ceea ce nu este tocmai corect. Trebuia facuta o verificare si daca valoarea variabilei sex este m sau M, pentru a asigura acuratetea programului. In programul de mai sus, daca pentru variabila sex introducem litera c, progamul va afisa tot "Sex masculin", dar momentan scopul meu nu e de a crea programe fara bug-uri, ci doar de a va explica modul de functionare a structurilor conditionale. Pentru varsta facem o singura verificare, anume daca varsta este strict mai mare decat 17 (adica minim 18), caz in care afisam "Persoana majora". Sa refacem programul pentru a lua in calcul si alte cazuri (cum ar fi verificarea pentru sexul masculin, varste negative sau peste 150 de ani )LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var varsta: integer; 2. sex: char;3. begin 4. write('Ce varsta aveti ? '); ReadLn(varsta); 5. write('Sunteti baiat sau fata ? (M / F) : '); ReadLn(sex); 6. 7. If (sex = 'f') or (sex = 'F') 8. Then WriteLn ('Sex feminin') 9. Else 10. If (sex = 'm') or (sex = 'M') 11. Then WriteLn ('Sex masculin') 12. Else WriteLn ('Sex necunoscut, probabil neutru'); 13. 14. If (varsta < 0) 15. Then WriteLn ('Persoana care este inca in planuri de viitor') 16. Else 17. If (varsta < 18)

18. 19. 20. 21. 22. 23. 24. 25.26. 27.

Then WriteLn ('Persoana minora') Else If (varsta < 60) Then WriteLn ('Persoana majora') Else If (varsta < 150) Then WriteLn ('Persoana in varsta') Else WriteLn ('Personaj biblic'); ReadLn;

28. End.

Dupa cum vedeti, in noul program am luat in calcul ca variabila sex poate reprezenta sex feminin, sex masculin sau un caracter care nu reprezinta nici unul din acestea doua cazuri. Pentru aceasta, am folosit instructiuni conditionale imbricate (adica una in interiorul alteia). Arata urat, nu ? In plus, e si destul de greu de inteles. Cu toate acestea, pentru variabila varsta am facut chiar si mai multe verificari, folosind multiple instructiuni conditionale imbricate. E deja mai urat si chiar si mai greu de inteles. Nu am de facut decat sa va recomand multa atentie cand creati sau recititi programul ... si sa va prezint instructiunea conditionala multipla, ca o alternativa la instructiunea If ... Then ... [Else ... ] Structura Case Instructiunea Case, denumita si instructiune alternativa multipla, ofera posibilitatea verificarii unei variabile pe un set mai intins de valori, fara a da dureri de cap la crearea sau recitirea programului. Sintaxa generala:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Case variabila_simpla Of2. 3. 4. 5. val_posibile1 : instructiune1; val_posibile2 : instructiune2; ... val_posibileX : instructiuneX; 6. Else instructiuneY; 7. End; Sa incercam sa intelegem aceasta sintaxa, care pare a fi ceva mai complicata decat sintaxa instructiunii dinainte. Variabila_simpla desemneaza orice variabila de un tip simplu de date (vedeti tutorialul anterior). Nu poate fi folosit aici, de exemplu, tipul String, el nefiind un tip simplu de date. Val_posibile1, Val_posibile2 si Val_posibileX tin locul unei (sau a mai multor) valori posibile pentruvariabila_simpla. Daca valoarea variabilei variabila_simpla e egala (sau inclusa) cu vreuna din valorile posibile, atunci va fi executat setul corespunzator de instructiuni. Instructiune1, instructiune2 si instructiuneX pot fi orice fel de instructiuni, inclusiv cele compuse. Pe ramura de Else avem acelasi lucru ca si la instructiunea If ... Then ... [Else ... ], adica o anumita instructiune care se executa in cazul in care valoarea variabilei variabila_simpla nu se regaseste in optiunile de mai sus (Val_posibile1, Val_posibile2, Val_posibileX). Aceasta ramura, ca si la If ... Then ... [Else ... ], poate ramane nefolosita.

Sa refacem programul de mai sus, folosind aceasta noua instructiune.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var varsta: integer; 2. sex: char;3. begin 4. write('Ce varsta aveti ? '); ReadLn(varsta); 5. write('Sunteti baiat sau fata ? (M / F) : '); ReadLn(sex); 6. 7. Case sex Of 8. 'f','F' : WriteLn('Sex feminin'); 9. 'm','M' : WriteLn('Sex masculin'); 10. Else Writeln('Sex necunoscut, probabil neutru'); 11. End; 12. 13. Case varsta Of 14. 0 .. 17 : WriteLn('Persoana minora'); 15. 18 .. 60 : WriteLn('Persoana majora'); 16. 61 .. 150 : WriteLn('Persoana in varsta'); 17. 151 .. maxint : WriteLn('Personaj biblic'); 18. -maxint .. -1 : WriteLn('Persoana care este inca in planuri de viitor'); 19. End; 20. 21. ReadLn; 22. End. Dupa cum vedeti, e mult mai usor de folosit si este mult mai clara. Singurul lucru care cred ca mai e necesar sa vi-l explic este ce inseamna, 'f','F' si 18 .. 60. Structura Case, dupa cum am explicat anterior, permite ca, pentru o anumita instructiune, sa verificam mai multe valori posibile. Aceste valori pot fi scrise una cate una si despartite prin virgula (cum a fost in cazul variabilei sex) sau pot fi scrise ca un sir de valori, in care se ofera valoarea minima si apoi valoarea maxima, aceste doua valori fiind despartite prin " .. " (doua puncte unul dupa celalalt). Cam asta ar fi toata partea de instructiuni conditionale in Pascal. Sa trecem la ... Bucle (instructiuni repetitive) Buclele (instructiuni de ciclare) sunt niste instructiuni care asigura repetarea pe un anumit numar de pasi a unor anumite instructiuni. Sa ne imaginam ca vrem sa facem un program care sa afiseze crescator, de la 1 la 20, toate numerele. E destul de simplu sa le afisam cu o instructiune Write (sau mai multe). Dar sa presupunem ca vrem sa facem acelasi lucru pana la 1.000 ... sau pana la 1.000.000 ... cred ca sunteti de acord ca ar fi "cam" mult de lucru. Aici apare nevoia de bucla, pentru a repeta un set de instructiuni de un numar dat de ori.

In Pascal, sunt trei tipuri de instructiuni de ciclare: While Repeat For Bucla While Sintaxa generala a acestei instructiuni este:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. While conditie Do instructiune;Conditie poate fi orice comparatie sau orice altceva ce are ca rezultat True sau False. Se poate apela siLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. While True Do instructiune; , caz in care nu se poate iesi din bucla din cauza conditiei. Daca nu exista in interiorul acestei bucle o instructiune de iesire (Break), atunci bucla va fi infinita (nu va mai iesi din ea, programul se va bloca si va trebui terminat cu Ctrl + Break, sau si mai rau, din Task Manager sau reboot). In general, conditia va face referire la o conditie care va deveni adevarata, pe masura bucla lucreaza sau este o simpla verificare a unui contor, caz in care putem calcula dinainte exact cate ciclari va face bucla (de cate ori va repeta instructiunile aflate in interior).De remarcat ca iesirea din bucla se va face doar cand conditia va returna valoarea False. E si destul de usor de inteles asta : While conditie Do instructiune care in limbaj natural ar suna Cat timp conditia_mea_e_adevarata Fa ceva. Aceasta instructiune mai este denumita si "instructiune repetitiva cu test initial" (testul de iesire din bucla se face la inceput). Instructiunile din aceasta bucla nu se vor executa nici macar o data, daca testul de iesire returneaza valoarea False de la inceput. Instructiune poate fi orice fel de instructiune, inclusiv instructiunea compusa. Sa vedem cum am putea face in Pascal, folosind bucla While, programul de mai sus care afiseaza pana la 20.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var cnt : integer;2. begin 3. cnt := 1; 4. While cnt = 20; 8. ReadLn; 9. End. Din nou, avem conditia de la While, dar inversata. Cam asta ar fi si Repeat-ul ... easy, nu ? Atentie:Inversa conditiei > este =. Bucla For Sintaxa generala la For cunoaste 2 cazuri: crescator sau descrescator. Cazul crescator:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. For contor = val_initiala To val_finala Do instructiune;Cazul descrescator:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. For contor = val_initiala DownTo val_finala Do instructiune;Motivul pentru care avem aceasta distinctie e faptul ca nu mai avem direct controlul asupra contorului buclei, acesta fiind crescut / scazut de bucla, scapandu-ne astfel de o grija. Din pacate, in felul acesta nu putem decat sa mergem cu pasi de cate o unitate (crescator sau descrescator). In cazurile While sau Repeat, puteam creste contorul cu cat vroiam noi (am ales sa-l cresc cu 1 doar pentru exemplificare). Dupa cum ati observat, aici nu mai avem nici o conditie de iesire din bucla. Iesirea din aceasta bucla se face in momentul in care val_initiala devine mai mare / mai mica cu o unitate decat val_finala. De asemenea, daca se foloseste sintaxa cu To se sare peste bucla in cazul in care val_initiala este mai mare decat val_finala si invers. De remarcat e faptul ca nu mai trebuie sa initializam contorul inaintea buclei (il initializam, de fapt, direct in bucla). Programul de mai sus, scris cu o bucla For ar arata in felul urmator:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var cnt : integer;2. begin 3. For cnt := 1 To 20 Do 4. WriteLn(cnt); 5. ReadLn; 6. End. Dupa cum vedeti, contorul nu prea mai e in grija noastra (iar unele compilatoare chiar dau eroare daca veti incerca sa-i modificati valoarea in interiorul buclei).

Sa incercam acum sa lucram cu varianta descrescatoare pentru a face acelasi programLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var cnt : integer;2. begin 3. For cnt := 20 DownTo 1 Do 4. WriteLn(20 - cnt + 1); 5. ReadLn; 6. End. Ok, programul merge ... dar de ce am pus formula aceea ciudata acolo ? Trebuie sa tineti cont de faptul ca acum contorul merge de la 20, descrescator, spre 1, exact invers de cum ne-am obisnuit, asa ca prima valoare a lui cnt este 20. Pentru prima afisare, daca scadem 20 din 20 si adaugam 1 (ca in formula), ne da 1, exact ce trebuie afisat. Sa incercam pentru cazul in care cnt este 2 ... 20 - 2 + 1 = 19, deci asta e penultimul numar care va fi afisat, ultimul fiind, evident, 20.

Instructiuni de control pentru bucle Instructiunea Continue Sa presupunem ca avem o bucla care afiseaza numerele de la 1 la 20, ca si in exemplele de mai sus, dar nu vrem sa afisam numarul 9. Cum putem face acest lucru ? Foarte simplu. Trebuie sa "sarim" peste o executie a buclei, cea in care indexul are valoarea 9, inainte de a afisa numarul. Pentru acest lucru folosim instructiunea Continue. Sa vedem un exemplu, folosind bucla FOR:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var cnt : integer;2. begin 3. For cnt := 1 To 20 Do 4. begin 5. if cnt = 9 then 6. Continue; {daca instructiunea de afisare} 7. WriteLn(cnt); 8. end; 9. ReadLn; 10. End.

indexul

este

egal

cu

9,

nu

executam

Instructiunea Continue sare la urmatorul ciclu al buclei, indiferent ca e vorba de bucla While, Repeat sau For. Instructiunea Break Ce facem daca avem nevoie sa scriem un program care afiseaza numerele de la 1 la 20, dar numai atat timp cat suma numerelor afisate este mai mica decat 35 ? Pentru acest lucru trebuie sa facem o suma, pe care o crestem cu valoarea indexului la fiecare afisare. Aceasta suma o vom verifica inainte de urmatoarea afisare si, daca este mai mai mare sau egala cu 35, folosim instructiunea Break. Sa modificam programul de mai sus pentru un mic exemplu:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var cnt, suma : integer;2. begin 3. suma := 0; 4. For cnt := 1 To 20 Do 5. begin 6. suma := suma + cnt; 7. if suma >= 35 then 8. Break; {iesim din bucla} 9. WriteLn(cnt); 10. end;

11.

12. End.

ReadLn;

Acest program va afisa numerele de la 1 la 7, inclusiv, fiindca 1 + 2 + ... + 8 = 36. Instructiunea Break opreste bucla din care este apelata. dar nu poate opri decat o singura bucla. Daca aceasta instructiune este folosita in interiorul unei bucle care este imbricata in alta bucla, doar bucla interioara va fi oprita.

Vectori (tablouri, matrici)Probabil ca acum, dupa ce ati parcurs primele 3 tutoriale de Pascal de pe aici, stiti sa faceti suma a doua numere, citite de la tastatura. Probabil ca vi se pare chiar usor. Sa zicem ca vreau sa-mi si afisati cele doua numere dupa ce-ati afisat suma. Nimic iesit din comun. Ce-ati zice daca v-as cere un program care sa faca suma a trei numere ? E posibil sa nu va deranjeze prea tare ... nu e mare lucru sa adaugi o variabila, sa-i citesti valoarea de la tastatura si sa o aduni la suma. Chiar si afisarea celor trei numere nu ar trebui sa dea batai de cap nimanui. Ce-ati zice daca v-as cere un program care face suma a 1000 de numere, afisand apoi fiecare numar introdus de la tastatura ? E clar, e momentul pentru un alt tip de date, unul structurat, capabil sa tina in memorie siruri de date. Primul tip de date structurat care l-am prezentat in Tipuri de date in Pascal este tipul tablou. Pentru acest tip de date se folosesc mai multe sinonime, cum ar fi vector, matrice sau englezismul array. Toate se refera la acelasi lucru. Sa incepem cu inceputul. Vectori unidimensionali Ca sa putem folosi acest nou tip de date, trebuie sa-l declaram. Modalitatea de declarare a unui vectorunidimensional cu capacitatea de 1000 de numere intregi (pe 2 bytes, in acest caz) este urmatoarea:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. sir : array [1 .. 1000] of Integer;

So, punem cuvantul cheie "array", punem indexul de inceput al sirului (poate fi si -17 ), punem ".." pentru a specifica faptul ca e vorba de un interval, punem indexul de sfarsit (1000 in exemplul de mai sus), adaugam cuvantul cheie "of" (asa-i romanul, plin de ofuri face parte din vector ... si nimic mai mai mult. ExempleLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

), specificam tipul datelor care vor

1. var test: array [65 .. 122] of char; 2. test2: array ['H' .. 'a'] of boolean;

Nu va speriati, si varianta in care am pus litere pe post de indecsi e functionala. Rar folosita, dar posibila. Deci ... un vector de caractere (cu indecsi intre 65 si 122 ... si un vector de valori logice, intre 'H' si 'a' ... adica un vector cu 25 de pozitii). Cum se spune, nimic mai simplu. Avem variabila sir care are 1000 de pozitii si imi permite sa salvez cate un numar pe fiecare dintre aceste pozitii. Singura (posibila) problema este faptul ca nu putem salva decatnumere intregi in acest sir. Elementele unui vector trebuie sa aiba acelasi tip. Nu se pot defini vectori ale caror elemente sa fie fisiere. Modalitatea de accesare a unei anumite pozitii din sir se face scriind numele sirului (sir in cazul acesta) si, intre paranteze drepte, [ si ], indicele (pozitia) din sir care o dorim.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. sir[17] := 2342;In acest fel, fiecare pozitie a vectorului poate fi privita ca o variabila de sine statatoare, scrisa putin mai ciudat. Atentie: Nu confundati pozitia unui element din vector cu valoarea lui. Daca am valorile urmatoare in vector (in ordine): 159, 65, 78, 23, 72, 34 ... atunci elementul de pe pozitia3 are valoarea 78. Atentie maxima, am vazut multe aiureli cauzate de confuzii de acest gen. Alta problema destul de comuna este incercarea de a folosi vectori care ocupa mai mult decat capacitatea de memorie alocata de catre Pascal. Aceste incercari vor determina compilatorul de Borland Pascal 7.0 sa genereze o eroare de compilare cu mesajul "Structure too large". Compilatorul de Borland Pascal 7.0 ofera un spatiu de memorie de maxim 64KB per fisier al programului (momentan, un singur fisier). Exista alte compilatoare care ofera mult mai mult si care, evident, nu dau asemenea erori. Stiind ca un element al unui vector este apelat folosind indexul lui, devine deja clar ca putem folosi bucle pentru lucrul cu vectori. Hai sa vedem cum citim 1000 de numere, folosind vectori si o bucla For (daca nu mai stiti ce e o bucla For, Instructiuni repetitive va mananca ).LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var sir : array [1 .. 1000] of Integer; 3. i, n: Integer;4. begin 5. Write('Dati numarul de valori care doriti sa le introduceti: '); 6. ReadLn(n); 7. 8. For i := 1 To n Do {citim toate elementele de la tastatura ...} 9. begin

10. 11. 12.13. 14.

Write('Dati elementul ', i : 4, ' : '); ReadLn(sir[i]); {... si le salvam in vector} end; ClrScr; {afisam elementele citite de la tastatura}

15. 16.

For i := 1 To n Do Write(sir[i]:8); 17. ReadLn; 18. end.

Pentru amuzament, hai sa dam valorile elementelor din vector in felul urmator: pe o pozitie sa fie valoarea 1, pe urmatoarea sa fie valoarea 0, pe urmatoarea pozitie iar 1, and so on.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var sir : array [1 .. 1000] of Integer; 3. i, n: Integer;4. begin 5. Write('Dati numarul de valori care doriti sa le introduceti: '); 6. ReadLn(n); 7. 8. For i := 1 to n Do {aici se pune 1, 0, 1, 0, 1 ...} 9. sir[i] := i mod 2; {simplu, nu ?} 10. 11. For i := 1 To n Do {afisam elementele} 12. Write(sir[i]:8); 13. ReadLn; 14. end. Cam asta ar fi ce este de explicat la vectorii unidimensionali, acum puneti-va centura de siguranta pentru ... Vectori multidimensionali Care-i problema cu vectorii astia ? De ce nu pot fi toti la fel ? De ce ne trebuie vectori unidimensionali, si bidimensionali, si tridimensionali, si dimensionali intr-o dimensiune pe care nu o pot vizualiza ... ?

Raspunsul e simplu: nu stiu Vectorii unidimensionali, intr-un mod cat se poate de evident, aveau o singura dimensiune, lungime, care era definita de numarul de elemente din ei. Hai sa ne imaginam vectorul unidimensional ca pe o linie din foaia de matematica: un sir de casute, nu ? Fiecare casuta accepta o cifra (sau, daca scrii ca mine, trei ), deci fiecare element e de acelasi tip.

Totusi, foaia de matematica are doua dimensiuni, lungime si latime. E un tabel. Cum definesti un vector unidimensional in asa fel incat sa-l poti folosi ca pe un tabel ? Nu o faci. Folosesti un vector bidimensional, care este chiar un tabel, nu ?

P.S. ca informatie relativ utila, vectorii unidimensionali pot fi folositi ca vectori multidimensionali. Memoria video este vazuta, practic, ca un vector unidimensional, dar noi o vedem bidimensional. Asta va spune ceva ?

Hai sa vedem cum definim un vector bidimensional, fiindca sunt sigur ca nici nu va trece prin capLINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. tabel = array [1.. 10, 1 .. 20] of integer; Asemanator cu vectorii unidimensionali, nu ? Primul set (1 .. 10) determina numarul de linii, iar al doilea numarul de (20 de) coloane. Accesul la elementul de pe o anumita pozitie necesita acum doi indecsi, ceea ce e normal:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. tabel[2, 5] := 124; Codul acesta poate fi citit in felul urmator: elementul de pe linia 2, coloana 5 din matricea denumita "tabel" va lua valoarea 124. Hai sa facem o tabla de sah (de 8x8) si sa o umplem, ca si in exemplul de mai sus, cu 1 si 0.LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var sir : array [1 .. 1000] of Integer; 3. tabla: array [1 .. 8, 1 .. 8] of byte; 4. i,j, n: Integer;5. begin 6. for i := 1 to 8 do 7. for j := 1 to 8 do 8. tabla[i, j] := (i + j) mod 2; 9. 10. for i := 1 to 8 do 11. begin 12. for j := 1 to 8 do 13. write(tabla[i,j]:2); 14. writeln; 15. end; 16. end. Rezultatul acestei bucati de cod poate fi admirat in imaginea urmatoare:

So, cam asta ar fi si cu vectorii bidimensionali (matrice) ... cred ca v-am speriat degeaba sa va dati jos centura de siguranta.

... puteti

Vectorii cu mai mult de 2 dimensiuni se declara la fel (cu modificarile de rigoare), iar elementele din asemenea vectori sunt folositi la fel (din nou, cu modificarile de rigoare). Atentie: Indiferent de numarul de dimensiuni al vectorului, indiferent de numarul de elemente pe care le contine, aveti grija sa nu incercati sa accesati pozitii care nu exista (cum ar fi pozitia 1001 sau 2000 in vectorul cu 1000 de elemente). In cel mai bun caz, valoarea citita de acolo va fi aleatoare. In cel mai rau caz veti primi un AV (access violation pentru necunoscatori) sau vreo eroare de rulare (runtime error). Matrici patratice Matricile patratice sunt acei vectori bidimensionali a caror numar de linii este egal cu numarul de coloane. La acest tip de matrice putem vedea niste lucruri interesante, cum ar fi faptul ca numarul de elemente este egal cu latura2 (clar, nu?) ... sau ca are diagonale. Prin faptul ca are diagonale ma refer ca exista o serie de elemente ale matricii care determina respectivele diagonale. Diagonalele unei matrici patratice sunt denumite: diagonala principala si diagonala secundara. Diagonala principala porneste din coltul din stanga sus si se termina in coltul din dreapta jos. Diagonala secundara incepe in coltul din dreapta sus si se termina in coltul din stanga jos. In urmatoarea imagine puteti vedea rezultatul unui program care identifica elementele celor doua diagonale ale unei matrici patratice de 8x8. Diagonala principala este afisata cu rosu, iar cea secundara cu galben.

Codul programului care a scos acest rezultat este:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var tabla: array [1 .. 8, 1 .. 8] of byte; 3. i, j: Integer;4. begin 5. clrscr; 6. for i := 1 to 8 do 7. for j := 1 to 8 do 8. tabla[i, j] := (i + j + 1) mod 2; 9. 10. for i := 1 to 8 do begin 11. for j := 1 to 8 do 12. begin 13. textcolor(LightGray); 14. 15. if (i = j) then 16. TextColor(LightRed); {diagonala principala} 17. if (i = 8 - j + 1) then 18. TextColor(Yellow); {diagonala secundara} 19. 20. write(tabla[i,j]:2); 21. end; 22. writeln; 23. end; 24. 25. ReadLn; 26. end. Daca ati analizat putin codul, ar trebui sa va fie clar ca un element din matrice face parte din diagonala: principala, daca indecsii au aceeasi valoare (i = j) secundara, daca indecsii se supun formulei urmatoare: i = n - j + 1, unde i, j sunt indecsii de linie, respectiv coloana, iar n este latura matricii patratice. Daca nu ati inteles de ce, luati o foaie si un pix (sau creion sau orice care lasa semne pe hartie) si

verificati formulele Hai sa vedem cum aflam elementele din sectiuni demarcate de diagonale. Aici, cu albastru, elementele de deasupra diagonalei principale.

Codul necesar:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var tabla: array [1 .. 8, 1 .. 8] of byte; 3. i, j: Integer;4. begin 5. clrscr; 6. for i := 1 to 8 do 7. for j := 1 to 8 do 8. tabla[i, j] := (i + j + 1) mod 2; 9. 10. for i := 1 to 8 do begin 11. for j := 1 to 8 do 12. begin 13. textcolor(LightGray); 14. 15. if (i = j) then {diagonala principala} 16. TextColor(LightRed); 17. 18. if (i = 8 - j + 1) then {diagonala secundara} 19. TextColor(Yellow); 20. 21. if (j > i) then {deasupra diagonalei principale} 22. TextColor(LightBlue); 23. 24. write(tabla[i,j]:2); 25. end; 26. writeln; 27. end; 28. 29. ReadLn;

30. end.Dupa cum se vede, elementele de deasupra diagonalei principale au proprietatea ca indexul coloanei (j) este mai mare decat indexul liniei (i). Simplu. Tot cu albastru, elementele de sub cele doua diagonale:

LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt; 2. var tabla: array [1 .. 8, 1 .. 8] of byte; 3. i, j: Integer;4. begin 5. clrscr; 6. for i := 1 to 8 do 7. for j := 1 to 8 do 8. tabla[i, j] := (i + j + 1) mod 2; 9. 10. for i := 1 to 8 do begin 11. for j := 1 to 8 do 12. begin 13. textcolor(LightGray); 14. 15. if (i = j) then {diagonala principala} 16. TextColor(LightRed); 17. 18. if (i = 8 - j + 1) then {diagonala secundara} 19. TextColor(Yellow); 20. 21. if (i > j) and (i > 8 - j + 1) then {sub cele doua diagonale} 22. TextColor(LightBlue); 23. 24. write(tabla[i,j]:2); 25. end; 26. writeln; 27. end; 28. 29. ReadLn; 30. end.

Proprietatea elementelor cu albastru este ca indicele liniei este mai mare decat indicele liniei SI este sub diagonala secundara (adica indexul de linie este mai mare decat numarul de linii, din care scadem indexul coloanei si adunam 1). Restul sectiunilor si subsectiunilor determinate de diagonale le puteti afla si singuri, modificand programele de mai sus.

Subprograme (proceduri si functii)Vi s-a intamplat sa aveti nevoie sa faceti un program si sa fie nevoie sa repetati o secventa de cod in mai multe locuri din program ? Probabil ca da, posibil ca nu. Vi s-a intamplat sa aveti nevoie sa va ordonati codul in alt fel decat insiruirea liniilor una dupa alta, sa zicem ... dupa functionalitate ? Pentru a usura aceste lucruri, Pascal ofera subprogramele: proceduri si functii. Pe scurt, acestea sunt parti de program care pot fi folosite apeland numele lor.

ProceduriSa vedem cum arata o structura generala a unei proceduri:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. procedure nume_procedura [(lista_parametri)];2. 3. CONST 4. (* declaratii de constante *) 5. 6. VAR 7. (* declaratii de variabile *) 8. 9. BEGIN 10. (* instructiuni *) 11. END;

De remarcat ca, spre deosebire de structura unui program, end-ul de la sfarsit este finalizat cu ; (punct si virgula), nu cu . (punct). Lista de parametri este optionala, motiv pentru care este incadrata intre paranteze drepte. Ce inseamna parametri va fi explicat putin mai tarziu. Sa vedem un program obisnuit folosind proceduri. Programul original (fara proceduri) ar fi urmatorul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. var vector : array[1..200] of integer; 2. i, n: integer;3. begin 4. Write('Dati N: '); ReadLn(n); {N = numarul de elemente} 5.

6. 7. 8. 9. 10. 11. 12.13.

i := 1; {*} while (i 0 then 23. Test := Test * X; 24. GotoXY(40, (N - X) * 2 + lin); 25. Write('Fact(', X,') = ', Test); 26. end 27. else 28. begin 29. TextColor(LightRed); 30. WriteLn('X = 1 ' + 31. 'Fact(1) = 1, caz initial !'); 32. TextColor(LightGray); 33. WriteLn(line); 34. Delay(Wait); 35. WriteLn('Functia s-a terminat, revenim din apel ^^^'); 36. Delay(Wait); 37. Fact := 1; 38. Test := 1; 39. end; 40. end; 41. 42.begin 43. test := 0; 44. repeat {verificam daca 1 1 then {nu putem selecta 0 sau mai mic} sel := sel - 1; end; #80: {0 - 80 = codul tastei sageata jos} begin if sel < 7 then {nu putem selecta mai mult de 7} sel := sel + 1; end; else writeln('0 - ', ord(c)); end; clrscr; WriteLn(spaced, WriteLn(spaced, WriteLn(spaced, WriteLn(spaced, WriteLn(spaced, WriteLn(spaced, WriteLn(spaced, WriteLn(#13#10, GotoXY(1, sel); '1. BitCell.info'); '2. a doua optiune'); '3. a treia optiune'); '4. a patra optiune'); '5. a cincea optiune'); '6. a sasea optiune'); '7. a saptea optiune'); 'Press Esc to Exit ...');

55. TextColor(Yellow); TextBackground(Blue); case sel of 1: WriteLn(select, '1. 2: WriteLn(select, '2. 3: WriteLn(select, '3. 4: WriteLn(select, '4. 5: WriteLn(select, '5. 6: WriteLn(select, '6. 7: WriteLn(select, '7. end; TextColor(LightGray); TextBackground(Black);

BitCell.info'); a doua optiune'); a treia optiune'); a patra optiune'); a cincea optiune'); a sasea optiune'); a saptea optiune');

69. 70. {

end; else WriteLn(ord(c));} {comentat pentru a nu afisa codul tastei apasate} 71. end; 72. 73. until (c = #27); {caracterul cu codul ASCII 27 corespunde tastei Esc} 74. {deci folosim tasta Esc pentru a iesi din program} 75. end.

Niste explicatii: uses crt; - este vorba de biblioteca (unit) de functii si proceduri care faciliteaza lucrul in modul text in Pascal. Daca linia asta lipseste nu veti putea folosi o parte din functiile si procedurile de prin program. ClrScr - (clear screen) sterge orice text de pe ecran si readuce culorile de afisare la valorile predefinite. TextColor - seteaza culoarea textului (in modul text). Definita in unitul CRT. TextBackGround - seteaza culoarea fondului (in modul text). Definita in unitul CRT. ReadKey - asteapta apasarea unei taste si returneaza caracterul apasat (nu "prinde" taste gen Ctrl, Shift, CapsLock, etc). Daca tasta are cod extins (tastele functionale, sagetile, etc), atunci va returna 0 si va trebui ca functia ReadKey sa fie apelata din nou pentru a primi codul extins al tastei. GotoXY - seteaza pozitia cursorului de text. Determina locul de pornire pentru urmatoarea afisare. Screenshot-uri din timpul rularii programului:

Lectia 4 (din tutorialele de Pascal)Acesta este un exemplu de program (mic) care arata o parte din potentialul primelor patru tutoriale de Pascal.

Creat si testat doar pe Borland Pascal 7.0, ati fost avertizati Aici e codul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. Program Text_miscator; 2. uses crt; 3. var N, i, start, dif1, dif2: integer; 4. s: String; 5. linii, coloane: array[1 .. 80] of byte; 6. SuntAranjate: Boolean;7. begin 8. ClrScr; 9. S := 'BitCell.info - IT forum - programare si algoritmica, hardware si altele'; 10. N := Length(S); {Length returneaza lungimea sirului de caractere} 11. 12. Randomize; {initializeaza variabila interna RandSeed cu o valoare luata din ora sistemului} 13. {aceasta variabila este variabila de la care porneste generatorul de numere aleatoare} 14.

15. 16. 17.

for i := 1 to n do begin linii[i] := Random(49) + 1; {pozitii random, dar fara ultima linie / coloana} 18. coloane[i] := Random(79) + 1; 19. gotoxy(coloane[i], linii[i]); 20. write(s[i]); 21. end; 22. 23. start := 40 - (N div 2); 24. 25. repeat 26. SuntAranjate := True; 27. for i := 1 to N do 28. begin 29. if (linii[i] 12) or (coloane[i] start + i - 1) then 30. begin 31. {calculam noua pozitie} 32. dif1 := abs(coloane[i] - (start + i - 1)); {abs = functia modul din matematica} 33. dif2 := abs(linii[i] - 12); 34. 35. if ((dif1 = 0) and (dif2 = 0)) or (s[i] = ' ') 36. then Continue {continuam bucla FOR, cu urmatoarea valoare a lui i} 37. else 38. begin 39. GotoXY(coloane[i], linii[i]); {stergem litera din vechea pozitie} 40. TextColor(Black); 41. Write(s[i]); 42. end; 43. SuntAranjate := False; 44. 45. if dif2 > dif1 46. then 47. begin 48. if linii[i] > 12 49. then Dec(linii[i]) 50. else Inc(linii[i]); 51. end 52. else 53. begin 54. if coloane[i] > (start + i - 1) 55. then Dec(coloane[i]) 56. else Inc(coloane[i]); 57. end; 58. 59. {reafisam litera in noua pozitie}

60. 61. 62.63.

GotoXY(coloane[i], linii[i]); TextColor(LightGray); Write(s[i]);

64. 65. 66.

end; end; Delay(50); {acest interval de asteptare poate fi modificat pentru viteza} 67. until SuntAranjate; 68. 69. GotoXY(start, 12); {pe ecran, in modul text, sunt 80 de coloane} 70. Write(S); {asa ca afisam textul de la pozitia 40 minus jumatate din text} 71. ReadLn; 72. end.

Niste explicatii: Randomize - pregateste generatorul de numere random (aleatoare) Random - genereaza un numar random, intre 0 si N - 1. abs - returneaza valoarea absoluta a unui numar. abs(5) = abs(-5) = 5 Inc - creste valoarea variabilei folosite ca parametru cu 1 sau o valoare specificata. Dec - scade valoarea variabilei folosite ca parametru cu 1 sau o valoare specificata. Delay - opreste (pauzeaza) executia programului pentru un numar specificat de milisecunde. Screenshot-uri din timpul rularii programului:

Program exemplu - Star FieldLectia 5 (din tutorialele de Pascal)Acesta este un exemplu de (mic) program care arata o parte din potentialul primelor cinci tutoriale de Pascal postate pana in acest moment.

Creat si testat doar pe Borland Pascal 7.0, deci sa nu va aud Urmeaza codul:LINE NUMBER ON/OFF | EXPAND/CONTRACT | SELECT ALL

1. uses crt, graph; 2. type star = record 3. X, Y, Z: Integer; 4. { pozitia si departarea "stelei" } 5. end;6. 8.

7. const N = 250; {numarul de "stele"} 9. var gd, gm: Integer; {init graphics mode} 10. i, Sx, Sy: integer; 11. stars: array[1 .. N] of star;12.

13.

procedure InitStars; {initializeaza "N" stele : pozitie si departare} 14. var i: Integer; 15. begin 16. Sx := GetMaxX; {numarul de coloane in modul grafic} 17. Sy := GetMaxY; {numarul de linii in modul grafic} 18. 19. Randomize; 20. for i := 1 to N do 21. begin 22. stars[i].X := Random(Sx - 9) + 5; {pozitia} 23. stars[i].Y := Random(Sy - 9) + 5; 24. stars[i].Z := Random(250) + 1; {departarea trebuie sa fie} 25. end; {cat mai aleatorie la inceput} 26. end; 27. 28. procedure MoveStars; 29. var i, X, Y, Z: Integer; 30. color, speed: Byte; 31. pause: Boolean;

32. 33. 34. 35. 36. 37. 38. 39.

begin pause := False; speed := 5; repeat {bucla infinita ... este oprita daca se apasa tasta Escape} if not pause then for i := 1 to N do begin X := round((stars[i].X * 256) / stars[i].Z) + Sx shr 1; {calcularea pozitiei unei stele, in functie de Z (adancime)} 40. Y := round((stars[i].Y * 256) / stars[i].Z) + Sy shr 1; {shr 1 = div 2. Shift pe biti catre dreapta, adica impartire intreaga la 2} 41. SetColor(Black); 42. Rectangle(X, Y, X+1, Y+2); 43. 44. if (X < 2) or (X > Sx - 2) or {daca "steaua" iese din monitor,} 45. (Y < 2) or (Y > Sy - 2) or {ii schimbam pozitia si departarea} 46. (stars[i].Z < 10) then 47. begin 48. stars[i].X := Random(Sx - 9) + 5; 49. stars[i].Y := Random(Sy - 9) + 5; 50. stars[i].Z := Random(20) + 230; {departarea trebuie sa fie maxima} 51. end; 52. Dec(stars[i].Z); 53. 54. X := Round((stars[i].X * 256) / stars[i].Z) + Sx shr 1;{noua coloana a "stelei"} 55. Y := Round((stars[i].Y * 256) / stars[i].Z) + Sy shr 1;{noua linie a "stelei"} 56. 57. case (stars[i].Z div 3) of {cu cat "steaua" e mai departata,} 58. 65: color := DarkGray; {cu atat e mai inchisa la culoare} 59. 35: color := LightGray; 60. 20: color := White; 61. end; 62. 63. SetColor(color); 64. if stars[i].Z > 120 65. then PutPixel(X, Y, color) {cu cat e mai aproape steaua,} 66. else Rectangle(X, Y, X+1, Y+1) {cu atat e mai mare} 67. end; 68. 69. if KeyPressed then 70. begin 71. case UpCase(ReadKey) of

72. 73.iesim}

#27 : Break;

{s-a apasat Escape, asa ca

'P' : pause := not pause; {s-a apasat P, punem pauza sau o scoatem} 74. '+' : if (speed > 1) then {plus - crestem viteza} 75. dec(speed); 76. '-' : if (speed < 80) then {minus - scadem viteza} 77. inc(speed); 78. end; 79. end; 80. 81. Delay(speed); 82. until False; 83. end; 84. 85.begin 86. gd := 0; 87. InitGraph(gd, gm, ''); 88. 89. InitStars; 90. MoveStars; 91. 92. CloseGraph; 93. end.

Functiile si procedurile legate de afisare le voi explica intr-un tutorial separat. Screenshot din timpul rularii programului: