Sunteți pe pagina 1din 202

Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Cuprins volumul I
Teme de specialitate pentru concursuri in informatica si
grade didactice
CONŢINUTUL PROGRAMEI
1. Arhitectura generală a sistemelor de calcul
- prezentare globală………………………………………………………………1
- unitate centrală: componente, funcţii…………………………………………..3
- unitatea de memorie: structură şi funcţii………………………………………..5
- dispozitive periferice……………………………………………………………6
2. Sisteme de operare
- concepte de bază şi caracteristici ale sistemelor de operare (structură, funcţii,
elemente de interfaţă) …………………………………………………………..14
- tipuri de sisteme de operare…………………………………………………….16
- (*) utilizarea unui sistem de operare…………………………………………....19
3. Algoritmi
- noţiunea de algoritm şi caracteristici…………………………………………....23
- structuri fundamentale( secvenţa, decizia, repetiţia) ……………………………25
- reprezentarea algoritmilor…………………………………………………….…31
- algoritmi iterativi şi recursivi……………………………………………………41
- algoritmi elementari: probleme care operează asupra cifrelor unui număr,
divizibilitate, numere prime, algoritmul lui Euclid, şirul lui Fibonacci, calculul unor
sume cu termenul general dat, determinare minim/maxim, metode de ordonare
(metoda bulelor, inserţie, selecţie, numărare), interclasare, metode de căutare
(secvenţială, binară) ………………………………………………………………46
- analiza complexităţii unui algoritm (considerând criteriile de eficienţă duratã de
executare şi spaþiu de memorie utilizat) …………………………………………66
4. Limbaje de programare (Pascal sau C/C++)
- concepte generale (sintaxa unui limbaj de programare, medii de programare)
…………………………………………………………………………………….84
- (*) elementele de bază ale unui limbaj de programare (Pascal sau C, la alegere):
…………………………………………………………………………………….86
vocabularul limbajului, identificatori, constante, tipuri de dată, variabile, operatori,
structura programelor, comentarii, expresii, atribuire. Citirea/scrierea datelor.
Structuri de control (instrucţiunea compusă, structuri alternative şi repetitive)
…………………………………………………………………………………104
- (*) tipuri de date structurate…………………………………………………117
- (*) fişiere; operaţii specifice…………………………………………………131
- (*) subprograme definite de utilizator: proiectarea modulară a rezolvării unei
probleme; declarare, definire şi apel subprograme; mecanismul de transmitere a
informaţiilor prin parametri; variabile globale şi variabile locale, domeniu de
vizibilitate; …………………………………………………………………..140
recursivitate…………………………………………………………………..152
- concepte de bază ale programării orientată pe obiecte (principiile programării
orientată pe obiecte, încapsulare, moştenire, polimorfism, constructori şi destructori,
domeniul de vizibilitate a componentelor unui obiect) ………………………154
5. Metode de programare
- metoda Backtracking: prezentare generală, probleme de generare, oportunitatea
utilizării metodei backtracking; aplicaţii specifice…………………………….163
- metoda Divide et Impera. Descriere şi aplicabilitate. Exemple. Sortarea prin

1
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

interclasare. Sortarea rapidă (quicksort) ……………………………………….….170


- metoda Greedy. Descriere şi aplicabilitate. Exemple şi contraexemple…………184
- algoritmi combinatoriali: generare permutări, aranjamente, combinări, produs
cartezian, submulţimile unei mulţimi, partiţii. ……………………………………176

Recenzie,
Cartea este destinată concursurilor de titularizare si grade didactice din
invatamânt dar si elevilor sau studenţilor din perspectiva examenului de
bacalaureat sau olimpiadelor scolare.Salutăm acest prim volum ,care prin
completarea cu cel de al doilea constituie un suficient material pentru
concursurile scolare.
Referenti ştiintifici:
Prof.univ.dr Ion Vladimirescu Rector ,Universitatea din Craiova
Prof.univ.dr Octavian Dogaru,Universitatea din Timisoara
Prof.univ.dr Udrişte Constantin ,Universitatea PolitehnicaBucuresti

1. Arhitectura generală a sistemelor de calcul


1.1 Prezentare globală

2
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

În prezent, calculatoarele reprezintă un instrument de lucru din ce în ce mai răspândit. Г de aplicaţii este
extrem de cuprinzătoare, calculatoarele fiind folosite în domenii ca: finanţe şi comerţ, rezervări hoteliere şi
aeriene, industrie, cercetare ştiinţifică, medicină, tehnică spaţială, jocuri, industria armamentului, educaţie,
sisteme de comunicaţie, tipografii. Incepând din anii 1950, industria sistemelor de calcul a cunoscut o dezvoltare
rapidă, aceasta accentuându-se în momentul creării circuitelor integrate care au făcut posibilă apariţia
calculatoarelor personale.
Pentru a înţelege mai bine modul de funcţionare şi câteva noţiuni elementare cu privire la calculator ,
unii autori au asemănat calculatoarele cu un ‘’sclav’’. Acest ‘’sclav’’ cunoaşte un limbaj şi poate executa o serie de
acţiuni simple. Dar el nu va executa nici o acţiune fără ca aceasta să-i fie ‘’ordonată’’de operatorul uman, prin
intermediul unor comenzi simple.
Aceste comenzi formează aşa-numitele instrucţiuni , iar totalitatea lor reprezintă setul de instrucţiuni
recunoscute de calculator. Pentru realizarea unei anumite sarcini, operatorul uman trebuie să ‘’programeze’’
sclavul, adică să-i ofere o listă de instrucţiuni, într-o ordine coerentă, care să ducă la îndeplinirea scopului urmărit.
Această succesiune logică şi coerentă de instucţiuni, care să ducă la rezolvarea unei probleme, formează, pentru
un calculator, un program.

La un sistem de calcul se deosebesc mai multe componente de bază:

 structura fizică (hardware) -reprezintă totalitatea echipamentelor


electronice şi mecanice din care este realizat sistemul de calcul;

 sistemul de operare şi programele de aplicaţie (software) -


reprezintă programe (seturi de instrucţiuni) care îi spun
calculatorului ce acţiuni sa execute.

Componentele fizice ale unui sistem de calcul pot fi grupate în unităţi cu funcţii complexe, numite
unităţi funcţionale.

MEMORIA
DISPOZITIVE INTERNĂ DISPOZITIVE
DE DE
INTRARE IEŞIRE

UNITATEA DE
COMANDĂ ŞI
CONTROL

UNITATEA
ARITMETICO-
LOGICĂ
3
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Dispozitive sau unităţi de intrare. Prin intermediul unităţii de intrare se introduc în calculator
informaţii -date (numere, caractere etc. ) sau instrucţiuni (programe). Exemple de astfel de unităţi:

 tastatura;
 mouse (şoarece);
 scanner;
 ş.a.

Prin aceste unităţi, operatorul uman îi “spune” (ordonă) unui calculator ce acţiune trebuie să execute şi,
de asemenea, îi transmite datele pe care sistemul trebuie să le prelucreze. Informaţia introdusă în
calculator ajunge în memoria internă.

 Memoria internă.

Aceasta este o unitate folosită pentru înregistrarea şi păstrarea informaţiei (date, instucţiuni).
Din memorie, informaţia poate fi preluată de alte unităţi funcţionale din calculator. Datorită modului în
care este construită, memoria internă îşi pastrează conţinutul atâta timp cât calculatorul funcţionează.

În momentele în care calculatorul este oprit, memoria internă este ştearsă, adică îşi pierde conţinutul.
Pentru a elimina acest dezavantaj, se folosesc unităţi de memorie externă i, care nu-şi pierd conţinutul
atunci când sistemul de calcul este oprit. Exemple de suporturi de memorie externă:

 discuri magnetice:
 benzi magnetice;
 CD-ROM-uri.

 Unitatea de comandă coordonează funcţionarea celorlalte unităţi funcţionale, pe baza comenzii


sau instrucţiunii transmise calculatorului de către utilizator.

 Unitatea de calcul prelucrează informaţia. Această componentă efectuează operaţii simple,


aritmetice şi logice asupra unor date din memorie. Rezultatele obţinute sunt depuse tot în
memoria internă.

 Unitatea de ieşire are ca rol afişarea ( sau stocarea )


rezultatelor operaţiilor efectuate. Exemple de unităţi de
ieşire:

 display (monitor)
 imprimanta
 plotter.

1.2 Unitate centrală: componente, funcţii


Structura fizica a unui calculator (sch cu 5 elem, descrierea fiecarui element, elem CPU)

Un calculator e compus din 5 elemente:


1. unitate de intrare (mouse, tastatura, scanner)

i
Putem considera că este impropriu spus “memorie externă” deoarece componentele menţionate (disk,
disketă, CD) constituie dispozitive de intrare-ieşire(de pe ele se pot introduce informaţii şi pe ele se pot
depune informaţii: prima operaţie este de intrare, iar cea de-a doua este de ieşire).

4
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

2. unitate de iesire (imprimanta, monitor)


3. unitate centale de prel (cpu)
4. memoria
5. reteaua de comunicatie sau magistrala de comunicatii (bus) care interconecteaza toate
elementele sistemului si conecteaza sistemul cu exteriorul.

Dispozitivele I/O sunt componente care din pdv functional, asigura sch de informatii intre
microprocessor si celelalte elemente din calculator. Se mai numesc si dispozitive periferice.
Dispozitivele periferice de intrare permit utilizatorului sa introduca date, comenzi si programe in
CPU. Cel mai cunoscut disp de intr este tastatura.
Dispozitivele de iesire permit utilizatorului sa vada rezultatele calculelor efect de catre calc sau al
manipularii datelor. Cel mai cunoscut disp de iesire este monitorul.
Unitatea centrala (CPU- central processing unit) - poate fi constituita dintr-un singur cip sau o serie
de cipuri care efectueaza calcule aritmetice si logice si in ac timp controleaza si operatiile altor elemente
din system.
Majoritatea cipurilor cu unitati centrale de prelucrare si a microprocesoarelor sunt compuse din 4
blocuri functionale:
- unit aritmetico-logica – furnizeaza abilitatea de calcul si permite efect operatiilor aritm si logice;
- register – zone de stocare temporara care mentin date, urmaresc instructiuni si pastreaza
locatii de memorie si rezultatele acestor operatii;
- bloc de control – are 3 functii:
o planifica si regleaza operatiile intregului system de calcul;
o decodorul sau de instructii citeste forma datelor si o transforma intr-o activitate cum ar
fi adunarea sau compararea;
o unit de intreruperi indica ordinea in care CPU este utilizata de catre operatii
individuale, stabilind timpul CPU alocat pentru fiecare operatiune.
- magistrala interna – o retea de linii de comunicatii care conecteaza elementele interne ale
microprocesorului si de asemeni conduce la conectori externi care leaga procesul cu alte elem
ale sist de calcul. Cele 3 tipuri de magistrale sunt:
o magistrala de control
o magistrala de adrese
o magistrala de date

Structura hardware a calculatorului 

Componenta hardware a unui calculator este formată din echipamentele fizice în care se asigură
prelucrarea automată a informaţiei şi din echipamentele care asigură comunicarea între utilizator şi
calculator. Ea este formată din următoarele subansamble.

Echipamentele de prelucrarea automată a informaţiei sunt formate din:

   Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;

   Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.

   Unitatea de aritmetică- logică, prin intermediul căreia se execută calculele;

   Unitatea de comandă şi control, prin care se asigură:

      Extragerea instrucţiunilor din memoria internă;

5
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

      Analiza instrucţiunilor;

      Comanda pentru executarea fiecărei operaţii;

      Extragerea datelor de intrare din memoria internă;

      Aranjarea datelor de ieşire în memoria internă.

Echipamentele ce asigură comunicarea dintre utilizator şi calculator sunt formate din:

   Dispozitivele periferice de intrare;

   Dispozitivele periferice de ieşire;

 Interfeţele de intrare / ieşire..

1.3 Unitatea de memorie :structura si functii


Memoria sistemelor de calcul (masurarea informatiei si tipuri de memorie)
Memoria este un circuit care permite stocarea si regasirea informatiei.
Memoria este: - interna – dispozitive si circuite electrice RAM (random acces memory),ROM (care
ramane permaneta)
- externa – care sunt:
i. pe princ magnetic: HDD, FDD (discheta si hard);
ii. pe princ optic: CD, DVD.

   Memoria internă, în care se păstrează programele şi datele cu care se lucrează la un moment
dat;

   Memoria externă, hard- discul în care se păstrează toate programele şi datele de care poate
avea nevoie calculatorul la un moment dat pentru prelucrare. Hard discul este un pachet de
discuri pe care se pot face înregistrări de date şi programe. El este montat în interiorul
calculatorului, şi are o memorie care în zilele noastre poate depăşi 9 Go. In general
calculatoarele au o singură unitate de hard-disc, care este folosită pentru păstrarea
permanentă a programelor, inclusiv a sistemului de operare şi a datelor.

Memoria interna are o viteza de stocare si regasire a informatiei mai mare decit memoria externa.
Memoria externa are o capacitate de stocare a informatiei mai mare decit memoria interna.
Memoria interna e folosita pentru programe si date care sunt utilizate frecvent dar ocupa un volum mai
mic de informatie, iar memoria externa e utilizata pentru programe si date care necesita un volum mare
de informatie si atunci cind sunt utilizate se transfera partial sau integral in memoria interna.

Se utilizeaza ca unitate de masura a capacitatii memoriei octetul (BYTE), care este un cuvint de 8biti
impreuna cu multiplii sai:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB

1.4 Dispozitive periferice


    Cuplarea dispozitivelor periferice. Tipuri de interfeţe    

       Interfaţa ocupă un loc aparte în arhitectura unui sistem de calcul.  Ea poate fi definită ca o
componentă care asigură o conexiune între două elemente, astfel încât acestea să poată lucra împreună.
Componentele electronice care fac ca dispozitivele periferice de intrare-ieşire şi unităţile de memorie
externă să poată comunica cu procesorul sunt interfeţele hardware.  Suportul fizic al comunicării îl

6
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

reprezintă magistralele sistemului. Există o multitudine de dispozitive periferice şi standarde de


magistrală, fapt ce conduce şi la o mare varietate de interfeţe care le deservesc.

      Schema arhitecturală prezentată mai jos cuprinde cele mai uzuale tipuri de interfeţe.

   Tastatura se poate conecta la calculator printr-un port dedicat, utilizând fie mufa de tip DIN,
fie mufa de tip PS/2. În variantele mai noi tastaturile se pot cupla şi prin intermediul porturilor
USB.
    Prin intermediul interfeţei seriale se pot conecta o serie de dispozitive cum sunt mouse-ul,
modem-ul, imprimanta, etc. Cuplarea mouse-ului se face printr-un port dedicat PS/2 sau USB.

7
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

    USB (Universal Serial Bus) este un port serial de mare viteză care suportă până la 127 de
periferice înlănţuite. La un astfel de port se pot cupla dispozitive precum scanner-ul, mouse-
ul, imprimanta, tastatura, unităţi CD-ROM.
    Interfaţa MIDI. Acest tip de interfaţă este utilizat pentru cuplarea tastaturii MIDI sau a
joistick-ului. De obicei portul MIDI este parte componentă a plăcii de sunet.
    Placa de sunet este o interfaţă care permite stocarea sunetelor în format digital şi redarea lor
prin intermediul boxelor. Cuplarea acestei interfeţe se face la magistrale ISA sau PCI.
    Placa video este tipul de interfaţă specifică pentru diverse dispozitive video: monitor,
cameră video, etc. Există plăci video care se pot cupla la magistrale ISA, PCI sau AGP.
    Prin intermediul interfeţei paralele se pot transfera simultan mai mulţi biţi prin fire paralele,
aceasta conducând la creşterea vitezei de transfer faţă de cea obţinută prin interfaţa serială.
Diverse dispozitive se pot conecta la interfaţa paralelă (imprimanta, scanner, CD-ROM, ZIP, 
etc.).
    Gestionarea unităţilor de memorie externă se face prin intermediul controller-elor de discuri.
Controller-ul de dischete constituie interfaţa pentru unitatea de dischetă. Pentru unităţile de
HARD-DISK şi CD-ROM există două tipuri de interfeţe mai uzuale: IDE (EIDE) şi SCSI. 

      Ca element ce se interpune între periferice şi procesor (de fapt între periferice şi chipset, acesta din
urmă fiind "poarta de acces" spre procesor), orice interfaţă dispune de două tipuri de conexiuni:

                - o conexiune cu perifericul;

                - o conexiune pe magistrală.

     Elementele fizice prin care se realizează conexiunea cu perifericele sunt perechile de mufe şi
conectori.

     Din punct de vedere fizic o  parte dintre interfeţe sunt integrate pe placa de bază (interfaţa paralelă,
interfaţa serială, etc), altele se conectează prin intermediul sloturilor (placa video, placa sunet, placă
reţea, etc.). Acestea din urmă se pretează operaţiunii de "up-grade" (înlocuirea unei componente cu o
alta mai performantă). În continuare prezentăm date despre două interfeţe de mare interes: placa video
şi placa de sunet.     

     Placa video   

   Placa video este “mediatorul” între procesorul “sistemului gazdă” şi dispozitivul de


afişare video, ea realizând prelucrarea finală a informaţiei ce trebuie afişată şi generând,
totodată, comenzile de afişare.
    Dacă prelucrarea realizată de placa video se referă la stabilirea dimensiunilor de
afişare, generare de caractere, operaţii pe zone de pixeli, generarea comenzilor de afişare
face trimitere la informaţia de culoare a pixelilor, semnale de sincronizare pe orizontală
şi verticală (HSYNC si VSYNC).
    
  
 
    Componentele de bază,
asociate plăcii video, sunt:
        -memoria video;
        -coprocesorul video;
        -controller-ul de
magistrală;
        -controller-ul de atribute;
        -circuitele de conversie
numeric/analogică
(RAMDAC);
        -generatoarele de tact;

8
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

        -video-Bios-ul;
 
 
   În imaginea de mai jos se pot identifica  componentele  unei placi video (care dispune
de TV, FM Tuner şi realizează şi captură video):
 

           
 
 
            1. -
Coprocesorul
video
            2.Memoria
video
            3. - Video-
Bios-ul
            4. -
Conectorul AGP
            5. -
Conectorul de
extensie video
            6. - Tuner
TV-FM
            7. - Conectorul VGA cu 15 pini
            8. - Video IN
            9. - Audio IN
          10. - Antene TV,FM  

      Caracteristicile plăcii video 

       1.Adresabilitatea de pixel        


- este dată de numărul de pixeli pe care placa video îi poate afişa, într-
un anumit mod video. Adresabilităţile standard sunt  cele din tabelul
de mai jos:
Număr mod video 104h
Adresabilitatea de pixel 1024x768
Număr culori 16
100h 105h
640x400 1024x768
256 256
101h 106h
640x480 1280x1024
256 16
102h 107h
800x600 1280x1024
16 256
103h  
800x600  
256
      2.Adâncimea de culoare         
- numărul de biţi utilizaţi de memoria video pentru exprimarea culorii.
Are implicaţii directe asupra numărului maxim de culori ce pot fi
afişate.
     3.Frecvenţa de pixel            
- este frecvenţa maximă cu care placa video poate transfera
monitorului informaţia necesară afişării pe ecran a unui pixel.
Se calculează cu formula:

9
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

  f = ( 1.33 x X ) x ( 1.05 x Y ) x R
  unde :  X este adresabilitatea de pixel pe orizontală;
            Y este adresabilitatea de pixel pe verticală;
           
    4.Rata de reîmprospătare pe orizontală
         - este frecvenţa de baleiere pe orizontală.  
 
    5.Rata de reîmprospătare pe verticală   
          - este frecvenţa de cadre.

Placa de sunet    
     Placa de sunet este componenta de bază a sistemului audio al calculatorului.
    Cele mai importante caracteristici ale sale sunt:

1.    Frecvenţa de eşantionare şi rezoluţia

     O placă de sunet bună trebuie să permită prelucrarea eşantioanelor pe 32 de biţi


(rezoluţia de 32 de biţi), cu frecvenţa de 44,1 kHz.

2. Capabilitate stereo

    Plăcile de sunet (ca şi amplificatoarele audio analogice) pot fi mono sau stereo.
    O placă stereo produce voci provenind de la două surse diferite. Calitatea audio,
bineânţeles, creşte!

3. Compresia de sunet

    Plăcile de sunet moderne includ şi compresoare de sunet, care realizează compresia
din mers.

4. Conectorii

    Mai toate plăcile de sunet au acelaşi tip de conectori. Conectarea diverselor elemente
ale lanţului audio se face ca în figură:

5. Procesorul de semnale digitale (DSP)

    Dacă placa de sunet conţine şi un procesor de semnal, nu puteţi decât să vă bucuraţi!
Aceste procesoare realizează efecte de spaţialitate, comprimare în timp real, etc.

6. Interfaţa MIDI

    Prezenţa interfeţei MIDI pe placă oferă posibilitatea de cuplare a instrumentelor


muzicale externe.

10
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

  
 
   Cuplarea internă a interfeţelor şi unităţilor de memorie externă 

    
  

Funcţie de standardul de magistrală pentru care a fost proiectată o interfaţă, se diferenţiază şi modul
fizic de conectare al acesteia la respectivul tip de magistrală. 

        Pentru conectarea unităţilor de memorie externă (cele noi având interfaţa integrată în unitate) se
utilizează conectorii, iar pentru placa de sunet, placa video, etc., se folosesc sloturile.   Slotul este un
conector îngust (tip fantă) în care se introduce partea cu terminaţiile de contact electric ale unei cartele
(plăci) electronice.

       Cei mai uzitaţi conectori şi sloturi sunt prezentaţi în pozele de mai jos:

11
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

        Mai trebuie amintit că odată cu creşterea nivelului de miniaturizare există tendinţa ca şi interfeţele
placă video şi placă de sunet să fie integrate constructiv pe placa de bază, fapt ce înlătură necesitatea
cuplării lor prin sloturi sau conectori. Totuşi, utilizatorul are posibilitatea să dezactiveze o astfel de
interfaţă ("on board") şi să-şi conecteze una externă , mai performantă.

Dispozitive periferice de intrare

 Tastatura

Este un dispozitiv de intrare prin intermediul căruia utilizatorul poate să transmită comenzi
calculatorului şi să introducă datele. Comenzile se dau sub forma unui sir de caractere, fiecare caracter
este generat prin acţionarea uneia sau mai multe taste de calculator. Utilizând aceste date se pot
genera:

      Codurile caracterelor: cifrele ( 0,1,…9), literele ( a,A,b,B,… z,Z), semnele speciale: ( $,%, @, !,?,
…), spaţiul ( bara de spaţiu Space);

      Codurile comenzilor: retur de car (Carriage Return), salt la linie nouă (Line Feed sau
Enter), tasta pentru salt tabelar (Tab), etc.;

      Tastele funcţionale : F1, F2,…F12.  

Floppy discul

Toate calculatoarele posedă o unitate de citire a discurilor flexibile (Floppy disc). Capacitatea
discurilor flexibile depinde de tipul discului şi densitatea de înregistrare, din acest punct de vedere sunt:

      Discul cu dublă densitate (DD), cu o capacitate de 720 ko;

12
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

      Discul cu înaltă densitate (HD), cu o capacitate de 1,44 Mo;

      Discul cu foarte înaltă densitate (ED), cu o capacitate de 2,88 Mo.

  Mouse–ul

Mouse-ul (Soarecele), este folosit în acele programe care


realizează pe monitor interfeţe utilizator prin intermediul tehnicii ferestrelor şi a casetelor de dialog (de
exemplu în sistemele de operare Windows 95 sau 98). Cursorul de mouse urmăreşte pe monitor
deplasarea mouse-lui pe masa reală (pad). Cu ajutorul mouse-lui se pot efectua patru operaţii:

      Operaţia de indicare (point);

      Operaţia clic (click) prin care se acţionează scurt un buton al mouse-lui;

      Operaţia dubluclic (double click), prin care se acţionează scurt, de două ori succesiv un
buton al mouse-lui;

      Operaţia de tragere (drag), prin care se deplasează mouse-ul pe masa reală cu un buton
acţionat.

  Compact discul

Discul compact (CD-ROM), este o memorie externă pe un suport optic special de pe care se pot
citi datele înregistrate în unitatea de citire compact disc. Inregistrarea datelor şi programelor pe CD-
ROM se face în fabrică cu o aparatură ce foloseşte laserul. Memoria unui CD-ROM este de ordinul a
sute de Mocteţi.

Scannerul 

Scannerul este un dispozitiv de intrare prin care pot fi citite imaginile grafice (fotografii, desene
tipărite pe hârtie). Imaginea pe care o citeşte scannerul este o suprafaţă formată din puncte, fiecare
punct fiind definit printr-un cod de culoare, şi coordonatele sale.

Scannerul este caracterizat de următoarele elemente:

      Rezoluţia, care reprezintă numărul de puncte pe inci pătrat pe care le poate citi;

      Numărul de culori, reprezintă setul de culori care pot fi codificate de scanner;

      Viteza de scannare, reprezintă viteza cu care un scanner citeşte şi prelucrează o imagine de
mărime standard.

Dispozitive periferice de ieşire

 Monitorul 

Este dispozitivul care permite vizualizarea rapidă a rezultatelor date de calculator. Caracteristicile
unui monitor sunt: claritatea imaginii, numărul de culori afişate, nivelul de radiaţii electromagnetice.
Calitatea este dată de rezoluţie care reprezintă numărul de pixeli ai ecranului, unde un pixel este un
punct de pe ecran. In tabelul de mai jos sunt prezentate principalele tipuri de monitoare:

13
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Tip monitor Rezoluţie Număr de culori


VGA 640 x 480 16
SVGA 800 x 600 256
1024 x 768 256
XGA 1.024 x 768 65.536

  Imprimanta

Este dispozitivul care afişează informaţiile din calculator pe suport de hârtie. Principalele
caracteristici ale unei imprimante sunt viteza de tipărire (în pagini pe minut) şi rezoluţia.

In tabelul de mai jos sunt prezentate principalele tipuri de imprimante:

Tip Caracteristici Domenii de utilizare


imprimantă
Jet de - culori de bună calitate; Uz individual şi
cerneală pentru domenii fără
- preţ scăzut; pretenţii ridicate.

- rezoluţie 300 dpi;

- preţ mediu consumabile.


Laser - culori de foarte bună calitate; Lucrări de foarte
bună calitate.
- preţ ridicat;

- preţ mic consumabile.


Termică - culori de foarte bună calitate; Grafica de foarte
bună calitate.
- preţ ridicat;

- preţ mare consumabile.


Matricială - preţ scăzut; Documente
financiar–contabile.
- rezoluţia funcţie de numărul de ace;

- preţ foarte redus pentru consumabile

Unde dpi – dots per inch. (puncte per inch la pătrat).

2.Sisteme de operare

14
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

2.1 Concepte de baza si caracteristici ale sistemelor de


operare(structură, funcţii,
elemente de interfaţă)
Sistemul de operare este interfaţa intre hardware-ul calculatorului şi utilizator; este alcătuit dintr-o
colecţie de programe care gestionează resursele calculatorului şi controlează întreaga lui activitate.
 
Sistemul de operare asigura in principal următoarele funcţii:
      gestiunea resurselor fizice ale calculatorului şi a dispozitivelor periferice;
      gestiunea operaţiilor de intrare/ieşire;
      gestiunea datelor (fişierelor) pe suportul de memorie externă;
      controlul încărcării în memoria internă, punerii în funcţiune şi încetării activităţii pentru
programele utilizator;
      sesizarea evenimentelor deosebite care apar în timpul execuţiei şi tratarea acestor
evenimente (mesaje de erori şi recomandări de rezolvare);
      asigurarea interfeţei cu utilizatorul, accesul acestuia pentru controlul programului,
examinarea stării sistemului.
  Structură
Componentele sistemului de operare:
      nucleul (kernel);
      interfaţa (shell).
 
Nucleul sistemului de operare conţine programele care gestionează resursele calculatorului şi
controlează activitatea echipamentelor şi a programelor. Primele cinci funcţii menţionate mai sus, sunt
realizate de nucleu.
In continuare sunt prezentate succint funcţiile:
   Gestiunea resurselor fizice (procesorul, memoria internă şi sistemul de intrare/ieşire).
Sistemul de operare ţine cont de volumul de resurse, viteza cu care lucrează fiecare resursă şi
dependenţa funcţională dintre resurse. De exemplu se alocă unui program memorie internă şi
dispozitivul periferic prin care sunt furnizate datele necesare prelucrării.

   Gestiunea operaţiilor de intrare/ieşire la nivel fizic şi logic. La nivel fizic sunt asigurate
operaţiile de intrare/ieşire cu echipamentele periferice prin care se realizează citirea/scrierea
datelor pe suportul de informaţie, acţionându-se direct asupra dispozitivului periferic. Sunt
asigurate operaţiile de intrare/ieşire cu echipamentele periferice la nivel logic. Prin aceste operaţii
se realizează organizarea, accesul, stocarea şi regăsirea datelor pe suportul de informaţie.
Unitatea logica de acces la echipamentele periferice este fişierul.

   Gestiunea datelor (fişierelor) pe suportul de memorie externă. Programe ale sistemului
de operare asigura transferul de date cu echipamentele periferice şi realizează o interfaţă între
programele de aplicaţie şi sistemul de intrare–ieşire. Modulele de program care realizează
transferul de date exista o singură dată în sistem ca şi componente ale sistemului de operare, şi
nu în fiecare program de aplicaţie care utilizează transferuri cu un anumit echipament periferic.

   Sesizarea evenimentelor deosebite care apar în timpul execuţiei şi tratarea acestor
evenimente. In timpul executării unor programe (de aplicaţie sau de sistem) pot să apară
evenimente deosebite ca de exemplu programul solicită: scrierea pe un disc flexibil iar acesta nu
este montat, scrierea la imprimantă iar aceasta nu este conectată sau nu a fost alimentată cu
hârtie, executarea unei operaţii aritmetice iar rezultatul depăşeşte capacitatea zonei de memorie
alocată, etc. Evenimentele sunt sesizate de circuitele de control ale dispozitivelor periferice şi
transmise unor componente a nucleului care tratează aceste evenimente. Pentru a rezolva
aparitia unor stări conflictuale între mai multe evenimente, acestea sunt grupate în clase cărora li
se atribuie priorităţi.

15
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Un sistem de operare e un program de control de tip master, stocat permanent in memorie, care
gestioneaza toate resursele fizice ale sistemului de calcul si interpreteaza acele comenzi ale
utilizatorului care cer diverse tipuri de servicii.

Sistemul de operare este o colecţie de programe care asigură gestionarea tuturor


componentelor calculatorului , precum şi controlarea întregii sale activităţi.
S. O. are două componente de bază: Nucleu şi Interfaţă care definesc structura sa

Nucleul unui S.O. este compus din programele de bază care asigură gestionarea şi
controlarea activităţilor echipamentelor şi programelor.
Elemente de interfaţă
Interfaţa unui S.O. este reprezentată de modalitatea de interacţiune a S.O. cu
utilizatorul. De obicei, interfaţa este reprezentată de un sistem de meniuri (interfaţă grafică)
prin care ne sunt puse la dispoziţie opţiuni de continuare a conversaţiei cu calculatorul.

Sistemul de operare MS-DOS are o interfaţă la nivel de limbaj de comandă, adică


trebuie să scriem fiecare comandă permisă de S.O. Pentru acest S.O. s-au conceput
programe, numite programe utilitare, care oferă prin intermediul unui sistem de meniuri o parte
din comenzile permise de S.O. Unul din aceste utilitare este Norton Commander.

Sistemul de operare Windows are o interfaţă grafică care ne permite să alegem


anumite opţiuni oferite printr-un set de “desene” cu semnificaţii precise.

Există operaţii de bază în conversaţia oricărui om cu calculatorul, cum ar fi: copierea


informaţiilor pe disk sau diskete, vizualizarea conţinutului unei diskete, tipărirea unui
document, ş.a., care necesită câteva cunoştinţe privind organizarea informaţiilor. Aceste
cunoştinţe sunt necesare şi pentru a înţelege comenzile pe care le “pricepe” şi le execută
sistemul de operare utilizat.

Interfaţa sistemului de operare asigură comunicarea între utilizator şi calculator. Prin


intermediul tastaturii sau al mouse-ului, utilizatorul transmite comenzi sau răspunsuri la solicitările
calculatorului iar prin intermediul monitorului, calculatorul transmite utilizatorului mesaje sau întrebări.

Ultima funcţie a sistemului de operare menţionată mai sus este realizată de interfaţa sistemului
de operare.

Interfeţele pot fi realizate utilizând:

      limbaj de comandă;

      sistem de meniuri;

      grafic cu ajutorul simbolurilor (pictogramelor).

Interfaţa realizată printr-un limbaj de comandă. In acest tip de interfaţă utilizatorul transmite
comenzile calculatorului sub forma unui sir de caractere care respectă o anumită sintaxă. Calculatorul
permite utilizatorului să introducă o comandă afişând pe primele poziţii ale liniei curente de pe ecran un
sir de caractere numit prompter. De regulă prompterul este compus din numele unităţii curente de disc,
urmat eventual de numele directorului curent şi terminându-se cu caracterul “>” (ex: C:\LUCRU>).

16
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

De la tastatură (keyboard) utilizatorul introduce comanda care este păstrată în memoria internă
numită “zona de editare a tastaturii”. Se acţionează tasta <Enter>, moment în care comanda este
transferată în zona de memorie internă unde se află programul numit interpretor de comenzi.

Interpretorul analizează comanda, dacă aceasta este corectă, solicită procesorului să o execute
utilizând resursele logice şi fizice, în final se afişează din nou prompterul.

In cazul în care comanda nu a fost corect editată, pe ecran se afişează mesajul “Bad command
or file name”.

Interfaţa realizată printr-un sistem de meniuri

In acest tip de interfaţă utilizatorul transmite comenzile calculatorului prin intermediul unui sistem de
meniuri şi opţiuni de meniu sau poate folosi combinaţia de taste care apare în dreapta numelui opţiunii
cunoscută şi sub numele de scurtătură (shortcut keys).

Acest tip de interfaţă presupune existenta unui interpretor de comenzi care să folosească un
sistem de meniuri sau interpretorul de comenzi să folosească un program care se suprapune peste
interpretorul de comenzi.

Pentru deschiderea meniurilor, declanşarea unei comenzi se realizează prin folosirea tastaturii
(tehnica barei selectoare-dreptunghi evidenţiat pe ecran cu altă culoare sau tehnica literei de
identificare-litera de identificare subliniată) sau mouse-ul.

Cu command.com, un sistem de programe (utilitarul Norton Commander) realizează o


interfaţă cu un sistem de meniuri .

Din punctul de vedere al tratării de sistemul de operare, proprietăţile fişierelor sunt:


   Read Only – R – pentru a preciza că fişierul este protejat la scriere;
   Archive –A- pentru a marca că s-a creat pentru fişier o copie de siguranţă;
   System- S – pentru a preciza că fişierul aparţine sistemului de operare şi deci nu trebuie
folosit în operaţii curente;
   Hidden –H – pentru a preciza că fişierul este ascuns pentru operaţiile cu fişiere şi directoare.

2.2 Tipuri de sisteme de operare


După modul de partajare al procesorului sunt sisteme de operare:

      monoprogramare (monotasking)

      multiprogramare (multitasking)

Sistemele de operare monotasking permit execuţia unui singur program la un moment dat (de
exemplu MS-DOS).

Sistemele de operare multitasking permit execuţia mai multor programe în acelaşi timp (de
exemplu Windows 95, Windows 98).Partajarea procesorului se face printr-o componenta a nucleului
sistemului de operare numita planificatorul de procese. Planificatorul de procese rezolvă cererile
solicitate de programele active încărcate în memoria internă printr-un sistem de priorităţi, partajarea
timpului, etc.

Interfaţa sistemului de operare asigură comunicarea între utilizator şi calculator. Prin


intermediul tastaturii sau al mouse-ului, utilizatorul transmite comenzi sau răspunsuri la solicitările
calculatorului iar prin intermediul monitorului, calculatorul transmite utilizatorului mesaje sau
întrebări.Ultima funcţie a sistemului de operare menţionată mai sus este realizată de interfaţa sistemului
de operare.

17
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Interfeţele pot fi realizate utilizând:

      limbaj de comandă;

      sistem de meniuri;

      grafic cu ajutorul simbolurilor (pictogramelor). 

Interfaţa realizată printr-un limbaj de comandă. In acest tip de interfaţă utilizatorul transmite
comenzile calculatorului sub forma unui sir de caractere care respectă o anumită sintaxă. Calculatorul
permite utilizatorului să introducă o comandă afişând pe primele poziţii ale liniei curente de pe ecran un
sir de caractere numit prompter. De regulă prompterul este compus din numele unităţii curente de disc,
urmat eventual de numele directorului curent şi terminându-se cu caracterul “>” (ex: C:\LUCRU>).

De la tastatură (keyboard) utilizatorul introduce comanda care este păstrată în memoria internă
numită “zona de editare a tastaturii”. Se acţionează tasta <Enter>, moment în care comanda este
transferată în zona de memorie internă unde se află programul numit interpretor de comenzi.

Interpretorul analizează comanda, dacă aceasta este corectă, solicită procesorului să o execute
utilizând resursele logice şi fizice, în final se afişează din nou prompterul.

In cazul în care comanda nu a fost corect editată, pe ecran se afişează mesajul “Bad command
or file name”.

Interfata SO Windows (descriere elemente si rularea aplicatiilor)- multitasking si


multiuser

Elem componente ale interfetei Windows.


Majoritatea comenzilor sau a programelor ce se pot rula in acest mediu de lucru sunt reprezentate cu
ajutorul unor pictograme, care reprezinta mici desene sugestive. Lansarea in executie se realizeaza prin
pozitionarea cursorului mouse-lui pe acesta si executarea unui dublu clik. In afara pictogramelor
interfata Windows dispune si de alte elemente grafice: butoane, casete de dialog, bare de navigare,
meniuri.
Butoanele contin semne grafice sau operatii referitoare la o decizie ce trebuie luata la un
moment dat (OK, Cancel, restart windows, end task, switch to, etc.), act lor fiind determinate de un clik
simplu.
Elemente:
1. fereastra – portiune din ecran de forma dreptunghiulara, bine
determinate, de dimensiuni variabile, care poate contine o anumita aplicatie in lucru, un fisier, una sau
mai multe pictograme ale aplicatiilor. Pe suprafata ecranului pot fi deschisa mai multe ferestre simultan,
fiecare fereastra continind propria aplicatie. Fereastra are mai multe zone importante:
- bara de titlu – in partea de sus, pe care e trecut numele aplicatiei
- bara de meniu
- bara de rulare (navigare) verticala si orizontala
2. utilizarea mouse-ului – exista mai multe moduri de folosire a butonului
sting al mouse-lui pentru efect operatiilor:
- clik-ul simplu – folosit pentru activarea meniurilor si selectarea comenzilor din acestea
si pentru apasarea butoanelor;
- clic-ul dublu – folos pt declansarea executiei unui program sau a unei aplicatii
reprezentate de o pictograma;
- drag (trage) – apasarea butonului din stinga al mouse-lui, mentinerea apasarii
deplasarea mouse-lui si eliberarea butonului – folosit pentru marirea micsorarea unei
ferestre, pentru desenare, etc.
Prin actionarea butonului drept al mouse-lui se acceseaza meniul de comenzi rapide care
contin optiuni variate in functie de zona ecranului in care se face clic. Ac optiuni vor fi referite la
sectiunea de operatii asupra fisierelor.

18
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

3. desktop – la incarcarea windows-ului pe ecran apare zona de lucru numita


desktop. Pe desk se gasesc mai multe pictograme (repr grupuri de programe sau
aplicatii)ce pot fi deschise prin exec unui dublu clik.

Depanare rapida - Gasirea rapida ( in mod automat) a solutiilor la diverse probleme de depanare
a calc si eventual aplicarea acestora prin facilitatea windows

MS-DOS care utilizează un limbaj de comandă şi interpretorul de comenzi command.com.

 Interfaţa realizată printr-un sistem de meniuri. In acest tip de interfaţă utilizatorul transmite comenzile
calculatorului prin intermediul unui sistem de meniuri şi opţiuni de meniu sau poate folosi combinaţia
de taste care apare în dreapta numelui opţiunii cunoscută şi sub numele de scurtătură (shortcut
keys).

Acest tip de interfaţă presupune existenta unui interpretor de comenzi care să folosească un
sistem de meniuri sau interpretorul de comenzi să folosească un program care se suprapune peste
interpretorul de comenzi.

Pentru deschiderea meniurilor, declanşarea unei comenzi se realizează prin folosirea tastaturii
(tehnica barei selectoare-dreptunghi evidenţiat pe ecran cu altă culoare sau tehnica literei de
identificare-litera de identificare subliniată) sau mouse-ul.

Cu command.com, un sistem de programe (utilitarul Norton Commander) realizează o


interfaţă cu un sistem de meniuri .

Interfaţa realizată grafic cu ajutorul simbolurilor (pictogramelor). In acest tip de interfaţă


instrucţiunile se dau calculatorului prin intermediul unor simboluri care sugerează conceptul, de exemplu
o componentă a calculatorului, aplicaţie, parametru, etc. Aceste interfeţe folosesc metoda de trage şi
plasează (drag and drop) prin care obiectele reprezentate prin pictograme pot fi copiate sau mutate.
Utilizatorul trebuie în acest tip de interfaţă să cunoască pictograma care reprezintă aplicaţia.

Sisteme de operare cu interfaţa realizata grafic: Windows NT, Windows 95, Windows 98,
Windows 2000.

Windows NT (New Technology) al cărui principal avantaj îl constituie posibilitatea implementării


lui atât pe PC-uri cu microprocesoare Intel, cât şi pe PC-uri bazate pe microprocesoare RISC (Reduced
Instruction Set Computing), ceea ce îi conferă caracterul unui sistem deschis, condiţie esenţială în lucrul
la nivelul reţelelor de calculatoare.

Windows NT oferă posibilitatea gestionării reţelei şi realizării şi gestionării aplicaţiilor distribuite


(model client/server).

Windows 95 are o interfaţă grafică orientată pe ferestre, care permite utilizatorului lansarea
concomitent a mai multor aplicaţii, fiecare în fereastra ei, precum şi schimbul de informaţii între acestea.

Windows 98 este un mediu complet integrat cu Internetul, constituindu-se ca un suport pentru


noile tehnologii hardware şi păstrând compatibilitatea cu Windows 95, fată de care apare ca o extindere
(upgrade).

Windows 2000 este ultima interfaţă lansată de Microsoft în 1999, de la care se aşteaptă o
compatibilizare a platformelor Windows şi performante superioare.

Incărcarea sistemului de operare în memoria internă a calculatorului

La începutul fiecărei sesiuni de lucru trebuie încărcat în memoria internă nucleul sistemului de
operare (conţine programele necesare gestionării resurselor calculatorului). Sistemul de operare se
livrează pe suport magnetic împreună cu calculatorul (disc sistem). Acest suport conţine un program de

19
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

dimensiuni mici numit încărcător, situat la început de suport, precum şi programele aferente nucleului
sistemului de operare.

In memoria tip ROM există un program numit preîncărcător utilizat pentru iniţializarea lucrului cu
calculatorul.

La pornirea calculatorului, programul preîncărcător iniţializează echipamentele periferice,


identifică configuraţia calculatorului şi caută sistemul de operare pe un suport magnetic, găsindu-l,
încarcă în memoria internă programul încărcător care se găseşte la începutul suportului şi îl lansează
în execuţie.
Un system de operare multiuser este un SO care suporta mai multi utilizatori in ac timp, iar un
SO multitasking este un SO care suporta mai multe executii de programe in acelai timp.

Performanta calculatorului:
- viteza de procesare (Mhz, Ghz);
- nr. de biti prelucrati simultan (64biti).
Posibilitatea indeplinirii mai multor functii simultan – se executa succesiv secvente din fiecare program
aflat in rulare a.i. intr-o per de timp aplicatiile functioneaza aparent simultan.

2.3 Utilizarea unui sistem de operare

Comenzi uzuale ale sistemului de operare MS-DOS-monotasking


 Dir identificator de grup de fişiere sau
dir cale.

Dacă se foloseşte comanda: dir a:/p ,


se va afişa conţinutul disketei, afişarea oprindu-se când ecranul este plin. Continuarea afişării se face la
apăsarea unei taste.
 Md disk\cale\nume
Se crează un nou director, subordonat ultimului director specificat în calea conţinută de comandă.
Cd – schimbă directorul curent
Rd – mută/redenumeşte un fişier sau un subdirector
Copy sursă destinaţie – copiază conţinutul sursei în destinaţia specificată
Format – formatează o disketă. O disketă neformatată nu poate fi folosită pentru copierea informaţiilor
pe ea. Prin operaţia de formatare se pierde tot ce era pe disketă.
Exemple de utilizare a comenzilor uzuale MS-DOS.
Fie suportul magnetic(harddisk-ul) C: , care conţine informaţiile reprezentate în figura de mai
jos:

c:

autoexec.bat config.sys command.com


Ion Dana BP NC

A1 alina.pas axa.pas max.exe text.txt ana.pas xxx.txt nc.exe


BIN USERS
Alex

a.exe … . tp.exe IXA XIC


Ion XB

a.pas b.pas c.pas a.cpp b.cpp c.cpp


a.doc b.doc

20
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Observaţie. De obicei, când dăm o comandă sistemului de operare MS-DOS, în linia de


comandă ne apare mai întâi directorul curent, după care se aşteaptă comanda noastră. Dacă pe
linia de comandă este scris c:\TP\USERS>_ , în dreptul liniuţei de subliniere (cursor) putem să
scriem comanda pe care o dorim. În cazul considerat, directorul curent este USERS. Dacă pe linia
de comandă este scris c:>_ , directorul curent este întregul harddisk C: .

Se cere:
1. Să se copieze subdirectorul Dana pe o disketă.
2. Directorul curent fiind BP, să se copieze fişierul b.cpp conţinut de subdirectorul XIC, pe disketă într-
un subdirector ClsXIC. Să se vizualizeze rezultatul copierii.
Rezolvare.
Cazuri:
 Dacă directorul curent este c: , comanda va fi:

copy C:\Dana A: sau copy C:\Dana A:

comanda sursa destinaţia comanda sursa destinaţia

 Dacă directorul curent este c: \Dana , succesiunea de comenzi va fi:


cd ..
copy Dana A:

Comanda cd .. trece în directorul părinte al subdirectorului Dana, deoarece putem copia din
directorul curent numai ceea ce conţine el (dacă nu mai specificăm calea până la el). Deoarece
discul curent este C: , în comanda a doua putem omite discul sursă, preczând doar ce se copiază
de pe el.

Cazuri:
 Succesiunea de comenzi va fi:
a:
md ClsXIC
copy C:\BP\Users\ XIC\ b.cpp A:\ ClsXIC
dir /p
sau
a:
md ClsXIC
c:
copy BP\Users\ XIC\ b.cpp A: :\ ClsXIC
a:
dir /p
sau
a:
md ClsXIC
copy C:\bP\Users\ XIC\ b.cpp ClsXIC
dir /p

Directoare în sistemul de operare MS-DOS

Directorul (directory) este un catalog, un tabel, un repertoar al discului. In el sunt memorate


informaţii despre fişierele care sunt înregistrate pe disc, astfel că oricare fişier poate fi găsit pe disc.

La formatarea discului sau dischetei se creează directorul rădăcină (Root Director). In acesta
sunt memorate: numele fiecărui fişier cu extensia sa, spaţiul ocupat de acesta pe disc în octeţi, data şi
ora la care a fost creat sau modificat.

21
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Arborele de directoare (tree) este o structură arborescentă de directoare creată în zona de Boot
a discului pornind de la directorul rădăcină.

In construirea arborelui de directoare, se respectă următoarele reguli:

   Un director are un singur director de origine, numit director părinte (parent directory),
situat pe nivelul imediat ierarhic superior. Un director care are un director părinte se mai
numeşte subdirector. Astfel se poate obţine un arbore cu un director şi mai mulţi subdirectori.

   Un director poate avea mai multe directoare copii (child directories). Aceste directoare sunt în
directa lui subordonare şi se găsesc pe nivelul imediat inferior

Organizarea informaţiei pe disk.

Informaţiile se păstrează pe disk sau alt suport magnetic (disketă, CD,…).


Organizarea informaţiilor pe suportul magnetic conduce la regăsirea uşoară a lor.

 Disketele se identifică prin literele A şi B.


 Harddisk-urile şi CD-urile se identifică prin una din literele: C, D, E,…

Pe oricare din suporturile magnetice (A, B, C, D, …), informaţiile sunt grupate în


“directoare” (pentru sistemul de operare MS-DOS).

Un director poate conţine unul sau mai multe subdirectoare şi, eventual, unul sau
mai multe fişiere, ş.a.m.d. Organizarea informaţiilor în subdirectoare se poate observa în
figura următoare:

c:

autoexec.bat config.sys command.com


Ion Dana BP NC

A1 alina.pas axa.pas max.exe text.txt ana.pas xxx.txt nc.exe


BIN USERS
Alex

a.exe … . tp.exe IXA XIC


Ion XB

a.pas b.pas c.pas a.cpp b.cpp c.cpp


a.doc b.doc

 
În capitolul Editare de text, se va arăta că d ocumentele create în Word au un nume, un punct şi extensia
doc. Pe suportul magnetic informaţiile sunt de mai multe feluri, nu numai documente Word, iar aceste informaţii
memorate poartă denumirea de fişiere. Deci documentul Word este şi el un fişier.

22
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Din figura prezentată, se observă că fişierul reprezintă unitatea de informaţii care nu


se mai poate ramifica (este ca un plic închis). Mai multe fişiere pot fi grupate într-un
subdirector.
Mai multe subdirectoare şi fişiere pot fi grupate într-un alt subdirector, ş.a.m.d. Întregul
disk se numeşte directorul rădăcină C: .

Cale (path) reprezintă traseul parcurs pentru a regăsi un director pe suportul


magnetic. Directoarele componente ale căii se separă prin \ (backslash). Dacă dorim
să facem referire la un fişier, atunci calea se termină cu numele fişierului respectiv.

Reguli de descriere a căilor:


 Dacă descrierea căii începe cu directorul rădăcină (întregul suport
magnetic), calea începe cu \
 Dacă descrierea căii începe cu directorul curent, calea nu începe cu \
 Pentru a ne referi la directorul anterior (părinte), se foloseşte : ..
 Pentru a ne referi la directorul curent, se foloseşte : .

Fişierele vor fi regăsite pe suportul magnetic prin intermediul unui identificator


de fişier. Acesta este alcătuit din:
 Numele discului
 Calea prin care se ajunge la fişier
 Numele(obligatoriu) şi extensia fişierului.

Director curent este directorul în care se lucrează la un moment dat.

Exemplu:
a: \my documents\referate\ carol.doc

Suportul magnetic Calea Numele fisierului Extensia fisierului


(unitatea de disketa a: )

Orice comandă dată se termină prin apăsarea tastei Enter.

23
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

3. Algoritmi
3.1 Noţiunea de algoritm şi caracteristici
ALGORITMI. DESCRIEREA ALGORITMILOR

Algoritmi
Orice activitate umană se desfăşoară, în general, pa baza unor principii logice sau, altfel spus,
a unui algoritm bine definit. Deşi nu se conştientizează acest lucru, omul acţionează conform unor
algoritmi, care reprezintă expresia regulilor impuse de parcurgerea logică a etapelor necesare pentru a
ajunge de la o situaţie iniţială la un anumit rezultat.
Funcţionarea calculatoarelor se aseamănă în mare măsură cu activitatea umană. În cazul
acestora, este obligatorie conştientizarea faptului că întreaga activitate a echipamentului de calcul se
bazează pe respectarea unor algoritmi, algoritmi ce sunt elaboraţi de factorul uman dotat cu raţiune şi
capacitate de analiză. Calculatorul nu dispune de calităţile omului, ca atare, în procesul de rezolvare a
unei probleme cu ajutorul echipamentului electronic de calcul este obligatorie parcurgerea unei etape
importante, şi anume elaborarea algoritmului de calcul. Succesul rezolvării problemei depinde de
calitatea algoritmului întocmit de către utilizator şi aplicat de echipamentul de calcul prin intermediul unui
program.
Calculatoarele numerice prelucrează informaţiile prin executarea unor operaţii simple. Deşi operaţiile
sunt elementare, prin înlănţuirea unei mulţimi de operaţii se poate ajunge la prelucrări deosebit de
complexe. Combinarea operaţiilor nu se face la întâmplare, ea supunându-se unor reguli bine
precizate. Studiul acestor reguli are la bază noţiunea de algoritm. Noţiunea de algoritm este strâns
legată de noţiunea de calcul.
Intuitiv un algoritm de calcul este o mulţime finită de operaţiuni cunoscute care executate într-o
ordine bine stabilită, pornind de la un set de valori, numite date de intrare, conduc într-un timp finit la un
set de valori, numite date de ieşire.
Algoritmul reprezintă o mulţime de asemenea calcule. Altfel spus, prin algoritm se înţelege
metoda de rezolvare a unei probleme într-un număr finit de paşi. Metoda de rezolvare este în esenţă un
şir de operaţii precise, care dacă sunt îndeplinite conduc la rezultatul dorit într-un număr finit de paşi.
Se poate spune că un algoritm constituie un sistem de reguli care, aplicat la o clasă de
probleme de acelaşi tip, conduce de la o situaţie iniţială la un rezultat final prin intermediul unor operaţii
succesiv ordonate, unic determinate.
O informaţie iniţială pentru care un algoritm de calcul este aplicabil, se numeşte informaţie admisibilă.
Totalitatea informaţiilor de acest gen constituie domeniul algoritmului.
Cunoscând faptul că orice algoritm conţine un anumit număr de etape numite şi paşii
algoritmului, se poate afirma că regulile algoritmului f aplicate asupra informaţiei iniţiale, care aparţine
domeniului D, determină întotdeauna obţinerea informaţiei finale corespunzătoare. Ca urmare, un
algoritm poate fi definit ca o funcţie:
f = D F unde: D= domeniul algoritmului (informaţiile iniţiale);
F= soluţia finală (informaţiile finale).
În general, un algoritm se caracterizează prin:
 unicitatea. regulile algoritmului determinând unicitatea ordinii în care au loc toate
transformările intermediare, dar şi obţinerea informaţiei finale, după care activitatea
algoritmului se opreşte.
 finalitate. Orice pas al algoritmului trebuie să se termine după un număr finit de paşi, şi
anume atunci când este obţinut rezultatul final, nu cel intermediar. Această proprietate se
mai numeşte şi realizabilitate potenţială.
 claritate (să fie definit). Fiecare pas al algoritmului trebuie să fie precis definit. Operaţiile
ce trebuie efectuate în cadrul fiecărui pas trebuie să fie specificate în mod riguros, precis,
astfel încât să nu apară ambiguităţi în interpretare lui de către cel care îl execută.
Totodată, trebuie riguros precizate toate etapele de calcul ce trebuie urmate pentru a
obţine soluţia finală;
 eficacitate. Orice algoritm trebuie să fie eficace. Aceasta înseamnă că toate operaţiile
algoritmului să poată fi efectuate de un individ cu creion şi hârtie într-un interval de timp
finit.

24
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 generalitate (universal) - adică să permită rezolvarea oricărei probleme dintr-o


anumită clasă de probleme pentru care a fost stabilit.
Ca exemple de algoritmi cunoscuţi din matematică amintim: algoritmul lui Newton pentru aflarea
rădăcinii pătrate aritmetice a unui număr, algoritmul lui Euclid pentru aflarea celui mai mare divizor
comun a două numere etc .

Descrierea algoritmilor.
Transcrierea algoritmului într-un limbaj de programare, în vederea rezolvării lui cu ajutorul
calculatorului numeric poartă numele de program. Programele transmise calculatorului, ca o
reprezentare fidelă a algoritmului de calcul sunt transcrise într-un limbaj “înţeles” de calculator, nu
conţine ambiguităţi şi specifică precis şi clar doar operaţiile pe care calculatorul le poate executa.
Scrierea unui algoritm poate fi făcută rareori direct într-un limbaj de programare. Ca atare
realizarea unui program comportă, uzual nişte etape intermediare.
În vederea întocmirii unui algoritm de calcul şi utilizării acestuia la calculator, este necesară
realizarea următoarelor activităţi:
 definirea problemei;
 formularea modelului matematic al problemei;
 stabilirea algoritmului de rezolvare a problemei;
 reprezentarea algoritmului;
 scrierea programului corespunzător algoritmului, prin utilizarea unui limbaj de programare
adecvat;
 transpunerea programului pe un suport tehnic de memorie;
 testarea, depanarea şi execuţia programului;
 întreţinerea programului.
Calitatea programelor şi succesul execuţiei acestora depinde de calitatea algoritmilor utilizaţi,
de respectarea caracteristicilor specifice pentru orice algoritm, cât şi de mărimile şi operaţiile utilizate în
descrierea algoritmilor.
Exemple

1.Nu orice problemă poate rezolvată algoritmic.


a. Fiind dat un număr n să se determine toţi divizorii săi.
Pentru această problemă se poate scrie un algoritm foarte uşor.

b. Fiind dat un număr n să se determine toţi multiplii săi.


Pentru această problemă nu se poate scrie un algoritm deoarece nu cunoaştem un
criteriu de oprire a operaţiilor.

2.Un algoritm trebuie să funcţioneze pentru orice date de intrare.


Fiind date numerele a, b, c să se afişeze maximul dintre ele.
O posibilă soluţie ar fi:
se compară a cu b şi c şi dacă e mai mare se afişează a, iar apoi
se compară b cu a şi c şi dacă e mai mare se afişează b, iar apoi
se compară c cu b şi a şi dacă e mai mare se afişează c

Algoritmul nu funcţionează dacă 2 valori sunt identice şi de valoare maximă.

25
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

3.2 Structuri fundamentale( secvenţa, decizia, repetiţia)

Conform teoremei de structură, orice algoritm poate fi reprezentat ca o combinaţie a


trei structuri de control:

1. secventa ( succesiune de două sau mai multe atribuiri )

2. Decizia (if...then, sau if…then…else)

3. Ciclul cu test iniţ ial ( while …do…)

Programarea structurată admite şi utilizarea altor structuri de control, cum sunt:


• Selecţia(case… of…);
• ciclul cu test final(repeat…until…);
• ciclul cu contor(for…do…);
Regulile de bază
• 1.Structura oricărui program sau subprogram va fi concepută ca o combinaţie a structurilor de
control admise: secvenţa, decizia , selecţia, ciclul
• 2. structura datelor utilizate în program trebuie să corespundă specificului problemelor
rezolvate.
• 3. Lungimea maximă a unei funcţii sau proceduri este de 50-100 linii. Folosirea variabilelor
globale nu este încurajată.
• 4. Identificatorii folosiţi pentru constante, tipuri, variabile, funcţii, proceduri şi unităţi de program
trebuie să fie cît mai sugestivi.

Mărimile utilizate în cadrul algoritmilor pot fi clasificate astfel:


 după tipul datelor, respectiv din ce mulţime poate lua valori mărimea respectivă:
 date numerice;
 date alfanumerice;
 date logice;
 date calendaristice.
 după natura datelor:
 date constante;
 date variabile.
Operaţiile utilizate în descrierea algoritmilor sunt:
 operaţii de calcul aplicate asupra variabilelor. În cadrul acestora, se utilizează operatorii
aritmetici +, -, , /,* ce corespund operaţiilor de adunare, scădere, înmulţire, împărţire şi
ridicare la putere, care se împart pe trei nivele de prioritate:
 ridicarea la putere - prioritatea maximă;

26
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 înmulţirea şi împărţirea;
 adunarea şi scăderea.
 operaţii de atribuire (x=(a+b)-c);
 operaţii de decizie (relaţionali , , , ,  sau logici , , )
Succesiunea operaţiilor din cadrul unui algoritm poate fi pusă în evidenţă prin intermediul a trei tipuri de
structuri de bază, elementare:
- structura liniară (secvenţială) – presupune executarea necondiţionată a operaţiilor din
cadrul unui algoritm, în ordinea logică a derulării acestora;

START

CITESTE
i
EITES
SUBRUTINA X
TE

PRINT i

STOP

- structura alternativă (de selecţie) necesită punerea în evidenţă a tuturor căilor de


rezolvare a problemei – cu descrierea operaţiilor specifice de realizare pe fiecare
variantă – ce apar ca urmare a existenţei unei condiţii date în cadrul algoritmului.
Pot fi utilizate trei tipuri de structuri alternative:
 Structura alternativă cu selecţie simplă (IF – THEN) – apariţia condiţiei C presupune
existenţa a două căi alternative de parcurgere în continuare a operaţiilor;

- STRUCTURA REPETITIVĂ (CICLICĂ) se bazează pe repetarea unei secvenţe din


algoritm, care poate să cuprindă una sau mai multe operaţii. Există următoarele tipuri de
operaţii repetitive:
- WHILE – DO presupune executarea unei anumite secvenţe din algoritm atâta timp cât
este îndeplinită condiţia C. Deoarece structura este condiţionată anterior, există
posibilitatea ca secvenţa respectivă să nu se execute niciodată.
- DO – UNTIL , condiţionare posterioară, secvenţa din program se execută cel puţin o dată,
întrucât decizia de reluare a secvenţei se ia după executarea acesteia.
- DO – FOR se execută atunci când se cunoaşte de câte ori trebuie repetată o anumită
secvenţă. Ea se caracterizează prin apariţia unei variabile numită contor, care evidenţiază
numărul de repetări a secvenţei.

V=Vi

A
A
C
NU V=V+r
C

DA
A V>Vr

WHILE - DO DO - UNTIL DO - FOR

Exemplu:

27
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Se cere algoritmul şi schema logică pentru calculul lui n!


Paşii algoritmului de calcul sunt :
1. citeşte valoarea lui n;
2. atribuie lui P valoarea 1;
3. atribuie lui I valoarea 1;
4. atribuie lui P valoarea expresiei P * I;
5. atribuie lui I valoarea expresiei I + 1;
6. dacă I<N atunci treci la pasul 4;
7. scrie valoare lui P;
8. stop.
Schema logică corespunzătoare algoritmului:

START

Citeşte
n

p: = 1

i: = 1

p: = p * i

i: = i + 1

i< = n scrie STOP


p

Diagrama arborescentă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.
IN PSEUDOCOD AVEM:
a) Secvenţa – este o structură realizată prin scrierea succesivă (în secvenţă) a comenzilor
componente.
Exemplu: citeşte A,B
atribuie C  A + B
scrie A , B , C
stop
Efectul execuţiei unei comenzi depinde de poziţia comenzii în cadrul secvenţei .
b) Decizia – este o structură care asigură alegerea pentru execuţie a unei secvenţe din două
alternative posibile.
Structura comenzii: dacă condiţie atunci
secvenţa1
altfel
secvenţa 2
[]
Începutul comenzii de decizie este marcat de cuvântul cheie “dacă” iar sfârşitul său de semnul []
Execuţia acestei comenzi comportă următoarele etape:
 se evaluează “ condiţia”;
 dacă rezultatul evaluării este adevărat (condiţie îndeplinită) se execută secvenţa 1;
 în caz contrar se execută secvenţa 2.

28
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

După executarea secvenţei 1 sau a secvenţei 2 se trece la următoarea comandă (cea după
semnul [] )
Observaţie: În cazul în care secvenţa care urmează după cuvântul cheie “altfel” lipseşte, se utilizează
forma simplificată a deciziei:
dacă condiţie atunci
secvenţa1
[]
În cazul în care condiţia nu este îndeplinită se trece direct la comanda ce urmează deciziei
Exemplul:
dacă A > B atunci
scrie A
altfel
scrie B
[]
Efectul execuţiei exemplului de mai sus este următorul:dacă valoarea variabilei A este mai
mare decât a variabilei B se scrie valoarea lui A în caz contrar se scrie valoarea variabilei B şi nu
valoarea variabilei A.
Exemplul: Decsrierea în Pseudocod a algoritmului de aflare a celui mai mare element
din 3 valori reale desemnate prin variabilele a,b,c.Variabila “x” va conţine cel mai mare element din cele
3 valori.Algoritmul de rezolvare a unei probleme nu este unic.Ca atare se dau două descrieri
Pseudocod pentru rezolvarea acestei probleme.
a) varianta 1
citeşte a,b,c
dacă a>b atunci
atribuie x  a
altfel
atribuie x  b
[]

dacă c > x atunci


atribuie x  c
[]
scrie x
stop
b) varianta 2
citeşte a,b,c
atribuie x  a
dacă x < b atunci
atribuie x  b
[]
dacă x < c atunci
atribuie x c
[]
scrie x
stop
O variantă simplificată : citeşte a,b,c,
atribuie x a

29
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

dacă x < b atunci atribuie x  b


dacă x < c atunci atribuie x  c
scrie x
stop
Observaţie: Ultima variantă a algoritmului are avantajul că poate fi uşor generalizată pentru aflarea
maximului unui şir.
c) Selecţia reprezintă o extindere a operaţiei de decizie, ea permitând alegerea unei alternative din
mai multe posibile.Forma generală a comenzii de selecţie este următoarea :
alege expresia dintre
c1 : secvenţa 1

c2 : secvenţa 2

.
.
cn : secvenţa n
rest : secvenţa n+1
[]
Unde c1 , c2 , ... cn sunt etichete şi se folosesc pentru identificarea secvenţelor.Sfârşitul comenzii este
marcat de _[] iar liniile textului selecţiei sunt marcate prin etichetele c.
Modul de execuţie al comenzii de selecţie este următorul:
 se evaluează expresia
 se identifică eticheta ci ce are aceeaşi valoare cu expresia ( în urma evaluării expresiei)şi
este selectată secvenţa corespunzătoare.Dacă nici o etichetă nu are valoarea expresiei
atunci este selectată secvenţa n+1, corespunzătoare etichetei rest.
 se execută secvenţa selecctată şi se sare la sfârşitul comenzii de selecţie adică după
semnul [].
Exemplu: Să se adune valoarea întreagă v la una din variabilele s 0,s1,s2 ,s3, după cum
restul împărţirii valorii v la 4 este 0,1,2 sau 3 .Descrierea în Pseudocod arată astfel:
citeşte v,s0,s1,s2,s3
alege v – int ( v/4)*4 dintre
0: atribuie s0  s0 + v
1: atribuie s1  s1 + v
2: atribuie s2  s2 + v
3: atribuie s3  s3 + v
[]
scrie s0,s1,s2,s3
stop
STRUCTURI REPETITIVE IN PSEUDOCOD
În acest caz , eticheta “rest” şisecvenţa respectivă lipseşte ,deoarece domeniul de valori ale expresiei
este mulţimea (0,1,2,3).
a) Ciclul cu test final – În rezolvarea unei probleme , nu de puţine ori apare situaţia executării
repetate a unei secvenţe de operaţii.O astfel de combinaţie , în care execuţia unui grup de
operaţii se repetă se numeşte ciclu sau iteraţie.Pentru reprezentarea ei se utilizează o comandă
de ciclare care specifică atâtoperaţiile care se repetă cât şi condiţia de repetare.
Forma generală a comenzii de ciclare cu test final este următoarea:
repetă
secvenţa
până condiţia

30
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

[]
Modul de execuţie al comenzii de ciclare este următorul:
1-se execută secvenţa
2-se evaluează condiţia şi dacă rezultatul este fals(condiţie neîndeplinită)se continuă cu etapa 1 , altfel
execuţia comenzii se termină şi se trece la comanda următoare.
Exemplu: Se dă algoritmul lui Euclid pentru afişarea celui mai mare divizor comun a
două numere întregi m,n(m>=n>0).
1. citeşte valorile lui m şi n
2. atribuie lui c valoarea lui n ( în variabila c se reţine cel mai mare divizor
comun )
3. atribuie lui r restul împărţirii întregi a lui m la n
4. dacă r diferit de 0 atunci treci la 7
5. scrie valoarea lui c
6. stop
7. atribuie lui m valoarea lui n
8. atribuie lui n valoarea lui r
9. treci la pasul 2
Se observă că operaţiile care se realizează calculul restului şiactualizarea valorilor c, m şi n se
repetă.
Folosind Descrierea în Pseudocod a algoritmului şi ciclul cu test final vom avea:
citeşte m,n
repetă
atribuie c  n , r  m-int(m/n)*n
atribuie mn , n  r
până r=0
_[]
scrie c
stop
Condiţia de terminare a ciclului poate fi orice expresie logică.Secvenţa de operaţii din ciclu
alcătuieşte corpul ciclului .Ea poate conţine oriceoperaţii, inclusiv iteraţii.
b) Ciclul cu test iniţial – În cazul ciclurilor sau iteraţiilor condiţia de
ciclare poate apare şi la începutul secvenţei de ciclare
Forma generală este :
cât timp condiţia execută
secvenţa
[]
Condiţia poate fi orice expresie logică , iar secvenţa poate conţine orice comenzi , inclusiv
comenzi de ciclare.
Modul de execuţie al ciclului cu test iniţial :
1-se evaluează condiţia;dacă rezultatul este fals(condiţie neîndeplinită) execuţia se termină,iar dacă
rezultatul este adevărat se continuă secvenţa(etapa 2)
2-se execută secvenţa,după care se continuă cu 1.
În cazul în care rezultatul evaluării condiţiei este fals încă de la început,secvenţa nu se
execută niciodată spre deosebire de ciclul cu test final,când secvenţa se executa cel puţin o dată.
Scrierea algoritmului lui Euclid în Pseudocod folosind ciclul cu test iniţial ne conduce la:
citeşte m,n
atribuie c  n , r  m-int(m/n)*n
cât timp r <> 0 execută
atribuie m  n , n  r, c  n
atribuie r  m-int(m/n)*n
[]

31
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

scrie c
stop
c) Ciclul de contor, cu forma generală:
pentru contor = val iniţială, val.finală,pas execută
secvenţa
[]
unde prin contor se înţelege o variabilă cu valori întregi:”valoarea iniţială, finală şi pas” pot fi expresii
aritmetice cu valori întregi.
Execuţia ciclului cu contor se explicitează astfel:
1) variabilei contor i se atribuie valoarea iniţială;
2) se verifică condiţia contor > val. Finală; dacă rezultatul este fals se continuă cu, astfel
execuţia ciclului se termină;
3) se execută secvenţa
4) se modifică valoarea contorului cu pasul p şi se continuă cu pasul 2)
Exemplu: aflarea lui n!
Observaţii: 1. Dacă pasul de ciclare este 1, se poate omite
2. Algoritmul a fost completat şi pentru cazul în care n = 0
citeşte n
atribuie p = 1
dacă n>0 atunci
pentru i=1,n execută
atribuie p=p*i
[]
[]
scrie p
stop

3.3 Reprezentarea algoritmilor


După cum am mai precizat, pentru că noţiunea de algoritm este dată printr-o descriere avem mai întâi
nevoie de metode de reprezentare a algoritmilor.:
1.O primă formă de reprezentare este desigur limbajul obişnuit (natural).
2.O altă formă de reprezentare a algoritmilor este limbajul pseudocod. Limbajul pseudocod,
faţă de limbajul natural, este o formă de reprezentare mai exactă, ajungându-se la nivel de detaliu. Nu
există un limbaj pseudocod standard care să permită reprezentarea algoritmilor, ci în funcţie de
experienţa celor care îl utilizează sau cărora li se adresează, limbajul pseudocod poate avea forme
diferite, influenţate chiar până şi de limbajul în care urmează a fi implementat algoritmul, dacă acest
lucru este imediat posibil.
Dacă un algoritm reprezentat în pseudocod, la un anumit grad de detaliu este o
secvenţă de blocuri, la un grad de detaliu superior, vom constata că parcurgerea
secvenţială este întreruptă prin întâlnirea structurilor alternative care, prin evaluarea
condiţiilor şi stabilirea valorii de adevăr a expresiei booleene asociate acestora, poate
decide care bloc să se execute sau nu, sau mai mult chiar, o structură repetitivă
determină execuţia unui bloc o dată sau de mai multe ori. Până la acest nivel de
detaliu, limbajul natural oferă o formă de reprezentare plastică, uşor de exprimat şi de
reţinut (memorat).
3. O formă grafică, intuitivă, de reprezentare a algoritmilor este schema logică.
Considerată ca prima formă de reprezentare sugestivă a unui algoritm, aceasta s-a
perfecţionat ajungând la un nivel care permite o standardizare acceptabilă. O schemă

32
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

logică are ca părţi constitutive, reprezentări grafice ale operaţiilor şi structurilor


prezentate la definirea unui limbaj pseudocod.

În 1966 s-a demonstrat că orice algoritm (imperativ) poate fi reprezentat


folosind numai structurile de control: secvenţială, alternativă şi repetitivă. Rezultatul
obţinut a condus la apariţia unei noi viziuni de proiectare a algoritmilor, proiectarea
modulară şi structurată.
Orice reprezentare trebuie să reflecte toate etapele, toate operaţiile conţinute de algoritmi, ceea ce
presupune existenţa unor convenţii de reprezentare a acestora. Algoritmii pot fi reprezentaţi grafic cu
ajutorul schemelor logice şi a diagramelor arborescente, iar reprezentarea textuală se efectuează cu
ajutorul limbajelor de tip pseudocod.

Scheme logice
Schemele logice reprezintă scrierea algoritmilor de calcul cu ajutorul unor simboluri (forme)
geometrice, care evidenţiază diferite tipuri de acţiuni.
Realizarea schemei logice corespunzătoare unui algoritm este utilă fie la depanarea
programelor, fie la lucrul în echipă, fie la schimbul de informaţii dintre diverse grupuri de
programatori,întrucât ea specifică precis şi clar ordinea de parcurgere a blocurilor (simbolurilor
geometrice).
Simbolurile uzuale utilizate în realizarea schemelor sunt cuprinse în tabelul de mai jos:

SIMBOL DENUMIREA UTILIZAREA


Uneşte componentele schemei logice, indicând
săgeată
succesiunea operaţiilor
Evidenţiază punctele de intersecţie a săgeţilor
dintre mai multe blocuri dispuse pe aceeaşi
Bloc conector pagină

Evidenţiază continuarea schemei logice pe o altă


Conector de
pagină; se menţionează în locurile de început /
pagină
sfârşit de pagină din cadrul schemei logice
Marchează începutul / sfârşitul schemei logice; în
Bloc terminal interior se menţionează START / STOP, iar în
cazul subrutinelor PRELUCRAE / REVENIRE
Marchează operaţiile de citire a variabilelor supus
Bloc de intrare /
prelucrării şi de scriere a rezultatelor: READ /
ieşire
WRITE sau CITEŞTE / SCRIE preced variabilele
Pune în evidenţă operaţiile de calcul şi atribuire
Bloc de calcul
(ex.: x=y+z, I=0)
Marchează ramificaţii, determinate de condiţia
Bloc de decizie înscrisă în bloc
Bloc de Se utilizeză pentru a marca începutul sau apelul
procedură unei proceduri.
Evidenţiază o subrutină (detalierea unor părţi din
Bloc de
algoritm separat de schema de bază) care
procedură
urmează a fi apelată.

33
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Succesiunea operaţiilor din cadrul unui algoritm poate fi pusă în evidenţă prin intermediul a trei
tipuri de structuri de bază, elementare:
- structura liniară (secvenţială) – presupune executarea necondiţionată a operaţiilor din
cadrul unui algoritm, în ordinea logică a derulării acestora;

START

CITESTE
i
EITES
SUBRUTINA X
TE

PRINT i

STOP

- structura alternativă (de selecţie) necesită punerea în evidenţă a tuturor căilor de


rezolvare a problemei – cu descrierea operaţiilor specifice de realizare pe fiecare
variantă – ce apar ca urmare a existenţei unei condiţii date în cadrul algoritmului.
Pot fi utilizate trei tipuri de structuri alternative:
 Structura alternativă cu selecţie simplă (IF – THEN) – apariţia condiţiei C presupune
existenţa a două căi alternative de parcurgere în continuare a operaţiilor;
 Structura alternativă cu selecţie dublă (IF – THEN - ELSE) – dacă este îndeplinită condiţia
C, se execută operaţiile de pe ramificaţia notată cu DA, altfel se execută alte operaţii, total
diferite, evidenţiate pe ramura notată cu NU;
 Structura alternativă cu selecţie multiplă (CASE – OF) – permite selecţia între mai mult de
două posibilităţi de continuare în rezolvarea problemei.

START START
I
I
CITESTE CITESTEi
I
i DA NU DA I
A2
EITEST EITEST I
E E
A1 A3

PRINT i PRINT i

STOP STOP ii
CASE - OF I

IF - THEEN
- STRUCTURA REPETITIVĂ (CICLICĂ) se bazează pe repetarea unei secvenţe din
algoritm, care poate să cuprindă una sau mai multe operaţii. Există următoarele tipuri de
operaţii repetitive:
- WHILE – DO presupune executarea unei anumite secvenţe din algoritm atâta timp cât
este îndeplinită condiţia C. Deoarece structura este condiţionată anterior, există
posibilitatea ca secvenţa respectivă să nu se execute niciodată.
- DO – UNTIL , condiţionare posterioară, secvenţa din program se execută cel puţin o dată,
întrucât decizia de reluare a secvenţei se ia după executarea acesteia.
- DO – FOR se execută atunci când se cunoaşte de câte ori trebuie repetată o anumită
secvenţă. Ea se caracterizează prin apariţia unei variabile numită contor, care evidenţiază
numărul de repetări a secvenţei.

34
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

V=Vi

A
A
C
NU V=V+r
C

DA
A V>Vr

WHILE - DO
DO - UNTIL DO - FOR

Exemplu:
Se cere algoritmul şi schema logică pentru calculul lui n!
Paşii algoritmului de calcul sunt :
9. citeşte valoarea lui n;
10. atribuie lui P valoarea 1;
11. atribuie lui I valoarea 1;
12. atribuie lui P valoarea expresiei P * I;
13. atribuie lui I valoarea expresiei I + 1;
14. dacă I<N atunci treci la pasul 4;
15. scrie valoare lui P;
16. stop.
Schema logică corespunzătoare algoritmului:

Diagrama arborescentă
Diagrama arborescentă constituie o altă modalitate de reprezentare grafică a algoritmilor. Ca şi
în cazul schemelor logice, există mai multe convenţii de reprezentare a operaţiilor în cadrul algoritmilor.

Limbajul Pseudocod
Spre deosebire de schemele logice, limbajele Pseudocod folosesc cuvinte cu înţeles
prestabilit (numite cuvinte cheie) şi câteva reguli simple de aliniere a textului scris.

35
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Pseudocodul reprezintă un mijloc de exprimare naturală şi dezvoltare sistematică a


algoritmilor.
Pseudocodul are puţine reguli sintactice lăsând programatorului o mare libertarte în
exprimarea acţiunilor algoritmilor.
Pseudocodul permite specificarea algoritmilor prin două tipuri de enunţuri nestandard şi
standard.
Enunţurile nestandard sunt fraze în limbaj natural care pot fi utilizate de programator în
schiţarea formelor iniţiale ale algoritmilor şi sunt precedate de ***. În dezvoltarea algoritmilor, enunţurile
nestandard sunt înlocuite treptat cu enunţuri standard care exprimă operaţii cu corespondente directe
în limbajele de programare.
În forma standard fiecare comandă (operaţie) este reprezentată în limbajul Pseudocod printr-
un cuvânt care exprimă operaţia ce trebuie executată, însoţit de obicei, de elemente suplimentare care
îi particularizează efectul.
Limbajul pseudocod nu este un limbaj de programare, ci o modalitate textuală de reprezentare
a algoritmilor. El poate fi utilizat în locul reprezentărilor grafice, dar faţă de schemele logice este mult
mai puţin utilizat de către programatori.
Construcţia de bază a limbajului pseudocod este propoziţia, un algoritm fiind reprezentat printr-
o succesiune de propoziţii care pot fi:
- propoziţii simple care exprimă operaţii ce pot fi transpuse direct într-un limbaj de
programare;
- propoziţii complexe, notate cu simbolul #, care urmează să fie detaliate ulterior până la
nivelul propoziţiilor simple.
Fiecare propoziţie începe cu un verb care exprimă operaţia descrisă. Un exemplu de algoritm
reprezentat cu ajutorul limbajului pseudocod poate fi următorul:
citeşte var
atribuie var=expr
execută nume_proced
scrie var
stop
unde: var semnifică o variabilă;
expr reprezintă o expresie algebrică sau logică;
nume_proced este numele unei proceduri, care va fi detaliată ulterior.
Pentru a fi puse în evidenţă operaţiile, verbele sunt subliniate.
Cuvântul care identifică operaţia se numeşte cuvânt cheie. Enunţurile standard utilizate în
limbajele Pseudocod şi semnificaţia lor sunt următoarele:
d) operaţia de intrare (citire) - constă în transferul unor valori de pe mediul de intrare (eventual
de pe cartele sau de la un terminal) în locaţii de memorie specificate prin ‘lista de variabile’
Structura comenzii: citeşte lista de variabile
Exemplu: citeşte a,b,c
În locaţiile desemnate prin variabilele a,b,c se transferă valori de pe mediul de intrare.
e) Operaţia de ieşire (scriere) - constă în transferul unor valori din locaţiile de memori specificate
prin ‘lista de variabile’, pe mediul de ieşire (imprimantă, display etc.)
Structura comenzii: scrie lista de variabile
Exemplu: scrie x,a,d,g
Conţinutul locaţiilor de memorie desemnate prin variabilele x,a,d,g este transferat de mediul de
ieşire.
f) Operaţia de atribuire – constă în calculul valorii unei expresii, valoare ce se atribuie unei
variabile.
Structura comenzii: atribuie variabilă  expresie
Exemplu: atribuie D a*b+c
atribuie E  x /\ y \/ z
Variabilelor D,E li se atribuie valorile obţinute în urma calculului valorii expresiilor din dreapta
semnului 
g) Operaţia de oprire – are ca efect oprirea execuţiei comenzilor în calculator
Structura comenzii: stop
h) Secvenţa – este o structură realizată prin scrierea succesivă (în secvenţă) a comenzilor
componente.
Exemplu: citeşte A,B

36
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

atribuie C  A + B
scrie A , B , C
stop
Efectul execuţiei unei comenzi depinde de poziţia comenzii în cadrul secvenţei .
i) Decizia – este o structură care asigură alegerea pentru execuţie a unei secvenţe din două
alternative posibile.
Structura comenzii: dacă condiţie atunci
secvenţa1
altfel
secvenţa 2
[]
Începutul comenzii de decizie este marcat de cuvântul cheie “dacă” iar sfârşitul său de semnul []
Execuţia acestei comenzi comportă următoarele etape:
 se evaluează “ condiţia”;
 dacă rezultatul evaluării este adevărat (condiţie îndeplinită) se execută secvenţa 1;
 în caz contrar se execută secvenţa 2.
După executarea secvenţei 1 sau a secvenţei 2 se trece la următoarea comandă (cea după
semnul [] )
Observaţie: În cazul în care secvenţa care urmează după cuvântul cheie “altfel” lipseşte, se utilizează
forma simplificată a deciziei:
dacă condiţie atunci
secvenţa1
[]
În cazul în care condiţia nu este îndeplinită se trece direct la comanda ce urmează deciziei

Exemplul:
dacă A > B atunci
scrie A
altfel
scrie B
[]
Efectul execuţiei exemplului de mai sus este următorul:dacă valoarea variabilei A este mai
mare decât a variabilei B se scrie valoarea lui A în caz contrar se scrie valoarea variabilei B şi nu
valoarea variabilei A.
Exemplul: Descrierea în Pseudocod a algoritmului de aflare a celui mai mare element
din 3 valori reale desemnate prin variabilele a,b,c.Variabila “x” va conţine cel mai mare element din cele
3 valori.Algoritmul de rezolvare a unei probleme nu este unic.Ca atare se dau două descrieri
Pseudocod pentru rezolvarea acestei probleme.
a) varianta 1
citeşte a,b,c
dacă a>b atunci
atribuie x  a
altfel
atribuie x  b
[]
dacă c > x atunci
atribuie x  c
[]

37
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

scrie x
stop
b) varianta 2
citeşte a,b,c
atribuie x  a
dacă x < b atunci
atribuie x  b
[]
dacă x < c atunci
atribuie x c
[]
scrie x
stop
O variantă simplificată : citeşte a,b,c,
atribuie x a
dacă x < b atunci atribuie x  b
dacă x < c atunci atribuie x  c
scrie x
stop
Observaţie: Ultima variantă a algoritmului are avantajul că poate fi uşor generalizată pentru aflarea
maximului unui şir.
j) Selecţia reprezintă o extindere a operaţiei de decizie, ea permitând alegerea unei alternative din
mai multe posibile.Forma generală a comenzii de selecţie este următoarea :

alege expresia dintre


c1 : secvenţa 1

c2 : secvenţa 2

.
.
cn : secvenţa n
rest : secvenţa n+1
[]

Unde c1 , c2 , ... cn sunt etichete şi se folosesc pentru identificarea secvenţelor.Sfârşitul comenzii este
marcat de _[] iar liniile textului selecţiei sunt marcate prin etichetele c.
Modul de execuţie al comenzii de selecţie este următorul:
 se evaluează expresia
 se identifică eticheta ci ce are aceeaşi valoare cu expresia ( în urma evaluării expresiei)şi
este selectată secvenţa corespunzătoare.Dacă nici o etichetă nu are valoarea expresiei
atunci este selectată secvenţa n+1, corespunzătoare etichetei rest.
 se execută secvenţa selecctată şi se sare la sfârşitul comenzii de selecţie adică după
semnul [].
Exemplu: Să se adune valoarea întreagă v la una din variabilele s 0,s1,s2 ,s3, după cum
restul împărţirii valorii v la 4 este 0,1,2 sau 3 .Descrierea în Pseudocod arată astfel:

38
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

citeşte v,s0,s1,s2,s3
alege v – int ( v/4)*4 dintre
0: atribuie s0  s0 + v
1: atribuie s1  s1 + v
2: atribuie s2  s2 + v
3: atribuie s3  s3 + v
[]
scrie s0,s1,s2,s3
stop
În acest caz , eticheta “rest” şisecvenţa respectivă lipseşte ,deoarece domeniul de valori ale
expresiei este mulţimea (0,1,2,3).
k) Ciclul cu test final – În rezolvarea unei probleme , nu de puţine ori apare situaţia executării
repetate a unei secvenţe de operaţii.O astfel de combinaţie , în care execuţia unui grup de
operaţii se repetă se numeşte ciclu sau iteraţie.Pentru reprezentarea ei se utilizează o comandă
de ciclare care specifică atâtoperaţiile care se repetă cât şi condiţia de repetare.
Forma generală a comenzii de ciclare cu test final este următoarea:

repetă
secvenţa
până condiţia
[]
Modul de execuţie al comenzii de ciclare este următorul:
1-se execută secvenţa
2-se evaluează condiţia şi dacă rezultatul este fals(condiţie neîndeplinită)se continuă cu etapa 1 , altfel
execuţia comenzii se termină şi se trece la comanda următoare.
Exemplu: Se dă algoritmul lui Euclid pentru afişarea celui mai mare divizor comun a
două numere întregi m,n(m>=n>0).
10. citeşte valorile lui m şi n
11. atribuie lui c valoarea lui n ( în variabila c se reţine cel mai mare divizor
comun )
12. atribuie lui r restul împărţirii întregi a lui m la n
13. dacă r diferit de 0 atunci treci la 7
14. scrie valoarea lui c
15. stop
16. atribuie lui m valoarea lui n
17. atribuie lui n valoarea lui r
18. treci la pasul 2
Se observă că operaţiile care se realizează calculul restului şiactualizarea valorilor c, m şi n se
repetă.
Folosind Descrierea în Pseudocod a algoritmului şi ciclul cu test final vom avea:
citeşte m,n
repetă
atribuie c  n , r  m-int(m/n)*n
atribuie mn , n  r
până r=0
_[]
scrie c
stop
Condiţia de terminare a ciclului poate fi orice expresie logică.Secvenţa de operaţii din ciclu
alcătuieşte corpul ciclului .Ea poate conţine oriceoperaţii, inclusiv iteraţii.

39
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

l) Ciclul cu test iniţial – În cazul ciclurilor sau iteraţiilor condiţia de ciclare poate apare şi la
începutul secvenţei de ciclare
Forma generală este :
cât timp condiţia execută
secvenţa
[]
Condiţia poate fi orice expresie logică , iar secvenţa poate conţine orice comenzi , inclusiv
comenzi de ciclare.
Modul de execuţie al ciclului cu test iniţial :
1-se evaluează condiţia;dacă rezultatul este fals(condiţie neîndeplinită) execuţia se termină,iar dacă
rezultatul este adevărat se continuă secvenţa(etapa 2)
2-se execută secvenţa,după care se continuă cu 1.
În cazul în care rezultatul evaluării condiţiei este fals încă de la început,secvenţa nu se
execută niciodată spre deosebire de ciclul cu test final,când secvenţa se executa cel puţin o dată.
Scrierea algoritmului lui Euclid în Pseudocod folosindciclul cu test iniţial ne conduce la:
citeşte m,n
atribuie c  n , r  m-int(m/n)*n
cât timp r <> 0 execută
atribuie m  n , n  r, c  n
atribuie r  m-int(m/n)*n
[]
scrie c
stop
m) Ciclul de contor, cu forma generală:
pentru contor = val iniţială, val.finală,pas execută
secvenţa
[]
unde prin contor se înţelege o variabilă cu valori întregi:”valoarea iniţială, finală şi pas” pot fi expresii
aritmetice cu valori întregi.
Execuţia ciclului cu contor se explicitează astfel:
5) variabilei contor i se atribuie valoarea iniţială;
6) se verifică condiţia contor > val. Finală; dacă rezultatul este fals se continuă cu, astfel
execuţia ciclului se termină;
7) se execută secvenţa
8) se modifică valoarea contorului cu pasul p şi se continuă cu pasul 2)
Exemplu: aflarea lui n!
Observaţii: 1. Dacă pasul de ciclare este 1, se poate omite
2. Algoritmul a fost completat şi pentru cazul în care n = 0
citeşte n
atribuie p = 1
dacă n>0 atunci
pentru i=1,n execută
atribuie p=p*i
[]
[]
scrie p
stop
n) Proceduri şi funcţii
În rezolvarea unor probleme apar frecvent situaţii când un număr decomenzi se repetă
schimbându-se numai variabilele ce compun aceste comenzi,structura comenzilor rămânând aceeaşi.

40
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Pentru a nu repeta acel număr de comenzi în mai multe locuri în cadrul descrierii algoritmului de
rezolvare a problemei se folosesc procedurile şi funcţiile.
Procedura – descrie în termeni generali un algoritm cu posibilitatea de a aplica acel algoritm în
diverse cazuri particulare concrete.
Pentru a se identifica,procedurii i se asociază un nume.La definirea procedurii trebuie să se
asocieze un se de parametri , variabile care specifică mărimile ce se modifică la fiecare apelare a
procedurii.
Structura unei proceduri, în Pseudocod este :
Procedure nume (parametrii) este:
secvenţa
sfârşit
unde:
- nume = numele procedurii
- parametrii = parametrii formali ai procedurii
Apelul unei procedurei specifică numeleprocedurii,precum şi parametrii actuali prin care se
transmit valorile cu care se efectuează comenzile din procedură.
Structura apelului unei proceduri este :
execută nume ( parametrii )
unde : - nume = numele procedurii ce se apelează
- parametrii = parametrii actuali ( efectivi ),adică cei pentru care urmează a se
efectua comenzile din procedură.
Exemplu: Să se construiască o procedură pentru aflarea normei unui vector.Se ştie că
norma unui vector A de n componente se defineşte prin relaţia:

S=

Descrierea în Pseudocod a procedurii este :


Procedura norma (a, n; s) este :
atribuie s  0
pentru i=1,n,1 execută
atribuie s  s + |ai|
[]
sfârşit norma
Numele procedurii este “norma”.Parametrii de intrare necesari pentru a se realiza calculele din
procedură sunt vectorul a şi numărul de elemente ale vectorului n, iar parametrul de ieşire este S,prin
el se obţine rezultatul calculelor- norma . Separarea parametrilor de ieşire de cel de intrare se face prin
punct şi virgulă . Parametrii de intrare şi cei de ieşire specificaţi la definirea procedurii se numesc
parametrii formali.
Exemplu: Să se folosească procedura definită pentru a determina dacă norma vectorului x de l
componente este mai mare decât norma vectorului w de m componente.
Descrierea în Pseudocod a algoritmului de aflare a celei mai mari dintre normele vectorilor x şi
w este următoarea :
citeşte l ,(xi , i = 1, 1)
citeşte m,(xi , i = 1,m)
execută norma (x ,l ; s1)
execută norma (w,m; s2)
dacă s1>s2 atunci
scrie ‘norma vectorului x este mai mare’
altfel
scrie ‘norma vectorului w este mai mare’
[]
stop

41
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

În apelulprocedurii norma , parametrii x,l,s1,respectiv w,m,s2 sunt parametrii actuali.


Comanda “execută” urmată de numele procedurii are ca efect execuţia operaţiilor care
constituie procedura cu numele specificat , în care valorile parametrilor formali sunt înlocuite cu
valorile parametrilor efectivi corespunzători,adică parametrii a,n,s din procedura sunt înlocuiţi cu
x,l,s1 respectiv w,m,s2 din apelul procedurii.
Corespondenţa dintre parametrii efectivi şi parametrii formali este poziţională , adică
parametrul care ocupă poziţia p în lista parametrilor formali este înlocuit cu parametrul care ocupa
poziţia p în lista parametrilor efectivi.Aceasta substituţie se numeşte transferul parametrilor.Comanda “
execută” se termină odată cu terminarea execuţiei ultimei operaţii din procedură.
Funcţia
Atunci când procedura calculează o singură valoare se poate utiliza un tip particular de
procedură numit funcţie.Descrierea unei funcţii cuprinde :
- linia de definire a funcţiei
- secvenţa de operaţii ce constituie corpul funcţiei
- linia finală
Structura unei funcţii în Pseudocod este următoarea :
funcţia nume (parametrii ) este:
secvenţa
sfârşit
unde:
- nume reprezintă numele funcţiei
- parametrii sunt parametrii funcţiei şi trebuie să fie doar parametrii de intrare
Singurul parametru de ieşire în cazul funcţiei este considerat chiar numele funcţiei care este
utilizat în secvenţa de operaţii din corpul funcţiei ca orice parametru. Valoarea acestui parametru
reprezintă valoarea funcţiei.Secvenţa din corpul funcţiei trebuie să conţină o comandă de atribuire prin
care numelui funcţiei i se atribuie o valoare.
Exemplu: Să se definească o procedură pentru calculul lui n!.
Descrierea în pseudoco a funcţiei este :
funcţia fact(m) este :
atribuie p 1
dacă m>1 atunci
pentru i=1,m,1execută
atribuie p p*i
[]
[]
atribuie fact p
sfârşit fact
Apelul unei funcţii este considerat ca operand în cadrul expresiilor .Structura apelului unei funcţii în
Pseudocod este :
nume( parametri )
unde :
- nume -reprezintă numele funcţiei
- parametrii - reprezintă lista parametrilor actuali de intrare ai funcţiei
Exemplu:
Să se folosească funcţia descrisă mai sus pentru calculul combinărilor:

= =

Descrierea în Pseudocod a algoritmului este :


citeşte n,k
atribuie cnk  fact(n)/fact(n-k)*fact(k)
ank  cnk*fact(k)
scrie cnk,ank

42
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

stop
Execuţia unei funcţii intervine atunci când la evaluarea unei expresii este necesară valoarea sa
.În acest caz se face transmisia parametrilor efectivi,se execută secvenţa de operaţii corespunzătoare
corpului funcţiei, găsindu-se astfel valoare funcţiei.
3.4 Algoritmi iterativi si recursivi
IMPLEMENTAREA UNOR ALGORITMI NUMERICI ITERATIV
Să se calculeze valoarea lui PI din următoarea dezvoltare:
luând în considerare n termeni.
a) Descrierea algoritmului în limbaj natural:
Se consideră S valoarea sumeidin dreapta semnului egal,formată
dinînsumarea inverselor numerelor impare cu semne opuse.După
însumarea celor n termeni , valoarea PI se obţine prin înmulţirea lui S cu 4.
b) Descrierea şi semnificaţia structurilor de date folosite:
PI: variabila în care se va calcula valoarea numărului PI
S : variabila în care se păstrează sumele parţiale
T : termenul ce se adaugă
n : numărul de termeni ce se adună
i : contor

c) Descrierea în Pseudocod a algoritmului:


citeşte n {numărul de termeni}
T  - T atribuie S0,T1
pentru i=1,n,1 execută
atribuie S  S + T*(1 / (2*i-1) )
T -T
[]
atribuie PI  4 * S
scrie PI
stop
Variabila T asigură însumarea corectă

43
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

a termenilor cu semne contrare.


d)Programul Pascal
Program calcul_pi;
var
i,n:integer;
s,pi,t:real;
BEGIN{main}
writeln(‘introduceti valoarea lui
n:intreg’);
readln(n);
s:=0;t:=1;
for i:=1 to n do
begin
s:=s + t / (2 * i - 1);
t:= - t ;
end;
pi := 4 * s ;
writeln(‘valoarea lui PI=’,PI:10,8);
END.

IMPLEMENTAREA ALGORITMILOR RECURSIVI


Să se calculeze coeficienţi binomiali în care n şi p sunt întregi pozitivi daţi ( p <= n
), ştiind că există următoarea relaţie de recurenţă :

Descrierea algoritmului în limbaj natural:


Se aplică relaţia de recurenţă pentru calculul coeficienţilor .Valorile calculate se vor afişa
pe măsura calculării lor , ele fiind păstrate pe rând în aceeaşi variabilă C.
Descrierea şi semnificaţia structurilor de date folosite
n,p : valorile înteregi pentru care se calculează combinaţiile
k : contor întreg
c : valoarea în care se calculează ,pe rând, combinările
Descrierea algoritmului în Pseudocod
citeşte n , p
scrie n,p
atribuie c 1
pentru k=1,p,1 execută
atribuie c c* (( n – k + 1 ) / k)
[]
scrie c
stop
Programul Pascal
Program comb;
var n,p,k,c:integer;
BEGIN{main}
write (‘n,p ?’) readln(n,p);
c:=1;
for k:=1 to p do
begin
c:=c*(n-k+1)div k;
writeln(‘combinari
de’,n,’luate

44
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

cate’,k,’=’,c);
end;
END.

Să se calculeze pentru un n dat , toţi termenii şirului lui Fibonacci, cunoscând relaţia de
recurenţă f k = f k-1+ f k-2 , pentru orice k >= 2 şi f0 =0, f1 = 1
a) Descrierea algoritmului în limbaj natural
Relaţia de recurenţă necesită două valori iniţiale f 0 şi f . Această relaţie va fi aplicată de n-2 ori ,
actualizând de fiecare dată pe f k-2 şi f k-1.Deci pentru calculul termenului curent f k sunt suficienţi 2
termeni consecutivi din şir. Vom nota cu “a” termenul f k-2 ,cu “b” f k-1 şi cu “c” termenul f k calculat.
b.) Descrierea algoritmului în pseudocod:
citeşte n
scrie n
{iniţializează primi 2 termeni ai şirului}
atribuie a 0, b 1
scrie a,b {primi doi termeni}
pentru k=3, n, 1 execută
atribuie c a+b {calculează termenul curent}
a b {actualizarea ultimilor doi}
b c {termeni din şir}
scrie c
stop
d.) Programul PASCAL:
program fibonacii;
var
a,b,c,k,n:integer;
BEGIN{main}
write('Introduceti nr. de
termeni:');
readln(n);
a:=0; b:=1;
write(a:3);
for k:=3 to n do
begin
c:=a+b;
a:=b; b:=c;
write(c:3)
end;
END.

Să se calculeze c.m.m.d.c. şi c.m.m.m.c a două numere întregi aplicând algoritmul lui


Euclid.
a.) Descrierea algoritmului în limbaj natural:

45
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Se ştie că c.m.m.m.c a două numere A şi B este egal cu raportul dintre produsul celor două numere
şi c.m.m.d.c. al celor două numere. Ca atare în variabila p se va reţine produsul celor două numere.
Variabila CMMMC va reţine c.m.m.m.c, iar variabila CMMDC va reţine c.m.m.d.c. Conform
algoritmului lui Euclid de aflare a c.m.m.d.c se împarte cel mai mare număr (A) la cel mai mic (B) şi se
calculează restul împărţirii întregi (R). Dacă restul împărţiirii este 0 atunci c.m.m.d.c. este B. În caz
contrar se fac atribuirile: lui A i se atribuie B iar lui B i se atribuie R şi procesul se continuă până R=0.
Dacă la introducerea datelor B>A, se schimbă între ele cele două valori.
Dacă cel mai mic număr este 0 se va tipări mesajul ‘unul dintre numere este 0’ şi nu se va calcula
c.m.m.m.c.
Pentru calculul restului împărţirii se va folosi operatorul PASCAL ,,mod”.
b.) Descrierea şi semnificaţia structurilor de date folosite:
A,B : cele două numere întregi
CMMDC, CMMMC : variabile întregi pentru calculul c.m.m.d.c. şi c.m.m.m.c.
c)Descrierea şi semnificaţia structurilor de date folosite
a,b : cele două numere întregi
cmmdc,cmmmc : variabile xîntregi pt.calculul cmmdc şi cmmmc
p : produsul celor două numere ( pentru calculul cmmmc)
x : variabilă auxiliară
d)Descrierea algoritmului în Pseudocod
citeşte a,b
atribuie p  a * b { reţine produsul numerelor }
dacă a<b atunci
atribuie x  a {schimbă cele două valori între ele}
ab
bx
[]
dacă b<>0 atunci
atribuie r a mod b {restul împărţirii întregi }
cât timp r<>0 execută
atribuie a b {pregăteşte o nouă reluare
a algoritmului }
br
r  a mod b
[]
atribuie cmmdc  b
cmmmc  p / b
scrie cmmmc,cmmdc
altfel
scrie ‘ unul din termeni este zero’
[]
stop
c)Programul Pascal
Program Euclid;
var a,b,x,p,r,cmmdc,cmmmc:integer;
BEGIN{main}

46
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

write(‘introduceţi a si b : integer’);
readln(a,b);
p:=a*b;
if a<b then
begin
x:=a;
a:=b;
b:=x;
end;
if b<>0 then
begin
r:=a mod b;
while r<>0 do
begin
a:=b
b:=r;
r:=a mod b;
end;
cmmdc:=b;
cmmmc:=p div b;
writeln(‘cmmdc=’,cmmdc:8,
’cmmmc=’,cmmmc:9);
end
else writeln(‘unul din termeni este
zero’);
END.
3.5.1 Probleme care opereaza asupra cifrelor unui numar
1)Se citeste un numar natural n.Sa se deosebite din intervalul [a,b].Pentru
cunstruiasca numarul sau. fiecare numar deosebit se va afisa o
singura descompunere.Sa se precizeze
var m,n:word;
begin numarul lor.Un numar natural m este
write('n='); readln(n); deosebit daca exista un numar natural
m:=0; n astfel incat m=n +s(n), unde s(n)
while (n<>0) do begin este suma cifrelor lui n.
m:=m*10+n mod 10; Exemplu:
n:=n div 10;
end;
In intervalul [30,100] sunt 64 numere
write(m); deosebite.}
end. var a,b,m,n,n1,s,nr:word;
2) Se citeste un numar natural n,sa se begin
write('a='); readln(a);
calculeze numarul cifrelor sale. write('b='); readln(b);
ex:123 if b<=a then begin
=>3} writeln('Data incorecta!'); readln; exit; end;
nr:=0;
var n,nr:word; for m:=a to b do
begin for n:=0 to m do begin
write('n='); readln(n); n1:=n; s:=0;
nr:=0; while n1>0 do begin
while (n<>0) do begin inc(s,n1 mod 10);
nr:=nr+1; n1:=n1 div 10; end;
n:=n div 10; if m=n+s then begin
end; inc(nr);
write(nr); write(m,'este un numar deosebit.');
end. writeln(' ',m,'=',n,'+',s);
3) Pentru a, b numere naturale date, if (m-a+1) mod 20=0 then
readln;
0<=a<b, sa se afiseze toate numerele break

47
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end var n,i,s:byte;


end; nr,nr1:integer;
writeln('in intervalul[',a,',',B,'] begin
SUNT',NR,'NUMERE DEOSEBITE'); repeat
readln; write('n='); readln(n);
end. until n>0;
4) Se citeste un numar natural mai mare i:=0;
strict decat 9 avand numar impar de repeat
inc(i); write ('Numarul',i,':');
cifre (validare).Sa se afiseze numarul readln(nr); nr1:=abs(nr);
obtinut prin eliminarea cifrei din repeat
mijloc a numarului initial;. s:=0;
Exemplu: repeat
numarul initial:12345 numarul procesat:1245} inc(s,nr1 mod 10);
var n,n1:0..maxlongint; nr1:=nr1 div 10
cifre,i:byte; until nr1=0;
begin nr1:=s
repeat until nr1<10;
write('Numarul dat:'); readln(n); if not odd(nr1) then
n1:=n; cifre:=0; writeln(nr,'are cifra de baza',nr1)
repeat until i=n; writeln;
inc(cifre); end.
n1:=n1 div 10 6) Sa se calculeze ultima cifra a
until n1=0 numarului a^n, unde a si n sunt numere
until (n>9) and odd(cifre);
i:=0; naturale mai mici ca 10000.
repeat Exemplu:
inc(i); 2^1000 are ultima cifra 6.}
if i<>cifre div 2+1 then var a,n,i,p,r:word;
n1:=n1*10+n mod 10; begin
n:=n div 10 write('a='); readln(a);
until n=0; write('n='); readln(n);
repeat r:=a mod 10; p:=1;
n:=n*10+n1 mod 10; for i:=1 to n do
n1:=n1 div 10 begin
until n1=0; p:=p*r; p:=p mod 10;
writeln('Numarul obtinut:',n); end;
end. writeln('ultima cifra:',p);
5) Pentru un numar intreg nr dat, cifra end.
de control (cifra de baza) se obtine 7) Sa se genereze toate numerele naturale de
patru cifre (abcd), ale caror
astfel: se calculeaza suma cifrelor cifre sunt consecutive (cifra miilor este cea mai
numarului dat, apoi suma cifrelor acestei mica), iar a*d=(bc)/2.Sa se
sume,etc.Operatiile inceteaza cand suma precizeze numarul lor.
obtinuta este o cifra,numita cifra de Observatie:
control (de baza) a numarului dat.Se un singur numar indeplineste conditiile:4567}
var a,b,c,d,n:0..9;
citesc n>0 numere intregi.Sa se afiseze nr:word;
numerele cu cifra de control para. begin
Exemplu: n:=0;
n=8 (-35,567,-11,-56,23,0,65,635) for a:=1 to 6 do
Se vor afisa urmatoarele numere: begin
b:=a+1; c:=b+1; d:=c+1;
-35 are cifra de baza 8; if a*d=(10*b+c) div 2 then begin
-56 are cifra de baza 2; nr:=1000*a+100*b+10*c+d;
65 are cifra de baza 2; write(nr:5); inc(n); end;
-11 are cifra de baza 2; end;
0 are cifra de baza 0; writeln;
writeln(' numar de numere:',n);
535 are cifra de baza 4.} end.

48
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

8) Se citesc de pe mediul standard de end;


intrare doua numere naturale n si m. Sa if ok then writeln('bine ordonat')
else writeln('nu e bine ordonat');
se afiseze cifra de pe pozitia m din end.
numarul n.(cifrele vor fi numerotate de 10) Se dau doua numar natural x si y cu
la cel mult zece cifre.Se cere sa se
dreapta la stanga).Daca nu exista o afiseze suma dintre produsul cifrelor lui
cifra pe pozitia respectiva, se va afisa x si produsul cifrelor lui y.}
0. var
Exemplu: x, y, px, py:longint;
Pentru n=4523, m=2 se va afisa 2, iar pt. begin
n=123 si m=4 se va afisa 0.} write ('x='); readln(x);
var n,m,cifra,k:word; write ('y='); readln(y);
begin px:=1;
write('n='); readln(n); while x<>0 do begin
write('pozitia='); readln(m); px:=px*(x mod 10);
cifra:=0; k:=0; x:=x div 10;
while n<>0 do begin end;
k:=k+1; py:=1;
if k=m then while y<>0 do begin
cifra:=n mod 10; py:=py *(y mod 10);
n:=n div 10; y:=y div 10;
end; end;
writeln('cifra:',cifra); writeln (px+py);
end. readln;
end.
9) Sa se verifice daca numarul natural n
11) Sa se determine cel mai mare numar
este bine ordonat.(n are cifrele fie
care se poate forma cu
in ordine crescatoare, fie in ordine
cifrele unui numar natural citit de la
descrescatoare).ex:123 este
tastatura.}
Solutie; var
Se pune problema in ce ordine are n x,i,c ,nr , ap:longint;
cifrele: crescatoare sau descrescatoare? begin
Ne dam seama de acest lucru comparand writeln('dati numarul ');readln(nr);
ultimele doua cifre ale lui n.Dar daca for c:=9 downto 0 do begin
x:=nr;
aceste sunt egale?Pentru a rezolva ap:=0;
aceasta problema am facut un 'while' ce repeat
elimina ultimele cifre din n. Apoi am if x mod 10=c then inc(ap);
facut o conventie: daca n are cifrele x:=x div 10;
in ordine descrescatoare , t=0, iar daca le until x=0;
for i:=1 to ap do write (c);
are in ordine crescatoare t=1.} end;
var n,c,t,r:word; readln;
ok:boolean; end.
begin
12) Sa se determine cel mai mic nr. nat.
ok:=true;
write('n='); readln(n); care se poate
c:=n mod 10; n:=n div 10; forma cu cifrele unui nr nat. citit de la
while c= n mod 10 do tastatura.}
n:=n div 10; var x,i,c,nr,ap,ap0,w:longint;
if c<n mod 10 then t:=0 begin
else t:=1; writeln('nr=');
r:=n mod 10; n:=n div 10; readln(nr);
while n<>0 do begin w:=0;
c:=r; for c:=0 to 9 do begin
if (c> n mod 10) and (t=0) then ok:=false; x:=nr;
if (c< n mod 10) and (t=1) then ok:=false; ap:=0;
r:=n mod 10; n:=n div 10; ap0:=0;

49
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

repeat for i:=1 to ap0 do write(0);


if x mod 10=c then inc(ap); dec(ap); inc(w); end;
if x mod 10=0 then inc(ap0); for i:=1 to ap do
x:=x div 10; write(c);
until x=0; end;
if(c<>0)and (ap>0)then begin end;
if w=0 then begin end.
write(c);

3.5.2 Divizibilitate
1)Determinaţi toate numerele care sunt indeplinesc simultan conditiile:d<c, b-
multipli de k, care depăşesc valoarea n. c=1, iar b si d sunt divizibile cu 3 .
program multipli2; Sa se precizeze numarul lor.
var k,i,n:longint;
Exemplu:
begin
write('k=');readln(k) Sunt 6 numere:1320, 1650, 1653, 1980,
; 1983, 1986}
write('n=');readln(n) var b,c,d,n:0..9;
; nr:word;
i:=k; begin
while i<=n do n:=0;
begin for b:=3 to 9 do
write(i,' '); for d:=0 to 6 do begin
inc(i,k); c:=b-1;
end; if (d<c) and (b mod 3=0) and (d mod 3=0) then
end. begin
2) Se citesc n numere naturale.Sa se nr:=1000+100*b+10*c+d;
numere cate din ele sunt pare. write(nr:5); inc(n);
end;
end;
var n,i,x,nr_pare:integer; writeln;
begin writeln('sunt',n,'numere');
Write('n='); readln(n); end.
nr_pare:=0;
for i:=1 to n do begin
5) Sa se verifice daca numarul natural n
read(x); este perfect sau nu.( n este perfect
if x mod 2 =0 then daca este egal cu suma divizorilor sai
nr_pare:=nr_pare+1; mai mici ca el).
end; Exemplu:
write(nr_pare);
end.
n=6 este perfect deoarece 6=1+2+3.}
var n,i,s:word;
3) Se citeste un numar natural n Sa se begin
numere divizorii sai (inclusiv 1 si write('n='); readln(n);
el insusi)} s:=0;
for i:=1 to n div 2 do
var n,nr_div,i:integer; if n mod i=0 then s:=s+i;
begin if n=s then
Write('n='); readln(n); writeln('numar perfect')
nr_div:=0; else
for i:=1 to n do writeln('numarul nu este perfect');
if n mod i=0 then end.
nr_div:=nr_div+1;
write(nr_div); 6) Sa se determine cel mai mic numar natural
end. nenul care are exact n divizori
(inclusiv divizorii banali), d>=2 dat.Sa se
4) Sa se genereze toate numerele afiseze acest numar impreuna cu
naturale de patru cifre de forma 1bcd divizorii sai.
care Exemplu:

50
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

d=10 : n=48 for i:=5 to n do


Divizori: 1,2,3,4,6,8,12,16,24,48} if i mod 5=0 then s:=s+i;
var d,nr:byte; writeln('s=',s);
n,i:word; end.
begin 9) Sa se determine cifrele x si y astfel
repeat incat numarul 1x2y sa fie divizibil
write('d='); readln(d)
until d>=2;
cu 3.
n:=2; Solutie:
repeat Daca x si y sunt cifre atunci x,y apartin
nr:=0; multimii{0,1,..,9) cu x<>0.Vom
for i:=1 to n do verifica daca suma 1+x+2+y=3+x+y este
if n mod i=0 then inc(nr); divizibila cu 3}
if nr=d then begin var x,y:byte;
writeln('Cel mai mic numar natural cu begin
exact',d,'divizori este',n); for x:=1 to 9 do
write('Divizorii lui', n,' sunt:'); for y:=0 to 9 do
for i:=1 to n do if (x+y+3) mod 3=0 then
if n mod i=0 then write(i:5); writeln(1,x,2,y);
writeln; end.
break end 9) Se citesc pe rand un numar prim x si n
else inc(n) numere naturale.Fara a inmulti cele
until false; n numere, sa se determine k maxim,
readln pentru care x^k divide produsul celor n
end.
numere.
7) SA se determine descompunerea in
Exemplu:
factori primi a unui numar natural n,
pentru n=4 si x=3 si numerele 23, 36, 4, 6
citit de pe mediul standard de
se va afisa k=3, deoarece 3^3 divide
intrare.Afisarea se va efectua ca in
23*36*4*6}
exemplul var n,x,k,i,nr:word;
urmator. begin
Exemplu: write('n='); readln(n);
pentru n=12 avem: write('nr. prim:'); readln(x);
12|2 k:=0;
for i:=1 to n do begin
6|2 write('nr='); readln(nr);
3|3 while nr mod x=0 do begin
1|-} k:=k+1; nr:=nr div x;
var n,p:word; end;
begin end;
write('n='); read(n); p:=2; writeln('k maxim:',k);
while n>1 do end.
begin 10) Se dau doua n numere naturale
while n mod p=0 do nenule (n<20) .Se cere sa se afiseze
begin
writeln(n,'|',p);
media aritmetica a numerelor pare.
n:=n div p; Daca nu exista numere pare se va afisa
end; mesajul "Nu exista numere pare ".}
p:=p+1; var n,k,s,i,x: longint;
end; begin
writeln(1,'|-'); write ('n='); readln (n);
end. s:=0; k:=0;
8) SA se determine suma numerelor for i:=1 to n do begin write ('dati numarul ',i);
naturale mai mici ca n, divizibile cu 5.} readln (x);
var i,n,s:word; if x mod 2 =0 then
begin begin
write('n='); readln(n); s:=s +x;
s:=0; k:=k+1;
end;

51
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end; d
if k>0 then 6
write (s/k:0:2)
else
d
write (' nu exista numere pare'); 9
readln; n
end. =>3}
11) Se dau doua n numere naturale var a:array[1..20] of integer;n,i,j,di,x,y,t:integer;
nenule (n<40) .Se cere sa se afiseze op:char;
cel mai mare divizor comun.} begin
var n,a,b,d,i,x: longint; writeln(' dati numerele');
begin n:=0;
write ('n='); readln (n); repeat
writeln(' dati primul numar '); write('numar ');n:=n+1;readln(a[n]);
readln(x); write(' mai introduceti d / n ?');read(op);
d:=x; until op='n';
for i:=2 to n do begin writeln(' dati numarul al di:=abs(a[1]);
',i,' lea '); for i:=2 to n do
read(x); begin
a:=d; b:=x; x:=abs(a[i]);
while a<>b do if di>x then begin
if a >b then t:=x;x:=di;di:=t;end;
a:=a-b while x mod di <>0 do
else begin t:=x;x:=di;di:=t mod di;end;end;
b:=b-a; writeln('c m m d c ',di);
d:=a; if di=1 then for i:=1 to n do
end; for j:=i+1 to n do
writeln ; begin
write (' c.m.m.d.c=',d); x:=abs(a[i]);y:=abs(a[j]);
readln; if x>y then begin t:=x;x:=y;y:=t;end;
end. while y mod x <>0 do
begin t:=y;y:=x;x:=t mod x; end;
12) Sa se calculeze cel mai mare divizor if x=1 then writeln('(',a[i],',',a[j],')=1');
comun a unui numar aleator de numere end;
(cu vectori) readln;
ex:3 end.

3.5.2 Numere prime


1) Se citeste un numar natural n.Sa se
verifice daca el este prim.} var n,i,j:integer;
prim:boolean;
var n,i:integer; begin
prim:boolean; write('n='); read(n);
begin for i:=2 to n-1 do
write('n='); readln(n); if n mod i=0 then begin
prim:=true; prim:=true;
for i:=2 to trunc(sqrt(n)) do for j:=2 to trunc(sqrt(i)) do
if n mod i =0 then if i mod j =0 then
prim:=false; prim:=false;
if prim then if prim then write(i);
write('Numarul este prim') end;
else end.
write('Numarul nu este prim'); 3) Sa se afiseze toate numerele prime mai
end. mici sau egale decat n, n>1 dat.
2) Se citeste un numar natural n.Sa se ex:n=10
afiseze divizorii sai primi. =>2 3 5 7}
ex:n=9 var n,i,j:byte;
=>3} prim:boolean;

52
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin begin
write('n='); readln(n); writeln('dati numarul ');
for i:=2 to n do begin readln (x); n1:=x;
prim:=true; repeat
for j:=2 to trunc(sqrt(i)) do inc(n1);
if i mod j=0 then begin ok:=true;
prim:=false; break; end; for i:=2 to trunc(sqrt(n1)) do
if prim then write(i:5); if n1 mod i =0 then ok:=false;
end; until ok;
writeln; n2:=x+1;
end. repeat
4) Sa se afiseze toate numerele naturale x dec(n2); ok:=true;
mai mici decat n,natural, cu for i:=2 to trunc (sqrt(n2)) do
if n2 mod i=0 then ok:=false;
proprietatea ca x-1 si x+1 sunt numere until ok;
prime. if k-n2<n1-x then writeln (n2)
Exemplu: else writeln(n1);
pentru n=15 se vor afisa: 4,6,12.} readln;
var x,y,n,i,k:integer; end.
t:boolean; 6) Se da un numar natural n (0<n<1000000).Se cere
begin sa se afiseze toate
write('n='); readln(n); perechile de numere gemene (a,b), a,b<=n. Perechea
for x:=2 to n-2 do (a,b) este o
begin pereche de numere gemene daca a si b sunt prime si
k:=0; valoarea absoluta a
t:=true; diferenteia-b este 2.}
for i:=2 to trunc(sqrt(x)) do var
if x mod i=0 then t:=false; i,j,n,l:integer;
if t then k:=k+1; bec: boolean;
y:=x+2; t:=true; begin
for i:=2 to trunc(sqrt(y)) do write ('n='); readln(n);
if y mod i=0 then t:=false; for i:=2 to n-2 do begin bec:=true;
if t then k:=k+1; for j:=2 to trunc(sqrt(i)) do
if k=2 then write (x+1,' '); if i mod j=0 then bec:= false;
end; if bec then begin
end. l:=trunc (sqrt(i+2));
5) Se citeste un numar natural de cel for j:=2 to l do
if (i+2) mod j=0 then
mult 8 cifre. Sa se afiseze cel bec:=false;
mai apropiat numar prim fata de if bec then write ('(',i,',',i+2,') ');end;
acesta.} end;
VAR x,i,k,n1,n2: longint; readln;
ok: boolean; end.
7) Dându-se un număr întreg N, să se afişeze toţi factorii primi ai acestuia precum şi
ordinele lor de multiplicitate.
a) Descrierea algoritmului în Pseudocod
O primă formă arată astfel:
citeşte n
scrie n
atribuie d 2
cât timp *n mai admite divizori execută
* determină multiplicitatea eventualului divizor şi extrage d din n
dacă *d a fost divizor atunci
afişează d şi ordinul de multiplicare
[]
trecere la următorul d

53
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

[]
stop
Acţiunea “*determină multiplicitatea eventualului divizor d şi îl extrage pe d din n” are un
caracter ciclic, necunoscându-se numărul de repetări ale ciclului.Această acţiune se poate realiza în
Pseudocod astfel:

atribuie m  0 {ordinul de multiplicitate}


cât timp *n estedivizibil cu d execută
*extrage d din n
atribuie m  m+1
[]
Deoarece divizorii se caută printre numerele 2,3,5,7.... acţiunea”*trecere la următorul d” se
realizează în Pseudocod astfel :
dacă d=2 atunci
atribuie d  3
altfel
atribuie d  d + 2
[]

Cu aceste observaţii algoritmul rafinat arată astfel:

citeşte n startSTART
atribuie d  2
cât timp d<=(sqrt(n+0.5)) execută Citeste
atribuie m0 n
cât timp n mod d =0 execută
d := 2
atribuie n  n div d
mm+1 DA
d<=(sqrt(n+0.5))
[]
dacă m>0 atunci m:=0
scrie d , m
[] n mod d :=0
dacă d = 2 atunci
atribuie d  3 n :=n divd
altfel m := m + 1
atribuie d  d + 2 NU
NU DA
[] m>0
[]
Scrie d,m
dacă n > 1 atunci
scrie n
NU DA
[] d: = 2
n>1
stop
d := 3 d:= d + 2

Scrie n

54
STOP
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

d)Programul Pascal
Program divizorii ;{descompunere în factori primi}
var n,d,m:integer;
BEGIN{main}
write (‘introduceti n:integer’);
readln(n);
writeln(n:4,’are urmatorii factori primi’);
writeln(‘factor’,’‘:5,’multiplicitate’);
d:=2;{cel mai mic numar prim}
while d<= trunc(sqrt(n+0.5)) do
begin
m:=0;
while(n mod d)= 0 do
begin
n:=n div d;
m:=m+1;
end;
if m>0 then
writeln(d:5,’ ‘:9,m:2);
if d = 2 then d:=3
else d:=d+2;
end;
if n>1 then writeln(n:5,’ ‘:10,’1’);
END.
3.5.3 Algoritmul lui Euclid
1)Să se calculeze c.m.m.d.c. şi c.m.m.m.c a două numere întregi aplicând algoritmul lui
Euclid.
a.) Descrierea algoritmului în limbaj natural:
Se ştie că c.m.m.m.c a două numere A şi B este egal cu raportul dintre produsul celor două numere
şi c.m.m.d.c. al celor două numere. Ca atare în variabila p se va reţine produsul celor două numere.
Variabila CMMMC va reţine c.m.m.m.c, iar variabila CMMDC va reţine c.m.m.d.c. Conform
algoritmului lui Euclid de aflare a c.m.m.d.c se împarte cel mai mare număr (A) la cel mai mic (B) şi se
calculează restul împărţirii întregi (R). Dacă restul împărţiirii este 0 atunci c.m.m.d.c. este B. În caz
contrar se fac atribuirile: lui A i se atribuie B iar lui B i se atribuie R şi procesul se continuă până R=0.
Dacă la introducerea datelor B>A, se schimbă între ele cele două valori.
Dacă cel mai mic număr este 0 se va tipări mesajul ‘unul dintre numere este 0’ şi nu se va calcula
c.m.m.m.c.
Pentru calculul restului împărţirii se va folosi operatorul PASCAL ,,mod”.
b.) Descrierea şi semnificaţia structurilor de date folosite:
A,B : cele două numere întregi
CMMDC, CMMMC : variabile întregi pentru calculul c.m.m.d.c. şi c.m.m.m.c.
c)Descrierea şi semnificaţia structurilor de date folosite
a,b : cele două numere întregi
cmmdc,cmmmc : variabile xîntregi pt.calculul cmmdc şi cmmmc
p : produsul celor două numere ( pentru calculul cmmmc)
x : variabilă auxiliară
d)Descrierea algoritmului în Pseudocod

55
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

citeşte a,b
atribuie p  a * b { reţine produsul numerelor }
dacă a<b atunci
atribuie x  a {schimbă cele două valori între ele}
ab
bx
[]

dacă b<>0 atunci


atribuie r a mod b {restul împărţirii întregi }
cât timp r<>0 execută
atribuie a b {pregăteşte o nouă reluare
a algoritmului }
br
r  a mod b
[]
atribuie cmmdc  b
cmmmc  p / b
scrie cmmmc,cmmdc
altfel
scrie ‘ unul din termeni este zero’
[]
stop
c)Programul Pascal
Program Euclid;
var a,b,x,p,r,cmmdc,cmmmc:integer;
BEGIN{main}
write(‘introduceţi a si b : integer’);
readln(a,b);
p:=a*b;
if a<b then
begin
x:=a;
a:=b;
b:=x;
end;
if b<>0 then
begin
r:=a mod b;
while r<>0 do
begin
a:=b
b:=r;
r:=a mod b;
end;
cmmdc:=b;
cmmmc:=p div b;

56
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln(‘cmmdc=’,cmmdc:8,
’cmmmc=’,cmmmc:9);
end
else writeln(‘unul din termeni este
zero’);
END.

3.5.4 Sirul lui Fibonacci


1)Să se calculeze pentru un n dat , toţi termenii şirului lui Fibonacci, cunoscând
relaţia de recurenţă f k = f k-1+ f k-2 , pentru orice k >= 2 şi f0 =0, f1 = 1
b) Descrierea algoritmului în limbaj natural
Relaţia de recurenţă necesită două valori iniţiale f 0 şi f . Această relaţie va fi aplicată de n-2 ori ,
actualizând de fiecare dată pe f k-2 şi f k-1.Deci pentru calculul termenului curent f k sunt suficienţi 2
termeni consecutivi din şir. Vom nota cu “a” termenul f k-2 ,cu “b” f k-1 şi cu “c” termenul f k calculat.
b.) Descrierea algoritmului în pseudocod:
citeşte n
scrie n
{iniţializează primi 2 termeni ai şirului}
atribuie a 0, b 1
scrie a,b {primi doi termeni}
pentru k=3, n, 1 execută
atribuie c a+b {calculează termenul curent}
a b {actualizarea ultimilor doi}
b c {termeni din şir}
scrie c
stop
d.) Programul PASCAL:
program fibonacii;
var
a,b,c,k,n:integer;
BEGIN{main}
write('Introduceti nr. de
termeni:');
readln(n);
a:=0; b:=1;
write(a:3);
for k:=3 to n do
begin
c:=a+b;
a:=b; b:=c;
write(c:3)
end;
END.
2) Calculul termenului de rang n din Fibonacci este definit astfel: f(1)=0,
sirul Fibonacci, n>0 dat.Sirul lui f(2)=1, f(n)=f(n-1)+f(n-2).
Exemplu:

57
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

n=7 : 1, 1, 2, 3, 5, 8,13.} else writeln(z, '=',nr,'scris ca suma


var n,a,b,c,i,fibo:word; de termeni Fibonacci');
begin n:=0;
write('n='); readln(n); end
if n=0 then fibo:=0 else begin
else if n=1 then fibo:=1 k:=2;
else begin write(y,'+');
a:=0; b:=1; n:=n-y;
for i:=2 to n do begin end;
c:=a+b; a:=b; b:=c; end; until n=0;
fibo:=b; end; readln;
writeln('Termenul de rangul',n,'din sirul lui END.
Fibonacci:',fibo); 4) Sa se determine, fara a calcula
end. efectiv termenii sirului Fibonacci, daca
3) Se citeste de la tastatura o 2 numere m si n sunt termeni
valoare n intreaga, pozitiva. Sa se consecutivi ai sirului.Se va afisa pe ecran
verifice mesa-
daca acest numar este un jul DA daca raspunsul este
termen in sirul lui Fibonacci. In caz afirmativ, respectiv mesajul NU daca
contrar, sa raspunsul
se descompuna intr-o suma de este negativ.}
termeni Fibonacci. program ddd;
ex:5=2+3} var a,b,c:integer;
Program Fibo; begin
var n,x,y,z,nr,k:longint; write('a='); readln(a);
BEGIN write('b='); readln(b);
write('Dati valoarea lui n '); if a>b then
readln(n); begin
nr:=n; c:=a; a:=b; b:=c;
k:=1; end;
repeat while b-a>1 do
x:=0; begin
y:=1; c:=b-a; b:=a; a:=c;
z:=x+y; end;
while z<n do begin if (a=2) and (b=3) or (a=1) and (b=1) or
x:=y; (a=0) and (b=1) then
y:=z; writeln('Da')
z:=x+y; else
end; writeln('Nu')
if z=n then begin end.
if k=1 then writeln(n,' este termen
Fibonacci')

3.5.5 Calculul unor sume cu termen general


1)Determinarea sumei 1+2+...+n . end;
program suma1; writeln('Suma totala
uses crt; este:',s);
var n,i,s:integer; readln;
begin end.
clrscr; Varianta 2: Determinarea sumei
writeln('Introduceti a n numere folosind clauza downto .
n:');readln(n); program suma2;
s:=0; var n,i,s:integer;
for i:=1 to n do begin
begin writeln('Introduceti
s:=s+i; n:');readln(n);
writeln('Suma s:=0;
primelor',i,'numere este',s); for i:=n downto 1 do

58
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin p:=p*i;
s:=s+i; s:=s+p;
writeln('Suma end;
ultimelor ',n-i+1,' numere este write(s);
',s); end.
end; 3) Pentru n>0 dat, sa se evalueze
writeln(' Suma expresia:
totala: ',s); E=1+1*3+1*3*5+...+1*3*..*(2*n+1)
readln; Exemple:
end. a)n=2 : E=19
2) Sa se calculeze suma b)n=3 : E=124
S=1+1*2+1*2*3+...+1*2*....*n, unde n c)n=4 : E=1069
este un numar d)n=5 : E=11464}
var n,i:byte;
natural citit. e,p:word;
ex:n=2 begin
=>3 write('n='); readln(n);
} e:=1; p:=1;
for i:=1 to n do begin
var p,n,s,i:integer; p:=p*(2*i+1);
begin inc(e,p);
Write('n='); readln(n); end;
p:=1; s:=0; write('E=',e);
for i:=1 to n do begin end.

3.5.6 Determinare maxim/minim


1)Sa se determine printr-o 2)Fie n puncte .Sa se determine
singura parcurgere a unui vector atit distanta maxima dintre acestea
elementul ex:2
maxim cit si minim 11
ex:3 22
123 =>dist 1.41
=>1
3
}
} var
program MAX_MIN; y,x,ordonata:array[1..50]of real;
uses crt; i,n,j:byte; max,distanta:real;s,ma:real;
type vector=array[1..100]of integer; begin
var v:vector; write('Numarul de
max,min,n,i:integer; elemente:');readln(n);
for i:=1 to n do begin
begin write('abscisa x',i,' ');
clrscr; read(x[i]);
write('n=');readln(n); write('ordonata y',i,' ');
for i:=1 to n do begin write read(ordonata[i]);end;
('v[',i,']='); max:=0;
readln(v[i]); for i:=1 to n-1 do
end; for j:=i+1 to n do
max:=v[1];min:=v[1]; begin
for i:=1 to n do begin if max<v[i] distanta:=sqrt(sqr(x[i]-x[j])
then max:=v[i]; +sqr(ordonata[i]-ordonata[j]));
if min> v[i] then if distanta>max then max:=distanta;
min:=v[i]; end;
end; writeln(' distanta maxima este ',max);
write('max=',max); readln;
write('min=',min); end.
readln
end. 3){Sa se determine maximul
elementelor pare din vector.

59
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

ex:n=3 end;
124 if (p=1) or (p=n) then
write('nu este un punct creasta')
=>4} else begin
var a:array[1..20] of integer; s:=true;
i,n,k,max,j:integer; for i:=1 to p-1 do
ok:boolean; if v[i]>v[i+1] then s:=false;
begin d:=true;
write('n='); for i:=p to n-1 do
readln(n); if v[i]<v[i+1] then d:=false;
for i:=1 to n do if s and d then
begin write('da,este un punct creasta')
write('a[',i,']='); else write('nu este un punct creasta');
readln(a[i]); end;
end; readln;
end.
i:=1;
ok:=false; 5) Sa se determine maximul
while (i<=n) and (ok=false) do elementelor negative intr-un vector
if a[i] mod 2=0 then ok:=true ex:3
else i:=i+1; -1 -2 -3
if ok=false then begin =>-1}
writeln('nu sunt elemente pare'); program maxim_nr_negat;
max:=-1; type vector=array[1..100]of real;
end var x:vector;
else begin n,i:integer;
max:=a[i]; max:real;
for j:=i+1 to n do begin
if (a[j] mod 2=0) and (a[j]>max) then write('n=');
max:=a[j]; readln(n);
writeln('maximul elementelor pare for i:=1 to n do begin
este',max); write ('x[',i,']=');
end; readln (x[i]);end;
readln; max:=-maxint;
end. for i:=1 to n do
4) Se numeste varf creasta un if x[i]<0 then
maxim care in stanga sa are elementele if max<x[i] then
ordonate max:=x[i];
crescator iar in dreapta sa are write ('max negat este:',max);readln;
end.
elementele ordonate descrescator.
6) Sa se determine cea mai mica si
ex:3
cea mai mare diferenta intre doi termeni
132
consecutivi
=> da este}
var i,n,m,p:integer; la un vector
v:array[1..20] of integer; ex:4
s,d:boolean; 1248
begin =>4
write('n='); 1}
readln(n); program zecetablouri;
for i:=1 to n do begin type vector=array[1..100]of integer;
writeln('v[',i,']='); var n,i,max,min:integer;
readln(v[i]); v:vector;
end; begin
m:=v[1]; write ('n=');readln (n);
p:=1; for i:=1 to n do begin
for i:=2 to n do write('v[',i,']='); readln(v[i]); end;
if v[i]>m then begin max:=v[1]-v[2];
m:=v[i]; min:=v[1]-v[2];
p:=i;

60
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

for i:=1 to n do begin


if max< v[i-1]-v[i] then end;
max:=v[i-1]-v[i]; write('o diferenta este',abs( min),' iar
alta diferenta ',abs(max));readln;
if min>v[i-1]-v[i] then min:=v[i- end.
1]-v[i];

3.5.7 Metode de ordonare

1)METODA INSERTIEI
teoria 1):
Sortarea prin insertie
Principiu: tabloul este vazut ca fiind format din doua subtablouri a[1], a[2],..., a[i-1] si
respectiv a[i], a[i+1],...,a[N] (i=2,N). Secventa a[1],...,a[i-1] este ordonata si urmeaza ca a[i] sa fie
inserat in aceasta secventa la locul potrivit, astfel incit secventa a[1],...,a[i-1],a[i] sa devina ordonata,
urmind ca in pasul urmator cele doua subtablouri considerate sa fie a[1],...,a[i] si a[i+1],...,a[N].
Pentru a gasi locul in care trebuie sa fie inserat a[i] se parcurge sirul a[1],...,a[i-1] de la
dreapta spre stinga, pina cind fie se gaseste un element cu cheia <= a[i].cheie, fie s-a atins capatul
sirului. Aici se poate utiliza metoda fanionului, extinzind tabloul spre stinga cu elementul a[0] care se
asigneaza initial cu a[i] (deci TipIndex=0..N).
Implementarea algoritmului in Pascal:
procedure Insertie;
VAR i,j : TipIndex;
begin
for i:=2 to N do begin
{insereaza a[i] la locul potrivit in sirul a[1]...a[i]}
a[0]:=a[i]; j:=i-1;
{cauta locul de inserare}
while a[j].cheie > a[0].cheie do begin
a[j+1]:=a[j]; j:=j-1
end;
a[j+1]:=a[0]
end;
end; {Insertie}
In cazul sortarii prin insertie C si M sint de ordinul N*N, avind valori minime cind tabloul e
ordonat si maxime cind tabloul e ordonat descrescator.
Aceasta metoda este stabila.

matematic: i=i-1=1 deci v=(3 3 7 9 2)


v=(3 7 9 1 2) i=i-1=0
i=1 j=2 deci v=(1 3 7 9 2)
a=v[j]=2=7
deci a=2 pe pozitia j=5 in vector
i=j-1=4
3=v[1]<v[2]=7 deci j=3 v[4]=9>v[5]=2
i=2 deci
v[2]=7<v[3]=9 v=(1 3 7 9 9)
deci v=(3 7 9 9 2) i=3
i=i-1=2 deci v=(3 7 7 9 2) deci v=(1 3 7 7 9)

61
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

i=2 deci v=(1 3 3 7 9) j=2


i=1 dar 11>3 deci
v[1]=1<a=2 nc1=nc1+1=0+1=1
deci j=3 , 11>5 deci
v[2]=2 si v=(1 2 3 7 9) nc1=nc1+1=1+1=2
j=4 , 11<14 deci
nc1=nc1+1=1
APLICATIA: j=5 , 11>2 deci
nc1=nc1+1=2+1=3
Sa se sorteze un vector prin metoda obtin
insertiei(adica fixez un numar de pe o anumita nc=(3 0 0 1 0)
pozitie si pornind de acolo stpre dreapta se analog
compara doi vecini pina se gasesc doi care nu i=2
sunt in ordine dupa care se merge spre stinga j={3 4 5}
pina se gaseste locul potrivit a celui in cauza, -----------
in continuare se face la fel cu pozitia la care s-a i=3
ramas j={4 5}
ex:3 ------------
213 i=4
=>1 2 3} j=5
uses crt;
var x,i,j,n:integer;
a:array[1..20]of integer; Sa se sorteze un vector prin
begin numarare( adica fixez o pozitie si compar
clrscr; elementul de acolo cu toate celalte si in
write('n='); vectorul nr pe pozitia fixata
readln(n); scriu de cite ori este mai mare numarul
for i:=1 to n do begin de pe pozitia fixata decit celelalte
write('a[',i,']='); ,la fel cu urmatoarele ....)
readln(a[i]); ex:3
end; 213
for j:=2 to n do =>1 2 3}
begin uses crt;
x:=a[j]; var t,i,j,n:integer;
i:=j-1; a,b,nr:array[1..20]of integer;
while (i>=1) and (a[i]>x) do begin
begin clrscr;
a[i+1]:=a[i]; write('n=');
i:=i-1; readln(n);
end; for i:=1 to n do begin
a[i+1]:=x; write('a[',i,']=');
end; readln(a[i]);
for i:=1 to n do end;
write(a[i]:4); for i:=1 to n do nr[i]:=0;
readln; for i:=1 to n-1 do
end. for j:=i+1 to n do
2)Sortare prin numarare if a[i]<a[j] then nr[j]:=nr[j]+1
matematic else nr[i]:=nr[i]+1;
v=(11 3 5 14 2) for i:=1 to n do
nc=( 0 0 0 0 0)=(nc1,nc2,nc3,nc4,nc5) b[nr[i]+1]:=a[i];
i=1 for i:=1 to n do
j>i write(b[i]:4);
deci readln;
end.
3)Sortare prin metoda selectiei
Teoria 1)
Sortarea prin selectie

62
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Principiu: se considera subtabloul a[i],...,a[N], se cauta elementul cu cheia


minima din acest subtablou si apoi se interschimba acest element cu elementul a[i],
repetindu-se procedeul pentru valori ale lui i de la 1 la N-1.
Implementarea algoritmului in Pascal:
procedure Selectie;
VAR i,j,k : TipIndex; x : TipElement;
begin
for i:=1 to N-1 do begin
k:=i; x:=a[i];
for j:=i+1 to N do if a[j].cheie < x.cheie then begin
x:=a[j];
k:=j;
end;
a[k]:=a[i]; a[i]:=x
end
end; {Selectie}
In cazul sortarii prin selectie C este de ordinul N*N , iar M este de ordinul
N*ln N. Aceasta metoda este mai putin rapida pentru tablouri ordonate sau aproape
ordonate.
Momentul I :
 Profesorul anunţă titlul lecţiei : SELECTIA DIRECTA
 Reactualizează cunoştinţele elevilor
 Explică metoda pe un caz concret de vector
Strategia este următoarea : la fiecare pas se plasează un element al vectorului pe poziţia sa finală .
Aceasta metodă este cea mai întâlnită mai ales în şcoli.

Exemplu: Fie vectorul A . să se ordoneze crescător , folosind această


metodă
i=1; j=2
4 2 1 3
A[1] A[2] A[3] A[4]

 Primul element este comparat pe rând cu toate celelalte elemente .


Dacă se găseşte un element mai mic decât el , atunci cele două
elemente vor fi interschimbate

4 2 1 3 aux A[1] 2 4 1 3
A[1]A[2]
A[1] A[2] A[3] A[4] A[2]aux A[1] A[2] A[3] A[4]

63
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 În continuare( tot pentru i=1) se testează A[1] faţă de elementul de pe poziţia 3 şi pentru că nu
îndeplineşte condiţia de a fi mai mic decât A[3] , acestea se vor interschimba (i=1; j=3)

aux  A[1]
2 4 1 3 1 4 2 3
A[1]A[3]
A[1] A[2] A[3] A[4] A[3]aux A[1] A[2] A[3] A[4]

 Pentru i=1; j=4 , elementele de pe aceste poziţii sunt poziţionate corect şi se continuă astfel cu
elementele de pe poziţiile i=2, j=3 care vor trebui interschimbate

1 4 2 3 aux  A[2] 1 2 4 3
A[1] A[2] A[3] A[4] A[2]A[3] A[1] A[2] A[3] A[4]
A[3]aux

 Procedeul continuă până când vectorul este ordonat crescător

1 2 4 3 aux  A[3] 1 2 3 4
A[1] A[2] A[3] A[4] A[3]A[4] A[1] A[2] A[3] A[4]
A[4]aux

matematic: =>1 2 3}
v=(7 3 9 2 1 4) uses crt;
i=1 j>i deci var t,i,j,n:integer;
j=2 v[1]=7>v[2]=3 le interschimb a:array[1..20]of integer;
v=(3 7 9 2 1 4 ) begin
j=3 clrscr;
v[1]3<v[3]=9, la fel write('n=');
j=4 v[1]=3<v[4]=2 le interschimb readln(n);
for i:=1 to n do begin
deci v=(2 7 9 3 1 4) write('a[',i,']=');
j=5 v[1]=2>v[5]=1 le interschimb readln(a[i]);
deci v=(1 7 9 3 2 4) end;
j=6 v[1]=1<v[6]=4 la fel for i:=1 to n-1 do
pentru i=2 , j={3 4 5 6} analog for j:=i+1 to n do
if a[i]>a[j] then begin
APLICATIA: t:=a[i];
Sa se sorteze un vector prin metoda a[i]:=a[j];
selectiei (se interschimba numere care a[j]:=t;
sunt adiacente(cel mai mare merge catre end;
ultima pozitie si la urmatoatea parcurgere for i:=1 to n do
urmatorul catre penultima) write(a[i]:4);
ex:3 readln;
213 end.
4)Metoda bulelor
Teoria 1:
Sortarea prin interschimbare (bubblesort)

64
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Principiu: se considera subtabloul a[i],...,a[N] care se parcurge de la dreapta spre stinga,


comparind si interschimbind perechile de elemente alaturate care nu satisfac relatia de ordine,
procedeul repetindu-se pentru i=2,N. Practic, la o parcurgere a subtabloului a[i],...,a[N] are loc
deplasarea elementului minim al acestui subtablou pina in pozitia a[i-1].
Implementarea algoritmului in Pascal:
procedure BubbleSort;
VAR i,j : TipIndex; x : TipElement;
begin
for i:=2 to N do
for j:=N downto i do
if a[j-1].cheie>a[j].cheie then begin
x:=a[j-1];
a[j-1]:=a[j];
a[j]:=x
end
end; {BubbleSort}
matematic: a:array[1..20]of integer;
v=(3 1 4 2 ) begin
avem clrscr;
i=1 v[1]=3<v[2]=1 le schimb locul write('n=');
deci readln(n);
v=(1 3 4 2 0) for i:=1 to n do begin
i=2 v[2]=3<v[3]=4 ramane la fel write('a[',i,']=');
i=3 v[3]=4>v[4]=2 le interschimb readln(a[i]);
deci v=(1 3 2 4 0) end;
acum luam i=1 v[1]<v[2] q:=0;
i=2 v[2]=3>v[3]=2 le interschimb while q=0 do
deci begin
v=(1 2 3 4 0 ) q:=1;
for i:=1 to n-1 do
APLICATIA: if a[i]>a[i+1] then begin
Sa se sorteze un vector prin metoda t:=a[i];
bulelor ( adica se compara permanent doi a[i]:=a[i+1];
vecini a[i+1]:=t;
astfel incit in final cel mai mare merge q:=0;
spre dreapta) end;
ex:3 end;
3 2 12 for i:=1 to n do
=>2 3 12 write(a[i]:4);
} readln;
uses crt; end.
var t,i,q,n:integer;
3.5.9 Metode de cautare
1)Metoda binara uses crt;
Se da un vector cu n elemente const Nmax=20;
var i,n:byte;
ordonat crescator si o valoare v.Sa se a:array[1..20] of integer;
indice v,st,dr,m,k:integer;
daca aceasta valoare exista in ok:boolean;
sir ,daca da ,sa se precizeze pe ce begin
pozitie se clrscr;
write('n=');
afla ,folosind metoda cautarii readln(n);
binare . for i:=1 to n do begin
ex:3 write('a[',i,']=');
123 readln(a[i]);
p=2 end;
write('pe cine cautati');
=> pe pozitia a doua este} readln(v);
program cautarebinara;

65
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

if v=a[1] then Se citesc n numre naturale


write('valoarea este pe pozitia 1') intr-un vector.sa se calculeze
else
if v=a[n] then
media aritmetica a acestora
write('valoarea este pe pozitia ',n) ex:n=3
else begin caut pe 2
st:=1; 123
dr:=n; =>este 2}
ok:=false; program media;
while (dr-st>1) and not ok do begin uses crt;
m:=trunc((st+dr)/2); var i,n:byte;
if v=a[m] then begin a:array[1..50]of integer;
k:=m; x,s:integer;m:real;
ok:=true; begin
end else clrscr;
if v>a[m] then st:=m write('n=');
else dr:=m; readln(n,x);
end; for i:=1 to n do begin
if ok then write('a[',i,']=');
writeln('valoarea cautata e in sir pe readln(a[i]);
pozitia ',k) end;
else for i:=1 to n do
writeln('valoarea cautata nu e in sir'); if x=a[i] then
end; write('este',x)
readkey; else
end. write(' NU este',x)
2)Cautare secventiala readkey;
end.

3.5.8 Interclasarea
Sa se scrie un program pentru ordonarea prin interclasare a doua
siruri de
numere intregi a si b.
ex:n=3,a=(2,3,4),n=1 ,b=(1)}
program interclass;
var i,j,k,L,m,n:integer;
a,b,c:array[1..30] of integer;
BEGIN
write('n=');read(n);
write('m=');
readln(m);
for i:=1 to n do begin
write('a[',i,']=');readln(a[i]);
end;
for i:=1 to m do begin
write('b[',i,']=');readln(b[i]);
end;
i:=1;j:=1;k:=0;
while (i<=n) and (j<=m) do begin
if a[i]<b[j] then begin
k:=k+1;c[k]:=a[i];i:=i+1;end
else begin
k:=k+1;c[k]:=b[j];j:=j+1;end;
if i>n then for L:=j to m do begin
k:=k+1;c[k]:=b[L];end
else for L:=i to n do begin
k:=k+1;c[k]:=a[L];end;
for i:=1 to m+n do write(c[i],' '); end;

66
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

readln;
END.

3.6 Analiza complexitatii algoritmilor

3.6. Analiza eficientei algoritmilor


Vom dezvolta in acest capitol aparatul matematic necesar pentru analiza eficientei
algoritmilor, incercand ca aceasta incursiune matematica sa nu fie excesiv de formala.
Apoi, vom arata, pe baza unor exemple, cum poate fi analizat un algoritm. O atentie
speciala o vom acorda tehnicilor de analiza a algoritmilor recursivi.

3.6.1 Notatia asimptotica


In Capitolul 1 am dat un inteles intuitiv situatiei cand un algoritm necesita un timp in
ordinul unei anumite functii. Revenim acum cu o definitie riguroasa.

3.6.1.1 O notatie pentru “ordinul lui”


Fie N multimea numerelor naturale (pozitive sau zero) si R multimea numerelor reale.
Notam prin N+ si R+ multimea numerelor naturale, respectiv reale, strict pozitive, si
prin R multimea numerelor reale nenegative. Multimea {true, false} de constante
booleene o notam cu B. Fie f : N  R o functie arbitrara. Definim multimea

O( f ) = {t : N  R | (c  R+) (n0  N) (n  n0) [t(n)  cf (n)]}

Cu alte cuvinte, O( f ) (se citeste “ordinul lui f ”) este multimea tuturor functiilor t
marginite superior de un multiplu real pozitiv al lui f, pentru valori suficient de mari
ale argumentului. Vom conveni sa spunem ca t este in ordinul lui f (sau, echivalent, t
este in O( f ), sau t  O( f )) chiar si atunci cand valoarea f (n) este negativa sau
nedefinita pentru anumite valori n < n0. In mod similar, vom vorbi despre ordinul lui f
chiar si atunci cand valoarea t(n) este negativa sau nedefinita pentru un numar finit de
valori ale lui n; in acest caz, vom alege n0 suficient de mare, astfel incat, pentru n  n0,
acest lucru sa nu mai apara. De exemplu, vom vorbi despre ordinul lui n/log n, chiar
daca pentru n = 0 si n = 1 functia nu este definita. In loc de t  O( f ), uneori este mai
convenabil sa folosim notatia t(n)  O( f (n)), subintelegand aici ca t(n) si f (n) sunt
functii.

Fie un algoritm dat si fie o functie t : N  R astfel incat o anumita implementare a
algoritmului sa necesite cel mult t(n) unitati de timp pentru a rezolva un caz de
marime n, n  N. Principiul invariantei (mentionat in Capitolul 1) ne asigura ca orice
implementare a algoritmului necesita un timp in ordinul lui t. Mai mult, acest algoritm
necesita un timp in ordinul lui f pentru orice functie f : N  R pentru care t  O( f ).
In particular, t  O(t). Vom cauta in general sa gasim cea mai simpla functie f, astfel
incat t  O( f ).

67
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Proprietatile de baza ale lui O( f ) sunt date ca exercitii (Exercitiile 5.1-5.7) si este
recomandabil sa le studiati inainte de a trece mai departe.

Notatia asimptotica defineste o relatie de ordine partiala intre functii si deci, intre
eficienta relativa a diferitilor algoritmi care rezolva o anumita problema. Vom da in
continuare o interpretare algebrica a notatiei asimptotice. Pentru oricare doua functii
f , g : N  R, definim urmatoarea relatie binara: f  g daca O( f )  O(g). Relatia “”
este o relatie de ordine partiala in multimea functiilor definite pe N si cu valori in R
(Exercitiul 5.6). Definim si o relatie de echivalenta: f  g daca O( f ) = O(g).

In multimea O( f ) putem inlocui pe f cu orice alta functie echivalenta cu f. De


exemplu, lg n  ln n log n si avem O(lg n) = O(ln n) = O(log n). Notand cu O(1)
ordinul functiilor marginite superior de o constanta, obtinem ierarhia:

O(1)  O(log n)  O(n)  O(n log n)  O(n2)  O(n3)  O(2n)

Aceasta ierarhie corespunde unei clasificari a algoritmilor dupa un criteriu al


performantei. Pentru o problema data, dorim mereu sa obtinem un algoritm
corespunzator unui ordin cat mai “la stanga”. Astfel, este o mare realizare daca in
locul unui algoritm exponential gasim un algoritm polinomial.

In Exercitiul 5.7 este data o metoda de simplificare a calculelor, in care apare notatia
asimptotica. De exemplu,

n33n2n8  O(n3(3n2n8)) = O(max(n3, 3n2n8)) = O(n3)

Ultima egalitate este adevarata, chiar daca max(n3, 3n2n8)  n3 pentru 0  n  3,


deoarece notatia asimptotica se aplica doar pentru n suficient de mare. De asemenea,

     n33n2n8  O(n3/2(n3/23n2n8))      = O(max(n3/2, n3/23n2n8))


                                                                     = O(n3/2) = O(n3)

chiar daca pentru 0  n  6 polinomul este negativ. Exercitiul 5.8 trateaza cazul unui
polinom oarecare.

Notatia O( f ) este folosita pentru a limita superior timpul necesar unui algoritm,
masurand eficienta algoritmului respectiv. Uneori este util sa estimam si o limita
inferioara a acestui timp. In acest scop, definim multimea

( f ) = {t : N  R | (c  R+) (n0  N) (n  n0) [t(n)  cf (n)]}

Exista o anumita dualitate intre notatiile O( f ) si ( f ). Si anume, pentru doua functii
oarecare f, g : N  R, avem: f  O(g), daca si numai daca g  ( f ).

O situatie fericita este atunci cand timpul de executie al unui algoritm este limitat, atat
inferior cat si superior, de cate un multiplu real pozitiv al aceleiasi functii. Introducem
notatia

 ( f ) = O( f )  ( f )

68
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

numita ordinul exact al lui f. Pentru a compara ordinele a doua functii, notatia  nu
este insa mai puternica decat notatia O, in sensul ca relatia O( f ) = O(g) este
echivalenta cu ( f ) = (g).

Se poate intampla ca timpul de executie al unui algoritm sa depinda simultan de mai


multi parametri. Aceasta situatie este tipica pentru anumiti algoritmi care opereaza cu
grafuri si in care timpul depinde atat de numarul de varfuri, cat si de numarul de
muchii. Notatia asimptotica se generalizeaza in mod natural si pentru functii cu mai
multe variabile. Astfel, pentru o functie arbitrara f : N  N  R definim

O( f ) = {t : N  N  R | (c  R+) (m0, n0  N) (m  m0) (n  n0)


     t(m, n)  cf (m, n)]}

Similar, se obtin si celelalte generalizari.

3.6.1.2 Notatia asimptotica conditionata


Multi algoritmi sunt mai usor de analizat daca consideram initial cazuri a caror
marime satisface anumite conditii, de exemplu sa fie puteri ale lui 2. In astfel de
situatii, folosim notatia asimptotica conditionata. Fie f : N  R o functie arbitrara si
fie P : N  B un predicat.

O( f | P) = {t : N  R  (c  R+) (n0  N) (n  n0)


                            [P(n)  t(n)  cf (n)}

Notatia O( f ) este echivalenta cu O( f | P), unde P este predicatul a carui valoare este
mereu true. Similar, se obtin notatiile ( f | P) si ( f | P).

O functie f : N  R este eventual nedescrescatoare, daca exista un n0, astfel incat
pentru orice n  n0 avem f (n)  f (n1), ceea ce implica prin inductie ca, pentru orice
n  n0 si orice m  n, avem f (n)  f (m). Fie b  2 un intreg oarecare. O functie
eventual nedescrescatoare este b-neteda daca f (bn)  O( f (n)). Orice functie care este
b-neteda pentru un anumit b  2 este, de asemenea, b-neteda pentru orice b  2
(demonstrati acest lucru!); din aceasta cauza, vom spune pur si simplu ca aceste
functii sunt netede. Urmatoarea proprietate asambleaza aceste definitii, demonstrarea
ei fiind lasata ca exercitiu.
Proprietatea 3.6.1 Fie b  2 un intreg oarecare, f : N  R o functie neteda si
t : N  R o functie eventual nedescrescatoare, astfel incat

t(n)  X( f (n) | n este o putere a lui b)

unde X poate fi O, , sau . Atunci, t  X( f ). Mai mult, daca t  ( f ), atunci si
functia t este neteda.
Pentru a intelege utilitatea notatiei asimptotice conditionate, sa presupunem ca timpul
de executie al unui algoritm este dat de ecuatia

69
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

unde a, b  R+ sunt constante arbitrare. Este dificil sa analizam direct aceasta ecuatie.
Daca consideram doar cazurile cand n este o putere a lui 2, ecuatia devine

Prin tehnicile pe care le vom invata la sfarsitul acestui capitol, ajungem la relatia

t(n)  (n log n | n este o putere a lui 2)

Pentru a arata acum ca t  (n log n), mai trebuie doar sa verificam daca t este
eventual nedescrescatoare si daca n log n este neteda.

Prin inductie, vom demonstra ca (n  1) [t(n)  t(n1)]. Pentru inceput, sa notam ca

t(1) = a  2(ab) = t(2)

Fie n > 1. Presupunem ca pentru orice m < n avem t(m)  t(m1). In particular,

t(n/2)  t((n1)/2)

t(n/2)  t((n1)/2)

Atunci,

t(n) = t(n/2)t(n/2)bn  t((n1)/2)t((n1)/2)b(n1) = t(n1)

In fine, mai ramane sa aratam ca n log n este neteda. Functia n log n este eventual
nedescrescatoare si

2n log(2n) = 2n(log 2  log n) = (2 log 2)n  2n log n
                               O(n  n log n) = O(max(n, n log n)) = O(n log n)

De multe ori, timpul de executie al unui algoritm se exprima sub forma unor
inegalitati de forma

si, simultan

pentru anumite constante c, d  R+, n0  N si pentru doua functii t1, t2 : N  R+.


Notatia asimptotica ne permite sa scriem cele doua inegalitati astfel:

70
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

                               t(n)  t(n/2)  t(n/2)  O(n)
respectiv
                               t(n)  t(n/2)  t(n/2)  (n)

Aceste doua expresii pot fi scrise si concentrat:

t(n)  t(n/2)  t(n/2)  (n)

Definim functia

Am vazut ca f  (n log n). Ne intoarcem acum la functia t care satisface inegalitatile


precedente. Prin inductie, se demonstreaza ca exista constantele v  d, u  c, astfel
incat

v  t(n)/f (n)  u

pentru orice n  N+. Deducem atunci

t  ( f ) = (n log n)

Aceasta tehnica de rezolvare a inegalitatilor initiale are doua avantaje. In primul rand,
nu trebuie sa demonstram independent ca t  O(n log n) si t  (n log n). Apoi, mai
important, ne permite sa restrangem analiza la situatia cand n este o putere a lui 2,
aplicand apoi Proprietatea 5.1. Deoarece nu stim daca t este eventual
nedescrescatoare, nu putem aplica Proprietatea 5.1 direct asupra inegalitatilor initiale.

3.6.2 Tehnici de analiza a algoritmilor


Nu exista o formula generala pentru analiza eficientei unui algoritm. Este mai curand
o chestiune de rationament, intuitie si experienta. Vom arata, pe baza exemplelor, cum
se poate efectua o astfel de analiza.

3.6.2.1 Sortarea prin selectie


Consideram algoritmul select din Sectiunea 1.3. Timpul pentru o singura executie a
buclei interioare poate fi marginit superior de o constanta a. In total, pentru un i dat,
bucla interioara necesita un timp de cel mult ba(ni) unitati, unde b este o constanta
reprezentand timpul necesar pentru initializarea buclei. O singura executie a buclei
exterioare are loc in cel mult cba(ni) unitati de timp, unde c este o alta constanta.
Algoritmul dureaza in total cel mult

unitati de timp, d fiind din nou o constanta. Simplificam aceasta expresie si obtinem

71
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

(a/2)n2  (bca/2)n  (dcb)

de unde deducem ca algoritmul necesita un timp in O(n2). O analiza similara asupra


limitei inferioare arata ca timpul este de fapt in (n2). Nu este necesar sa consideram
cazul cel mai nefavorabil sau cazul mediu, deoarece timpul de executie este
independent de ordonarea prealabila a elementelor de sortat.

In acest prim exemplu am dat toate detaliile. De obicei, detalii ca initializarea buclei
nu se vor considera explicit. Pentru cele mai multe situatii, este suficient sa alegem ca
barometru o anumita instructiune din algoritm si sa numaram de cate ori se executa
aceasta instructiune. In cazul nostru, putem alege ca barometru testul din bucla
interioara,  acest test executandu-se de n(n1)/2 ori. Exercitiul 5.23 ne sugereaza ca
astfel de simplificari trebuie facute cu discernamant.

3.6.2.2 Sortarea prin insertie


Timpul pentru algoritmul insert (Sectiunea1.3) este dependent de ordonarea prealabila
a elementelor de sortat. Vom folosi comparatia “x < T[ j]” ca barometru.

Sa presupunem ca i este fixat si fie x = T[i], ca in algoritm. Cel mai nefavorabil caz
apare atunci cand x < T[ j] pentru fiecare j intre 1 si i1, algoritmul facand in aceasta
situatie i1 comparatii. Acest lucru se intampla pentru fiecare valoare a lui i de la 2 la
n, atunci cand tabloul T este initial ordonat descrescator. Numarul total de comparatii
pentru cazul cel mai nefavorabil este

 (n2)

Vom estima acum timpul mediu necesar pentru un caz oarecare. Presupunem ca
elementele tabloului T sunt distincte si ca orice permutare a lor are aceeasi
probabilitate de aparitie. Atunci, daca 1  k  i, probabilitatea ca T[i] sa fie cel de-al k-
lea cel mai mare element dintre elementele T[1], T[2], …, T[i] este 1/i. Pentru un i
fixat, conditia T[i] < T[i1] este falsa cu probabilitatea 1/i, deci probabilitatea ca sa se
execute comparatia “x < T[ j]”, o singura data inainte de iesirea din bucla while, este
1/i. Comparatia “x < T[ j]” se executa de exact doua ori tot cu probabilitatea 1/i etc.
Probabilitatea ca sa se execute comparatia de exact i1 ori este 2/i, deoarece aceasta
se intampla atat cand x < T[1], cat si cand T[1]  x < T[2]. Pentru un i fixat, numarul
mediu de comparatii este

ci = 1×1/i  2×1/i  (i2)1/i  (i1)2/i = (i1)/2  1/i

Pentru a sorta n elemente, avem nevoie de  comparatii, ceea ce este egal cu

(n23n)/4  Hn  (n2)

72
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

unde prin Hn=  (log n) am notat al n-lea element al seriei armonice


(Exercitiul 5.17).

Se observa ca algoritmul insert efectueaza pentru cazul mediu de doua ori mai putine
comparatii decat pentru cazul cel mai nefavorabil. Totusi, in ambele situatii, numarul
comparatiilor este in (n2).

Algoritmul necesita un timp in (n2), atat pentru cazul mediu, cat si pentru cel mai
nefavorabil. Cu toate acestea, pentru cazul cel mai favorabil, cand initial tabloul este
ordonat crescator, timpul este in O(n). De fapt, in acest caz, timpul este si in (n),
deci este in (n).

3.6.2.3 Heapsort
Vom analiza, pentru inceput, algoritmul make-heap din Sectiunea3.4. Definim ca
barometru instructiunile din bucla repeat a algoritmului sift-down. Fie m numarul
maxim de repetari al acestei bucle, cauzat de apelul lui sift-down(T, i), unde i este
fixat. Notam cu jt valoarea lui j dupa ce se executa atribuirea “j  k” la a t-a repetare
a buclei. Evident, j1 = i. Daca 1 < t  m, la sfarsitul celei de-a (t1)-a repetari a buclei,
avem j  k si k  2j. In general, jt  2jt-1 pentru 1 < t  m. Atunci,

n  jm  2jm-1  4jm-2  …  2m-1i

Rezulta 2m-1  n/i, iar de aici obtinem relatia m  1  lg(n/i).

Numarul total de executari ale buclei repeat la formarea unui heap este marginit
superior de

,  unde a = n/2                              ()

Pentru a simplifica aceasta expresie, sa observam ca pentru orice k  0

,  unde b = 2k  si  c = 2k+11

Descompunem expresia () in sectiuni corespunzatoare puterilor lui 2 si notam


d = lg(n/2) :

Demonstratia ultimei inegalitati rezulta din Exercitiul 5.26. Dar d = lg(n/2) implica
d1  lg n si d1  lg(n/8). Deci,

73
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Din () deducem ca n/23n repetari ale buclei repeat sunt suficiente pentru a
construi un heap, deci make-heap necesita un timp t  O(n). Pe de alta parte, deoarece
orice algoritm pentru formarea unui heap trebuie sa utilizeze fiecare element din
tablou cel putin o data, t  (n). Deci, t  (n). Puteti compara acest timp cu timpul
necesar algoritmului slow-make-heap (Exercitiul 5.28).

Pentru cel mai nefavorabil caz, sift-down(T[1 .. i1], 1) necesita un timp in O(log n)


(Exercitiul 5.27). Tinand cont si de faptul ca algoritmul make-heap este liniar, rezulta
ca timpul pentru algoritmul heapsort pentru cazul cel mai nefavorabil este in
O(n log n). Mai mult, timpul de executie pentru heapsort este de fapt in (n log n),
atat pentru cazul cel mai nefavorabil, cat si pentru cazul mediu.

Algoritmii de sortare prezentati pana acum au o caracteristica comuna: se bazeaza


numai pe comparatii intre elementele tabloului T. Din aceasta cauza, ii vom numi
algoritmi de sortare prin comparatie. Vom cunoaste si alti algoritmi de acest tip:
bubblesort, quicksort, mergesort. Sa observam ca, pentru cel mai nefavorabil caz,
orice algoritm de sortare prin comparatie necesita un timp in (n log n) (Exercitiul
5.30). Pentru cel mai nefavorabil caz, algoritmul heapsort este deci optim (in limitele
unei constante multiplicative). Acelasi lucru se intampla si cu mergesort.

3.6.2.4 Turnurile din Hanoi


Matematicianul francez Éduard Lucas a propus in 1883 o problema care a devenit
apoi celebra, mai ales datorita faptului ca a prezentat-o sub forma unei legende. Se
spune ca Brahma a fixat pe Pamant trei tije de diamant si pe una din ele a pus in
ordine crescatoare 64 de discuri de aur de dimensiuni diferite, astfel incat discul cel
mai mare era jos. Brahma a creat si o manastire, iar sarcina calugarilor era sa mute
toate discurile pe o alta tija. Singura operatiune permisa era mutarea a cate unui singur
disc de pe o tija pe alta, astfel incat niciodata sa nu se puna un disc mai mare peste
unul mai mic. Legenda spune ca sfarsitul lumii va fi atunci cand calugarii vor savarsi
lucrarea. Aceasta se dovedeste a fi o previziune extrem de optimista asupra sfarsitului
lumii. Presupunand ca in fiecare secunda se muta un disc si lucrand fara intrerupere,
cele 64 de discuri nu pot fi mutate nici in 500 de miliarde de ani de la inceputul
actiunii!

Observam ca pentru a muta cele mai mici n discuri de pe tija i pe tija j (unde 1  i  3,
1  j  3, i  j, n  1), transferam cele mai mici n1 discuri de pe tija i pe tija 6ij,
apoi transferam discul n de pe tija i pe tija j, iar apoi retransferam cele n1 discuri de
pe tija 6ij pe tija j. Cu alte cuvinte, reducem problema mutarii a n discuri la
problema mutarii a n1 discuri. Urmatoarea procedura descrie acest algoritm recursiv.

procedure Hanoi(n, i, j)
     {muta cele mai mici n discuri de pe tija i pe tija j}
     if n > 0 then    Hanoi(n1, i, 6ij)

74
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

                            write i ““ j


                            Hanoi(n1, 6ij, j)

Pentru rezolvarea problemei initiale, facem apelul Hanoi(64, 1, 2).

Consideram instructiunea write ca barometru. Timpul necesar algoritmului este


exprimat prin urmatoarea recurenta:

Vom demonstra in Sectiunea 5.2 ca t(n) = 2n1. Rezulta t  (2n).

Acest algoritm este optim, in sensul ca este imposibil sa mutam n discuri de pe o tija
pe alta cu mai putin de 2n1 operatii. Implementarea in oricare limbaj de programare
care admite exprimarea recursiva se poate face aproape in mod direct.

3.6.3 Analiza algoritmilor recursivi


Am vazut in exemplul precedent cat de puternica si, in acelasi timp, cat de eleganta
este recursivitatea in elaborarea unui algoritm. Nu vom face o introducere in
recursivitate si nici o prezentare a metodelor de eliminare a ei. Cel mai important
castig al exprimarii recursive este faptul ca ea este naturala si compacta, fara sa
ascunda esenta algoritmului prin detaliile de implementare. Pe de alta parte, apelurile
recursive trebuie folosite cu discernamant, deoarece solicita si ele resursele
calculatorului (timp si memorie). Analiza unui algoritm recursiv implica rezolvarea
unui sistem de recurente. Vom vedea in continuare cum pot fi rezolvate astfel de
recurente. Incepem cu tehnica cea mai banala.

3.6.3.1 Metoda iteratiei
Cu putina experienta si intuitie, putem rezolva de multe ori astfel de recurente prin metoda
iteratiei: se executa primii pasi, se intuieste forma generala, iar apoi se demonstreaza prin
inductie matematica ca forma este corecta. Sa consideram de exemplu recurenta problemei
turnurilor din Hanoi. Pentru un anumit n > 1 obtinem  t
succesiv t(n) = 2t(n1) 1 = 22t(n2) 2 1 = … = 2n-1t(1) 

Rezulta t(n) = 2n1. Prin inductie matematica se demonstreaza acum cu usurinta ca


aceasta forma generala este corecta.

3.6.3.2 Inductia constructiva
Inductia matematica este folosita de obicei ca tehnica de demonstrare a unei asertiuni
deja enuntate. Vom vedea in aceasta sectiune ca inductia matematica poate fi utilizata
cu succes si in descoperirea enuntului asertiunii. Aplicand aceasta tehnica, putem
simultan sa demonstram o asertiune doar partial specificata si sa descoperim
specificatiile care lipsesc si datorita carora asertiunea este corecta. Vom vedea ca
aceasta tehnica a inductiei constructive este utila pentru rezolvarea anumitor recurente
care apar in contextul analizei algoritmilor. Incepem cu un exemplu.

75
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Fie functia f : N  N, definita prin recurenta

Sa presupunem pentru moment ca nu stim ca f (n) = n(n1)/2 si sa cautam o astfel de


formula. Avem

si deci, f (n)  O(n2). Aceasta ne sugereaza sa formulam ipoteza inductiei specificate


partial IISP(n) conform careia f este de forma f (n) = an2bnc. Aceasta ipoteza este
partiala, in sensul ca a, b si c nu sunt inca cunoscute. Tehnica inductiei constructive
consta in a demonstra prin inductie matematica aceasta ipoteza incompleta si a
determina in acelasi timp valorile constantelor necunoscute a, b si c.

Presupunem ca IISP(n1) este adevarata pentru un anumit n  1. Atunci,

f (n) = a(n1)2b(n1)cn = an2(1b2a)n(abc)

Daca dorim sa aratam ca IISP(n) este adevarata, trebuie sa aratam ca f (n) = an2bnc.


Prin identificarea coeficientilor puterilor lui n, obtinem ecuatiile 1b2a = b si
abc = c, cu solutia a = b = 1/2, c putand fi oarecare. Avem acum o ipoteza mai
completa, pe care o numim tot IISP(n): f (n) = n2/2n/2c. Am aratat ca, daca
IISP(n1) este adevarata pentru un anumit n  1, atunci este adevarata si IISP(n).
Ramane sa aratam ca este adevarata si IISP(0). Trebuie sa aratam ca
f (0) = a0b0c = c. Stim ca f (0) = 0, deci IISP(0) este adevarata pentru c = 0. In
concluzie, am demonstrat ca f (n) = n2/2n/2 pentru orice n.

3.5 Algoritmi elementari

3.5.1 Probleme care opereaza asupra cifrelor unui numar

1)Se citeşte un număr natural n. Să se calculeze suma cifrelor sale.


Exemplu: pentru n = 213, se va tipări 6 (2 + 1 + 3).
Pentru calculul acestei sume, trebuie să găsim o modalitate de a separa cifrele unui număr. Între
operatorii care se pot aplica numerelor naturale sunt doi care ne folosesc în acest caz. Aceştia sunt operatorii DIV
şi MOD. Aplicând operatorul DIV pentru două numere naturale a şi b sub forma a DIV b obţinem câtul întreg al
împărţirii lui a la b.
Exemplu: 24 DIV 5 = 4.
Prin aplicarea operatorului MOD la două numere naturale a şi b (a MOD b) obţinem restul împărţirii lui a
la b.
Exemplu: 24 MOD b 7 = 3.
Dacă vom considera un număr natural n, n MOD 10 va da restul împărţirii la 10 a numărului, deci ultima
cifră a sa, iar n DIV 10 va avea ca rezultat câtul împărţirii la 10 a numărului (acesta nu este altceva decât numărul
format prin suprimarea ultimei cifre a numărului n).
Presupunem că am citit numărul 425. Procedăm astfel:

76
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 iniţializăm suma (s = 0);


 calculăm ultima cifră a numărului 425 MOD 10 = 5 şi o adunăm la s (s =5);
 reţinem numărul fără ultima cifră (425 DIV 10 = 42);
 pentru numărul nou format reţinem ultima cifră şi o adunăm la s (4 MOD 10 = 4, s := 7 + 4 = 11);
 reţinem numărul fără ultima cifră (4 DIV 10 = 0).
Întru-cât numărul a devenit 0, algoritmul se încheie prin tipărirea lui s (s = 11).
Algoritmul scris în pseudocod:
INTEGER n, s;
READ n
S := 0;
WHILE n < > 0

s := s + n MOD 10
n := n DIV 10
START
REPEAT
WRITE s;
STOP. Cit. s

S := 0

DA NU
Tip. S

S := S + n MOD 10
STOP

N := N DIV 10
Cit. n

2) Se citeşte n un număr natural. Să se tipărească numărul obţinut prin


inversarea cifrelor lui n.
Exemplu: n := 412. Se va tipări 214.
În problema anterioară am văzut cum putem izola cifrele unui număr. De menţionat că algoritmul
propus anterior izola cifrele numărului n în ordine inversă.
Exemplu: pentru numărul 162 se izolau pe rând cifrele 2, 6, şi 1. Pe de altă parte, dacă cunoaştem cifrele
unui număr putem calcula numărul respectiv.
Exemplu: din cifrele 2, 6 şi 1 putem obţine numărul 261. Aici nu este vorba de alăturarea cifrelor, cum
am fi tentaţi să credem, ci de calculul numărului sub forma:
2 * 102 + 6 * 101 + 1 * 100,
aşa cum cunoaştem din teoria bazelor de numeraţie. Cum procedăm pentru rezolvarea acestei probleme?
Considerăm o variabilă (notată ninv., care iniţial va avea valoarea 0). Pentru fiecare cifră noua valoare a lui niv va
fi vechea valoare înmulţită cu 10 la care se va adăuga cifra:
niv : = 0 * 10 + 2;
niv : = 2 * 10 + 6;
niv : = 26 * 10 + 1 = 261.
În concluzie, izolăm pe rând cifrele în ordine inversă (aşa cum am arătat în problema anterioară) şi cu
fiecare nouă cifră construim numărul cerut.
În pseudocod, algoritmul arată astfel:
Integer n, ninv;
READ n
ninv := 0;
WHILE n < > 0

77
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

ninv := ninv * 10 + n MOD 10;


n .= n DIV 10
REPEAT
WRITE ninv
STOP.

3.5.3 Probleme CU NUMERE PRIME


1)Se citeşte n număr natural. Să se precizeze dacă este prim sau nu.
Să presupunem că dorim să verificăm dacă numărul 1000 este prim. Primul divizor posibil (2) divide
acest număr. Cu toate acestea, în loc să se afişeze rezultatul imediat, se verifică şi ceilalţi divizori posibili. Trebuie
găsită o modalitate prin care, la găsirea unui divizor, să se tipărească faptul că numărul nu este prim. Prezentăm
acest nou algoritm:
INTEGER n, i
READ n
i := 2
WHILE (i < n) AND (n MOD i < > 0)
i := i +1
REPEAT
IF i := n THEN WRITE ’numarul este prim’
ELSE WRITE ’numarul nu este prim’
ENDIF
STOP.

2) Să se scrie un algoritm care tipăreşte primele numere prime (numărul se


citeşte).
În problema anterioeră am văzut cum putem stabili dacă un număr este prim. Acum, se pune problea să
asigurăm un contor în care să se caute numerele prime printre numerele 1, 2, ş. a. m. d., până se tipăresc numerele
cerute.
În pseudocod, algoritmul arată asrfel:
INTEGER n, i, j, nr
BOOLEAN prim;

READ nr
N := 1
J := 0;
DO
prim := true

78
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

FOR i := 2,  
IF n MOD i = 0 THEN prim := false
ENDIF
REPEAT
IF prim THEN
WRITE n
j := j + 1
ENDIF
n := n + 1
UNTIL j = nr
STOP.
3) Se citeşte n, număr natural, să se descompună în
factori primi.
Algoritmul constă în următoarele:
 se citeşte n;
 se iniţializează ptrimul diviyor (i = 2);
 secvenţa următoare se repetă până când n = 1;
 se iniţializează fm cu 0 (factor de multiplicitate, arată
puterea la care se găseşte factorul prim);
 atâta timp cât i îl divide pe n, se execută următoarele:
- se măreşte cu 12 factorul de multiplicitate;
- se împarte n la I;
 dacă fm este diferit de 0 (deci s-a găsit divizor al lui n)
se tipăresc I şi fm;
 se adun 1 la i (se incrementează).
Să presupunem că am citit n = 12. Algoritmul decurge astfel:
 se iniţializează I cu 2;
 se iniţializează fm cu 0;
 întrucât 2 divide pe 12, fm va lua valoarea 1 iar n valoarea 6;
 întrucât 2 divide pe 6, fm va lua valoarea 2 şi n valoarea 3;
 n nu divide pe 3, deci se trece mai departe;
 fm este diferit de 0, se tipăreşte 2 la puterea 2;
 se măreşte i cu 1;
 n nu este 1, deci secvenţa se reia;
 fm va lua valoarea 0;
 3 divide pe 3 (i divide pe n) deci fm va lua valoarea 1 şi n
va deveni 1;
 3 nu divide 1, deci se trece mai departe;
 fm este diferit de 0, deci se tiopăreşte 3 la pueterea 1;
 i devine 4;
 n este 1 şi algoritmul se încheie.
În continuare se prezintă schema logică şi algoritmul realizat în
pseudocod:
INTEGER n, i, fm;
READ n
i := 2;
DO
fm := 0;
WHILE n MOD i = 0
fm := fm + 1;
n := n DIV i
REPEAT
IF fm < > 0 THEN
WRITE I, ’la puterea’ fm
ENDIF
i := i + 1
UNTIL n = 1
STOP.

79
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

3.5.5 Calculul unor sume cu termen general dat


1)Pentru n citit ( n natural mai mare sau egal cu 1) să se calculeze suma
S = 1 +1 * 2 + 1 * 2 * 3 + . . . + 1 * 2 * . . . * n.
Pentru rezolvare, observăm că putem adăuga o sumă s (care are iniţial valoarea 0) pe rând
valorile calculate 1, 1 * 2 *, . . ., 1 * 2 * . . . n (adică n valori). Aceasta nu înseamnă că trebuie calculată de
fiecare dată valoarea 1 * 2 * . . . i. Dacă calculat 1v2 * . . . . * I, valoarea următoare care trebuie adăugată
este 1 * 2 * . . . i * (i +1) şi se poate obţine înmulţind valoarea calculată cu i + 1.
Pentru calculul acestor valori se utilizează se utilizează variabila p. din cele arătate rezultă
schema logică de mai jos:

În pseudocod, algoritmul propus arată astfel:

INTEGER n, i, s, p;
READ n
s := 0
p := 1
FOR i := 1, n
p := * i
s := s + p
REPEAT

WRITE s
STOP.

2) Se consideră şirul de numere naturale:

1, 4, 7, 10, 13, . . .

Să se calculeze suma primelor n termeni, cu n dat de la tastatură


Program Problema_1;

80
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Var s, suma : Word; { s reprezintă termenul curent al şirului }


n, i : integer;
Begin
Suma := 1;
s :=1;
write (’n =’); readln (n);
for i := 1 to n –1 do
begin
s := s + 3;
suma := suma + s;
end;
writeln (’Suma este: ’, Suma)
End.

2. Se consideră şirul: 2, 7, 12, 17, . . .


cu n termeni (n > 1). Să se calculeze suma termenilor pari.
Program Problema _2;
Var s, suma : Word; { s reprezintă termenul curent al şirului }
n, i : Integer;
Begin
Suma : 2;
s :=2;
write (’n =’);
readln (n);
for i := 1 to n –1 do
begin
s := s + 5;
if not odd (s) {verificarea parităţii termenului curent }
then Suma := Suma + s;
end;
writeln (’Suma este: ’, suma)
End.

4. Limbaje de programare

4.1. Concepte generale


Despre limbajul Pascal
Limbajul Pascal apărut la începutul anilor ’70 şi a fost elaborat de către matematicianul Niklaus Wirth.
Iniţial, limbajul a fost conceput pentru predarea sistematică a disciplinei de programare a calculatoarelor, deci ca
limbaj de tip pseudocod. Cu timpul, limbajul a început să fie folosit şi în activitatea practică de programare a
calculatoarelor. La ora actuală, există mai multe implementări ale limbajului Pascal Standard, dintre care una
dintre cele mai utilizate aparţine firmei americane Borland, variantă denumită Turbo Pascal. Această implementare
include toate elementele limbajului Pascal standard, dar oferă şi facilităţi suplimentare.

4.2. Sintaxa unui limbaj de programare


Descrierea sintaxei cu ajutorul diagramelor de sintaxă
Orice limbaj de programare se caracterizează prin sintaxă şi semantică.
Sintaxa limbajului este dată de totalitatea regulilor de scriere corectă(însensul acceptării sale de programul
traducător(compilator) care are rolul de a converti programul în cod maşină pentru a fi executat). Dar un program
corect din punct de vedere sintactic nu este neapărat un program bun. Certitudinea sintactică este numai o cerinţă a
programelor, tot aşa cum pentru a fi campion mondial la alergări este necesar să nu ai picioarele amputate. Cel mai
greu este ca programul să execute întocmai ce şi-a propus cel ce l-a realizat. Prin semantica unui limbaj se înţelege
ce anume realizează fiecare instrucţiune a sa.
Sintaxa este formalizată perfect din punct de vedere matematic dar nu acelaşi lucru se întâmplă şi cu
semantica. Sintaxa poate fi descrisă cu ajutorul diagramelor de sintaxă. Aceasta nu reprezintă singura formă de
descriere a sintaxei unui limbaj(mai există de exemplu, forma BNF), dar se remarcă prin faptul că sunt sugestive.

81
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

În ce constă o descriere cu ajutorul diagramelor de sintaxă? Să presupunem că dorim să descriem riguros cum arată
un număr în baza 16. dacă folosim o descriere în genul un număr în baza 16 are în componenţa sa cifre şi litere,
cifrele pot fi de la 0 la 9 iar literele a,b,c,d,e,f,A,B,C,D,E,F şi dăm câteve exemple, nu suntem suficient de riguroşi.
Imediat pot apărea întrebări de genul: A reprezintă un număr în baza 16? Mai mult dacă dorim să facem un
program care să recunoască dacă un număr citit este sau nu în bază 16, situaţia se complică.
Se observă că o astfel de schemă are un nume(în cazul nostru cifra hexazecimală). Pentru a putea obţine o
cifră trebuie să urmez un drum prin acest desen(în matematică se numeşte graf orientat), de la intrare(din dreptul
numelui) până la ieşire, urmând sensul săgeţilor. Problema se poate pune şi invers: fiind dat un caracter oarecare să
se precizeze dacă este sau nu cifră. Caracterul este cifră dacă în diagrama prezentată există un drum care trece
printr-un cerculeţ ce reprezintă caracterul. Acum am definit riguros cifraÎn noua diagramă apare un dreptunghi în
care este scris cuvântul cifră. Dreptunghiul se utilizează atunci când se foloseşte o noţiune ce a fost definită printr-
o diagramă de sintaxă. Orice drum folosit în acest desen(de la intrare la ieţire) obţinem sau o cifră sau una din
literele care pot face parte din structura unui număr hexa:

În esenţă, într-o diagramă de sintaxă putem întâlni următoarele simboluri grafice:


 cercuri – încadrează anumite simboluri speciale;
 elipse – încadrează cuvinte rezervate(nu pot fi folosite în alt context);
 dreptunghiuri – încadrează elemente definite prin alte diagrame de sintaxă.
 Săgeţi – indică sensul de parcurgere a diagramei.
Orice drum de la intrare la ieşire din diagramă reprezintă o construcţie sintactică corectă.
Ne-am putea întreba care este motivul unei descrieri atât de riguroase? Un program scris într-un limbaj de
programare trebuie tradus de programul numit compilator în cod maşină. În primul rând programul trebuie să fie
corect din punct de vedere sintactic(altfel nu poate fi tradus). Verificarea corectitudinii nu este un lucru simplu
(există foarte multe forme de programe). Din acest motiv, verificarea se face după reguli care trebuie descrise
foarte clar, iar această descriere este realizată de diagramele de sintaxă.

82
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

4.2 Elemente de bază ale limbajului Pascal


4.2.1 Vocabularul limbajului

Vocabularul oricărui limbaj este format din:


 setul de caractere;
 identificatori;
 separatori;
 comentarii.
Setul de caractere Reprezintă ansamblul de caractere cu ajutorul cărora se poate realiza un program
Pascal. Acesta este alcătuit din:
 litere mari şi mici ale alfabetului englez(A=Z,a-y);
 cifrele sistemului de numeraţie zecimal(0-9);
 caractere speciale: +,-,*,/,=,^,<,>,(,),[,],{,},., ,,:,;,#,$,@,_, şi blank(spaţiu).

83
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

4.2.2 Identificatori
Un identificator este o succesiune de litere sau cifre sau caracterul special’_’ din care primul caracter nu
poate fi cifră. Cu ajutorul identificaorilor se asociază nume constantelor, variabilelor, procedurilor etc.
Exemple de identificatori: a1, tasta, un_numar.
Exemple eronate: 4ar, mt& (primul începe cu o literă , al doilea conţine un caracter nepermis). O categorie
specială de identificatori este dată de cuvintele cheie ale limbajului(au un înţeles bine definit şi nu pot fi folosite în
alte context).
Acestea sunt:
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNCTION,GOTO,IF,IN,LA
BEL,MOD,NILL,NOT,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,OF,OR,ORIGIN,OTHERWISE,PA
CKED,THEN,TO,TYPE,UNTIL, VAR,WHILE,WITH.

Citiri, scrieri
Să analizăm programul de mai jos, care citeşte un număr întreg(pe care noi îl introducem de la tastatură)
şi îl tipăreşte:
program c1;
var a:integer;
begin
read(a);write(a)
end.
În cazul în care introducem numărul 10, calculatorul va tipării 10, dacă introducem 16, calculatorul va
tipării 16 ş.a.m.d.
Citirea datelor se face cu ajutorul procedurii READ şi READLN. În acest paragraf sunt prezentate aceste
proceduri într-o formă mult simplificată. Pentru amănunte, vezi fişier text. Procedura READ are forma
READ(var), unde var are semnificaţia de variabilă(variabile de tip boolean şi enumerare nu se citesc). Se citeşte de
la tastatură o dată care se depune în variabila var. Procedura READLN se foloseşte exact ca READ, cu deosebirea
că, după citire, cursorul sare pe linia următoare a ecranului.
Scrierea datelor se face cu ajutorul procedurii WRITE şi WRITELN. În ambele cazuri se scrie începând
cu poziţia curentă a cursorului pe ecran. Diferenţa între WRITE şi WRITELN este aceea că, după scriere, prin
utilizarea procedurii WRITE cursorul rămâne după ultimul caracter scris, iar prin utilizarea procedurii WRITELN
el sare pe prima poziţie a liniei următoare.
Exemple:
WRITE (a), unde a este o variabilă care conţine numărul 3 - scrie 3 începând din poziţia curentă a
cursorului.
WRITE (a,b), unde a şi b sunt variabile întregi care au conţinuturile 2, respectiv 3 - va avea ca efect
scrierea numărului 2 urmat de numărul 3 (apare 23).
WRITE (‘a=’,a) - are ca rezultat scrierea şirului de caractere ‘a=’urmat de data reţinută de variabila
întreagă a.
Presupunem că b este o variabilă reală (care reţine numere reale) şi conţine numărul 3.25 WRITELN
(b:4:2) va determina apariţia pe monitor a numărului 3.25. Cifra 4 are semnificaţia de număr total de poziţii pe care
să se scrie numărul real, iar cifra 2 numărul de poziţii pe care să se scrie partea zecimală (în absenţa acestor
parametri, data reală se va scrie într-o formă greu inteligibilă).În situaţia in care partea întreagă a datei reale nu
încape în formatul prestabilit, nu se mai ţine cont de acest format.
O utilizare specială o au instrucţiunile readln şi writeln fără parametri. Să analizăm programul de mai
jos.Acesta tipăreşte numărul 6 (se poate tipări un număr în acest mod). Observăm că programul se termină cu
instrucţiunea readln. Ce rol are ea? După ce un program îşi încheie execuţia, se revine în mod automat în mediul în
care se găseşte textul sursă. Rezultatele se pot vizualiza tastând ALT + F5. Pentru ca revenirea să nu se facă
automat (să avem timp să vedem rezultatul), vom utiliza instrucţiunea readln fără parametri. Efectul? Se va aştepta
să se tasteze Enter. În acest timp, avem posibilitatea să vedem ce s-a tipărit.
program c2
begin
writeln(6)
readln;
end.
Programul de mai jos tipăreşte numerele 6 şi 7. Între cele două numere există un rând liber. De ce? Pentru
că am utilizat writeln. Instrucţiunea writeln fără parametri are rolul de a determina saltul cursorului pe rândul
următor.
program c3;
begin

84
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln(6);
writeln; {se sare un rând}
writeln (7)
end.

4.2.3 Constante
Constante
Constantele Pascal reprezintă valori care pot fi conţinute de un program scris în acest limbaj (nu sunt citite
de program). Ele folosesc în cadrul diverselor expresii (numerice, logice, şiruri de caractere) sau pentru scrierea
unor mesaje. Exemplu: În program trebuie realizată atribuirea y:=2*x+1. În acest caz, 2 şi 1 sunt constante.

Constantele corespunzătoare tipurilor standard sunt:


constante întregi;
-constante reale;
constante şir de caractere;
constante simbolice.
Diagrama de sintaxă care descrie noţiunea de constantă este:

Constantă întreagă

Constantă reală
Constantă
Sir caractere
Constantă simbolică

Constante întregi. Sunt alcătuite dintr-o submulţime a numerelor întregi care pot fi reprezentate în memoria
calculatorului.
Observaţie: Nu se pot reprezenta în calculator numere oricât de mari sau oricât de mici (orice număr ocupă
un spaţiu în memoria internă a calculatorului). Prin utilizarea limbajului Turbo Pascal se pot reprezenta numere
întregi cuprinse în intervalul [-2.147.483.648, 2.147.483.647].
Numerele se pot reprezenta în baza 10 sau în baza 16 (mai rar utilizată). Pentru baza 16, numărul este
precedat de caracterul special ‘$’.
Exemple: 32, -164, +131, $a1.
Cifră
Constantă
întreagă
Cifră
hexazecimală
Constante reale. Sunt alcătuite dintr-o submulţime a numerelor reale (mai precis a numerelor raţionale) care
pot fi reprezentate în calculator. Numerele se găsesc în intervalul [3.4*10-4932, 1,1*104932]. În locul virgulei se
foloseşte punctul Exemple: 2.34, -45.26, 512E+23, -45.1E-3.
Ultimele două numere folosesc o scriere neîntâlnită în matematică. Ele reprezintă numerele 512*1023 şi -
45.1*10-3.

Constantă
reală cifră cifră

cifră

Constante şir de caractere. După cum reiese şi din denumire, cu ajutorul lor se reprezintă şiruri de caractere.
Caracterele de şir pot fi specificate enumerându-le între apostrofuri sau se pot preciza prin codul lor ASCII,
precedat de caracterul #.

85
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Exemplu: #1$2 sau, echivalent (în baza 16), #$1#$2


‘abc’
‘abc’#10#13

caracter
Sir
caracter
e Constantă
întreagă

Constante simbolice. Acestea sunt constante care au n program un anumit nume. Numele dat acestor
constante poate fi standard (de exemplu: false, true, maxint) sau dat de utilizator atunci când defineşte constantele.
Definirea constantelor simbolice precede definirea tupurilor utilizator şi se realizează astfel

const
identificator = expresie;
identificator = expresie;

Observaţie. Expresiile care intervin în definirea constantelor trebuie să poată fi evaluate la momentul
compilării programului.

Exemplu.
const NrMaxValori = 30;
Dim = NrMax Valori*2-1;
Mesaj = ‘Nu exista solutie’#10#13'
PI = 3.14;

Prin utilizarea constantelor simbolice, programatorul are posibilitatea de a asocia nume sugestive unor
valori, ceea ce măreşte considerabil lizibiltatea programului. În plus, în cazul în care o astfel de valoare trebuie
modificată (de exemplu: în cazul în care beneficiarului programului îşi schimbă cerinţele), actualizarea
programului se reduce doar la modificarea valorii din declaraţia constantei simbolice şi nu presupune înlocuirea
vechii valori din întreg programul.

4.2.4 Tipuri de date

86
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Tipuri de date, tipuri standard


În paragraful anterior am văzut faptul că o variabilă poate reţine date de un anumit tip. De
exemplu, anumite variabile pot reţine numere întregi, altele numere reale (la informatică asta
înseamnă numere cu zecimale). Se pune întrebarea: cum are programatorul posibilitatea să
stabilească natura datelor care pot fi memorate de variabile? Mecanismul este următorul: atunci
când se declară o variabilă se precizează tipul ei.
Prin tip de date se înţelege:
mulţime de valori;
regulă de codificare a lor (modul în care se reprezintă în memorie);
mulţime de operaţii definite pe mulţimea valorilor.

Spunem că variabilele au un tip standard dacă acesta este recunoscut de către compilator, fără a
fi definiti în prealabil de programator. Vom vedea ulterior că există posibilitatea ca programatorul
să-şi definească propriile tipuri, pentru ca apoi să declare variabile de tipul definit de el. Limbajul
Turbo Pascal conţine următoarele tipuri de standard:
1. tipuri întregi;
2. tipul caracter;
3. tipul logic;
4. tipuri reale.
Acestea vor fi studiate în continuare.

Tipuri întregi

Tipul shortint.
Mulţimea valorilor este dată de numerele întregi cuprinse între -128, 127. Pentru memorare, se
foloseşte un singur octet, iar un număr se memorează în cod complementar. Operaţiile sunt cele
de la tipul integer. Datele sunt memorate în cod complementar.
Tipul integer.
Mulţimea valorilor este dată de numerele întregi cuprinse între - 32768, 32767. Pentru memorare,
se folosesc doi octeţi, iar un număr se memorează în cod complementar. Datele sunt memorate
în cod complementar.
Tipul longint (întreg lung).

87
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Mulţimea valorilor este dată de numerele întregi cuprinse între -2l47483648 şi 2147483647.
Pentru memorare, se folosesc 4 octeţi iar un număr se memorează în cod complementar. Datele
sunt memorate în cod complementar.
Tipul byte.
Mulţimea valorilor este dată de numerele naturale cuprinse între 0 şi 255. Pentru memorare, se
foloseşte un octet, iar un număr se memorează în binar. Datele sunt memorate în binar.
Tipul word.
Mulţimea valorilor este dată de numerele naturale cuprinse între 0 şi 65535. Pentru memorare se
folosesc doi octeţi, iar un număr se memorează în binar. Datele sunt memorate în binar.
Declararea variabilelor de unul din tipurile întregi se face ca mai jos:
var a,b:integer;
c:word;
d,e,f:longint;
Variabilelor (operanzilor) de tip întreg li se pot aplica mai mulţi operatori.
Operanzilor de tip întreg li se pot aplica şi operatorii pe biţi (lucrează asupra biţilor din
reprezentarea internă a numărului). Aceştia sunt tot cei logici, dar acţionează de această dată
altfel.
Operatorul NOT.
Acţionează asupra variabilelor în felul următor:
toţi biţii care reţin 1, vor reţine 0;
toţi biţii care reţin 0, vor reţine 1.
Exemplu: O variabilă de tip byte a reţine valoarea 11110000. După atribuirea a:=not a; variabila a
va reţine valoarea 00001111.
Operatorul SHL.
Este binar (are doi operanzi).
Are rolul de a deplasa la stânga conţinutul biţilor primului operand cu un număr de poziţii dat de
al doilea operand. Conţinutul primilor biţi se pierde, iar ultimii biţi vor reţine 0.
Exemplu. O bariabilă de tip byte a reţine valoarea 10000110. După operaţia a shl 2; se obţine
00011000.
Observaţie. În cazul în care primul bit este 0, prin deplasare la stânga cu o poziţie (a shl 1)
valoarea se înmulţeşte cu 2.
Exemplu. O variabilă de tip byte a reţine valoarea 00000110(2)=6(10). După operaţia a shl 1; se
obţine valoarea 00001100(2) = 12(10).
Operatorul SHR.
Este binar şi are rolul de a deplasa la dreapta conţinutul biţilor primului operand cu un număr de
poziţii dat de al doilea operand. Conţinutul primilor biţi se pierde, iar ultimii biţi vor rămâne 0.
Exemplu. O variabilă de tip byte a reţine valoarea 10000110. După operaţia a shr 2; variabila a va
reţine valoarea 00100001.
Observaţie. Prin deplasare la dreapta cu o poziţie (a shr 1) se efectuează împărţirea întreagă la 2
(a div 2).
Exemplu. O variabilă de tip byte a reţine valoarea 00000110(2)=6(10). După atribuirea a:-a shr 1;
variabila a va reţine valoarea 00000011(2)=3(10).
Tipul caracter.

Calculatoarele nu lucrează numai cu numere. Ele reţin şi caractere. Din ce este alcătuită
mulţimea caracterelor?
Mulţimea caracterelor conţine:
literele mari şi mici ale alfabetului (a,b,...z, A,B,...Z);
cifrele sistemului zecimal (0,1,2,..9);
caractere speciale (!,$,%,?,. şi altele);
alte caractere.
În Turbo Pascal un caracter se notează între apostrofuri.
Exemple:’a’, ‘A’, ‘1’ (caracterul ‘1’ nu trebuie confundat cu numărul 1).
O variabilă de tip caracter reţine, la un moment dat, un singur caracter. Declaraţia unei variabile
de tip caracter se face ca în exemplul următor în care se declară două variabile a şi b de acest
tip:
Var a, b: char; (char înseamnă caracter).
Se citeşte variabila ch (de tip caracter) care, apoi, se tipăreşte. De asemenea se tipăreşte şi
caracterul 7. Cele două caractere sunt separate de un alt caracter şi anume caracterul spaţiu (şi
acesta este un caracter).

88
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

program c;
var ch: char;
begin
write(‘ch=’); readln (ch);
writeln (ch,’ ‘.’7')
end.
Tipuri reale
Variabilele de un tip real reţin numere cu zecimale. Exemple de astfel de numere: 6, 82, 9, 3, -8, 6.
În locul virgulei, în informatică se foloseşte punctul. Astfel, numerele de mai sus, vor fi
notate:6.82, 9.3, -8.6.
În Turbo Pascal există mai multe tipuri reale. O variabilă de un tip real reţine datele codificate în
virgulă mobilă (vezi anexa 2).
Tipul REAL.
Se reţin numerele reale care aparţin domeniului:
[-1,7*1038,-2,9*10-29]  [2,9*10-29, 1,7*1038]

Pentru memorare sunt folosiţi 6 octeţi şi se reprezintă cu precizie 11-12 cifre.

Tipul SINGLE.
Se reţin numere reale care aparţin domeniului:
[-3,4*1038,-1,5*10-45]  [1.5*10-45, 3,4*1038]

Pentru memorare sunt folosiţi 4 octeţi şi se reprezintă cu precizie 7-8 cifre.


Tipul DOUBLE.
Se reţin numere reale care aparţin domeniului:
[-1,7*10308,-5*10-324]  [5*10-324, 1,7*10308]

Pentru memorare sunt folosiţi 8 octeţi şi se reprezintă cu precizie 15-16 cifre.


Tipul EXTENDED.
Se reţin numere reale care aparţin domeniului:
[-1,1*104932,-3,4*10-4932]  [3.4*10-4932, 1,1*104932]

Pentru memorare sunt folosiţi 10 octeţi si se reprezintă cu precizie 19-20 cifre.


Tipul COMP.
Se reţin numere reale care aparţin domeniului:
[-9,2*1018,9,2*1018].

Pentru memorare sunt folosiţi 8 octeţi şi se reprezintă cu precizie 19-20 cifre.


Exemple:
var a, b: real;
c:comp;
d, e, f: extended;
Observaţie. Turbo Pascal admite două modele de lucru cu numere reale. Pentru a utiliza tipurile
reale single, double, comp şi extended trebuie să utilizaţi modelul 80x87 floating point. Deoarece
acesta nu este implicit, pentru a specifica utilizarea acestui model selectaţi din meniul Options al
mediului Turbo Pascal opţiunea Compiler, apoi activaţi cu tasta spaţiu opţiunea 8087/80287.
Acelaşi efect îl obţineţi incluzând la începutul programului directiva de compilare {$N+}.
Operatorii care acţionează asupra operanzilor de tip real sunt cei cunoscuţi:+,-.(,/ (ultimul este
pentru împărţire). Vezi 6.4. Programul de mai jos care citeşte o variabilă reală şi o tipăreşte în
două moduri:
program r;
var v: real;
begin
write (‘v’); readln (v);
writeln (‘v=’,v);
writeln (‘v=’,v:3:2);
end.
Să presupunem că citim numărul 3.35 (3,35 cum suntem obişnuiţi). Programul va tipări prima
dată 3.35000000000E+00 iar a doua oară 3.35. De fapt, de fiecare dată se tipăreşte acelaşi număr

89
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

însă înscris în forme diferite. Prima formă se numeşte formă normalizată sau formă ştiinţifică.
Pentru a regăsi numărul se procedează astfel: se înmulţeşte numărul aflat înaintea literei E cu 10
la puterea care este dată de numărul care urmează lui E (3.350...0x100 = 3.35).
Totuşi ne-am putea întreba care este logica faptului că există această formă (la prima vedere
chiar stupidă)? Trebuie ţinut seama de faptul că, în general, numerele reale nu se pot reţine
întotdeauna cu precizie în calculator (chiar numerele aflate între două valori). De exemplu, nu pot
fi reţinute cu precizie nici măcar numerele aflate între 1 şi 2. De ce? Fie numărul
1.6272625729383973235...9. Are prea multe zecimale. Există numere cu şirul zecimalelor infinit.
Atunci cum poate fi memorat un astfel de număr?
Se reţine o aproximaţie a sa. Acum putem răspunde la întrebare: forma normalizată tipăreşte
numărul cu precizia cu care a putut fi reţinut de calculator. Acesta este motivul existenţei sale.
Renunţând la ea, vom comanda calculatorului precizia cu care va fi tipărită valoarea respectivă.
Cum? Se poate utiliza formatul nr.:lg: zec, unde nr este numărul real pe care îl tipărim, lg este
numărul total de poziţii pe care se va tipări valoarea respectivă, iar zec reprezintă numărul de
zecimale care vor fi tipărite.
În program, am solicitat ca numărul să fie tipărit pe 3 poziţii din care ultimile două să fie
zecimale. S-a tipărit 3.35. Aţi observat, probabil, că numărul a fost tipărit pe 4 poziţii (şi punctul
ocupă o poziţie). Apare o neconcordanţă între cele afirmate. De ce?
Calculatorul va proceda astfel: va tipări întotdeauna numărul de zecimale cerut. În cazul în care
nu mai există poziţii care să permită tipărirea numărului întreg (ca în exemplu) nu se ţine cont de
lg. În cazul în care numărul poziţiilor pe care va fi tipărit numărul este mai mare decât cel
necesar, numărul va fi tipărit cu un număr de spaţii în faţă. Testaţi!

Tipul logic
Variabilele de acest tip pot reţine numai două valori: TRUE (adevărat) şi FALSE (fals). Pentru
declaraţie se foloseşte cuvântul boolean.

Exemplu: var gasit:boolean;

Reţinem următorul amănunt: conţinutul variabilelor de acest tip poate fi tipărit, dar nu poate fi
citit.
Tipuri ordinale
Am arătat că un tip de date conţine,în primul rând, o mulţime de valori(date).
Spunem că un tip de date este ordinal dacă:
 datele pot fi ordonate (crescător);
 fiecare dată din şirul ordonat al valorilor are:
o un succesor – valoarea care îl urează în şir (excepţie face ultima dată din şir);
o un predecesor – valoarea aflată imediat înainte în şirul ordonat (excepţie face prima
dată din şir).
Tipurile întregi sunt tipuri ordinale. Fie tipul integer ‚. Să considerăm o valoare a sa, numărul 123.
succesorul acestuia este numărul 124, iar predecesorul său este numărul 122. Evident, pentru fiecare valoare din şir
putem face un astfel de raţionament. De asemenea, pentru fiecare tip întreg (byte,longint etc.) se poate face un
astfel de raţionament.

Tipul caracter(char) este un tip ordinal. Am învăţat modul în care se memorează caracterele(pe un octet,
fiecare caracter se reprezintă printr-un număr natural, scris în baza 2, între 0 şi 255). Întrucât mulţimea numerelor
cu ajutorul cărora se memorează caracterele îndeplinesc condiţiile de mai sus, rezultă afirmaţia făcută. Exemplu.
Fie caracterul ’b’. Succesorul lui ’b’ este ’c’, iar predecesorul său este caracterul ’a’.
Tipul logic este un tip ordinal. Tipul logic are numai două valori true şi false. Este adevărată relaţia:
false<true. Prin urmare, succesorul valorii false este true, iar predecesorul valorii true este false.
Tipurile reale nu sunt tipuri ordinale. Evident, mulţimea valorilor acestui tip poate fi ordonată crescător. A
doua condiţie nu este îndeplinită. Să vedem de ce. Să considerăm o valoare oarecare(de exemplu, 0). Care este
valoarea reală care urmează şi este mai mare ? dacă veţi spune că această valoare este1, vă amintesc că este vorba
de valori reale (0<0.5<1). Atunci care? Orice valoare veţi găsi, vă arăt că există întotdeauna alta care este mai mare
ca 0 şi mai mică decât valoarea găsită de voi. Fie valoarea 0,00001. atunci găsesc valoarea 0,000001, care este mai
mică decât 0,00001 şi mai mare decât 0.
Pentru a obţine succesorul unei valori aparţinând unui tip ordinal se foloseşte funcţia succ cu forma
generală:

90
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

SUCC(valoare)
Pentru a obţine predecesorul unei valori aparţinând unui tip ordinal se foloseşte funcţia pred cu forma
generală:
PRED(valoare)
Analizaţi şi rulaţi programul de mai jos:
program ordinal1;
var a:integer;b:char;
begin
a:=0;
writeln(succ(a)); writeln(pred(a));
b:=’b’;
writeln(succ(b)); writeln(succ(a));
writeln(succ(false)); writeln(pred(true));
end.
O întrebare posibilă: care este succesorul celei mai mari valori din şir şi care este predecesorul celei mai
mici valori din şir? Răspunsul la această întrebare diferă în funcţie de tipul ordinal şi chiar de varianta
compilatorului.
De exemplu pentru tipul integer avem:
succ(32767)=-32768;
pred(-32768)= 32767.
Pentru tipul boolean avem:
succ(true)= true;
pred(false)=true.
Concluzia? În mod normal nu are sens problema pusă (oricum, este absurd să căutăm succesorul celei mai
mari valori din şir, la fel cum este absurd să căutăm predecesorul celei mai mici valori). Din acest motiv,
rezultatele prezentate nu sunt coerente.
Funcţia ord returnează numărul asociat unei valori a unui tip ordinal oarecare şi are forma generalăl:
ORD(valoare)
Ce înţelegem prin numărul asociat unei valori a unui tip ordinal? Răspunsul este diferenţiat de la un tip
ordinal la altul.
 pentru o valoare care aparţine unuia din tipurile întregi, funcţia ord returnează chiar numărul.
Astfel, ord(6)=6, rod(-5)=-5.
 pentru o valoare care aparţine tipului char, funcţia ord returnează codul caracterului respectiv.
 În cazul tipului boolean funcţia ord returnează următoarele valori:
o 0, pentru false;
o 1, pentru true.
Convingeţi-vă de cele prezentate rulând programul de mai jos:
program ordin;
var a:integer;
b:char;
begin
a:= -13;b;= ’a’;
writeln(ord(a));writeln(ord(b));
writeln(ord(false));writeln(ord(true));
end.

Tipuri ordinale definite de utilizator


Utilizatorul are posibilitatea să definească două tipuri de date ordinale:
 tipul enumerare;
 tipul subdomeniu.
Pentru definirea unui tip propriu se foloseşte următoarea declaraţie:
type nume_tip=definitie tip
unde:
 prin nume_tip înţelegem numele tipului;
 definiţia tipului este specificată fiecărui tip în parte.
Declaraţia tipurilor este plasată după declaraţiile de constante simbolice(dacă există)şi precede declaraţiile
de variabile.
Tipul enumerare.

91
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

A fost prevazut în limbaj în ideea de a scrie programe clare(care să fie uşor înţelese de o persoană care le
analizează). Ce-i drept, se pot scrie toate genurile de programe şi fără a-l folosi. toate genurile de programe şi fără
a-l folosi.
Un tip ordinal, se se defineşte prin scrierea mulţimilor din care este alcătuit. Numele valorilor pot fi
formate din litere şi cifre, dar orice nume trebuie să înceapă cu o literă.

În programul următor definim tipul timp. Acesta este format din 4 valori numite: dimineaţa, prânz, seara şi
noaptea. Tot aici, am declarat o variabilă de tip timp, căreia i-am atribuit o valoare.
program ordinal3;
type timp= (dimineaţa, prânz, seara, noaptea);
var a:timp;
begin
a:= dimineaţa;
end.
Observaţii:
 Valorile unui tip enumerare nu se citesc şi nu se tipăresc.
 Ordinul primei valori din şir este 0, următoarea valoare din şir are ordinul 1, următoarea are
ordinul 2 ş.a.m.d.
Tipul subdomeniu. Fiind dat un tip ordinal – numit tip părinte, putem construi un alt tip ordinal numit tip
subdomeniu al părintelui. Tipul subdomeniu conţine o submulţime de valori consecutive(în şirul crescător al
valorilor tipului părinte). Precizarea valorilor tipului subdomeniu se face după formatul următor:
valoare1..valoare2
unde:
 valoarea1 reprezintă prima valoare din submulţime(cu ordinul cel mai mic);
 valoarea2 reprezintă a doua valoare din submulţime(cu ordinul cel mai mare);
În programul de mai jos am definit următoarele tipuri de subdomeniu:
 TreiValori – subdomeniu al tipului enumerare Valori (definit mai sus) care conţine valorile
a,b,c;
 CifreNenule – subdomeniu al unui tip întreg şi conţine numerele naturale 1,2…9;
 Litere – subdomeniu al tipului char şi conţine caracterele ‘c’,’d’,…,’k’.
De asemenea , am declarat câteva variabile din fiecare tip şi i-am atribuit câte o valoare a tipului respectiv.
program test;
type Valori =(a,b,c,d);
TreiValori= a..c;
CifreNenule =1..9;
Litere = ‘c’..’k’;
var x: TreiVAlori; z: CifreNenule; z: Litere;
i: integer;
begin
i:=9;y:= i;z:= ‘e’; x:= b
end.
Observaţie. În cazul unui tip subdomeniu, ordinul oricărei valori este acelaşi cu ordinul în tipul părinte. Să
analizăm programul de mai jos:
program test;
type Litere = (a,b,c,d);
Lit = b..d;
var l:Lit;
begin
1:= b;
writeln(ord(1));
end.

Tipul Lit este un tip subdomeniu al tipului Litere. Ordinul valorii b este 1(acesta este ordinul ei din tipul
Litere.       
4.2.5 Variabile
Variabile. Declararea variabilelor

In lectiile precedente am definit si vehiculat deja cu ideea de variabila.

92
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Prin variabila se intelege o informatie (o data) a carei valoare se poate modifica pe parcursul executiei
unui program. Fiecarei variabile i se asociaza un identificator. Multimea de valori pe care o poate lua acea
variabila reprezinta tipul acelei variabile. O variabila se declara astfel: var identif_var : identif_de_tip;.
Cand avem mai multe variabile de acelasi tip, putem scrie: var v_1, v_2, v_3: tip;, iar cand avem si tipuri
mai multe, vom scrie ceva de genul:

var v_1, v_2, v_3: tip_1;


w_1, w_2, w_3: tip_2;
...................

Diagrama de sintaxa este data mai jos.

VA identificator : tip ;
R
:

 Atentie! In limbajul Pascal trebuie sa se declare toate variabilele si inainte de a fi folosite (in textul
programului). Exista cazuri cand variabilele pot fi declarate in unituri utilizate de un program, dupa cum veti
invata mai tarziu, in clasa a-X-a.
Fiecarei variabile declarate in program i se aloca un spatiu de memorie, dependent de tipul ei. Aceasta
alocare se face odata cu compilarea programului.
Cand am vorbit despre tipuri de date standard simple am dat exemple de declaratii de variabile.

 Atentie! Se pot defini si variabile initializate cu ajutorul lui const.


4.2.6 Operatori
Operatorii sunt de trei feluri:
 Operatori aritmetici;
 Operatori relationali;
 Operatori logici;
Exemple de operatori: +, *, >, etc.
Operatorii aritmetici sunt de doua feluri:
 Operatori unari(+ si - ~semnul unui numar);
 Operatori binari(+, -, *, div, mod).
Operatorii unari actioneaza asupra unui singur operand.Acesta poate fi o variabila sau constanata de tip
intreg. Operanziise gasesc intotdeauna in dreapta lor.
Operatorii binari actioneza asupra a doi operanzi.un operand se gaseste intotdeauna in stanga
operatorului, celalalt in dreapta sa.
 Operatorul + are semnificatia de adunare.Operanzi sai sunt de tip real sau intreg. Se poate ca
unul sa fie de tip intreg si celalalt de tip real. Daca cel putin unul din operanzi este real rezultatul
este real, altfel este intreg.
 Operatorul – are semnificatia de scadere.
 Operatorul * are semnificatia de inmultire.
 Operatorul / are semnificatia de impartire.Operanzii pot fi de tip real sau intreg dar rezultatul va fi
intotdeauna de tip real.
 Operatorul div are semnificatia de impartire intreaga. Operanzii sunt in mod obligatoriu de tip
intreg. De asemenea, fiecare operand trebuie sa fie separat cu cel putin un spatiu de operator.
 Operatorul mod are semnificatia de rest al impartirii pentru numere intregi.
Operatorii relationali sunt >, >=, <, <=, =. Toti operatoriirelationali sunt binari(actioneza asupra a doi
operanzi).Rezultatul aplicarii unui operator relationaleste intotdeaun o valoare logica (True sau False).
 Operatorul < arata daca este adevarata sau nu relatia a<b. In caz ca relatia este
adevarata rezultatul va fi True, altfel va fi False.
 Operatorul <= arata daca este adevarata sau nu relatia a<=b.
 Operatorul > arata daca este adevarata sau nu relatia a>b.
 Operatorul >= arata daca este adevatata sau nu relatia a>=b.
 Operatorul = arata daca este adevarata sau nu relatia a=b.

93
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Operatorii logici sunt not (negare), and (si), or (sau), xor (sau exclusiv). Cu exceptia operatorului not
care este unar,restul operatorilor sunt binari. Operanziipot fi de tip logic real sau intreg. In acest capitol
vom considera numai operanzide tip logic; in acest caz rezultatul va fi intotdeauna o valoare de tip
logic(true sau false).
 Operatorul not (negare). Modul de actiune se poate observa mai jos.
Not (True) =False;
Not (False)=True;
 Operatorul and (si).Regula de obtinerea rezultatului este: rezultatul este true
numai daca ambii operanzi au valoarea True (altfel rezultatul este false).
 Operatorul or (sau).Regula: daca unul dintre operanzi este true ,rezultatul va fi
true, altfel va fi false.
 Operatorul xor (sau exclusiv). Regula: daca argumentele sunt diferite rezultatul
este true, contrar el este false.

Prioritatea operatorilor

Operatorii au o anumita prioritate. De exemplu. Operatorul de inmultire are o prioritate mai mare decat
cel de adunare. Aceasta inseamna ca se executa intai inmultirea, apoi adunarea. Operatoriisunt
impartiti in 4 grupe,dupa priorutate. Astfel, operatoriidin grupa 1 au prioritatea cea mai mare,urmeaza
operatorii din grupa 2, grupa 3,iar la sfarsit cei din grupa 4. Iata cele 4 grupe de prioritate:
 Grupa 1 (operatori unari- prioritate maxima): not, + (operator unar) , -
(operator unar);
 Grupa 2 (operatori multiplicativi): and,*,/,div,mod;
 Grupa 3 (operatori aditivi): or,xor,+,-;
 Grupa 4 (operatori relationali- prioritate minima): <,<=,>,>=,=.

Operatori – reguli de prioritate si evaluare


LIMBAJUL PASCAL

Prioritate Operator Evaluare


1 () s→d
2 not+-sizeof( ) d→s
3 */div mod s→d
4 +- s→d
5 < <= > >= s→d
6 = <> s→d
7 and (si logic) s→d
8 xor s→d
9 or (sau logic) s→d
10 :=(atribuire) s→d

4.2.7 Structura programelor


Structura programelor Pascal
Să vedem cum arată cel mai simplu program Pascal:
program usor;
begin
end.
Programul de mai sus este corect, cu toate acestea el nu face nici o operaţie. Dacă îl analizăm, putem
trage primele concluzii:
 Orice program Pascal începe cu cuvântul program, uramat de numele programului (nume pe care
l-am ales pentru a-l ’boteza’);
 Orice program Pascal conţine cuvintele begin şi end;
 După numele programului punem ’;’(caracterul punct şi virgulă);

94
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Orice program Pascal se termină cu ’.’ (caracterul punct).


În exemplul nostru, programul se numeşte uşor.
Observaţie 1. La scrierea unui program nu are importanţă dacă folosim litere mari sau mici. De
exemplu, programul de mai sus ar putea arăta şi astfel(deşi nu este o formă elegantă de prezentare):
PrograM uSoR;
BeGin
End.
Observaţie 2. Nu are importanţă nici plasarea cuvintelor pe linie, nici spaţiile dintre ele.
Programul de mai sus poate fi scris şi aşa:
pRogrAm usor;BeGin End.

Aceasta nu înseamnă că este bine să procedăm astfel. Să ne imaginăm că avem în faţă un program
mare scris aşa. El poate fi rulat, dar care programator va mai înţelege ceva, dacă îl priveşte?
Observaţie 3. Versiunea Borland a limbajului permite ca secvenţa program nume să lipsească. De
exemplu putem scrie şi aşa:
begin
end.
Dacă suntem ordonaţi nu procedăm astfel. Un program scris în Pascal (oricât de complex ar fi) are
structura următoare:
program nume;
 definiţii de constante;
 definiţii de tipuri;
 declaraţii de variabile;
 declaraţii de subprograme;
begin
 instrucţiuni
end.
Nu este obligatoriu ca într-un program să figureze toate acestea, dar dacă figurează, trebuie să apară în
această ordine.

4.2.8 Comentarii
Separatori şi comentarii. Cele mai simple elemente alcătuite din caractere cu semnificaţie
lingvistică poartă denumirea de unităţi lexicale. Acestea se repetă între ele, după caz, prin unul sau mai
multe blancuri, caracterul CR, sfârşit de linie sau caracterul ’;’. Pentru ca un program să fie uşor de
înţeles se folosesc comentariile. Acestea se plasează oriunde în program. Un comentariu poate fi scris
în două feluri:
 între acolade, exemplu: {un comentariu}
 între paranteze rotunde urmate de *, exemplu (*un comentariu*).

4.2.9 Expresii
<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Clase de precedenta a operatorilor:
1. Operatorii unari + si -
2. Operatorul unar NOT
3. * DIV / MOD AND SHR SHL
4. + - OR XOR * (intersectie) + (reuniune) - (diferenta)
5. < <= > >= = <> IN

O expresie este fie o constanta, fie o variabila, fie un apel de functie, fie o combinatie
corecta (din punct de vedere sintactic) de expresii mai simple.
“Combinarea” se realizeaza cu ajutorul operatorilor. Elementele care se combina se
numesc operanzi. In general, se lucreaza cu expresii algebrice, in care regulile de formare sunt
aceleasi ca si in matematica, insa, dupa cum am mai spus, expresiile se scriu liniarizat. Pot
exista,de asemenea,si expresii nenumerice,cum ar fi de pilda:’Turbo’+’Pascal’,aici simbolul +
reprezentand alipirea (concatenarea) celor doua siruri de caractere.Rezultatul este sirul
‘TurboPascal’.

95
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Atentie! Expresiile sunt foarte importante in instructiunile de atribuire, despre care am


vorbit deja. Vom reveni asupra instructiunii de atribuire la inceputul urmatorului capirol.
In cadrul expresiilor algebrice, o mare importanta o au prioritatile operatorilor:

Prioritate Operator

1 (maxima) NOT, +, - (operatori unari)

2 AND, *, /, DIV, MOD, SHR, SHL (operatori multiplicativi)

3 OR, XOR, +, - (operatori aditivi)

4 (minima) =, <>, >, <, <=, >=, IN (operatori relationali)

 Atentie! In cazul in care am dori ca intr-o expresie sa schimbam ordinea de executie a


operatiilor, se pot folosi paranteze rotunde (nu si patrate sau acolade!).
Se pot folosi oricate perechi de paranteze rotunde.
Astfel, de exemplu se scrie 1/(2*a), si nu ½*a, pentru expresia care ar fi echivalenta cu
expresia 1/2/a.

 Atentie! O alta eroare ce poate surveni in scrierea unei expresii este urmatoarea: daca a, b
si c sunt valori intregi, de pilda, expresia (a>b) and (b<c) nu este echivalenta cu expresia a>b
and b<c, deoarece aceasta din urma este incorecta, fiindca mai intai se efectueaza operatia pe
biti: b and b si expresia isi pierde sensul!

In continuare prezentam diagramale de sintaxa pentru notiunea de expresie.

expresie
+

termen operator aditiv


-
termen

termen
factor operator multiplicativ

factor

Un factor este fie un numar fara semn, fie o constanta sau o variabila, fie un identificator
de functie avand ca argument o alta expresie (intre paranteze), fie un alt factor precedat de
operatorul unar NOT.
Erori frecvente in scrierea expresiilor

1. Uitam sa punem semnul inmultirii.


Exemplu: Avem de calculat 1+ab (a si b sunt variabile intregi sau reale). Am folosit intentionatnotatia cu care suntem
obisnuiti la matematica. Unii vor scrie 1+ab in loc de 1+a*b. Aceasta este o eroare pentru ca ab este un simbol nedefinit
(se presupune ca ab este o variabilasau o constanta care nu a fost definita corespunzator).
2. Nu scriem corect numitorul.
Exemplu: E=1/xy, unde x, y sunt valori reale ,diferite de 0. Daca scriem 1/x*y se va evalua (1/x)*y=y/x. Corect este
1/(x*y). In acest fel ,se calculeaza la inceput produsul dintre x si y , apoi se imparte1 la acest produs.
3. In cazul expresiilor care contin o suma (diferenta) atat la numarator cat si la numitor, nu se scrie
numaratorul (numitorul)intre paranteze.
Exemplu: E=(a+b)/(c+d) unde a, b, c, d variabile reale si c+d<>0. Unii vor scrie a+b/c+d, altii a+b/(c+d). Corect este
(a+b)/(c+d)

96
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

4. dorim sa verificam daca variabilele a, b si c indeplinesc relatia: a<=b<=c. Relatia nu se transcrie


automat.Corect se va scrie (a<=b) and (b<=c)

Tipul expresiilor

La evaluarea unei expresii se obtine un rezultat.Tipul rezultatului stabileste tipul expresiei.


Astfel, daca in urma evaluarii se obtine un rezultat de tip integer, expresia este de tip integer. Daca
rezultatul este true sau false atunci aepresia este de tip logic. Tipurile expresiilor sunt determinate de
tipurile de operanzi si de operatorii aplicati in cadrul expresiei. Astfel ,avem expresii de tipul:
 intreg;
 real;
 logic;
 sir;
Exemple:
 4>2 este o expresie de tip logic;
 1+2 este o expresie de tip integer;
 1.3+ 3 este o expresie de tip real;

4.2.10 Atribuirea
Sintaxa instructiunii de atribuire
LIMBAJUL PASCAL
id_variabila:=valoare/expresie;
Precizare: Tipul variabilei trebuie sa coincida
cu tipul valorii/expresiei.
Prin operatia de atribuire se retine o anumita data dintr-o variabila. Ea are mai multe forme ,pe
care le vom prezenta pe rand.
Forma1.
V:=data
Semnificatia este urmatoarea:
 V este numele unei variabile de un tip oarecare;
 := notatia pentru operatia de atribuire;
 data – o valoare de un tip oareacare.
Cu o singura exceptie ,tipul variabileitrebie sa coincida cu tipul valorii atribuite. Exceptia este
urmatoarea: unei variabile de tip real i se poate atribui o data de tip intreg.
Real d;
D:=7;
Forma 2
V1:=v2; unde v1 si v2sunt nume de variabile. Cu o exceptie , tipul celor doua variabile
trebuie dsa coincida. Efectul este ca variabila v1 va retine continutul variabilei v2. Dupa aplicarea
acestei operatii,continutul variabilei v2 ramane nemodificat, iar continutul variabilei v2 se pierde.
Observatie: Nu este indiferentmodul de scriere a variabilelor in cadrul atribuirii. Atribuirea a:=b
nu este identica cu b:=a. Este adevarat ca , dupa atribuire ,cele doua variabile vor avea acelasi continut.
Insa este important ce continut( al lui b dupa prima atribuire, al lui a dupa a doua).
Forma 3
V:=expresie;

97
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Initial se evalueaza expresia, iar valoarea obtinuta este atribuita variabilei v. Consideram ca daca
cel putin unul din operanzi este real, tipul expresiei este real si poate fi atribuit doar unei variabile de
tip real,iardaca toti operanzii sunt intregi, tipul expresiei este intreg si poate fi atribuit unei variabile de
tip intreg sau real. Facem conventia ca operatorul da intot deauna un rezultat de tip real,chiar daca
ambii operanzi sunt intregi.
Exemplu: Fie c o variabila de tip integer care retine numarul 4 si d o variabila de tip real care
contine numarul 7.3. Efectuam atribuirea d:=c+1. Dupa atribuire continutul lor va fi: c=4;d=5.
Explicatie: Am vazut ca este posibil ca unei variabile de tip real sa-i atribuim o valoare
intreaga. Este normal sa fie asa pentru ca multimea numerelor intregi este submultome a numerelor
reale.

Exista multe moduri in care putem gresi atunci cand acriem o instructiune de atribuire. Vom
incerca totusi o sistematizare a erorilor.
Eroare 1.Gresim scierea expresiei.
Orice atribuire contine o expresie (fie ea si redusa la un singur operand). Evident, daca nu am scris
corect expresia , nici atribuirea nu se poate efectua. Exemplu: Fie a o variabila de tip integer. Scriem
atribuirea; a:=1+3(4+5). Expresia este gresita (lipseste operatorul de inmultire ). Prin urmare,atribuirea
este imposibila. Corect este a:=1+3*(4+5).
Eroare 2.Tipul variabilei nu coincide cu tipul expresiei, chiar daca expresia este scrisa
corect.Erorile de acest tip apar foarte des.
Fie atribuirea c:=9,unde c este o valoare de tip string.
La ce foloseste atribuirea ? Atribuirea are un rol urias in programare. Sa inceracam o sistematizare
a cazurilor cand folosim atribuirea.
o Intializari.
Stabilirea valorilor cu care anumite variabile intra in calcule se numeste initializare. Initializarile se
fac cu ajutorul instructiunii de atribuire.
o Calcule.
Majoritatea programelor efectueaza calcule. In afara tiparirii imediate a rezultatului evaluarii unei
expresii, exista si posibilitatea dca acesta sa fie pastrata intr-o variabila. In astfel de cazuri se foloseste
operatia de atribuire. Exista doua forme in care atribuirea intervine in calcule.
Forma directa. Unei variabile i se atribuie o expresie cu operanzivariabile, constante, altii
decat variabila care va retine rezultatul. Dupa atribuire, toti operanzii raman nemodificati.
Exemplu: Fie a, b, c trei variabile de tip integer, care contin, respectiv, valorile 2, 3, 4. Se
efectueaza atribuirea a:=b*c. Inurma atribuirii, continutul celor trei variabile devine: a=12, b=3, c=4.
Forma indirecta. Unei variabile i se atribuie o expresie cu operanzi variabile, constante, in
care intra si valoarea pe care o retine variabila careia i se face atribuirea. Revenim la exemplul
anterior (aceleasi variabile cu aceleasi valori initiale). Efectuam atribuirea a:=a+b*c. Iata ce retin cele
trei variabile: a=14, b=3, c=4.
o Copiere. De multe ori, este necesar ca o valoare retinuta de o variabila sa fie retinuta si de alta. O
simpla operatie de atribuire ne rezolva problema de mai sus. De exemplu, daca x si y sunt douia variabile de tip real
care retin doua valori oarecare, is dorim ca variabila x sa retina valoarea pe careo retine y, efectuam atribuirea x:=y.
Atentie! Dupa atribuire, continutul variabilei ramane neschimbat.

98
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Un caz particular, dar des intalnit in programare este interschimbarea continutului a doua variabile
(evident de acelasi tip).
Fie variabila de tip integer x care retine valoare 1 si variabila de tip integer y care retine valoarea 2.
Dorim sa inversam continutul celor doua variabile, adica x sa retina 2 si y sa retina 1. Se cere ca
secventa sa ramana valabila indiferent ce valori ar retine x si y.
Pentru rezolvare, folosim si o alta variabila pe care o notam m. Ea are rolul unei variabile
auxiliare (nu se foloseste decat ca sa realizam interschimbul de valori). Iata pasii de lucru:
 Variabila m va prelua valoarea retinuta de y; m:=y;
 Y va prelua valoarea retinuta de x; y:=x;
 X va prelua valoarea retinuta de m; x:=m.

4.2.11 Citirea /scrierea datelor


Citirea si scrierea datelor
Prin operatia de intrare se intelege preluarea unei date de la un dispozitivde intrare catre memoria
de intrare a calculatorului ,in zona de memorie rezervata pentru aceasta, adica in variabila.
Dispozitivele de intrare pot fi tastatura ;o unitate de discheta; o unitate de disc, etc.
Programul nostru va calcula aria unui cerc in functie de lungimea razei cercului:

program CalculArie;

const pi=3.1415926;
var raza, aria: Real;
begin
raza:=2;
aria:=pi*Sqr(raza;
end.

El are doua parti: primele trei randuri reprezinta zona declaratiilor, iar instructiunile dintre
begin si end. zona actiunilor, adica partea operativa.
Daca pornim in executie acest program (in mediul Turbo Pascal), vom observa ca palpaie
putin ecranul, dar nu se intampla nimic. E si normal. Calculatorul a atribuit valoarea 2 variabilei raza.
A calculat aria (obtinand o anumita valoare) si gata. Noi nu am precizat prin nimic sa ni se comunice
rezultatul. De aceea va trebui sa folosim o procedura de extragere a datelor, de scriere a lor pe ecran.
Dar, chiar daca am dispune de o asemenea procedura, rezultatul programului ar fi acelasi la
orice executare a sa. De aceea, ar fi bine sa putem introduce de la tastatura raze de diferite valorui; deci
am avea nevoie de o procedura de citire a datelor. Aceste proceduri exista in limbajul Pascal:

a) Proceduri de citire a datelor (eu scriu – calculatorul citeste):

 ReadLn (v1, v2, . . . , vn) – citeste variabilele v1, . . . , vn, introduse de la tastatura. Variabilele
pot fi de orice tip invatat pana acum, mai putin Boolean sau un tip enumerare (sau un subdomeniu
al unui astfel de tip). Introducerea mai multor variabile se poate face daca acestea se separa prin
spatii sau <Enter>. La sfarsit trebuie apasata tasta <Enter>. Cursorul trece pe randul urmator.
Procedura ReadLn va citi si sfarsitul de linie (caracterul Enter).
 Read(v1, v2, . . . , vn) – la fel ca ReadLn, doar ca nu citeste sfarsitul de linie.

Atentie! Datele citite se depun, de fapt, intr-o zona tampon, inainte de a fi date variabilelor.
Aceasta zona tampon se goleste cand apare ReadLn. De aceea, un apel simplu ReadLn (fara
argumente) va avea drept efect golirea acestei zone tampon. Astfel, apelul ReadLn (x, y, . . . ) este
echivalent cu secventa Read (x, y, . . . ); ReadLn.
Daca variabilele ar fi avut alte valori inaintea apelului procedurii de citire, ele se pierd.
Valorile citite ale acestor variabile raman neschimbate pana la rpima atribuire sau (re)citire a lor.

99
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

b) Proceduri de scriere a datelor (calculatorul scrie – eu citesc):

 Write(e1,e2, . . .,en) – evalueaza si apoi afiseaza valorile expresiilor e1, e2, . . ., en. Expresiile
pot fi inclusiv de tipul Boolean, caz in care se afiseaza unul din cele doua cuvinte (False sau True),
dar nu pot fi de tip enumerare. Dupa afisarea valorilor unor expresii, acestea nu se pierd si nici nu
se schimba.
 WriteLn(e1,e2, . . .,en) – face acelasi lucru, dar la sfarsitul intregii afisari, muta cursorul pe
randul urmator. De exemplu, pentru a citi raza vom scrie: ReadLn(raza), iar, dupa calculul ariei,
aceasta se afiseaza prin: Write(aria). Putem scrie direct Write(pi*Sqr(raza)), efectul fiind acelasi.
Observatie

In lista argumentelor procedurilor Write si WriteLn, expresiile pot fi urmate de un format de


afisare, astfel: e:m:n, unde e este expresia de afisat, iar m si n sunt expresii cu valori intregi:
 m reprezinta numarul de pozitii ecran pe care sa se afiseze; daca valoarea de afisat necesita mai
mult de m pozitii, atunci m este ignorat;
 n reprezinta numarul de zecimale cu care se doreste scrierea valorii expresiei e (daca este de tip
real), in reprezentarea fara exponent.
Daca valoarea de afisat necesita mai putin de m pozitii, afisarea se va face cu spatii in fata, pana la
ocuparea tuturor celor m pozitii.
Un exemplu este dat in programul urmator.

Exemple:

Fie declaratiile de variabile: var a: Integer; s: String;. Fie urmatoarea secventa de program:
a:=20; ReadLn(a,s); WriteLn(a,s); Write(s+’s’); in cazul introducerii valorilor 3 si alfa, se realizeaza
urmatoarele: a primeste valoarea 20; dupa citire, a isi pierde valoarea initiala (20) si devine 3.

Erori frecvente:

Unii incepatori sau cunoscatori ai limbajului BASIC cred ca se poate face o citire in felul
urmator: ReadLn(‘Dati n=”,n); iar altii nu sesizeaza diferenta intre un sir si valoarea identificatorului
corespunzator: ReadLn(‘n’).
Sa rescriem programul nostru folosind noile proceduri invatate:

program CalculArie;

const pi=3.1415926;
var raza, aria: Real;
begin
ReadLn(raza);
aria:=pi*Sqr(raza;
WriteLn(aria)
end.

Pornind de la acest program se intampla urmatoarele:


 apare cursorul si noi introducem o valoare, de exemplu 2;
 se afiseaza foarte rapid o alta valoare, insa sub o forma ciudata:1.25663704000035E+0001.
(??!!??) (pentru a vedea ce s-a afisat, se va apasa Alt+F5.). Este vorba despre formatul
stiintific de afisare a valorilor reale; valoarea de mai sus se interpreteaza ca fiind
1.25 . . . . .x101. Pentru a afisa o expresie de m pozitii, din care n pozitii pentru partea
zecimala, vom scrie: Write(e:m:n). De exemplu Write(aria:7:3) va afisa, cu un spatiu in fata:
12.566. O pozitie a fost ocupata de punctul zecimal, trei de cele trei zecimale cerute, doua de
partea intreaga (12), iar un spatiu a fost pus in fata pentru a obtine totalul de 7 pozitii.

 Atentie! Daca se afiseaza un numar intreg sau un sir de caractere, n trebuie sa lipseasca.

Cu aceasta inlocuire programul devine mai “bun”, dar tot nu satisface urmatoarele cerinte:
 sa se ceara explicit sa introducem raza;

100
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 sa se spuna ca rezultatul pe care il afiseaza este aria cercului de raza data.


De aceea vom scrie programul de mai jos.

program CalculArie;
{ acest program calculeaza aria unui cerc in functie de raza sa }
const pi=3.1415926;
var raza, aria: Real;
begin
WriteLn(‘Program de calculat aria cercului’);
WriteLn(‘********************************’);
Write(‘Dati raza=’);ReadLn(raza);
aria:=pi*Sqr(raza);
WriteLn(‘Aria este=’, aria:7:3)
end.
Acum lucrurile stau mai bine, insa ne mai deranjeaza doua lucruri:
 trebuie sa apasam Alt-F5 pentru a vedea rezultatul programului;
 raman pe ecran “urme” care deranjeaza, de la executia programelor anterioare.
Pentru a solutiona prima problema se va folosi un apel al procedurii ReadLn fara parametri,
inainte de instructiunea end finala. Aceasta instructiune va astepta sa apasam Enter, apoi va reveni in
mediul Turbo Pascal.

Observatie
Limbajul Pascal dispune de functia EoLn care testeaza daca s-a ajuns la citirea sfarsitului de
linie, caz in care returneaza True, sau nu, cind returneaza False. O astfel de functie se poate folosi
atunci cand se doreste prelucrarea de linii de caractere, cu dimensiuni variabile.

Program demonstrativ
Sa se citeasca mai multe linii de caractere de la tastatura si sa se afiseze fiecare linie, inlocuind
caracterele mici cu majusculele corespunzatoare. Prelucrarea se va incheia la aparitia caracterului ‘$’.
Pentru a transforma literele mici in litere mari se va folosi functia UpCase.

Program ConversieMinusculeMajuscule;
Var linie_vida,gata: Boolean; c:Char;
begin
Gata:=False;
While not gata do
begin
Write(‘Dati linia: ‘);
While not EoLn do
begin
Read(c);Write(UpCase(c));

linie_vida:=False;
if c=’$’ then gata:=True
end;
if linie_vida then WriteLn(‘Linia este vida!’)
else WriteLn
end.

4.4.12 Structuri de control


Instructiunile limbajului Turbo Pascal

Notiuni introductive
Inainte de a incepe prezentarea instructiunilor acestui limbaj , amintim conditiile in care a fost elaborat.
Limbajul a fost conceput special pentru scrierea de programe structurate

101
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Din acest motiv instructiunile reproduc structurile fundamentale ale programarii structurate.Exista si o exceptie si
anume intructiunea GO TO .
Motivul includerii acesteia in setul de instructiuni ale limbajului este acela de a permite programatorilor obisnuiti
sa lucreze nestructurat , folosirea acestui limbaj a fost introdusa pentru a permite programatorilor sa scrie programe
BASIC in PASCAL.

De atribuire
IF
Compusa
Vida
CASE
WHILE
REPEAT
FOR
WITH
Procedurala

1. Din fericire , autorul limbajului este de formatie matematician , fapt ce a permis sa realizeze
urmatoarele:

 Definirea riguroasa (matematica) a sintaxei limbajului;


 Mari posibilitati de extindere a tipurilor de date;
 Introducerea instructiunilor vide , cu mari consecinte asupra programelor
2. Limbajul a fost conceput sa fie unul didactic (introducerea in programare se face cu ajutorul lui in multe
universitati)

Instructiunea vida

Din punct de vedere sintactic , intructiunea vida nu este formata din nici un element iar din punct de vedere
semantic , nu are nici un efect.
Rolul sau este foarte mare , in special cand instructiunea vida este subordonata altor instructiuni .
Sa analizam programul urmator:

Program nimic;
Begin
;
;
end.

Desi nu face nimic ,programul este corect sintactic , adica nu da eroare la compilare pentru ca
intructiunile sunt separate prin caracterul “;” .

Instructiunea de atribuire

Este de forma: v:=expresie , unde v este numele unei variabile.


Principiul de executie este urmatorul:
 Se evalueaza expresia
 Variabila v ia aceasta valoare
Regula fundamentala este urmatoare: tipul expresiei trebuie sa coincida cu tipul variabile v.
Exemple:
1. x:=3 ; x:=x+2 , unde x este variabila detip integer sau real
2. a:=i<j unde a este o variabila de tip boolean , i,j variabile de tip real. Se evalueaza expresia logica i<j . Daca
valoarea lui i este mai mica decat valoarea lui j atunci a:=true , in caz contrar a:=false
Erori:

102
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

i:=i+a unde i este variabila de tip integer iar a de tip real.In acest caz expresia este de tip real iar variabila i este de
tip integer. La compilare apare un mesaj de eroare (type mismatch).
i:=i/2 unde i:integer .
Cu toate ca rezultatul ar putea fi de tip integer daca i este par , forma nu este permisa pentru ca
expresia este de tip real. Corect ar fi trebuit scris i:=i div 2.
In diagrama de sintaxa prezentata mai jos , apare si indentificatorul de functie. Astfel de atribuiri vor fi prezentate
in capitolul care trateaza subprogramele PASCAL.

IDENTIFICATOR
(VARIABILA)

INSTRUCTIUNE EXPRESIE
:
DE ATRIBUIRE
=

IDENTIFICATOR
(FUNCTIE)

Exemplul 1. Programul p1 interschimba continutul a doua variabile care au fost citite . La sfarsit , se afiseaza
noul continut al variabilelor.

Program p1;
Var a,b,c:integer;
Begin
Write(‘a=’);readln(a);
Write(‘b=’);readln(b);
c:=a;
a:=b;
b:=c;
writeln(‘a=’,a);
writeln(‘b=’,b);
end.

Exemplul 2:
Se citesc doua valori intregi a,b.Se cere sa se afiseze media lor aritmetica .

Program media ;
Var a,b:integer;
medie:real;
Begin
Write(‘a=’);readln(a);
Write (‘b=);readln(b);
medie:=(a+b)/2;
writeln(‘media este’,medie:5:2);
end.

Exemplul 3.Se citesc trei numere naturale .Se cere sa se afiseze primul numar ,suma dintre primul si al
doilea,suma primelor trei numere.
Program suma;
Var s,nr:integer;
Begin
s:=0;
Write(‘dati numarul’);
Redln (nr);
s:=s+nr;
writeln (s);

103
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

write(‘dati numarul’);
readln (nr);
s:=s+nr; writeln(s);
write(‘dati numarul’);
readln (nr);
s:=s+nr; writeln (s);
end.

4.2.12.1 Structuri alternative


Instructiunea IF

Aceasta instructiune corespunde structurii alternative.Instructiunea IF are doua forme: IF THEN ELSE si IF
THEN.Instructiunea se scrie astfel:
IF “expresie logica” THEN “instructiune 1”
ELSE “instructiune2”
Principiul de executie este urmatorul:
 se evalueaza expresia logica;
 daca aceasta ia valoarea TRUE se executa instructiunea plasata dupa THEN , in caz contrar se executa
instructiunea plasata dupa ELSE.

Atentie:

Atat dupa THEN cat si dupa ELSE avem voie sa punem doar o singura instructiune.

Forma IF THEN . Aceasta instructiune se scrie sub forma:

IF “expresie logica”THEN”instructiune”
Principiul de executie este urmatorul:
 se evalueaza expresia logica;
 in situatia in care aceasta are valoarea TRUE se executa instructiune aflata dupa THEN , in caz contrar se
trece la instructiunea urmatoare.
Iata si diagrama de sintaxa care defineste instructiune IF :

Instructiunea EXPRESIE INSTRUCTIUNE


IF I Then
F LOGICA

Else INSTRUCTIUNE

 Operatia de decizie este if. Iata care este forma ei generala:



 If expresie logica then operatie
 Else operatie
 endif


 Modul de executie este urmatorul:
 1.)Se evalueaza expresia logica;
 2.) Daca expresia logica produce valoarea true, se executa operatia aflata dupa then , altfel (daca
expresia logica ia valoarea false) se executa operatia aflata dupa else.
 Observatie: Decizia consta in a alege o operatie sau alta spre a fi executata ( in nici un caz amandoua). Sa dam
un exemplu: se citesc doua numere intregi a si b. Se cere sa se tipareasca cel mai mare dintre ele.
 Integer: a,b;

104
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Read a;
 Read b;
 If a>b then write a
 Else write b
 Endif
 In primul rand, se evalueaza expresia logica. In exemplul nostru ea este a>b. In cazul in care numarul retinut
de variabila a este mai mare decat cel retinut de variabila b, expresia logica ia valoarea true si setipareste a.
Contrar, expresia logica ia valoarea false si se tipareste b.
 Avem posibilitatea ca una sau ambele operatii subordonate operatiei if sa fie tot operatie (operatii if) if.
Exemplu: se citesc 4 valori reale a, b, c, d. Sa se evalueze expresia:

 a+b, c+d>0

 E= a-b, c+d=0

 a*b, c+d<0
 Exemplu numeric. Fie a=1, b=2, c=3, d=4. Avem c+d=7>0, rezulta ca se va tipari a+b=1+2=3. Analizati
algoritmul care urmeaza:
 Real a, b, c, d, rez;
 Read a, b, c, d
 If c+d>0 then rez:=a+b
 Else if c+d=0 then rez:=a-b
 Else rez:=a*b
 Endif
 Endif
 Write rez
 Daca suma c+d nu este mai mare decat 0, rezulta ca este mai mica sau egala cu 0. Din caest motiv,clauza else
a primului if va contine o alta operatie if in urma careia se va decide daca c+d=o sau c+d<0 (pentru care nu
mai facem testul c+d<0).

 O problema interesanta este si aceasta: daca algoritmul impune ca instructiunea care urmeaza cuvantului cheie
then, sau cea care urmeaza cuvantului cheie else sa lipseasca –cum procedam?
 Principiul de executie:
 Se evalueaza expresia logica;
 In cazul in care acesta are valoarea true, se executa operatia aflata dupa then, altfel se trece la operatia
urmatoare.
 Exemplu. Se citeste o valoare intreaga. In cazul in acre aceasta este para( se imparte exact la 2) se va citi
mesajul “am citit un numar par”. Altfel, programul nu va da nici un mesaj.
 Integer nr;
 Read nr;
 If nr mod 2=0 then write(‘am citi un numar par’)
 Endif
 Cum putem gresi?
 O eroare des intalnita este asa numita eroare a testului inutil. Reluam exemplul in care evaluam expresia:


 a+b, c+d>0

 E= a-b, c+d=0

 a*b, c+d<0
 Unii scriu instructiunea if (corespunzatoare) astfel:
 If c+d>0 then rez:=a+b:5
 Else if c+d=0 then rez:=a-b
 Else if c+d<0 then rez:=a*b
 Endif
 Endif

105
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Endif
 Daca c+d>0 nu este adevarat, inseamna ca este mai mic sau egal cu 0, si daca nu este 0, este in mod sigur
strict mai mic decat 0. Nu are rost sa facem un test suplimentar. Calculatorul nu gandeste, il face, programul
functioneaza corect, dar se pierde timp inutil de calcul.

 Am lasat in mod intentionat la sfarsit erorile care apar in scrierea expresiilor logice. De multe ori se greseste
in scrierea expresiilor logice care contin operatori relationali si operatorul logic not.
 Exemple. Fie expresia logica a>b. Cum o negam? Daca scriem not a>b nu este corect. De ce? Operatorul not
are cea mai mare prioritate. Prin urmare, se va evalua mai intai not a, apoi se va face comparatia. Corect se
scrie not(a>b) ( es compara a cu b, se obtine true sau false, iar rezultatul se neaga).
 Fie x si y doua variabile logice. Avem formulele(de Morgan):
 not (x or y)=not x and not y
 not (x and y)=not x or not y
 Demonstram prima formula:
 daca x=false,y=false → x or y= false →not(x or y)=true; tot asa not x=true, not y=true, not x and not y=true
 daca x=false, y=true →x or y=true →not(x or y)=false; tot asa not x=true, not y=false →not x and not
y=false
 daca x=true ,y=false →x or y= true →not ( x or y)=false; tot asa not x=false, not y=true →not x and not
y=false
 daca x=true, y=true →x or y=true →not (x or y)=false; tot asa not x=false, not y=false →not x and not
y=false
 Sa presupunem ca ne intereseaza sa es execute o operatie atunci cand la citirea a doua valori intregi a si b nu
sunt amandoua strict pozitive.
 Corect este: not((a>0) and (b>0)). Dar tot corect este su asa: not(a>0) or not(b<0)

Exemplul 1 .Programul care urmeaza calculeaza maximul dintre doua numere:


Program max;
Var a,b:integer;
Begin
Write(‘a=’);redln (a);
Write (‘b=’);readln (b);
If a>b then writeln (a)
Else writeln(b);
End.

Exemplul 2. Se citesc 3 variabile reale a,b,c.sa se calculeze:

E:=a+b
E=:a*b
E:=a-b
c>0,c=0,c<0

Programul p3, care rezolva aceasta problema,exemplifica folosirea unei instructiuni IF,plasata in corpul unei alte
instructiuni IF.
Program p3 ;
Var a,b,c,e :real;
Begin
Write(‘a=’);readln (a);
Write (‘b=’);readln (b);
Write(‘c=’);readln (c);
If c>0 then e:=a+b
Else if c=0 then e:=a*b
Else e:=a-b;
Writeln(‘e=’,e:3:2);
End.
Exemplul 3.Se citeste o valoare intreaga.In cazul in care aceasta este para (se imparte exact la 2),se va afisa
mesajul”am citit un nr.par”.altfel programul nu va da nici un mesaj.
Program if2
Var nr:integer;

106
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Begin
Write (‘nr=’);readln (nr);
If nr mod 2=0
Then writeln (‘am citit un nr par’);
End.

4.2.12.2 Instructiunea compusa


Se pune urmatoarea problema :cum procedam in situatia in care la utoilizarea instructiunii IF dupa THEN urmeaza
sa scriem mai multe instructiuni (aceeasi problema apare daca dorim sa scriem mai multe instructiuni dupa
ELSE).Pt. a putea scrie mai multe instructiuni care sa fie interpretate de compilator ca una singura se foloseste
instructiunea compusa.
Instructiunea compusa are forma urmatoare:
Begin
I1;
I2;
:
:
In
End
Exemplul 1.Sa se scrie un program care rezolva ecuatia de gradul 1(a*x+b=0).
Program p2;
Var a,b, x :real;
Begin
Write (‘a=’);readln(a);
Write(‘b=’);readln(b);
If a<>0 then
Begin
X:=-b/a;
Writeln(‘x=’,x:3:2)
End
Else
If b=0 then writeln (‘infinitate de solutii’)
Else writeln(‘nu avem solutii’);
End.(‘nu avem solutii’);
End.
INSTRUCTIUNEA CASE

Forma generala a instructiunii CASE este:


CASE expresie ordinala OF
C1, [c2,…,Cn1]: instructiune1;
P1,[p2,….pn2]:instructiune 2;
Z1, [z2,….,Znp]:instructiune p
[ELSE instructiune]
END
 Aici C1,….,Cn1,….znp reprezinta constante de acelasi tip ca si expresia ordinala .principiul de executie
este urmatorul:
 Se evalueaza expresia ordinala ;
 Se executa acea instructiune care are in fata constanta obtinuta in evaluarea expresiei;
 In situatia in care nici una din instructiunile 1..p nu este precedata de acea constsnta , de axecuta
instructiunea plasata dupa ELSE;
 Daca si clauza ELSE este absenta , se trece la instructiunea urmatoare.
Instructiunea case

107
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Exemplul 1 Sa se scrie un program care rezolva ecuatia de gradul 1(a*x+b)


Program p2;
Var a, b ,x:real;
Begin
Write(‘a=’);readln(a);
Write(‘b=’);readln(b);
If a<>0 then
Begin
X:=-b/a;
Writeln (‘x=’,x:3:2)
End
Else
If b=0 then writeln(‘infinitate de solutii ‘)
Else writeln (‘nu avem solutii’)
End.

Observatie: orice program PASCAL are cel putin o instructiune compusa (incepe prin BEGIN si se termina prin
END).

Instructinea vida nu este vizibila in program .Totusi, prin faptul ca este admisa ca instructiune, apar multe
avantaje cum ar fi:
in cadrul instructiunii compuse, inte ultima instructiune si blocul END, sintaxa cere sa nu se puna
separatorul ‘;’.De multe ori ,din obisnuinta, programatorii pun chiar si in acest caz semnul ‘;’.
Compilatorul nu semnaleaza acest fapt ca eroare, intrucat se presupune ca intre separator si END se
gaseste instructiunea vida;

 se poate utiliza instructiunea IF sub forma :


 IF expresie logica THEN
 ELSE instructiune
 (dupa then urmeaza instructiunea vida)

Observatii:
 Constantele trebuie sa fie distincte;
 Pot exista cel mult 255 constante;
Exemplu:Programul care urmeaza probeaza instructiunea case.
Program c1;
Var I:integer;
Begin
Write (‘I=’);readln(I);
Case I of
1: writeln(‘am citit 1’);
2, 3: writeln(‘am citit 2 sau 3’);
else writeln(‘am citit altceva’)
end;
end.
4.2.12.3 Instructiuni repetitive
Instructiunea WHILE

108
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Aceasta instructiune reproduce structura de tip WHILE DO. Forma generala este :WHILE expresie logica
DO instructiune.Principiul de executie este urmatorul :
 Se evalueaza expresia logica si in caz ca aceasta are valoarea TRUE se executa instructiunea , se evalueaza
din nou expresia ,daca aceata are valoarea TRUE se executa din nou unstructiunea ;procedeul continua ,pana
cand, la evaluarea expresiei ,se obtine FALSE.
 In situatia in care este necesar sa se execute mai multe instructiuni cand expresia a luat valoarea TRUE, se fol.
Instr. Compusa .
 Diagrama de sintaxa a instructiunii WHILE este :

Instructiunea Expresie logica


while while do instructiune

Exemplul 1: se citeste n, nr.nat.Sa se calculeze suma cifrelor sale.


Program p6;
Var n, s:integer;
Begin
Write (‘n=’);readln(n);
S:=0;
While n<>0 do
Begin
S:=s+n mod 10;n:=n div 10
End;
Writeln(‘s:=’,s)
End.

Exemplul 2. Se citeste n ,nr nat .Sa se afiseze nr. Obtinut prin invresarea cifrelor sale .
Program p7;
Var n, ninv:integer;
Begin
Write (‘n=’);readln(n);
Ninv :=0;
wile n<>0 do
begin
ninv :=ninv*10+n mod 10;
n:=n div 10
end;
writeln (‘nr.inversat =’,ninv);
end.

Instructiunea REPEAT
Aceasta instructiune reproduce structura REPEAT UNTIL si are forma generala:
REPEAT
I1;
I2;
I3;
:
:
In
UNTIL expresie logica
Aici,I1,I2,…..,In reprezinta instructiuni.
 Principiul de executie este urmatorul:
Se executa secventa de instructiuni;
Se evalueaza expresia logica
Daca aceasta ia valorea FALSE se executa din nou secventa de instructiuni,contrar se trece mai departe.

Iata cum arata instructiunea REPEAT prezentata cu ajutorul diagramei de sintaxa:

Instructiunea repeat
repeat instructiune unti Expresie
l logica

109
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Observatie: secventa se executa cel putin o data, dupa care se pune problema daca sa se repete sau nu.
Exemplul 1 Se citeste un nr. Natural n,mai mare sau egal cu 1. Sa se calculeze suma
primelor n numere naturale.
Program suma ;
Var n, s,I:integer;
Begin
Write(‘n=’);readln(n);
I:=1;
S:=0;
Repeat
S:=s+I;
I:=I+1
Until I>n;
Wrieln (‘s=’,s)
End.

Exemplul 2:Se citeste n, nr.nat.Sa se descompuna in factori primi.

Program p10;
Var n, d,fm:integer;
Begin
Write(‘n=’);readln(n);
D:=2;
Repeat
Fm:=0;
While n mod d=0 do
Begin
Fm:=fm+1
n:=n div d
end;
if fm<>0 then writeln(d,’la puterea’,fm);
d:=d+1
untiln=1
end.

Instructiunea FOR
Atunci cand cunoastem de cate ori se executa o secventa este bine sa se utilizeze instrucitunea FOR.Ea are doua
forme .Iat-o pe prima:
For variabila:= expresie 1 to expresie2 do instructiune unde:
 Variabila poate fi de orice tip ordinal
 Expresie1, expresie2 sunt exoresii de acelasi tip cu variabila.
Principiul de executie este urmarorul:
Pasul 1.Se evalueaza cele doua expresii.
Pasul 2.
2.1Daca valoarea obtinuta in urma evaluarii expresiei1 este strict mai mare decat valoarea obtinuta in urma
evaluarii expresiei 2, executia FOR este incheiata;
 Daca valoarea obtinuta in urma evaluarii expresiei1 este egala cu valoarea obtinuta in urma evaluarii
expresiei2, se atribuie variabilei de ciclare valoarea obtinuta in urma evaluarii expresiei1 se executa
instructiunea subordonata si executia FOR este incheiata;
 Daca valoarea obtinuta un urma evaluarii expresiei 1 este strict mai mica decat decat valoarea obtinuta in
urma evaluarii expresiei 2, se atribuie variabilei de ciclare valoarea obtinuta in urma evaluarii expresiei 1si se
trece de la 1 la 2.
 Daca valoarea retinuta de variabila de ciclare este strict mai mica decat valoarea obtinuta in urma evaluarii
exoresiei 2 se aduna 1 variabilei de ciclare si se trece la 2.2

110
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 Daca valoarea retinuta de variabila de ciclare este egala cu valoarea obtinuta in urma evaluarii expresiei 2,
executia instructiunii FOR se incheie.
 Sa ana lizam progamul urmator:
Pasul 1. La evaluare obtinem:3 pt. Expresie1 si 2 pt. Expresie 2.
Pasul 2. 3>2,deci executia FOR este incheiata >Valoarea finala pt. I va fi o(valoare initiala ).
Program f1;
Var I: integer;
Begin
I:=0;
For I:=3 to2 do writeln (I);
Writeln (‘valoarea finala pentru I’,I);
End.

Analizam programul f2:


Pasul 1/La evaluare obtinem:3 pt expresie 1 si 3 pt. Expresie 2
Pasul 2.3=3,deci I:=3 se executa instrucitunea subordonata care afiseaza valoarea 3 si executia instructiunii for este
incheiata.Valoarea finala a variabilei I este 3.
Program f2;
Var I;integer;
Begin
I:=0;
For I:=3 to 3 do writeln (I);
Wrieln (‘valoarea finala pentru I’,I’);
End.

Analizam al treilae program de test.


Pasul 1.La evaluare obtinem:1 pentru expresie 1 si 3 pentru expresie2
Pasul21.1<3,I:=1;
Pasul 2.2 Se executa instructiunea subordonata (se afiseaza 1);
Pasul 2.3 Valoarea retinuta de variabila de ciclare este 1 si 1<3, deci I va lua valuarea 2.
Pasul 2.2 Se executa unstructiunea subordonata(se afiseaza2);
Pasul 2.3Valoarea retinuta de variabila de ciclare este 2 si 2<3,deci I va lua valoarea 3.
Pasul 2.2 Se executa instructiunea subordonata(se afiseaza 3);
Pasul 2.3Valoarea retinuta de variabila de ciclare este 3 di 3=3,deci executia for este incheiata.

Valoarea finala pt. I este 3.


Program f3;
Vari:integer;
Begin
I:=0;
For I:=1 to 3 do writeln(I);
Writeln (‘valoarea finala pt I’,I);
End.

Program f4 arata cum se foloseste FOR in cazul unei variabile de ciclare de tip CHAR.In program de listeaza
literele alfabetului inte ‘a’ si’k’.
Program f4;
Var I:char;
Begin
For I:=’a’ to ‘k’ do writeln(I);
End.

Programul f5 demonstreaza faptul ca instructiunea FOR functioneaza si pt. Variabile logice.Programul afiseaza
cele doua variabile logice(FALSE si TRUE).
Program f5;
Var I: false to true do writeln (I);
End.

Programul f6 ne demonstreaza faptul ca instructiunea FOR admite expresii in sensul general .Astfel ,dupa
evaluare se va obtine –5.Programul va afisa toate numerele intregi intre –5 si 10.De aoci o concluzie:variabila de

111
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

ciclare poate lua si valori negative.


Programf7;
Var I, j, k:integer;
Begin
I:=5;j:=10;
For k:=I-j to j do writeln (k);
End.

Programul f8 demonstreaza faptul ca EXPRESIE1,EXPRESIE2 se evalueaza numai la inceputul executiei


instructiunii FOR.In program se listeaza nr.nat.cuprinse intre 5 si 10.Observam faptul ca instructiunea for
subordoneaza o instructiune compusa.La randul ei, aceasta este alcatuita din alte doua instructiuni:una de afisare a
variabilei de ciclare, alta prin care se aduna 1 la continutul variabilei j.Dar variabila j a participat laevaluarea
expresiei 2.Daca,in timpul executiei instructiunii for, s-ar fi comparat valoarea curenta a variabilei de ciclare cu
variabila j, programul nu s-ar fi terminat(pt. ca de fiecare data limita superioara se mareste).Nu se intampla asa
pt.ca evaluarea celor doue expresii care alcatuiesc limitele de ciclare se face la inceput).

Program f8;
Var I,j,k:integer;
Begin
I:=5,j:=10;
For k:=1 to j do
Begin
Writeln (k);
J:=j+1
End
End.

Programul f9 arata o modalitate de ‘’iesire din ciclu’’.Ce intelegem prin aceasta?Atunci cand un grup de
instructiuni se executa un mod repetat spunem ca se executa un ciclu.Atunci cand se iese din ciclu inainte ca
instructiunile sa se execute de cate ori a fost stabilit initial,spunem ca s-a iesit fortat din ciclu.In loc de ciclu, unii
folosesc cuvantal sinonim numit’’bucla’’

Program f9;
Var I,j,k:integer;
Begin
I:=5;j:=10;
Fork:=I to j do
Begin
Writeln (k);
K:=10;
End;
End.

O astfel de modalitate de lucru nu este induicata .Ea nu respecta principiile programarii structurate.Exista
posibiltatea sa ne incurcam atuncu cand urmarim un astfel de program.De astfel, daca in programul de mai sus in
loc de k:=10 am fi facut atribuirea k:=12 (incercati) programul ar fi ciclat.CE intelegem prin ciclare ?Daca un ciclu
nu se termina (instructiunile se executa la infinit )spunem ca programul ‘’cicleaza’’.De ce daca am efectua
atribuirea k:=12programul ar cicla?Simplu.Pt. ca un urma comparatiei intre valoarea retinuta de variabila de
ciclare si valoarea obtinuta la evaluarea exoresiei 2 nu ar fi egalitate.Concluzia:in instructiunea sibordonata
instructiunii FOR , nu se fac atribuiri variabilei de ciclare.Respectand aceasta regula evitam multe erori
ascinse.Daca totusi din greseala programam un ciclu infinit pt. a termina executia se tasteza ‘’CTRL+
PAUSE’’.Asta daca nu lucram sub Windows.In acest dun urma caz se tasteaza ‘’CTRL+ALT+DEL’’.
Am aratat faptul ca exista 2 forme ale instructiunii FOR.Pana in prezent am studiat prima forma
.Prezantam acum forma 2.
FOR VARIABILA:=EXPRESIE1 DOWNTO EXPRESIE2 DO INSTRUCTIUNE
Toate notatiile au aceasi semnificatie ca la forma 1.D.dvdr sintactic , forma 2 contine in loc de cuv.
Cheie TO, cuv.DOWNTO.La executie,continutul variabilei de ciclare scade ,la fiecare pas ,cu 1.In
programul f10 se listeaza numerele 5,4,3,2,1.
Program f10;
Var I:=integer;

112
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Begin
For I:=5 downto1 do writeln (I);
End.

In programul f11 se listeza alfabetul in ordine inversa.


Program f11;
Var I:char;
Begin
For I:=’z’ downto’a’ do writeln(I);
End.

Cum putem gresi?


Analizamprogramul f12.Credeti ca el va afisa numerele intre 1 si 5?Nu.Va afisa numai 5.De ce?
Dupa DO am pus caracterul’,’.In acest caz instructiunea FOR subordoneaza instructiunaea vida . Aceasta a fost
instructiunea care a fost executata in ciclu.Dupa executia unstructiunii FOR am listat valoarea variabilei de ciclare
i.Normal ,s-a listat 1. A elimina eroarea inseamna sa stergem caracterul mentionat.
Program f12;
Var I:integer;
Begin
For I:=1 to 5 do;
Writeln (I)
End.

Program f13 da eroare de sintaxa.Am fi dorit sa calculam suma 0.1+0.2+0.3.Dar am uitat faptul ca variabila de
ciclare nu pote fi reala.
Program f13;
Var I,s:I:real;
Begin
S:=0;
For I:=0.1 to o.3 do s:=s+I;
Writeln(s:5:2)
End.

Programul f 14 are o greseala .Variabila de ciclare este untreaga dar expresie2 este de tip real.Am invatat faptul ca
tipurile pt. expresie1, expresie2, si variabila de ciclare trebuie sa coincida.
Program f14;
Var I,k:integer;
Begin
K:=10;
For I:=1 to k/2 do writeln (I)
End.

Aplicatii

Exemplul 1.Se citeste n(nr nat).Se cere sa


se efectueze suma primelor n nr Program f 16;
Var I:integer;
nat.Exemplu:pt. n=3,S=1+2+3=10. S:real;
Program f15; Begin
Var I,n,s:integer; S:=0;
Begin For I:=1 to 9 do
Write(‘n=’);readln(n); S:=s+i/10;
S:=0 Writeln(‘s=’,s:5:2)
For I:=1 to n do s:=s+I; End.
Writeln(‘suma primelor ‘,n,’numere naturale
este ;,s)
End. Exemolul 3.Se citeste n numar natural.Se
cere sa se calculeze suma:
Exemplul2.Sa se calculeze suma:S=0,1+0,2+…… S=1+1*2+1*2*3+……….
+0,9. +1*2*..*n

113
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Program f17; Exemplul 5.Sa se afiseze toate numerele


Var I,s,p,n:integer; naturale mai mici sau egale cu 10000
Begin care se pot descompune in doua moduri
Write(‘n=’);readln (n);
S:=0;p:=1;
diferite ca suma de cuburi.
For I:=1 to n do
Begin Program p11;
P:=p*I; Var n, max, nr, I,j,i1,i2,j2,j1:integer;
S:=s+p Begin
End; For n:=1 to 10000 do
Writeln(‘s=’,s) Begin
End. Max:= trunc (exp(1/3*1n(n));
Nr:=0
Exemplul 4.Se citesc n numere intregi.Se For I:=1 to max do
For j:=I to max do
cere sa se afiseze cel mai mare numar Forj:=I to max do
citit.De exemplu, pentru n=4 si numerele If i*I +I*j*j*j=n then
–7,9,2,3 se va afisa 9. Begin
Program f 19; If nr=0 then
Var I, max,n,nr:integer; Begin
Begin I1:=I;j:=j
Write(‘n=’);readln (n); End
Write(‘nr=’); readln (max); Else
For I:=2 to n do Begin
Begin 12:=I;j2:=j
Write (‘nr=’);readln(nr); end;
If nr>max then nr:=nr+1;
Max:=nr; end;
End; if nr=2 then writeln (‘n,’’,i1,’ ‘,j1,’ ‘,i2,’ ‘,j2)
Writeln(‘maximul este:’, max); end
End. end.

Prezentam instructiunea FOR cu ajutorul diagramelor de sintaxa.

4.3 Tipuri de date structurate


Tablouri
Tabloul in interpretare matematica
Fie Ani ={1,2,…,ni} multimea primelor ni numere naturale.Fie M=An1 X An2 X … XAnk
produsul cartezian a k astfel de multimi.
Se numeste tablou o functie f:MT, unde T este o multime oarecare.Numarul k este
dimensiunea tabloului.Daca k=1 tabloul se mai numeste si vector.Vectorul are n 1 componente.Daca k=2
tabloul se mai numeste si matrice.Matricea are n1 X n2 elemente.
Declarare: ARRAY[d1,d2,…,dn] OF tip_element
VAR

114
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

x:ARRAY[-10..10]; y:ARRAY[CHAR];
a:[BOOLEAN,1..10]; t:[operatii,1..10,BOOLEAN];
CONST I : ARRAY[1..2,1..2] OF BYTE = ( (1,0), (0,1) )
Referire elemente: x[1]; y[‘z’]; a[false,10]; a[false][10] t[creare,5,true]

Exemple:
1. Vector cu 5 componente numere naturale
V = (1,3,6,2,4 )
Aici k=1,n1 =5,T=N, elementele vectorului sunt v1=1,v2=3,…,v5=4.
2.Vector cu n componente reale
Z=(z1, z2,…,zn), zi real, i=1,n
Aici k=1,n1 =n,T=R.

MASIVE UNIDIMENSIONALE(vectori)
Sunt puţine programele în care nu apar definite masive unidimensionale.Problemele de
ordonare a şirurilor, de calcul a indicatorilor statistici medie şi dispersie ,programele pentru găsirea
elementului minim şi multe altele presupun stocarea valorilor numerice ale şirurilor în zone de
memorie ,care se întâlnesc în practică sub denumirea de vectori.
Definirea :
X: array[ 1..10] of integer;
se specifică:
- x este o dată compusă din 10 elemente;
- elementele sunt de tip întreg;
- primul element al structurii este x[1] , al doilea element este x[2]
- ultimul element este x [10]
Modelul grafic

x1 x2 ... xi ... x10


D(xi)
X
- Se defineşte funcţia lg(x, tip)=

Dacă funcţia lg(a; b) se defineşte pentru tipurile standard prin


lg(x;b) = lg (. ;b) = k
unde k- lungimea standard alocată la compilare pentru o dată de tipul b şi
lg(x1,x2…xn;b) = lg(x1;b) + lg(x2;b) +…… lg(xn;b) =
= lg( . ;b) + lg( . ;b) +…… lg( . ;b) =
= kb+ kb+…………………. kb= n* kb
rezultă că : lg(x, integer) = 10* 2 bytes
Din modelul grafic prezentat mai sus se observă că
dist (x[i],x[i+1]) = lg (x[i],integer) =2
deoarece elementele ocupă o zonă de memorie contiguă
Dacă elementul x[i], este considerat reper (baza), adresele celorlalte elemente se calculează
folosind deplasarea faţă de elementul reper .
Funcţia deplasare:
Depl (a;b)
va permite calculul deplasării lui a faţă de b

depl( x[i +k], x[i]) =(i + k- i) * lg (. ,integer) = k * lg (. , integer)


depl( x[i], x[i +k]) = -k * lg (. , integer)

115
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

sau
depl( x[i +k], x[i]) = adr( x[i+k]) - adr (x[i]);
Dacă X reprezintă structura de date omogene în totalitatea ei, iar x 1,x2…….x10 sunt părţile care o
compun, din reprezentarea grafică rezultă că:
adr(x) = adr (x[1])

Se defineşte:
adr(a+b) =adr(a) + (b-1) * lg (. , integer) ;
unde:
- a este numele datei structurate;
- b este poziţia elementului a cărui adresă se doreşte a fi calculată;
adr(a + b) = adr( b+ a)
Din calcule de adrese rezultă că:

adr (x[n]) - adr(x[1])


--------------------------- + 1 = n
lg (x[1])
Contiguitatea poate fi pusă în evidenţă prin definirea funcţiei de distanţă, care indică numărul de bytes
neaparţinători ai datelor a şi b şi care separă data a de data b
În programe, se specifică numărul maxim al componentelor vectorului, avându-se grijă ca în
problemele ce se rezolvă,numărul efectiv să nu depăşească dimensiunea declarată.
Exemplu:
…………………………..
var x:array [1..10] of integer;
n:integer;
……………………………
read(n);
for i:=0 to n do x[i]:=0;
se identifică următoarele inexactităţi:
- pentru i= 0 se încearcă iniţializarea componentei x[0],,componentă care nu este definită;
pornind de la definirea adr(x+0)= adr(x) + (0-1)*lg(x,integer) vom obţine adresa cuvântului ce precede
x[1], care prin modul cum s-a efectuat alocarea poate fi adresa altei variabile, variabilă al cărei conţinut
va fi iniţialiyat cu 0
- pentru faptul că n nu este iniţialiyat cu o avloare cuprinsă între 1 şi 10 ,există posibilitatea ca
în cazul n= 15 adresa calculată să fie
adr(x+15) = adr(x) * lg (x, integer)
şi să corespundă unui cuvânt ce urmează cu mult mai departe ,cuvânt al cărui conţinut va fi zero
Prin parametrii compilării, se pot controla expresiile indiciale, astfel încât să fie incluse în
intervalul specificat în calificatorul array [e 1..e2] , evitându-se distrugerea necontrolată a operanzilor
adiacenţi masivului unidimensional.
Proprietatea masivelor unidimensionale, conduc la ideea stocării într-o zonă de memorie a
adresei unuia dintre termeni şi prin adăugarea sau scăderea unei raţii egale cu lungimea unui element,
se procedează la baleierea spre dreapta sau spre stânga a celorlalte elemente.
Datorită contiguităţii memoriei şi a regulilor de regăsire a elementelor, masivul unidimensional
nu conţine în mod distinct informaţii privind poziţia elementelor sale. Cunoscând numele masivului,
referirea elementelor se realizează specificând acest nume şi poziţia elementului cuprinsă între
paranteze drepte sub forma unei expresiii indiciale.
Localizarea unui element x[i], al unui masiv unidimensional, se face:
x[1]+ (i-1)*lungime_element
Atunci când se construiesc programe în care se definesc masive unidimensionale, alegerea
tipului, alegerea limitei inferioare şi a limitei superioare pentru variaţie, depind de contextul problemei şi
de formulele identificate prin inducţie matematică pentru explorare, folosind structuri repetitive.
De fiecare dată trebuie avută grijă ca numărul de componente ce rezultă la definire şă fie
acoperitor pentru problemele ce se rezolvă.

Pentru stabilirea numărului maxim de componente ale vectorilor ce pot fi definiţi, se consideră:
L - lungimea în bytes a disponibilului de memorie;
Lp - lungimea în bytes a necesarului de memorie pentru program ;
(instrucţiuni executabile şi alte definiri )

116
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

N - numărul de masive unidimensionale de tip T i, având acelaşi număr de


componente care apar în program;
X - numărul maxim de componente ale unui masiv

X = int (( L -Lp) / ( N * lg( . ; Ti ))


În cazul în care cele N masive au dimensiuni variabile d 1, d2…….dn , condiţia de utilizare
corectă a resursei memorie este ca:
d1+ d2+…….+dn <=int ( ( L- Lp ) / lg( . , Ti )

EXEMPLU:
{Se citesc n numere naturale intr-un program PR10;
vector.sa se calculeze media uses crt;
var i,n:byte;
aritmetica a acestora} A:array[1..20] of integer;
program media; aUX:integer;
uses crt; ORDONAT:BOOLEAN;
var i,n:byte; begin
a:array[1..50]of integer; clrscr;
s:integer;m:real; write('n=');
begin readln(n);
clrscr; for i:=1 to n do begin
write('n='); write('a[',i,']=');
readln(n); readln(a[i]);
for i:=1 to n do begin end;
write('a[',i,']='); repeat;
readln(a[i]); ordonat:=true;
end; for i:=1 to n-1 do
s:=0;for i:=1 to n do if a[i]>a[i+1] then begin
s:=s+a[i]; aux:=a[i];
m:=s/n; a[i]:=a[i+1];
write('media este',m:8:2); ordonat:=false;
readkey; end;
end. until ordonat;
writeln('sirul ordonat este');
{ Se da un vector cu n elemente.sa se for i:=1 to n do
ordoneze crescator prin metoda write(a[i],'');
bulelor. } readkey;
end.

3.Matrice cu n linii si m coloane, cu elemente din R:

a 1,1 a 1,2 . . a 1,n

a 2,1 a 2,2 . . a 2,n

a 3,1 a 3,2 . . a 3,n


. . . . .
A= a i,j nr. reale
. . . . .

117
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

am-1,1 a m-1,2 . . am-1,n

a m,1 a m,2 . . a m,n

 Tabloul de mai sus se numeste A.


 Elementele sale sunt a1,1 ,a1,2 , … , am,n .
 Prin ai,j se intelege elementul care se gaseste in linia i si coloana j.
Aici k=2, n1 =m,n2 =n,T=R.
MASIVE BIDIMENSIONALE (matrice)

Este aproape sigur că în activitatea de programare, matricele ocupă ca importanţă un loc


deosebit.Lucrul corect cu o matrice oferă rezultate rapide, cum la fel de adevărat este că utilizarea
defectuoasă reduce considerabil şansa de a obţine rezultate corecte.
Singura posibilitate de arealiza programe corecte utilizând matrice, este cunoaşterea mecanismelor de
implementare a acestora în diferite limbaje de programare ,precum şi studierea proprietăţilor ce decurg
din ele.
Pornind de la ideea că o matrice este formată din linii, iar liniile sunt formate din elemente ,se
ajunge la modelul grafic al matricei, care apare sub forma unei arborescenţe organizate pe trei nivele.

Definirea :
a: array[ 1..,m,1..n] of integer;

rezultă că matricea a este formată din m linii; fiecare linie are în alcătuire n componente

Modelul grafic

l1 l2 Lm

a1,1 a1,2 a1,n am,1 am,2 am,n

a1,1 a1,2 ... ai,,j ... am,n


D(ai,j)
A
Nivelul grafic presupune existenţa a 3 nivele:
- la nivelul cel mai înalt se află întregul, matricea a

118
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

- la nivelul următor se află primele părţi în care se descompune matricea şi


anume : liniile acesteia
- la nivelul al treilea se află elementele grupate pentru fiecare linie în parte
EXEMPLE:
{Fiind date doua matrici se cere: s:=0;
-calculul sumei elementelor de pe for i:=1 to m do
for j:=1 to n do
linie para si colona impara if (j mod 2 =0)and (i mod 2 =0) then
-suma elementelor din intervalul - s:=s+a[i,j];
2..4 write('suma elementelor de pe linie para si
-suma elementelor care sunt patrate coloana para ',s);
perfecte
s:=0;
-cine este primul element impar for i:=1 to m do
-sunt elemente impare pe o anumite for j:=1 to n do
linie data sau nu sunt if (a[i,j]>-2) and (a[i,j]<4) then s:=s+a[i,j];
-toate elementele din matrice sunt write('suma elementelor din intervalul (-2,4)
impare? ',s);
writeln;
-toate elementele de deasupra s:=0;
diagonalei principale sunt impare for i:=1 to m do
-exista cel putin un element impar for j:=1 to n do
- sa se spuna daca elementele de pe if (sqr(trunc(sqrt(a[i,j])))=a[i,j]) then
diagonala principala sunt sortate s:=s+a[i,j];
write('suma elementelor care sunt patrate
descrescator
perfecte ',s);
- sa se spuna daca doua linii date din i:=0;writeln;
matrice coincid repeat
-sa se calculeze maximul de sub i:=i+1;
diagonala principala j:=0;
repeat
-sa se calculeze produsul celor doua
j:=j+1;
matrice until (i>m) or (a[i,j] mod 2 <>0);
- sa se insereze la inceput o linie until (j>n) or (a[i,j] mod 2 <>0);
-adaugati o coloana care are if i>m then writeln(' nu am elemente impare')
produsul elementelor de pe linie else
-inserati o coloana pe o anumita write('primul element impar este
',a[i,j]);writeln;
pozitie for i:=1 to m do
-sortati descrescator elementele de for j:=1 to n do
pe o anumita coloana data if (a[i,j] mod 2 <>0 ) then max:=a[i,j];
-afisati rezultatele write('cel mai mare impar ',max);
} writeln;k:=0;writeln(' dati linia pe care cautati
elemente impare ');readln(p);
var pp,p,k,max,s,i,j,m,n:byte;
a,y,z:array[0..10,0..10] of integer; for j:=1 to n do
if (a[p,j] mod 2 <>0) then begin
ok:boolean;
begin k:=k+1;
if k=1 then max:=a[p,j];end;
writeln(' dati numarul de linii egal cu numarul
de coloane '); if k=0 then writeln(' nu sunt elemente impare
pe linia ',p) else
write('cite linii are matricea ');readln(m);
write('cite coloane are matricea ');readln(n); write('primul element impar de pe linia ',p,'este
',max);
for i:=1 to m do
for j:=1 to n do writeln;k:=0;
writeln(' dati numarul de ordine al elementului
begin
writeln('a[',i,',',j,']=');readln(a[i,j]); care-l verificati daca este impar ');readln(p);
for i:=1 to n do
end;
for i:=1 to m do begin for j:=1 to n do
if (a[i,j] mod 2 <>0) then begin
for j:=1 to n do
write(a[i,j],' ');writeln; k:=k+1;
if k=p then max:=a[i,j];end;
end;

119
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

if k<p then writeln(' nu sunt elemente impare s:=s+a[i,k]*y[k,j];


pe linia ',p) else z[i,j]:=s;
write('al ',p,'element impar este ',max); end;
ok:=true; writeln('produsul matricelor este ');
for i:=1 to n do for i:=1 to m do begin
for j:=1 to n do for j:=1 to n do
if a[i,j] mod 2 =0 then ok:=false; write(z[i,j],' ');writeln;
writeln('toate elementele din matrice sunt end;
impare ',ok); for j:=1 to n do
ok:=true; begin
for i:=1 to n do writeln(' elementul inserat la inceput in
for j:=1 to n do matricea y cu ordinea ',j,' este ');
if i>j then readln(z[0,j]);end;
if a[i,j] mod 2 =0 then ok:=false; for i:=1 to m do
writeln('toate elementele de deasupra for j:=1 to n do
diagonalei secundare sunt impare ',ok); z[i,j]:=y[i,j];
ok:=false; for i:=0 to m do begin
for i:=1 to n do for j:=1 to n do
for j:=1 to n do write(z[i,j],' ');writeln;
if a[i,j] mod 2 <>0 then ok:=true; end;
writeln('cel putin in element este impar? ',ok); {writeln(' dati coloana care o eliminati din
k:=0; matricea a ');readln(p);
for i:=1 to n do for j:=p to n-1 do
for j:=1 to n do begin
if (i<j) and (a[i,j] mod 2 <>0) then k:=k+1; for i:=1 to m do
writeln('e vre-un element impar? ',ok); a[i,j]:=a[i,j+1];
ok:=false; end;
for i:=1 to n-1 do for i:=1 to m do begin
if a[i,i] >a[i+1,i+1] then ok:=true; for j:=1 to n-1 do
writeln('elementele de pe diagonala principala write(a[i,j],' ');writeln;
sunt sortate descrescator ? ',ok); end;}
writeln(' ce linie comparati ');readln(k); writeln(' dati linia care o eliminati din matricea
writeln(' cu ce coloana comparati ');readln(p); a ');readln(p);
ok:=false; for i:=p to m-1 do
for i:=1 to n do begin
if a[k,i] <>a[i,p] then ok:=true; for j:=1 to n do
writeln('elementele de pe linia ',k,' sunt a[i,j]:=a[i+1,j];
aceleasi cu elementele de pe linia ',p,' ? ',ok); end;
max:=a[1,2]; for i:=1 to m-1 do begin
for i:=1 to n do for j:=1 to n do
for j:=1 to n do write(a[i,j],' ');writeln;
if (i>j) then end;
if a[i,j]>max then max:=a[i,j]; writeln(' adaug o coloana care are ca elemente
writeln(' maximul elementelor de sub produsul elementelor pe linie ');
diagonala principala ',max); for i:=1 to m do
writeln('introduceti a doua matrice '); for j:=1 to n do
writeln(' dati numarul de linii egal cu numarul z[i,j]:=a[i,j];
de coloane '); for i:=1 to m do
write('cite linii are matricea ');readln(m); begin
write('cite coloane are matricea ');readln(n); s:=1;
for i:=1 to m do for k:=1 to n do
for j:=1 to n do s:=s*a[i,k];
begin z[i,n+1]:=s;
writeln('b[',i,',',j,']=');readln(y[i,j]); end;
end; for i:=1 to m do begin
for i:=1 to m do for j:=1 to n+1 do
for j:=1 to n do write(z[i,j],' ');writeln;
begin end;
s:=0; writeln(' dati pozitia in care inserati o coloana
for k:=1 to n do ');readln(p);

120
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln(' inserez pe coloana ',p,' elemente'); p:=1;


for j:=n+1 downto p+1 do for i:=1 to m-1 do
begin if y[i,k]<y[i+1,k] then
for i:=1 to m do begin
z[i,j]:=z[i,j-1]; p:=0;
end; pp:=y[i,k];
for I:=1 to n do y[i,k]:=y[i+1,k];
begin y[i+1,k]:=pp;
write('elementul[',i, ',',j,']=');readln(z[i,p]); end;
end; until p=1;
for i:=1 to m do begin for i:=1 to m do begin
for j:=1 to n+1 do for j:=1 to n do
write(z[i,j],' ');writeln; write(y[i,j],' ');writeln;
end; end;
writeln(' sortati descrescator in matricea b pe
diagonala principala k='); readln;
readln(k); end.
repeat
aux:=a[j,i];
{ Se considera un tablou a[j,i]:=a[j,i+1];
bidimensional a cu n linii si n a[j,i+1]:=aux;
end;
coloane (1<=n<=50) componente sw:=1;
intregi si un numar intreg k. end;
Se cere sa se afiseze tabloul a cu end;
componente intregi . writeln;
Se cere ca prin operatii de for i:=1 to n do begin
for j:=1 to n do
interschimbare de linii si write (a[i,j],' ');
coloane sa se obtina un tablou cu writeln;
elementele de pe diagonala end;
principala readln;
ordonate crescator.} end.
uses crt ;
var
a: array [1..50,1..50] of integer;
i,j,n,sw: byte; {Sa se parcurga in spirala o matrice
aux: integer; adica sub forma
begin a[k,k]----------------------->a[k,n-k+1]
clrscr; a[k-1,k]---------> |
write ('n='); readln (n); writeln('dati elementele | |
matricei '); | |
for i:=1 to n do a[n-k+1,k] <---------------- a[n-k+1,n-k+1] }
for j:=1 to n do begin var a:array[1..10,1..10] of integer;
i,j,k,l,n:integer;
gotoxy (4*j,i+2); begin
readln (a[i,j]); write('n=');readln(n);
end; for i:=1 to n do
sw:=1; begin
while sw=1 do begin for j:=1 to n do
sw:=0; begin
for i :=1to n-1 do write('a[',i,',',j,']=');readln(a[i,j]);
if a[i,i]> a[i+1,i+1] then end;end; for i:=1 to n do
begin begin for j:=1 to n do
for j:=1 to n do begin write(a[i,j]:4);
aux:=a[i,j]; writeln;
a[i,j]:=a[i+1,j]; end;
a[i+1,j]:=aux; if n=n div 2*2 then
end; L:=n div 2 else
for j:=1 to n do begin L:=n div 2 +1;

121
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

for k:=1 to L do writeln('zona 3');


begin for j:=1 to n do
for j:=k to n-k do for i:=j+1 to n-j do
write(a[k,j]:4); write(a[i,j]:3,' ');writeln ;
for i:=k to n-k do writeln('zona 4');
write(a[i,n-k+1]:4); for j:=1 to n do
for j:=n-k+1 downto k+1 do for i:=j+1 to n-j do
write(a[n-k+1,j]:4); write(a[i,n-j+1]:3,' '); writeln ; writeln(' simetrica pe
for i:=n-k+1 downto k+1 do orizontala ');
write(a[i,k]:4); for i:=1 to n do
end; for j:=1 to n do
readln; b[i,j]:=a[n-i+1,j];
end. for i:=1 to n do
{Sa se elemntele care se afla in begin
interiorul celor patru zone for j:=1 to n do
write(b[i,j]:3,' ');
triunghiulare determinate de cele writeln ;end; writeln(' simetrica pe verticala ');
doua diagonale for i:=1 to n do
Sa se determine o matrice simetrica for j:=1 to n do
fata de cea initiala (fata de b[i,j]:=a[i,n-j+1];
orizontala) for i:=1 to n do
begin
Sa se determine o matrice simetrica for j:=1 to n do
fata de cea initiala (fata de verticala) write(b[i,j]:3,' ');
Sa se efectueze o rotatie a matricei writeln;
de 90 de grade,o rotatie de 270 de end;
grade} writeln(' o rotatie de 90 de grade ');
type maa=array[1..10,1..10] of integer; for i:=1 to n do
var n,i,j:integer;b,a:maa; for j:=1 to n do
begin b[i,j]:=a[j,n-i+1];
write('n=');readln(n); for i:=1 to n do
for i:=1 to n do begin
begin for j:=1 to n do
for j:=1 to n do write(b[i,j]:3,' ');
begin writeln;
write('a[',i,',',j,']=');readln(a[i,j]); end;
end;end; writeln(' o rotatie de 270 de grade ');
writeln('zona 1'); for i:=1 to n do
for i:=1 to n do for j:=1 to n do
for j:=i+1 to n-i do b[i,j]:=a[n-j+1,i];
write(a[i,j]:3,' '); writeln ; for i:=1 to n do
writeln('zona 2'); begin
for i:=1 to n do for j:=1 to n do
for j:=i+1 to n-i do write(b[i,j]:3,' ');
write(a[n-i+1,j]:3,' '); writeln;
writeln ; end;
readln;end.

 ŞIRURI DE CARACTERE
Procedure Delete ( VAR s : string; m,n : integer); - şterge din şirul s un număr m de caractere începând
de la poziţia n
Procedure Insert ( s : string; VAR d: string; n : integer); - inserează şirul s în şirul d începând de la
poziţia n

122
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Procedure Str (e [ : m [ : n]]; VAR s: string); - converteşte valorile expresiei numerice reale sau întregi
e într-un şir de caractere de lungime m (luând în considerare n zecimale în cazul valorilor e reale şi depune şirul în
variabila s
Function Copy (s : string; m,n : integer): string; - extrage din şirul s subşirul format din m caractere
începând de la caracterul n
Function Lenght ( s: string): integer; returnează lungimea şirului s
Function Concat (s1 [,…,sn]: string) : string; - returnează şirul obţinut prin concatenarea tuturor
argumentelor, în ordinea în care apar; rezultatul nu poate depăşi 255 de caractere.
O variabilă care apare într-un bloc ( unitatea de bază a oricărui program Pascal) poate fi simultan locală,
globală şi necunoscută. De exemplu, dacă la nivelul unui bloc s-a declarat o variabilă, pentru blocul respectiv este
locală, pentru blocurile care au fost declarate în acel bloc este globală, iar pentru blocurile care include blocul
respectiv, variabila este necunoscută.

Siruri de caractere

SINTAXA:
TYPE NUME=string[dimensiune];
Var variabila:nume;
Sau:
Var variabila:string[dimensiune];
Variabila[0] este lungimea sirului
Are maxim 255 de caractere
Ex:
Var a:string[3];
Begin
A:=”cal”;
Write(a);
End.
Functii care lucreaza cu siruri de caractere
LUNGIMEA UNUI SIR DE CARACTERE S1:=CONCAT(s2,S3);
Sintaxa: Writeln (s1);
Variabila :=Length(sir); End.
Ex: SAU:
Var s: string; Var s1,S2,S3: string;
Begin Begin
Readln(s); Readln(s2);
Writeln(length(s); READLN(S3);
End. S1:= s2+S3;
CONCATERNARE(ALATURAREA) ADOUA Writeln (s1);
SIRURI DE CARACTERE End.
Sintaxa:
SIRdestinatie:=CONCAT(SIRsursa,SIR2); COPIEREA UNUI SIR DE CARACTERE de la
Ex: sursa LA DESTINATIE
Var s1,S2,S3: string; Sintaxa:
Begin SIRdestinatie:=COPY(SIRsursa,POZITIA_initial
Readln(s2); adecopiat,POZITIA_finala);
READLN(S3); Ex:

123
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Var s1,S2: string;


Begin LIMBAJUL PASCAL
Readln(s2); INSERAREA INTR-UN SIR A ALTUI SIR
S1:=copy(s2,1,length(s2)-2); Sintaxa:
INSERT(SIRsursa_UNDE_inserez,pe_cine_ins
Writeln (s1); erez,pozitia_de_unde_fac_inserarea);
End. Ex:
LIMBAJUL PASCAL Var s1,S2: string;
CAUTAREA UNUI SIR DE CARACTERE Begin
Sintaxa: Readln(s1);readln(s2);
VARIABILA_de_tip_intreag:=pos(SIRsursa,CIN insert(s1,s2,3);
E_se_cauta); Write(s1);
Ex: End.
Var s1,S2: string;p:integer;
Begin LIMBAJUL PASCAL
Readln(s2); CONVERSII LA SIRURI DE CARACTERE DIN
Readln(s1); NUMAR IN STRING
p:=pos(s1,s2); Sintaxa:
Write(p); STR(NUMAR:cate_zecimale,cate_unitati,SIRU
End; L_string);
Ex:
Var s1: string;p:integer;
COMPARAREA A DOUA SIRURI DE Begin
CARACTERE Readln(p);
Sintaxa: Str(p:10,s1);
VARIABILA_logica:=SIR1 operator_relational Write(s1);
SIR2; End.
Ex: Ex:
Var s1,S2: string;p:boolean; Var s1: string;p:real;
Begin Begin
Readln(s2); Readln(p);
Readln(s1); Str(p:10:2,s1);
p:=s1<s2; Write(s1);
if p then write(“mai mare”) End.
else write(“mai mic”);;
End. CONVERSII LA SIRURI DE CARACTERE DIN
STRING IN NUMAR INTREG SI IN REAL
Sintaxa:
LIMBAJUL PASCAL VAL(SIRUL_string ,NUMAR,INDICATOR_NUL
STREGEREA DINTR-UN SIR _DACA_E_bine);
Sintaxa: Ex:
DELETE(SIRsursa,DE_UNDE_STERG,pana_i Var s1: string;p,k:integer;
n_ce_pozitie); Begin
Ex: Readln(s1);
Var s1: string; val(s1,p,k);
Begin if k=0 then
Readln(s1); Write(p);
delete(s1,1,length(s1)-2); End.
Write(s1);
End.

Tipul multime
Declarare: SET OF tip_parinte
Literali: [element1,element2,…,elementn]; [] - multimea vida
Operatii:
- reuniune (+); intersectie (*); diferenta (-)

124
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

- relationale (incluziune)
- apartenenta (IN)
{Sa se efectueze operatii cu multimi until c=[];
apoi scrierea lor end
else
Daca limita multimii nu ar fi 255 ce if car='c' then
se intimpla (folosim vectori cu tipul for i:=0 to 255 do
multime nu se poate) for j:=1 to 255 do
Fie 1 care apartine si de A si de B if (i in a) and (j in b) then write('(',i,',',j,')');
Daca x apartine de A atunci writeln('}');
writeln(' sterg multimea c ');
2*x+1,3*x+1 apartine de A i:=0;
Daca x apartine de B atunci while c<>[] do begin
5*x+2,7*x+2 apartine de B if i in c then
Sa se stabileasca daca B e inclus in A begin
sau sa se afiseze elementele write(i:3,',');c:=c-[i];
end;
intersectiei i:=i+1;
} end;
var a,b,c:set of 0..255; writeln('}');
x,i,j:0..255; a:=[1];
car:char; b:=[1];
begin for x:=1 to 255 do
a:=[]; begin
repeat if x in a then
write(' dati elementul prim al if 2*x+1<=255 then
multimii');readln(x); begin
a:=a+[x]; a:=a+[2*x+1];
write(' mai dati d/n ');readln(car ); if 3*x+1<=255 then
until car='n'; a:=a+[3*x+1];end;
write(' dati a doua multime dati primul element if x in b then
'); if 5*x+2<=255 then
b:=[]; begin
repeat b:=b+[5*x+2];
write(' dati elementul multimii');readln(x); if 7*x+2<=255 then
b:=b+[x]; b:=b+[7*x+2];
write(' mai dati d/n ');readln(car ); end;
until car='n'; end;
write(' operatii:r=reuniune,i=intersectie,a=A- if b<=a then writeln(' multimea b este inclusa
B,b=B-A,c=produs cartezian'); in multmea a ')
write(' ce optati ');read(car); else
case car of begin
'r':begin c:=a+b ;writeln('reuniunea ');end; write('intersectia este {');
'i':begin c:=a*b ;writeln('intersectia ');end; x:=1;
'a':begin c:=A-B ;writeln('A-B ');end; repeat
'b':begin c:=B-A ;writeln('B-A ');end; if x in b then
'c':begin writeln('PRODUSUL cartezian');end; begin
else if x in a then
writeln(' alta varianta nu e '); write(x,' ');b:=b-[x];
end; end;
writeln; x:=x+1;
writeln; until b=[];
write('{'); writeln('}');
if car in ['a','b','c','i','r'] then begin i:=1; end;
repeat readln;
if i in c then write(i,' , '); end.
c:=c-[i];i:=i+1;
TIPUL DE DATE INREGISTRARE

125
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

SINTAXA Referirea1
TYPE identificator=RECORD Identificator1.
Camp1:tip1; identificator.camp1
Camp2:tip2; SINTAXA2
… TYPE identificator=RECORD
campN:tipN; Camp1:tip1;
end; Camp2:tip2;
VAR v:identificator; …
Referirea campN:tipN;
Identificator.camp end;
SINTAXA1 CASE identificator1:TIP OF
TYPE identificator=RECORD Camp11:( V1:tip1;V2:tip2;…);
Camp1:tip1; Camp21: :( V11:tip11;V21:tip21;
Camp2:tip2; …);;
… …
campN:tipN; campN1: :( V1n:tip1n;V2n:tip2;
end; …);;
identificator1=RECORD end;
Camp11:tip1; VAR v:identificator;
Camp21:tip2; Referirea2
… Identificator1.camp11 ,
campN1:tipN; Identificator1.camp21,..
cn: identificator; Identificator1.camp1,…
end; Identificator1.campN1
VAR v:identificator;

EXEMPLE:
{Citind coordonatele unui punct sa a:punct;
begin
se determine in ce cadran se afla} clrscr;
program cadran ;
with a do begin
uses crt;
write('abscisa :');
type punct=record
read(x);
x,y:real;
write('ordonata :');
end;
read(y);
var i,n:integer;

126
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

if (x<0) and (y>0) then write for i:=1 to n-1 do


for j:=i+1 to n do
('punctul e in 1'); if abs(f[i].a-f[j].a)<1 then
if (x>0) and (y>0) then writeln('figura ',i,' si figura ',j,' au arii egale ');
write('punctul e in 2'); writeln('ariile dupa cum a-ti dat datele ');
if (x<0) and (y<0) then for i:=1 to n do
writeln('aria ',f[i].a:6:2);
write('punctul e in 3'); readln;
if (x>0) and (y<0) then end.
write('punctul e in 4');
end; {Fie o familie cu 5 membri .Sa se
readln;readln; determine cei nascuti vara }
end.
type d=record
{Cu structuri de date record sa se
z:1..31;L:1..12;
calculeze ariile la diferite figuri
a:1900..2003;
geometrice:cerc,dreptunghi,
end;
patrat,triunghi si sa se compare
f=(t,m,c1,c2,c3,c4,c5); {Observati
deducindu-se care sunt figurile cu
tipul enumerare}
arii aproximativ egale
v=array[f] of d;{Observati ca tipul
ex:1
enumerare apare ca indice al unui
p
vector}
2 var x:v;
=>4 i:f; {Observati tipul enumerare
} poate fi folosit ca indice la
type fi=record un for fiind ordinal}
a:real; begin
case T:char of for i:=t to c5 do
'c':(r:byte); begin
'p':(L:byte); writeln('membrul i al familiei
'd':(lu,La:byte); -ZIUA
't':(aa,b,c:byte) NASTERII');readln(x[i].z);
end; writeln('membrul i al familiei
var n,i,j:byte;p:real; -LUNA
f:array[1..49] of fi; NASTERII');readln(x[i].L);
begin writeln('membrul i al familiei
write(' numarul de figuri ');readln(n);
for i:=1 to n do
-ANUL
with f[i] do NASTERII');readln(x[i].a);
begin end;
repeat writeln(' cei care s-au nascut
write(' figura ',i,' dati o litera:c, p ,d sau t ');readln( T); vara ');
t:=upcase(t); for i:=t to c5 do if(x[i].L>=6)
until t in ['C','P','D','T'];
case t of and (x[i].L<=8) then
'C':begin
write('raza ');readln(r);
a:=pi*sqr(r);
end;
'P':begin
write('latura ');readln(L);
a:=sqr(L);
end;
'D':begin
write(' lungimea ');readln(Lu);
write(' latimea ');readln(La);
a:=la*lu;
end;
'T':begin
write(' latura aa=');readln(aa);
write(' latura b=');readln(b);
write(' latura c=');readln(c);
p:=(aa+b+c)/2;
a:=sqrt(p*(p-aa)*(p-b)*(p-c));
end;
end;
end;

127
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln(x[i].a,' for i:=1 to n do


',x[i].l:3,x[i].z); begin
readln; writeln('persoana ',i);
end. write(' numele
');readln(art[i].nume);
{Prin tipul intregistrare cu variante write('nota
');readln(art[i].nota);
sa se memeoreze informatii privind writeln('strada
numele ,media generala ');readln(art[i].adresa.strada)
,adresa (strada,numar,apartament) ;
la elevii unei scoli} writeln('numarul
type adr=record ');readln(art[i].adresa.nr);
strada:string; writeln('apartamentul
nr,ap:integer; ');readln(art[i].adresa.ap);
end; end;
articol=record for i:=1 to n do
nume:string; with art[i] do
nota:integer; begin
promovat :boolean; writeln('numele ',nume);
adresa:adr; with adresa do
end; begin
var art:array[1..25] of writeln('strada ',strada);
articol; writeln('numarul ',nr);
n,i:integer; end;
begin end;
writeln('cite persoane sunt readln;
');readln(n); end.

4.4.Fisiere .Operatii specifice


Din punct de vedere al conţinutului lor, fişierele se împart în două categorii:
1.FIŞIERE TEXT, în care sunt memorate caractere organizate în linii consecutive ce sunt separate
printr-un marcaj de sfârşit de linie ( caractere de control CARRIAGE, RETURN şi LINE FEED). În această
categorie intră fişiere ce conţin programe sursă, fişiere document şi orice alte fişiere cu componentele caractere
grupate în linii.
Fişierele text reprezintă nişte fişiere secvenţiale; componentele lor pot fi prelucrate numai în ordinea în
care apar.
După modul în care a fost deschis, asupra unui astfel de fişier pot fi efectuate numai operaţii de un singur
tip. Dacă fişierul a fost deschis prin RESET, asupra lui pot fi efectuate numai operaţii de citire, iar dacă a fost
deschis prin REWRITE sau APPEND, asupra lui se pot efectua numai operaţii de scriere.
2. FIŞIERE CU COMPONENTE DE ALTE TIPURI, DEFINITE DE UTILIZATOR
Această categorie cuprinde fişiere care conţin programe executabile sau date
înregistrate.
Fişierele cu tip reprezintă o succesiune de înregistrări de acelaşi tip, aflate pe acelaşi suport. Înregistrările
pot fi de tip simplu (standard sau definit de utilizator) sau structurat (ARRAY, STRING, RECORD).
În procesul de prelucrare a fişierelor se folosesc anumite funcţii şi proceduri standard de uz general,
acestea sunt:

128
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

- PROCEDURA ASSIGN stabileşte o asociere între identificatorul din program reprezentat de variabila
fişier şi identificatorul extern; prototipul său este:

Procedure Assign (var F: string);


- PROCEDURA RESET deschide fişierul pentru executarea unor operaţii de citire şi are prototipul:
Procedure Reset (varF);

- PROCEDURA REWRITE deschide un fişier vid pentru executarea de operaţii de scriere şi are
prototipul:
Procedure Rewrite (varF);
Procedurile RESET şi REWRITE stabilesc modul de prelucrare a fişierelor şi se folosesc în cadrul
fişierelor text şi al celor cu tip.
Pentru scriere, respectiv citire se folosesc:
WRITE şi READ – la fişierele cu tip şi text
WRITELN şi READLN – la fişierele text
BLOCKWRITE şi BLOCKREAD – la fişierele prelucrate fără tip.
Procedure write ( VAR F ; VAL1 [VAL2, …] );
Procedure read ( VAR F ; VAR1 [V2, …] );
Pentru detectarea marcajului de sfârşit de fişier se foloseşte funcţia EOF

Function EOF (VAR F ) : BOOLEAN;

Pentru închiderea fişierului se foloseşte procedura CLOSE.

Procedure Close (VAR F);

Pentru ştergerea şi schimbarea numelui unui fişier după închiderea acestuia se folosesc procedurile
ERASE, respectiv RENAME.

Procedure Erase (VAR F);


Procedure Rename (VAR F ; NEWNAME); unde NEWNAME reprezintă noul nume care urmează să
fie dat fişierului.
- FUNCŢIA EOLN – ia valoarea TRUE dacă urmează marcajul de sfârşit de linie sau marcajul de
sfârşit de fişier.

Function Eoln [(VAR F : TEXT)] : BOOLEAN;

- FUNCŢIA SEEK EOF – avansează peste caracterele blanc şi TAB până la întâlnirea marcajului de
sfârşit de linie sau a marcajului de sfârşit de fişier.

Function Seek Eof [(VAR F : TEXT)] : BOOLEAN;

- FUNCŢIA SEEK EOLN – avansează şi peste marcajul de sfârşit de linie

Function Seek Eoln [(VAR F : TEXT)] : BOOLEAN;


EXEMPLE

(1) PROGRAM NUMĂR_LINII_FIŞIER_TEXT;


var fişier : text;
număr : integer;
nume : string;

129
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin
write (’nume fişier :’); readln (nume);
assign ( fişier, nume); reset (fişier);
număr : = 0;
while not eof (fişier) do
begin
readln (fişier);
număr : = număr + 1;
end;
close (fişier);
writeln (‘fişierul are ’, număr, ’linii’);
end.

Concatenarea de fişiere

reprezintă crearea cu ajutorul a două fişiere a unui al treilea fişier care conţine înregistrările primului fişier
urmate de înregistrările celui de-al doilea.
program concatenare;
type inr = record
nume : string [10 ];
vârsta : byte
end;
fişier = file of inr;
var inreg : inr;
f1,f2,f3 : fişier;
begin
assign (f1, ’f.dat’);
assign (f2, ’f.dat1’);
assign (f3, ’f.dat2’);
reset (f1);
reset (f2);
rewrite (f3);
while not eof (f1) do
begin
read (f1, inreg);
write (f3, inreg);
end;
while not eof (f2) do
begin
read (f2, inreg);
write (f3, inreg);
end;
close (f1);
close (f2);

130
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

close (f3);
end.
STRUCTURI DE DATE EXTERNE

Tipuri de fisiere in Pascal

Prelucrarea automata a datelor presupune un sistem de organizare a acestora dupa metode si procedee specifice.
Organizarea datelor este un proces complex care include identificarea, clasificarea si descrierea proprietatilor
acestora, gruparea lor în colectii, reprezentarea pe purtatori tehnici, definirea si realizarea procedurilor de
prelucrare etc.
 

   Modul de lucru cu fisiere

  Deoarece datele se manevreaza, de obicei, pe purtatori tehnici de informatii, dar se


prelucreaza numai când sunt prezente în memoria interna, acestea trebuie organizate atât extern, cât si
intern. În organizarea externa a datelor se identifica doua niveluri de abordare, dupa cum se are în
vedere acest proces din perspectiva utilizatorului sau a purtatorilor fizici externi pe care se înregistreaza
datele. Cele doua niveluri de abordare, numite logic, respectiv fizic, precum si realizarea trecerii de la
unul la celalalt, în conditiile specifice diverselor sisteme de calcul, se bazeaza pe o serie de concepte,
cum sunt, fisierul si articolul, purtatorul tehnic de date, metoda de organizare si modul de acces,
operatiile de prelucrare etc.

Fisierul reprezinta termenul generic care desemneaza structurile de date externe. El este o multime
(colectie) de date omogene din punct de vedere al semnificatiei si al cerintelor de prelucrare. În
purtatorul extern, fisierul are, pe lânga partea de date, si informatii de identificare.

Fisiere cu tip

Fisierele cu tip sunt constituite, logic, din articole de lungime fixa, carora li se asociaza numere
relative, începând de la zero. Fisierele cu tip se mai numesc fisiere cu prelucrare la nivel de articol.
Operatiile de acces la articolele fisierelor cu tip transfera date fara conversie. Unitatea de transfer este
articolul, definit ca variabila de acelasi tip cu fisierul. Mecanismul fizic de "decupare" a articolelor în
cadrul fisierului se bazeaza pe faptul ca ele au lungime fixa (lart), definita în momentul prelucrarii.
Operatia de I/E transfera atâtia octeti câti indica lart. Lungimea fisierului, exprimata în octeti, este
memorata în intrarea lui din director (sfârsitul de fisier este logic). Numarul de articole din fisier
(Filesize(f)) este determinat de sistem prin împartirea întreaga a lungimii acestuia la lart. Fisierele cu
tip accepta accesul secvential si relativ la articole. Accesul secvential poate fi combinat cu cel relativ în
cadrul aceluiasi program. Pozitionarea directa pe articolul cu numarul relativ r se realizeaza cu
procedura Seek(f,r). Functia Eof(f) are valoarea TRUE, daca pointerul este plasat dupa ultimul articol
(la o deplasare egala cu n´lart fata de începutul fisierului, unde n este numarul de articole). Valoarea
curenta a pointerului (pozitia în cadrul fisierului exprimata în numar relativ) poate fi determinata prin
functia Filepos(f). Daca Eof(f) este TRUE, atunci Filepos(f)=Filesize(f).

Tentativa de citire a unui articol cu numarul relativ mai mare decât al ultimului genereaza eroare de
I/E. La scrierea articolului cu numarul relativ k, cele k articole precedente au spatiu rezervat în suportul
extern. De exemplu, se presupune un fisier cu articole de lungime 50 octeti, asupra caruia se realizeaza
doar scrierea articolului cu numarul relativ 100. Fisierul va ocupa în suport 5050 octeti (pentru 101
articole). Cele 100 articole (cu numere relative 0-99) au continut imprevizibil pentru utilizator. Citirea
articolelor se face cu procedura Read, iar scrierea cu procedura Write. Asupra fisierelor cu tip nu se pot
aplica functiile Eoln, SeekEoln, SeekEof si procedurile WriteLn, ReadLn. Procedurile de I/E pot
transfera unul sau mai multe articole, în functie de numarul variabilelor specificate în lista
argumentelor acestora.

Deschiderea si inchiderea fisierelor cu tip

Procedura Rewrite deschide un fisier nou pentru creare (creeaza intrarea în director). Declaratia ei este:
Rewrite(VAR f). Daca fisierul exista pe suport, acesta va fi sters si se creeaza noul fisier în locul sau.

131
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Daca fisierul f este deschis, procedura îl închide, îl sterge si recreeaza intrarea sa în director. Dupa
executia procedurii, pointerul de fisier se plaseaza pe începutul sau (pe primul articol) si functia Eof(f)
returneaza TRUE. În fisier este admisa atât scrierea, cât si citirea datelor.

Procedura Reset deschide un fisier existent (identifica fisierul în director). Declaratia ei este:
Reset(VAR f). Daca fisierul nu exista se genereaza eroare de I/E (IOResult are valoare diferita de zero).
Daca fisierul f este deschis, îl închide si apoi îl redeschide. Dupa executia procedurii, pointerul de fisier
se plaseaza pe începutul sau (pe primul articol), în fisier fiind admise atât citirea, cât si scrierea datelor,
iar Eof(f) este TRUE daca fisierul este vid sau FALSE, în caz contrar.

Procedura Close realizeaza închiderea unui fisier. Declaratia ei este:Close(VAR f). Variabila f indica
un fisier deschis anterior prin Reset sau Rewrite.

Citirea si scrierea articolelor

Citirea articolelor se realizeaza cu procedura Read, definita astfel:

Read(VAR f,v1[,v2,...,vn]),

unde f este un fisier cu tip, iar vi sunt identificatori de variabile (articole), de acelasi tip cu
componentele fisierului. Procedura citeste unul sau mai multe articole, începând cu cel pe care este
plasat pointerul, avansându-l dupa ultimul articol transferat. Tentativa de citire a unui articol cu
numarul relativ mai mare sau egal cu FileSize(f) genereaza eroare de I/E (IOResult are valoare diferita
de zero).

La prelucrarea articolelor care au o parte variabila trebuie sa se tina seama de faptul ca li se asociaza o
singura zona de memorie, care poate fi tratata diferentiat. Este sarcina programatorului sa gestioneze
tipul de articol pe care îl prelucreaza. Pentru aceasta este necesar ca, în momentul prelucrarii, sa existe
criterii precise de diferentiere a articolelor. De cele mai multe ori, diferentierea este asigurata de
valorile posibile ale unui câmp definit în partea fixa a articolului sau de cunoasterea pozitiei articolelor
în fisier.

Scrierea articolelor se realizeaza cu procedura Write, definita astfel:

Write(VAR f,v1[,v2,...,vn]),

unde f si v au aceleasi semnificatii ca la procedura de citire. Procedura scrie unul sau mai multe
articole, începând cu pozitia în care se afla pointerul, avansându-l pe acesta dupa ultimul articol
transferat. Trebuie retinut ca datele se memoreaza în articol conform reprezentarii lor fizice în memoria
interna si ca la scriere nu se face nici o verificare cu privire la existenta articolului în fisier.
Alte proceduri si functii utilizate in lucrul cu fisiere cu tip

Functia Eof(f) testeaza sfârsitului de fisier. Ea este definita astfel: Eof(VAR f):BOOLEAN. Functia
returneaza valoarea TRUE, daca pointerul de fisier este dupa ultimul articol sau când fisierul este vid.
În caz contrar, returneaza valoarea FALSE. Daca buffer-ul în care se face analiza sfârsitului de fisier
este "eliberat", functia Eof(f) realizeaza transferul unui articol din fisierul extern în buffer. Tentativa de
citire când Eof(f)=TRUE produce eroare de I/E (IOResult este diferit de zero).

Procedura Seek plaseaza pointerul pe un anumit articol. Ea este definita astfel: Seek(VAR f;
n:LONGINT). Pointerul va fi plasat pe articolul al carui numar relativ este n.

Functia FilePos returneaza valoarea curenta a pointerul, exprimata ca numar relativ de articol. Functia
este definita astfel: FilePos(VAR f):LONGINT. Daca pointerul indica sfârsitul fisierului atunci
FilePos(f) = FileSize(f) si Eof(f) este TRUE.
Functia FileSize returneaza numarul de articole continute în fisier. Functia este definita astfel:
FileSize(VAR f):LONGINT.
Numarul de articole este determinat prin împartirea întreaga a lungimii fisierului, exprimata în octeti, la

132
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

lungimea articolului. Ultimul articol din fisier are numarul relativ egal cu FileSize(f)-1. Când se
efectueaza operatii de scriere, valoarea FileSize(f)=n´lart este înscrisa dinamic în File Information
Block (FIB).

Operatii de gestiune a fisierelor cu tip

În conditiile specifice modurilor de deschidere a fisierelor cu tip, prin folosirea adecvata a procedurilor
de I/E sunt posibile urmatoarele operatii de gestiune: populare, consultare, modificare adaugare si
stergere. Operatiile se realizeaza în acces secvential sau direct. De fapt, distinctia între cele doua tipuri
de acces este fortata, deoarece mecanismul lor este mult mai simplu: se citesc/scriu articole din/în
pozitia curenta. Plasarea se poate realiza prin parcurgere secventiala (prin operatiile de citire/scriere)
sau direct, prin procedura Seek.

· Popularea se realizeaza cu Write, dupa o deschidere cu Rewrite. În paralel cu popularea se pot realiza
si operatii de citire.
· Consultarea se realizeaza cu Read, dupa o deschidere cu Reset. În paralel, se pot realiza si operatii de
scriere.
· Adaugarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia de adaugare
necesita tinerea evidentei din partea utilizatorului a casetelor "goale", anterior rezervate. Se pot adauga
articole si peste FileSize(f), operatia având caracter de extindere a fisierului.
· Modificarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia necesita uzual o
citire, o plasare a pointerului pe numarul relativ FilePos(f)-1 si apoi o scriere.
· Stergerea fizica se poate realiza prin suprascrierea articolului de sters, obtinuta ca efect al deplasarii
articolelor ce îi urmeaza în fisier, cu o pozitie spre stânga. Stergerea ultimului articol duplicat în urma
deplasarii se asigura prin plasarea pointerului de fisier pe articolul FileSize(f)-1, urmat de executia
procedurii Truncate(f) care modifica lungimea fisierului în intrarea din director.

Datorita pierderii corespondentei dintre continut si pozitia articolelor, în majoritatea aplicatiilor se


prefera stergerea logica, realizabila prin procedeuri ale utilizatorului, dar care implica unele rezolvari
înca din faza de proiectare a structurii fisierelor.

Fisiere fara tip

Fisierele fara tip sunt construite, logic, din blocuri de lungime fixa, asupra carora nu se face nici o
ipoteza de structura. Fisierele fara tip se mai numesc fisiere cu prelucrare la nivel de bloc. Unitatea de
transfer este blocul, a carui lungime este definita, implicit sau explicit, la deschiderea fisierului
(parametrul RecSize). Transferul datelor între memoria interna si suportul extern se realizeaza fara
conversie.

Blocurilor, fiind de lungime fixa, (lbloc) li se asociaza numere relative începând de la zero. Accesul la
blocuri se poate face secvential sau direct. Pozitionarea directa pe un bloc cu numar relativ r se
realizeaza cu procedura Seek(f,r). Functia Eof(f) are valoarea TRUE daca pointerul este plasat dupa
ultimul bloc (la o deplasare egala cu n´lbloc fata de începutul fisierului, unde n este numarul
blocurilor). Valoarea curenta a pointerului poate fi determinata prin functia Filepos(f), iar numarul de
blocuri din fisier prin functia Filesize(f). Tentativa de citire a unui bloc cu numarul relativ mai mare
decât al ultimului generaza eroare de I/E. La scrierea blocului cu numarul relativ k, cele k blocuri
precedente au spatiu rezervat în suportul extern. Citirea blocurilor se face cu procedura BlockRead, iar
scrierea cu procedura BlockWrite. Procedurile de I/E pot transfera unul sau mai multe blocuri, în
functie de valoarea specificata prin parametrul Count.

Din cele prezentate, se poate observa ca între fisierele cu tip si cele fara tip exista multe asemanari de
prelucrare. Dintre aceste, cele mai importante se refera la faptul ca transferul este binar (fara conversie)
si ca entitatile transferate (articolul sau blocul) au lungime fixa. Deosebirea esentiala dintre cele doua
tipuri de fisiere consta în aceea ca la fisierele cu tip, articolul are definita o structura, iar la cele fara tip,
blocului nu i se asociaza o structura.

Procedura Rewrite deschide un fisier nou pentru creare (creeaza eticheta în director). Declaratia ei
este: Rewrite(VAR f[;RecSize:WORD]). RecSize precizeaza marimea, în octeti, a blocului care va fi

133
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

citit/scris cu procedurile BlockRead, respectiv BlockWrite. Când argumentul RecSize lipseste, se


considera implicit ca blocul are lungimea de 128 octeti. Valoarea maxima a argumentului este 65535.
Daca fisierul exista în suport, acesta va fi sters si se creeaza noul fisier în locul sau. Daca fisierul f este
deschis, procedura îl închide, îl sterge si recreeaza intrarea sa în director. Dupa executia procedurii,
pointerul de fisier se plaseaza pe începutul sau (pe primul bloc). În fisier este admisa atât scrierea, cât si
citirea datelor. Dupa executia procedurii, Eof(f) este TRUE.

Procedura Reset deschide un fisier existent (identifica fisierul în director). Declaratia ei este:
Reset(VAR f [;RecSize:WORD]). RecSize are aceeasi semnificatie ca la procedura Rewrite. Daca
fisierul nu exista, se genereaza eroare de I/E (IOResult are valoare diferita de zero). Daca fisierul f este
deschis, îl închide si apoi îl redeschide. Dupa executia procedurii, pointerul de fisier se plaseaza pe
începutul sau (pe primul bloc). În fisier este admisa atât citirea, cât si scrierea datelor. Dupa executia
procedurii, Eof(f) este TRUE daca fisierul este vid sau FALSE, în caz contrar.

Procedura Close realizeaza închiderea unui fisier.

Declaratia ei este:Close(VAR f). Variabila f indica un fisier deschis anterior prin Reset sau Rewrite.

Citirea blocurilor se realizeaza cu procedura BlockRead, definita astfel:


BlockRead(VAR f:FILE;VAR Buf;Count:WORD[;VAR Ind:WORD])
unde:

· f este o variabila care indica un fisier fara tip;


· Buf este o variabila a carei adresa reprezinta începutul zonei de memorie în care se depun datele
citite;
· Count corespunde unei expresii a carei valoare specifica numarul maxim de blocuri ce vor fi citite.
Blocurile citite vor fi depuse în memorie unul dupa altul;
· Ind este o variabila în care sistemul depune, dupa citire, numarul de blocuri efectiv transferate. În
cazul în care parametrul corespunzator lui Ind este absent si numarul blocurilor efectiv transferate este
mai mic decât Count, se produce eroare de I/E.

Procedura citeste unul sau mai multe blocuri, începând cu cel pe care este plasat pointerul, pe care îl
avanseaza dupa ultimul bloc transferat. Tentativa de citire a unui bloc cu numarul relativ mai mare sau
egal cu FileSize(f) genereaza eroare de I/E (IOResult are valoare diferita de zero).

Scrierea blocurilor se realizeaza cu procedura BlockWrite, definita astfel:


BlockWrite(VAR f:FILE; VAR Buf; Count:WORD [;VAR Ind:WORD])
unde f, Buf, Count, Ind au aceleasi semnificatii ca la procedura BlockRead.

Procedura scrie unul sau mai multe blocuri începând cu pozitia în care se afla pointerul, pe care îl
avanseaza dupa ultimul bloc scris. Se reaminteste ca datele se memoreaza în blocul extern identic cu
forma lor fizica din memoria interna.

Functiile Eof, FilePos, FileSize si procedura Seek functioneaza identic ca în cazul fisierelor cu tip,
referind sau referindu-se la blocuri. Numarul de blocuri este determinat prin împartirea întreaga a
lungimii fisierului, exprimata în octeti, la lungimea blocului. Ultimul bloc din fisier are numarul relativ
egal cu FileSize(f)-1. Când se efectueaza operatii de scriere, valoarea FileSize(f)´lbloc este înscrisa
dinamic în FIB.

{Fie doua fisiere de numere reale si:char;


date descrescator.Sa se creeze un al i,j,m,n:integer;
begin
treilea fisier care contine elemente assign(f1,'f.1');assign(f2,'f.2');
din primele doua si care au assign(f,'f.3');
elementele in ordine descrescatoare} rewrite(f1);writeln;
m:=0;
var f1,f2,f:file of real; repeat
x,y:real;

134
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln(' dati valori descrescatoare in primul Sa se determine suma maxima si


fisier'); cine o detine, sa se adauge elevi la o
read(x);
write(f1,x);
clasa si sa se listeze
readln; Sa se extraga o anumita suma sau sa
m:=m+1; se depuna de catre un elev de la o
writeln(' mai sunt date de introdus anumita clasa}
d/n');readln(si); type ar=record
until si<>'d'; cl:string[5];
n:=0;rewrite(f2); nu:string[20];
repeat su:word
writeln(' dati valori descrescatoare in al doilea end;
fisier '); var fis1,fis2: file of ar;
read(x); art1,art2:ar;nr,tot,i,n:word;sfirsit,b:boolean;op:
write(f2,x); char;
readln; num,c1:string[5];sum,nm,max:word;
n:=n+1; nn:array[1..100] of longint;s,j:longint;
writeln(' mai sunt date de introdus
d/n');readln(si); begin
until si<>'d'; assign(fis1,'cec');
writeln('f1 are ',m ,'articole f2 are ',n ,' articole rewrite(fis1);
'); write('n=');readln(n);
reset(f1);reset(f2);rewrite(f); for i:=1 to n do
writeln; with art1 do
read(f1,x);read(f2,y);i:=1;j:=1; begin
while (i<=m) and (j<=n) do write('clasa ');readln(cl);
if x<y then begin write('nume');readln(nu);
write(f,y); write('suma');readln(su);
if j<n then read(f2,y);j:=j+1; write(fis1,art1);
end end;
else reset(fis1);read(fis1,art1);tot:=art1.su;c1:=art1.
begin cl;writeln;
write(f,x); writeln('clasa',art1.cl);
if i<m then read(f1,x);i:=i+1; writeln('numele ',art1.nu);
end; writeln(art1.su);
while i<=m do while not eof(fis1) do
begin begin
write(f,x); read(fis1,art1);
if i<m then read(f1,x);i:=i+1; with art1 do
end; if c1=cl then begin
while j<=n do writeln(' ' ,nu,' ',su); tot:=tot+su;
begin end
write(f,y);if j<n then read(f2,y);j:=j+1; else
end; begin
writeln;writeln(' fisierul f este '); writeln(' suma totala ',tot);
reset(f); tot:=su;
while not eof(f) do c1:=cl;
begin writeln('clasa',cl);
read(f,x); writeln(' ',nu,' ',cl);
write(x:5:0); end; end;
end; writeln(' suma totala=',tot);
readln; close(fis1);
end. reset(fis1);
{Sa se scrie un fisier cu tip care max:=0;
memoreaza numele elevilor,clasa si while not eof(fis1) do
o suma de care dispun si in care sa se begin
read(fis1,art1);
faca totalul pe clase if art1.su>max then begin
i:=1;
nn[i]:=filepos(fis1)-1;max:=art1.su;

135
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end else
else if sum>su-25 then
if art1.su=max then begin begin
i:=i+1; writeln(' operatia sau suma data gresit',op,'
nn[i]:=filepos(fis1)-1 ',c1);
end; b:=false;
end; end
reset(fis1); else
writeln('urmatorii detin suma maxima ',max); su:=su-sum;
for j:=1 to i do if b then
begin begin
seek(fis1,nn[j]); seek(fis1,nr);write(fis1,art1);end;
read(fis1,art1); end;
writeln(art1.nu); end;
end; end;
close(fis1); end;
reset(fis1); close(fis1);
write('citi adaugati n=');readln(n); reset(fis1);
writeln(' la ce clasa ');readln(art1.cl); while not eof(fis1) do
seek(fis1,filesize(fis1)); begin
for i:=1 to n do read(fis1,art1);
with art1 do with art1 do begin
begin writeln('clasa',cl);writeln;
write('nume');readln(nu); writeln('SUMA--> ',su,' CLASA----> ',cl);
write('suma ');readln(su); end; end; close(fis1);
write(fis1,art1); readln;
end; end.
close(fis1); {Intr-un fisier cu tip sa se memoreze
reset(fis1); numele si virsta unor persoane
while not eof(fis1) do
begin
Dindu-se doua fisiere sa se listeze}
read(fis1,art1); type inr=record
with art1 do begin nume:string[10];
writeln('clasa',cl); virsta:byte;
writeln(' ',su,' ',cl); end;
end; end; close(fis1); fisier=file of inr;
reset(fis1);nm:=filesize(fis1)-1; var i,inreg:inr;
write('citi modificati n=');readln(n); f2,f1:fisier;
for i:=1 to n do c:char;
begin begin
write('clasa');readln(c1); assign(f1,'ff.dat');
write('nume');readln(num); rewrite(f1);
write(' nr de ordine ');readln(nr); repeat
write('tipul operatiei I?E');readln(op); write('numele ');readln(inreg.nume);
write('suma ');readln(sum); write('virsta');
if nr>nm then readln(inreg.virsta);
writeln(' nr de ordine gresit pentru ',num,' ',c1) write(f1,inreg);
else write('continuati y/n');readln(c);
begin until c='n';
seek(fis1,nr); assign(f2,'fff.dat');
read(fis1,art1); writeln(' dati inregistrari in al doilea fisier ');
with art1 do rewrite(f2);
begin repeat
if (c1<>cl) or (num<>nu) then writeln(' nr de write('numele ');readln(inreg.nume);
ordine gresit pentru ',num,' ',c1) write('virsta');
else readln(inreg.virsta);
begin write(f2,inreg);
b:=true; write('continuati y/n');readln(c);
if op in['i','I'] then until c='n';
su:=su+sum reset(f1); writeln(' primul fisier ');

136
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

while not eof(f1) do begin


begin read(f2,i);
read(f1,i); writeln(i.nume,' ',i.virsta);
writeln(i.nume,' ',i.virsta); end;
end;
close(f1);close(f2);
reset(f2); writeln(' al doile fisier '); readln;
while not eof(f2) do end.

Fisierele fara tip sunt utilizate pentru stocarea unor blocuri din memoria interna, în vederea prelungirii
capacitatii ei (un exemplu semnificativ îl reprezinta memorarea masivelor de dimensiuni mari). Cu
toate acestea, pot fi concepute aplicatii care au la baza gestiunea fisierelor. În astfel de aplicatii,
fisierele fara tip se comporta asemanator fisierelor cu tip. De fapt, cele doua tipuri de fisiere pot fi
interschimbate în procesul prelucrarii.

EXEMPLU :

{SE dau doua numere sa se caculeze media cu fisiere fara tip}


var f:file;
a:array[1..3] of real;
re:word;
i:integer;
begin
assign(f,'top.int');
rewrite(f,6);
a[1]:=3.4;a[2]:=6.2;
a[3]:=(a[1]+a[2])/2;
blockwrite(f,a,3,re);
writeln('cite blocuri sunt ',re);
reset(f,6);{Citi octeti se repartizeaza}
blockread(f,a,3);
for i:=1 to 3 do write(a[i]:8:2);
readln;
end.

4.5 Subprograme definite de utilizator


4.5.1 Proiectarea modulara a rezolvarii unei probleme

137
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Noţiunea de subprogram
Prin subprogram vom înţelege un ansamblu alcătuit din tipuri de date, variabile şi
instrucţiunii scrise în vederea unei anumite prelucrări (calcule, citiri, scrieri) şi care poate fi utilizat
(rulat) doar dacă este apelat de un program sau de alt subprogram.

Până în prezent am fost doar utilizatori de subprograme. Exemple de subprograme folosite:

■ matematice: sin, cos, exp, log.

■ de prelucrare a şirurilor de caractere:in Pascal avem pos,length …,iar in C++ strlen, strcpy, strncat.

■ chiar citirile şi scrierile se fac sub controlul unor subprograme speciale.

În acest capitol învăţăm să le creăm. Pentru a înţelege noţiunea de subprogram, vom porni de
la două exemple:

138
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

□ Se citeşte n, număr natural. Să se scrie programele care tipăresc valoarea calculată a expresiilor:

E1=1+1/2+1/3+1/4+…+1/n

E2=(1+1/2+1/3+1/4+…+1/n)ⁿ

Ce observăm? A doua expresie, se poate obţine din prima. Relaţia este:

E₂=E₁ⁿ

Cerinţa este de a scrie programe separate. Cum procedăm? Prin utilizarea cunoştinţelor
dobândite până în prezent, scriem cele două programe separat, iar în al doilea program, secvenţa care
calculează prima expresie, se copiază din primul.

Oare nu se poate lucra mai eficient? Răspunsul este afirmativ. Se scrie un program care
calculează E₁ şi care este apelat de ambele programe. Primul program va tipări valoarea transmisă de
subprogram, al doilea va ridica la putere această valoare şi va afişa rezultatul.

□ Se citeşte n, număr natural. Se citeşte un vector cu n componente numere reale. Se cere să se


tipărească vectorul sortat.

Desigur, ştim să rezolvăm această problemă şi clasic, în mai multe feluri, pentru că am studiat
mai mulţi algoritmi de sortare. De această dată vom rezolva problema prin utilizarea subprogramelor.

Vom scrie un subprogram care citeşte un vector, unul care tipăreşte un vector şi un al treilea
care sortează vectorul, după una din metodele cunoscute.

În acest caz, programul ar arăta astfel:

Pasul 1 apelează subprogramul care citeşte vectorul;


Pasul 2 apelează subprogramul care sortează vectorul;
Pasul 3 apelează subprogramul care tipăreşte vectorul.

Faţă de scrierea clasică, aici problema a fost descompusă în altele mai mici (citire, sortare,
tipărire). În general, o problemă complexă se rezolvă mai uşor dacă o descompunem în altele mai
simple. Apoi, şansele de a greşi la scrierea unui subprogram sunt cu mult mai mici decât acelea de a
greşi la scrierea unui program mare. Acesta din urmă rezultă din “asamblarea” subprogramelor la care
se adaugă, eventual, câteva linii scrise în programul principal. Putem acum enumera avantajele
utilizării subprogramelor:

■ reutilizarea codului –o dată scris, un subprogram poate fi utilizat de mai multe programe;

■ elaborarea algoritmilor prin descompunerea problemei în altele mai simple. În acest fel, rezolvăm cu
mult mai uşor problema;

■ reducerea numărului de erori car pot apărea la scrierea programelor;

■ depistarea cu uşurinţă a erorilor –verificăm la început subprogramele, apoi modul în care le-am
asamblat (le-am apelat din cadrul programului).
 Parametrii care se găsesc în antetul funcţiei se numesc parametrii formali.

Atunci când scriem o funcţie nu cunoaştem valoarea propriu-zisă a parametrilor. Funcţia trebuie să
întoarcă rezultatul corect, oricare ar fi valoarea lor. Din acest punct de vedere ei se numesc formali.

 Parametrii care se utilizează la apel se numesc parametrii afectivi.

La apel, lucrurile stau altfel: valorile acestora sunt cunoscute. Prin urmare aceştia se cunosc
parametrii efectivi.

139
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

În esenţă, o funcţie este alcătuită din:

 Antet – acesta conţine mai multe informaţii importante necesare compilatorului, numele funcţiei,
lista parametrilor formali, tipul rezultatului.
O funcţie poate fi apelată de sine stătător (prin nume şi lista parametrilor efectivi), dar poate fi inclusă şi în cadrul
expresiilor, caz în care, la evaluarea expresiei este apelată.

 Sistemul de operare alocă fiecărui program trei zone distincte în memoria internă în care se găsesc
memorate variabilele programului.

Segment de date

Segment de stivă

Heap

De asemenea, există posibilitatea ca variabilele să fie memorate într-un anumit registru al


microprocesorului. În acest caz timpul de acces la astfel de variabile este foarte mic, deci se pot obţine
programe optimizate.

 În general o variabilă se caracterizează prin 4 atribute. Acestea sunt:

Clasa de memorare.
Vizibilitate.
Durata de viaţă.
Tipul variabilei, singurul pe care l-am studiat până în prezent.

1. Clasa de memorare – precizează locul unde este memorată variabila respectivă. O variabilă poate
fi memorată în segmentul de date, în cel de stivă, în heap sau într-un registru al microprocesorului.

2. Vizibilitatea – precizează liniile textului sursă din care variabila respectivă poate fi accesată. Astfel
avem:

a. Vizibilitate la nivel de bloc (instrucţiune compusă);

b. Vizibilitatea la nivel de fişier – în cazul în care programul ocupă un singur fişier sursă,
singurul caz pe care îl tratăm acum.

c. Vizibilitatea la nivel de clasă – este în legătură cu programarea pe obiecte, pe care o veţi


studia în anul următor.

3. Durata de viaţă – reprezintă timpul în care variabila respectivă are alocat spaţiu în memoria
internă. Astfel avem:

a. Durata statică – variabila are alocat spaţiu în tot timpul execuţiei programului.

b. Durata locală - variabila are alocat spaţiu în timpul în care se execută instrucţiunile
blocului respectiv.

c. Durata dinamică – alocarea şi dezalocarea spaţiului necesar variabilei respective se face


de către programator prin operatori sau funcţii speciale.

SUBPROGRAMUL reprezintă o parte dintr-un program, identificabilă prin nume, care se poate lansa în execuţie
ori de câte ori este cazul.
În Pascal, subprogramele sunt de două tipuri:
 Funcţii
 Proceduri

140
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

4.5.2.Declarare ,definire si apel de subprograme

Funcţii
Definiţie:
O funcţie este un subprogram care calculează şi aduce în programul apelant o singură valoare.
Sintaxa unei funcţii este:
Function name (x1, x2, …, xn) : tip;
[Declaraţii]
begin

nume = expresie;

141
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end;

Prima linie a sintaxei poartă numele de antetul funcţiei sau linia de definiţie.
“Nume” reprezintă numele funcţiei şi este un identificator.
“Tip” reprezintă tipul funcţiei, care poate fi simplu, string sau referinţă.
x1, x2, …, xn sunt parametri formali şi sunt opţionali.
Declaraţiile pot fi: label, const, type, var, function, procedure şi sunt recunoscute doar în
cadrul funcţiei respective.
Apelul funcţiei se face prin:

nume (a1, a2, …, an);

unde a1, a2, …, an sunt parametri actuali.


Programul următor include o funcţie ce returnează maximul dintre trei numere.

program max_nr;
uses crt;
var x, y, z : integer;
function max : integer;
var t : integer;
begin
t:=x
if y > t then t : = y;
if z > t then t : = z;
max : = t
end;
begin
clrscr;
write (’introduceţi trei nr. !’);
readln (x,y,z);
writeln (’valoarea maximă = ’, max : 4);
readln
end.

În cadrul programului respectiv, x, y şi z sunt variabile globale relativ la funcţia MAX ; ele
sunt cunoscute şi în corpul funcţiei.
“t” se foloseşte pentru determinarea maximului dintre cele trei numere în interiorul programului definit
prin funcţia MAX . t este o variabilă locală a funcţiei MAX, care nu poate fi folosită decât în corpul funcţiei – ea
nu este cunoscută şi nu poate fi utilizată în program.
În acest caz, comunicarea între program şi funcţie se face prin variabile globale recunoscute şi în funcţie
şi nu este explicită.
Programul acesta poate fi scris şi astfel:

program max_nr;
uses crt;
var x,y,z : integer;
function max (a,b,c : integer) : integer;
var t : integer;
begin
t : = a;

142
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

if b > t then t : = b;
if c > t then t : = c;
max : = t
end;
begin
clrscr;
write (’introduceţi trei nr. !’);
readln (x,y,z);
writeln (’valoarea maximă:’, max (x,y,z) : 4);
readln
end.

În acest caz, elementele de comunicare între program şi funcţie sunt date explicit prin
declararea lor în linia de definiţie a funcţiei ca parametri formali.
Variabilele x,y,z declarate în secţiunea VAR a programului ca fiind de tip INTEGER nu sunt cunoscute
în corpul funcţiei.
În linia de definiţie a funcţiei, variabilele a,b,c sunt parametri formali care sunt cunoscuţi doar în corpul
funcţiei MAX.
Variabilele x,y,z sunt parametri actuali relativ la funcţia MAX, în formularea MAX (a,b,c : INTEGER).

PROCEDURI

Definiţie:
O procedură este un subprogram care furnizează în programul apelant unul sau mai multe
rezultate.
Sintaxa unei proceduri este:

Procedure nume ( x1, x2, …, xn);


[Declaraţii]
begin

end;

Sintaxa procedurii este asemănătoare cu cea a funcţiei: conţine un antet sau o linie de definiţie, numele
este un identificator stabilit de utilizator, x 1, x2, …, xn sunt parametrii formali care sunt opţionali, declaraţiile sunt
recunoscute doar în corpul procedurii.
Instrucţiunile cuprinse în structura “begin – end” constituie corpul procedurii.
Apelul unei proceduri se face prin numele ei.
Parametri procedurii sunt:
- de intrare (ale căror valori sunt iniţializate la apelul procedurii); aceştia sunt parametri
valoare
- de ieşire (ale căror valori sunt calculate în procedură ); aceştia sunt parametri variabilă.
exemplu:
program expresie;
var a : integer;
procedure adun;
var b : integer;

143
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

procedure scad;
var c : integer;
begin
write (‘c =’);
readln (c);
b : = b-c
end;
begin
write (’b =’);
readln (b);
scad;
a: = a +b
end
begin
write (’a =’);
readln (a);
adun;
writeln (’a = ’,a )
end.
Programul prezentat calculează expresia a+b-c. Programul principal apelează o procedură declarată în
cadrul lui (ADUN), iar aceasta la rândul ei apelează o altă procedură pe care o conţine (SCAD).
În acest caz, parametrii reprezintă un mecanism de interfaţă între subprogram şi blocul apelant.

4.5.3 Mecanismul de transmitere a informatiilor prin parametrii

Parametrii sunt:
- formali, care în momentul declaraţiei nu sunt cunoscuţi efectiv (ca valoare) şi sunt situaţi
în antetul subprogramului. Pot fi: nume de variabile, valori sau alte subprograme.
- efectivi, la care, în momentul apelului, valorile lor sunt cunoscute şi sunt situaţi în
instrucţiunea de apel.

144
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Între parametrii formali şi cei efectivi se realizează o corespondenţă de număr,ordine şi tip.

4.4.5 Variabile globale si locale,domeniu de vizibilitate


Variabile globale
Acestea se declară în afara corpului oricărei funcţii sau proceduri
La declarare, variabilele globale sunt iniţializate cu 0.

Atributele variabilelor globale sunt:

1. Clasa de memorare – segmentul de date.

2. Vizibilitatea – În cazul în care declaraţiile acestora sunt înaintea tuturor funcţiilor, acestea sunt
vizibile la nivelul întregului program (fişier). Dacă anumite funcţii se află plasate înaintea
declaraţiilor acestor variabile, atunci ele sunt vizibile doar pentru funcţiile care sunt plasate după
aceste declaraţii.

3. Durata de viaţă a variabilelor globale este statică. Ele au spaţiu rezervat în tot timpul execuţiei
programului.

Variabile locale

Acestea sunt declarate în


corpul funcţiilor. Mai
precis, pot fi declarate în
orice bloc (instrucţiune
compusă) al acestora
1. Clasa de memorare a
variabilelor locale este,
implicit, segmentul de
stivă. Există posibilitatea
ca acestea să fie alocate în
registrele
microprocesorului, caz în
care declaraţia lor trebuie
precedată de cuvântul cheie
register.

145
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

1. Variabilele locale nu sunt iniţializate implicit cu 0. În ipoteza în care acestea nu sunt iniţializate
explicit de programator, reţin o valoare oarecare, numită valoare reziduală.

2. Vizibilitatea variabilelor locale este la nivelul blocului la care au fost declarate.


3.În cazul în care, într-un anumit bloc sunt vizibile (se pot accesa) mai multe variabile, toate au acelaşi
nume, dar au domenii de vizibilitate diferite, se accesează variabila cu vizibilitatea cea mai mică.
. Există posibilitatea ca, un ciclu for să conţină declaraţia unei variabile locale.
5. Durata de viaţă a variabilelor locale este atât timp cât durează execuţia blocului respectiv.

4.5.3 Mecanismul de transmitere al informatiilor prin


parametrii
Transmiterea parametrilor

Aşa cum am arătat, parametrii care se găsesc în antetul funcţiei se numesc parametrii formali,
iar cei care se găsesc în instrucţiunea de apel se numesc parametrii efectivi.
După fiecare apel al funcţiei se tipăreşte suma obţinută. Între parametrii formali şi cei efectivi trebuie
să existe o anumită concordanţă, care este descrisă prin regulile următoare:

Numărul parametrilor formali trebuie să coincidă cu numărul parametrilor efectivi. La această regulă
există o excepţie care va fi prezentată într-un paragraf separat.
Tipul parametrilor formali trebuie să coincidă cu tipul parametrilor efectivi sau tipul parametrilor efectivi
să poată fi convertit implicit către tipul parametrilor formali la fel ca în cazul atribuirii
Observaţie: Nu este obligatoriu ca numele parametrilor formali să coincidă cu numele parametrilor
efectivi.

Vom analiza modul în care sunt memoraţi parametrii transmişi, în momentul lansării în
execuţie a funcţiei.

 Pentru memorarea parametrilor subprogramele folosesc segmentul de stivă, întocmai ca pentru


variabilele locale.

 Memorarea parametrilor transmişi se face în ordinea în care aceştia figurează în antet: de la stânga
la dreapta.

 În cadrul subprogramului, parametrii transmişi şi memoraţi în stivă sunt variabile. Numele lor este
cel din lista parametrilor formali.

 Variabilele obţinute în urma memorării parametrilor transmişi sunt variabile locale.


Există două mecanisme de transmitere a parametrilor, transmiterea prin valoare şi transmiterea prin
referinţă. Acestea vor fi tratate în continuare:

A. Transmiterea prin valoare se utilizează atunci când suntem interesaţi ca subprogramul să lucreze
cu acea valoare, dar, în prelucrare, nu ne interesează ca parametrul efectiv (cel din blocul apelant)
să reţină valoarea modificată în subprogram.

Se pot transmite prin valoare:

1. Valorile reţinute de variabile.


2. Expresii (acestea pot conţine şi funcţii).

1. Valorile reţinute de variabile. În acest caz, parametrii efectivi trebuie să fie numele
variabilelor.
2. Parametrii efectivi sunt expresii, care mai întâi se evaluează.
Aşa cum am arătat, transmiterea parametrilor prin valoare se utilizează atunci când nu ne
interesează ca, la întoarcerea din subprogram, parametrul efectiv să reţină valoarea modificată
acolo. Întrebare: dacă n-ar exista decât transmiterea prin valoare, ar fi posibil să modificăm
valoarea anumitor variabile care sunt declarate în blocul aparent?

146
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Răspunsul este afirmativ daca lucram cu variabile pointer.


Exemplu:
while not eoln do
begin
 {Cu funcrii sa se afiseze niste read(elem);
numere in ordinea a ,(a+1)*(a+1),a m:=m+[elem];end;
readln;
si a ,(a+1)*(a+1),a folosind transmiterea end;
parametrilor prin valoare si referinta} procedure s(m:mm);
var a:integer; var elem:'a'..'z';
function f(a:integer):integer; begin
begin if m=[] then writeln(' multimea vida ')
a:=a+1;f:=a*a; else
end; begin
function f1(var a:integer):integer; for elem:='a' to 'z' do
begin if elem in m then write(elem:2);
a:=a+1;f1:=a*a; writeln;
end; end;end;
begin procedure ss(var m:mm);
a:=2;write(a:3); var elem:'a'..'z';
write(f(a):3); begin
write(' ',a); if m=[] then writeln(' multimea vida ')
writeln; else
writeln('observati ca transmiterea lui a prin referinta'); begin
a:=2;write(a:3); for elem:='a' to 'z' do
write(f1(a):3); if elem in m then write(elem:2);
write(' ',a); writeln;
writeln; end;end;
readln; begin
end. write('multimea A : tastati pe linie un sir de elemente ');
cc(aa); write('multimea b tastati pe linie un sir de elemente
 {Cu proceduri sa se realizeze ');cc(bb);
operatii cu multimi in care elemnte write('reuniunea');S(Aa+Bb);
write('intersectia');S(Aa*Bb);
sunt litere write('diferenta');S(Aa-Bb);
(folositi transmiterea prin valoare ); c:=Aa+Bb;
write('reuniunea');ss(c);
Ce modificari faceti la listare pentru a c:=Aa*Bb;
realiza transmiterea prin referinta} write('intersectia');
ss(c);
type mm=set of 'a'..'z';
c:=Aa-Bb;
var c,aa,bb:mm;
write('diferenta');ss(c);
procedure cc(var m:mm);
READLN;
var elem:'a'..'z';
END.
begin
m:=[];

B. Transmiterea prin referinţă. Parametrii sunt transmişi prin referinţă atunci când de interesează
ca la revenirea din subprogram variabila transmisă să reţină valoarea stabilită în timpul execuţiei
subprogramului.

 În cazul transmiterii prin referinţă, parametrii efectivi trebuie să fie referinţe la variabile (vezi
tipul referinţă prezentat în capitolul anterior).

 În cazul transmiterii prin referinţă subprogramul reţine în stivă, adresa variabilei.

În acest caz ne putem întreba care este mecanismul prin care, deşi pentru o variabilă transmisă se
reţine adresa ei, în subprogram putem adresa variabila normal (nu indirect)? La compilare, orice
referinţă la variabila respectivă, este “tradusă” ca adresare indirectă.

Definirea şi declararea unui subprogram


Deşi aparent asemănătoare, cele două noţiuni diferă. Buna înţelegere a lor ne ajută să evităm
anumite erori. Mai mult, aceste noţiuni sunt utilizate de orice limbaj de programare.

□ A defini un subprogram, înseamnă a-l scrie efectiv, după structura anterior prezentată. O problemă
importantă este locul unde se defineşte subprogramul.

147
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

□ A declara un subprogram, înseamnă a-l anunţa. Un subprogram nedeclarat nu poate fi folosit.


Definiţia unui subprogram ţine loc şi de declaraţie!

Parametrii se transmit prin referinţă sau prin valoare.


Expresia a+b-c poate fi de asemenea calculată şi altfel.
În programul următor, procedurile sunt declarate una după alta, iar variabilele globale ale programului
sunt recunoscute de ambele proceduri.

program expresie;
var a,b,c,d : integer;
procedure adun;
begin
d: = a+b;
end;
procedure scad;
begin
d: = d-c;
end;
begin
write (’a =’); readln (a);
write (’b =’); readln (b);
write (’c =’); readln (c);
adun;
scad;
writeln (’d =’,d);
readln;
end.

PROCEDURI ŞI FUNCŢII STANDARD

 ARITMETICE

Function Abs (x: tip) : tip; - returnează valoarea absolută a expresiei x


Function Arctan (x : real) : real; - returnează valoarea în radiani a funcţiei trigonometrice arctg.x
Function Cos (x : real) : real; - returnează valoarea funcţiei trigonometrice cosx (x este exprimat în
radiani)
Function Frac (x : real) : real; - returnează partea fracţionară a expresiei x

Function Int (x : real) : real; - returnează partea întreagă a expresiei x

Function Ln (x : real) : real; - returnează logaritmul natural al lui x, unde x>0

Function Pi : real; - returnează valoarea aproximativă a lui  (pi)


Function Sin ( x : real) : real; - returnează valoarea funcţiei trigonometrice sinx ( x este exprimat în
radiani)
Function Sqr (x: tip) : tip; - returnează valoarea pătratului expresiei x
Function Sqrt (x : real ) : real; - returnează valoarea expresiei “radical din x”, cu condiţia ca x  0.

148
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

149
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

4.5.6 Recursivitate
Mecanismul recursivitati

▫ Sa se calculeze recursiv n!.

A) Pentru a scrie o functie recursiva care efectueaza acelasi calcul, vom porni de la o
definitie recursiva a lui n !. Aceasta este :

n !=fact(n)= 1, n=0
n€N
n * fact(n-1), astfel

De exemplu, pentru a calcula 3!, procedam astfel :

3 !=fact(3)=3 x fact(2)=3 x 2 x fact(1)=3 x 2 x 1 x fact(0)=3 x 2 x 1 x 1=6.


Observati ca functia fact se autoapeleaza. Autoapelul se realizeaza prin: return n*fact(n-1).

Care este mecanismul prin care subprogramele se pot autoapela? Sa ne amintim modul in care
subprogramele memoreaza parametrii transmisi:

● Pentru memorarea parametrilor, subprogramele folosesc o zona de memorie numita stiva (mai
exact, aceasta zona se numeste segment de stiva).

● Memorarea parametrilor transmisi se face in ordinea in care acestia figureaza in atent: de la


stanga la dreapta.

● Pentru parametrii transmisi prin valoare, se memoreaza valoarea transmisa, iar pentru cei
transmisi prin referinta se memoreaza adresa variabilei.

● In cadrul subprogramului, parametrii transmisi si memorati in stiva sunt variabile.Numele lor este
cel di lista parametrilor formali.

150
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

In capitolul anterior am studiat proprietatile structurii numita stiva. Exact aceleasi proprietati le are si
segmental de stiva.Singura diferenta este data de faptul ca gestiunea segmentului de stiva este facuta
automat de catre calculator.Mai exact, codul in limbaj masina, obtinut in urma compilarii, contine
secvente prin care se gestioneaza segmentul de stiva.

● La apelul subprogramului se depun in stiva, in ordine, parametrii transmisi. DE asemenea, tot in


stiva se rezerva spatiu pentru variabilele locale.(cele declarate in subprogram).Acesta este un prim
nivel al stivei.

● In cazul in care subprogramul se autoapeleaza pe un al doilea nivel se depun din nou parametrii
transmisi si se rezerva un nou spatiu pentru variabilele locale.

In continuare prezentam grafic modul in care functioneaza recursivitatea in cazul functiei fact a
programului anterior. Aceasta functie nu are variabile locale, deci in stiva se depune doar parametrul
n.

n→3 La primul apel al functiei fact se creeaza in segmental de stiva o


variabila numita n, care retine 3- valoarea parametrului formal.

n→2
n→3 Functia se autoapeleaza. De aceasta data parametrul n ia valoarea 2
.In stiva se creeaza un nou nivel, care retine n cu valoarea 2.

n→1 Functia se autoapeleaza. De aceasta data parametrul n ia


n→2 valoarea 1. In stiva se creeaza un nou nivel, care retine n cu
n→3 valoarea 1.

n→0 Functia se autoapeleaza.Parametrul n ia valoarea 0.In stiva se


n→1 creeaza un nou nivel, care retine n cu valoarea 0.Functia ia
n→2 valoarea 1, autoapelul nu mai are loc.Se revine pe nivelul 3.
n→3

n→1 Pe nivelul 3 se efectueaza calculul 1*1=1.Se revine apoi pe


n→2 nivelul 2.
n→3

n→2 Pe nivelul 2 se efectueaza calculul 2 * 1=2.Se revine apoi


n→3 pe nivelul 1.

n→3 Pe nivelul 1 se efectueaza calculul 3 * 2=6.Se revine apoi in


main( ).

Aici se afiseaza 6, adica s-a calculat 3 !.


Exemple :
1.Exemplu de definitie consistenta:

F:N N 2 Exemple :

Fact (0) = 1 ;
1, ,n = 0 Fact(2) = fact(1)*2 = fact(0)*1*2 = 1*1*2 =2
Fact (n) = Fact(2) = fact(3)*4 = fact(2)*3*4 = fact(1)*2*3*4
Fact(n-1)*n ,altfel = fact(0)*1*2*3*4 = 1*1*2*3*4 =24

151
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Var n:integer ;
Exempu de definire inconsistenta : Function pp(k , p :integer) :integer ;
Begin
F(0) = 1 If (k=p) then pp:=k else pp:=pp(k,p-1)*p
F(2) = f(4)*2 = f(6)*2*4 = f(8)*2*6*4 = ……. End;
Bein
Write(‘n =’);readln(n);
Realizati subprograme recursive in Write(‘pp =’, pp(1,n));
Pascal care returneaza: Readln;
End.
1+2+3+….+n.
Se da un sir x de nr intregi . SA se
realizeze subprograme in Pascal care
Program p1 ;
sa realizeze citrea si afiserea sirului
Uses crt; x.
Var n:integer ;
Function s(k , p :integer) :integer ; Procedure Cit_sir(x:Şir ; k,p : integer);
Begin Begin
If (k=p) then s:=k else s:=s(k,p-1)+p If (k=p) then readln(x[k]) else
End; Begin
Bein Readln(x[k]);
Write(‘n =’);readln(n); Cit_sir(x , k+1 , p);
Write(‘s =’, s(1,n)); End
Readln; End;
End. Procedure Afis_sir(x:Şir ; k,p : integer);
Begin
If (k=p) then write(x[k]:5) else
Begin
Realizati subprograme recursive in Pascal write(x[k]:5);
care returneaza: Afis_sir(x , k+1 , p);
1 x 2 x 3 x….x n. End
End;
Readln;
Program p1 ; End.
Uses crt;

4.6 Concepte de baza ale programarii orientate pe obiect


4.6.1 Principiile programarii orientate pe obiect.
Turbo Pascal si POO

Incepand cu versiunea 5,5,limbajul Turbo-Pascal a fost exstins pt programare orientata pe obiecte cu facilitati
inspirate din limbajul c++ si adaptate sintaxei Pascal.Principiile fundamentale si avantajele POO sunt aceleasi in
cele 2 limbaje,dar exista si multe deosebiri intre ele:

- -terminologia si cuvintele cheie folosite sunmt uneori diferite:’clasa’inC++ si’obiect’ inTP.’clasa


derivata si’ obiect descendent’etc.

- facilitatile oferite inTP sunt mai reduse ca in C++ :nu este posibila existenta mai multor functii sau
operatori cu acelasi nume,dar cu efecte diferite,nu exista functii sau clase prieten(\friends’),nu exista
mostenire multipla,nu exista clase predefinite pt operatii intrare iesire s,a;

- aceleasi convepte sunt implementate diferit,uneori cu mici diferente care nu sunt evidente la o citire
superficiala:rolul si necesitatea constructorilor si destructorilor.redefinirea metodelor virtuale in clasele
derivate s,a.

152
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

POO are multe in comuncu subiectul’structuri de date’:

-prin obiecte se realizeaza cea mai buna imprementare atipurilor de date abstracte,adica cea mai buna
incapsulare a unei SD si a metodelor asociare

structurile de date constitue uncandidat important pt crearea de obiecte si chiar exista biblioteci de obiecte
SD,care pot fi folosite ca atare si pt derivarea unor alte SD mai bine adaptate pt aplicatii.
CONCEPTE DIN ABORDAREA ORIENTATA OBIECT IN VFP
Tehnologia orientata obiect a introdus o serie de concepte care se folosesc atat in modelul orientata obiect cat si in
programarea orientata obiect.Prezentam o parte din aceste concepte si anume cele utilizate in Visual FoxPro.
Obiectul este un ansamblu de informatie si actiuni.Obiectele sunt entitati din lumea reala care
inglobeaza in ele stari (date) si comportamente(functiuni).Reprezentarea entitatilor se realizeaza printr-un
ansamblu de proprietati comune (colectii de proprietati)
Proprietatile sunt datele dintr-un obiect.In termenul Visual FoxPro proprietatea este o variabila de
memorie care se ataseaza unui obiect.Acesta poate fi referita sau modificata prin calificarea,utilizand numele
obiectului urmat de caracterul punct si apoi numele proprietatii.Proprietatea poate avea oricare dintre tipurile de
date acceptate de Visual FoxPro.
Metodele sunt procedurile atasate unui obiect.Unui obiect i se ataseaza,pe langa date ,si actiuni,care sunt
codificate in proceduri.Fata de procedurile obisnuite(tip procedura sau tip functie) exista o mica diferenta in ceea
ce priveste apelul unei metode.Pentru aceasta se utilizeaza numele obiectului,urmat de caracterul punct si apoi
numele metodei(calificarea).
Evenimentele sunt situatii(lucruri) care se produc la momentul executiei(exemplul clic pe
mouse).Evenimentele pot fi cauzate de actiunea utilizatorului(apasarea unui buton) sau a sistemului (producerea
unei erori).Cand se creeaza o clasa (de exemplu tip radio buton) in Visual FoxPro se poate atasa si codul
evenimentului (de exemplu metodele aferente).Atunci cand se produce evenimentul (de exemplu clic stanga cu
mouse-ul pe obiect),metoda asociata este automat apelata.
Utilizarea evenimentelor nu este noua in Visual FoxPro, ci ea se regaseste inca din FoxPro 2.0.(exemplu clauza
VALID ataseaza o procedura simpla unui eveniment).
In Vizual FoxPro se pot atasa metodele la toate tipurile de evenimente. Se poate atasa cod unui eveniment care se
executa automat atunci cand obiectul este creat (INIT EVENT) si/sau este sters(DESTROY EVENT).Apelul unui
eveniment se face intr-un mod similar cu al unei metode.
Clasa descrie comportamentul unui set de obiecte.Dintr-o clasa fac parte toate obiectele ce au
comportament comun si ea cuprinde una sau mai multe metode de descriere. Printr-o clasa se descrie:natura
datelor.metodele aferente,initializarea obiectelor,pozitia clasei intr-o eventuala ierarhie de clase.
In Visual FoxPro,si,in general,in programarea orientata obiect,obiectele nu sunt niciodata codificate,in schimb
clasele sunt.Toate obiectele sunt instatiate din clasa din care fac parte.Se fac astfel dinstinctie intre obiecte si clase.
Instatierea unui obiect este o realizare a unei clase data de valorile variabilei aferente.Ea se realizeaza in
Visual FoxPro prin functia CREATEOBJECT().In urma acestui program se ataseaza o variabila de memorie de tip
"Object" obiectului instantat,care provine dintr-o anumita clasa.
NOTA
Pentru a se face referire la proprietatilor obiectelor sau la metodele in ele insele se foloseste ca indentificator
pentru numele de obiect,cuvantul cheie THIS.
Mostenirea(succesiunea) este caracteristica unei clase de obiecte pentru a deriva datele si functile sale
din alta clasa.Cel mai adesea clasele de obiecte nu sunt independente,ci ele se gasesc dispuse in ierarhie.In Visual
FoxPro clasa care mosteneste se numeste superclasa.
Pentru a referi un membru dintr-o ierarhie de clase se foloseste calificarea cu ajutorul caracterului . .
De exemplu daca avem obiectul "mForm" pe nivelul cel mai de sus al ierarhiei si obiectul"mTextBox"
pe nivelul cel mai de jos atunci referirea va fi:
mForm.mPageFrame.mContainer.mTextBox.
Protectia metodelor si proprietatilor claselor este asigurata prin faptul ca acestea nu pot fi accesate din
afara clasei,daca nu se specifica acest lucru.La definirea unei clase se decide de catre programator,care este
interfata publica(partea accesibila tuturor) si care sunt metodele si proprietatile care vor fi utilizate numai in
interiorul clasei (partea privata).In Visual FoxPro acest lucru se realizeaza ,atat prin proprietati cat si prin
metode,prin cuvantul cheie PROTECT.
Polimorfismul este caracteristica unei clase de obiecte prin care se pot da metodelor si proprietatilor din
diferite clase acelas nume,daca ele se refera la situati diferite.Polimorfismul se utilizeaza intens in realizarea
claselor de obiecte.Se poate utiliza,de exemplu, pentru o standardizare a numelor metodelor pentru situatii
similare.Efectul va fi ca la acelas mesaj,diferite obiecte por furniza raspunsuri diferite.
Mesajul este o cerere de regasire care se transmite spre un obiect pentru a executa o anumita
metoda,obtinandu-se un raspuns.Mesajul este modul de comunicare intre obiecte.In Visual FoxPro transmiterea de

153
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

mesaje are loc la crearea unui obiect,la citirea valori unei proprietati ,la apelul unei metode.
Incapsularea este caracteristica care se refera la faptul ca obiectul este o unitate de sine
statatoare .Obiectul,ca instantierea a unei clase contine date sub forma de proprietati de date si metode.
Alaturi de polimorfism si mostenire incapsularea reprezinta caracteristicile de baza ale obiectelor.Acestea sunt date
de tehnologia orientata obiect si sunt implementate in Visual FoxPro.
Realizarea programelor dupa tehnologia orientata obiect presupune ca pas final scrierea obiectelor
intr-un limbaj de programare.Inainte de acest pas trebuie realizate analiza si proiectarea orintate obiect.Pentru
aceste activitati au fost utilizate diferite metodologii In realizarea unei aplicatii cu baze de date, in jur de 70%din
timp este alocat,de catre analist,pentru activitatile de analiza si proiectare.In cazul utilizari tehnologiei orientate
obiect,principalul rezultat al analizei si proiectarii aplicatiei este identificarea si ierarhizarea claselor de obiecte
precum si stabilirea proprietatilor si metodelor.
Tipuri de obiect in tip

Un tip obiect este asemanator unui tip inregistrare dar contine in plus si functii,sau proceduri,numite si’metode’.Un
tip obiect este o structura cu numar fix de componente dintre care unele sunt campuri de date,iar altele sunt metode
ale obiectului respective.
Definirea unui obiect tip seamana cu definirea unui tip inregistrare,dra foloseste cuvantul cheie’obiect’in locul
cuvantului’record’
EXEMPLU
type complex=object
re,im:real;
procedure init(cre,cim:real);
procedure write;
procedure plus(c:complex);
function egal(c:complex):Boolean;
end;
Tipurile obiect trebuie declaratela inceputul unui program sau unei unitati ;ele nu pot fi declarate intr-un sub
program(sau intr-o alta metoda).
Metodele unui tip obiect sunt declarate in definitia obiectului respestiv,dar sunt definite ulterior;declararea
metodelor este deci o declarare anticipata,dar fara cuvantul cheie ‘forward’.
EXEMPLU
procedure Complex .Init(cre,cim:real);
begin
re:=cre;
im:=cim;
end;
procedure Complex.Write;begin
writeln(‘(‘,re:7:2,’,’,im:7:2,’)’);end;
O metoda poate apela alte metode ale aceluiasi obiect sau al altor obiecte si poate avea argumente de tip
obiect.EXEMPLU
Procedure Complex.Plus(c:complex);begin
re:=re+c.re;
im:=im+c.im;
end;
Lista de parametric din definitia unei metode trebuie sa coincida cu cea din declaratia metodei in definitia tipului
obiect;deci trebuie folosite aceleasi nume pt argumentele formale.Exemplu de eroarein definirea metodei init:
procedure complex.init(pre,pim:real);begin…end;
Daca tipurile obiect definite vor fi folosite in mai multe programe,atunci este preferabil sa se ceeze un fisier
untate TP care sa contina in partea de interfata definitiile obiectelor,iar in partea de implementare definitile
metodelor

UTILIZAREA DE VARIABILE OBIECT

Deci este posibil accesul direct la datele unui obiect ,se recomanda ca prelucrarea campurilor de date ale unui
obiect sa se faca numai prin intermediul metodelor acelui obiect.Inacest sens exemplul dat ar trebui completat cu
metode de acces la partea reala si la partea imaginara aunui numar complex.
EXEMPLU
function complex.RePart:real begin
RePart:=re;end;

154
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Dupa definirea unui obiect se pot declara variabile obiect,tablouri de variabile obiect,pointeri catre tipul obiect,se
pot folosii parametric de un tip obiect in sub programe;
aceste variabile pot fi statice sau dinamice,pot fi globale sau locale unui sub progerm.
Utilizarea componentelor unui obiect este similara cu cea acomponentelorunei inregistrari,
EXEMPLU
var c1,c2:complex;
PC: complex;
c1.init(3,4);c1.write;
new(PC);PC.init(7.8);PC.write;
Este posibila atribuirea intre variabile obiect de acelasi tip,asa cum este posibila atribuirea intre inregistrari de
acelasi tip.
EXEMLPU
C2:=C1;C2.WRITE;
A se observa diferenta dintre modul de folosire al unei metode si modul de folosire a unei proceduri.
De fapt aceasta diferenta este mai mult de notatiie pt ca in realitate o metoda primeste ca parametru variabila
obiect pt care a fost apelata .Deci,notatie:
c2.write;c1.init(7.8) sunt echivalente ca effect cu notatile:
write (c2)l;init(c1.7,8);
Primul parametru al oricarei metode este variabila obiect pentru care se executa;el este accesibil si ca parametru
formal cu numele ‘self’.
procedure complex.PLUS(var self:complex;c:complex);
begin
self:re:=self.re+c.re;
self.im:=self.im+c.im;end.

4.6.2 Incapsulare

Ideea de obiect are la baza o notiune mai simpla, deja cunoscuta, si anume aceea de
inregistrare(record). Spre deosebire de inregistrari, obiectele pot contine, pe langa date, functii si proceduriceea ce
mai poarta denumirea de incapsulare..
Una dintre cele mai simple definitii de obiect este urmatoarea:
Type complex=object
Re,im:real;
Function modul: real;
End;
Function complex.modul:real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
Cea mai simpla cale de definire a nr complexe ar putea sa porneasca de la tipul de date record
Type complex=record
Re,im: real;
End;
Obiectul nostru va avea definitia:
Function complex=object
Re,im: real;
Function modul: real;
End;
Function complex.modul: real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
METODA CONSTRUCTOR
Metoda care initializeaza variabilele
Constructor init (a,b: real);
Constructor complex.init(a,b: real);
Begin

155
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Re:=a;
Im:=b;
End;
Apelul constructorului se face prin calificarea obisnuita:
z.complex(10,12);
Deci se va face initializarea datelor componente ale lui z astfel incat z.re va avea valoarea 10, iar z.im va avea
valoare 12.
Observatie:
Un obiect poate avea mai multe metode constructor, singura restrictie fiind aceea ca acesti constructori trebuie
sa difere prin nume.
Obiectul complex va avea acum definitia:
Type complex=object
Re, im: real;
Constructor init(a,b:real);
Constructor generare(x:real);
In care constructorul generare este descris prin:
Constructor complex.generare(x:real);
Begin
Re:=x;
Im:=0;
End;
Acest constructor va fi apelat in forma:
z.generare(x);
Iata cum arata cel mai simplu program “cu obiecte” in limbajul Pascal:

Type complex=object FRACTIE


Re,im:real; Definiti un obiect care sa reprezinte notiunea de
Constructor init(a,b:real); fractie ordinara si o metoda care sa determine
Constructor generare(x:real); fractia zecimala echivalenta.
Function modul:real; Type fractie=object
End; P,q:integer;
Constructor complex.init(a,b:real); Constructor init(a:integer);
begin Function zecimal:real;
Re:=a; End;
Im:=b; Constructor fractie.init (a:integer);
End; Begin
Constructor complex.generare(x:real); P:=a;
Begin Q:= 1;
Re:=x; End;
Im:=0; Function fractie.zecimal:real;
End; Begin
Function complex.modul: real; Zecimal:=p/q;
Begin End;
Modul:=sqrt(sqe(re)+sqr(im)); Punct in reper cartezian
End; Definiti un tip de obiect care sa reprezinte
Var z,u:complex;
Begin
notiunea de punct intr-un reper cartezian
z.init(3,4); writeln(z.modul); si o metoda prin care sa se determine
u.generare(4); u.im:=3; writeln(u.modul); distanta de la el la originea sistemului de
end. coordonate
Type punct=object
O procedura poate fi inclusa in definitia unui X,y:real;
obiect: Constructor generare;
Type complex=object Function distanta:real;
Re,im:real; End;
Constructor init(a,b:real); Constructor punct.generare;
Constructor generare(x:real); Begin
Function modul: real; X:=0;y:=0;
Procedure complex.afisare; End;
end; Function punct.distanta:real;

156
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Begin Distanta:=sqrt(sqr(x)+sqr(y));
Distanta:=sqrt(sqr(x)+sqr(y)); End;
End; Type dreptunghi=object
Dreptunghi U,v:punct;
Definiti un tip de obiect care sa reprezinte Constructor generare(a,b:punct);
notiunea geometrica de dreptunghiavand Function aria:real;
u.x:=a.x; u.y:=a.y;
laturile paralele cu axele de coordonate si v.x:=b.x; v.y:=b.y;
atasati o metoda care sa furnizeze aria sa. end;
Program test; function dreptunghi.aria:real;
Type punct=object begin
X,y:real; aria:=abs((u.x-v.x)*(u.y-v.y));
Constructor generare; end;
Function distanta:real; var
End; a,b:punct;
Constructor punct.generare; x:dreptunghi;
Begin begin
X:=0;y:=0; a.generare; a.x:=1; a.y:=1;
End; b.generare; b.x:=2; b.y:=2;
Function punct.distanta:real; x.generare(a,b);writeln(x.aria);
Begin end.
4.6.3 Mostenire
Limbajul Pascal ofera ofera o cale de reutilizare si extindere a insesi definitiei unui obiect. Avem
posibilitatea ca pornind de la o definitie de obiect sa o imbogatim adaugand noi date si metode.
Aceasta posibilitate este in realitate cel de-al doilea concept fundamentalal programarii pe obiecte si
poarta numele de mostenire.
Definitie:
Mostenirea reflecta preluarea tuturor datelor si metodelor unui stramos la care se
pot adauga alte date si metode noi rezultand un urmas.
Modificarea modului de functionare a metodelor conduce la un al treilea concept fundamental al programarii
pe obiecte si anume acela de polimorfism.
In mod concret mostenirea seamana cu un apel de functie.
Dam in continuare un exemplu de aplicare a mecanismului de mostenire pentru a obtine dintr-o fractie
(stramos)
un urmas numit rational :
unit_rat;
interface
type fractie=object
p,q:integer;
constructor init (n,m:integer);
end;
implementation
constructor fractie.init;
begin
p:=n; q:=m; end;
procedure rational. simplific;
begin
if a=b then p:=1
else begin
a:=abs(p);
b:=abs(q);
while(a<>b) do if a<b then b:=b-a else a:=a-b;
p:=semn*round(abs(p)/a); q:=round(abs(q)/a);
end;
end;
begin
end.
Obiecte derivate.

157
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Tipurile obiect definite si utilizate in programemodeleaza anumite oboiecte reale,asa cum obiectele reale pot fi
grupate si clasificate dupa semanarile si deosebirile dintre ele,tot asa putem recunoaste obiecte ci parti commune
care pot fi grupate intr-o familie de obiecte.Definirea unui obiect D derivat dintr-un obiect de baza D se face dupa
sintaxa urmatoare:
type D =object(B)…end;
Unobiect descendent mosteneste automat toate componentele obiectului din care descinde,dar are urmatoarele
posibilitati de a fi diferit de acesta:
-sa adauge alte componente noi ;
-sa redefineasca metodele mostenite.pt a le modifica actiunea,cu pastrarea numelor metodelor.
Redefinirea se face diferit pentru metodele statice sau virtuale;redefinirea metodelor statice poate modifica tipul
functiei ,nimarul si tipul argumentelor.
Un obiect descendent poate servi la randul lui ca baza pt crearea altor obiecte derivate.In felul acesta se poate
crea o ierarhie de obiecte inrudite.
EXEMPLU
unit figuri;
interface uses graph,crt;
type point=object
x.y:integer;
color integer;
procedure init
procedure show;
procedure hide;
procedure set color;
procedure move to
end;
circle=object;
r:integer
procedure init
procedure show;
procedure hide;
procedure move to;
procedure expand;
end;
point ptr=point;
circle ptr=circle;
implementation
procedure point.init
begin
x:=init x
y;=inity;
color:=white;end
procedure poin.show;begin
put pixel(x,y,color);end;
procedure point.hide;begin
put pixel (x.y.getbkcolor);end;
procedure point.move to ;begin
hide;x:=new x;y:=new y;show;end;
procedure poin set color(c:integer);
begin
if(h>=0)and(h<=15)then color :=c;end;
procedure circle.init;
begin
point,init;
r:=init r;
end;
procedure circle .show;
begin
graph.set color;(color)
graph,circle;end;
procedure circle.hide;

158
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

graph set.color(get back color);


graph circle(x,y,r);
end;
procedure circle expand(expandby:integer;)
begin
hide;
r;=r+expandby;if r<0 then r:=0;
show;end;
end.
In general numele unei functii sau proceduri dintr-o unitate poate fi prefixat cu numele unitatii ,pt evitarea unei
ambiguitati in apelasrea lor.Obiectul’circle’ este derivat din obiectul’point’,de la care mosteneste urmatoarele
metode:
setcolor:folosita fara modificari de circle;
init,show,hide,move to:redefinite incircle’
In plus,obiectul ‘circle’ adauga o metoda noua numita ‘expand’.
EXEMLPU
program desene ;
uses graph.figuri;
var gd,gm:integer;
punct:point;cerc:circle;
begin
gd:=detect;
init graph(gd,gm,’);punct.init(300,200);punct.show;readln;
punct.set color(yellow);punct.move to (400,300);readln;
cerc,init(200.100,60);cerc .show;readln;
cerc set color(red);cerc.move to (300,200);readln;set color(green);cerc expand(-20);readln;
end.
4.6.4 Polimorfism
Rescrierea metodelor

Urmasii pot modifica metodele mostenite. Simpla reanuntare a metodei in definitia urmasului conduce la
inlocuirea metodei
mostenite cu una noua .
Vom ilustra conceptul de polimorfism prin definirea notiunii de punct in reper cartezian .Un punct e
caracterizat de cele doua
coordonate, xsiy Obiectul de tip punct va contine pe langa cele doua date , urmatoarele metode:constructor ,
distanta pana la origine ,si afisare.
type punct=object
x,y:real;
constructor init(a,b:real);
function ro :real;
procedure afis;
end;
Definitie:
Numim polimorfism, acea proprietate prin care o functie apelata prin acelasi nume , poate avea actiuni
diferite de la stramos la urmas .
Cum se construieste un unit ?
unit imaginar ;
interface
type complex =object
re,im:real;
constructor init (a,b:real);
constructor generare (x:real);
function modul : real;
procedure afisare; end;

implementation
constructor complex .init(a,b:real);
begin re:=a; im:=b ; end;
constructor complex.generare (x:real)

159
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin
re:=x; im:=0; end;
function complex .modul:real;
begin
modul :=sqrt(sqr(re)+sqr(im));

end;

4.6.5 Constructori si desconstructori


ALOCAREA DINAMICA A OBIECTELOR,DESTRUCTORI

Obiectele pot fi alocate dinamic prin intermediul procedurii new. Aceste obiecte vor fi create in heapsi
pot fi
distruse prin apelul proceduriidispose. Utilizarea procedurilor new si dispose se face prin sintaxa extinsa in care
acestea
au doi parametrii:
-new are primul parametru un pointer catre obiectul care urmeaza sa fie creat iar al doilea este chiar
constructorul
obiectului.
-disposeare primul parametru un pointer catre obiectul care va fi distrus iar al doilea seste detructorul
obiectului.
exemplu:
program dinamic ;
type exemplu=object
n:integer;
constructor gen(i:integer);
destructor dis;
end;
constructor exemplu.gen(i:integer);

begin
n:=i;
writeln(‘am creat un obiect’);
destructor eemplu .dis;
begin
writeln(‘am distrus un obiect’);
end;
var E,F:^exemplu;
begin
end.
De obicei constructorul;unui obiect descendent are ca prima actiune apelarea constructorului obiectului din
care se dechide. In general se definesc ca metode virtuale acele metode care se pot modifica pt obiectele
descendente,dar care sunt folosite in alte metode care nu vor mai fi modificate

4.6.6 Domeniu de vizibilitate al componentelor unui obiect


Prima cerinta pt o astfel de structura de date (SD) generalizata este ca ea sa poata contina componente de orice
tip, chiar de tipuri inca neprecizate.Mai precis,aici putem distinge doua aspecte:
-componentele unei SD sa poata contine date de orice tip,independente de tipurile obiect din familia SD;
-componentele unei SD sa poata contine pointeri catre SD (structuri de date) din aceasi familie.
Solutia pt o structura de date(SD) cu elemente de orice tip in POO presupune urmatoarele operatii:
1)definirea unui obiect abstract de baza fara date,dar cu cateva metode general aaplicabile ,care urmeaza a fi
redefinite pt fiecare obiect descendent din el.
2)definirea unor SD avand in campul de date af fiecarui element un pointer catre obiectul abstract”orice”:vactro de
pointeri catre’orice’,lista inlantuita de pointeri catre orice.
3)definirea,in cadrul fiecarei aplicatii a obirctelor de date necesare derivate din obiectul abstract’orice
‘,iar pointeri catre aceste obiecte specufice alpicatiei se intropduc intr-o SD adecvata aplicatiei.
Obiectele SD,impreuna cu metodele asociate se definesc in una sau mai multe unitati ,iar prigramele de
aplicatie folosesc aceste unitati

160
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

5. Metode de programare
5.1 BACKTRACKING:prezentare generala,oportunitatea
utilizarii metodei;aplicatii specifice
Aspecte teoretice
Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan
conditiile:
-solutia lor poate fi pusa sub forma unui vector S=x 1,x2…xn , cu x1 €A1 ,… xn€ An;
-multimile A1 ,… An; sunt multimi finite ,iar elementele lor se considera ca se aflã intr-o
relatie de ordine bine stabilita;
-nu se dispune de o alta metoda de rezolvare mai rapida.
Observatii:
-nu pentru toate problemele n este cunoscut de la început;
-x1,x2…xn pot fi la rândul lor vectori;
-în multe probleme ,multimile A1 ,… An; coincid.
La întâlnirea unei astfel de probleme, dacã nu cunoastem aceasta tehnica,
suntem tentati sã generãm toate elementele produsului cartezian A 1XA2X… X An; si
fiecare element să fie testat dacă este soluţie. Rezolvând problema în acest mod ,
timpul de execuţie esteatât de mare, încât poate fi considerat infinit,algoritmul neavând
nici o valoare practica.
De exemplu, dacă dorim să generăm toate permutările unei multimi finite A, nu
are rost să generăm produsulcarteyian AxAx…xA, pentru ca apoi, să testăm pentru
fiecare element al acestuia, dacă este sau nu permutare)nu are rost să generăm
1,1,1,1,1…,1, pentru ca să constatăm că nu am obţinut o permutare, când de la a
doua cifră 1 ne putem da seama că cifrele nu sunt distincte).
Obs: tehnica Backtracking are ca rezultat obţinarea tuturor soluţiilor problemei. În
cazul în care se cere o singură soluţie , se poate forţa oprirea , atunci când a fost
găsită.
Pentru uşurarea înţelegerii metodei, vom prezenta o rutină unică,aplicabilă
oricărei probleme, rutină care este elaborată folosind noţiunea de stivă. Rutina va
apela proceduri şi funcţii care au întotdeauna acelaşi nume şi parametri şi care , sin
punct de vedere al metodei, realizează acelaşi lucru. Sarcina rezolvitorului este să
scrie explicit, prntru fiecare problemă în parte, procedurile şi functiile apelate de rutina
backtracking.
Evident, o astfel de abordare conduce la programe lungi. Nimeni nu ne opreşte
ca, după înţelegerea metodei, să scriem programe scurte, specifice fiecărei probleme
în parte.
Am arătat că orice soluţie se generează sub formă de vector. Vom că
generarea soluţiilor se face într-o stivă. Astfel x1 €A1 se va găsi pe primul nivel al stivei,
x2 €A2 se va găsi pe al doilea nivel al stivei,…, xk €Ak se va găsi pe nivelul k al stivei.
Nivelul k+1 al stivei trebuie iniţializat (pentru a alege ,în ordine, elementele
mulţimii k+1). Iniţializarea trebie făcută cu o valoare aflatăînaitea tuturorvalorilor
posibile din mulţime.
De exemplu , pentru generarea permutărilor mulţimii{1,2,…n} , orice nivel al
stivei va lua valori de la 1 la n . Iniţializarea unui nivel se face cu valoarea 0. Procedura
de iniţializare o vom numi init şi va avea doi parametri:k,nivelul care trebuie iniţializat
şi ST(stiva).
=>Găsirea următorului element al mutţimii Ak , element netestat se face cu ajutorul
procedurii succesor(as,st,k). Parametrul as-am succesor-este o variabilă booleană.

161
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

În situaţia în care am găsit elementul, acesta este pus în stivă şi as ia valoarea true,
contrar as ia valoarea false.
=> Odată ales un element, trebuie văzut dacă acesta îndeplineşte condiţiile de
continuare. Acest test se face cu ajutorul procedurii valid(ev,st,k). Variabila ev este
booleană.
=>Testul dacă s-a ajuns sau nu la soluţia finală
se face cu ajutorul funcţiei soluţie(k).

Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan urmatoarele conditii:
 solutia lor poate fi pusa sub forma unui vector S=x1,x2,..,xn,cu x1 apartine de de A1,x2
apartine de A2,…,xn apartine de An;
 multimile A1,A2,…,An sunt multimi finite,iar elementele lor se considera ca se afla intr-o relatie
de ordine bine stabilita;
 nu se dispune de o alta metoda de rezolvare,mai rapida.
Observatii:
 nu pentru toate problemele n este cunoscut de la inceput;
 x1,x2,…,xn pot fi la randul lor vectori;
 in multe probleme,multimile A1,A2,…,An coincide.
Observatie: tehnica Backtracking are ca rezultat obtinerea tuturor solutiilor problemei.In cazul in care se
cere o singura solutie,se poate forta oprirea,atunci cand a fost gasita.
 Pentru usurarea intelegerii metodei,vom prezenta o rutina unica(aplicabila oricarei
probleme),rutina care este elaborate folosind structura de stiva.Rutina va apela functii care au
intotdeauna acelasi nume si care,din punct de vedere al metodei,realizeaza acelasi
lucru.Sarcina rezolvitorului este sa scrie explicit,pentru fiecare problema in parte,functiile
apelate de rutina backtracking.
 Evident o astfel de abordare conduce la programe lungi.Nimeni nun e opreste ca,dupa
intelegerea metodei,sa scriem programe scurte,specifice fiecarei probleme in parte(de
exemplu,scurtam substantial textul doar daca renuntam utilizarea unor functii,scriind
instructiunile lor chiar in corpul rutinei).
Aplicatii rezolvate iterativ
o Generarea permutarilor.Se citeste un numar natural n.Sa se genereze toate permutarile
multimii {1,2,..,n}.
Generarea permuatrilor se va face tinand cont ca orice permutare va fi alcatuita din elemente distincte
ale multimii A={1,2…,n}.
Prezentam algoritmul corespunzator cazului n=3;
1 2 3

1 2 2 2 2

1 1 1 1 1 1

1 2 3

3 3 3 3 1

1 1 1 1 2 2

1 2 3 1

1 1 1 2 3 3

2 2 2 2 2 2

162
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

 se incarca in stiva pe nivelul 1 valoarea 1;


 incarcarea valorii 1 pe nivelul al 2-lea nu este posibila,intrucat aceasta valoare se gaseste sip e
nivelul 1 al stivei;
 incarcarea valorii 2 pe nivelul al 2-lea este posibila,deoarece aceasta valoare nu mai este
intalnita;
 valoarea1 din nivelul al 3-lea se regaseste pe nivelul 1;
 valoarea 2 din nivelul al 3-lea se regaseste pe nivelul al 2-lea;
 valoarea 3 pe nivelul al 3-lea nu e intalnita pe nivelurile anterioare;intrucat nivelul 3 este
completat corect,afisam 1 2 3

Algoritmul continua pana cand stiva devine vida.
o Problema celor n dame.Fiind data o tabla de sah n xn,se cer toate solutiile de aranjare a n
dame,astfel incat san u se afle doua dame pe aceeasi linie,coloana sau diagonala(damele san
u se atace reciproc).
Exemplu:Presupunand ca dispunem de o tabla de dimensiune 4X4,o solutie ar fi urmatoarea:
D

Cum procedam?Observam, ca o dama trebuie sa fie plasata singura pe linie.Plasam prima dama pe
linia 1 coloana 1.

A doua dama nu poate fi asezata decat in coloana a 3-a.

Observam ca a treia daman u poate fi plasata in linia a 3-a.Incercam atunci plasarea celei de-a doua
dame in coloana a 4-a.
D

A treia daman u poate fi plasata decat in coloana a 2-a.

163
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

In aceasta situatie dama a patra nu mai poate fi asezata.Incercand sa avansam cu dama a


treia,observam ca nu este posibil sa o plasma nici in coloana a 3-a,nici in coloana a 4-a,deci o vom
scoate de pe tabla.Dama a doua nu mai poate avansa,deci si ea este scoasa de pe tabla.Avansam cu
prima dama in coloana a 2-a.
D

A doua dama nu poate fi asezata decat in coloana a-4-a.

D
D

Dama a treia se aseaza in prima coloana.

D
D
D

Acum este posibil sa plasam a patra dama in coloana a-3-a si astfel am obtinut o solutie a problemei.

D
D
D
D

Algoritmul continua in acest mod pana cand trebuie scoasa de pe tabla prima dama.

Pentru reprezentarea unei solutii putem folosi un vector cu n componente (avand in vedere ca pe
fiecare linie se gaseste o singura dama).Exemplu:pentru solutia gasita avem vectorul st ce poate fi
asimilat unei stive.
Doua dame se gasesc pe aceeasi diagonala daca si numai daca este indeplinita conditia:l st(i)-st(j) l=li-
jl: diferenta, in modul, intre linii si coloane este aceeasi).

ST(4)
ST(3)
ST(2)
ST(1)

In general ST(i)=k semnifica faptul ca pe linia i dama ocupa pozitia k.

Exemplu: in tabla 4x4 avem situatia:

164
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

D st(1)= 1 i=1
st(3)=3 j=3
D l st(1) – st(3) l = l 1-3 l=2
l i-j l = l 1-3 l= 2

sau situatia:

D st(1) = 3 i = 1
st(3) = 1 j=3
D | st(i) – st(j)l|= | 3-1 | = 2
| i-j | = |1-3 | = 2

Intrucat doua dame nu se pot gasi in aceeasi coloana, rezulta ca o solutie este sub forma de permutare.
O prima idee ne conduce la generarea tuturor permutarilor si la extragerea solutiilor pentru problema
( ca doua dame sa nu fie plasate in aceeasi diagonala).A proceda astfel, inseamna ca nu lucram
conform strategiei backtracking.

end;

begin
type sir =array[1..100] of integer; READLN(N);
write('dati vectorul ');
var x:sir; readln(v);
p,i,j,k,n,k1:integer; for i:=1 to n do
as,ev:boolean; read(v[i];
v:string[20]; k:=1;
x[k]:=0;
procedure succesor(var while(k>0) do
x:sir;k:integer;var as:boolean); begin
begin repeat
if (x[k]<n) then begin succesor(x,k,as);
as:=true; x[k]:=x[k]+1; if as then valid(x,k,ev)
until (as and ev) or (not
end as);
else if as then
as:=false; if (k=n) then
end; afis(x,k)
else
3 procedure begin
1 valid(x:sir;k:integer;var k:=k+1;
4 ev:boolean); x[k]:=0;
2 var i:integer; end
begin else
ev:=true; k:=k-1 ;
for i:=1 to k-1 do end;
if v[x[k]]=v[x[i]] then readln;
ev:=false; end.

end; LIMBAJUL PASCAL


PROBLEMA DAMELOR
type sir =array[1..100] of integer;
procedure afis(x:sir;k:integer);
var i:integer; var x:sir;
begin p,i,k,n,s:integer;
for i:=1 to n do as,ev:boolean;
write(v[x[i]],' ');
procedure succesor(var
writeln; x:sir;k:integer;var as:boolean);

165
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin x[k]:=0;
if (x[k]<n ) then begin end
as:=true; x[k]:=x[k]+1; else
k:=k-1 ;
end end;
else readln;
as:=false; end.
end;
{se pleaca din orasul 1 si se
procedure valid(x:sir;k:integer;var cunosc distantele la celelate
ev:boolean); orase
var i:integer; Se cer toate traseele ce trece
begin prin toate localitatile si
ev:=true; ajunge la primul
for i:=1 to k-1 do iar distanta zero inseamna ca
if (x[k]=x[i]) OR (K-i =ABS(X[K]- nu am legatura directa}
X[I])) then ev:=false; uses crt;
type sir =array[1..100] of
end; integer;

var x:sir;
procedure afis(x:sir;k:integer); i,j,k,n:integer;
var i,j:integer; as,ev:boolean;
begin p:=p+1; a:array[1..50,1..50] of
for i:=1 to n do integer;
begin
procedure succesor(var
for j:=1 to n do x:sir;k:integer;var
if x[i]=j then as:boolean);
write('1 ',' ') begin
else if (x[k]<n) then begin
write('0 ',' '); as:=true;
x[k]:=x[k]+1;
writeln;end; end
writeln('------------------'); else
as:=false;
end; end;

begin procedure
valid(x:sir;k:integer;var
write('dati numarul n= '); ev:boolean);
readln(n); begin
k:=1; p:=1; ev:=true;
x[k]:=0; if(a[x[k-1],x[k]]=0 )then
ev:=false
while(k>0) do else
begin begin
repeat for i:=1 to k-1
succesor(x,k,as); do
if as then valid(x,k,ev) if x[i]=x[k] then ev:=false;
until (as and ev) or (not if(k=n) and(a[x[n],x[1]]=0)
as); then ev:=false;
if as then end;
if k=n then begin end;
writeln('solutia
',p);writeln('==============');
afis(x,k); procedure
end afis(x:sir;k:integer);
else var i:integer;
begin begin
k:=k+1;

166
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

for i:=1 to k do
write(x[i]:5); end
WRITELN; else
end; as:=false;
begin end;

write('dati numarul procedure


nodurilor'); valid(x:sir;k:integer;var
readln(n); ev:boolean);
for i:=1 to n do var i:integer;
for j:=i+1 to n do begin
begin ev:=true;
writeln('legatura intre FOR I:=1 TO k-1 do
localitatea ',i,' si ',j,'DA if (v[k,i]=1 ) and (x[k]=x[i])
ESTE 1 NU este zero '); then ev:=false;
readln(a[i,j]); end;
a[j,i]:=a[i,j];
end;
x[1]:=1; { plec din localitatea procedure
1 } afis(x:sir;k:integer);
k:=2; var j, i:integer;
x[k]:=0; begin
while(k>0) do c:=c+1;writeln('solutia ',c);
begin for i:=1 to n do
repeat
succesor(x,k,as); writeln('tara ',i,' are
if as then valid(x,k,ev) culoarea ',x[i],'
until (as and ev) or (not as); ');writeln('---------------');r
if as then eadln;
if (k=n) then
afis(x,k) writeln;
else end;
begin
k:=k+1; begin
x[k]:=0 c:=0;
end write('dati numarul de harti
else ');
k:=k-1 readln(n);
end; for i:=1 to n do
readln; for j:=i+1 to n do
end. begin
{Se dau n harti si n culori Sa write('tara ',i,' este vecina
se coloreze o harta dar sa nu cu tara ',j,' ');
fie doua tari vecine readln(v[i,j]);v[j,i]:=v[i,j];
cu aceiasi culoare } end;
uses crt; k:=1;
type sir =array[1..100] of x[k]:=0;
integer; while(k>0) do
begin
var x:sir; repeat
c,p,i,j,k,n:integer; succesor(x,k,as);
as,ev:boolean; if as then valid(x,k,ev)
v:array[1..50,1..50] of until (as and ev) or
integer; (not as);
if as then
procedure succesor(var if (k=n) then
x:sir;k:integer;var afis(x,k)
as:boolean); else
begin begin
if (x[k]<n )then begin k:=k+1;
as:=true; x[k]:=x[k]+1; x[k]:=0;

167
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end var i:integer;


else begin
k:=k-1 ; for i:=1 to p do
end; write(v[x[i]],' ');
readln;
end. writeln;
{ APLICATIE LA SUBMULTIMI:Se end;
citesc n numere care se
memoreaza intr-un vector begin
Sa se genereze toate
submultimile din acest vector write('dati numarul de numere
care au p elemente din vector ');
si a caror suma este de s readln(n); write('dati
(citit de la tastatura)} numarul de numere din vector
type sir =array[1..100] of cite combinati ');
integer; readln(p);
write('dati numarul
var x:sir; care suma admisa de combinatie
p,i,k,n,s:integer; ');
as,ev:boolean; readln(s);
v:array[1..50] of integer; for i:=1 to n do
begin
write('numarul ',i,' este
function ');
solutie(k:integer):boolean; readln(v[i]);
var i,ss:integer; end;
begin k:=1;
ss:=0; x[k]:=0;
for i:=1 to k do while(k>0) do
ss:=ss+v[x[i]]; begin
solutie :=(ss=s) and(k=p); repeat
end; succesor(x,k,as);
if as then valid(x,k,ev)
procedure succesor(var until (as and ev) or
x:sir;k:integer;var (not as);
as:boolean); if as then
begin if solutie(k) then
if (x[k]<(n-p+k)) and(k<=p) afis(x,k)
then begin else
as:=true; x[k]:=x[k]+1; begin
k:=k+1;
end x[k]:=0;
else end
as:=false; else
end; k:=k-1 ;
end;
procedure readln;
valid(x:sir;k:integer;var end.
ev:boolean); { Se dau suma s si n tipuri de
var i:integer; ev1:boolean; bancnote avand valorile
begin a1,a2,...,an lei.Se cer
ev:=true; ev1:=(k=n); toate modalitatile de plata a
for i:=1 to k-1 do sumei s utilzand aceste
if x[k]=x[i] then ev:=false; bancnote
if k>1 then ex:n=3
if x[k]<x[k-1] then ev:=false; s=2
end; 1
2
3
procedure =>0 de 1 leu
afis(x:sir;k:integer); 1 de 2 lei}

168
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

program plata; end


else este:=false;
var x,a,nr:array[1..20] of end;
integer; BEGIN
s,k,n,nr1,i,s1:integer; write('n=');
ok,este :boolean; readln(n);
procedure afisare; write('s=');
var i:integer; readln(s);
begin for i:=1 to n do begin
nr1:=nr1+1; writeln('valoarea bacnotei de
writeln('solutia ',nr1); tipul ',i);
for i:=1 to k do readln(a[i]);nr[i]:=s div a[i];
writeln(x[i],'de ',a[i],' end;
lei'); k:=1;
writeln; x[k]:=-1;
readln; nr1:=0;
end; while k>0 do begin
ok:=false;
procedure cont (k:integer;var este:=true;
ok:boolean); while(not ok) and este do begin
var i:integer; succesor(k,este);
begin if este then cont (k,ok);
s1:=0; end;
if not ok then k:=k-1
for i:=1 to k do else if s1=s then
s1:=s1+x[i]*a[i]; afisare
if s1 <=s then ok:=true else
else begin
ok:=false; k:=k+1;
END; x[k]:=-
procedure succesor 1;
(k:integer;var este:boolean); end;
begin end;
if (x[k]<nr[k]) and (k<=n) then readln;
begin END.
x[k]:=x[k]+1;
este:=true;

BACTRACKING IN PLAN
{Fie o tabla de sah si un cal in coltul stinga begin
sus for j:=1 to n do
Sa se afiseze toate modalitatile de mutare a write(a[i,j]:4);
calului asfel inacit sa writeln;
treaca o singura data prin fiecare patarat al end;
tablei} end;
uses crt;
type sir =array[1..8] of integer; procedure calul(var
mat=array[1..20,1..20] of integer; A:mat;i,j:integer;pas:integer);
const var k,i1,j1:integer;
di:sir=(-2,-1,1,2,2,1,-1,-2); cond:boolean;
dj:sir =(1,2,2,1,-1,-2,-2,-1); begin
var a:mat; for K:=1 to 8 do
i,j,n,ns,pas:integer; begin
i1:=i+di[K];
procedure afis; j1:=j+dj[k];
var i,j:integer; cond:=(i1 in [1..n]) and (j1 in [1..n]) and
begin (a[i1,j1]=0) ;
ns:=ns+1; if cond then begin
writeln('solutia cu numarul ',ns,'este '); a[i1,j1]:=pas;
for i:=1 to n do if pas=n*n then

169
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin begin
afis ; i1:=i+di[K];
readln; j1:=j+dj[k];
end cond:=(i1 in [1..n]) and (j1 in [1..n]) and
else calul(a,i1,j1,pas+1); (a[i1,j1]=0) and (lab[i1,j1]=1) ;
a[i1,j1]:=0; if cond then begin
end; a[i1,j1]:=pas;
end; if (i1 in [1..n]) or (j1 in [1..n]) then afis
end; else calul(a,i1,j1,pas+1);
a[i1,j1]:=0;
begin
clrscr; end;
writeln ('n='); end;
readln(n); end;
for i:=1 to n do
for j:=1 to n do begin
a[i,j]:=0; clrscr;
a[1,1]:=1; writeln ('n=');
ns:=0; readln(n);
pas:=2; for i:=1 to n do
calul(a,1,1,pas); for j:=1 to n do
readln; begin
end. writeln('labirint[',i,',',j,']=');
{Fie un labirint unde cifra 1 este culoar pe readln(lab[i,j]);
care se poate circula end;
iar zero nu se poate circula intr-o matrice for i:=1 to n do
Sa se afiseze toate modalitatile de deplasare for j:=1 to n do
a a[i,j]:=0;
unei persoane pe cifre de 1 astfel ns:=0;
sa poata sa iese din labirint dintr-o anumita writeln('linia de plecare');
pozitie readln(l);
deplasindu-se la nord,sud,est,vest} writeln('coloana de plecare');
uses crt; readln(c);
type sir =array[1..4] of integer; a[l,c]:=1;
mat=array[1..20,1..20] of integer; pas:=2;
const for i:=1 to n do
di:sir=(-1,0,1,0); begin
dj:sir =(0,1,0,-1); for j:=1 to n do
var a,lab:mat; write(lab[i,j]:4);
i,j,n,ns,pas,c,l:integer; writeln;
cond:boolean; end;
procedure afis; calul(a,l,c,pas);
var i,j:integer; readln;
begin end.
ns:=ns+1; {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S
writeln('solutia cu numarul ',ns,' este '); +,T-,V+,X+}
for i:=1 to n do {$M 16384,0,655360}
begin { Portiuni cu valoarea 1 dintr-o matice
for j:=1 to n do reprezinta un obiect.Cite
write(a[i,j]:4); obiecte sunt intr-o matrice}
writeln; uses crt;
end; type matrice=array[0..9,0..9] of integer;
end; var a:matrice; gasit:boolean;
n,m,i,j,x,y:integer;
procedure calul(var procedure transforma(x,y:integer;var
A:mat;i,j:integer;pas:integer); a:matrice);
var k,i1,j1:integer; begin
cond:boolean; if a[x,y]=1 then
begin begin
for K:=1 to 4 do a[x,y]:=0;

170
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

transforma(x-1,y,a); for i:=1 to m do


transforma(x-1,y+1,a); begin
transforma(x,y+1,a); for j:=1 to n do
transforma(x+1,y+1,a); WRITE(a[i,j]:4);
transforma(x+1,y,a); writeln; end;
transforma(x+1,y-1,a); readln;
transforma(x,y-1,a); end.
transforma(x-1,y-1,a);
end; {Se da o matrice cu elemente 0 si 1 in care
end; valorile 1 delimiteaza
o suprafata inchisa in cadrul matricei(cele
begin cu zero sunt in interior)
write ('n='); Daca se dau coordonatele unui element din
readln(n); matrice si acest element
write ('m='); este zero sa se determine toate elementele
readln(m); de zero la care se poate ajunge de la acest
for i:=1 to m do element
for j:=1 to n do mergind in directiile in
begin sus,jos,dreapta,stinga in 1}
writeln('a[',i,',',j,']='); uses crt;
readln (a[i,j]); type mat=array[0..20,0..20] of integer;
end; var a:mat;
n,m,i,j,x,y:integer;
for i:=1 to n do procedure transforma(var a:mat;x,y:integer);
begin begin
a[0,i]:=0; if a[x,y]=0 then
a[m+1,i]:=0; begin
end; a[x,y]:=1;
for i:=1 to m do transforma(a,x+1,y);
begin transforma(a,x-1,y);
a[i,0]:=0; transforma(a,x,y+1);
a[i,n+1]:=0; transforma(a,x,y-1);
end; end;
end;
for i:=1 to m do begin
begin clrscr;
for j:=1 to n do write ('n=');
write(a[i,j]:4); readln(n);
writeln; for i:=1 to n do
end; for j:=1 to n do
begin
x:=0; writeln('a[',i,',',j,']=');
repeat readln (a[i,j]);
x:=x+1; end;
y:=0; for j:=1 to n do
repeat begin
y:=y+1; a[0,j]:=1;
until(y>n) or(a[x,y]=1); a[n+1,j]:=1;
until(x>m) or(a[x,y]=1); end;
transforma(x,y,a); for i:=1 to n do
gasit:=false; begin
a[i,0]:=1;
for i:=1 to m do a[i,n+1]:=1;
end;
for j:=1 to n do for i:=1 to n do
if (a[i,j]=1) then gasit:=true;; begin
if gasit then writeln ('sunt mai multe obiecte ') for j:=1 to n do
else writeln( 'este un singur obiect'); write(a[i,j]:4);
writeln; writeln;
end;

171
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

writeln('dati coordonatele de plecate a unui for j:=1 to n do


element nenul x ');readln(x); write(a[i,j]:4);
writeln('dati coordonatele de plecate a unui writeln;
element nenul y ');readln(y); end;
transforma(a,x,y); readln;
for i:=1 to n do end.
begin

BACTRACKING RECURSIV
{Sa se genereze toate descompunerile tipar(p);

unui numar n ca suma numere diferite bktr(p+1); end;


iar rezultatele sa le puna intr-un fisier end;
end;
ex:n=4
=>1 3 begin
initializari;
4} assign(g,'desc.txt');
rewrite(g);
type vector =array[1..25] of integer; bktr(1);close(g);
readln;
var st:vector; end.
n,k:integer;g:text; {Sa se genereze toate descompunerile
function suma(p:integer):integer;
var s,k:integer; unui numar n ca suma de k numere
begin
s:=0;
iar rezultatele sa le puna intr-un fisier
for k:=1 to p do ex:n=4
s:=s+st[k];
suma:=s;
k=2
end; =>1 3}
type vector =array[1..25] of integer;
procedure initializari;
var i:integer; var st:vector;
begin n,k:integer;g:text;
write(' introduceti numarul de descompus ca suma function suma(p:integer):integer;
n=');readln(n); var s,k:integer;
begin
for i:=1 to 25 do s:=0;
st[i]:=0;st[1]:=-1; for k:=1 to p do
end; s:=s+st[k];
suma:=s;
function valid(p:integer):boolean; end;
var i:integer;ok:boolean;
begin
ok:=true; procedure initializari;
for i:=1 to p-1 do var i:integer;
if st[p]<=st[i] then begin
ok:=false; if suma(p)>n then ok:=false; write(' introduceti numarul de descompus ca suma
valid:=ok; n=');readln(n);
end; write(' cite cifre vreti sa contina suma k=');
readln(k);
procedure tipar(p:integer); for i:=1 to 25 do
var j:integer; st[i]:=0;
begin end;
if suma(p)=n then begin
for j:=1 to p do write(g,st[j]:4,' '); function valid(p:integer):boolean;
writeln(g); var i:integer;ok:boolean;
end; begin
ok:=true;
end; for i:=1 to p-1 do
if st[p]<=st[i] then
procedure bktr(p:integer); ok:=false; if suma(p)>n then ok:=false;
var pval:integer; valid:=ok;
begin end;
for pval:=1 to n do
begin procedure tipar(p:integer);
st[p]:=pval; var j:integer;
if valid(p) then begin begin
if suma(p)=n then begin

172
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

for j:=1 to p do write(g,st[j]:4,' '); tipar(p)


writeln(g); else
end; bktr(p+1);
end;
end; end;

procedure bktr(p:integer); begin


var pval:integer; initializari;
begin assign(g,'desc.txt');
for pval:=1 to n do rewrite(g);
begin bktr(1);close(g);
st[p]:=pval; readln;
if valid(p) then end.
if p=k then
Backtracking recursiv după schemă

În paragrafele anterioare am prezentatrutina de backtracking clasică, nerecursivă. În acest paragraf


prezentăm rutina de backtracking recursivă. Procedurile şi funcţiile folosite sunt în general aceeaşi, cu două mici
excepţii:
 . succesor nu mai este procedură, ci funcţie booleană(dispare variabila as);
 . rutina backtracking se transformă în procedură, care se apeleează prin BACK(1).

Principiul de funcţionare al proceduri back, corespunzător unui nivel k, este următorul:


 în situaţia în care avem o soluţie, o tipărim şi revenim pe nivelul anterior;
 în caz contrar, se iniţializează nivelul şi se caută succesor;
 când am găsit unul, verificăm dacă este valid; procedura se autoapelează pentru k+1, în caz contrar urmând a
se continua căutarea succesorului.
 Dacă nu avem sucesor, se trece pe nivel inferior(k-1) prin ieşirea din procedura back.
Vom prezenta utilizarea backtracking-ului recursiv prin algoritmul de generare a permutărilor.

program permutari; begin


type stiva=array[1..100] of integer; solutie:=(k=n);
var st:stiva; end;
n,k:integer; procedure tipar;
ev:boolean; var i:integer;
procedure init(k:integer;var st:stiva); begin
begin for i:=1 to n do write(st[i]);
st[k]:=0; writeln;
end; end;
function succesor(var st:stiva;k:integer):boolean; procedure back(k:integer);
begin begin
if st[k]<n then if solutie(k) then tipar
begin else begin
st[k]:=st[k]+1; init(k,st);
succesor:=true; while
end succesor(st,k) do begin
else succesor:=false;
end; valid(ev,st,k);
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer; if ev then back(k+1)
begin end
ev:=true; end;
for i:=1 to k-1 do Begin
if st[i]=st[k] then ev:=false; Write(‘n=’); readln(n);
end; Back(1);
function solutie(k:integer):boolean; End.

5.4 Algoritmi combinatoriali


5.4.1 Generare permutari

173
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

o Generarea permutarilor.Se citeste un numar natural n.Sa se genereze toate permutarile


multimii {1,2,..,n}.
Generarea permuatrilor se va face tinand cont ca orice permutare va fi alcatuita din elemente distincte
ale multimii A={1,2…,n}.
Prezentam algoritmul corespunzator cazului n=3;
1 2 3

1 2 2 2 2

1 1 1 1 1 1

1 2 3

3 3 3 3 1

1 1 1 1 2 2

1 2 3 1

1 1 1 2 3 3

2 2 2 2 2 2

 se incarca in stiva pe nivelul 1 valoarea 1;


 incarcarea valorii 1 pe nivelul al 2-lea nu este posibila,intrucat aceasta valoare se gaseste sip e
nivelul 1 al stivei;
 incarcarea valorii 2 pe nivelul al 2-lea este posibila,deoarece aceasta valoare nu mai este
intalnita;
 valoarea1 din nivelul al 3-lea se regaseste pe nivelul 1;
 valoarea 2 din nivelul al 3-lea se regaseste pe nivelul al 2-lea;
 valoarea 3 pe nivelul al 3-lea nu e intalnita pe nivelurile anterioare;intrucat nivelul 3 este
completat corect,afisam 1 2 3
{APLICATIE LA PERMUTARI: Se citesc n
litere intr-un cuvint Se cere sa se faca procedure valid(x:sir;k:integer;var
permutari ev:boolean);
ale acestor litere dar sa nu fie unele care var i:integer;
se repeta} begin
type sir =array[1..100] of integer; ev:=true;
for i:=1 to k-1 do
var x:sir; if x[k]=x[i] then ev:=false;
p,i,j,k,n,k1:integer;
as,ev:boolean; end;
v:string[20];

procedure succesor(var x:sir;k:integer;var procedure afis(x:sir;k:integer);


as:boolean); var i:integer;
begin begin
if (x[k]<n) then begin for i:=1 to n do
as:=true; x[k]:=x[k]+1; write(v[x[i]],' ');

end writeln;
else end;
as:=false;
end; begin

174
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

st[k]:=st[k]+1;
write('dati cuvintul '); as:=true;
readln(v); end
n:=length(v); else as:=false;
end;
k:=1; procedure valid(var
x[k]:=0; ev:boolean;st:stiva;k:integer);
while(k>0) do var i:integer;
begin begin
repeat ev:=true;
succesor(x,k,as); for i:=1 to k-1 do
if as then valid(x,k,ev) if st[k]=st[i] then ev:=false;
until (as and ev) or (not as); end;
if as then function solutie(k:integer):boolean;
if (k=n) then begin
afis(x,k) solutie:=(k=n);
else end;
begin procedure tipar;
k:=k+1; var i:integer;
x[k]:=0; begin
end for i:=1 to n do write(st[i]);
else writeln;
k:=k-1 ; end;
end; Begin
readln; write('n=');readln(n);
end. k:=1;init(k,st);
while (k>0) do
VARIANTA 2 begin
program permutari; repeat
type stiva=array[1..100] of integer; succesor(as,st,k);
var st:stiva; if as then valid(ev,st,k);
n,k:integer; until (not as) or(as and ev);
as,ev:boolean; if as then
procedure init(k:integer;var st:stiva); if solutie(k) then tipar
begin else begin
st[k]:=0; k:=k+1;
end; init(k,st);
procedure succesor(var as:boolean;var end
st:stiva;k:integer); else k:=k-1;
begin end
if st[k]<n then End.
begin

Algoritmul continua pana cand stiva devine vida.
5.4.2 Generare aranjamente
type sir =array[1..100] of
{ Se citesc n si p numere integer;
numere naturale n>=p unde n
este numarul de litere care se var x:sir;
dau. p,i,j,k,n:integer;
Se cere sa se genereze toate as,ev:boolean;
submultimile v:array[1..50] of char;
multimi(a,b,...,z ) de p
elemente.Doua multimi cu procedure succesor(var
aceleasi elemente x:sir;k:integer;var
la care ordinea acestora difera as:boolean);
sunt considerate aceleasi.} begin
uses crt; if (x[k]<n) then begin
as:=true; x[k]:=x[k]+1;

175
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

end k:=k-1 ;
else end;
as:=false; readln;
end; end.
VARIANTA 2
procedure Generare aranjamentelor. Se citesc n si
valid(x:sir;k:integer;var
p. Sã se genereze toate aranjamentele
ev:boolean);
var i:integer; de n luate câte p.
begin program aranjamente;
ev:=true; type stiva=array[1..100] of integer;
for i:=1 to k-1 do var st:stiva;
IF (v[x[k]]>v[x[I]] )then
ev:=false;
n,k,p:integer;
as,ev:boolean;
end; procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
procedure
afis(x:sir;k:integer); end;
var i:integer; procedure succesor(var as:boolean;var
begin st:stiva;k:integer);
for i:=1 to k do begin
write(v[x[i]],' ');
if st[k]<n then
writeln; begin
end; st[k]:=st[k]+1;
as:=true;
begin end
write('dati numarul de litere else as:=false;
din vector '); end;
readln(n); write('dati procedure valid(var
numarul litere cite combinati ev:boolean;st:stiva;k:integer);
'); var i:integer;
readln(p);
begin
for i:=1 to n do ev:=true;
begin for i:=1 to k-1 do if st[k]=st[i] then
write('numarul ',i,' este ev:=false;
');
readln(v[i]);
end;
end; function solutie(k:integer):boolean;
k:=1; begin
x[k]:=0; solutie:=(k=p);
while(k>0) do end;
begin
repeat procedure tipar;
succesor(x,k,as); var i:integer;
if as then valid(x,k,ev) begin
until (as and ev) or for i:=1 to p do write(st[i]);
(not as);
writeln;
if as then
if (k=p) then end;
afis(x,k) Begin
else write('n=');readln(n);
begin write('p=');readln(p);
k:=k+1;
x[k]:=0;
k:=1;init(k,st);
end while (k>0) do
else begin

176
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

repeat
succesor(as,st,k); k:=k+1;
if as then
valid(ev,st,k); init(k,st);
until (not as) or(as and end
ev); else k:=k-1;
if as then end
if solutie(k) then End.
tipar
else begin

4.5.3 Generare combinari


{APLICATIE LA COMBINARI: Se if (k>=2) and
not(v[x[k]]>v[x[k-1]] )then
citesc n si p numere numere naturale ev:=false;
n>=p.Se cere sa se genereze toate
submultimile multimi(1,2,...,n)de p end;
elemente.Doua multimi cu aceleasi
elemente
procedure
la care ordinea acestora difera sunt afis(x:sir;k:integer);
considerate aceleasi. var i:integer;
VARIANTA:Cum se pot pune p ture begin
pe o tabla n X n asfel incit sa fie pe for i:=1 to k do
scara si sa nu se ia} write(v[x[i]],' ');
uses crt;
type sir =array[1..100] of writeln;
integer; end;

var x:sir; begin


p,i,j,k,n:integer;
as,ev:boolean; write('dati numarul de numere
v:array[1..50] of integer; din vector ');
readln(n); write('dati
procedure succesor(var numarul de numere cite
x:sir;k:integer;var combinati ');
as:boolean); readln(p);
begin
if (x[k]<n) then begin for i:=1 to n do
as:=true; x[k]:=x[k]+1; begin
write('numarul ',i,' este
end ');
else readln(v[i]);
as:=false; end;
{as:=as and ((k>1) and k:=1;
(x[k]>x[k-1] ));} x[k]:=0;
end; while(k>0) do
begin
procedure repeat
valid(x:sir;k:integer;var succesor(x,k,as);
ev:boolean); if as then valid(x,k,ev)
var i:integer; until (as and ev) or
begin (not as);
ev:=true; if as then
for i:=1 to k-1 do if (k=p) then
afis(x,k)

177
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

else procedure valid(var


begin ev:boolean;st:stiva;k:integer);
k:=k+1; var i:integer;
x[k]:=0; begin
end ev:=true;
else end;
k:=k-1 ; function solutie(k:integer):boolean;
end; begin
readln; solutie:=(k=p);
end. end;
procedure tipar;
var i:integer;
begin
for i:=1 to p do write(st[i]);
writeln;
VARIANTA 2 end;
program combinari; Begin
type stiva=array[1..100] of integer; write('n=');readln(n);
var st:stiva; write('p=');readln(p);
n,k,p:integer; k:=1;init(k,st);
as,ev:boolean; while (k>0) do
procedure init(k:integer;var st:stiva); begin
begin repeat
if k>1 then st[k]:=st[k-1] succesor(as,st,k);
else if k:=1 then st[k]:=0; if as then valid(ev,st,k);
end; until (not as) or(as and ev);
procedure succesor(var as:boolean;var if as then
st:stiva;k:integer); if solutie(k) then tipar
begin else begin
if st[k]<n-p+k then k:=k+1;
begin init(k,st);
st[k]:=st[k]+1; end
as:=true; else k:=k-1;
end end
else as:=false; End.
end;

5.4.4 Produs cartezian


{Dindu -se mai multe multimi fiecare as:=true;
x[k]:=x[k]+1;
cu un anumit numar de elemente end
sa se efectueze produsul cartezian al else
lor} as:=false;
uses crt; end;
type sir =array[1..100] of
integer; procedure
valid(x:sir;k:integer;var
var x,n:sir; as:boolean);
i,k,m,j:integer; begin
as,ev:boolean; ev:=true;
a:array[1..50,1..50] of
integer; end;

procedure succesor(var procedure


x:sir;k:integer;var afis(x:sir;k:integer);
as:boolean); var i:integer;
begin begin
if (x[k]<n[k]) then begin

178
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

for i:=1 to k do k:=1;


write(a[i,x[i]]:5,' -----'); x[k]:=0;
WRITELN; while(k>0) do
end; begin
begin repeat
succesor(x,k,as);
write('dati numarul multimilor if as then valid(x,k,ev)
la care fac produsul until (as and ev) or (not as);
cartezian'); if as then
readln(m); if (k=m) then
for i:=1 to m do afis(x,k)
begin else
write('pentru multimea ',i ,' begin
avem '); k:=k+1;
writeln('numarul de elmente x[k]:=0
pentru multimea ',i); end
readln(n[i]); else
for j:=1 to n[i] do k:=k-1
begin end;
writeln('elementul ',j,'este'); readln;
readln(a[i,j]); end.
end;
end;

5.4.5 Generare submultimile unei multimi


{Sa se genereze toate submultimile begin
write('{');
unei multimi}
uses crt; for i:=1 to k do
type sir =array[1..100] of if x[i]=1 then
integer; write(a[i]:5);
write('}');
var x:sir; writeln;
i,j,k,n:integer; end;
as,ev:boolean;
a:array[1..50] of integer; begin

procedure succesor(var write('dati numarul de elemente


x:sir;k:integer;var al multimii');
as:boolean); readln(n);
begin for i:=1 to n do begin
if (x[k]<1) then begin writeln('elementul ',i,' este
as:=true; ');
x[k]:=x[k]+1; readln(a[i]);
end end;
else
as:=false; k:=1;
end; x[k]:=-1;
while(k>0) do
procedure begin
valid(x:sir;k:integer;var repeat
ev:boolean); succesor(x,k,as);
begin if as then valid(x,k,ev)
ev:=true; until (as and ev) or (not as);
end; if as then
if (k=n) then
afis(x,k)
procedure else
afis(x:sir;k:integer); begin
var i:integer; k:=k+1;

179
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

x[k]:=-1 readln;
end end.
else
k:=k-1
end;

5.4.6 Partitii
a)Partitiile unui numar natural

{Sa se genereze toate descompunerile


for i:=1 to k-1
unui numar n ca suma numere do
diferite} if x[i]>=x[k] then ev:=false;
uses crt;
type sir =array[1..100] of end;
integer;

var x:sir; procedure


i,k,n,p:integer; afis(x:sir;k:integer);
as,ev:boolean; var i:integer;
begin
if suma(k)=n then
function for i:=1 to k do
suma(k:integer):integer; write(x[i]:5,' ');
var s,k1:integer; WRITELN;
begin end;
s:=0; begin
for k1:=1 to k do
s:=s+x[k1]; write('dati numarul ');
suma:=s; readln(n);
end; k:=1;
x[k]:=0;
procedure succesor(var while(k>0) do
x:sir;k:integer;var begin
as:boolean); repeat
begin succesor(x,k,as);
if (suma(k-1)+x[k]<n) then if as then valid(x,k,ev)
begin until (as and ev) or (not as);
as:=true; if as then
x[k]:=x[k]+1; if suma(k)=n then
end afis(x,k)
else else
as:=false; begin
end; k:=k+1;
x[k]:=0;
procedure end
valid(x:sir;k:integer;var else
ev:boolean); k:=k-1
begin end;
ev:=true; readln;
if(suma(k)>n )then end.
ev:=false ;
b)Partitiile unei multimi(ADICA o multime se scrie ca
reuniune de alte multimi care fiecare doua sunt distincte,iar
reuniunea tuturor acestor multimi da multimea inintiala)
{ {1 2 3 ..n} are partitia urmatoare: pt n=1

180
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

{1} max:=0;
for i:=1 to k-1 do
pt n=2
if max<p[i] then max:=p[i];
{1,2} for i:=1 to max+1 do
{1},{2} begin
pt n=3 p[k]:=I;
{1 2 3} part(k+1,n,p);
end;
{1 2},{3} end;
{1 3 },{2} end;
{1},{2 3} begin
{1 },{2},{3}} read(n);
part(1,n,p);
EXPLICATII: end.
Programul afiseaza pentru n=1
1 adica {1} care apartine de VARIANTA 2:
multimea 1 {Se da un numar n>1.Se cere sa se
n=2 genereze toate partitiile multimii
11 adica {1,2} adica primele 2 {1,2,...,n)
numere apartin ambele de multimea ex:n=2=>
1 (1 ),(2),(1,2)
12 adica {1},{2} deci primul numar e
in prima multime,celalat e in cea de }
a doua
n=3 program partitii;
var x:array [1..10] of byte;
111 adica {1 2 3}
n,k,v,i,j,max,p:byte;
112 adica {1 2},{3} begin
121 adica {1 3},{3} write('n='); readln(n);
122 adica {1},{2 3} p:=0;
123 adica {1},{2},{3} k:=1;
x[1]:=0;
} while k>0 do begin
v:=0;
type vector =array[1..9] of integer; while (x[k]+1<=k)
var n,i:integer;p:vector; and (v=0) do
procedure tipar; begin
var I,j,max:integer; x[k]:=x[k]+1;
begin max:=x[1];
write(“partitia “); for i:=2 to
max:=1; k-1 do
for i:=2 to n do if
if max<p[i] then max:=p[i]; max<x[i] then max:=x[i];
for i:=1 to max do if
begin x[k]<=max+1 then v:=1
write(“multimea ‘,I,’ ‘ ); else v:=0;
for j:=1 to n do end;
if p[j]=I then if v=0 then k:=k-1
then write(j); else if k<n then
writeln; begin
wnd;
end; k:=k+1;
procedure part(k,n:integer;var
p:vector); x[k]:=0
var max,i:integer;
begin end
if k=n+1 then tipar else begin
else p:=p+1;
begin

181
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

if
max<x[n] then max:=x[n]; if x[j]=i then write(j,' ');

writeln('partitia',p); write('} ');


for
i:=1 to max do end;

begin writeln;
end;
write('{'); end;
readln;
for j:=1 to n do end.

5.3 Metoda Greedy .Descriere si aplicabilitate .Exemple si


contraexemple
Descrierea metodei

Metoda Greedy este o metodă generală de elaborare a algoritmilor; provenienţa numelui o


vom explica mai jos. În esenţă, ea se aplică problemelor în care se dă o mulţime A conţinând n date de
intrare cerându-se să se determine o submulţime B a sa care să îndeplinească anumite condiţii pentru a
fi acceptată; cum în general există mai multe astfel de mulţimi se mai dă şi un criteriu conform căruia
dintre submulţimile acceptabile (numite soluţii posibile) să alegem una singură (numită soluţie optimă)
ca rezultat final. Soluţiile posibile au următoarea proprietate: dacă B este o soluţie posibilă şi CB,
atunci şi C este o soluţie posibilă; vom presupune că Ø este totdeauna soluţie posibilă.
Metoda Greedy tratează acest tip de probleme în următoarele două moduri, care urmează
aceeşi idee, dar diferă doar prin ordinea de efectuare a unor operaţii.
1) Se pleacă de la soluţia vidă. Se alege pe rând într-un anumit fel un element din A neales la
paşii precedenţi. Dacă adăugarea lui la soluţia parţială anterior construită conduce la o soluţie posibilă,
construim noua soluţie posibilă prin adăugarea elementului ales (vezi procedura GREEDY1).

Procedure GREEDY1(A,n,B);
BØ
For i=1,n
Call ALEGE(A,i,x)
Call POSIBIL(B,x,v)
If v=1 then call ADAUG(B,x)
Endif
Repeat
Return
End

În algoritmul GREEDY1 procedura ALEGE furnizează elementul x=aj{ai,…,an} şi


efectuează interschimbarea ai↔aj.
Procedura POSIBIL furnizează în variabila v valoarea 1 dacă B{x} este soluţia posibilă şi 0
în caz contrar. Procedura adaug înlocuieşte pe B cu B{x}.
Observăm că dacă procedura POSIBIL efectuează verificări date prin enunţul problemei,
lucrurile sunt mai complicate în cazul procedurii alege, în care trebuie să stabilim un criteriu conform
căruia alegerea să conducă în final la soluţia optimă.
2) Lucrurile decurg ca mai sus cu excepţia faptului că se stabileşte de la început (şi nu
dinamic) ordinea în care trebuie considerate elementele (vezi procedura GREEDY2).

Procedure GREEDY2(A,n,B);
Call PREL(A); BØ
For i=1,n
Call POSIBIL(B,ai,v)
If v=1 then call ADAUG(B,ai)
Endif

182
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Repeat
End

Unde procedura PREL efectuează o permutare a elementelor mulţimii A (pe care o


considerăm reprezentată de un vector A cu n componente). Binenţeles că dificultăţile în elaborarea
procedurii PREL sunt de aceeaţi natură cu cele referitoare la procedura ALEGE.
După cum se vede, metode GREEDY nu caută să determine toate soluţiile posibile şi să
aleagă pe cea optimă conform criteriului de optimizare dat (ceea ce necesită în general un timp de
calcul şi spaţiu de memorie mari) ci constă în a alege pe rând câte un element urmând să-l introducă
(să-l înghită) eventual în soluţia optimă; de aici vine numele metodei (greedy=lacom).
Un exemplu tipic îl constituie problemele de optimizare. Astfel, dacă trebui determinat
maximul unei funcţii de cost depinzând de a1,…,an, ideea generală a metodei Greedy este de a alege la
fiecare pas acel element care face să crească cât mai mult valoarea acestei funcţii. Dar pe lângă
dificultăţile generate de această alegere, se pune problema dacă din maximizări succesive ajungem într-
adevăr la maximul global; acest lucru nu este în general adevărat şi de aceea metoda Greedy trebuie
gândită ca sugerând numai o idee, urmând să determinăm dacă într-adevăr obţinem o soluţie optimă.
Exemplu. Se dă o mulţime X={x1,…,xn}cu elemente reale. Se pune problema determinării
unei submulţimiY a sa astfel încât
să fie maximă
Se observă uşor că dacă o submulţime Y conţine un element y00, atunci suma elementelor
submulţimii Y-{y0} este mai mare sau egală cu cea a elementelor lui Y. De aceea vom înţelege prin
soluţie posibilă o submulţime YX cu toate elementele pozitive. Vom utiliza metoda Greedy în prima
sa variantă în care:
-procedura ALEGE furnizează x=ai
-procedura POSIBIL atribuie lui v valoarea 1 dacă ai >0 şi 0 în caz contrar.
Notând cu k numărul final de elemente din Y, obţinem procedura SUBP.
procedura SUBP(X,Y,n,k);
array X(n),Y(n)
k0
for i=1,n
if xi >0 then kk+1;ykxi
endif
repeat
end

Sa considaram o multime A cu n elemente.Se cere o submultime a sa, eventual m<=n elemente, astfel incat sa fie
indeplinite anumite conditii(acestea difera de la o problema la alta).
Se considera o multime de n enumere reale..Se cere o submultime a sa astfel incat suma elemetelor ei sa fie
maxima.Pentru rezolvare vom alege un prim element al multimii de numere reale.Daca este posibil acesta va fi
adaugat solutiei,initial vide.Posibilitatea ca acesta sa fie edagat este data de semnul numarului(acesta trebuie sa
fie mai mare ca 0).Se alege un al doilea numar cu care se procedeaza in mod asemanator.
Algoritmul se incheire cand au fost alese si, 4eventual ,adaugate toate elementele multimi.
Pentru a rezolva o problema cu Greedy ,solutiia se construieste ,dupa algoritmul de mai jos.
Pentru fiecare element care urmeaza sa fie adaugat solutiei finale, se efectueaza oalegere a sa dintre elementele
multimi A(dupa un mecanism specific fiecarei probleme in parte),iar daca este posibil,acesta este
adaugat.Alghoritmul se termina,fie cand a fost gasita solutia ceruta ,fie cand afost gasita solutia ceruta fie cand s-a
constatat inexistenta acesteia.
Intuitiv,alegem un element,al doilea,.... pana cand obtinem ce dorim sau pana cand au fost testate toate elementele
multimii.De aici provine si numele metodei(greedy=lacom.)
Cel care elaboreaza un algoritm greedy trebuie sa stie faptul ca, procedand in modul ales de el, se ajunge la
rezultatul dorit.Pentru fiecare problema in parte,dupa ce se identifica un algoritm,este onbligatoriu sa se
demonstreze ca acesta conduce la solutia optima.
In general,numarul de operatii de baza efectuate de un algoritm greedy este o expresie polinomiala -algoritmi sunt
performanti
De multe ori este necesar ca elementele multimii A sa fie sortate,pentru ca apoi sa slegem din acestea.
 Problema spectacolelor
Intr-o zi trebuie planificate n spectacole.Pentru fiecare spectacol se cunoaste intervalul in care se desfasoara:
[st,sf(.Se cere sa se planifice un numar maxim de spectacole astfel incat sa nu se suprapuna.

183
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Vom construi o solutie dupa urmatorul algoritm:


P1 Sortam spectacolele dupa ora terminarii lor;
P2 Primul spectacol programat este celo care se termina cel ma devreme;
P3 Alegem primul spectacol dintre cele care urmeaza in sir ultimului spectacol programat care indeplineste
conditia ca incepe dupa ce s-a terminat ultimul spectacol programat;
P4 Daca tentativa de mai sus a esuat (nu am gasit un astfel de spectacol) algoritmul se termina,astfel se
progreameaza spectacolul gasit si algoritmul se reia de la P3
type spectacol=array[1..2,1..10] of integer; for i:=1 to n do
ordine=array[1..10] of integer; begin
var s:spectacol; o[i]:=i;
o:ordine; write ('ora de inceput pentru spectacolul ',i);
n,i,oradeinceputaspectacoluluicurent,siciteminuteare readln(oradeinceputaspectacoluluicurent);
spectacolulcurent, write ('si cite minute ',i);
oradesfirsitaspectacoluluiurmator,siciteminutearespe readln(siciteminutearespectacolulcurent);
ctacolulurmator:integer; write ('ora de sfirsit pentru spectacolul ',i);
procedure sortare; readln(oradesfirsitaspectacoluluiurmator);
var gata:boolean; write ('si cite minute ',i);
variabiladeschib,i:integer; readln(siciteminutearespectacolulurmator);
begin s[1,i]:=oradeinceputaspectacoluluicurent*60+sicite
repeat minutearespectacolulcurent;
gata:=true;
for i:=1 to n-1 do s[2,i]:=oradesfirsitaspectacoluluiurmator*60+sicite
if s[2,o[i]]>s[2,o[i+1]] then minutearespectacolulurmator;
begin end;
variabiladeschib:=o[i]; sortare;
o[i]:=o[i+1]; write('primul este ',o[1]);
o[i+1]:= variabiladeschib; for i:=2 to n do
gata:=false; if s[1,o[i]]>=s[2,o[i-1]] then
end;
until gata; writeln( 'spectacolul cu numarul de ordine ',o[i]:6);
end; readln;
begin end.
write(' nr de spectacole n=');
readln(n);
 PROBLEMA CONTINUA A RUCSACULUI
Enunt :
O persoana are un rucsac cu care poate transporta o greutate
maxima G.Persoana are la dispozitie n obiecte si cunoaste pentru
fiecare greutatea si castigul care se obtine in urma transportului
sau la destinatie. Se cere sa se precizeze ce obiecte trebuie sa
transporte persoana a.i. castigul sa fie maxim.
Precizare : obiectele pot fi taiate.
Astfel se obtine o incarcare mai eficienta a rucsacului.

obtinut prin transportul unitatii de


greutate )
program problema_continua_a_rucsacului; }
uses crt; var c,g,ef:vector1;
type vector1=array[1..20] of real; ordine:vector2;
vector2=array[1..20] of integer;
{ n,i,aux1:integer;
c - vectorul in care se trec castigurile pt. gr,aux,castig:real;
fiecare obiect in parte
g - vectorul in care se trec greutatile invers:boolean;
fiecarui obiect begin
ef - vectorul eficientei transportului clrscr;
fiecarui obiect write('greutatea ce poate fi transportata ->
de fapt, eficienta este castigul impartit la ');readln(gr);
greutate ( castigul

184
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

write('dati numarul de obiecte -> writeln(' se


');readln(n); incarca obiectul ',ordine[i],' : ',1);
for i:=1 to n do gr:=gr-g[i];
begin
write('c[',i,']= ');readln(c[i]); castig:=castig+c[i];
write('g[',i,']= ');readln(g[i]); end
ordine[i]:=i; else
ef[i]:=c[i]/g[i]; begin
writeln('eficienta pt. obiectul : ',i, ' writeln(' se
este ',ef[i]:3:2); incarca obiectul ',ordine[i],' : ',gr/g[i]:1:2);
end;
castig:=castig+c[i]*gr/g[i];
gr:=0
repeat end;
invers:=false; i:=i+1
for i:=1 to n-1 do end;
if ef[i]<ef[i+1] then writeln('castig total = ',castig:3:2);
begin readln;
aux:=ef[i]; { sortam end.
vectorul ef } program poz_max;
ef[i]:=ef[i+1]; type vector=array[1..100] of integer;
ef[i+1]:=aux; var i,n,max,j,k:integer;
aux:=c[i]; { sortam a:vector;
vectorul c } function maxim(i:integer):integer;
c[i]:=c[i+1]; var f:integer;
c[i+1]:=aux; begin
aux:=g[i]; { sortam if i<n then
vectorul g } begin
g[i]:=g[i+1]; j:=maxim(i+1);
g[i+1]:=aux; if a[i]>a[j] then
invers:=true; max:=i
aux1:=ordine[i]; { sortam else
vectorul ordine} max:=j
ordine[i]:=ordine[i+1]; end
ordine[i+1]:=aux1; else
end max:=n;
until not invers; end;
castig:=0; begin {main}
i:=1; write('n=');readln(n);
writeln('Posibilitatea de incarcare eficienta for i:=1 to n do
a rucsacului este : '); begin
writeln('apasa ENTER pt. afisarea write('a[',i,']');
rezultatului'); readln (a[i]);
readln; end;
while (gr>0) and (i<=n) do k:=maxim(1);
begin writeln ('poz max=',k:8);
if gr>g[i] then writeln('elem max este',a[i]);
begin end.
 Problema comis-voiajorului

Fie G=(X,) un graf neorientat în care două vârfuri distincte ale grafului sunt unite între ele.
Să se determine un ciclu care să îndeplinească simultan următoarele condiţii:
- să treacă prin toate nodurile grafului;
- costul drumului să fie minim.

Acestei probleme i se poate asocia următoarea aplicaţie practică: un comis-voiajor pleacă


dintr-un oraş, trebuie să viziteze un număr de oraşe si să se întoarcă în oraşul de plecare cu efort minim

185
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

(de exemplu de timp caz în care costul unei muchii a grafului reprezintă timpul necesar comis-
voiajorului pentru a ajunge dintr-un oraş în altul).
O modalitate de rezolvare a acestei probleme este de a genera toate ciclurile şi de a-l reţine pe
cel de drum minim. O astfel de abordare conduce la un algoritm neperformant (timp exponenţial). Din
acest motiv această soluţie nu are valoare practică.
Pentru această problemă nu se cunosc algoritmi care să nu necesite un timp exponenţial. Iată
motivul pentru care renunţăm la condiţia de optimalitate şi ne mărginim să găsim un ciclu care să
treacă prin toate oraşele cu un cost pe cât posibil redus.

Algoritmul este următorul:


- se citeşte matricea costurilor A şi nodul de pornire v1;
- dacă v1,v2,…,vk este un lanţ deja ales, după caz se procedează astfel:
a) dacă X=(v1,v2,…,vk) se alege muchia (vk,v1);
b) dacă X<>(v1,v2,…vk), se alege muchia de cost minim care are o extremitate în vk, iar
cealălaltă în vk+1 (unde vk+1 nu aparţine mulţimii (v1,v2,…,vk)).
Observaţie.
Odată cu o muchie se selectează şi un nod. La fiecare pas se selectează un nod. Din acest
motiv algoritmul prezentat se încadrează în tehnica Greedy.
Pentru graful din figura următoare se consideră nodul de pornire 1.

3 5 5 1

5
1
4 2
9

4 3

Dintre toate muchiile care au extremitatea în nodul 1 se alege muchia (1,2) ştiind că aceasta
are costul minim (1).
Dintre toate muchiile cu extremitatea în nodul 2 se alege muchia (2,3).
În continuare se aleg muchiile (3,5),(5,4),(4,1) şi astfel se obţine graful din figura de mai jos.

1
1 1

9
2

186
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

5
1

Acest graf (de cost 18) nu are costul minim. De exemplu, graful din figura de mai jos are
costul 15.

4
1
1

6 3

3 5
1
În program, vectorul S reţine nodurile selectate (S(I)=1, dacă nodul I a fost selectat şi S(I)=0
în caz contrar).

Program cv;
Type matrice=array[1..9,1..9] of integer;
Vector=array[1..9] of integer;
Var a:matrice;
s:vector;
n,I,j,v,v1,v2,min,cost:integer;
begin
write(‘n=’);
readln(n);
for I :=1 to n-1 do
for j:=I+1 to n do begin
write(‘a[‘,I,’,’,j,’]=’);
readln(a[I,j]);
a[j,I]:=a[I,j];
end;
for I:=1 to n do
begin
s[I]:=0;
a[I,I]:=0;
end;
write(‘nodul de pornire este =’);
readln(v);
s[v]:=1; v2:=v;
cost:=0;
writeln(v);
for I:=1 to n-1 do
begin
min:=30000;
for j:=1 to n do
if (a[v2,j]<>0) and (s[j]=0) and (a[v2,j]<min)

187
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

then
begin
min:=a[v2,v]; v1:=j;
end;
v2:=v1; s[v2]:=1;
cost:=cost+min;
writeln(v1);
end;
cost:=cost+a[v2,v];
writeln(v);
writeln(‘cost total =’,cost);
end.

O îmbunătăţire a algoritmului se poate dacă se reiau calculele considerând pe rând ca nod de


pornire nodurile {1,2,…,n}.

5.2 Metoda divide et impera.Descriere si


aplicabilitate.Exemple.Sortarea prin interclasare.Sortarea rapida
Descrierea metodei

Dându-se o funcţie care lucrează asupra a n date de intrare,


tehnica “DIVIDE ET IMPERA” (Desparte şi stăpâneşte) presupune
desfacerea (divizarea) intrărilor în K submulţimi distincte, , care
produc k subprobleme. Aceste probleme trebuie rezolvate şi apoi trebuie
gasită o metodă de combinare a subsoluţiilor pentru a da soluţia întregii
probleme.
Dacă subproblemele sunt încă mari tehnica poate fi reaplicată,
dacă ele sunt de acelaşi tip cu problema generală şi acesta este cazul cel
mai frecvent. Reaplicarea metodei conduce la o procedură recursivă. În
acest fel se generează subprobleme din ce în ce mai mici care în cazurile
cele mai simple, se rezolvă fără a fi redivizate. De obicei problema se
împarte în două subprobleme de acelaşi gen.
Această metodă e una din cele mai larg folosite.
Fie n intrări memorate în tabloul A (1:n) . Procedura generală de tip
funcţie, cu numele DETI este apelată iniţial prin DETI (1,n). Funcţia
DETI (p,q), rezolvă o problemă cu intrările A(p,q).
Descrierea funcţiei este următoarea:

procedure DETI(p,q)
global n,A(1:n);integer p,q,m // //
if MIC(p,q) then return(G(p,q))
else
m:=DIVIDE(p,q);
return(combină (DETI(p,m),DETI(m+1,q)))
endif
end DETI

188
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Aici MIC(p,q) reprezintă o funcţie booleană de evaluare, care determină dacă intrarile
sunt suficient de mici pentru a putea fi calculate fără diviziuni. Dacă da, atunci se apelează
funcţia neprecizată (aici) G(p,q), dacă nu se aplează funcţia DIVIDE, care furnizează
m=DIVIDE(p,q).
Prin determinarea lui m apar două subprobleme, prin împărţirea lui
A(p,q) în A(p,m) şi A(m+1,p).
Soluţiile lor se găsesc prin aplicarea recursivă a lui DETI. Funcţia
COMBINĂ – va combina soluţiile celor două subprobleme.

Procedure divideetimpera(p,q,a);
Begin
If (q-p)<=0.0005 then
Prelucreaza_rezolva(p,q,a)
Else
Begin
Divizeaza_imparte(p,q,m);
Divideimpera(p,m,b);
Divideimpera(m+1,q,c);
Combina_rezultatele(b,c,a)
End;
End;

MAXIM DIN VECTOR


o Se citeste un vector cu n componente,numere naturale.Se cere sa se tipareasca valoarea
maxima.
Problema de mai sus este binecunoscuta.Cum o rezolvam utilizand metoda divide et impera?
Trebuie tiparita valoarea maxima dintre numerele retinute in vector de la i la j(initial i=1,j=n).Pt acesta
procedam astfel:
 Daca i=j,valoarea amxima va fi v[i];
 Contrar vom imparti vectorul in doi vectori(primul vector va contine componentele de la i la
(i+j) div 2,al doilea va contine componentele de la (i+j)div 2+1 la j),rezolvam

189
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

subproblemele(aflam maximul pentru fiecare dintre ele) iar solutia problemei va fi data de
valoarea maxima dintre rezultatele celor doua subprobleme.
type sir=array[1..20] of integer;
var x, y,xx:sir;k1,n,i,ss:integer; ssss:boolean;
function afis11111(x:sir;k,p:integer);
var s1,s2:integer;
begin
if k=p then afis11111:=x[k]
else
begin
s1:=afis11111(x,k,trunc((k+p) div 2));
s2:=afis11111( x,trunc( ( k+p ) div 2 +1 ),p );
if s1>s2 then afis11111:=s1 else
afis11111:=s2;
end;end;
begin
writeln('n=');readln(n);
for i:=1 to n do
begin
writeln('xx[',i,']=');
readln(xx[i]);
end;
write(afis11111(xx,1,n )) readln;
end.

CAUTARE BINARA
Se citeste un vector cu n componente numere intregi, unde numerele se
presupun ordonate crescatoare si o valoare intreaga (nr).Sa se decida daca
nr se gaseste sau nu printre numrele citite, iar in caz afirmativ, sa se
tipareasca indicele componentei care contine acea valoare.

o Cautare binara.Se citeste un vector cu n componente numere intregi,unde numerele se


presupun ordonate crescator si o valoare intreaga(nr).Sa se decida daca nr se gaseste
sau nu printer numerele citite,iar in caz afirmativ sa se tipareasca indicele componentei
care contine acea valoare.
Problema este de a decide daca valoarea cautata se gaseste printer numerele de indice cuprins intre i
si j (initial i=1,j=n).Pt aceasta vom proceda astfel:
 Daca nr coincide cu valoarea de indice (i+j)/2 (valoarea de la mijloc),se tipareste indicele si se
revine din apel(problema a fost rezolvata);
Contrar,daca i<j (ni s-a cautat peste tot) problema se descompune astfel:
 Daca numarul este mai mic decat valoarea testate(din mijloc),inseamna ca avem sanse sa-l
gasim intre componentele cu indicele intre i si (i+j)/2-1,caz in care reapelam functia cu acesti
parametrii
 Daca numarul este mai amre decat valoarea testate(din mijloc),inseamna ca avem sanse sa-l
gasimb intre componentele cu indicele intre (i+j)/2+1 si j,caz in care reapelam functia cu acesti
parametrii.
LIMBAJUL PASCAL
{S-a se gaseasca pozitia unui element intr- nr,n:indice;
un vector prin metoda cautari binare procedure citire;
var I:indice;
OBS:Aplicati divide et impera begin
ex: writeln('n=');readln(n);
n=3 for i:=1 to n do
123 begin
caut pe 2 writeln('a[',i,']=');
readln(a[i]);
=>e pe pozitia 2} end;end;
type indice=1..100;
procedure afisare;
var i:indice;
var a:array[indice] of integer;

190
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin if nr<a[(i+j) div 2 ]


writeln('vectorul sortat este'); then caut (i,(i+j) div 2-1)
for i:=1 to n do else caut ((i+j) div 2+1,j)
write(a[i]);writeln;readln; end;
end; begin
procedure caut(i,j:integer); citire;
begin write('pe cine cautai ');
if nr=a[(i+j) div 2 ] readln(nr);
then writeln('l-am gasi la pozitia ',(i+j) div 2) caut(1,n);
else readln;
if i<j then end.

o Sortare prin interclasare.Se considera vectorul a cu n componente numere intregi(sau


reale).Sa se sorteze crescator,utilizand sortarea prin interclasare.
Algoritmul de sortare prin interclasare se bazeaza pe urmatoarea idée:pentru a sorta un vector cu n
elemante il impartim in doi vectori care,odata sortati,se interclaseaza.

Conform strategiei generale Divide et impera,problema este descompusa in alte doua subprobleme de
acelasi tip si,dupa rezolvarea lor,rezultatele se combina(in particular se interclaseaza).Descompunerea
unui vector in alti doi vectori care urmeaza a fi sortati are loc pana cand avem de sortat vetori de una
sau doua componente.
In aplicatie,functia sort sorteaza un vector cu maximum doua elemente;interc interclaseaza
rezultatele ;divimp implementeaza strategia generala a metodei studiate
matematic:

a=(1 3 5 9)
b=(2 4)
i=1,j=1,k=1
a1<b1
deci avem
c1=1
i=2
k=2
a2>b1
deci avem
c2=2
j=2
k=3
a2<b2
deci avem
c4=4
j=3
k=5
au mai ramas de copiat c5=5
c6=9

LIMBAJUL PASCAL end


type vector=array[1..10] of integer; end;
var a:vector;
n,i:integer; procedure interclasare(xxx1,xxx2,m:integer;var
procedure sort(xxx1,xxx2:integer;var a:vector); a:vector);
var m:integer; var b:vector;
begin i,j,k:integer;
if a[xxx1]>a[xxx2] then begin
begin i:=xxx1;j:=m+1;
m:=a[xxx1]; k:=1;
a[xxx1]:=a[xxx2]; while (i<=m) and (j<=xxx2) do
a[xxx2]:=m; if a[i]<=a[j] then

191
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

begin k:=k+1;
b[k]:=a[i]; end;end;
i:=i+1; procedure divimp(xxx1,xxx2:integer;var a:vector);
k:=k+1; var m:integer;
end begin
else if (xxx2-xxx1)<=1 then
begin sort(xxx1,xxx2,a)
b[k]:=a[j]; else
j:=j+1; begin
k:=k+1; m:=(xxx1+xxx2) div 2;
end; divimp(xxx1,m,a);
if i<=m then divimp(m+1,xxx2,a);
for j:=i to m do interclasare(xxx1,xxx2,m,a);
begin end;end;
b[k]:=a[j]; begin
k:=k+1; writeln('n=');readln(n);
end for i:=1 to n do
else begin
for i:=j to xxx2 do writeln('a[',i,']=');
begin readln(a[i]);
b[k]:=a[i]; end;
k:=k+1; divimp(1,n,a);
end; for i:=1 to n do
k:=1; write(a[i]);
for i:=xxx1 to xxx2 do readln;
begin end.
a[i]:=b[k];
o Sortare rapida.Fie vectorul a cu n numere intregi(sau reale).Se
cere ca vectorul sa fie sortat crescator.

Pentru rezolvare este necesara o functie poz care trateaza o portiune din vector
cuprinsa intre indicii dati de li (limita inferioara) si ls(limita superioara).Rolul acestei
functii este de a pozitiona prima componenta a[li] pe o pozitie k cuprinsa intre li si
ls,astfel incat toate componentele vectorului cuprinse intre li si k-1 sa fie mai mici sau
egale decat a[k] si toate componentele vectorului cuprinse intre k+1 si ls sa fie mai
mari sau egale decat a[k].
In aceasta functie exista doua moduri de lucru:
a) i ramane constant,j scade cu 1;
b) i creste cu 1,j ramane constant.
Functia este conceputa astfel:
 initial,i va lua valoarea li,iar j va lua valoarea ls (elemental care initial
se afla pe pozitia li se va gasi mereu pe o pozitie data de i sau de j);
 se trece in modul de lucru a);
 atata timp cat i<j,se executa:
-daca a[i] este strict mai amre decat a[j],atunci se inverseaza cele doua
numere si se schimba modul de lucru;
-i si j se modifica corespunzator modului de lucru in care se afla
programul;
-k ia vlaoraea comuna a lui i si j.
 Dupa aplicarea functiei poz,este evident ca elementul care se afla initial
in pozitia li va ajunge pe o pozitie k si va ramane pe acea pozitie in
cadrul vectorului deja sortat,fapt care reprezinta esenta algoritmului.
Functoa quick are parametrii li si ls(limita inferioara si limita superioara).In cadrul ei
se utilizeaza metoda Divide et impera,dupa cum urmeaza:

192
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

-se apeleaza poz;


-se apeleaza quick pentru li si k-1;
-se apeleaza quick pentru k+1 si ls.

matematic:
a=(6,9,3,1,2)
li=1,ls=5
i=li=1
j=ls=5
1=li<5=ls,modul A
1=a1<a5=2 inversez deci am modul B
a=(2 9 3 1 6)
i=2
j=5
9=a2>a5=6 inversez in modul A
i=2
j=4
a=(2 6 3 1 9)
6=a2>a4=1
inversez dau deci modul B
i=3 j=4
a=(2 1 3 6 9)
a3 si a4

LIMBAJUL PASCAL var i:indice;


{Fie a un vector cu n componente intregi begin
Scrieti o functie care sa plaseze primul writeln('vectorul sortat este');
for i:=1 to n do
element din vectorul a pe pozitia care write(a[i]);writeln;readln;
acesta end;
ar ocupao fara sa ordonati vectorul in stinga
sa fiind plasate numai elemente mai mici function divide (p,q:indice):indice;
decit el iar in var st,dr:indice;x:tipelement;
begin
dreapta numai elemente mai mari decit el st:=p;dr:=q;x:=a[p];
Functia sa returneze pozitia pe care a fost while st<dr do
plasat primul element begin
OBS:cu metoda divide et impera(Quick while (st<dr) and (a[dr]>=x) do dec(dr);
sort) a[st]:=a[dr];
while (st<dr) and (a[dr]>=x) do dec(dr);
ex:3
132 a[st]:=a[dr];
=>1 2 3 while (st<dr) and (a[st]<x) do inc(st);
a[dr]:=a[st];
} end;
const nmax=100;type indice=1..nmax; a[st]:=x;divide:=st;
tipelement=integer; end;
var a:array[indice] of tipelement;
n:indice; procedure rapida(p,q:indice);
procedure citire; var m:indice;
var I:indice; begin
begin m:=divide(p,q);
writeln('n=');readln(n); if m-1>p then rapida(p,m-1);
for i:=1 to n do if m+1 <q then rapida(m+1,q);
begin end;
writeln('a[',i,']='); begin
readln(a[i]); citire;
end;end; rapida(1,n);
procedure afisare; afisare;

193
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

readln;
end.

194
o Turnurile din Hanoi.Se dau 3 tije simbolizate prin a,b,c.Pe tija a se gasesc discuri de
diameter diferite,asezate in orine descrescatoare a diametrelor private de jos in sus.Se
cere sa se mute discurile de pe tija a pe tija b,utilizand ca tija intermediara tija
c,respectand urmatoarele reguli:
 La fiecare pas se muta un singur disc;
 Nu este permis sa se aseze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.
Rezolvare:
Daca n=1 se face mutarea ab,adica se muta discul de pe tija a pe tija b.
Daca n=2 se fac mutarile ac,ab,cb.
In cazul in care n>2 problema se complica.Notam cu H(n,a,b,c) sirul mutarilor celor n discuri de pe tija a
pe tija b,utilizand ca tija intermediara,toja c.

Conform strategiei Divede et impera incercam sa descompunem problema in alte doua subprobleme
de acelasi tip,urmand apoi combinarea solutiilor.In acest sens,observam ca mutarea celor n discuri de
pe tija a pe tija b,utilizand ca tija intermediara tija c,este echivalenta cu:
 Mutarea a n-1 discuri de pe tija a pe tija c,utilizand ca tija intermediara tija b;
 Mutarea discului ramas pe tija b;
 Mutarea a n-1 discuri de pe tija c pe tija b,utilizand ca tija intermediara tija a.

a b, daca n=1
H(n,a,b,c)=
H(n-1,a,c,b),ab,H(n-1,c,b,a), daca n>1
Pentru n=2 avem: H(2,a,b,c)=H(1,a,c,b),ab,H(1,c,b,a)=ac,ab,cb.
Pentru n=3 avem:
H(3,a,b,c)=H(2,a,c,b),ab,H(2,c,b,a)=H(1,a,b,c),ac,H(1,b,c,a),ab,H(1,c,a,b),cb,H(1,a,b,
c)=ab,ac,bc,ab,ca,cb,ab.
Etapa 1)
etapa 2)discurile sunt ordonate dupa diametru
LIMBAJUL PASCAL
var a,b,c:string;n:integer;
procedure discurile(n:integer;a,b,c:string);
begin
if n=1 then
writeln(a,' --se pune pe--> ',b)
else
begin
discurile(n-1,a,c,b);
writeln(a,'-----se pune pe---> ',b);
discurile(n-1,c,b,a);
end;
end;
begin
write('n=');readln(n);
a:='mic';b:='mijlociu';c:='mare';
discurile(n,a,b,c);
readln;
end.

o Se da o bucata dreptunghiulara de tabla de lungime 1 si inaltimea h,avand pe suprafata ei n


gauri de coordinate numere intregi.Se cere sa se decupeze din ea o bucata de arie maxima care
nu prezinta gauri.Sunt premise numai taieturi verticale si orizontale.
Coordonatele gaurilor sunt retinute in doi vectori xv si yv.Dreptunghiul initial,precum si
dreptunghiurile care apar in procesul taierii sunt memorate in program prin coordonatele coltului din
stanga-sus (x,y),prin lungime si inaltime (L,H).

Pentru un dreptunghi (initial pornim cu toata bucata de tabla),verificam daca avem sau nu o gaura in
el(se cauta practice prima din cele n gauri).In situatia cand acesta prezinta o gaura,problema se
descompune in alte patru probleme de acelasi tip.Daca bucata nu prezinta gauri,se compara aria ei cu
aria unei alte bucati fara gaura,gasita in fazele precedente.

Mentionam ca dreptunghiul de arie maxima fara gauri este retinut prin aceiasi parametric ca si
dreptunghiul cu gauri,in zonele XF,YF,LF,HF

In concluzie,problema initiala se descompune in alte patru probleme de acelasi tip,mai usoare,intrucat


fiecare nou dreptunghi are cel mult n-1 gauri,daca dreptunghiul initial avea n gauri.La aceasta
problema compararea solutiilor consta in a retine dreptunghiul cu aria maxima dintre cele fara gauri.
Fie dreptungiul cu o gaura : h
 xv(i),yv(i)
x,y
Pentru a se afla in interiorul dreptunghiului,gaura trebuie sa indeplineasca simultan conditiile:
1) xv(i)>x;
2) xv(i)<x+1;
3) yv(i)>y;
4) yv(i)<y+h.
Daca facem o taietura verticala prin aceasta gaura,obtinem doua dreptunghiuri:
1) x,y,xv(i)-x,h;
2) xv,yv(i),1+x-xv(i),h.
In urma unei taieturi pe orizontala se obtin cele doua dreptunghiuri:
1) x,y,1,yv(i)-y;
2) x(i),yv(i),1,h+y-yv(i).
LIMBAJUL PASCAL
TABLA
{Se dau coordonatele colturilor unei table dreptunghiulare si n gauri in ea
Stiind ca se permit numai taieturi orizontale si verticale sa se decupeze
o bucata de arie maxima}
type vector=array[1..100] of integer;
var x,y:vector;
n:integer;
function max(i,j:integer):integer;
begin
if i<j then max:=j
else
max:=i;
end;
function arie(x1,y1,x2,y2:integer):integer;
var i:integer;nusereducelaunpunct:boolean;
begin
i:=1;nusereducelaunpunct:=false;
repeat
nusereducelaunpunct:=(x1<x[i]) and(x[i]<x2) and(y1<y[i]) and (y[i]<y2);i:=i+1;
until nusereducelaunpunct or(i=n+1);
i:=i-1;
if not nusereducelaunpunct then
arie:=(x2-x1)*(y2-y1)
else
arie:=max( max(arie(x1,y1,x[i],y2),arie(x[i],y1,x2,y2)),max(arie(x1,y1,x2,y[i]),arie(x1,y[i],x2,y2)));
end;
begin
n:=6;
x[1]:=5;x[2]:=7;x[3]:=10;x[4]:=12;x[5]:=13;x[6]:=17;
y[1]:=3;y[2]:=4;y[3]:=5;y[4]:=13;y[5]:=16;y[6]:=22;
writeln(arie(0,0,20,20));readln;
end.
Bibliografie
1. Manuale de informatică aprobate de Ministerul Educaţiei şi Cercetării
2. Albeanu G., Sisteme de operare, Ed. Petrion, 1996
3. Albeanu G., Programarea în Pascal ºi Turbo Pascal, Ed. Tehnică, 1994
4. Andonie R., Gârbacea I., Algoritmi fundamentali, o perspectivã C++, Ed. Libris,
1995
5. Barbu Gh., Văduva I,. Boloşteanu M., Bazele informaticii, Ed. Tehnică, 1997
6. Bălănescu T., Gavrilă S., Georgescu H., Gheorghe M., Sofonea L., Văduva I.,
Pascal ºi
Turbo Pascal, Ed. Tehnică, Bucureşti, 1992
7. Beu T., Analiza numericã în Turbo Pascal, Ed. Microinformatica, Cluj Napoca,
1992
8. Bulăceanu C., Reþele locale de calculatoare, Ed. Tehnică, 1995
9. Cadar C., Gheorghiţă V., Tehnologia informaþiei - manual pentru clasa a IX-a, Ed.
L&S
Infomat, 1999
10. Calude C., Complexitatea calculului. Aspecte calitative, Ed. Ştiinţifică şi
Enciclopedică,
Bucureşti, 1982
11. Calude C., Teoria algoritmilor, Ed. Universităţii Bucureşti, 1987
12. Cerchez, E., Internet – manual opþional pentru liceu, Ed. Polirom Iaşi, 2000
13. Cerchez, E., Informatica – Culegere de probleme pentru liceu, Ed. Polirom Iaşi,
2002
14. Cerchez, E., Şerban, M. Informatica – manual pentru clasa a X-a. Ed. Polirom
2000, Iaşi
15. Cerchez, E., Şerban, M. PC pas cu pas. Ed. Polirom 2001, Iaşi
16. Cormen T., Leiserson Ch., Rivest R., Introducere în algoritmi, Ed. Computer
Libris
Agora, Cluj
17. Cristea V., Kalisz E., Athanasiu I., Pănoiu S., Turbo Pascal, Ed. Teora, 1992
18. Dima G., Dima M., FoxPro, Ed. Teora, 1994
19. Frâncu C., Informatica economicã - Fox Pro, Ed. L&S Infomat, Bucureşti, 1998
20. Georgescu H., Livovschi L., Analiza ºi sinteza algoritmilor, Ed. Ştiinţifică şi
Enciclopedică, Bucureşti, 1986
21. Giumale C., Negreanu L., Călinoiu S., Proiectarea ºi analiza algoritmilor.
Algoritmi de
sortare, Ed. All, 1997
22. Grigoriu, D., ş.a. – Informatica – subiecte rezolvate de bacalaureat date în anii
1999-
2001, Ed. Niculescu, Bucureşti 2002
23. Horowitz E., Fundamentals of Data Structures in C++, Computer Science Press,
1995
24. Horowitz E., Fundamentals of Programming Languages, Springer Verlag, 1983
25. Ionescu C., Zsako I., Structuri arborescente, Ed. Tehnică, Bucureşti,1990
26. Ivaşc C., Prună M., Bazele informaticii, Ed. Petrion, 1995
27. Ivaşc C., Prună M., Mateescu E., Bazele Informaticii (Grafuri ºi elemente de
combinatoricã) - Caiet de laborator, Ed. Petrion, 1997
28. Ivaşc C., Prună M., Tehnici de programare (Aplicaþii), Ed. Petrion, 1999
29. Ivaşc C., Prună M.,ş.a. Informatica – manual pentru clasa a XI-a, Ed. Petrion,
Bucureşti
2001
30. Jamsa K., Succes cu C++, Ed. All, 1997
31. Knuth D. E., Tratat de programarea calculatoarelor, vol. I, II, III, Ed. Teora
Bucureşti
2002
32. Lica D., Onea E., Informatica, manual pentru clasa a IX-a, Ed. L&S Infomat,
1999
33. Lica D., Onea E., Informatica, manual pentru clasa a X-a, Ed. Prognosis, 2000
34. Lica. D., Popescu, D.A., ş.a. – Bacalaureat la informaticã – Ed. L&S Infomat,
Bucureşti
2002
35. Lungu I., Muşat N., Velicanu M., Sistemul FoxPro 2.6 - Prezentare ºi aplicaþii,
Ed. All,
1996
36. Lupulescu M., Munteanu M., Giulvezan C., FoxPro, de la iniþiere la
performanþã, Ed. de
Vest, Timişoara, 1994
7
37. Mateescu G. D., C++, limbaj ºi programare, Ed. Petrion, 1998
38. Mateescu G. D., Analiza numericã, Ed. Petrion, 1995
39. Mârşanu R., Voicu A, şa, Tehnologia informaþiei, manual pentru clasa a IX-a, Ed.
All,
Bucureşti, 1999
40. Miloşescu M., Sisteme de calcul, Editura Teora, 1998
41. Mitrana V., Provocarea algoritmilor, Ed. Agni, Bucureşti, 1994
42. Negrescu L., Limbajul C ºi C++, Ed. Microinformatica. Cluj
43. Niculescu S., Pintea R., Tehnologia informaþiei ºi Informaticã-Tehnologii asistate
de
calculator - manual pentru clasa a IX-a, Ed. E.D.P., 1999
44. Niculescu S., Butnaru L., Butnaru V., Informaticã- manual pentru clasa a IX-a,
Ed.
E.D.P, 1999
45. Niculescu R., Albeanu G., Domocoş V., Programarea calculatoarelor - probleme
rezolvate în limbajul Turbo Pascal, Ed. Tempus, 1992
46. Odăgescu I., Copos C., Luca D., Furtună F., Smeureanu I., Metode ºi tehnici de
programare, Ed. Intact, Bucureşti, 1994
47. Odăgescu I., Furtună F., Metode ºi tehnici de programare, Editura Computer
Libris
Agora, 1998
48. Panţiru M., Panţiru I., Baze de date, Ed. L&S Infomat, Bucureşti, 1999
49. Panţiru M., Panţiru I., Informatica – manual pentru clasa a XII-a, Ed. L&S
Infomat,
Bucureşti, 2002
50. Pătrăşcoiu O., Marian Gh., Mitroi N., Informaticã - elemente de grafuri ºi
combinatoricã,
metode, algoritmi ºi programe, Ed. All, Bucureşti,
51. Pătruţ B., Miloşescu M., Informaticã - manual pentru clasa a IX-a, Ed. Teora,
1999
52. Pârv B., Vancea S., Fundamentele limbajelor de programare, Ed.
Microinformatica, Cluj,
1996
53. Pintea, R., Voicu. A., Informatica – manual pentru clasa a X-a. Ed. All Bucureşti,
2000.
54. Popa C., Introducere în analiza numericã. Analiza numericã matricealã, Ed.
Eurobit,
Timişoara, 1996
55. Popescu I.., Baze de date relaþionale, Ed. Universităţii Bucureşti, 1998
56. Postolache M., Metode numerice, Ed. Sirius, 1994
57. Rancea D., Limbajul Pascal, Ed. Computer Libris Agora, 1997
58. Rancea D. , Informaticã (manual pentru clasa a IX-a), Ed. Computer Libris
Agora, 1999
59. Rancea D., Limbajul Pascal, Algoritmi fundamentali, Ed. Computer Libris Agora,
1999
60. Salomie I., Tehnici orientate pe obiecte, Ed. Microinformatica, 1995
61. Stoilescu D., Manual de C/C++ pentru licee, Ed. Radial, Galaţi, 1998
62. Tanenbaum A S., Organizarea structuratã a calculatoarelor, Ed. Computer Press
Agora,
1999
63. Tanenbaum A S., Reþele de calculatoare, Ed. Computer Press Agora, 1998
64. Tomescu I., Bazele informaticii (Manual pentru clasa a X), Ed. Didactică şi
Pedagogică,
1994
65. Tomescu I., Grafuri ºi programare liniarã, Ed. Didactică şi Pedagogică, 1975
66. Tudor S., Turbo Pascal, manual pentru clasa a IX-a, Ed. Teora, 1995
67. Tudor S., Tehnici de programare, Ed. L&S Infomat, 1996
68. Tudor S., Bazele programãrii în C++, Ed. L&S Infomat, Bucureşti, 1997
69. Wirth N., Algorithms+Data Structures=Programs, Prentice Hall, Inc 1976
70. ***, seria Gazeta de Informaticã,
[1] NICOLAE TOMAI
Elemente de programare distribuită, ed.Dacia, Cluj-Napoca 1991
[2] BOIAN FLORIAN MIRCEA
Programarea distribuită în internet. Metode şi aplicaţii, ed.Albastră, Cluj-
Napoca 1999
[3] BOIAN FLORIAN MIRCEA
De la aritmetică la calculatoare, Ed. Presa Universitară Clujană, Cluj, 1996
[4] BOIAN FLORIAN MIRCEA
Sisteme de operare interactive, Ed. Libris, Cluj, 1994
[5] CRISTEA V. ş.a.
Reţele de calculatoare, Ed. Teora, Bucureşti, 1992

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