Sunteți pe pagina 1din 552

Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica

Prof.Bogdan Constantin

Teme de specialitate pentru concursuri in informatica si


grade didactice
CONŢINUTUL PROGRAMEI
1. Arhitectura generală a sistemelor de calcul
- prezentare globală
- unitate centrală: componente, funcţii
- unitatea de memorie: structură şi funcţii
- dispozitive periferice
2. Sisteme de operare
- concepte de bază şi caracteristici ale sistemelor de operare (structură, funcţii,
elemente de interfaţă)
- tipuri de sisteme de operare
- (*) utilizarea unui sistem de operare
3. Algoritmi
- noţiunea de algoritm şi caracteristici
- structuri fundamentale( secvenţa, decizia, repetiţia)
- reprezentarea algoritmilor
- algoritmi iterativi şi recursivi
- 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ă)
- analiza complexităţii unui algoritm (considerând criteriile de eficienţă duratã de
executare şi spaþiu de memorie utilizat)
4. Limbaje de programare (Pascal sau C/C++)
- concepte generale (sintaxa unui limbaj de programare, medii de programare)
- (*) elementele de bază ale unui limbaj de programare (Pascal sau C, la alegere):
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)
- (*) tipuri de date structurate
- (*) fişiere; operaţii specifice
- (*) 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; recursivitate
- 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)
5. Metode de programare
- metoda Backtracking: prezentare generală, probleme de generare, oportunitatea
utilizării metodei backtracking; aplicaţii specifice
- metoda Divide et Impera. Descriere şi aplicabilitate. Exemple. Sortarea prin
interclasare. Sortarea rapidă (quicksort)
- metoda Greedy. Descriere şi aplicabilitate. Exemple şi contraexemple
- algoritmi combinatoriali: generare permutări, aranjamente, combinări, produs
cartezian, submulţimile unei mulţimi, partiţii.
6. Implementarea metodelor numerice
- rezolvarea ecuaţiilor algebrice şi transcendente (metodele bisecţiei, coardei şi

1
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

tangentei)
- rezolvarea sistemelor de ecuaţii liniare (Gauss, Jacobi)
7. Alocarea dinamică a memoriei
- tipuri specifice alocării dinamice a memoriei
- structuri de date implementate dinamic (lista simplu şi dublu înlănţuită, stiva, coada,
arbore binar, arbore binar de căutare, operaţii specifice – creare, inserare, ştergere,
parcurgere, căutare)
8. Teoria grafurilor
- definiţie, metode de reprezentare
- noţiunea de graf parţial, subgraf, lanţ, drum, ciclu, circuit
- parcurgerea grafurilor (parcurgerea în lăţime şi în adâncime)
- conexitate/tare conexitate, determinarea componentelor conexe/tare conexe
- drumuri minime şi maxime (algoritmii Dijkstra şi Roy-Floyd)
- grafuri euleriene şi hamiltoniene
- arbori, arbori parţiali de cost minim
- arbori cu rădăcină: metode specifice de reprezentare în memorie. Arbori binari
9. Baze de date
- definirea bazei de date
- clasificarea bazelor de date (modelul relaţional, modelul reţea, modelul ierarhic)
- prezentarea conceptelor de bază ale unui sistem de gestiune a bazelor de date
- operaţii specifice prelucrării bazelor de date (creare, adăugare, modificare, ştergere,
sortare, căutare, vizualizare, interogare)
- relaţii între baze de date
10. Noţiuni de birotică
- editor de text (Microsoft Word)
- editor de foi de calcul (Microsoft Excel)
- editor prezentări (Microsoft PowerPoint)
11. Reţele. Internet
- reţele de calculatoare, clasificarea reţelelor, protocoale de reţea (noţiuni generale)
- reţeaua Internet – descriere generală, adresarea în Internet
- (*) serviciile reţelei Internet (transferarea fişierelor prin ftp, poşta electronică, www,
telnet)
- (*) căutarea informaţiei pe Internet – motoare de căutare
REZOLVARI:
1. Arhitectura generală a sistemelor de calcul
1.1 Prezentare globală
Î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.

2
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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Ă

 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ă:

3
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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)
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

4
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă;

      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;

5
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

   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
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.

6
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

    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).
    

7
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

  
 
    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;
        -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

8
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

            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
Adresabilitatea de pixel
Număr culori
100h
640x400
256
101h
640x480
256
102h
800x600
16
103h
800x600
256
104h
1024x768
16
105h
1024x768
256
106h
1280x1024
16
107h
1280x1024
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:
  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.

9
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
Prof.Bogdan Constantin

  
 
   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
Prof.Bogdan Constantin

        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:

12
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

      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 

13
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:

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).

14
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

2.Sisteme de operare
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.

15
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

   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.

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.
Functiile unui sistem de operare mai sunt:
- management al operatiilor la niv fizic si logic: sist de operare determina
cine va utilize imprimanta, discul, monitorul si alte periferice. De asemeni, SO supervizeaza utilizarea
memoriei si controleaza prioritatile diverselor evenimente. La aparitia unei erori SO raporteaza eroarea
utilizatorului.
- processor de comenzi: SO primeste comenzile utilizatorului, veifica
acuratetea lor si initiaza executia comenzilor prin lansarea programelor corespunzatoare de pe disc sau
din memorie;
- functia de control: SO trebuie sa aiba in permanenta controlul resurselor
sistemului;
- functia de tratare a erorilor: dc un progr prezinta erori de orice fel, care ii
fac imposibila executia in continuare, controlul este cedat SO care determina si raporteaza eroarea.

Un calculator este un echipament electronic cu care omul poate “conversa”. El este construit
din componente care asigură transmiterea, stocarea şi prelucrarea informaţiilor. Aceste
componente sunt “coordonate” (supervizate) prin intermediul unor suscesiuni de “comenzi”
cuprinse în programe speciale, scrise de echipe de specialişti, programe care formează
sistemul de operare cu care lucrează la un moment dat un calculator.

Deci calculatorul este compus dintr-o parte fizică (materială, componentele fizice),
numită hard, şi o parte care asigură dirijarea operaţiilor pe care le face calculatorul în
conversaţia lui cu omul, numită soft, care reprezintă colecţia de programe fără de care hardul
nu funcţionează.

16
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

În capitolul Sisteme de calcul s-a făcut o clasificare a componentelor fizice de bază


care pot compune un calculator. În continuare vom descrie, pe scut, partea de programe care
trebuie să pună în legătură părţile fizice ale calculatorului (cele mai uzuale fiind sistemele de
operare MS-DOS şi Windows).

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>).

17
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 .

Utilitarul Norton Commander

Standardul MS-DOS a generat apariţia de numeroase programe utilitare, proiectate în scopul


facilitării utilizării PC-urilor, printre acestea se menţionează Norton Commander.

Lansarea în execuţie se realizează prin tastarea comenzii nc la prompterul MS-DOS: C:\NC>nc


<Enter>

Pentru a se lansa în execuţie, trebuie îndeplinită una din condiţiile:

   calea din care se lansează să fie calea în care s-a instalat programul;

   să existe o comandă path în fişierul autoexec.bat, în care să fie specificată calea în care s-a
instalat utilitarul.

După lansarea în execuţie, pe ecran se prezintă interfaţa cu utilizatorul, care include doua
ferestre: stânga (left) şi dreapta (right), în care este afişat conţinutul directoarelor (numele de directori
sunt afişate cu litere mari, iar numele de fişiere cu litere mici).

Pe penultima linie apare prompterul, ceea ce face posibilă lansarea oricărei comenzi DOS.
Ultima linie conţine tastele funcţionale de la F1 la F10, fiecare având o semnificaţie înscrisă într-un
dreptunghi.

Mutarea marcatorului luminos de la o fereastră la alta se realizează cu tasta <tab> sau cu


mouse-ul. Marcatorul luminos are rolul de a indica fişierul sau subdirectorul la care se face referirea. In
cadrul unei ferestre marcatorul se mişcă acţionând tastele de deplasare a cursorului sau cu mouse-ul.

18
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Meniul principal se activează acţionând tasta <F9>. La selectarea unui meniu se deschide o
lista cu opţiuni, se selectează opţiunea dorită după care se acţionează tasta <Enter>

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.

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”.

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

19
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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.

20
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 fct de zona ecranului in care se face clic. Ac optiuni vor fi referite la
sectiunea de operatii asupra fisierelor.
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

21
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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.

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

22
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:
4. 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
5. 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 fct de zona ecranului in care se face clic. Ac optiuni vor fi referite la
sectiunea de operatii asupra fisierelor.
6. 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 support automation.

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:

23
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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

24
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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,…
c:
Pe oricare din suporturile magnetice (A, B, C, D, …), informaţiile sunt grupate în
“directoare” (pentru sistemul de operare MS-DOS).

Un Ion
director poate conţine unul
Dana BPsau mai NCmulte autoexec.bat config.sys command.com
subdirectoare şi, eventual, unul sau

mai multe fişiere , ş.a.m.d. Organizarea informaţiilor în subdirectoare se poate observa în
figura următoare:
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
25

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


a.doc b.doc
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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: )

26
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

2.3 Utilizarea unui system de operare


SISTEMUL DE OPERARE WINDOWS

Elemente grafice ale Windows-ului:

folder

fişiere

 Folder (dosar) este denumirea utilizată în Windows pentru “containerele” care conţin alte
foldere şi, eventual, fişiere.
Este similar cu subdirectorul din MS-DOS.

 Icon (Pictogramă) – reprezintă “containere”


al căror conţinut va fi afişat printr-un
clic pe butonul stâng al mouse-ului.

Exemple:

27
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 My Computer conţine componentele sistemului (Printers, Control Panels,


suporturile magnetice, …).
 My Briefcase conţine tot ceea ce dorim să luăm cu noi pe un calculator portabil,
în caz că plecăm într-o călătorie.
 Recycle Bin conţine fişierele pe care le-am şters.

 Bara de aplicaţii – se găseşte în partea inferioară sau superioară a ecranului sau chiar în
dreapta ecranului, şi, după cum are numele, este sub formă de bară. Pe această bară se
găsesc butoane, înşirate unul după altul: butonul Start, sau butoane de aplicaţii (câte un
buton pentru fiecare aplicaţie activă; prin clic pe acest buton, va fi executată aplicaţia
ataşată).

Icon - My Computer

Fereastra de aplicaţie Word

Bara de aplicaţii

Aplicaţie activă

Fereastra de aplicaţie Word


activă şi minimizată.

O fereastră de aplicaţie se
minimizează prin clic pe
butonul din stânga din grupa
de trei butoane ce apar în
dreapta, pe prima linie a
ferestrei.

Observaţie: Un program (sau o aplicaţie) activ, spre deosebire de un program care nu este
activ, rămâne încărcat în memoria calculatorului.
Un program care nu este activ se găseşte pe suport extern şi el trebuie încărcat în
memorie pentru a deveni activ. Utilizatorul poate “conversa” cu calculatorul numai prin
intermediul unei aplicaţii active (sau a unui program activ).

Regăsirea informaţiei

28
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Regăsirea informaţiei pe suportul magnetic se realizează în Windows în mai multe


feluri. Una dintre modalităţile de regăsire a informaţiei este de a utiliza aplicaţia Windows
Explorer, pe care o lansăm în execuţie alegând opţiunea Programs a meniului Start. În
continuare se prezintă interfaţa grafică oferită de Windows Explorer.

Copierea sau mutarea informaţiei pe/de pe suportul magnetic se poate face


deschizând o fereastră cu ceea ce dorim să copiem şi o altă fereastră cu destinaţia copierii
(prin dublu-clic pe iconul My Computer, apoi dublu-clic pe C: ca sursă (de exemplu), după
care revenim la My Computer pentru a alege destinaţia).

Copierea efectivă se realizează prin poziţionarea mouse-ului pe iconul informaţiei de


copiat şi, ţinând butonul stâng al mouse-ului apăsat, îl deplasăm până în locul unde dorim să
copiem informaţia în fereastra ce reprezintă grafic destinaţia.
În momentul în care dăm drumul butonului stâng al mouse-ului, pe ecran va apare o
cutie cu următoarele opţiuni:

 Move Here
 Copy Here
 Create Shortcuts Here
 Cancel

Selectăm opţiunea dorită astfel:

 Cu mouse-ul , după care facem dublu-clic pe butonul stâng

 De la tastatură: selectăm opţiunea cu ajutorul săgeţilor, iar apoi apăsăm tasta


corespunzătoare literei subliniate, corespunzătoare opţiunii dorite. Pentru
renunţare la operaţie (Cancel), se acţionează tasta Esc.

29
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Mutarea informaţiei se face ca şi copierea, diferenţa constând în alegerea


opţiunii (Move Here – pentru mutare, Copy Here – pentru copiere).

Crearea unei scurtături.


Scurtătura (Shortcuts) – reprezintă legătura efectivă dintre un Icon asociat unui
fişier aflat într-un subdirector diferit de subdirectorul în care
apare Icon-ul.

Prin intermediul scurtăturilor, putem alege o aplicaţie (sau orice fişier) din
orice loc, fără a muta fişierul. Unui fişier i se pot asocia mai multe scurtături, dar
o scurtătură nu poate fi asociată la mai multe fişiere.

Iconul My Documents de pe desktopul calculatorului – facilitează


navigarea prin structura arborescentă a informaţiilor stocate pe un suport
magnetic, precum şi realizarea operaţiilor specifice fişierelor şi folderelor
(copiere, mutare, ştergere, creare shortcuts, ş.a.

Prin acţionarea butonului stâng al mouse-ului pe iconul My Documents,pe


ecran apare o fereastră ca în figura de mai jos, în care sunt afişate folderele
(subdirectoarele) şi fişierele de pe discul curent. Dacă dorim să vizualizăm
conţinutul unui folder, selectăm acel folder şi facem dublu-clic pe butonul stâng
al mouse-ului.

30
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Folder Fişier

Se observă că primele linii ale ferestrei aplicaţiei My Documents reprezintă:


 Numele aplicaţiei (prima linie)
 Meniu cu operaţii specifice fişierelor (linia 2)
 Bară cu butoane (linia 3) : Back (înapoi)-revenire la nivelul superior, Forward
(înainte), Up (revenire la rădăcină), butone de lucru cu Clipboard-ul
(Cut, Copy, Paste), buton de renunţare (Undo) şi de ştergere
(Delete).
 Linia 4 ne permite schimbarea discului. Acţionând săgeata din dreapta liniei, putem
selecta un alt suport magnetic din componenţa calculatorului.

Având selectată aplicaţia My Documents, prin dublu-clic pe butonul drept al


mouse-ului, ne apare pe ecran o fereastră ca în figura următoare, cu operaţii specifice
folderelor şi fişierelor.

31
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Aranjarea iconurilor.
Iconurile se afişează pe ecran dezordonat sau ordonat. Ordonarea iconurilor poate fi: după numele
iconului, după tip, după mărime, după data creării sau o autoaranjare la distanţe fixe, dar fără criterii de
ordonare.
Fixând mouse-ul pe desktop, acţionăm butonul său drept,
determinând în acest fel apariţia unei ferestre cu opţiunile
afişate în figura alăturată.
Din fereastra de pe ecran ne alegem opţiunea Arrange
Icons prin clic pe butonul stâng al mouse-ului.
În continuare, pe ecran apare o fereastră cu posibilităţile
de aranjare a icon-urilor, din care putem selecţiona o opţiune.

De exemplu, pentru a aranja iconurile după nume,


succesiunea acţiunilor pe care trebuie să le executăm este
următoarea:

 Dublu-clic pe butonul drept al mouse-ului, având mouse-ul pe desktop


 Selecţionarea opţiunii Arrange Icons, prin dublu-clic pe butonul stâng al mouse-ului
 Selecţionarea opţiunii By Name, prin dublu-clic pe butonul stâng al mouse-ului

Succesiunea acţiunilor descrise anterior este reprezentată în figura următoare:

32
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

1.dublu-clic pe butonul drept al mouse-ului

2. deplasarea mouse-ului
pe opţiunea Arrange
Icons

3. deplasarea mouse-ului
pe opţiunea by Name

Aplicaţia calculator
Aplicaţia Calculator permite folosirea unui calculator ştiinţific pentru efectuarea
operaţiilor matematice.
Această aplicaţie se activează astfel:
Se acţionează butonul Start şi deplasăm cursorul pe aplicaţia Programs.
1. În meniul derulant al aplicaţiei
Programs, deplasăm cursorul pe
aplicaţia Accessories, iar din
meniul derulant al acestei
aplicaţii, alegem aplicaţia
Calculator.
2. Pe ecran apare un calculator de
buzunar, ca în figura alăturată.

33
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
 generalitate (universal) - adică să permită rezolvarea oricărei probleme dintr-o
anumită clasă de probleme pentru care a fost stabilit.

34
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă.

35
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exemple

3. Un algoritm trebuie sa se oprească.


Se consideră următoarea secvenţă de prelucrări:
Pas 1. Atribuie variabilei x valoarea 1;
Pas 2. Măreste valoarea lui x cu 2;
Pas 3. Daca x este egal cu 100 atunci se opreşte prelucrarea altfel se reia de la Pas 2.

Este usor de observat ca x nu va lua niciodată valoarea 100, deci succesiunea de


prelucrări nu se termină niciodată. Din acest motiv nu poate considerată un algoritm
corect.

4. Prelucrările dintr-un algoritm trebuie să fie neambigue.


Consideram următoarea secvenţă de prelucrări:
Pas 1. Atribuie variabilei x valoarea 0;
Pas 2. Fie se măreşte x cu 1 fie se micşorează x cu 1;
Pas 3. Daca x aparţine [-10; 10] se reia de la Pas 2, altfel se opreşte algoritmul.

5. Un algoritm trebuie să se oprească după un interval rezonabil de timp.


Fiind dat un număr n se cere să se determine de câte ori a apărut o cifră c în
reprezentarea tuturor numerelor naturale mai mici ca n.

O rezolvare simplă ar fi să luăm toate numere mai mici ca n şi să vedem de


câte ori apare cifra c în fiecare dinte ele. Soluţia e simplă şi pentru valori mici
ale lui n algoritmul se termină într-un interval de timp rezonabil, dar pentru valori
mari timpul de terminare al algoritmului creşte nepermis de mult.

36
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Paşii realizării unui algoritm


1. Citirea cu atenţie a enunţului problemei.

2. Identificarea datelor de intrare şi a celor de ieşire.

3. Rezolvarea propriu-zisă a problemei pe cazuri particulare şi reprezentative. În acest


moment nu se încearcă scrierea programului ci doar determinarea metodei de
rezolvare, generalizarea şi înţelegerea acesteia.

4. Descrierea în limbaj natural a soluţiei problemei.


Dacă nu sunteţi capabili să descrieţi metoda folosită în limbaj natural e puţin probabil să
o puteţi face într-un limbaj de programare care e mai restrictiv decât limbajul natural.

5. Scrierea programului într-un limbaj de programare.

6. Testarea programului.
Testarea se face pe mai multe seturi de date care să acopere cazurile posibile ce pot
apărea.
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( whil …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…);

37
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă;
 î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:

38
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- 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:
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ă

39
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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

40
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

[]
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
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 [].

41
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
[]
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

42
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
[]
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

43
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă
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

44
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă.
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;

45
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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 CITESTE
I
i DA NU i DA I
A2
EITES EITES I
TE TE
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.

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;

46
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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

47
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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
[]

48
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Î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
[]
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.

49
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:
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:

50
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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ă:

51
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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 :

52
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
Î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 :

53
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

54
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă
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 ;

55
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

56
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:
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:

57
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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}
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;

58
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 n1:=n; s:=0;
cunstruiasca numarul sau. while n1>0 do begin
inc(s,n1 mod 10);
var m,n:word; n1:=n1 div 10; end;
begin if m=n+s then begin
write('n='); readln(n); inc(nr);
m:=0; write(m,'este un numar deosebit.');
while (n<>0) do begin writeln(' ',m,'=',n,'+',s);
m:=m*10+n mod 10; if (m-a+1) mod 20=0 then
n:=n div 10; readln;
end; break
write(m); end
end. end;
2) Se citeste un numar natural n,sa se calculeze writeln('in intervalul[',a,',',B,']
numarul cifrelor sale. SUNT',NR,'NUMERE DEOSEBITE');
ex:123 readln;
=>3} end.
4) Se citeste un numar natural mai mare
var n,nr:word; strict decat 9 avand numar impar de
begin cifre (validare).Sa se afiseze numarul
write('n='); readln(n);
nr:=0; obtinut prin eliminarea cifrei din
while (n<>0) do begin mijloc a numarului initial;.
nr:=nr+1; Exemplu:
n:=n div 10; numarul initial:12345 numarul procesat:1245}
end; var n,n1:0..maxlongint;
write(nr); cifre,i:byte;
end. begin
3) Pentru a, b numere naturale date, 0<=a<b, sa se repeat
afiseze toate numerele write('Numarul dat:'); readln(n);
deosebite din intervalul [a,b].Pentru fiecare numar n1:=n; cifre:=0;
deosebit se va afisa o repeat
singura descompunere.Sa se precizeze numarul inc(cifre);
lor.Un numar natural m este n1:=n1 div 10
deosebit daca exista un numar natural n astfel incat until n1=0
m=n +s(n), unde s(n) until (n>9) and odd(cifre);
este suma cifrelor lui n. i:=0;
Exemplu: repeat
In intervalul [30,100] sunt 64 numere deosebite.} inc(i);
var a,b,m,n,n1,s,nr:word; if i<>cifre div 2+1 then
begin n1:=n1*10+n mod 10;
write('a='); readln(a); n:=n div 10
write('b='); readln(b); until n=0;
if b<=a then begin repeat
writeln('Data incorecta!'); readln; exit; end; n:=n*10+n1 mod 10;
nr:=0; n1:=n1 div 10
for m:=a to b do until n1=0;
for n:=0 to m do begin writeln('Numarul obtinut:',n);

59
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end. cifre sunt consecutive (cifra miilor este cea mai


5) Pentru un numar intreg nr dat, cifra de control mica), iar a*d=(bc)/2.Sa se
(cifra de baza) se obtine precizeze numarul lor.
astfel: se calculeaza suma cifrelor numarului dat, Observatie:
apoi suma cifrelor acestei un singur numar indeplineste conditiile:4567}
sume,etc.Operatiile inceteaza cand suma obtinuta var a,b,c,d,n:0..9;
este o cifra,numita cifra de nr:word;
control (de baza) a numarului dat.Se citesc n>0 begin
numere intregi.Sa se afiseze n:=0;
numerele cu cifra de control para. for a:=1 to 6 do
Exemplu: begin
n=8 (-35,567,-11,-56,23,0,65,635) b:=a+1; c:=b+1; d:=c+1;
Se vor afisa urmatoarele numere: if a*d=(10*b+c) div 2 then begin
-35 are cifra de baza 8; nr:=1000*a+100*b+10*c+d;
-56 are cifra de baza 2; write(nr:5); inc(n); end;
65 are cifra de baza 2; end;
-11 are cifra de baza 2; writeln;
0 are cifra de baza 0; writeln(' numar de numere:',n);
535 are cifra de baza 4.} end.
var n,i,s:byte; 8) Se citesc de pe mediul standard de intrare
nr,nr1:integer; doua numere naturale n si m. Sa
begin se afiseze cifra de pe pozitia m din numarul n.
repeat (cifrele vor fi numerotate de la
write('n='); readln(n); dreapta la stanga).Daca nu exista o cifra pe
until n>0; pozitia respectiva, se va afisa
i:=0; 0.
repeat Exemplu:
inc(i); write ('Numarul',i,':'); Pentru n=4523, m=2 se va afisa 2, iar pt.
readln(nr); nr1:=abs(nr); n=123 si m=4 se va afisa 0.}
repeat var n,m,cifra,k:word;
s:=0; begin
repeat write('n='); readln(n);
inc(s,nr1 mod 10); write('pozitia='); readln(m);
nr1:=nr1 div 10 cifra:=0; k:=0;
until nr1=0; while n<>0 do begin
nr1:=s k:=k+1;
until nr1<10; if k=m then
if not odd(nr1) then cifra:=n mod 10;
writeln(nr,'are cifra de baza',nr1) n:=n div 10;
until i=n; writeln; end;
end. writeln('cifra:',cifra);
6) Sa se calculeze ultima cifra a numarului a^n, end.
unde a si n sunt numere 9) Sa se verifice daca numarul natural n este
naturale mai mici ca 10000. bine ordonat.(n are cifrele fie
Exemplu: in ordine crescatoare, fie in ordine
2^1000 are ultima cifra 6.} descrescatoare).ex:123 este
var a,n,i,p,r:word; Solutie;
begin Se pune problema in ce ordine are n cifrele:
write('a='); readln(a); crescatoare sau descrescatoare?
write('n='); readln(n); Ne dam seama de acest lucru comparand
r:=a mod 10; p:=1; ultimele doua cifre ale lui n.Dar daca
for i:=1 to n do aceste sunt egale?Pentru a rezolva aceasta
begin problema am facut un 'while' ce
p:=p*r; p:=p mod 10; elimina ultimele cifre din n. Apoi am facut o
end; conventie: daca n are cifrele
writeln('ultima cifra:',p); in ordine descrescatoare , t=0, iar daca le are
end. in ordine crescatoare t=1.}
7) Sa se genereze toate numerele naturale de var n,c,t,r:word;
patru cifre (abcd), ale caror ok:boolean;
begin

60
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

ok:=true; x,i,c ,nr , ap:longint;


write('n='); readln(n); begin
c:=n mod 10; n:=n div 10; writeln('dati numarul ');readln(nr);
while c= n mod 10 do for c:=9 downto 0 do begin
n:=n div 10; x:=nr;
if c<n mod 10 then t:=0 ap:=0;
else t:=1; repeat
r:=n mod 10; n:=n div 10; if x mod 10=c then inc(ap);
while n<>0 do begin x:=x div 10;
c:=r; until x=0;
if (c> n mod 10) and (t=0) then ok:=false; for i:=1 to ap do write (c);
if (c< n mod 10) and (t=1) then ok:=false; end;
r:=n mod 10; n:=n div 10; readln;
end; end.
if ok then writeln('bine ordonat') 12) Sa se determine cel mai mic nr. nat. care
else writeln('nu e bine ordonat'); se poate
end. forma cu cifrele unui nr nat. citit de la
10) Se dau doua numar natural x si y cu cel tastatura.}
mult zece cifre.Se cere sa se var x,i,c,nr,ap,ap0,w:longint;
afiseze suma dintre produsul cifrelor lui x si begin
produsul cifrelor lui y.} writeln('nr=');
var readln(nr);
x, y, px, py:longint; w:=0;
begin for c:=0 to 9 do begin
write ('x='); readln(x); x:=nr;
write ('y='); readln(y); ap:=0;
px:=1; ap0:=0;
while x<>0 do begin repeat
px:=px*(x mod 10); if x mod 10=c then inc(ap);
x:=x div 10; if x mod 10=0 then inc(ap0);
end; x:=x div 10;
py:=1; until x=0;
while y<>0 do begin if(c<>0)and (ap>0)then begin
py:=py *(y mod 10); if w=0 then begin
y:=y div 10; write(c);
end; for i:=1 to ap0 do write(0);
writeln (px+py); dec(ap); inc(w); end;
readln; for i:=1 to ap do
end. write(c);
11) Sa se determine cel mai mare numar care end;
se poate forma cu end;
cifrele unui numar natural citit de la tastatura.} end.
var

3.5.2 Divizibilitate
1)Determinaţi toate numerele care sunt inc(i,k);
end;
multipli de k, care depăşesc valoarea n.
program multipli2; end.
var k,i,n:longint; 2) Se citesc n numere naturale.Sa se numere
begin cate din ele sunt pare.
write('k=');readln(k)
; var n,i,x,nr_pare:integer;
write('n=');readln(n) begin
; Write('n='); readln(n);
i:=k; nr_pare:=0;
while i<=n do for i:=1 to n do begin
begin read(x);
write(i,' '); if x mod 2 =0 then

61
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

nr_pare:=nr_pare+1; 6) Sa se determine cel mai mic numar natural


end; nenul care are exact n divizori
write(nr_pare); (inclusiv divizorii banali), d>=2 dat.Sa se
end. afiseze acest numar impreuna cu
3) Se citeste un numar natural n Sa se numere divizorii sai.
divizorii sai (inclusiv 1 si Exemplu:
el insusi)} d=10 : n=48
Divizori: 1,2,3,4,6,8,12,16,24,48}
var n,nr_div,i:integer; var d,nr:byte;
begin n,i:word;
Write('n='); readln(n); begin
nr_div:=0; repeat
for i:=1 to n do write('d='); readln(d)
if n mod i=0 then until d>=2;
nr_div:=nr_div+1; n:=2;
write(nr_div); repeat
end. nr:=0;
4) Sa se genereze toate numerele naturale de for i:=1 to n do
patru cifre de forma 1bcd care if n mod i=0 then inc(nr);
indeplinesc simultan conditiile:d<c, b-c=1, iar b if nr=d then begin
si d sunt divizibile cu 3 . writeln('Cel mai mic numar natural cu
Sa se precizeze numarul lor. exact',d,'divizori este',n);
Exemplu: write('Divizorii lui', n,' sunt:');
Sunt 6 numere:1320, 1650, 1653, 1980, 1983, for i:=1 to n do
1986} if n mod i=0 then write(i:5);
var b,c,d,n:0..9; writeln;
nr:word; break end
begin else inc(n)
n:=0; until false;
for b:=3 to 9 do readln
for d:=0 to 6 do begin end.
c:=b-1; 7) SA se determine descompunerea in factori
if (d<c) and (b mod 3=0) and (d mod 3=0) then primi a unui numar natural n,
begin citit de pe mediul standard de intrare.Afisarea
nr:=1000+100*b+10*c+d; se va efectua ca in exemplul
write(nr:5); inc(n); urmator.
end; Exemplu:
end; pentru n=12 avem:
writeln; 12|2
writeln('sunt',n,'numere'); 6|2
end. 3|3
5) Sa se verifice daca numarul natural n este 1|-}
perfect sau nu.( n este perfect var n,p:word;
daca este egal cu suma divizorilor sai mai mici begin
ca el). write('n='); read(n); p:=2;
Exemplu: while n>1 do
n=6 este perfect deoarece 6=1+2+3.} begin
var n,i,s:word; while n mod p=0 do
begin begin
write('n='); readln(n); writeln(n,'|',p);
s:=0; n:=n div p;
for i:=1 to n div 2 do end;
if n mod i=0 then s:=s+i; p:=p+1;
if n=s then end;
writeln('numar perfect') writeln(1,'|-');
else end.
writeln('numarul nu este perfect'); 8) SA se determine suma numerelor naturale
end. mai mici ca n, divizibile cu 5.}
var i,n,s:word;
begin

62
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write('n='); readln(n); if k>0 then


s:=0; write (s/k:0:2)
for i:=5 to n do else
if i mod 5=0 then s:=s+i; write (' nu exista numere pare');
writeln('s=',s); readln;
end. end.
9) Sa se determine cifrele x si y astfel incat 11) Se dau doua n numere naturale nenule
numarul 1x2y sa fie divizibil (n<40) .Se cere sa se afiseze
cu 3. cel mai mare divizor comun.}
Solutie: var n,a,b,d,i,x: longint;
Daca x si y sunt cifre atunci x,y apartin begin
multimii{0,1,..,9) cu x<>0.Vom write ('n='); readln (n);
verifica daca suma 1+x+2+y=3+x+y este writeln(' dati primul numar ');
divizibila cu 3} readln(x);
var x,y:byte; d:=x;
begin for i:=2 to n do begin writeln(' dati numarul al
for x:=1 to 9 do ',i,' lea ');
for y:=0 to 9 do read(x);
if (x+y+3) mod 3=0 then a:=d; b:=x;
writeln(1,x,2,y); while a<>b do
end. if a >b then
9) Se citesc pe rand un numar prim x si n a:=a-b
numere naturale.Fara a inmulti cele else
n numere, sa se determine k maxim, pentru b:=b-a;
care x^k divide produsul celor n d:=a;
numere. end;
Exemplu: writeln ;
pentru n=4 si x=3 si numerele 23, 36, 4, 6 se write (' c.m.m.d.c=',d);
va afisa k=3, deoarece 3^3 divide readln;
23*36*4*6} end.
var n,x,k,i,nr:word; 12) Sa se calculeze cel mai mare divizor
begin comun a unui numar aleator de numere
write('n='); readln(n); (cu vectori)
write('nr. prim:'); readln(x); ex:3
k:=0; d
for i:=1 to n do begin 6
write('nr='); readln(nr); d
while nr mod x=0 do begin 9
k:=k+1; nr:=nr div x; n
end; =>3}
end; var a:array[1..20] of integer;n,i,j,di,x,y,t:integer;
writeln('k maxim:',k); op:char;
end. begin
10) Se dau doua n numere naturale nenule writeln(' dati numerele');
(n<20) .Se cere sa se afiseze n:=0;
media aritmetica a numerelor pare. Daca nu repeat
exista numere pare se va afisa write('numar ');n:=n+1;readln(a[n]);
mesajul "Nu exista numere pare ".} write(' mai introduceti d / n ?');read(op);
var n,k,s,i,x: longint; until op='n';
begin di:=abs(a[1]);
write ('n='); readln (n); for i:=2 to n do
s:=0; k:=0; begin
for i:=1 to n do begin write ('dati numarul ',i); x:=abs(a[i]);
readln (x); if di>x then begin
if x mod 2 =0 then t:=x;x:=di;di:=t;end;
begin while x mod di <>0 do
s:=s +x; begin t:=x;x:=di;di:=t mod di;end;end;
k:=k+1; writeln('c m m d c ',di);
end; if di=1 then for i:=1 to n do
end; for j:=i+1 to n do

63
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin if x=1 then writeln('(',a[i],',',a[j],')=1');


x:=abs(a[i]);y:=abs(a[j]); end;
if x>y then begin t:=x;x:=y;y:=t;end; readln;
while y mod x <>0 do end.
begin t:=y;y:=x;x:=t mod x; end;
3.5.2 Numere prime

1) Se citeste un numar natural n.Sa se verifice daca 4) Sa se afiseze toate numerele naturale x mai mici
el este prim.} decat n,natural, cu
proprietatea ca x-1 si x+1 sunt numere prime.
var n,i:integer; Exemplu:
prim:boolean; pentru n=15 se vor afisa: 4,6,12.}
begin var x,y,n,i,k:integer;
write('n='); readln(n); t:boolean;
prim:=true; begin
for i:=2 to trunc(sqrt(n)) do write('n='); readln(n);
if n mod i =0 then for x:=2 to n-2 do
prim:=false; begin
if prim then k:=0;
write('Numarul este prim') t:=true;
else for i:=2 to trunc(sqrt(x)) do
write('Numarul nu este prim'); if x mod i=0 then t:=false;
end. if t then k:=k+1;
2) Se citeste un numar natural n.Sa se afiseze y:=x+2; t:=true;
divizorii sai primi. for i:=2 to trunc(sqrt(y)) do
ex:n=9 if y mod i=0 then t:=false;
=>3} if t then k:=k+1;
if k=2 then write (x+1,' ');
var n,i,j:integer; end;
prim:boolean; end.
begin 5) Se citeste un numar natural de cel mult 8 cifre.
write('n='); read(n); Sa se afiseze cel
for i:=2 to n-1 do mai apropiat numar prim fata de acesta.}
if n mod i=0 then begin VAR x,i,k,n1,n2: longint;
prim:=true; ok: boolean;
for j:=2 to trunc(sqrt(i)) do begin
if i mod j =0 then writeln('dati numarul ');
prim:=false; readln (x); n1:=x;
if prim then write(i); repeat
end; inc(n1);
end. ok:=true;
3) Sa se afiseze toate numerele prime mai mici sau for i:=2 to trunc(sqrt(n1)) do
egale decat n, n>1 dat. if n1 mod i =0 then ok:=false;
ex:n=10 until ok;
=>2 3 5 7} n2:=x+1;
var n,i,j:byte; repeat
prim:boolean; dec(n2); ok:=true;
begin for i:=2 to trunc (sqrt(n2)) do
write('n='); readln(n); if n2 mod i=0 then ok:=false;
for i:=2 to n do begin until ok;
prim:=true; if k-n2<n1-x then writeln (n2)
for j:=2 to trunc(sqrt(i)) do else writeln(n1);
if i mod j=0 then begin readln;
prim:=false; break; end; end.
if prim then write(i:5); 6) Se da un numar natural n (0<n<1000000).Se cere
end; sa se afiseze toate
writeln; perechile de numere gemene (a,b), a,b<=n. Perechea
end. (a,b) este o

64
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

pereche de numere gemene daca a si b sunt prime si if i mod j=0 then bec:= false;
valoarea absoluta a if bec then begin
diferenteia-b este 2.} l:=trunc (sqrt(i+2));
var for j:=2 to l do
i,j,n,l:integer; if (i+2) mod j=0 then
bec: boolean; bec:=false;
begin if bec then write ('(',i,',',i+2,') ');end;
write ('n='); readln(n); end;
for i:=2 to n-2 do begin bec:=true; readln;
for j:=2 to trunc(sqrt(i)) do 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 limbaj natural:
O soluţie posibilă ar fi aceea de a alege dintre numerele 2,3,4,5...d...[n/2] pe acelea care sunt
numere prime urmând a fi “extrase” din numărul n.Ordinul de multiplicare al fiecărui factor prim d va fi
egal cu numărul de împărţiri cu rest nul care se pot face succesiv cu el.Pentru a verifica că d este
număr prim trebuie cercetată divizibilitatea sa cu 2,3,4,...[sqrt(d)],ceea ce presupune un număr mare de
împărţiri.O serie de observaţii ce se vor face va conduce la reducerea numărului de calcule.Dintre toate
numerele pare, singurul număr prim este 2.Deci este suficient să căutăm factorii primi numai printre 2 şi
numerele impare ce satisfac condiţia 2k+1<=[n/2] (partea întreagă din n/2).
Dacă se scot din “n” divizorii săi în ordine crescătoare, un număr neprim nu va fi găsit divizor al
lui n, deoarece proprii săi factori primi au fost eliminaţi din n. De exemplu un număr nu se mai divide cu
25 după ce toţi divizorii 5 au fost eliminaţi. Deci nu este necesar să se verifice dacă un număr este prim.
Algoritmul ne asigură că dacă un număr este divizor al lui n atunci acesta este un divizor prim.
Căutarea divizorilor este o operaţie care se repetă ciclic necunoscându-se aprioric numărul de
repatări. Operaţia continuă până numărul mai admite divizori (n>1). Dacă n=1, el nu admite divizori, deci
ciclul nu se va efectua niciodată (se va folosi ciclu cu test iniţial).
Întrucât valoarea lui n se modifică prin extragerea divizorilor,este necesară afişarea sa înaintea
începerii procesului de căutare a acestora.
b) Descrierea şi semnificaţia structurilor de date folosite
n : numărul ce se descompune
d : divizorul (potenţial )
m : ordinul de multiplicare
c) 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
[]
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
[]

65
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
[]
Acţiunea “* îl extrage pe d in n” se cere realizează astfel:
atribuie n  n div d
Pentru valaorea maximă a lui d nu trebuiesc impuse condiţii , d va căpăta noi valori atât timp
cât n mai admite divizori.El nu va putea avea o valoare mai mare decât [ n / 2 ].
Având în vedere faptul că un număr n este prim dacă nu se divide cu 2,3,4,...[sqrt(n)]
algoritmul poate fi inductabil. Deci, trebuie căutaţi divizori ai lui n până la [sqrt(n)] şi nu până la [n/2]. În
final n va conţine iltimul divizor prim (cel mai mare) dacă acesta are multiplicitatea 1. În caz contrar, n va
fi 1. Algoritmul trebuie să facă distincţie între cele 2 situaţii.
Deoarece funcţia sqrt(n) oferă un rezultat de tip real, care poate fi afectat de erorile interne
operării cu numere reale, de exemplu sqrt(16) are valoarea 3,99999E+00, iar trunc(sqrt(16))=3, va
trebui introdusă corecţia sqrt(n+0.5), pentru ca algoritmul să lucreze corect.

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

STOP
d)Programul Pascal

66
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

67
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
writeln(‘cmmdc=’,cmmdc:8,
’cmmmc=’,cmmmc:9);
end
else writeln(‘unul din termeni este

68
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 var n,a,b,c,i,fibo:word;
sirul Fibonacci, n>0 dat.Sirul lui begin
write('n='); readln(n);
Fibonacci este definit astfel: f(1)=0, if n=0 then fibo:=0
f(2)=1, f(n)=f(n-1)+f(n-2). else if n=1 then fibo:=1
Exemplu: else begin
n=7 : 1, 1, 2, 3, 5, 8,13.} a:=0; b:=1;

69
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=2 to n do begin n:=0;


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

3.5.5 Calculul unor sume cu termen general


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

70
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

2) Sa se calculeze suma 3) Pentru n>0 dat, sa se evalueze


S=1+1*2+1*2*3+...+1*2*....*n, unde n este un expresia:
numar E=1+1*3+1*3*5+...+1*3*..*(2*n+1)
natural citit. Exemple:
ex:n=2 a)n=2 : E=19
=>3 b)n=3 : E=124
} c)n=4 : E=1069
d)n=5 : E=11464}
var p,n,s,i:integer; var n,i:byte;
begin e,p:word;
Write('n='); readln(n); begin
p:=1; s:=0; write('n='); readln(n);
for i:=1 to n do begin e:=1; p:=1;
p:=p*i; for i:=1 to n do begin
s:=s+p; p:=p*(2*i+1);
end; inc(e,p);
write(s); end;
end. write('E=',e);
end.
3.5.6 Determinare maxim/minim
1)Sa se determine printr-o }
singura parcurgere a unui vector atit var
y,x,ordonata:array[1..50]of real;
elementul i,n,j:byte; max,distanta:real;s,ma:real;
maxim cit si minim begin
ex:3 write('Numarul de
123 elemente:');readln(n);
=>1 for i:=1 to n do begin
3 write('abscisa x',i,' ');
} read(x[i]);
program MAX_MIN; write('ordonata y',i,' ');
uses crt; read(ordonata[i]);end;
type vector=array[1..100]of integer; max:=0;
var v:vector; for i:=1 to n-1 do
max,min,n,i:integer; for j:=i+1 to n do
begin
begin distanta:=sqrt(sqr(x[i]-x[j])
clrscr; +sqr(ordonata[i]-ordonata[j]));
write('n=');readln(n); if distanta>max then max:=distanta;
for i:=1 to n do begin write end;
('v[',i,']='); writeln(' distanta maxima este ',max);
readln(v[i]); readln;
end; end.
max:=v[1];min:=v[1];
for i:=1 to n do begin if max<v[i] 3){Sa se determine maximul
then max:=v[i]; elementelor pare din vector.
if min> v[i] then ex:n=3
min:=v[i]; 124
end; =>4}
write('max=',max); var a:array[1..20] of integer;
write('min=',min); i,n,k,max,j:integer;
readln ok:boolean;
end. begin
write('n=');
2)Fie n puncte .Sa se determine distanta readln(n);
maxima dintre acestea for i:=1 to n do
ex:2 begin
11 write('a[',i,']=');
22 readln(a[i]);
=>dist 1.41

71
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; else write('nu este un punct creasta');


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

3.5.7 Metode de ordonare

72
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
Teoria 2):
Sortarea prin insertie binara
Principiu: reprezinta o varianta a sortarii prin insertie, in care cautarea locului de inserare se
face aplicind cautarea binara, stiind ca secventa a[1],...,a[i-1] este deja ordonata.
Implementarea algoritmului in Pascal:
procedure InsertieBinara;
VAR i,j,s,d,m : TipIndex; x : TipElement;
begin
for i:=2 to N do begin
x:=a[i]; s:=1; d:=i-1;
while s<=d do begin
m:=(s+d) div 2;
if a[m].cheie > x.cheie then d:=m-1
else s:=m+1
end;
for j:=i-1 downto s do a[j+1]:=a[j];
a[s]:=x
end
end; {InsertieBinara}
In cadrul acestei metode, C este de ordinul N*log N, iar M de N*N.
Se obtin valori minime ale lui C pentru tablouri ordonate invers si valori maxime pentru tablouri
ordonate.

73
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

etapa 1)

74
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

75
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

76
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin


etapa2)

77
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

matematic:
v=(3 7 9 1 2)
i=1 j=2
a=v[j]=2=7
deci

3=v[1]<v[2]=7 deci j=3


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

APLICATIA:

Sa se sorteze un vector prin metoda insertiei(adica fixez un numar de pe o anumita pozitie si


pornind de acolo stpre dreapta se compara doi vecini pina se gasesc doi care nu sunt in ordine dupa
care se merge spre stinga pina se gaseste locul potrivit a celui in cauza, in continuare se face la fel cu
pozitia la care s-a ramas
ex:3
213
=>1 2 3}
uses crt;
var x,i,j,n:integer;
a:array[1..20]of integer;
begin
clrscr;
write('n=');
readln(n);

78
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to n do begin


write('a[',i,']=');
readln(a[i]);
end;
for j:=2 to n do
begin
x:=a[j];
i:=j-1;
while (i>=1) and (a[i]>x) do
begin
a[i+1]:=a[i];
i:=i-1;
end;
a[i+1]:=x;
end;
for i:=1 to n do
write(a[i]:4);
readln;
end.
2)Sortare prin numarare
matematic
v=(11 3 5 14 2)
nc=( 0 0 0 0 0)=(nc1,nc2,nc3,nc4,nc5)
i=1
j>i
deci
j=2
11>3 deci
nc1=nc1+1=0+1=1
j=3 , 11>5 deci
nc1=nc1+1=1+1=2
j=4 , 11<14 deci
nc1=nc1+1=1
j=5 , 11>2 deci
nc1=nc1+1=2+1=3
obtin
nc=(3 0 0 1 0)
analog
i=2
j={3 4 5}
-----------
i=3
j={4 5}
------------
i=4
j=5

Sa se sorteze un vector prin numarare( adica fixez o pozitie si compar


elementul de acolo cu toate celalte si in vectorul nr pe pozitia fixata
scriu de cite ori este mai mare numarul de pe pozitia fixata decit celelalte
,la fel cu urmatoarele ....)
ex:3
213
=>1 2 3}
uses crt;
var t,i,j,n:integer;
a,b,nr:array[1..20]of integer;
begin
clrscr;

79
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write('n=');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
for i:=1 to n do nr[i]:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]<a[j] then nr[j]:=nr[j]+1
else nr[i]:=nr[i]+1;
for i:=1 to n do
b[nr[i]+1]:=a[i];
for i:=1 to n do
write(b[i]:4);
readln;
end.
3)Sortare prin metoda selectiei
Teoria 1)
Sortarea prin selectie
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ă
4 2 1 3 i=1; j=2
A[1] A[2] A[3] A[4]

80
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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]

 Î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

Teoria 2)
Sortarea prin selectie performanta
Principiu: reprezinta o varianta a sortarii prin selectie, in care determinarea elementului cu
cheia minima dintr-o portiune de tablou se reduce la determinarea pozitiei acestuia. In felul acesta se
poate renunta la asignarea x:=a[j] care apare in ciclul "for" controlat de j.
Implementarea algoritmului in Pascal:

81
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

procedure SelectiePerform;
VAR i,j,min : TipIndex; x : TipElement;
begin
for i:=1 to N-1 do begin
min:=i;
for j:=i+1 to N do if a[j].cheie<a[min].cheie then min:=j;
x:=a[min]; a[min]:=a[i]; a[i]:=x
end
end; {SelectiePerform}
etapa 1)

etapa 2) succesiunea de ipostaze

82
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

83
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

etapa 3) la fel…

84
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

etapa 4)sfarsesc cand vectorul e sortat

matematic:
v=(7 3 9 2 1 4)
i=1 j>i deci
j=2 v[1]=7>v[2]=3 le interschimb
v=(3 7 9 2 1 4 )
j=3

85
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

v[1]3<v[3]=9, la fel
j=4 v[1]=3<v[4]=2 le interschimb
deci v=(2 7 9 3 1 4)
j=5 v[1]=2>v[5]=1 le interschimb
deci v=(1 7 9 3 2 4)
j=6 v[1]=1<v[6]=4 la fel
pentru i=2 , j={3 4 5 6} analog

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

86
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

87
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

matematic:
v=(3 1 4 2 )
avem
i=1 v[1]=3<v[2]=1 le schimb locul
deci
v=(1 3 4 2 0)
i=2 v[2]=3<v[3]=4 ramane la fel
i=3 v[3]=4>v[4]=2 le interschimb
deci v=(1 3 2 4 0)
acum luam i=1 v[1]<v[2]
i=2 v[2]=3>v[3]=2 le interschimb
deci
v=(1 2 3 4 0 )

APLICATIA:
Sa se sorteze un vector prin metoda bulelor ( adica se compara permanent doi vecini
astfel incit in final cel mai mare merge spre dreapta)
ex:3
3 2 12
=>2 3 12

88
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

}
uses crt;
var t,i,q,n:integer;
a:array[1..20]of integer;
begin
clrscr;
write('n=');
readln(n);
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
q:=0;
while q=0 do
begin
q:=1;
for i:=1 to n-1 do
if a[i]>a[i+1] then begin
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
q:=0;
end;
end;
for i:=1 to n do
write(a[i]:4);
readln;
end.
3.5.9 Metode de cautare
1)Metoda binara if v=a[n] then
Se da un vector cu n elemente ordonat write('valoarea este pe pozitia ',n)
crescator si o valoare v.Sa se indice else begin
daca aceasta valoare exista in sir ,daca st:=1;
da ,sa se precizeze pe ce pozitie se dr:=n;
afla ,folosind metoda cautarii binare . ok:=false;
ex:3 while (dr-st>1) and not ok do begin
123 m:=trunc((st+dr)/2);
p=2 if v=a[m] then begin
=> pe pozitia a doua este} k:=m;
program cautarebinara; ok:=true;
uses crt; end else
const Nmax=20; if v>a[m] then st:=m
var i,n:byte; else dr:=m;
a:array[1..20] of integer; end;
v,st,dr,m,k:integer; if ok then
ok:boolean; writeln('valoarea cautata e in sir pe
begin pozitia ',k)
clrscr; else
write('n='); writeln('valoarea cautata nu e in sir');
readln(n); end;
for i:=1 to n do begin readkey;
write('a[',i,']='); end.
readln(a[i]); 2)Cautare secventiala
end; Se citesc n numre naturale intr-un
write('pe cine cautati'); vector.sa se calculeze
readln(v); media aritmetica a acestora
if v=a[1] then ex:n=3
write('valoarea este pe pozitia 1') caut pe 2
else 123

89
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to n do begin


=>este 2} write('a[',i,']=');
program media; readln(a[i]);
uses crt; end;
var i,n:byte; for i:=1 to n do
a:array[1..50]of integer; if x=a[i] then
x,s:integer;m:real; write('este',x)
begin else
clrscr; write(' NU este',x)
write('n='); readkey;
readln(n,x); 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;
readln;
END.

90
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 ).

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.

91
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 )

92
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

93
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Pentru a intelege utilitatea notatiei asimptotice conditionate, sa presupunem ca timpul


de executie al unui algoritm este dat de ecuatia

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

94
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:

                               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,

95
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

(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

96
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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)

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) :

97
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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,

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

98
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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)
                            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
succesiv

 t(n) = 2t(n1) 1 = 22t(n2) 2 1 = … = 2n-1t(1) 
 t

99
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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.6.3.3 Recurente liniare omogene


Exista, din fericire, si tehnici care pot fi folosite aproape automat pentru a rezolva
anumite clase de recurente. Vom incepe prin a considera ecuatii recurente liniare
omogene, adica de forma

100
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

a0tn  a1tn-1  ¼  aktn-k = 0                  ()

unde ti sunt valorile pe care le cautam, iar coeficientii ai sunt constante.

Conform intuitiei, vom cauta solutii de forma

tn = xn

unde x este o constanta (deocamdata necunoscuta). Incercam aceasta solutie in () si


obtinem

 a0xn  a1xn-1  ...  akxn-k = 0

Solutiile acestei ecuatii sunt fie solutia triviala x = 0, care nu ne intereseaza, fie
solutiile ecuatiei

 a0xk  a1xk-1  ...  ak = 0

care este ecuatia caracteristica a recurentei ().

Presupunand deocamdata ca cele k radacini r1, r2, ..., rk ale acestei ecuatii


caracteristice sunt distincte, orice combinatie liniara

este o solutie a recurentei (), unde constantele c1, c2, ..., ck sunt determinate de


conditiile initiale. Este remarcabil ca () are numai solutii de aceasta forma.

Sa exemplificam prin recurenta care defineste sirul lui Fibonacci (din Sectiunea
1.6.4):

tn = tn-1  tn-2               n  2

iar t0 = 0, t1 = 1. Putem sa rescriem aceasta recurenta sub forma

tn tn-1 tn-2 = 0

care are ecuatia caracteristica

x2 x 1 = 0

cu radacinile r1,2 = (1 )/2. Solutia generala are forma

Impunand conditiile initiale, obtinem

101
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

c1  c2      = 0         n = 0


r1c1  r2c2 = 1         n = 1

de unde determinam

c1,2 = 

Deci, . Observam ca r1 =  = (1 )/2, r2 = -1 si obtinem

(n()-n)

care este cunoscuta relatie a lui de Moivre, descoperita la inceputul secolului XVI. Nu
prezinta nici o dificultate sa aratam acum ca timpul pentru algoritmul fib1 (din
Sectiunea 1.6.4) este in (n).

Ce facem insa atunci cand radacinile ecuatiei caracteristice nu sunt distincte? Se poate
arata ca, daca r este o radacina de multiplicitate m a ecuatiei caracteristice, atunci
tn = rn, tn = nrn, tn = n2rn, ..., tn = nm-1rn sunt solutii pentru (). Solutia generala pentru o
astfel de recurenta este atunci o combinatie liniara a acestor termeni si a termenilor
proveniti de la celelalte radacini ale ecuatiei caracteristice. Din nou, sunt de
determinat exact k constante din conditiile initiale.

Vom da din nou un exemplu. Fie recurenta

tn = 5tn-1 8tn-2  4tn-3               n  3

iar t0 = 0, t1 = 1, t2 = 2. Ecuatia caracteristica are radacinile 1 (de multiplicitate 1) si 2
(de multiplicitate 2). Solutia generala este:

tn = c11n  c22n  c3n2n

Din conditiile initiale, obtinem c1 = 2, c2 = 2, c3 = 1/2.

3.6.3.4 Recurente liniare neomogene


Consideram acum recurente de urmatoarea forma mai generala

a0tn  a1tn-1  ...  aktn-k = bnp(n)                        ()

unde b este o constanta, iar p(n) este un polinom in n de grad d. Ideea generala este
ca, prin manipulari convenabile, sa reducem un astfel de caz la o forma omogena.

De exemplu, o astfel de recurenta poate fi:

tn  2tn-1 = 3n

102
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In acest caz, b = 3 si p(n) = 1, un polinom de grad 0. O simpla manipulare ne permite


sa reducem acest exemplu la forma (). Inmultim recurenta cu 3, obtinand

3tn 6tn-1 = 3n+1

Inlocuind pe n cu n1 in recurenta initiala, avem

tn+1 2tn = 3n+1

In fine, scadem aceste doua ecuatii

tn+1 5tn  6tn-1 = 0

Am obtinut o recurenta omogena pe care o putem rezolva ca in sectiunea precedenta.


Ecuatia caracteristica este:

x2 5x  6 = 0

adica (x2)(x3) = 0.

Intuitiv, observam ca factorul (x2) corespunde partii stangi a recurentei initiale, in


timp ce factorul (x3) a aparut ca rezultat al manipularilor efectuate, pentru a scapa de
parte dreapta.

Generalizand acest procedeu, se poate arata ca, pentru a rezolva (), este suficient sa
luam urmatoarea ecuatie caracteristica:

(a0xk  a1xk-1  ¼  ak)(xb)d+1 = 0

Odata ce s-a obtinut aceasta ecuatie, se procedeaza ca in cazul omogen.

Vom rezolva acum recurenta corespunzatoare problemei turnurilor din Hanoi:

tn = 2tn-1  1               n  1

iar t0 = 0. Rescriem recurenta astfel

tn  2tn-1 = 1

care este de forma () cu b = 1 si p(n) = 1, un polinom de grad 0. Ecuatia


caracteristica este atunci (x2)(x1) = 0, cu solutiile 1 si 2. Solutia generala a
recurentei este:

tn = c11n  c22n

Avem nevoie de doua conditii initiale. Stim ca t0 = 0; pentru a gasi cea de-a doua
conditie calculam

103
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

t1 = 2t0 1

Din conditiile initiale, obtinem

tn = 2n 1

Daca ne intereseaza doar ordinul lui tn, nu este necesar sa calculam efectiv constantele
in solutia generala. Daca stim ca tn = c11n c22n, rezulta tn  O(2n). Din faptul ca
numarul de mutari a unor discuri nu poate fi negativ sau constant, deoarece avem in
mod evident tn  n, deducem ca c2 > 0. Avem atunci tn  (2n) si deci, tn  (2n).
Putem obtine chiar ceva mai mult. Substituind solutia generala inapoi in recurenta
initiala, gasim

1 = tn  2tn-1 = c1  c22n2(c1  c22n-1) = c1

Indiferent de conditia initiala, c1 este deci 1.

3.6.3.5 Schimbarea variabilei
Uneori, printr-o schimbare de variabila, putem rezolva recurente mult mai complicate.
In exemplele care urmeaza, vom nota cu T(n) termenul general al recurentei si cu tk
termenul noii recurente obtinute printr-o schimbare de variabila. Presupunem pentru
inceput ca n este o putere a lui 2.

Un prim exemplu este recurenta

T(n) = 4T(n/2)  n                n > 1

in care inlocuim pe n cu 2k, notam tk = T(2k) = T(n) si obtinem

tk = 4tk-1  2k

Ecuatia caracteristica a acestei recurente liniare este

(x4)(x2) = 0

si deci, tk = c14k  c22k. Inlocuim la loc pe k cu lg n

T(n) = c1n2  c2n

Rezulta

T(n)  O(n2 | n este o putere a lui 2)

Un al doilea exemplu il reprezinta ecuatia

T(n) = 4T(n/2)  n2                n > 1

104
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Procedand la fel, ajungem la recurenta

tk = 4tk-1  4k

cu ecuatia caracteristica

(x4)2 = 0

si solutia generala tk = c142  c2k42. Atunci,

T(n) = c1n2  c2n2lg n

si obtinem

T(n)  O(n2log n | n este o putere a lui 2)

In fine, sa consideram si exemplul

T(n) = 3T(n/2)  cn               n > 1

c fiind o constanta. Obtinem succesiv

T(2k) = 3T(2k-1)  c2k

tk = 3tk-1  c2k

cu ecuatia caracteristica

(x3)(x2) = 0

tk = c13k  c22k

T(n) = c13lg n  c2n

si, deoarece

alg b = blg a

obtinem

T(n) = c1nlg 3  c2n

deci,

T(n)  O(nlg 3 | n este o putere a lui 2)

In toate aceste exemple am folosit notatia asimptotica conditionata. Pentru a arata ca

105
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

rezultatele obtinute sunt adevarate pentru orice n, este suficient sa adaugam conditia
ca T(n) sa fie eventual nedescrescatoare. Aceasta, datorita Proprietatii 5.1 si a faptului
ca functiile n2, n log n si nlg 3 sunt netede.

Putem enunta acum o proprietate care este utila ca reteta pentru analiza algoritmilor
cu recursivitati de forma celor din exemplele precedente. Proprietatea, a carei
demonstrare o lasam ca exercitiu, ne va fi foarte utila la analiza algoritmilor divide et
impera din Capitolul 7.

Proprietatea 3.6.2 Fie T : N  R+ o functie eventual nedescrescatoare

T(n) = aT(n/b)  cnk                n > n0

unde: n0  1, b  2 si k  0 sunt intregi; a si c sunt numere reale pozitive; n/n0 este o
putere a lui b. Atunci avem

3.6.4 Exercitii

3.6.1       Care din urmatoarele afirmatii sunt adevarate?


i)     n2  O(n3)

ii)    n3  O(n2)

iii)  2n+1  O(2n)

iv)   (n1)!  O(n!)

v)     pentru orice functie f : N  R,  f  O(n)  [ f 2  O(n2)]

vi)   pentru orice functie f : N  R,  f  O(n)  [2 f  O(2n)]

3.6.2       Presupunand ca f este strict pozitiva pe N, demonstrati ca definitia lui O( f )


este echivalenta cu urmatoarea definitie:

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

3.6.3       Demonstrati ca relatia “ O” este tranzitiva: daca f  O(g) si g  O(h),


atunci f  O(h). Deduceti de aici ca daca g  O(h), atunci O(g)  O(h).

106
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

3.6.4       Pentru oricare doua functii f, g : N  R, demonstrati ca:


i)     O( f ) = O(g)              f  O(g)  si  g  O( f )

ii)    O( f )  O(g)             f  O(g)  si  g  O( f )

3.6.5       Gasiti doua functii f, g : N  R, astfel incat f  O(g) si g  O( f ).


Indicatie: f (n) = n,  g(n) = n1+sin n

3.6.6       Pentru oricare doua functii f, g : N  R definim urmatoarea relatie binara:
f  g daca O( f )  O(g). Demonstrati ca relatia “” este o relatie de ordine partiala in
multimea functiilor definite pe N si cu valori in R.

Indicatie: Trebuie aratat ca relatia este partiala, reflexiva, tranzitiva si antisimetrica.


Tineti cont de Exercitiul 5.5.

3.6.7       Pentru oricare doua functii f, g : N  R demonstrati ca


O( f  g) = O(max( f, g))

unde suma si maximul se iau punctual.

3.6.8       Fie f (n) = amnm…a1n  a0 un polinom de grad m, cu am > 0. Aratati ca 


f  O(nm).

3.6.9       O(n2) = O(n3(n2n3)) = O(max(n3, n2n3)) = O(n3)
Unde este eroarea?

3.6.10     Gasiti eroarea in urmatorul lant de relatii:


= 12…n  O(12…n) = O(max(1, 2,
…, n)) = O(n)

3.6.11     Fie f , g : N  R+. Demonstrati ca:

i)       R+           O( f ) = O(g)

107
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

ii)     = 0           O( f )  O(g)

Observatie: Implicatiile inverse nu sunt in general adevarate, deoarece se poate


intampla ca limitele sa nu existe.

3.6.12     Folosind regula lui l’Hôspital si Exercitiile 5.4, 5.11, aratati ca

log n  O( ),    dar      O(log n)

Indicatie: Prelungim domeniile functiilor pe R+, pe care sunt derivabile si aplicam


regula lui l’Hôspital pentru log n/ .

3.6.13     Pentru oricare f, g : N  R, demonstrati ca:


 f  O(g)      g  ( f )

3.6.14     Aratati ca f  (g) daca si numai daca


(c, d  R+) (n0  N) (n  n0) [cg(n)  f (n)  dg(n)]

3.6.15     Demonstrati ca urmatoarele propozitii sunt echivalente, pentru oricare doua


functii f, g : N  R.

i)     O( f ) = O(g)

ii)    ( f ) = (g)

iii)         f  (g)

3.6.16     Continuand Exercitiul 5.11, aratati ca pentru oricare doua functii


f, g : N  R+ avem:

i)       R+             f  (g)

ii)     = 0              f  O(g)   dar   f  (g)

iii)   =            f  (g)   dar   f  (g)

108
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

3.6.17     Demonstrati urmatoarele afirmatii:


i)     logan  (logbn)   pentru oricare  a, b > 1

ii)     (nk+1)   pentru oricare  k  N

iii)    (log n)

iv)   log n!  (n log n)

Indicatie: La punctul iii) se tine cont de relatia:

= ln n    1/2n  1/12n2  ...

unde  = 0,5772...  este constanta lui Euler.

La punctul iv), din n! < nn, rezulta log n!  O(n log n). Sa aratam acum, ca


log n!  (n log n). Pentru 0  i  n1 este adevarata relatia

(ni)(i1)  n

Deoarece

(n)2 = (n×1) ((n)2) ((n2)3)...(2(n1)) (1n)  nn

rezulta 2 log n!  n log n si deci log n!  (n log n).

Punctul iv) se poate demonstra si altfel, considerand aproximarea lui Stirling:

unde e = 1,71828... .

3.6.18     Aratati ca timpul de executie al unui algoritm este in (g), g : N  R,


daca si numai daca: timpul este in O(g) pentru cazul cel mai nefavorabil si in (g)
pentru cazul cel mai favorabil.

3.6.19     Pentru oricare doua functii f, g : N  R demonstrati ca


( f ) (g) = ( f  g) = (max( f, g)) = max(( f ), (g))

unde suma si maximul se iau punctual.

109
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

3.6.20     Demonstrati Proprietatea 5.1. Aratati pe baza unor contraexemple ca cele


doua conditii “t(n) este eventual nedescrescatoare” si “f (bn)  O( f (n))” sunt
necesare.

3.6.21     Analizati eficienta urmatorilor patru algoritmi:


for i  1 to n do                               for i  1 to n do
     for j 1 to 5 do                                 for j  1 to i1 do
          {operatie elementara}                       {operatie elementara}

for i  1 to n do                               for i  1 to n do


     for j  1 to 6 do                                for j  1 to i do
          for k 1 to n do                               for k  1 to n do
              {operatie elementara}                       {operatie elementara}

3.6.22     Construiti un algoritm cu timpul in (n log n).

3.6.23     Fie urmatorul algoritm


 k  0
     for i  1 to n do
          for j  1 to T[i] do
              k  kT[ j]

unde T este un tablou de n intregi nenegativi. In ce ordin este timpul de executie al


algoritmului?

Solutie: Fie s suma elementelor lui T. Daca alegem ca barometru instructiunea


“k  kT[ j]”, calculam ca ea se executa de s ori. Deci, am putea deduce ca timpul
este in ordinul exact al lui s. Un exemplu simplu ne va convinge ca am gresit.
Presupunem ca T[i] = 1, atunci cand i este un patrat perfect, si T[i] = 0, in rest. In
acest caz, s =  . Totusi, algoritmul necesita timp in ordinul lui (n), deoarece
fiecare element al lui T este considerat cel putin o data. Nu am tinut cont de
urmatoarea regula simpla: putem neglija timpul necesar initializarii si controlului unei
bucle, dar cu conditia sa includem “ceva” de fiecare data cand se executa bucla.

Iata acum analiza detailata a algoritmului. Fie a timpul necesar pentru o executare a
buclei interioare, inclusiv partea de control. Executarea completa a buclei interioare,
pentru un i dat, necesita baT[i] unitati de timp, unde constanta b reprezinta timpul
pentru initializarea buclei. Acest timp nu este zero, cand T[i] = 0. Timpul pentru o
executare a buclei exterioare este cbaT[i], c fiind o noua constanta. In fine, intregul

algoritm necesita  unitati de timp, unde d este o alta constanta.

110
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Simplificand, obtinem (cb)nasd. Timpul t(n, s) depinde deci de doi parametri


independenti n si s. Avem: t  (ns) sau, tinand cont de Exercitiul 5.19,
t  (max(n, s)).

3.6.24     Pentru un tablou T[1 .. n], fie urmatorul algoritm de sortare:


for i  n downto 1 do
     for j  2 to i do
          if T[ j1] > T[ j] then interschimba T[ j1] si T[ j]

Aceasta tehnica de sortare se numeste metoda bulelor (bubble sort).

i)     Analizati eficienta algoritmului, luand ca barometru testul din bucla interioara.

ii)    Modificati algoritmul, astfel incat, daca pentru un anumit i nu are loc nici o
interschimbare, atunci algoritmul se opreste. Analizati eficienta noului algoritm.

3.6.25     Fie urmatorul algoritm


for i  0 to n do
     j  i
     while j  0 do j  j div 2

Gasiti ordinul exact al timpului de executie.

3.6.26     Demonstrati ca pentru oricare intregi pozitivi n si d

Solutie:

Mai ramane sa aratati ca

3.6.27     Analizati algoritmii percolate si sift-down pentru cel mai nefavorabil caz,
presupunand ca opereaza asupra unui heap cu n elemente.

111
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Indicatie: In cazul cel mai nefavorabil, algoritmii percolate si sift-down necesita un


timp in ordinul exact al inaltimii arborelui complet care reprezinta heap-ul, adica in
(lg n) = (log n).

3.6.28     Analizati algoritmul slow-make-heap pentru cel mai nefavorabil caz.


Solutie: Pentru slow-make-heap, cazul cel mai nefavorabil este atunci cand, initial, T
este ordonat crescator. La pasul i, se apeleaza percolate(T[1 .. i], i), care efectueaza
lg i comparatii intre elemente ale lui T. Numarul total de comparatii este atunci

C(n)  (n1) lg n  O(n log n)

Pe de alta parte, avem

(lg i  1) = lg n!  (n1
C(n) =  lg i > 
)

In Exercitiul 5.17 am aratat ca lg n!  (n log n). Rezulta C(n)  (n log n) si timpul


este deci in (n log n).

3.6.29     Aratati ca, pentru cel mai nefavorabil caz, timpul de executie al
algoritmului heapsort este si in (n log n), deci in (n log n).

3.6.30     Demonstrati ca, pentru cel mai nefavorabil caz, orice algoritm de sortare
prin comparatie necesita un timp in (n log n). In particular, obtinem astfel, pe alta
cale, rezultatul din Exercitiul 5.29.

Solutie: Orice sortare prin comparatie poate fi interpretata ca o parcurgere a unui


arbore binar de decizie, prin care se stabileste ordinea relativa a elementelor de sortat.
Intr-un arbore binar de decizie, fiecare varf neterminal semnifica o comparatie intre
doua elemente ale tabloului T si fiecare varf terminal reprezinta o permutare a
elementelor lui T. Executarea unui algoritm de sortare corespunde parcurgerii unui
drum de la radacina arborelui de decizie catre un varf terminal. La fiecare varf
neterminal se efectueaza o comparatie intre doua elemente T[i] si T[ j]: daca
T[i]  T[ j] se continua cu comparatiile din subarborele stang, iar in caz contrar cu
cele din subarborele drept. Cand se ajunge la un varf terminal, inseamna ca algoritmul
de sortare a reusit sa stabileasca ordinea elementelor din T.

Fiecare din cele n! permutari a celor n elemente trebuie sa apara ca varf terminal in
arborele de decizie. Vom lua ca barometru comparatia intre doua elemente ale
tabloului T. Inaltimea h a arborelui de decizie corespunde numarului de comparatii
pentru cel mai nefavorabil caz. Deoarece cautam limita inferioara a timpului, ne
intereseaza doar algoritmii cei mai performanti de sortare, deci putem presupune ca
numarul de varfuri este minim, adica n!. Avem: n!  2h (demonstrati acest lucru!),
adica h  lg n!. Considerand si relatia log n!  (n log n) (vezi Exercitiul 5.17),

112
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

rezulta ca timpul de executie pentru orice algoritm de sortare prin comparatie este, in
cazul cel mai nefavorabil, in (n log n).

3.6.31     Analizati algoritmul heapsort pentru cel mai favorabil caz. Care este cel
mai favorabil caz?

3.6.32     Analizati algoritmii fib2 si fib3 din Sectiunea 1.6.4.


Solutie:

i)    Se deduce imediat ca timpul pentru fib2 este in (n).

ii)   Pentru a analiza algoritmul fib3, luam ca barometru instructiunile din bucla while.
Fie nt valoarea lui n la sfarsitul executarii celei de-a t-a bucle. In particular, n1 = n/2.
Daca 2  t  m, atunci

nt = nt-1/2  nt-1/2

Deci,

nt  nt-1/2  …  n/2t

Fie m = 1  lg n. Deducem:

nm  n/2m < 1

Dar, nm  N, si deci, nm = 0, care este conditia de iesire din bucla. Cu alte cuvinte,
bucla este executata de cel mult m ori, timpul lui fib3 fiind in O(log n). Aratati ca
timpul este de fapt in (log n).

La analiza acestor doi algoritmi, am presupus implicit ca operatiile efectuate sunt


independente de marimea operanzilor. Astfel, timpul necesar adunarii a doua numere
este independent de marimea numerelor si este marginit superior de o constanta. Daca
nu mai consideram aceasta ipoteza, atunci analiza se complica.

3.6.33     Rezolvati recurenta tn  3tn-1  4tn-2 = 0, unde n  2, iar t0 = 0, t1 = 1.

3.6.34     Care este ordinul timpului de executie pentru un algoritm recursiv cu


recurenta tn = 2tn-1  n.

Indicatie: Se ajunge la ecuatia caracteristica (x2)(x1)2 = 0, iar solutia generala este


tn = c12n c21n c3n1n. Rezulta t  O(2n).

113
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Substituind solutia generala inapoi in recurenta, obtinem ca, indiferent de conditia


initiala, c2 = 2 si c3 = 1. Atunci, toate solutiile interesante ale recurentei trebuie sa
aiba c1 > 0 si ele sunt toate in (2n), deci in (2n).

3.6.35     Scrieti o varianta recursiva a algoritmului de sortare prin insertie si


determinati ordinul timpului de executie pentru cel mai nefavorabil caz.

Indicatie: Pentru a sorta T[1 .. n], sortam recursiv T[1 .. n1] si inseram T[n] in


tabloul sortat T[1 .. n1].

3.6.36     Determinati prin schimbare de variabila ordinul timpului de executie pentru


un algoritm cu recurenta T(n) = 2T(n/2)  n lg n, unde n > 1 este o putere a lui 2.

Indicatie: T(n)  O(n log2n | n este o putere a lui 2)

Clasa P; alte clase deterministe


Unele probleme se pot rezolva, altele nu. De exemplu, o problemă notorie, a cărei imposibilitate este
riguros demonstrată în anii '30 de către matematicianul englez Alan Turing, este de a decide dacă un
program se va opri vreodată pentru o anumită instanţă a datelor de intrare.

Pe de altă parte, chiar între problemele care pot fi rezolvate, teoreticienii trag o linie imaginară între
problemele care au rezolvări ``rezonabil'' de rapide, şi restul problemelor, care se numesc ``intratabile''.

În mod arbitrar, dar nu ne-justificabil, o problemă se numeşte ``intratabilă'' dacă complexitatea ei este
exponenţială în mărimea datelor de intrare. (Nu uitaţi, este vorba de complexitate ``worst-case''
asimptotică.) O problemă este ``tratabilă'' dacă putem scrie complexitatea ei sub forma unui polinom,
de un grad oricît de mare.

Mulţimea tuturor problemelor de decizie (adică a problemelor la care răspunsul este da sau nu) cu
complexitate polinomială se notează cu P (de la polinom). De exemplu, problema de a găsi dacă o
valoare se află într-un vector este în clasa P; algoritmul exhibat mai sus este un algoritm în timp linear
(O(n)) pentru a răspunde la această întrebare.

Un exemplu de problemă cu complexitate exponenţială (ne-polinomială)? Iată unul: dacă se dă o


formulă logică peste numerele reale, cu cuantificatori existenţiali ( ) şi universali ( ), care foloseşte

numai operaţii de adunare, comparaţii cu < şi conectori logici ( ), este

formula adevărată? (Un exemplu de formulă: `` '').


Decizia se poate face numai într-un timp exponenţial în lungimea formulei (pentru anumite instanţe),
dar demonstraţia nu este de loc simplă.

(Ca o curiozitate: există şi probleme cu o complexitate ``ne-elementară'', care este mai mare decît
complexitatea oricărei probleme exponenţiale. O astfel de problemă este cea de decizie a adevărului
unei formule în teoria numită S1S, sau ``teoria monadică a succesorilor de ordinul 2''. Nu vă lăsaţi
intimidaţi de terminologie: aceasta este practic o teorie logică peste numerele naturale, în care avem

114
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

voie să scriem formule cu cuantificatori şi conectori logici, ca mai sus, dar avem şi dreptul să
cuantificăm peste mulţimi. Complexitatea deciziei unei formule logice într-o astfel de teorie este mai

mare decît pentru orice k natural!)

Clasa NP; algoritmi nedeterminişti; NP-completitudine

Algoritmii cu care suntem obişnuiţi să lucrăm zi de zi sunt determinişti. Asta înseamnă că la un


moment dat evoluţia algoritmului este unic determinată, şi ca instrucţiunea care urmează să se execute
este unic precizată în fiecare moment. Am văzut însă că limbajul pe care l-am folosit ne permite
scrierea unor algoritmi care au mai multe posibilităţi la un moment dat; construcţia if din limbajul cu
gărzi permite evaluarea oricărei instrucţiuni care are garda adevărată.

Acest tip de algoritmi este surprinzător de bogat în consecinţe cu valoare teoretică. Aceşti algoritmi nu
sunt direct aplicabili, însă studiul lor dă naştere unor concepte foarte importante.

Surprinzătoare este şi definiţia corectitudinii unui astfel de algoritm. Un algoritm nedeterminist este
corect dacă există o posibilitate de executare a sa care găseşte răspunsul corect. Pe măsură ce un
algoritm nedeterminist se execută, la anumiţi paşi se confruntă cu alegeri nedeterministe. Ei bine, dacă
la fiecare pas există o alegere, care făcută să ducă la găsirea soluţiei, atunci algoritmul este numit
corect.

Astfel, un algoritm nedeterminist care caută ieşirea dintr-un labirint ar arăta cam aşa:

do not iesire(pozitie_curenta) ->


if not perete(nord(pozitie_curenta)) ->
pozitie_curenta := nord(pozitie_curenta)
[] not perete(est(pozitie_curenta)) ->
pozitie_curenta := est(pozitie_curenta)
[] not perete(sud(pozitie_curenta)) ->
pozitie_curenta := sud(pozitie_curenta)
[] not perete(vest(pozitie_curenta)) ->
pozitie_curenta := vest(pozitie_curenta)
fi
od

Pe scurt algoritmul se comportă aşa: dacă la nord nu e perete mergi încolo, sau, poate, dacă la sud e
liber, mergi încolo, sau la est, sau la vest. În care dintre direcţii, nu se precizează (este ne-determinat).
Este clar că dacă există o ieşire la care se poate ajunge, există şi o suită de aplicări ale acestor reguli
care duce la ieşire.

Utilitatea practică a unui astfel de algoritm nu este imediat aparentă: în definitiv pare să nu spună nimic
util: soluţia este fie spre sud, fie spre nord, fie spre este, fie spre vest. Ei şi? Este clar că aceşti algoritmi
nu sunt direct implementabili pe un calculator real.

În realitate existenţa un astfel de algoritm deja înseamnă destul de mult. Înseamnă în primul rînd că
problema se poate rezolva algoritmic; vă reamintesc că există probleme care nu se pot rezolva deloc.

În al doilea rînd, se poate arăta că fiecare algoritm nedeterminist se poate transforma într-unul
determinist într-un mod automat. Deci de îndată ce ştim să rezolvăm o problemă într-un mod
nedeterminist, putem să o rezolvăm şi determinist! Transformarea este relativ simplă: încercăm să
mergem pe toate drumurile posibile în paralel, pe fiecare cîte un pas. (O astfel de tehnică aplicată în
cazul labirintului se transformă în ceea ce se cheamă ``flood fill'': evoluez radial de la poziţia de plecare
în toate direcţiile).

115
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Clasa tuturor problemelor care se pot rezolva cu algoritmi nedeterminişti într-un timp polinomial se
notează cu NP (Nedeterminist Polinomial). Este clar că orice problemă care se află în P se află şi în NP,
pentru că algoritmii determinişti sunt doar un caz extrem al celor determinişti: în fiecare moment au o
singură alegere posibilă.

Din păcate transformarea într-un algoritm determinist se face pierzînd din eficienţă. În general un
algoritm care operează în timp nedeterminist polinomial (NP) poate fi transformat cu uşurinţă într-un
algoritm care merge în timp exponenţial (EXP). Avem deci o incluziune de mulţimi între problemele

de decizie: P NP EXP.

Partea cea mai interesantă este următoarea: ştim cu certitudine că P EXP. Însă nu avem nici o idee
despre relaţia de egalitate între NP şi P sau între NP şi EXP. Nu există nici o demonstraţie care să
infirme că problemele din NP au algoritmi eficienţi, determinist polinomiali! Problema P=NP este cea
mai importantă problemă din teoria calculatoarelor, pentru că de soluţionarea ei se leagă o grămadă de
consecinţe importante.

Problema aceasta este extrem de importantă pentru întreaga matematică, pentru că însăşi demonstrarea
teoremelor este un proces care încearcă să verifice algoritmic o formulă logică (cum am văzut mai sus
de pildă); teoremele la care există demonstraţii ``scurte'' pot fi asimilate cu problemele din mulţimea
NP (la fiecare pas dintr-o demonstraţie putem aplica mai multe metode de inferenţă, în mod
nedeterminist; un algoritm trebuie să ghicească înşiruirea de metode aplicate pentru demonstrarea
enunţului); dacă orice problemă din NP este şi în P, atunci putem automatiza o mare parte din
demonstrarea de teoreme în mod eficient!

Problema P=NP este foarte importantă pentru criptografie: decriptarea este o problemă din NP (cel care
ştie cheia ştie un algoritm determinist polinomial de decriptare, dar cel care nu o ştie are în faţa o
problemă pe care nedeterminist o poate rezolva în timp polinomial). Dacă s-ar demonstra că P=NP
acest lucru ar avea consecinţe extrem de importante, iar CIA si KGB ar fi într-o situaţie destul de
proastă, pentru că toate schemele lor de criptare ar putea fi sparte în timp polinomial (asta nu înseamnă
neapărat foarte repede, dar oricum, mult mai repede decît timp exponenţial)!

Mai mult, în 1971 Cook a demonstrat că există o problemă specială în NP (adică pentru care se poate
da un algoritm eficient nedeterminist), numită problema satisfiabilităţii (notată cu SAT). Problema este
foarte simplă: dacă se dă o formulă booleană care cuprinde mai multe variabile, poate fi formula făcută

adevărată dînd anumite valori variabilelor? De pildă formula devine


adevărată pentru x1=adevărat şi x2 arbitrar. SAT este foarte importantă, pentru că Cook a demonstrat că
dacă SAT poate fi rezolvată în P (adică folosind un algoritm determinist polinomial), atunci orice
problemă din NP poate fi rezolvată în timp polinomial! Problema satisfiabilităţii este cumva ``cea mai
grea problemă'' din NP, pentru că rezolvarea oricărei alte probleme din NP se poate face ``mai repede''
decît a ei. Din cauza asta SAT se numeşte o problemă NP-completă.

De la Cook încoace s-au mai descoperit cîteva sute de probleme NP-complete. Unele probleme care se
ivesc foarte adesea în practică s-au dovedit NP-complete! Acesta este un alt motiv pentru care clasa atît
de abstractă NP a problemelor cu algoritmi nedeterminişti este atît de importantă: foarte multe
probleme practice au algoritmi polinomiali nedeterminişti, dar cei mai buni algoritmi determinişti iau
un timp exponenţial!

Iată cîteva exemple de probleme NP-complete:

 Problema comis-voiajorului (turneu Hamiltonian de cost minim): dîndu-se o reţea de oraşe, o reţea de
drumuri între oraşe şi o lungime k, există un traseu de cost mai mic decît k trecînd prin fiecare oraş o
singură dată şi revenind la punctul de plecare?

116
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Dîndu-se o mulţime de numere naturale, se poate împărţi în două mulţimi de numere de sume egale 2?
 ``Clica'': dîndu-se un graf G şi un număr k, are G un subgraf complet cu k vîrfuri (adică o mulţime de k
vîrfuri unite fiecare cu fiecare)?
 ``Acoperire'': dîndu-se un graf G şi un număr k, pot alege k vîrfuri în aşa fel încît toate muchiile din G au
un capăt ales?

O cantitate enormă de efort şi ingeniozitate a fost risipită pentru a încerca să se demonstreze că P=NP
sau opusul acestei afirmaţii, dar nici un rezultat concret nu a fost obţinut. Credinţa cvasi-unanimă este
că P=NP, dar numai matematica poate oferi vreo certitudine...

Din cauză că foarte multe probleme practice sunt în NP, şi ca aparent nu putem avea algoritmi
determinişti eficace pentru ele, cercetătorii şi-au îndreptat atenţia asupra unor clase noi de algoritmi,
care vor face obiectul secţiunilor următoare.

Algoritmi aproximativi

În secţiunile care urmează folosim tot timpul premiza nedemonstrată că PNP. Dacă P=NP, atunci
problemele pe care ne batem capul să le rezolvăm prin metode ciudate pot fi de fapt rezolvate exact şi
eficient.

Optim şi aproximare

Foarte multe probleme de optimizare se dovedesc a fi NP-complete 3: probleme în care vrem să


calculăm maximumul sau minimumul a ceva. Bine, dar dacă de fapt mă mulţumesc să obţin o valoare
care nu este chiar optimă, dar este ``suficient de aproape''? Poate în acest caz complexitatea problemei
poate fi redusă, şi sunt în stare să scriu un algoritm eficient... (polinomial). Avem deci de a face cu un
compromis:

solutie optima; solutie sub-optima:


<-------------->
algoritm NP sau algoritm polinomial
algoritm exponential

Într-adevăr, această metodă se bucură de un oarecare succes, dar nu de unul general. Algoritmii care
rezolvă o problemă de optimizare în speranţa unui rezultat sub-optimal se numesc ``algoritmi
aproximativi''.

Există o sumedenie de rezultate în ceea ce priveşte problemele de optimizare şi aproximările lor. Se


demonstrează că unele probleme pot fi foarte bine aproximate (putem obţine soluţii cît dorim de
aproape de optim în timp polinomial), altele pot fi aproximate numai în anumite limite (de exemplu
putem obţine soluţii de 2 ori mai slabe, dar deloc mai bune), sau altele nu pot fi aproximate deloc (în
ipoteza că P<>NP).

Teoria algoritmilor aproximativi este relativ recentă (deşi ideea există de multă vreme), iar unele
rezultate sunt extrem de complicate. Ne vom mulţumi să dăm nişte exemple pentru a ilustra algoritmi
aproximativi în acţiune, şi tipul de rezultate care se pot obţine.

Vom ilustra două rezultate diferite din teoria algoritmilor aproximativi: algoritmi de aproximare
relativă, algoritmi de aproximare absolută a soluţiei (lămurim terminologia imediat).

Să notăm o instanţă a unei probleme cu I. Fie OPT(I) valoarea soluţiei optime pentru acea instanţă
(care există, dar pe care nu ştim s-o calculăm eficient), şi fie A(I) valoarea calculată de algoritmul
nostru aproximativ. Numim aproximaţia absolută dacă există un număr K, independent de instanţa I,
care are proprietatea că |OPT(I) - A(I)| < K. Numim aproximaţia relativă dacă există un R (numit
``performanţă'') astfel ca pentru orice instanţă I avem (A(I) / OPT(I)) < R (dacă problema caută un
maximum, atunci fracţia din definiţie trebuie inversată).

117
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Problema rucsacului

Iată o variantă a problemei rucsacului care este NP-completă , dar pentru care se poate obţine cu foarte
mare uşurinţă un algoritm aproximativ relativ eficient.

Se dau o mulţime (mare) de rucsaci de capacitate egală (cunoscută, un număr natural). Se mai dă o
mulţime finită de obiecte, fiecare de un volum cunoscut (număr natural). Întrebarea este: care este
numărul minim de rucsaci necesari pentru a împacheta toate obiectele?

Problema rucsacului are un algoritm de aproximare relativă cu performanţă 2.

Algoritmul este banal: metoda ``greedy'': pune de la stînga fiecare greutate în primul rucsac liber:

Date de intrare: nrobiecte, capacitate, marime[1..nrobiecte]

Initializari:
o, folositi := 1, 0
do o <= nrobiecte -> liber[o] := capacitate od

Algoritm:
o := 1
do o <= nrobiecte ->
r := 1
do (liber[r] < marime[o]) -> r := r+1
od
folositi, liber[r], o :=
max(r, folositi), liber[r] - marime[o], o+1
od

Cum demonstrăm că performanţa relativă este 2? Foarte simplu: să observăm că la sfîrşitul


algoritmului nu pot exista doi rucsaci folosiţi pe mai puţin de jumătate amîndoi, pentru că atunci
conţinutul celui de-al doilea ar fi fost vărsat în primul. Cu alte cuvinte, la terminare avem: liber[r] < 1/2
capacitate. Dar dacă însumăm pentru toţi rucsacii, vom avea că spaţiul liber este mai puţin de jumătate
din cel disponibil, deci cel ocupat este mai mult de jumătate. Dar dacă obiectele au mărime totală M,
atunci orice-am face nu putem folosi mai puţin de M spaţiu total pentru a le împacheta. Dar noi am
folosit mai puţin de M + M = 2M, deci algoritmul are performanţă 2. QED.

Performanţa absolută; un rezultat negativ

Vom folosi o altă problemă NP-completă, pentru care avem imediat un algoritm de aproximare relativă
de performanţă 2, dar pentru care vom demonstra că nu există nici un algoritm de aproximare absolută.

Problema este cea a acoperirii unui graf, enunţată mai sus. Ca problemă de optimizare, ea se enunţă
astfel: ``care este numărul minim de vîrfuri care trebuie ``acoperite'' astfel ca toate muchiile dintr-un
graf să fie atinse?''

Pentru această problemă algoritmul greedy nu face multe parale ca algoritm de aproximare. Există însă
un algoritm relativ simplu, cu performanţă 2, care se foloseşte însă de un alt algoritm clasic, cel al
``cuplării'' (matching). Fără a intra în detalii, există un algoritm polinomial relativ sofisticat pentru a
calcula cuplări maximale pe grafuri4. Calculăm o cuplare maximală, după care luăm capetele tuturor
muchiilor care o formează: astfel obţinem o acoperire (uşor de demonstrat) care e cel mult dublă ca
mărime faţă de optim (pentru că în optim trebuie să se găsească cel puţin cîte un vîrf pentru fiecare
muchie din cuplare, iar noi am luat cîte două).

118
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Iată şi un rezultat negativ interesant: pentru orice K fixat, nu există nici un algoritm care să dea pentru
problema acoperirii o soluţie aproximativă absolută la distanţa K de cea optimă pentru orice instanţă.
Demonstraţia este foarte simplă, odată ce ai văzut ideea, şi se bazează pe ``tehnica amplificării''. Iată
cum se face, prin reducere la absurd:

Să presupunem că avem un algoritm A care calculează pentru orice graf o acoperire care este cu cel
mult K noduri mai mare ca cea optimă (K e fixat). Cu alte cuvinte |OPT(G) - A(G)| < K. Să luăm o
instanţă arbitrară a problemei cuplării, G. Formăm un nou graf G 1 din G, care nu este conex, şi care
constă din K+1 copii ale lui G, alăturate. Aceasta este o instanţă perfect corectă a problemei acoperirii,
aşa că rulăm pe ea algoritmul nostru A. Acesta va oferi o acoperire care are cel mult cu K noduri mai
mult decît acoperirea optimă. (Vă reamintesc notaţiile: OPT(G) este valoarea optimă: numărul minim
de noduri pentru a acoperi muchiile, iar A(G) este valoarea calculată de algoritmul nostru.

Datorită faptului că cele K+1 copii ale lui G sunt neconectate, optimumul pentru G 1 este reuniunea a
K+1 optimumuri pentru G. Din cauza asta avem relaţia OPT(G 1) = (K+1) OPT(G). Fie acum H copia
lui G pe care A a marcat cele mai multe vîrfuri; atunci A(G 1) <= (K+1) A(H). Dar din proprietăţile lui
A avem: |OPT(G1) - A(G1)| < K, sau |(K+1) OPT(H) - (K+1) A(H)| < K, ori |OPT(H) - A(H)| <
K/(K+1) < 1. Însă ştim că OPT(H) şi A(H) sunt numere naturale, deci am obţinut OPT(H) = A(H)!

Asta înseamnă că dacă avem un algoritm aproximativ absolut pentru problema acoperirii, putem
imediat construi un algoritm exact la fel de rapid. Ori asta ar însemna că P=NP, ceea ce am presupus
fals.

Exemplele pe care le-am ales sunt în mod deliberat simple; teoria algoritmilor aproximativi este în
plină dezvoltare şi are rezultate foarte spectaculoase şi în general complicate. În orice caz,
aplicabilitatea ei este imediată, pentru că multe probleme practice care nu pot aştepta au numai
rezolvări aproximative.

Algoritmi Monte Carlo

O tehnică foarte spectaculoasă pentru rezolvarea problemelor este cea a folosiri numerelor
aleatoare. Practic algoritmii aleatori sunt identici cu cei obişnuiţi, dar folosesc în plus o nouă
instrucţiune, care s-ar putea chema ``dă cu banul''. Această instrucţiune generează un bit arbitrar ca
valoare.

În mod paradoxal, incertitudinea ne poate oferi mai multă putere...

La ce se foloseşte aleatorismul? Să ne amintim că în general complexitatea unei probleme este


definită luînd în considerare cea mai defavorabilă instanţă. De exemplu, pentru problema comis
voiajorului, faptul că această problemă este NP-completă nu înseamnă că nu putem rezolva nici o
instanţă a ei, ci că există instanţe pentru care algoritmii cunoscuţi nu au prea multe şanse să termine în
curînd.

Acest lucru este adevărat şi pentru alte clase de algoritmi; de pildă algoritmul quicksort are
pentru majoritatea vectorilor de intrare o comportare O(n log n). Dacă însă datele de intrare sunt prost
distribuite, atunci quicksort poate face n2 comparaţii. Pentru n=100 asta înseamnă de 10 ori mai mult!
Numărul de instanţe pentru care quicksort este slab este mult mai mic decît numărul de instanţe pentru
care merge bine. Ce te faci însă dacă într-un anumit context lui quicksort i se dau numai date rele?
(Datele preluate din măsurători reale sunt foarte rar complet uniform distribuite). O soluţie paradoxală
constă în a amesteca aleator vectorul înainte de a-l sorta.

Complexitatea medie (average case) a lui quicksort este O(n log n). Complexitatea în cazul cel
mai rău (worst case) este O(n 2). Dacă datele vin distribuite cu probabilitate mare în zona ``rea'', atunci
amestecîndu-le putem transforma instanţe care pică în zona ``worst-case'' în instanţe de tip ``average-
case''. Fireşte, asta nu înseamnă ca nu putem avea ghinion, şi ca amestecarea să producă tot o instanţă
``rea'', dar probabilitatea ca acest lucru să se întîmple este foarte mică, pentru că quicksort are puţine
instanţe rele5.

119
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Acesta este un caz de folosire a aleatorului pentru a îmbunătăţi performanţa medie a unui algoritm.

Cîteodată cîştigul este şi mai mare, pentru că putem rezolva probleme NP-complete foarte rapid
folosind aleatorismul. De obicei avem însă un preţ de plătit. Cînd folosim algoritmi din clasa prezentată
mai jos, putem risca să nu primim răspunsul corect.

Algoritmi Las Vegas

Evoluţia unui algoritm care foloseşte numere aleatoare nu mai depinde numai de datele de intrare, ci şi
de numerele aleatoare pe care le generează. Dacă are ``noroc'' algoritmul poate termina repede şi bine;
dacă dă prost cu zarul, ar putea eventual chiar trage o concluzie greşită. (În cazul quicksort de mai sus
răspunsul este întotdeauna corect, dar cîteodată vine mai greu. Aceasta este diferenţa dintre algoritmii
Monte Carlo, mereu corecţi, şi cei Las Vegas, care pot uneori, rar, greşi.)

Vom defini acum algoritmii probabilişti pentru probleme de decizie (ţineţi minte, la care răspunsul este
Da sau Nu). Majoritatea problemelor pot fi exprimate în forma unor probleme de decizie, deci
simplificarea nu este prea drastică.

Există două clase de algoritmi probabilişti, dar ne vom concentra atenţia numai asupra uneia dintre ele,
pentru care vom da şi două exemple simple şi spectaculoase. Vom defini totodată clasa problemelor
care pot fi rezolvate probabilist în timp polinomial, numită RP (Random Polinomial).

Observaţi că dacă indicăm de la început care sunt numerele aleatoare care vor fi generate, evoluţia
algoritmului este perfect precizată.

Definiţie: O problemă de decizie este în RP dacă există un algoritm aleator A care rulează într-un timp
polinomial în lungimea instanţei (nc pentru un c oarecare), şi care are următoarele proprietăţi:

 Dacă răspunsul la o instanţă I este ``Da'', atunci cu o probabilitate mai mare de 1/2 algoritmul va
răspunde ``Da''.
 Dacă răspunsul la o instanţă I este ``Nu'', atunci cu probabilitate 1 algoritmul va răspunde ``Nu''.

De cine este dată ``probabilitatea'' de mai sus? De numărul de şiruri aleatoare. Cînd rulăm un
algoritm aleator pentru o instanţă I avem la dispoziţie 2 nc şiruri aleatoare de biţi; pentru unele dintre ele
algoritmul răspunde ``Da'', pentru celelalte răspunde ``Nu''. Ceea ce facem este să numărăm pentru cîte
şiruri algoritmul ar răspunde ``da'' şi să facem raportul cu 2nc. Aceasta este probabilitatea ca algoritmul
să răspundă ``da''. Opusul ei este probabilitatea să răspundă ``nu''.

O tehnică foarte simplă de amplificare poate creşte nedefinit această probabilitate: dacă
executăm algoritmul de 2 ori pe aceleaşi date de intrare, probabilitatea de a greşi pentru răspunsuri
``nu'' rămîne 0. Pe de altă parte, ajunge ca algoritmul să răspundă măcar odată ``da'' pentru a şti că
răspunsul este ``da'' cu siguranţă! Din cauza asta, dacă probabilitatea de eroare este p pentru algoritm,
executînd de k ori probabilitatea coboară la p k (nu uitaţi ca p este subunitar, ba chiar sub 1/2). Această
metodă se numeşte ``boost'' în engleză, şi face dintr-un algoritm probabilist slab ca discriminare o sculă
extrem de puternică!

Pentru a scădea probabilitatea de eroare a unui algoritm care poate greşi cu probabilitatea p
pînă sub o limită dorită siguranta, se procedează astfel:

raspuns, probabilitate = nu, 1


do (raspuns = nu) and (probabilitate > siguranta) ->
raspuns, probabilitate := executa(algoritm), probabilitate * p
od

Iată un exemplu şi o aplicaţie al algoritmilor aproximativi.

120
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Rădăcinile unui polinom

Fie un polinom de mai multe variabile, x1, x2, ... xn. Acest polinom poate fi descris printr-o
formulă aritmetică, de pildă: (x1 + 1) (x2 + 1) ... (xn + 1). Întrebarea este: este acest polinom identic nul
sau nu?

Desigur, o posibilitate este de a ``expanda'' acest polinom în formă canonică (sumă de


produse), şi de a compara fiecare coeficient cu 0. Dar în general această operaţie poate lua un timp
exponenţial! (De exemplu polinomul anterior generează 2n termeni!).

Soluţia este să ne bazăm pe două proprietăţi elementare ale polinoamelor:

 Un polinom identic nul este 0 pentru orice combinaţie de valori a variabilelor;


 Un polinom ne-nul are ``puţine'' rădăcini într-un corp6.

De aici rezultă că:

 Dacă polinomul este nul, atunci evaluarea lui în orice punct va da 0;


 Dacă polinomul este ne-nul, atunci probabilitatea de a obţine valoarea 0 într-un punct (v 1, v2, ... vn) ales
arbitrar din Sn este < d/|S|.

Pentru polinomul de mai sus gradul este n, şi putem alege pentru K de exemplu Z p, unde p este
un număr prim relativ mare în raport cu n (de două ori mai mare ajunge!).

Alegînd arbitrar numerele v1, v2, ..., vn în Zp şi evaluînd q(v1, v2, ..., vn) mod p, putem imediat
afirma cu probabilitate mare > 1 - n/p despre q dacă este nul sau nu! Observaţi că evaluarea
polinomului nu este prea costisitoare, putîndu-se face în timp polinomial în lungimea expresiei care
descrie polinomul.

Folosind metoda de ``boost'' putem creşte rapid siguranţa noastră despre rezultatul algoritmului.

Izomorfismul arborilor

Iată şi o aplicaţie imediată a acestei proprietăţi.

Se dau doi arbori, cu rădăcina precizată. Sunt aceşti doi arbori ``izomorfi'' (identici prin re-ordonarea
fiilor)? Această problemă este surprinzător de dificilă pentru un algoritm determinist (am impresia
chiar că este NP-completă). Iată însă o soluţie aproape imediată: construim pentru fiecare arbore cîte un
polinom care nu depinde de ordinea fiilor unui nod, în aşa fel încît dacă şi numai dacă arborii sunt
izomorfi polinoamele sunt egale. Apoi pur şi simplu testăm ca mai sus dacă polinomul diferenţă este
nul.

O metodă de a asocia recursiv un polinom unui arbore este de pildă următoarea: fiecărui nod îi
asociem o variabilă xk, unde k este înălţimea nodului (distanţa pînă la cea mai depărtată frunză).
Frunzele vor avea toate asociate variabila x 0. Apoi asociem nodului v de înălţime k cu fii v 1, ... vl
polinomul fv = (xk - fv1) (xk - fv2) ... (xk - fvl). Se arată uşor că polinoamele sunt egale pentru arbori
izomorfi, bazîndu-ne pe unicitatea descompunerii în factori a unui polinom. Gradul polinomului asociat
unui nod este egal cu suma gradelor fiilor, care la rîndul ei este egală cu numărul de frunze care se află
sub acel nod (cum se demonstrează imediat prin inducţie după înălţime). Şi asta-i tot!

Pentru a încheia secţiunea, să observăm că singurul algoritm eficient cunoscut pentru a


verifica primalitatea unui număr este tot probabilist7! Pentru că numerele prime mari stau la baza
criptografiei cu cheie publică în sistemul RSA (probabil cel mai răspîndit la ora actuală), iată că unele
dintre cele mai importante aplicaţii se bazează indirect pe algoritmi probabilişti. Nimeni nu va putea
obiecta asupra utilităţii lor!

121
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Algoritmi on-line

Adesea trebuie luate decizii cu informaţii incomplete. Un caz particular este luarea de decizii
pe măsură ce datele devin disponibile. Deciziile afectează viitorul, dar sunt luate fără a avea cunoştinţe
despre datele viitoare. Sa vedem în acţiune un exemplu foarte simplu:

Problema schiorului

Se pune problema: ce este mai bine: să închiriezi sau să cumperi schiuri? (Vom presupune că preţul
schiurilor este constant de-a lungul timpului, ca să simplificăm problema). Dilema constă din faptul că
în fiecare sezon, nu ştii dacă te vei mai duce odată. Dacă le cumperi şi nu te mai duci, ai dat banii
degeaba. Dacă le tot închiriezi şi te duci des, s-ar putea să le plăteşti de mai multe ori. Totuşi, trebuie să
iei o decizie. Pe care?

Există un răspuns foarte simplu, care promite nu că dă rezultatul cel mai ieftin în orice circumstanţă, ci
doar că nu vei cheltui de două ori mai mult decît în cazul în care ai face decizia perfectă (decizia
perfectă este cea care ştie precis dacă te vei mai duce, şi de cîte ori; ea nu este accesibilă decît ``post-
factum'', deci este pur teoretică).

Algoritmul este: închiriezi schiuri pînă ai dat pe chirie costul schiurilor. După aceea dacă mai vrei să
mergi le cumperi. Voi demonstra rapid că în felul ăsta orice s-ar întîmpla nu pierzi mai mult de jumate
din banii pe care i-ai fi cheltuit în cazul ideal.

Avem 3 posibilităţi:

1. Te opreşti înainte de a le cumpăra: în cazul ăsta ai jucat perfect, pentru că ai schiat şi nu puteai ieşi mai
ieftin nicicum;
2. Te opreşti imediat după ce le-ai cumpărat. În cazul ăsta ai dat de două ori preţul (odată pe închirieri, şi
odată pe cumpărare), dar ai schiat cît ai fi putut schia dînd numai odată preţul (mai ieftin de odată nu
puteai ieşi);
3. Te opreşti mai tîrziu: în cazul ăsta cel mai ieftin era tot să le cumperi din prima zi, deci iar ai cheltuit
dublu.

Orice altă schemă foloseşti pentru a decide cumpărarea, există un scenariu în care poţi cheltui mai mult
de dublu faţă de optim.

Algoritmii on-line apar foarte natural într-o mulţime de situaţii: de exemplu în reţele de calculatoare,
algoritmii care decid traseul unui pachet cu informaţii sunt algoritmi on-line; dacă decid trasee proaste,
reţeaua poate deveni supra-aglomerată în viitor; astfel de algoritmi nu au idee despre cererile viitoare,
aşa că acţionează cu informaţie incompletă.

Un alt exemplu este în sistemele de operare: algoritmii după care cache-urile (sau sistemele de
memorie virtuală) aleg paginile care trebuie înlocuite. Alegerea aceasta nu poate fi optimă în absenţa
informaţiilor despre viitoarele cereri. Cu toate acestea, anumite alegeri sunt mai bune decît altele.

Un al treilea exemplu, tot din contextul sistemelor de operare, este al algoritmilor de planificare, care
trebuie să stabilească în ce moment se execută fiecare proces pe un calculator (paralel). Acolo unde
minutul de rulare costă o grămadă de bani, deciziile trebuie să risipească cît mai puţin timp. Însă job-uri
pentru prelucrare sosesc dinamic, aşa că algoritmii trebuie să facă faţă unui mediu în continuă
schimbare.

Algoritmii on-line sunt în general analizaţi comparîndu-i cu algoritmii off-line, care ar avea înainte de a
face deciziile informaţii perfecte despre toate cererile viitoare. Este clar că informaţia aceasta este un
mare avantaj, aşa că în general algoritmii on-line au performanţe mult mai proaste decît cei
corespunzători off-line.

122
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Cercetările în acest domeniu sunt doar la început; se explorează şi variante de algoritmi hibrizi on/off-line, în care
algoritmul are o idee despre viitor, dar nu neapărat o vedere completă.

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:
 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

123
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

124
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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);

125
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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.

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.

126
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

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, . . .

127
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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. În ce
constă o descriere cu ajutorul diagramelor de sintaxă? Să presupunem că dorim să

128
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă.

129
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

4.2 Elemente de bază ale limbajului Pascal


4.2.1 Vocabularul limbajului

130
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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).

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

131
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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,FUNCT
ION,GOTO,IF,IN,LABEL,MOD,NILL,NOT,PROCEDURE,PROGRAM,RECORD,REPE
AT,SET,OF,OR,ORIGIN,OTHERWISE,PACKED,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?

132
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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 ‘$’.

133
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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*10 23 ş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 #.
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;

134
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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


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.

135
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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).
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ă

136
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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).
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]

137
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
î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.

138
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Î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ă:
SUCC(valoare)

139
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:

140
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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.
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;

141
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.


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.

142
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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

143
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă);
 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;

144
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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’.

 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.

145
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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)
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:

146
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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;
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

147
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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.

148
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
Pentru citire vom folosi operatia read.
Prin operatia de iesire se intelege preluarea unei date din memoria interna –adica dintr-o variabila-
catre un dispozitiv de iesire. Dispozitivele de scriere pot fi monitorul ,o unitate disc,imprimanta,etc.
Pentru scriere vom folosi operatia write.
Sa analizam algoritmul de mai jos –scris in pseudocod- care citeste in numar intreg si-l tipareste:
Integer a;
Read a;
Write a;
Mai intai am declarat variabila a,de tip intreg –adica are posibilitatea de a retine numere
intregi .Urmeaza sa se efectueze operatia de citire a variabilei a. Aceasta inseamna ca se asteapta
introducerea la tastatura a datei intregi. In cazul in care introducem numarul 0 ,variabila a va retine 10,
daca introducem numarul 176, variabila va retine 176.Sa presupunem ac am citit 176.
Observatii:
 La scriere, pe monitor va aparea numarul 176 – continutul variabilei a.
 Dupa scriere ,continutul variabilei ramane nemodificat. Fie Secventa de mai jos si introducem de
la tastatura 17. Pe monitor va aparea de doua ori numarul 17.
Integer a;
Read a;
Write a;
Write a;
 La o noua citire ,continutul vechi al variabilei se pierde. Fie secventa de mai jos . presupinem
ca introducem de la tastatura 10,12(in aceasta ordine). Atunci variabila a va retine 12, deci pe monitor apare 12.
Integer a;
Read a;
Read a;
Write a;
 Se pot citi mai multe variabile cu o singura operatie read si se pot tipari valorile retinute de mai
multe variabile cu o singura operatie write.
Exemplu: real a,s,d;
Read a,s,d;
Write a,s,d;
Daca introducem 1.2,-1.3, 12.8, atunci a retine 1.2; b retine –1.3; c retine 12.8. Pe monitor se
tipareste 1.2 -1.3 12.8.

Ajutati de profesor, editati un prim program in mediul Turbo/Borland Pascal, care se porneste
prin comanda turbo sau bp. In construirea unui program, tineti cont de cerintele prezentate in Anexa 2.
Fisierul executabil este, cel mai adesea:C:\BP\BIN\turbo.exe sau C:\BP\BIN\bp.exe. lansarea in
executie a programului editat si corectat se face prin actionarea simultana a tastelor Ctrl si F9. De fapt,
capitolul 7 din manual prezinta modul de lucru cu mediul limbajului.

149
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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:

150
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
 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

151
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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;

152
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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:
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;

153
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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);
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.

154
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
 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

155
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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
 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

156
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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;
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;
:

157
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

:
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

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

158
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
 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;

159
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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;

160
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
 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.

161
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

162
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
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.

163
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 nat.Exemplu:pt. n=3,S=1+2+3=10.
Program f15;
Var I,n,s:integer;
Begin
Write(‘n=’);readln(n);
S:=0
For I:=1 to n do s:=s+I;
Writeln(‘suma primelor ‘,n,’numere naturale este ;,s)
End.

Exemplul2.Sa se calculeze suma:S=0,1+0,2+……+0,9.

Program f 16;
Var I:integer;
S:real;
Begin
S:=0;
For I:=1 to 9 do
S:=s+i/10;
Writeln(‘s=’,s:5:2)
End.

Exemolul 3.Se citeste n numar natural.Se cere sa se calculeze suma:


S=1+1*2+1*2*3+……….+1*2*..*n

Program f17;
Var I,s,p,n:integer;
Begin
Write(‘n=’);readln (n);
S:=0;p:=1;
For I:=1 to n do
Begin
P:=p*I;
S:=s+p
End;
Writeln(‘s=’,s)
End.

164
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exemplul 4.Se citesc n numere intregi.Se cere sa se afiseze cel mai mare numar citit.De exemplu, pentru n=4 si
numerele –7,9,2,3 se va afisa 9.
Program f 19;
Var I, max,n,nr:integer;
Begin
Write(‘n=’);readln (n);
Write(‘nr=’); readln (max);
For I:=2 to n do
Begin
Write (‘nr=’);readln(nr);
If nr>max then
Max:=nr;
End;
Writeln(‘maximul este:’, max);
End.

Exemplul 5.Sa se afiseze toate numerele naturale mai mici sau egale cu 10000 care se pot descompune in doua
moduri diferite ca suma de cuburi.

Program p11;
Var n, max, nr, I,j,i1,i2,j2,j1:integer;
Begin
For n:=1 to 10000 do
Begin
Max:= trunc (exp(1/3*1n(n));
Nr:=0
For I:=1 to max do
For j:=I to max do
Forj:=I to max do
If i*I +I*j*j*j=n then
Begin
If nr=0 then
Begin
I1:=I;j:=j
End
Else
Begin
12:=I;j2:=j
end;
nr:=nr+1;
end;
if nr=2 then writeln (‘n,’’,i1,’ ‘,j1,’ ‘,i2,’ ‘,j2)
end
end.

Prezentam instructiunea FOR cu ajutorul diagramelor de sintaxa.

165
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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) =

166
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

= 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)
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,

167
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 )
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 )

OPERATII IN VECTORI
a) initializarea(vector ngol fara componente)

b)punerea unei componente pe pozitia zero in vector

168
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

EXEMPLU:
{Se citesc n numere naturale intr-un vector.sa var i,n:byte;
se calculeze media 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 for i:=1 to n do
ELEMENTE.SA SE ORDONEZE write(a[i],'');
CRESCATOR PRIN METODA BULELOR. } readkey;
program PR10; end.
uses crt;

169
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
. . . . .
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

170
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

171
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for j:=1 to n do writeln(' maximul elementelor de sub


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

172
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln(' adaug o coloana care are ca elemente end;


produsul elementelor pe linie '); 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;
z[i,j]:=a[i,j]; end;
for i:=1 to m do writeln(' sortati descrescator in matricea b pe
begin diagonala principala k=');
s:=1; readln(k);
for k:=1 to n do repeat
s:=s*a[i,k]; p:=1;
z[i,n+1]:=s; for i:=1 to m-1 do
end; if y[i,k]<y[i+1,k] then
for i:=1 to m do begin begin
for j:=1 to n+1 do p:=0;
write(z[i,j],' ');writeln; pp:=y[i,k];
end; y[i,k]:=y[i+1,k];
writeln(' dati pozitia in care inserati o coloana y[i+1,k]:=pp;
');readln(p); end;
writeln(' inserez pe coloana ',p,' elemente'); until p=1;
for j:=n+1 downto p+1 do for i:=1 to m do begin
begin for j:=1 to n do
for i:=1 to m do write(y[i,j],' ');writeln;
z[i,j]:=z[i,j-1]; end;
end;
for I:=1 to n do readln;
begin end.
write('elementul[',i, ',',j,']=');readln(z[i,p]);

Matricea se poate descompune şi pe coloane şicoloanele în elemente. În ambele cazuri se obţin


structuri arborescente, elementele de la baza arborescenţelor reprezentând dispunerea contiguă a
liniilor una în continuarea celeilalte, respectiv a coloanelor una în continuarea celeilalte, regăsind
ambele situaţii ca modalităţi de liniarizare a matricelor.
-

liniarizarea linie cu linie


adr ( a[i,j] ) = adr (a[1,1] + ((i-1)*n +j) *lg (a,T i)

liniarizarea coloană cu coloană


adr ( a[i,j] ) = adr (a[1,1] + ((j-1)*m +i) *lg (a,Ti)

Fiecare linie sau coloană, prin descompunerea la nivelul următor ,poate fi privită ca vector de
elemente. Deci în final o matrice poate fi privită ca vectori de vectori .

Din calcule de adrese rezultă că numărul de elemente al matricei este :

adr (a[m,n]) - adr(a[1,1])


------------------------------------ + 1 = m*n
lg (a,Ti)

Cunoaşterea modului de adresare şi a modului de transmitere a parametrilor, permite


interpretarea cu rigurozitate a oricărui rezultat.
Memorarea unei matrice numai ca formă liniarizată , neînsoţită de informaţia dedusă din
structura arborescentă, implică efectuarea calculului de adresă ori de câte ori este accesat un element
al matricei.
În cazul în care nodului rădăcină a, i se rezervă o zonă de memorie, iar nodurilor a[1] ,a[2],……
a[m] li se asociază, de asemenea ,zone ce se iniţializează adecvat, regăsirea elementelor se va efectua
folosind calcule de deplasări.
De la relaţia :
adr ( a[i,j] ) = adr (a[1,1] + ((i-1)*n +j) *lg (a,T i)

173
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

se va ajunge la:
adr ( a[i,j] ) = adr (a[i]) +depl(a[i,j] , a [i,1])
În cazul în care matricea este densă sau încărcată sau are puţine elemente nule sau este full, dar are
elemente ce conţin valori particulare, se va efectua o tratare diferenţiată.

MATRICE SIMETRICE

au proprietatea : cont (a[i,j]) = cont (a[j,i])


ceea ce conduce la ideea memorării numai a elementelor de pe diagonala principală şi de sub aceasta
sau de deasupra ei.
Pentru o matrice simetrică, a[ 1..n, 1.. n] cu n*n elemente, se impune memorarea a n*(n+1)/2
dintre acestea.
Matrice cu linii sau coloane identice, sau cu elemente identice, permit o astfel de memorare
care conduce la economisirea spaţiului de memorie.
Astfel, pentru matricea:

se impun definirile :
- nume matrice
- număr de linii
- număr de coloane
- valoarea elementului repetat

MATRICE DIAGONALE

- sunt matricele în care elementele componente apar sub forma

- în acest caz ,forma de memorare adecvată, în condiţiile în care în urma prelucrării matricei A ,
aceasta nu-şi schimbă structura, este vectorul

MATRICE TRIDIAGONALE

T=

174
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Elementele nenule se memoreayă într+un amsiv unidimensional, iar accesarea lor se


efectuează după formula:

adr (t[i,j]) = adr (t[1,1]) +[2*(i-1)+j-1] *lg (integer)


unde:
i= 1…n şi j=1,2 pentru i=1
j=i-1,i,i+1 pentru 1<i<n
j=n-1,n pentru i=n

MATRICE TRIUNGHIULARĂ

- are elementele nenule fie deasupra ,fie sub diagonala principală, iar stocarea în memorie este
asemănătoare matricei simetrice.
Pentru matricea triunghiulară A cu elementele nenule sub diagonala principală, adresa
elementului A[i,j], este:

adr (a[i,j]) = adr (a[1,1]) +[i*(i-1)/2+(j-1)] *lg (integer)


Construirea masivului unidimensional se realizează în secvenţa( dacă elementele nenule sunt deasupra
diagonalei principale):

K:=0;
For i:=1 to n do
For j:=1 to n do
Begin
Inc(k);
V[k]:=a[i,j];
End;

sau în secvenţa(daca elentele nenule sunt sub diagonala principala):

k:= n*(n+1)/2;
for i:=n downto 1 do
for j:=i downto 1 do
begin
v[k]:=a[i,j];
dec(k);
end;
În toate cazurile ,se urmăreşte atât reducerea lungimii zonei de memorie ocupată, cât şi
creşterea vitezei e acces la componente.Pentru aceasta, ami întâi matricele sunt memorate în extenso,
ca mai apoi după analiza componentelor să se deducă dacă matricele sunt simetrice sau dacă au linii
sau coloane constante, cazuri în care se fac alocări adecvate.
Operaţiile cu matrice se efectuează cu algoritmi care iau în considerare forma efectivă în care
s-a făcut memorarea, existând posibilitatea trecerii rezultatului la un alt tip de stocare în memorie.
De exemplu ,dacă A este o matrice triunghiulară cu elementele nenule sub diagonala
principală şi B este o matrice triunghiulară cu aceeaşi dimensiune ca matricea A dar cu elementele
nenule deasupra diagonalei principale,în cazul adunării celor două matrice ,rezultă o amtrice cu toate
elementele nenule,ce va fi stocată după regulile acestui tip.

175
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

MATRICE RARĂ

Gradul de umplere
- pentru a deduce dacă o matrice este sau nu rară, se defineşte gradul de
umplere al unei matrice:

k
G = ------------- * 100
m*n
unde:
- k numărul elementelor nenule
- m numărul de lini al matricei
- n numărul de coloane al matricei
În cazul în care k>0.3* m*n, se consideră că matricea este rară

Problema matricelor rare comportă două abordări:

1,abordare statică, în care alocarea memoriei se efectuează în faza de compilare,


ceea ce presupune ca programatorul să cunoască cu o precizie bună numărul maxim de al
elementelor nenule

2,abordare dinamică ,în care alocarea se efectuează în timpul execuţiei, caz în care
nu este necesară informaţia asupra numărului de elemente nenule;aceasta abordare va fi
dezvoltată în partea destinată listelor

Memorarea elementelor matricei rare, presupune memorarea indicelui liniei, a indicelui coloanei şi
respectiv, valoarea nenulă a elemntului.
Se consideră matricea:

A=

Gradul de umplere al matricei A cu m=4, n=5 şi k =5 G=5 / 5*4 = 0.25


Se definesc trei vectori astfel:
- lin[] poziţia liniei ce conţine elemente nenule
-col[] poziţia coloanei ce conţine elemente nenule
-val[] valoarea nenulă a elementelor

Vectorii se vor iniţializa astfel :


lin[] = (1,2,3,4,4,)
col[] = (3,1,4,1,3)
val[] = (6,7,9,8,2)
Pentru efectuarea calculelor cu matrice rare definite în acest fel, un rol important îl au vectorii
definiţi mai sus, iar pentru matricele rare rezultat, vor trebui definiţi vectori cu număr de componente
care să asigure şi stocarea noilor elemente ce apar
Dacă matricele rezultat nu mai îndeplinesc cerinţa de matrice rară, se vor efectua calcule cu
matrice rezultat complet definite şi numai după efectarea calculelor se analizează gradul de umplere şi
dacă acesta este redus, se va trece la reprezentarae matricei complete ca matrice rară.
Funcţia rar( ) va conţine secvenţa:
K:=0;
For i:=1 to m do
For j:=1 to n do
If a[i,j]<>0 then
Begin
Inc(k);
Lin[k]:=i;
Col[k]:=j;

176
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Val[k]:=a[i,j];
End;

Functia full() va contine secventa :


For i:=1 to k do
A[lin[i],col[i]]:=val[i];

Funcţia full () şi rar () sunt una inversa celeilalte.


În cazul în care gradul de umplere nu este suficient de mic încât matricea să fie considerată
rară, pentru memorare se utilizează o structură arborescentă care conţine pe nivelul al doilea poziţiile
elementelor nenule, iar pe nivelul al doilea poziţiile elementelor nenule, iar pe nivelul al treilea valorile.
Liniarizarea masivelor bidimensionale conduce la ideea suprapunerii acestora peste
vectori.Deci,punând în corespondenţă elementele unei matrice cu elementele unui vector se pune
problema transformării algoritmilor, în aşa fel încăt operând cu elementele vectorilor să se obţină
rezultate corecte pentru calcule matriceale.

Exemplu:
Se consideră o matrice A şi un vector B ale cărui elemente corespund cu elementele matricei
A (forma liniarizata a unei matrice) . Se cere să se interschimbe două coloane oarecare k şi j ale
matricei .

- secvenţa de înlocuire a coloanelor :

for i:=1 to m do
begin
c:=a[i,j];
a[i,j]:=a[i,k];
a[i,k]:=c;
end;

- este înlocuită cu secvenţa:

for i:=1 to m do
begin
c:=b[(i-1)*n+j];
b[(i-1)*n+j]:= b[(i-1)*n+k];
b[(i-1)*n+k]:=c;
end;
Transformarea algoritmilor de lucru cu masive bidimensionale în algoritmi de lucru cu massive
unidimensionale, este benefică ,nemaimpunându-se cerinţa de transmitere ca parametru a dimensiunii
effective a numărului de linii (dacă liniarizarea se face pe coloane) sau a numărului de coloane(dacă
liniarizarea se face pe linie)
În cazul matricelor rare ,aceeaşi problemă revine la interschimbarea valorilor de pe coloana a
treia dintre elementele corespondente ale coloanei k şi j, cu posibilitatea inserării unor perechi şi
respectiv ştergerii altora.
Pentru generalizare, un amsiv n-dimensional rar, va fi reprezentat prin n+1 vectori, fiecare
permiţând identificarea coordonatelor elementului nenul, iar ultimul stocând valoarea acestuia.
În cazul în care se construieşte o matrice booleană ce se asociază matricei rare, odată cu
comprimarea acesteia, se dispun elementele nenule într-un vector.Punerea în corespondenţă a
elementelor vectorului are loc odată cu decomprimarea matricei booleene şi analizarea acesteia.
APLICATIA:
{Intr-un vector se memoreaza elementele nenule dintr-o matrice iar in alt vector
pozitiile acestora Sa se reconstituie matricea (rara)}
type li=1..10;
ma=array[li,li] of real;
ve=array[li] of real;
po=array[li] of integer;
var poz:po;
val:ve;a:ma;k,m,n,p,i,j:integer;
begin

177
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write('m=');readln(m); write('n=');readln(n);
write(' cite comp[onente are vectorul de valori nenule din matrice p=');readln(p);
for i:=1 to p do
begin
write('valoarea ',i);readln(val[i]);
end; for i:=1 to p do
begin
write('pozitia lor initiala din matrice ',i);readln(poz[i]);
end;
for i:=1 to m do
for j:=1 to n do
a[i,j]:=0;
for k:=1 to p do begin
i:=poz[k] div n+1;
j:=poz[k] mod n;
a[i,j]:=val[k];
end;
write('matricea rara ');writeln;
for i:=1 to m do begin
for j:=1 to n do
write(a[i,j]:8:1);
writeln;
end;
readln;
end.

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

178
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin for j:=i+1 to n-i do


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

179
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
Sintaxa:
Variabila :=Length(sir);
Ex:
Var s: string;
Begin
Readln(s);
Writeln(length(s);
End.
CONCATERNARE(ALATURAREA) ADOUA SIRURI DE CARACTERE
Sintaxa:
SIRdestinatie:=CONCAT(SIRsursa,SIR2);
Ex:
Var s1,S2,S3: string;
Begin
Readln(s2);
READLN(S3);
S1:=CONCAT(s2,S3);
Writeln (s1);
End.
SAU:
Var s1,S2,S3: string;
Begin

180
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Readln(s2);
READLN(S3);
S1:= s2+S3;
Writeln (s1);
End.

COPIEREA UNUI SIR DE CARACTERE de la sursa LA DESTINATIE


Sintaxa:
SIRdestinatie:=COPY(SIRsursa,POZITIA_initialadecopiat,POZITIA_finala);
Ex:
Var s1,S2: string;
Begin
Readln(s2);
S1:=copy(s2,1,length(s2)-2);

Writeln (s1);
End.
LIMBAJUL PASCAL
CAUTAREA UNUI SIR DE CARACTERE
Sintaxa:
VARIABILA_de_tip_intreag:=pos(SIRsursa,CINE_se_cauta);
Ex:
Var s1,S2: string;p:integer;
Begin
Readln(s2);
Readln(s1);
p:=pos(s1,s2);
Write(p);
End;

COMPARAREA A DOUA SIRURI DE CARACTERE


Sintaxa:
VARIABILA_logica:=SIR1 operator_relational SIR2;
Ex:
Var s1,S2: string;p:boolean;
Begin
Readln(s2);
Readln(s1);
p:=s1<s2;
if p then write(“mai mare”)
else write(“mai mic”);;
End.

LIMBAJUL PASCAL
STREGEREA DINTR-UN SIR
Sintaxa:
DELETE(SIRsursa,DE_UNDE_STERG,pana_in_ce_pozitie);
Ex:
Var s1: string;
Begin
Readln(s1);
delete(s1,1,length(s1)-2);
Write(s1);
End.

LIMBAJUL PASCAL
INSERAREA INTR-UN SIR A ALTUI SIR
Sintaxa:

181
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

INSERT(SIRsursa_UNDE_inserez,pe_cine_inserez,pozitia_de_unde_fac_inserarea);
Ex:
Var s1,S2: string;
Begin
Readln(s1);readln(s2);
insert(s1,s2,3);
Write(s1);
End.

LIMBAJUL PASCAL
CONVERSII LA SIRURI DE CARACTERE DIN NUMAR IN STRING
Sintaxa:
STR(NUMAR:cate_zecimale,cate_unitati,SIRUL_string);
Ex:
Var s1: string;p:integer;
Begin
Readln(p);
Str(p:10,s1);
Write(s1);
End.
Ex:
Var s1: string;p:real;
Begin
Readln(p);
Str(p:10:2,s1);
Write(s1);
End.

CONVERSII LA SIRURI DE CARACTERE DIN STRING IN NUMAR INTREG SI IN REAL


Sintaxa:
VAL(SIRUL_string ,NUMAR,INDICATOR_NUL_DACA_E_bine);
Ex:
Var s1: string;p,k:integer;
Begin
Readln(s1);
val(s1,p,k);
if k=0 then
Write(p);
End.

Tipul multime
Declarare: SET OF tip_parinte
Literali: [element1,element2,…,elementn]; [] - multimea vida
Operatii:
- reuniune (+); intersectie (*); diferenta (-)
- relationale (incluziune)
- apartenenta (IN)
{Sa se efectueze operatii cu multimi apoi Daca x apartine de B atunci 5*x+2,7*x+2
scrierea lor apartine de B
Daca limita multimii nu ar fi 255 ce se Sa se stabileasca daca B e inclus in A sau sa se
intimpla (folosim vectori cu tipul multime nu afiseze elementele intersectiei
se poate) }
Fie 1 care apartine si de A si de B var a,b,c:set of 0..255;
Daca x apartine de A atunci 2*x+1,3*x+1 x,i,j:0..255;
apartine de A car:char;
begin

182
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

a:=[]; while c<>[] do begin


repeat if i in c then
write(' dati elementul prim al begin
multimii');readln(x); write(i:3,',');c:=c-[i];
a:=a+[x]; end;
write(' mai dati d/n ');readln(car ); i:=i+1;
until car='n'; end;
write(' dati a doua multime dati primul element writeln('}');
'); a:=[1];
b:=[]; b:=[1];
repeat for x:=1 to 255 do
write(' dati elementul multimii');readln(x); begin
b:=b+[x]; if x in a then
write(' mai dati d/n ');readln(car ); if 2*x+1<=255 then
until car='n'; begin
write(' operatii:r=reuniune,i=intersectie,a=A- a:=a+[2*x+1];
B,b=B-A,c=produs cartezian'); if 3*x+1<=255 then
write(' ce optati ');read(car); a:=a+[3*x+1];end;
case car of if x in b then
'r':begin c:=a+b ;writeln('reuniunea ');end; if 5*x+2<=255 then
'i':begin c:=a*b ;writeln('intersectia ');end; begin
'a':begin c:=A-B ;writeln('A-B ');end; b:=b+[5*x+2];
'b':begin c:=B-A ;writeln('B-A ');end; if 7*x+2<=255 then
'c':begin writeln('PRODUSUL cartezian');end; b:=b+[7*x+2];
else end;
writeln(' alta varianta nu e '); end;
end; if b<=a then writeln(' multimea b este inclusa
writeln; in multmea a ')
writeln; else
write('{'); begin
if car in ['a','b','c','i','r'] then begin i:=1; write('intersectia este {');
repeat x:=1;
if i in c then write(i,' , '); repeat
c:=c-[i];i:=i+1; if x in b then
until c=[]; begin
end if x in a then
else write(x,' ');b:=b-[x];
if car='c' then end;
for i:=0 to 255 do x:=x+1;
for j:=1 to 255 do until b=[];
if (i in a) and (j in b) then write('(',i,',',j,')'); writeln('}');
writeln('}'); end;
writeln(' sterg multimea c '); readln;
i:=0; end.
TIPUL DE DATE INREGISTRARE

183
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

SINTAXA
TYPE identificator=RECORD
Camp1:tip1;
Camp2:tip2;

campN:tippN;
end;
VAR v:identificator;
Referirea
Identificator.camp

EXEMPLE:
{Citind coordonatele unui punct if (x>0) and (y<0) then
sa se determine in ce cadran se write('punctul e in 4');
afla} end;
program cadran ; readln;readln;
uses crt; end.
type punct=record {Fie o familie cu 5 membri .Sa
x,y:real; se determine cei nascuti vara }
end; type d=record
var i,n:integer; z:1..31;L:1..12;
a:punct; a:1900..2003;
begin end;
clrscr; f=(t,m,c1,c2,c3,c4,c5);
with a do begin {Observati tipul enumerare}
write('abscisa :'); v=array[f] of d;{Observati ca
read(x); tipul enumerare apare ca indice
write('ordonata :'); al unui vector}
read(y); var x:v;
i:f; {Observati tipul enumerare
if (x<0) and (y>0) then write poate fi folosit ca indice la
('punctul e in 1'); un for fiind ordinal}
if (x>0) and (y>0) then begin
write('punctul e in 2'); for i:=t to c5 do
if (x<0) and (y<0) then begin
write('punctul e in 3');

184
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln('membrul i al familiei end;


-ZIUA var art:array[1..25] of
NASTERII');readln(x[i].z); articol;
writeln('membrul i al familiei n,i:integer;
-LUNA begin
NASTERII');readln(x[i].L); writeln('cite persoane sunt
writeln('membrul i al familiei ');readln(n);
-ANUL for i:=1 to n do
NASTERII');readln(x[i].a); begin
end; writeln('persoana ',i);
writeln(' cei care s-au nascut write(' numele
vara '); ');readln(art[i].nume);
for i:=t to c5 do if(x[i].L>=6) write('nota
and (x[i].L<=8) then ');readln(art[i].nota);
writeln(x[i].a,' writeln('strada
',x[i].l:3,x[i].z); ');readln(art[i].adresa.strada)
readln; ;
end. writeln('numarul
');readln(art[i].adresa.nr);
{Prin tipul intregistrare cu writeln('apartamentul
variante sa se memeoreze ');readln(art[i].adresa.ap);
informatii privind end;
numele ,media generala for i:=1 to n do
,adresa with art[i] do
(strada,numar,apartament) la begin
elevii unei scoli} writeln('numele ',nume);
type adr=record with adresa do
strada:string; begin
nr,ap:integer; writeln('strada ',strada);
end; writeln('numarul ',nr);
articol=record end;
nume:string; end;
nota:integer; readln;
promovat :boolean; end.
adresa:adr;

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

185
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:
- 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 (END OF FILE
)

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.

186
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

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.

(2) …

187
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

număr : = 0;
while not eof (f) do
begin
if seek eoln (f) then {linia este albă}
număr : = număr + 1;
readln(f); {avans la linia următoare}
end;

(3) …
număr : = 0;
while not seek eof (f) do
begin
număr : = număr + 1; {numără linie}
readln(f); {avans la linia următoare}
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, ’fdat’);
assign (f2, ’fdat1’);
assign (f3, ’fdat2’);
reset (f1);
reset (f2);
rewrite (f3);
while not eof (f1) do

188
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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);
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

189
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

î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. 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.

190
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 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:

191
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

192
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 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).

193
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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 date m:=m+1;


descrescator
writeln(' mai sunt date de introdus
Sa se creeze un al treilea fisier care contine d/n');readln(si);
elemente din primele doua si
until si<>'d';
care au elementele in ordine descrescatoare}
n:=0;rewrite(f2);
var f1,f2,f:file of real;
repeat
x,y:real;
writeln(' dati valori descrescatoare in al doilea
si:char; fisier ');

i,j,m,n:integer; read(x);

begin write(f2,x);

assign(f1,'f.1');assign(f2,'f.2'); readln;

assign(f,'f.3'); n:=n+1;

rewrite(f1);writeln; writeln(' mai sunt date de introdus


d/n');readln(si);
m:=0;
until si<>'d';
repeat
writeln('f1 are ',m ,'articole f2 are ',n ,' articole
writeln(' dati valori descrescatoare in primul ');
fisier');
reset(f1);reset(f2);rewrite(f);
read(x);
writeln;
write(f1,x);
read(f1,x);read(f2,y);i:=1;j:=1;
readln;
while (i<=m) and (j<=n) do

194
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if x<y then begin {Sa se scrie un fisier cu tip care memoreaza


numele elevilor,clasa si
write(f,y); o suma de care dispun si in care sa se faca
totalul pe clase
if j<n then read(f2,y);j:=j+1; Sa se determine suma maxima si cine o detine,
sa se adauge elevi la o clasa si sa se listeze
Sa se extraga o anumita suma sau sa se depuna
end de catre un elev de la o anumita clasa}
type ar=record
else cl:string[5];
nu:string[20];
begin su:word
end;
write(f,x); var fis1,fis2: file of ar;
art1,art2:ar;nr,tot,i,n:word;sfirsit,b:boolean;op:
char;
if i<m then read(f1,x);i:=i+1;
num,c1:string[5];sum,nm,max:word;
nn:array[1..100] of longint;s,j:longint;
end;
begin
while i<=m do assign(fis1,'cec');
rewrite(fis1);
begin write('n=');readln(n);
for i:=1 to n do
write(f,x); with art1 do
begin
write('clasa ');readln(cl);
if i<m then read(f1,x);i:=i+1;
write('nume');readln(nu);
write('suma');readln(su);
end; write(fis1,art1);
end;
while j<=n do reset(fis1);read(fis1,art1);tot:=art1.su;c1:=art1.
cl;writeln;
begin writeln('clasa',art1.cl);
writeln('numele ',art1.nu);
write(f,y);if j<n then read(f2,y);j:=j+1; writeln(art1.su);
while not eof(fis1) do
begin
end; read(fis1,art1);
with art1 do
writeln;writeln(' fisierul f este '); if c1=cl then begin
writeln(' ' ,nu,' ',su); tot:=tot+su;
reset(f); end
else
while not eof(f) do begin
writeln(' suma totala ',tot);
tot:=su;
begin
c1:=cl;
writeln('clasa',cl);
read(f,x); writeln(' ',nu,' ',cl);
end; end;
write(x:5:0); writeln(' suma totala=',tot);
close(fis1);
end; reset(fis1);
max:=0;
readln; while not eof(fis1) do
begin
read(fis1,art1);
end.
if art1.su>max then begin
i:=1;

195
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

nn[i]:=filepos(fis1)-1;max:=art1.su; su:=su+sum
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 numele si
reset(fis1); virsta unor persoane
while not eof(fis1) do Dindu-se doua fisiere sa se listeze}
begin type inr=record
read(fis1,art1); nume:string[10];
with art1 do begin virsta:byte;
writeln('clasa',cl); end;
writeln(' ',su,' ',cl); fisier=file of inr;
end; end; close(fis1); var i,inreg:inr;
reset(fis1);nm:=filesize(fis1)-1; f2,f1:fisier;
write('citi modificati n=');readln(n); c:char;
for i:=1 to n do begin
begin assign(f1,'ff.dat');
write('clasa');readln(c1); rewrite(f1);
write('nume');readln(num); repeat
write(' nr de ordine ');readln(nr); write('numele ');readln(inreg.nume);
write('tipul operatiei I?E');readln(op); write('virsta');
write('suma ');readln(sum); readln(inreg.virsta);
if nr>nm then write(f1,inreg);
writeln(' nr de ordine gresit pentru ',num,' ',c1) write('continuati y/n');readln(c);
else until c='n';
begin assign(f2,'fff.dat');
seek(fis1,nr); writeln(' dati inregistrari in al doilea fisier ');
read(fis1,art1); rewrite(f2);
with art1 do repeat
begin write('numele ');readln(inreg.nume);
if (c1<>cl) or (num<>nu) then writeln(' nr de write('virsta');
ordine gresit pentru ',num,' ',c1) readln(inreg.virsta);
else write(f2,inreg);
begin write('continuati y/n');readln(c);
b:=true; until c='n';
if op in['i','I'] then reset(f1); writeln(' primul fisier ');

196
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
Caracteristici generale ale algoritmilor de prelucrare a fisierelor Pascal

Organizarea datelor în fisiere pe suporti externi de informatii presupune proiectarea


unor algoritmi specifici operatiilor de gestiune a acestora, denumiti generic algoritmi
de prelucrare a fisierelor de date. Datorita complexitatii aplicatiilor care prelucreaza
fisiere este recomandata aplicarea metodei modularizarii algoritmilor si programelor.
Modularizarea presupune ca, pe baza analizei problemei, sa se descompuna rezolvarea
ei în parti distincte, numite module, astfel încât fiecare dintre acestea sa îndeplinieasca
anumite functii. Descompunerea se poate realiza în mai multe faze (pe mai multe
niveluri), prin metoda top-down. Criteriile de descompunere în module depind, în
mare masura, de experienta programatorilor. Ele se refera, în principal, la:
omogenizarea functiilor; utilizarea diverselor structuri de date; separarea functiilor de
intrare/iesire de functiile de prelucrare; utilizarea unor module deja existente;
utilizarea eficienta a resurselor calculatorului (timp UC, memorie interna, periferie)
etc. Modulele se implementeaza în program prin proceduri interne sau externe.

De cele mai multe ori o aplicatie necesita existenta mai multor fisiere active simultan,
cu rol diferit (de intrare, de iesire, de intrare/iesire). Indiferent de numarul fisierelor
utilizate, în marea majoritate a algoritmilor, logica prelucrarii este coordonata, la un

197
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

moment dat, de un singur fisier, obligatoriu de intrare, parcurs secvential, numit fisier
conducator (sau director). Fisierul conducator are proprietatea ca articolele lui pot fi
citite independent de prelucrarea altor fisiere. Altfel spus, un fisier nu este conducator
daca prelucrarea articolelor sale este dependenta de existenta (de citirea) articolului
altui fisier. Accesul la datele memorate în fisierul conducator se realizeaza la nivel de
articol. De aceea, algoritmii de prelucrare, indiferent de operatia de gestiune, necesita
utilizarea unei structuri repetitive pentru parcurgerea (partiala sau integrala) a
fisierului respectiv.

Algoritmii de prelucrare cu fisier conducator pot fi reprezentati printr-o schema logica


generalizata, conceputa modularizat .

Modulul ÎNCEPUT se realizeaza o singura data, înaintea prelucrarii primului articol


al fisierului conducator si cuprinde urmatoarele grupe de operatii:

Operatii initiale standard, obligatorii oricarui algoritm si care includ: asignarea


fisierelor logice la fisiere fizice, deschiderea fisierelor, si, pentru anumite variante,
initializarea unei variabile boolene pentru sfârsit de fisier (SF) si citirea primului
articol.

Operatii initiale specifice, facultative, existenta lor depinzând de particularitatile


problemei abordate si care includ, în principal: initializari de variabile de total, afisari
ale antetului, titlului si/sau a capului de tabel pentru situatii de iesire etc.

198
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

· Modulul PRELUCRARE se executa repetitiv (în general, printr-o structura


WHILE-DO) si cuprinde, pe de o parte, totalitatea operatiilor de prelucrare a
articolului curent al fisierului conducator - operatii specifice fiecarei probleme - si, pe
de alta parte, citirea unui articol din fisierul conducator. Ordinea celor doua operatii
(citire si prelucrare) depinde de varianta de algoritm aleasa.

· Modulul SFÂRSIT se executa o singura data, dupa prelucrarea ultimului articol al


fisierului conducator si include urmatoarele grupe de operatii: operatii finale standard,
corespunzând închiderii fisierelor implicate în prelucrare; operatii finale specifice,
care depind de natura problemei si includ, de regula: afisarea variabilelor de total, a
statisticilor privind operatiile de gestiune executate, închiderea situatiilor de iesire etc.

· Modalitatea de detectare/tratare a sfârsitului de fisier conduce la existenta mai


multor variante ale schemei generale de prelucrare cu fisier conducator, prin forme
particulare ale conditiei sfârsit_de_prelucrare. În functie de variantele alese, se pot
construi scheme logice valabile pentru toate tipurile de fisiere sau numai pentru
fisierele binare.
Scheme valabile pentru toate tipurile de fisiere

Detectarea sfârsitului de fisier independent de operatia de citire, cu functia standard


Eof, caz în care testarea sfârsitului de fisier trebuie sa preceada citirea unui articol.
Daca conditia de sfârsit de prelucrare este testul asupra variabilei boolene SF,
algoritmul va prevedea o citire initiala în modulul ÎNCEPUT si o citire curenta la
sfârsitul modulului PRELUCRARE - varianta 1 (figura 6.4)

199
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Varianta se poate aplica fisierelor vide sau nevide. Când conditia de sfârsit de
prelucrare este chiar expresia (functia) Eof(f), algoritmul va include doar citirea
curenta în debutul modului PRELUCRARE - variantele 2 si 3 (figura 6.5).

Varianta 3 necesita existenta cel putin a unui articol (fisier conducator nevid.)

Scheme logice valabile numai pentru fisiere binare

Detectarea sfârsitului de fisier prin operatia de citire, caz în care se genereaza eroare
si se întrerupe executia programului. Întreruperea programului se poate inhiba cu
directive de compilare {$I-}, iar eroarea de intrare/iesire se poate detecta cu functia
standard IOResult. Algoritmul de prelucrare prevede o citire initiala în modulul
ÎNCEPUT si citirea curenta în finalul modulului PRELUCRARE. Testul de sfârsit al
prelucrarii poate fi constituit de însasi functia IOResult - varianta 4 (figura 6.6.), sau
de variabila booleana SF, pozitionata la citirea marcatorului de sfârsit de fisier -
varianta 5 (figura 6.7).

200
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

În ambele variante fisierul conducator este binar, vid sau nevid. În cazul în care
fisierul este nevid (are cel putin un articol), citirea initiala poate sa nu mai fie
încadrata de directivele de compilare {$I-} si {$I+}.

Prelucrarea unui numar cunoscut de articole, prin determinarea în modulul ÎNCEPUT


a numarului de articole din fisierul conducator, cu functia FileSize. Structura
repetitiva de prelucrare devine o structura DO-FOR (varianta 6 - figura 6.8).

201
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Fisierele utilizate într-o aplicatie informatica au rol diferit în procesul prelucrarii, în


functie de scopul lor: de intrare, de iesire, de intrare/iesire, temporare, de tip lista etc.

Aceste caracteristici conduc la algoritmi specifici fiecarei operatii de gestiune în parte


(creare/populare, consultare si actualizare), fiind însa variante derivate din schema
generala a unui algoritm de prelucrare cu fisier conducator.

Deoarece aplicatiile informatice din domeniul economic, social, administrativ etc.


utilizeaza, cu predilectie, fisiere cu articole de aceeasi structura (sau un numar mic de
structuri diferite), alegând limbajul Pascal, se poate aprecia ca cele mai performante
sunt fisierele binare (cu tip sau fara tip), ale caror articole sunt date declarate de tip
RECORD.

Aceasta alegere este motivata din urmatoarele puncte de vedere:

· descrierea articolelor este apropiata atât descrierii naturale a structurii unei entitati
din lumea reala (formata din câmpuri cu nume, lungime, reprezentare interna proprie,
semnificatie si factor de repetabilitate diferite), cât si descrierii din alte limbaje;
· exista posibilitatea de a descrie explicit mai multe structuri pentru articolele
aceluiasi fisier (articole cu structura variabila);
· operatiile de acces la înregistrari se realizeaza cu viteza mare, datorita lipsei
conversiilor la transferul între memoria principala si memoria externa.

Fisierele de tip TEXT sunt recomandate a fi utilizate ca fisiere de iesire, pentru


realizarea de liste, situatii finale, rapoarte etc., fiind rezidente pe disc, în general, pâna
la listarea lor la imprimanta. Fisierele de tip TEXT pot constitui si sursa de creare a
fisierelor binare, daca acestea au fost populate cu date, fie prin editoare de texte, fie

202
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

prin alte limbaje (COBOL, FORTRAN, C, BASIC), sisteme de gestiune a bazelor de


date (DBASE, FOXPRO etc.), constituind unicul mijloc de compatibilitate directa.

4.5 Subprograme definite de utilizator


4.5.1 Proiectarea modulara a rezolvarii unei probleme

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:

203
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

■ 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:

□ 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).

204
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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.
Î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:

1. Clasa de memorare.
2. Vizibilitate.
3. Durata de viaţă.
4. 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.

205
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

4.5.2.Declarare ,definire si apel de subprograme

206
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
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;

207
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
IF b > t THEN t : = b;
IF c > t THEN t : = c;
MAX : = t
END;
BEGIN
CLRSCR;
WRITE (’INTRODUCEŢI TREI NR. !’);

208
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

209
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

var a : integer;
procedure adun;
var b : integer;
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.

210
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

Î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:

211
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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:

212
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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?

Răspunsul este afirmativ daca lucram cu variabile pointer.


Exemplu:
write(f1(a):3);
 {Cu funcrii sa se afiseze niste numere in write(' ',a);
ordinea a ,(a+1)*(a+1),a writeln;
si a ,(a+1)*(a+1),a folosind transmiterea parametrilor prin readln;
valoare si referinta} end.
var a:integer;  {Cu proceduri sa se realizeze operatii cu multimi
function f(a:integer):integer; in care elemnte sunt litere
begin (folositi transmiterea prin valoare );
a:=a+1;f:=a*a; Ce modificari faceti la listare pentru a realiza tranmiterea
end; prin referinta}
function f1(var a:integer):integer; type mm=set of 'a'..'z';
begin var c,aa,bb:mm;
a:=a+1;f1:=a*a; procedure cc(var m:mm);
end; var elem:'a'..'z';
begin begin
a:=2;write(a:3); m:=[];
write(f(a):3); while not eoln do
write(' ',a); begin
writeln; read(elem);
writeln('observati ca transmiterea lui a prin referinta'); m:=m+[elem];end;
a:=2;write(a:3); readln;

213
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; writeln;
procedure s(m:mm); end;end;
var elem:'a'..'z'; begin
begin write('multimea A : tastati pe linie un sir de elemente ');
if m=[] then writeln(' multimea vida ') cc(aa); write('multimea b tastati pe linie un sir de elemente
else ');cc(bb);
begin write('reuniunea');S(Aa+Bb);
for elem:='a' to 'z' do write('intersectia');S(Aa*Bb);
if elem in m then write(elem:2); write('diferenta');S(Aa-Bb);
writeln; c:=Aa+Bb;
end;end; write('reuniunea');ss(c);
procedure ss(var m:mm); c:=Aa*Bb;
var elem:'a'..'z'; write('intersectia');
begin ss(c);
if m=[] then writeln(' multimea vida ') c:=Aa-Bb;
else write('diferenta');ss(c);
begin READLN;
for elem:='a' to 'z' do END.
if elem in m then write(elem:2);

Alte exemple:
1.Declaratia unei proceduri: procedure Afis(a , b :integer);
procedure Scrie(a:integer); begin
begin a:=a+1;
write(a); b:=b+1;
end; writeln(a, ‘ ‘,b);
end;
2. declaratia altei proceduri: begin
procedure Calcule(a:integer , var b:integer); clrscr;
var I:integer; a:=1;
begin b:=1;
readln (I); Afis(a,b);
write(a); Write(a,’ ‘,b);
b:=b+I*3; Readln;
end; End.

3.Lista parametrilor formali este vida: 7.Program parametri variabili:


procedure Afisere; program p2;
begin uses crt;
writeln(‘Exemplu de procedura fara parametri var a , b :integer;
formali’); procedure Afis( var a , b :integer);
end; begin
a:=a+1;
4.lista parametrilor formali este b:=b+4;
formata dintr-o singura sublista: writeln(a, ‘ ‘,b);
procedure Afisere(k,p :integer); end;
begin begin
writeln(k,’ ‘, p); clrscr;
end; a:=1;
b:=1;
5. Lista parametrilor formali este Afis(a,b);
formata din mai multe subliste: Write(a,’ ‘,b);
procedure Afisere (k,p :integer , m,n :real , c: Readln;
char); End.
begin
writeln(k,’ ‘, p); 8.Consideram urmatoarele declaratii
writeln(m:4:2 , ‘ ‘,n:4:2); pentru a apela la o procedura:
writeln(c); var a, b :integer;
end; procedure Afis(a,b: integer);
begin
6. Program parametri cu valoare:
program p1; Apeluri corecte:
uses crt;
var a , b :integer; a:=1; (1)

214
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

b:=1; End;
Afis(a,b);
Write(a,’ ‘,b); 21. Lista parametrilor formali este formata dintr-
o singura sublista:
a:=1; (2)
b:=2; function A(k,p:integer):real;
Afis(1,2); begin
Write(a,’ ‘,b); A:=13;
End;
a:=1; (3)
b:=2;
Afis(a+1,b+3); 22. Lista parametrilor formali este formata
Write(a,’ ‘,b); dinmai multe subliste:

Apeluri incorecte: function A(k,p:integer ;n,m :real;c:char):real;


begin
a:=1; (1) writeln(h,’ ‘,p);
b:=1; writeln(m:4:2, ‘ ‘ , n:4:2);
Afis(a;b); writeln( c );
Write(a,’ ‘,b); A:=13;
End;
a:=1; (2)
b:=1;
Afis(1); 23. primul exemplu de program cu functii:
Write(a,’ ‘,b);
program p1;
a:=1; (3) uses crt;
b:=2; var a,b :integer;
Afis(a+1.2,b+3); functioA(a,b:integer):real;
Write(a,’ ‘,b); begin
a:=a+1;
Readln; b:=b+4;
End. writeln(a,’ ‘,b);
18.DECLARAREA UNEI FUNCTII: A:=13;
End;
Begin
function F(x:integer):real; Clrscr;
begin A:=1;
F:=x+1; B:=2;
End; Writeln(A(a,b));
Write(a, ‘ ‘ , b);
Readln;
19. DECLARAREA UNEI FUNCTII (2): End.

function(Calcule(a:integer;var b:integer):real; 24. Sa se realizeze un program in pascal


var I:integer; care , folosind proceduri si functii , sa realizeze
begin urmatorul calcul: a+b.
readln(I);
write(a);
b:=a+I*3;
Calcule :=b;
End; program p2;
uses crt;
var a , b :integer;
20. Lista parametrilor formali este vida: procedure Cit_numar( var nr. :integer);
begin
function A:real; readln(nr);
begin end;
A:=13; procedure Afis_numar( nr. :integer);

215
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin
writeln(nr); x+1 , daca <4
end; F(x)=
procedure Suma( a,b. :integer : var s:integer); 2x+1 , daca x>4
begin
S:=a+b;
end;
begin
clrscr;
Cit_numar(a); Program p1;
Cit_numar(b); Uses crt;
Afis_numar(suma(a,b)); Var a:real;
Readln; Function f(x:real):real;
End. Begin
If (x<=4) then f:=x+1
Else F:=2*x-1
End;
25. Sa se realizeze un program care , folosind Begin
o functie , sa afiseze f(a) unde: Clrscr;
Write(‘a=’);readln(a);
Writeln(‘f(‘,a,’);=’,fa:4:2);
Readln;
End.

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.

□ 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;

216
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

217
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

4.5.6 Recursivitate
Mecanismul recursivitati

218
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

▫ 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.

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.

219
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

● 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: Fact (0) = 1 ;
Fact(2) = fact(1)*2 = fact(0)*1*2 = 1*1*2 =2
F:N N Fact(2) = fact(3)*4 = fact(2)*3*4 = fact(1)*2*3*4
= fact(0)*1*2*3*4 = 1*1*2*3*4 =24

1, ,n = 0
Fact (n) = 3. Exempu de definire inconsistenta :
Fact(n-1)*n ,altfel
F(0) = 1
F(2) = f(4)*2 = f(6)*2*4 = f(8)*2*6*4 = …….

2 Exemple :

220
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

4. Realizati subprograme recursive in Pascal 6. Se da un sir x de nr intregi . SA se


care returneaza: realizeze subprograme in Pascal care sa
1+2+3+….+n. realizeze citrea si afiserea sirului x.

Program p1 ; Procedure Cit_sir(x:Şir ; k,p : integer);


Uses crt; Begin
Var n:integer ; If (k=p) then readln(x[k]) else
Function s(k , p :integer) :integer ; Begin
Begin Readln(x[k]);
If (k=p) then s:=k else s:=s(k,p-1)+p Cit_sir(x , k+1 , p);
End; End
Bein End;
Write(‘n =’);readln(n); Procedure Afis_sir(x:Şir ; k,p : integer);
Write(‘s =’, s(1,n)); Begin
Readln; If (k=p) then write(x[k]:5) else
End. Begin
write(x[k]:5);
Afis_sir(x , k+1 , p);
End
5. Realizati subprograme recursive in Pascal End;
care returneaza: Readln;
1 x 2 x 3 x….x n. End.

Program p1 ;
Uses crt;
Var n:integer ; 7. Se da un sir x de nr intregi . SA se
Function pp(k , p :integer) :integer ; realizeze subprograme in Pascal care sa
Begin calculeze :
If (k=p) then pp:=k else pp:=pp(k,p-1)*p X5 +x6 +….+x12 .
End;
Bein
Write(‘n =’);readln(n);
Write(‘pp =’, pp(1,n));
Readln; Function s(x:sir; k , p :integer) :integer ;
End. Begin
If (k=p) then s:=Tk else s:=s(x,k,p-1)+Tp
End;

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;

221
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- 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.

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

222
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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;

223
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

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;

224
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

225
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Constructor init (a,b: real);


Constructor complex.init(a,b: real);
Begin
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
Re,im:real;
Constructor init(a,b:real);
Constructor generare(x:real);
Function modul:real;
End;
Constructor complex.init(a,b:real);
begin
Re:=a;
Im:=b;
End;
Constructor complex.generare(x:real);
Begin
Re:=x;
Im:=0;
End;
Function complex.modul: real;
Begin
Modul:=sqrt(sqe(re)+sqr(im));
End;
Var z,u:complex;
Begin
z.init(3,4); writeln(z.modul);
u.generare(4); u.im:=3; writeln(u.modul);
end.

O procedura poate fi inclusa in definitia unui obiect:


Type complex=object
Re,im:real;
Constructor init(a,b:real);
Constructor generare(x:real);
Function modul: real;
Procedure complex.afisare;

226
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end;
FRACTIE
Definiti un obiect care sa reprezinte notiunea de fractie ordinara si o metoda care sa determine fractia zecimala
echivalenta.
Type fractie=object;
P,q:integer;
Constructor init(a:integer);
Function zecimal:real;
End;
Constructor fractie.init (a:integer);
Begin
P:=a;
Q;= 1;
End;
Function fractie.zecimal:real;
Begin
Zecimal:=p/q;
End;
Punct in reper cartezian
Definiti un tip de obiect care sa reprezinte notiunea de punct intr-un reper cartezian si o metoda prin care sa se
determine distanta de la el la originea sistemului de coordonate
Type punct=object;
X,y:real;
Constructor generare;
Function distanta:real;
End;
Constructor punct.generare;
Begin
X:=0;y:=0;
End;
Function punct.distanta:real;
Begin
Distanta:=sqrt(sqr(x)+sqr(y));
End;
Dreptunghi
Definiti un tip de obiect care sa reprezinte notiunea geometrica de dreptunghiavand laturile paralele cu axele de
coordonate si atasati o metoda care sa furnizeze aria sa.
Program test;
Type punct=object
X,y:real;
Constructor generare;
Function distanta:real;
End;
Constructor punct.generare;
Begin
X:=0;y:=0;
End;
Function punct.distanta:real;
Begin
Distanta:=sqrt(sqr(x)+sqr(y));
End;
Type dreptunghi=object
U,v:punct;
Constructor generare(a,b:punct);
Function aria:real;
u.x:=a.x; u.y:=a.y;
v.x:=b.x; v.y:=b.y;
end;
function dreptunghi.aria:real;
begin

227
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

aria:=abs((u.x-v.x)*(u.y-v.y));
end;
var
a,b:punct;
x:dreptunghi;
begin
a.generare; a.x:=1; a.y:=1;
b.generare; b.x:=2; b.y:=2;
x.generare(a,b);writeln(x.aria);
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.
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.

228
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
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’

229
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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)
begin
re:=x; im:=0; end;
function complex .modul:real;
begin
modul :=sqrt(sqr(re)+sqr(im));

end;

CONCEPTE RAFINATE: inherited, virtual si self.


1. Atributul inherited:
Vom ilustra o caracteristica a programarii pe obiecte inacest limbaj si anume posibilitatea ca o functie
mostenita dar
modificata de catre urmas sa fie totusi accesibila.Altfel spus intr-un urmas pot coexista atat metoda mostenita cat
si cea mo –

230
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

dificata.Sintactic accesul la metoda mostenita se face in acest caz prin cuvantul inherited.
exemolu:
Presupunem ca avem doua definitii de obiecte unu si doi . Obiectul de tip doi va fi urmas al lui
unu.Incepem cu obiec-
tul unu care are definitia urmatoare:
2. type unu =object
3. n:integer;
constructor init(a:integer);
function putere :integer;
end;

constructor unu.init:( a : integert) ; begin n:=a; end;

function unu . putere:integer;

begin putere :=sqr(n); end;

Prin mostenire datele si metodele se transmit urmasilor avand posibilitatea de modificare a metodelor.

Sa urmarim definitia de mai jos:

type doi=object(unu);

function putere:integer;

end;

Noua definitie a functiei putere va fi:


function doi .putere:integer;
begin putere :=inherited putere+1; end;

2.ATRIBUTUL VIRTUAL.

Vom prezenta al doilea rafinament importantadus de limbajul Pascal conceptului general de


polimorfism. Va fi votba de metodele virtuale. Asadar toate metodele prezentate pana acum au
fost metode statice.
Definitie.
Metodele virtuale sunt acele metode care se asociaza obiectului la momentul
executiei.
exemplu:
unit_static;
INTERFACE
type unu=object
p:integer;
constructor init;
procedure tipar;
end;
Am definit tipul de obiect unu care contine ca si membru de tip data o variabila de tip intreg
numita p. Membrii de tip metoda sunt constructorul init si procedura tipar.Toate sunt statice.
type doi=object(1)
procedure tipar;
end;
Urmeaza sectiunea de implementare :
IMPLEMENTATION
constructor unu .init;
begin p:=1; tipar; end;
Urmeaza metoda tipar a obiectului unu in care se afisaza textul clasa unu menit a ne confirme ca am accesat
o metoda membra a tipului unu;
procedure unu.tipar;
begin

231
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln(‘clasa unu’); end;


Descrierea metodei de tipul doi:
procedure doi.tipar;
begin
writeln(‘clasa doi’); end;
Cum poate fi folosit unit-ul?
uses_static;
var a:unu;
b:doi;
begin a.init; b.init; end.
Definitie.
Metodele constructor ale obiectelor nu pot fi virtuale.Apelul constuctorului are drept efect
stabilirea co-
respondentei dintre un obiect si metodele sale.
3.CALIFICAREA SELF.
exemplu:
program calificare;
type test=object
a:integer;
constructor init (n:integer);
function calcul(x:test):integer;
end;
constructor test.init(n:integer) ;
begin a:=n, end;
function test.calcu(x:test):integer;
begin
with x do calcul:=a+self.a; end;
var T,x:test;
t>init(3);X.init*4); writeln(T.calcul(x)) ;
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;

232
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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

233
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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ă.
Î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 reezolvarea 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;

234
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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.

235
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

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.

236
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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:


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.

3
1
4 v:string[20];
2
procedure succesor(var
type sir =array[1..100] of integer; x:sir;k:integer;var as:boolean);
begin
var x:sir; if (x[k]<n) then begin
p,i,j,k,n,k1:integer; as:=true; x[k]:=x[k]+1;
as,ev:boolean;

237
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end as,ev:boolean;
else
as:=false; procedure succesor(var
end; x:sir;k:integer;var as:boolean);
begin
procedure valid(x:sir;k:integer;var if (x[k]<n ) then begin
ev:boolean); as:=true; x[k]:=x[k]+1;
var i:integer;
begin end
ev:=true; else
for i:=1 to k-1 do as:=false;
if v[x[k]]=v[x[i]] then end;
ev:=false;
procedure valid(x:sir;k:integer;var
end; ev:boolean);
var i:integer;
begin
procedure afis(x:sir;k:integer); ev:=true;
var i:integer; for i:=1 to k-1 do
begin if (x[k]=x[i]) OR (K-i =ABS(X[K]-
for i:=1 to n do X[I])) then ev:=false;
write(v[x[i]],' ');
end;
writeln;
end;
procedure afis(x:sir;k:integer);
begin var i,j:integer;
READLN(N); begin p:=p+1;
write('dati vectorul '); for i:=1 to n do
readln(v); begin
for i:=1 to n do
read(v[i]; for j:=1 to n do
k:=1; if x[i]=j then
x[k]:=0; write('1 ',' ')
while(k>0) do else
begin write('0 ',' ');
repeat
succesor(x,k,as); writeln;end;
if as then valid(x,k,ev) writeln('------------------');
until (as and ev) or (not
as); end;
if as then
if (k=n) then begin
afis(x,k)
else write('dati numarul n= ');
begin readln(n);
k:=k+1; k:=1; p:=1;
x[k]:=0; x[k]:=0;
end
else while(k>0) do
k:=k-1 ; begin
end; repeat
readln; succesor(x,k,as);
end. if as then valid(x,k,ev)
until (as and ev) or (not
LIMBAJUL PASCAL as);
PROBLEMA DAMELOR if as then
type sir =array[1..100] of integer; if k=n then begin
writeln('solutia
var x:sir; ',p);writeln('==============');
p,i,k,n,s:integer; afis(x,k);

238
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end procedure
else afis(x:sir;k:integer);
begin var i:integer;
k:=k+1; begin
x[k]:=0;
end for i:=1 to k do
else write(x[i]:5);
k:=k-1 ; WRITELN;
end; end;
readln; begin
end.
write('dati numarul
{se pleaca din orasul 1 si se nodurilor');
cunosc distantele la celelate readln(n);
orase for i:=1 to n do
Se cer toate traseele ce trece for j:=i+1 to n do
prin toate localitatile si begin
ajunge la primul writeln('legatura intre
iar distanta zero inseamna ca localitatea ',i,' si ',j,'DA
nu am legatura directa} ESTE 1 NU este zero ');
uses crt; readln(a[i,j]);
type sir =array[1..100] of a[j,i]:=a[i,j];
integer; end;
x[1]:=1; { plec din localitatea
var x:sir; 1 }
i,j,k,n:integer; k:=2;
as,ev:boolean; x[k]:=0;
a:array[1..50,1..50] of while(k>0) do
integer; begin
repeat
procedure succesor(var succesor(x,k,as);
x:sir;k:integer;var if as then valid(x,k,ev)
as:boolean); until (as and ev) or (not as);
begin if as then
if (x[k]<n) then begin if (k=n) then
as:=true; afis(x,k)
x[k]:=x[k]+1; else
end begin
else k:=k+1;
as:=false; x[k]:=0
end; end
else
procedure k:=k-1
valid(x:sir;k:integer;var end;
ev:boolean); readln;
begin end.
ev:=true; {Se dau n harti si n culori Sa
if(a[x[k-1],x[k]]=0 )then se coloreze o harta dar sa nu
ev:=false fie doua tari vecine
else cu aceiasi culoare }
begin uses crt;
for i:=1 to k-1 type sir =array[1..100] of
do integer;
if x[i]=x[k] then ev:=false;
if(k=n) and(a[x[n],x[1]]=0) var x:sir;
then ev:=false; c,p,i,j,k,n:integer;
end; as,ev:boolean;
end; v:array[1..50,1..50] of
integer;

239
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;
end
end else
else k:=k-1 ;
as:=false; end;
end; readln;
end.
procedure { APLICATIE LA SUBMULTIMI:Se
valid(x:sir;k:integer;var citesc n numere care se
ev:boolean); memoreaza intr-un vector
var i:integer; Sa se genereze toate
begin submultimile din acest vector
ev:=true; care au p elemente
FOR I:=1 TO k-1 do si a caror suma este de s
if (v[k,i]=1 ) and (x[k]=x[i]) (citit de la tastatura)}
then ev:=false; type sir =array[1..100] of
end; integer;

var x:sir;
procedure p,i,k,n,s:integer;
afis(x:sir;k:integer); as,ev:boolean;
var j, i:integer; v:array[1..50] of integer;
begin
c:=c+1;writeln('solutia ',c);
for i:=1 to n do function
solutie(k:integer):boolean;
writeln('tara ',i,' are var i,ss:integer;
culoarea ',x[i],' begin
');writeln('---------------');r ss:=0;
eadln; for i:=1 to k do
ss:=ss+v[x[i]];
writeln; solutie :=(ss=s) and(k=p);
end; end;

begin procedure succesor(var


c:=0; x:sir;k:integer;var
write('dati numarul de harti as:boolean);
'); begin
readln(n); if (x[k]<(n-p+k)) and(k<=p)
for i:=1 to n do then begin
for j:=i+1 to n do as:=true; x[k]:=x[k]+1;
begin
write('tara ',i,' este vecina end
cu tara ',j,' '); else
readln(v[i,j]);v[j,i]:=v[i,j]; as:=false;
end; end;
k:=1;
x[k]:=0; procedure
while(k>0) do valid(x:sir;k:integer;var
begin ev:boolean);
repeat var i:integer; ev1:boolean;
succesor(x,k,as); begin
if as then valid(x,k,ev) ev:=true; ev1:=(k=n);
until (as and ev) or for i:=1 to k-1 do
(not as); if x[k]=x[i] then ev:=false;
if as then if k>1 then

240
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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}
var i:integer; program plata;
begin
for i:=1 to p do var x,a,nr:array[1..20] of
write(v[x[i]],' '); integer;
s,k,n,nr1,i,s1:integer;
writeln; ok,este :boolean;
end; procedure afisare;
var i:integer;
begin begin
nr1:=nr1+1;
write('dati numarul de numere writeln('solutia ',nr1);
din vector '); for i:=1 to k do
readln(n); write('dati writeln(x[i],'de ',a[i],'
numarul de numere din vector lei');
cite combinati '); writeln;
readln(p); readln;
write('dati numarul end;
care suma admisa de combinatie
'); procedure cont (k:integer;var
readln(s); ok:boolean);
for i:=1 to n do var i:integer;
begin begin
write('numarul ',i,' este s1:=0;
');
readln(v[i]); for i:=1 to k do
end; s1:=s1+x[i]*a[i];
k:=1; if s1 <=s then ok:=true
x[k]:=0; else
while(k>0) do ok:=false;
begin END;
repeat procedure succesor
succesor(x,k,as); (k:integer;var este:boolean);
if as then valid(x,k,ev) begin
until (as and ev) or if (x[k]<nr[k]) and (k<=n) then
(not as); begin
if as then x[k]:=x[k]+1;
if solutie(k) then este:=true;
afis(x,k) end
else else este:=false;
begin end;
k:=k+1; BEGIN
x[k]:=0; write('n=');
end readln(n);
else write('s=');
k:=k-1 ; readln(s);
end; for i:=1 to n do begin
readln; writeln('valoarea bacnotei de
end. tipul ',i);
{ Se dau suma s si n tipuri de readln(a[i]);nr[i]:=s div a[i];
bancnote avand valorile end;
a1,a2,...,an lei.Se cer k:=1;
toate modalitatile de plata a x[k]:=-1;
sumei s utilzand aceste nr1:=0;
bancnote while k>0 do begin
ex:n=3 ok:=false;

241
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

este:=true; k:=k+1;
while(not ok) and este do begin x[k]:=-
succesor(k,este); 1;
if este then cont (k,ok); end;
end; end;
if not ok then k:=k-1 readln;
else if s1=s then END.
afisare
else
begin
BACTRACKING IN PLAN
{fie o tabla de sah si un cal in coltul stinga sus end;
Sa se afiseze toate modalitatile de mutare a
calului asfel inacit sa begin
treaca o singura data prin fiecare patarat al clrscr;
tablei} writeln ('n=');
uses crt; readln(n);
type sir =array[1..8] of integer; for i:=1 to n do
mat=array[1..20,1..20] of integer; for j:=1 to n do
const a[i,j]:=0;
di:sir=(-2,-1,1,2,2,1,-1,-2); a[1,1]:=1;
dj:sir =(1,2,2,1,-1,-2,-2,-1); ns:=0;
var a:mat; pas:=2;
i,j,n,ns,pas:integer; calul(a,1,1,pas);
readln;
procedure afis; end.
var i,j:integer; {fie un labirint unde cifra 1 este culoar pe care
begin se poate circula
ns:=ns+1; iar zero nu se poate circula intr-o matrice
writeln('solutia cu numarul ',ns,'este '); Sa se afiseze toate modalitatile de deplasare a
for i:=1 to n do unei persoane pe cifre de 1 astfel
begin sa poata sa iese din labirint dintr-o anumita
for j:=1 to n do pozitie
write(a[i,j]:4); deplasindu-se la nord,sud,est,vest}
writeln; uses crt;
end; type sir =array[1..4] of integer;
end; mat=array[1..20,1..20] of integer;
const
procedure calul(var di:sir=(-1,0,1,0);
A:mat;i,j:integer;pas:integer); dj:sir =(0,1,0,-1);
var k,i1,j1:integer; var a,lab:mat;
cond:boolean; i,j,n,ns,pas,c,l:integer;
begin cond:boolean;
for K:=1 to 8 do procedure afis;
begin var i,j:integer;
i1:=i+di[K]; begin
j1:=j+dj[k]; ns:=ns+1;
cond:=(i1 in [1..n]) and (j1 in [1..n]) and writeln('solutia cu numarul ',ns,' este ');
(a[i1,j1]=0) ; for i:=1 to n do
if cond then begin begin
a[i1,j1]:=pas; for j:=1 to n do
if pas=n*n then write(a[i,j]:4);
begin writeln;
afis ; end;
readln; end;
end
else calul(a,i1,j1,pas+1); procedure calul(var
a[i1,j1]:=0; A:mat;i,j:integer;pas:integer);
end; var k,i1,j1:integer;
end; cond:boolean;

242
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin begin
for K:=1 to 4 do a[x,y]:=0;
begin transforma(x-1,y,a);
i1:=i+di[K]; transforma(x-1,y+1,a);
j1:=j+dj[k]; transforma(x,y+1,a);
cond:=(i1 in [1..n]) and (j1 in [1..n]) and transforma(x+1,y+1,a);
(a[i1,j1]=0) and (lab[i1,j1]=1) ; transforma(x+1,y,a);
if cond then begin transforma(x+1,y-1,a);
a[i1,j1]:=pas; transforma(x,y-1,a);
if (i1 in [1..n]) or (j1 in [1..n]) then afis transforma(x-1,y-1,a);
else calul(a,i1,j1,pas+1); end;
a[i1,j1]:=0; end;

end; begin
end; write ('n=');
end; readln(n);
write ('m=');
begin readln(m);
clrscr; for i:=1 to m do
writeln ('n='); for j:=1 to n do
readln(n); begin
for i:=1 to n do writeln('a[',i,',',j,']=');
for j:=1 to n do readln (a[i,j]);
begin end;
writeln('labirint[',i,',',j,']=');
readln(lab[i,j]); for i:=1 to n do
end; begin
for i:=1 to n do a[0,i]:=0;
for j:=1 to n do a[m+1,i]:=0;
a[i,j]:=0; end;
ns:=0; for i:=1 to m do
writeln('linia de plecare'); begin
readln(l); a[i,0]:=0;
writeln('coloana de plecare'); a[i,n+1]:=0;
readln(c); end;
a[l,c]:=1;
pas:=2; for i:=1 to m do
for i:=1 to n do begin
begin for j:=1 to n do
for j:=1 to n do write(a[i,j]:4);
write(lab[i,j]:4); writeln;
writeln; end;
end;
calul(a,l,c,pas); x:=0;
readln; repeat
end. x:=x+1;
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S y:=0;
+,T-,V+,X+} repeat
{$M 16384,0,655360} y:=y+1;
{ Portiuni cu valoarea 1 dintr-o matice until(y>n) or(a[x,y]=1);
reprezinta un obiect.Cite until(x>m) or(a[x,y]=1);
obiecte sunt intr-o matrice} transforma(x,y,a);
uses crt; gasit:=false;
type matrice=array[0..9,0..9] of integer;
var a:matrice; gasit:boolean; for i:=1 to m do
n,m,i,j,x,y:integer;
procedure transforma(x,y:integer;var for j:=1 to n do
a:matrice); if (a[i,j]=1) then gasit:=true;;
begin if gasit then writeln ('sunt mai multe obiecte ')
if a[x,y]=1 then else writeln( 'este un singur obiect');

243
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln; write ('n=');


readln(n);
for i:=1 to m do for i:=1 to n do
begin for j:=1 to n do
for j:=1 to n do begin
WRITE(a[i,j]:4); writeln('a[',i,',',j,']=');
writeln; end; readln (a[i,j]);
readln; end;
end. for j:=1 to n do
begin
{Se da o matrice cu elemente 0 si 1 in care a[0,j]:=1;
valorile 1 delimiteaza a[n+1,j]:=1;
o suprafata inchisa in cadrul matricei(cele cu end;
zero sunt in interior) for i:=1 to n do
Daca se dau coordonatele unui element din begin
matrice si acest element a[i,0]:=1;
este zero sa se determine toate elementele de a[i,n+1]:=1;
zero la care se poate ajunge de la acest element end;
mergind in directiile in sus,jos,dreapta,stinga in for i:=1 to n do
1} begin
uses crt; for j:=1 to n do
type mat=array[0..20,0..20] of integer; write(a[i,j]:4);
var a:mat; writeln;
n,m,i,j,x,y:integer; end;
procedure transforma(var a:mat;x,y:integer); writeln('dati coordonatele de plecate a unui
begin element nenul x ');readln(x);
if a[x,y]=0 then writeln('dati coordonatele de plecate a unui
begin element nenul y ');readln(y);
a[x,y]:=1; transforma(a,x,y);
transforma(a,x+1,y); for i:=1 to n do
transforma(a,x-1,y); begin
transforma(a,x,y+1); for j:=1 to n do
transforma(a,x,y-1); write(a[i,j]:4);
end; writeln;
end; end;
begin readln;
clrscr; end.

BACTRACKING RECURSIV
{Sa se genereze toate descompunerile unui numar n ca write(' introduceti numarul de descompus ca suma
suma numere diferite n=');readln(n);
iar rezultatele sa le puna intr-un fisier
ex:n=4 for i:=1 to 25 do
=>1 3 st[i]:=0;st[1]:=-1;
4} end;

type vector =array[1..25] of integer; function valid(p:integer):boolean;


var i:integer;ok:boolean;
var st:vector; begin
n,k:integer;g:text; ok:=true;
function suma(p:integer):integer; for i:=1 to p-1 do
var s,k:integer; if st[p]<=st[i] then
begin ok:=false; if suma(p)>n then ok:=false;
s:=0; valid:=ok;
for k:=1 to p do end;
s:=s+st[k];
suma:=s; procedure tipar(p:integer);
end; var j:integer;
begin
if suma(p)=n then begin
procedure initializari; for j:=1 to p do write(g,st[j]:4,' ');
var i:integer; writeln(g);
begin end;

244
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write(' introduceti numarul de descompus ca suma


end; n=');readln(n);
write(' cite cifre vreti sa contina suma k=');
procedure bktr(p:integer); readln(k);
var pval:integer; for i:=1 to 25 do
begin st[i]:=0;
for pval:=1 to n do end;
begin
st[p]:=pval; function valid(p:integer):boolean;
if valid(p) then begin var i:integer;ok:boolean;
begin
tipar(p); ok:=true;
for i:=1 to p-1 do
bktr(p+1); end; if st[p]<=st[i] then
end; ok:=false; if suma(p)>n then ok:=false;
end; valid:=ok;
end;
begin
initializari; procedure tipar(p:integer);
assign(g,'desc.txt'); var j:integer;
rewrite(g); begin
bktr(1);close(g); if suma(p)=n then begin
readln; for j:=1 to p do write(g,st[j]:4,' ');
end. writeln(g);
DESCOMPU end;
{Sa se genereze toate descompunerile unui numar n ca
suma de k numere end;
iar rezultatele sa le puna intr-un fisier
ex:n=4 procedure bktr(p:integer);
k=2 var pval:integer;
=>1 3} begin
for pval:=1 to n do
type vector =array[1..25] of integer; begin
st[p]:=pval;
var st:vector; if valid(p) then
n,k:integer;g:text; if p=k then
function suma(p:integer):integer; tipar(p)
var s,k:integer; else
begin bktr(p+1);
s:=0; end;
for k:=1 to p do end;
s:=s+st[k];
suma:=s; begin
end; initializari;
assign(g,'desc.txt');
rewrite(g);
procedure initializari; bktr(1);close(g);
var i:integer; readln;
begin end.
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.

245
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

program permutari;
type stiva=array[1..100] of integer;
var st:stiva;
n,k:integer;
ev:boolean;
procedure init(k:integer;var st:stiva);
begin
st[k]:=0;
end;
function succesor(var st:stiva;k:integer):boolean;
begin
if st[k]<n then
begin
st[k]:=st[k]+1;
succesor:=true;
end
else succesor:=false;
end;
procedure valid(var ev:boolean;st:stiva;k:integer);
var i:integer;
begin
ev:=true;
for i:=1 to k-1 do
if st[i]=st[k] then ev:=false;
end;
function solutie(k:integer):boolean;
begin
solutie:=(k=n);
end;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(st[i]);
writeln;
end;
procedure back(k:integer);
begin
if solutie(k) then tipar
else begin
init(k,st);
while succesor(st,k) do begin
valid(ev,st,k);
if ev then back(k+1)
end
end;
Begin
Write(‘n=’); readln(n);
Back(1);
End.

246
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Backtracking recursiv fără schemă

Problemele incluse în acest capitol sunt rezolvate prin utilizarea tehnicii


backtracking, însă aceasta ca idee de căutare a soluţiilor, nu ca rutină standardizată.
 Problema celor n dame. Fiind datã o tablă de şah nxn, se cer toate solutiile de
aranjarea n dame, astfel încât să nu se afle două dame pe aceeaşi linie,coloană
sau diagonală(damele să nu se atace reciproc).

program damer;
type tabla=array[1..20] of integer;
var t:tabla;
i,n:integer;
procedure tipar;
var i:integer;
begin
for i:=1 to n do write(t[i]);
writeln;
end;
procedure dame(k:integer);
var i,j:integer;
c:boolean;
begin
if k=n+1 then tipar
else begin
for i:=t[k]+1 to n do begin
t[k]:=i;
c:=true;
for j:=1 to k-1 do
if (t[j]=t[k]) or (abs(t[k]-t[j])=(k-j)) then c:=false;
if c then dame(k+1);
end;
end;
t[k]:=0;
end;
Begin
write('n='); readln(n);
for i:=1 to n do t[i]:=0;
dame(1);
End.

 Generarea partiţiilor unui număr natural. Se citeşte un număr natural n. se cere


să se tipărească toate modurile de descompunere a sa ca sumă de numere
naturale.
program part_n;
type solutie=array[1..20] of integer;
var n:integer;
s:solutie;
procedure tipar(k:integer);
var i:integer;

247
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin
for i:=1 to k do write(s[i]);
writeln;
end;
procedure part(k,v:integer);
var i:integer;
begin
s[k]:=v;
tipar(k);
for i:=1 to s[k]-1 do
begin
s[k]:=s[k]-i;
part(k+1,i);
s[k]:=s[k]+1;
end;
end;
Begin
write ('n=');readln(n);
part(1,n);
End.

 Plata unei sume cu bancnote de valori date. Se dau suma s şi n tipuri de


monede având valori de a1,a2,…,an lei. Se cer toate modalităţile de plată a sumei s
utilizând aceste monede.

program bancnote;
uses crt;
type vector=array[1..9] of integer;
var sol,a,b:vector;
n,i,s:integer;
procedure tipar(k:integer);
begin
writeln('Solutie');
for i:=1 to k do
if sol[i]<>0 then writeln(sol[i],'bancnote',a[i]);
readln;
end;
procedure plata(k,s0:integer);
begin
while (sol[k]<b[k]) and (s0+a[k]>=s) do
begin
sol[k]:=sol[k]+1;
if sol[k]>0 then s0:=s0+a[k];
if s0=s then tipar(k)
else if k<n then plata(k+1,s0)
end;
sol[k]:=-1;
end;
Begin
write ('cate tipuri de bancnote avem?');readln(n);

248
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write ('suma=');readln(s);
for i:=1 to n do
begin
write('valoarea monedei de tipul',i,' ');
readln(a[i]);
b[i]:=s div a[i];
sol[i]:=-1;
end;
plata (1,0);
End.
 Problema labirintului. Se dă un labirint sub formă de matrice cu m linii şi n
coloane. Fiecare element al matricei reprezintă o cameră a labirintului. Într-una din
camere, de coordonate x şi y, se găseşte un om. Se care să se găsească toate
ieşirile din labirint.
program ies_labirint;
type labirint=array [0…9,0..9] of integer;
drum=array [1…2,1…100] of integer;
var 1:labirint;
d:drum;
i,j,m,n,x,y,k: integer;

procedure tipar(k:integer;d:drum);
var i:integer;
begin
writeln(‘----------------’);
for i:=1 to k do
writeln(‘1=’,d[1,i],’’,’c=’,d[2,i])
end;
procedure ies (x,y:integer;var k:integer;var l:labirint;)
var d:drum;
var gasit:boolean;
i:integer;
begin
if l[x.y]=16
then tipar(k.d)
else
begin
k:=k+1;d[l,k]:=x;d[2,k]:=y;
gasit:=false;
for i:=1 to k-1 do
if (d[l,i]=d[l,k]) and (d[2,i]=d[2,k])
then gasit:=true;
if not gasit
then
for i:=1 to 4 do
case i of
1:if l[x,y] and 8<>0 then ies(x-1,y,k,l,d);
2:if l[x,y] and 4<>0 then ies(x,y+1,k,l,d);
3:if l[x,y] and 2<>0 then ies(x+1,y,k,l,d);
4:if l[x,y] and 1<>0 then ies(x,y-1,k,l,d);

249
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; {case}
k:=k-1;
end;
end;
Begin
Write(‘n=’);readln(n);
Write(‘m=’);readln(m);
For i:=1 to m do
For j:=1 to n do begin
Write(‘l[‘,i,’,’,j,’]=’);
Readln(l[i,j]);
End;
Write(‘X=’);readln(X);
Write(‘y=’);readln(y);
for i:=1 to n do
begin
l[0,i]:=16;
l[m+1,i]:=16
end;
for i:=1 to m do
begin
l[i,0]:=16;
l[i,n+1]:=16
end;
k:=0;
ies(x,y,k,l,d)
end.
 Algoritmul de umplere a unei suprafeţe închise(FILL). Se dă o matrice binară
Valorile 1 delimitează o anumită suprafaţă închisă în cadrul matricei (elementele
aparţinând acestei suprafeţe sunt marcate cu 0).Se dau, de asemenea,
coordonatele x şi y ale unui element al matricei, semnificând un punct din interiorul
acestei suprafeţe.
program umplere;
type matrice=array [0…9,0…9]of integer;
var a:=matrice;
i,j,m,n,x,y:integer;

procedure scriu (x,y:integer;) var a:=matrice;


begin
if a [x,y]=0
then
begin
a[x,y]:=1;
scriu(x+1,y,a);
scriu(x,y+1,a);
scriu(x-1,y,a);
scriu(x,y-1,a)
end
end;

250
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin
write (‘M=’); readln(m);
write (‘N=’); readln(n);

for i:=1 to m do
for j:=1 to n do
begin
write(’a[‘,i,’,’,j,’]=’);
readln([i,j])
end;
for i:=1 to n do
begin
a[0,i]:=1;
a[m+1,i]:=1
end;
for i:=1 to m do
begin
a[i,0]:=1;
a[i,n+1]:=1
end;
write (‘X=’); readln(x);
write (‘Y=’); readln(y);
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j]);
writeln
end;
scriu(x,y,a);
writeln; writeln;
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j]);
writeln
end;
end.

 Problema fotografiei. O fotografie alb-negru este prezentată sub forma unei


matrice binare. Ea înfăţişează unul sau mai multe obiecte. Porşiunile
corespunzătoare obiectukui (sau obiectelor) în matrice au valoarea 1. Se cere să
se determine dacă fotografia reprezintă unul sau mai multe obiecte.

program foto;
type matrice=array [0..9,0..9] of integer;
var a:matrice;
i,j,m,n,x,y:integer;
gasit:boolean;
procedure compact(x,y:integer;var a:matrice);
begin
if a[x,y]=1 then
begin

251
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

a[x,y]:=0;
compact(x-1,y,a);
compact(x-1,y+1,a);
compact(x,y+1,a);
compact(x+1,y+1,a);
compact(x+1,y,a);
compact(x+1,y-1,a);
compact(x,y-1,a);
compact(x-1,y-1,a);
end;
end;
begin
write('m='); readln(m);
write('n=');readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
begin
a[0,i]:=0;
a[m+1,i]:=0;
end;
for i:=1 to m do
begin
a[i,0]:=0;
a[i,n+1]:=0;
end;
x:=0;
repeat
x:=x+1; y:=0;
repeat
y:=y+1;
until (y=n) or (a[x,y]=1);
until (x=m) or (a[x,y]=1);
compact (x,y,a);
gasit:=false;
for i:=1 to m do
for j:=1 to n do
if a[i,j]=1 then gasit:=true;
if gasit then writeln('mai multe obiecte')
else writeln('un obiect')
End.

 Săritura calului. Se consideră o tablă de şah nxn şi un cal plasat în colţul din
stânga, sus. Se cere să se afişeze toate posibilităţile de mutare a acestei piese de
şah, astfel încât să treacă o singură dată prin fiecare pătrat al tablei.

252
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

program cal1;
type tabla=array[-1..25,-1..25] of integer;
solutie=array[1..2,1..1000] of integer;
var t:tabla;
s:solutie;
i,j,n,nr,l,c:integer;
procedure tipar;
begin
writeln('solutie');
for i:=1 to n*n do
begin
writeln(s[1,i],' ',s[2,i]);
readln
end;
end;
procedure cal(l,c,nr:integer);
begin
if t[l,c]=0 then
begin
nr:=nr+1;
t[l,c]:=1;
s[1,nr]:=l;
s[2,nr]:=c;
if nr=n*n then tipar
else begin
cal(l-1,c+2,nr);
cal(l+1,c+2,nr);
cal(l+2,c+1,nr);
cal(l+2,c-1,nr);
cal(l+1,c-2,nr);
cal(l-1,c-2,nr);
cal(l-2,c-1,nr);
cal(l-2,c+1,nr);
end;
t[l,c]:=0;
end;
end;
Begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do t[i,j]:=0;
for i:=1 to n+1 do
begin
t[0,i]:=1;
t[-1,i]:=1;
t[n+1,i]:=1;
t[n+2,i]:=1;
t[i,0]:=1;

253
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

t[i,-1]:=1;
t[i,n+1]:=1;
t[i,n+2]:=1;
end;
nr:=0;
cal(1,1,0);
End.
5.4 Algoritmi combinatoriali
5.4.1 Generare permutari
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 succesor(var x:sir;k:integer;var
permutari as:boolean);
ale acestor litere dar sa nu fie unele care begin
se repeta} if (x[k]<n) then begin
type sir =array[1..100] of integer; as:=true; x[k]:=x[k]+1;

var x:sir; end


p,i,j,k,n,k1:integer; else
as,ev:boolean; as:=false;
v:string[20]; end;

254
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

n,k:integer;
procedure valid(x:sir;k:integer;var as,ev:boolean;
ev:boolean); procedure init(k:integer;var st:stiva);
var i:integer; begin
begin st[k]:=0;
ev:=true; end;
for i:=1 to k-1 do procedure succesor(var as:boolean;var
if x[k]=x[i] then ev:=false; st:stiva;k:integer);
begin
end; if st[k]<n then
begin
st[k]:=st[k]+1;
procedure afis(x:sir;k:integer); as:=true;
var i:integer; end
begin else as:=false;
for i:=1 to n do end;
write(v[x[i]],' '); procedure valid(var
ev:boolean;st:stiva;k:integer);
writeln; var i:integer;
end; begin
ev:=true;
begin for i:=1 to k-1 do
if st[k]=st[i] then ev:=false;
write('dati cuvintul '); end;
readln(v); function solutie(k:integer):boolean;
n:=length(v); begin
solutie:=(k=n);
k:=1; end;
x[k]:=0; procedure tipar;
while(k>0) do var i:integer;
begin begin
repeat for i:=1 to n do write(st[i]);
succesor(x,k,as); writeln;
if as then valid(x,k,ev) end;
until (as and ev) or (not as); Begin
if as then write('n=');readln(n);
if (k=n) then k:=1;init(k,st);
afis(x,k) while (k>0) do
else begin
begin repeat
k:=k+1; succesor(as,st,k);
x[k]:=0; if as then valid(ev,st,k);
end until (not as) or(as and ev);
else if as then
k:=k-1 ; if solutie(k) then tipar
end; else begin
readln; k:=k+1;
end. init(k,st);
end
VARIANTA 2 else k:=k-1;
program permutari; end
type stiva=array[1..100] of integer; End.
var st:stiva;

Algoritmul continua pana cand stiva devine vida.
5.4.2 Generare aranjamente
este numarul de litere care se
{ Se citesc n si p numere dau.
numere naturale n>=p unde n Se cere sa se genereze toate

255
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

submultimile write('numarul ',i,' este


multimi(a,b,...,z ) de p ');
elemente.Doua multimi cu readln(v[i]);
aceleasi elemente end;
la care ordinea acestora difera k:=1;
sunt considerate aceleasi.} x[k]:=0;
uses crt; while(k>0) do
type sir =array[1..100] of begin
integer; repeat
succesor(x,k,as);
var x:sir; if as then valid(x,k,ev)
p,i,j,k,n:integer; until (as and ev) or
as,ev:boolean; (not as);
v:array[1..50] of char; if as then
if (k=p) then
procedure succesor(var afis(x,k)
x:sir;k:integer;var else
as:boolean); begin
begin k:=k+1;
if (x[k]<n) then begin x[k]:=0;
as:=true; x[k]:=x[k]+1; end
else
end k:=k-1 ;
else end;
as:=false; readln;
end; end.
VARIANTA 2
procedure Generare aranjamentelor. Se citesc n
valid(x:sir;k:integer;var
si p. Sã se genereze toato
ev:boolean);
var i:integer; aranjamentele 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

256
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to k-1 do if st[k]=st[i] then succesor(as,st,k);


ev:=false; if as then
end; valid(ev,st,k);
function solutie(k:integer):boolean; until (not as) or(as and
begin ev);
solutie:=(k=p); if as then
end; if solutie(k) then
procedure tipar; tipar
var i:integer; else begin
begin
for i:=1 to p do write(st[i]); k:=k+1;
writeln;
end; init(k,st);
Begin end
write('n=');readln(n); else k:=k-1;
write('p=');readln(p); end
k:=1;init(k,st); End.
while (k>0) do
begin
repeat

4.5.3 Generare combinari


{APLICATIE LA COMBINARI: Se {as:=as and ((k>1) and
citesc n si p numere numere (x[k]>x[k-1] ));}
naturale n>=p.Se cere sa se end;
genereze toate
submultimile procedure
multimi(1,2,...,n)de p valid(x:sir;k:integer;var
elemente.Doua multimi cu ev:boolean);
aceleasi elemente var i:integer;
la care ordinea acestora difera begin
sunt considerate aceleasi. ev:=true;
VARIANTA:Cum se pot pune p ture for i:=1 to k-1 do
pe o tabla n X n asfel incit if (k>=2) and
sa fie pe scara si sa nu se not(v[x[k]]>v[x[k-1]] )then
ia} ev:=false;
uses crt;
type sir =array[1..100] of end;
integer;

var x:sir; procedure


p,i,j,k,n:integer; afis(x:sir;k:integer);
as,ev:boolean; var i:integer;
v:array[1..50] of integer; begin
for i:=1 to k do
procedure succesor(var write(v[x[i]],' ');
x:sir;k:integer;var
as:boolean); writeln;
begin end;
if (x[k]<n) then begin
as:=true; x[k]:=x[k]+1; begin

end write('dati numarul de numere


else din vector ');
as:=false;

257
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

readln(n); write('dati else if k:=1 then st[k]:=0;


numarul de numere cite end;
combinati '); procedure succesor(var as:boolean;var
readln(p); st:stiva;k:integer);
begin
for i:=1 to n do if st[k]<n-p+k then
begin begin
write('numarul ',i,' este st[k]:=st[k]+1;
'); as:=true;
readln(v[i]); end
end; else as:=false;
k:=1; end;
x[k]:=0; procedure valid(var
while(k>0) do ev:boolean;st:stiva;k:integer);
begin var i:integer;
repeat begin
succesor(x,k,as); ev:=true;
if as then valid(x,k,ev) end;
until (as and ev) or function solutie(k:integer):boolean;
(not as); begin
if as then solutie:=(k=p);
if (k=p) then
end;
afis(x,k)
procedure tipar;
else
var i:integer;
begin
begin
k:=k+1;
for i:=1 to p do write(st[i]);
x[k]:=0;
writeln;
end
end;
else
k:=k-1 ; Begin
end; write('n=');readln(n);
readln; write('p=');readln(p);
end. k:=1;init(k,st);
while (k>0) do
begin
repeat
succesor(as,st,k);
if as then valid(ev,st,k);
VARIANTA 2 until (not as) or(as and ev);
program combinari; if as then
type stiva=array[1..100] of integer; if solutie(k) then tipar
var st:stiva; else begin
n,k,p:integer; k:=k+1;
as,ev:boolean; init(k,st);
procedure init(k:integer;var st:stiva); end
begin else k:=k-1;
if k>1 then st[k]:=st[k-1] end
End.

5.4.4 Produs cartezian


{Dindu -se mai multe multimi as,ev:boolean;
fiecare cu un anumit numar de a:array[1..50,1..50] of
elemente integer;
sa se efectueze produsul
cartezian al lor} procedure succesor(var
uses crt; x:sir;k:integer;var
type sir =array[1..100] of as:boolean);
integer; begin
if (x[k]<n[k]) then begin
var x,n:sir; as:=true;
i,k,m,j:integer; x[k]:=x[k]+1;

258
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end writeln('numarul de elmente


else pentru multimea ',i);
as:=false; readln(n[i]);
end; for j:=1 to n[i] do
begin
procedure writeln('elementul ',j,'este');
valid(x:sir;k:integer;var readln(a[i,j]);
as:boolean); end;
begin end;
ev:=true; k:=1;
x[k]:=0;
end; while(k>0) do
begin
procedure repeat
afis(x:sir;k:integer); succesor(x,k,as);
var i:integer; if as then valid(x,k,ev)
begin until (as and ev) or (not as);
if as then
for i:=1 to k do if (k=m) then
write(a[i,x[i]]:5,' -----'); afis(x,k)
WRITELN; else
end; begin
begin k:=k+1;
x[k]:=0
write('dati numarul multimilor end
la care fac produsul else
cartezian'); k:=k-1
readln(m); end;
for i:=1 to m do readln;
begin end.
write('pentru multimea ',i ,'
avem ');

5.4.5 Generare submultimile unei multimi


{Sa se genereze toate
submultimile unei multimi} procedure
uses crt; valid(x:sir;k:integer;var
type sir =array[1..100] of ev:boolean);
integer; begin
ev:=true;
var x:sir; end;
i,j,k,n:integer;
as,ev:boolean;
a:array[1..50] of integer; procedure
afis(x:sir;k:integer);
procedure succesor(var var i:integer;
x:sir;k:integer;var begin
as:boolean); write('{');
begin for i:=1 to k do
if (x[k]<1) then begin if x[i]=1 then
as:=true; write(a[i]:5);
x[k]:=x[k]+1; write('}');
end writeln;
else end;
as:=false;
end; begin

259
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

until (as and ev) or (not as);


write('dati numarul de elemente if as then
al multimii'); if (k=n) then
readln(n); afis(x,k)
for i:=1 to n do begin else
writeln('elementul ',i,' este begin
'); k:=k+1;
readln(a[i]); x[k]:=-1
end; end
else
k:=1; k:=k-1
x[k]:=-1; end;
while(k>0) do readln;
begin end.
repeat
succesor(x,k,as);
if as then valid(x,k,ev)

5.4.6 Partitii
a)Partitiile unui numar natural
{Sa se genereze toate procedure
descompunerile unui numar n ca valid(x:sir;k:integer;var
suma numere ev:boolean);
diferite} begin
uses crt; ev:=true;
type sir =array[1..100] of if(suma(k)>n )then
integer; ev:=false ;

var x:sir; for i:=1 to k-1


i,k,n,p:integer; do
as,ev:boolean; if x[i]>=x[k] then ev:=false;

end;
function
suma(k:integer):integer;
var s,k1:integer; procedure
begin afis(x:sir;k:integer);
s:=0; var i:integer;
for k1:=1 to k do begin
s:=s+x[k1]; if suma(k)=n then
suma:=s; for i:=1 to k do
end; write(x[i]:5,' ');
WRITELN;
procedure succesor(var end;
x:sir;k:integer;var begin
as:boolean);
begin write('dati numarul ');
if (suma(k-1)+x[k]<n) then readln(n);
begin k:=1;
as:=true; x[k]:=0;
x[k]:=x[k]+1; while(k>0) do
end begin
else repeat
as:=false; succesor(x,k,as);
end; if as then valid(x,k,ev)
until (as and ev) or (not as);

260
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if as then end
if suma(k)=n then else
afis(x,k) k:=k-1
else end;
begin readln;
k:=k+1; end.
x[k]:=0;
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: var max,i:integer;
begin
pt n=1
if k=n+1 then tipar
{1}
else
pt n=2
begin
{1,2} max:=0;
{1},{2} for i:=1 to k-1 do
pt n=3 if max<p[i] then max:=p[i];
{1 2 3} for i:=1 to max+1 do
{1 2},{3} begin
{1 3 },{2} p[k]:=I;
{1},{2 3} part(k+1,n,p);
{1 },{2},{3}} end;
EXPLICATII: end;
Programul afiseaza pentru n=1 end;
1 adica {1} care apartine de multimea 1 begin
n=2 read(n);
11 adica {1,2} adica primele 2 numere apartin part(1,n,p);
ambele de multimea 1 end.
12 adica {1},{2} deci primul numar e in prima
multime,celalat e in cea de a doua VARIANTA 2:
n=3 {Se da un numar n>1.Se cere sa
111 adica {1 2 3} se genereze toate partitiile
112 adica {1 2},{3} multimii
121 adica {1 3},{3} {1,2,...,n)
122 adica {1},{2 3} ex:n=2=>
123 adica {1},{2},{3} (1 ),(2),(1,2)
}
}
type vector =array[1..9] of integer;
var n,i:integer;p:vector; program partitii;
procedure tipar; var x:array [1..10] of byte;
n,k,v,i,j,max,p:byte;
var I,j,max:integer;
begin begin
write(“partitia “); write('n='); readln(n);
max:=1; p:=0;
for i:=2 to n do k:=1;
if max<p[i] then max:=p[i]; x[1]:=0;
for i:=1 to max do while k>0 do begin
begin v:=0;
write(“multimea ‘,I,’ ‘ ); while (x[k]+1<=k)
for j:=1 to n do and (v=0) do
if p[j]=I then begin
then write(j); x[k]:=x[k]+1;
writeln; max:=x[1];
wnd; for i:=2 to
end; k-1 do
procedure part(k,n:integer;var if
p:vector); max<x[i] then max:=x[i];

261
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if for
x[k]<=max+1 then v:=1 i:=1 to max do
else v:=0;
end; begin
if v=0 then k:=k-1
else if k<n then write('{');
begin
for j:=1 to n do
k:=k+1;
if x[j]=i then write(j,' ');
x[k]:=0
write('} ');
end
else begin end;
p:=p+1;
if writeln;
max<x[n] then max:=x[n]; end;
end;
writeln('partitia',p); readln;
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}.

262
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

263
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.
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;
ordine=array[1..10] of integer;
var s:spectacol;
o:ordine;
n,i,oradeinceputaspectacoluluicurent,siciteminutearespectacolulcurent,
oradesfirsitaspectacoluluiurmator,siciteminutearespectacolulurmator:integer;
procedure sortare;
var gata:boolean;
variabiladeschib,i:integer;
begin
repeat
gata:=true;
for i:=1 to n-1 do
if s[2,o[i]]>s[2,o[i+1]] then
begin
variabiladeschib:=o[i];
o[i]:=o[i+1];
o[i+1]:= variabiladeschib;
gata:=false;
end;
until gata;
end;
begin
write(' nr de spectacole n=');
readln(n);
for i:=1 to n do
begin
o[i]:=i;
write ('ora de inceput pentru spectacolul ',i); readln(oradeinceputaspectacoluluicurent);
write ('si cite minute ',i); readln(siciteminutearespectacolulcurent);
write ('ora de sfirsit pentru spectacolul ',i); readln(oradesfirsitaspectacoluluiurmator);
write ('si cite minute ',i); readln(siciteminutearespectacolulurmator);
s[1,i]:=oradeinceputaspectacoluluicurent*60+siciteminutearespectacolulcurent;
s[2,i]:=oradesfirsitaspectacoluluiurmator*60+siciteminutearespectacolulurmator;
end;
sortare;
write('primul este ',o[1]);
for i:=2 to n do
if s[1,o[i]]>=s[2,o[i-1]] then

264
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln( 'spectacolul cu numarul de ordine ',o[i]:6);


readln;
end.

 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.

}
invers:boolean;
program problema_continua_a_rucsacului; begin
uses crt; clrscr;
type vector1=array[1..20] of real; write('greutatea ce poate fi transportata ->
vector2=array[1..20] of integer; ');readln(gr);
{ write('dati numarul de obiecte ->
c - vectorul in care se trec castigurile pt. ');readln(n);
fiecare obiect in parte for i:=1 to n do
g - vectorul in care se trec greutatile begin
fiecarui obiect write('c[',i,']= ');readln(c[i]);
ef - vectorul eficientei transportului write('g[',i,']= ');readln(g[i]);
fiecarui obiect ordine[i]:=i;
de fapt, eficienta este castigul impartit la ef[i]:=c[i]/g[i];
greutate ( castigul writeln('eficienta pt. obiectul : ',i, '
obtinut prin transportul unitatii de este ',ef[i]:3:2);
greutate ) end;
}
var c,g,ef:vector1;
{ repeat
ordine - vector folosit la sortarea in invers:=false;
ordine descrescatoare a for i:=1 to n-1 do
eficientei de transport if ef[i]<ef[i+1] then
} begin
ordine:vector2; aux:=ef[i]; { sortam
{ vectorul ef }
n - numarul de obiecte ef[i]:=ef[i+1];
i - contor de lucru ef[i+1]:=aux;
aux1 - variabila de interschimbare aux:=c[i]; { sortam
} vectorul c }
n,i,aux1:integer; c[i]:=c[i+1];
{ c[i+1]:=aux;
gr - variabila in care retinem greutatea aux:=g[i]; { sortam
care incape in rucsac vectorul g }
aux - variabila de interschimbare g[i]:=g[i+1];
castig - se calculeaza castigul g[i+1]:=aux;
invers:=true;
aux1:=ordine[i]; { sortam
vectorul ordine}
} ordine[i]:=ordine[i+1];
gr,aux,castig:real; ordine[i+1]:=aux1;
{ end
invers - variabila folosita la sortarea until not invers;
vectorului ordine castig:=0;

265
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

i:=1; program poz_max;


writeln('Posibilitatea de incarcare eficienta type vector=array[1..100] of integer;
a rucsacului este : '); var i,n,max,j,k:integer;
writeln('apasa ENTER pt. afisarea a:vector;
rezultatului'); function maxim(i:integer):integer;
readln; var f:integer;
while (gr>0) and (i<=n) do begin
begin if i<n then
if gr>g[i] then begin
begin j:=maxim(i+1);
writeln(' se if a[i]>a[j] then
incarca obiectul ',ordine[i],' : ',1); max:=i
gr:=gr-g[i]; else
max:=j
castig:=castig+c[i]; end
end else
else max:=n;
begin end;
writeln(' se begin {main}
incarca obiectul ',ordine[i],' : ',gr/g[i]:1:2); write('n=');readln(n);
for i:=1 to n do
castig:=castig+c[i]*gr/g[i]; begin
gr:=0 write('a[',i,']');
end; readln (a[i]);
i:=i+1 end;
end; k:=maxim(1);
writeln('castig total = ',castig:3:2); writeln ('poz max=',k:8);
readln; writeln('elem max este',a[i]);
end. 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
(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.

266
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

5 3
1

Acest graf (de cost 18) nu are costul minim. De exemplu, graful din figura de mai jos are
costul 15.

267
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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)
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.

268
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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

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.

269
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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
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

270
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

cautam valoarea 3

271
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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-un vector begin
prin metoda cautari binare writeln('vectorul sortat este');
OBS:Aplicati divide et impera for i:=1 to n do
ex: write(a[i]);writeln;readln;
n=3 end;
123 procedure caut(i,j:integer);
caut pe 2 begin
=>e pe pozitia 2} if nr=a[(i+j) div 2 ]
type indice=1..100; then writeln('l-am gasi la pozitia ',(i+j) div 2)
else
var a:array[indice] of integer; if i<j then
nr,n:indice; if nr<a[(i+j) div 2 ]
procedure citire; then caut (i,(i+j) div 2-1)
var I:indice; else caut ((i+j) div 2+1,j)
begin end;
writeln('n=');readln(n); begin
for i:=1 to n do citire;
begin write('pe cine cautai ');
writeln('a[',i,']='); readln(nr);
readln(a[i]); caut(1,n);
end;end; readln;
procedure afisare; end.
var i:indice;

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
Etapa 1)

272
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

273
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

274
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

275
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

276
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

277
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

278
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

279
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

280
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

281
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

282
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

283
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

284
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

285
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

286
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

287
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

288
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

289
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

290
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

291
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

292
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

293
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

294
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

295
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

etapa2)finala

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

296
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

c6=9

LIMBAJUL PASCAL k:=k+1;


type vector=array[1..10] of integer; end
var a:vector; else
n,i:integer; for i:=j to xxx2 do
procedure sort(xxx1,xxx2:integer;var a:vector); begin
var m:integer; b[k]:=a[i];
begin k:=k+1;
if a[xxx1]>a[xxx2] then end;
begin k:=1;
m:=a[xxx1]; for i:=xxx1 to xxx2 do
a[xxx1]:=a[xxx2]; begin
a[xxx2]:=m; a[i]:=b[k];
end k:=k+1;
end; end;end;
procedure divimp(xxx1,xxx2:integer;var a:vector);
procedure interclasare(xxx1,xxx2,m:integer;var var m:integer;
a:vector); begin
var b:vector; if (xxx2-xxx1)<=1 then
i,j,k:integer; sort(xxx1,xxx2,a)
begin else
i:=xxx1;j:=m+1; begin
k:=1; m:=(xxx1+xxx2) div 2;
while (i<=m) and (j<=xxx2) do divimp(xxx1,m,a);
if a[i]<=a[j] then divimp(m+1,xxx2,a);
begin interclasare(xxx1,xxx2,m,a);
b[k]:=a[i]; end;end;
i:=i+1; begin
k:=k+1; writeln('n=');readln(n);
end for i:=1 to n do
else begin
begin writeln('a[',i,']=');
b[k]:=a[j]; readln(a[i]);
j:=j+1; end;
k:=k+1; divimp(1,n,a);
end; for i:=1 to n do
if i<=m then write(a[i]);
for j:=i to m do readln;
begin end.
b[k]:=a[j];
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);

297
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 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:
-se apeleaza poz;
-se apeleaza quick pentru li si k-1;
-se apeleaza quick pentru k+1 si ls.
Etapa 1)

298
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

299
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

300
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

301
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

302
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

303
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

304
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

305
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

306
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

307
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

308
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

309
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

si in final

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 Scrieti o functie care sa plaseze primul element din


{Fie a un vector cu n componente intregi vectorul a pe pozitia care acesta

310
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

ar ocupao fara sa ordonati vectorul in stinga sa fiind function divide (p,q:indice):indice;


plasate numai elemente mai mici decit el iar in var st,dr:indice;x:tipelement;
dreapta numai elemente mai mari decit el begin
Functia sa returneze pozitia pe care a fost plasat st:=p;dr:=q;x:=a[p];
primul element while st<dr do
OBS:cu metoda divide et impera(Quick sort) begin
ex:3 while (st<dr) and (a[dr]>=x) do dec(dr);
132 a[st]:=a[dr];
=>1 2 3 while (st<dr) and (a[dr]>=x) do dec(dr);

} a[st]:=a[dr];
const nmax=100;type indice=1..nmax; while (st<dr) and (a[st]<x) do inc(st);
tipelement=integer; a[dr]:=a[st];
var a:array[indice] of tipelement; end;
n:indice; a[st]:=x;divide:=st;
procedure citire; end;
var I:indice;
begin procedure rapida(p,q:indice);
writeln('n=');readln(n); var m:indice;
for i:=1 to n do begin
begin m:=divide(p,q);
writeln('a[',i,']='); if m-1>p then rapida(p,m-1);
readln(a[i]); if m+1 <q then rapida(m+1,q);
end;end; end;
procedure afisare; begin
var i:indice; citire;
begin rapida(1,n);
writeln('vectorul sortat este'); afisare;
for i:=1 to n do readln;
write(a[i]);writeln;readln; end.
end;

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)

311
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

312
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

313
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

314
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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;

315
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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.

PROGRAMARE DINAMICA(pentru Gradul II)


Alaturi de Greedy,programarea dinamica este o tehnica ce conduce, de cele mai
multe ori, la un timp de calcul polinomial.Mai mult, ea furnizeaza in totdeauna solutia
optima .Din nefericire, programarea dinamica nu se poate aplica tuturor problemelor, ci
numai care indeplinesc anumite conditii.
Se considera o problema in care rezultatul se obtine ca urmare a unui sir de decizii D1,
D2,......Dn. In urma decizei D1 sistemul evolueaza din starea S0 in starea S1,in urma
decizei D2 sistemul evolueaza din starea S1 in starea S2,....,in urma decizei Dn sistemul
evolueaza din starea Sn-1 in stareaSn.
Daca D1, D2,....Dn este un sir de decizii care comduce sistemul in mod optim din S0 in
Sn,atunci trebuie indeplinita una din conditiile urmatoare (principiul de optimalitate):
1)Dk...Dn este un sir de decizii ce conduce optim sistemul din starea Sk-1 in starea
Sn,Ak,1<=k<=n;
2)D1....Dk este un sir de decizii ce conduce optim sistemul din starea S0 in
stareaDk,Ak,1<=K<=;
3)Dk+1...Dn,D1...Dk sunt siruri de decizii care conduc optim sistemul starea Sk in starea
Sn, respectiv din starea D0 in starea Sk,Ak,1<=k<=n.
=>Daca principiulde optimalitate se verifica in forma 1,spunem ca se aplica programarea
dinamica metoda inainte.
=>Daca principul de oplimalitate se verifica in forma 2, spunem ca se aplica programarea
dinamica inapoi.
=>Daca primcipiul de optimalitate se verifica in forma 3, spunem ca se aplica programarea
dinamica metoda mixta.
Programarea dinamica se poate aplica problemelor la care optimul general implica optimul
partial.
Faptulca optimul general determina optimul partial, nu inseamna ca optimul partial determina
optimul general.
cu toate acestea, faptul ca potimul general impune optimul partial ne este de mare
ajutor:cautam optimul general,intre optimele partiale, pe care le retinem la fiecare
pas.Oricum,cautarea se reduce considerabil.
Problema triunghiului.Se considera un triunghi de numere naturale format din n
linii.Prima linie contine un numar,a doua doua numere,........ultims n numere naturale.Cu
ajutorul acestuoi triunghi se pot forma sume ne numer naturale in felul urmator:
-se porneste cu numarul din linia unu;

316
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

-succesorul unui numar se afla pe linia urmatoare plasat sub el(acees coloana) sau pe
diagonala la dreapta(coloana creste cu 1).
Care este cea mai mare suma care se poate forma astfel si care sunt numerele care o
alcatuiesc:
Exemplu:n=4;
2
3 5
6 3 4
5 6 1 4
Se pot forma mai multe sume:
S1=2+3+6+5=16;
S2=2+5+4+1=12;
Sk=2+3+6+6=17 (care sete[i suma maxim').
Saq observam ca se pot forma 2 la puterea n-1 sume de acest fel.A le lua in considerare pe
toate pentru a gasi valoarea maxima nu este eficient.
Pentru etapa i se trateza linia i a triunghiului.Fie un sir de n numere care respecta conditile
problemei si care formeaza suma maxima.In acest sir,consideram numarul care a fost preluat
de pe linia i.Numerele intre i+1 si n,formeaza o suma maxima in raport cu sumele care se pot
forma incepand cu nu,marul preluat de pe linia i,contrar,se contrazice ipoteza.In aceasta
situatie se poate aplica programarea dinamica,metoda inainte.

Vom forma un triunghi,de la baza catre varf,cu sumele maxime care se pot forma cu fiecare
numar.Daca am citit triunghiul de numere intr-o matrice T si calculam sumele intr-o matrice C
vom avea relatiile urmatoare:
C[n][1]:=T[n][1];
C[n][2]:=T[n][2];
C[n][n]:=T[n][n];
Pentru linia i (i<n), cele i sume maxime care se obtin aqstfel:
C[i][j]=max{T[i][j]+C[i+1][j],T[i][j]+C[i+1][j+1]},i apatine multimii {1,2,....,n-1) iar j apartine multimii
{1,.....,i}.
Sa rezolvam problema propusa ca exemplu:
Linia 4 a matricei C va fi linia n a matricei T:5 6 1 4;
Linia 3 se calculeaza astfel:
C[3][1]=max{6+5,6+6}=12;
C[3][2]=max{3+6,3+1}=9;
C[3][3]=max{4+1,4+4}=8;
Linia 2:
C[2][1]=max{3+12,3+9}=15;
C[2][3]=max{5+9,5+8}=14;
Linia 1
C[1][1]=max{2+15,2+14}=17.
Aceasta este si cea mai mare suma care se poate forma.
Pentru a tipari numerele luate in calcul se foloseste o matrice numita DRUM in care pentru
fiecare i apartinand multimii mai sus mentionate si j la fel apartinand multimii mentionate mai
sus se retine coloana in care se gaseste succesorul lui T[i][j].

{Fie un triunghi care are pe prima linie un numar pe a doua doua ....
Sa se calculeze cea mai mare dintre sumele ce aparpe drumurile ce pleaca
din virf si ajung la baza}
const dimmax=100;
type numar=0..9;
var c:array[1..dimmax,1..dimmax] of numar;
t,cc:array[1..dimmax,1..dimmax] of numar;
d,n,i,j:integer;
begin
writeln('cite linii avem in triunghi ');readln(n);

317
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to n do
for j:=1 to i do
begin
writeln('t[',i,',',j,' ]=');
readln(t[i,j]);
end;
for i:=1 to n do
begin
cc[n,j]:=j;
c[n,j]:=t[n,j];
end;
for i:=n-1 downto 1 do
for j:=1 to i do
if c[i+1,j]+t[i,j]>c[i+1,j+1]+t[i,j]
then
begin
cc[i,j]:=j;
c[i,j]:=c[i+1,j]+t[i,j];
end
else
begin
cc[i,j]:=j+1;
c[i,j]:=c[i+1,j+1]+t[i,j] ;
end;
writeln('suma este ',c[1,1]);
d:=cc[1,1];
writeln(1);
for i:=1 to n-1 do
begin
writeln(cc[i,d]);
d:=cc[i,d];
end;
readln;
end.

Subsir crescator de lungime maxima.Se considera un ve ctor cu n elementeintregi.Se cere


sa se tipareasca cel mai lung subsir crescator al acestuia.
Exemplu:Pentru n=5 se da V=(4,1,7,6,7).In acest caz subsirul tiparit va fi :4,7,7.
Problema se poate rezolva pornind de la idee a de a calcula ,pentru fiecare element al
vectorului lungimea celui mai lung subsir crescator care se poate forma incepand cu el.In final
este selectat elementul din vector cu care se poate forma cel mai lung subsir crescator si
acesta este listat,
L(k)={1+max L{i}/V{i}>=V(k). i apartine multimii {k+1,...,n} iar k apatrtine multimii {1,2,....,n}.
In practica,folosim un vector L cu n componente,unde L(k) are semnificatia explicata.Pentru
examenul nostru vom avea:
L=(3,3,2,2,1).
Componentele vectorului L au fost calculate astfel:
-cel mai lung subsir care se poate forma cu elementul 7,aflat pe ultima pozitie,are lungimea 1;
-cel mai lung subsir care se poate forma cu elementul 6 aflat pe pozitia 4 are lungimea
(1+L(5)), pentru ca pe pozitia 5se gaseste elementul 7 care este mai mare decat 6;
-cel mai lung subsir care se poate forma cu elementul aflat pe pozitia 3 are lungimea2(1+L(5))
pentru ca 7 este egal cu 7;
-algoritmul continua in acest mod pana se completeazaL(1).
Dupa aceasta se calculeaza maximul dintre componentele luiL,iar cel mai lung subsir
crescator format din elementele vectoruluiV vaavea lungimea data pe acest maxim. Pentru a
lista efectiv acel subsir de lungime maximala se procedeaza astfel:
-se cauta mazimul din vectorulL precum si indicele t,la care se gaseste acest maxim;

318
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

-se afiseazaV(t);
-se gaseste si se listeaza primul element care este mai mare sau egel cu V(t) si are lungimea
mai mica cu 1(max-1), se actualizeaza valoarea max cu max-1;
-algoritmul continua pana cand se epuizaza toate elementele subsirului.

{Sa se calculeze cit e lungimea unui subsir crescator al unui sir initial
in cazul in care este maxima}
var v:array[0..20] of integer;
n,i:integer;
function lungime(k:integer):integer;
var max,i:integer;
begin
if k=n then lungime:=1 else
begin
max:=0;
for i:=K+1 to n do
if (max<lungime(i)) and (v[i]>=v[k]) then
max:=lungime(i);
Lungime:=max+1;
end;
end;
begin
write('cite elemente are sirul ');readln(n);
v[0]:=0;
for i:=1 to n do
begin
writeln('v[',i,']=');
readln(v[i]);
end;
writeln(' lungimea maxima este ',lungime(0)-1);
readln;
end.

Inmultirea optima a unui sir de matrice


Presupunem ca avem inmultiti doua matrice:An,p cu Bp,m.In mod evident, rezultatul
va fi o matrice Cn,m.Se pune problema de a afla cate inmultiri au fost facute pentru a obtine
matricea C. Prin inmultirea liniei 1 cu coloana 1 se fac p inmultiri, intrucat au p elemente. Dar
linia 1 se inmulteste cu toate cele m coloane, deci se fac m*p inmultiri.In mod analog se
procedeaza cu toate cele n linii ale matricei A,deci se fac n*m*p inmultiri.Retinem acest
rezultat.

Sa consideram produsul de matrice A1xA2x....xAn (A1(d1,d2),A2(d2,d3)...,An(dn,dn+1)).Se


cunoaste ca legea de compozitie produs de matrice nu este comutativa in schimb este
asociativa.De exemplu ,daca avem de inmultit trei m atrice A,B,C produsul se poate face in
doua moduri:(AxB) xC; Ax(BxC).Este interesant de observat ca nu este indiferent modul de
inmultire a celor n matrice.Sa considera ca avem de inmultit patru matrice
A1(10,1),A2(1,10),A3(10,1),A4(1,10).
Pentru inmultirea lui A1 cu A2 se fac 100 de inmultiri si se obtine o matrice cu 10 lini si 10
coloane.Prin inmul tirea acesteia cu A3 se fac 100 de inmultiri si se obtine o matrice cu 10 linii
si o coloana.daca aceasta matrice se inmulteste cu A4 se fac 100 inmultiri. In concluzie, daca
acest produs se efectueaza in ordine naturala,se efectueaza 300 inmultiri.
Sa efectuam acelas produs in ordinea care rezulta din expresia A1x((A2XA3) x A4).Efectuand
produsul A2 cu A3 se efectueaza 10 inmultiri si se obtine o matrice cu o linie si cu o
coloana.aceasta matrice se inmulteste cu A4 se fac 10 inmultiri si se obtine o matrice cu 1 linie

319
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

si 10 coloane.Daca o inmultim pe aceasta cu prima, efectuam 100 inmtltiri , obtinand rezultatul


final cu numai 120 de inmultiri.
In concluzie,apare o problema foarte interesanta si anume de a afla modul in care trebuie sa
se inmulteasca cele n matrice,astfel incat nr de inmultiri sa fie minim.Pt rezolvare vim aplica
principiul 3 al programari dinamice.

In vederea rezolvari problemei,retinem o matrice A cu n linii si n coloane.Elementul A(i,j)


i<j,reprzinta nr minim de inmultiri pt efectuarea produsului AixAi+1x....xAj.De asemenea,nr
liniilor si al coloanelor celor n matrice sunt retinute intrun vector DIM cu n+1 componente.Pt
exemplu nostru DIM retine urmatoarele valori:10,1,10,1,10.
Pt rezolvare se tine cont de urmatoarele relatii existente intre cimponentele matricei A:
1)A(i,i)=0;
2)A(i,i+1)=DIM(i)xDIM(i+1)xDIM(i+2);
3)A(i,j)=min{A(i,k)+A(k+1,j)+DIM(i)xDIM(k+1)xDIM(j+1)}.
i<=k<j
Justificarea acestor relati este urmatoarea:
1)o matrice nu se inmulteste cu ea insasi,deci se efectueaza 0 inmultiri;
2)liniile si coloanele matricei A1 se gasesc in vectorul DIM pe pozitiile i si i+1, iar ale matricei
Ai+1-pe pozitiile i+1 si i+2;
3)
-inmultind matriceleAi x Ai+1 x Ak se obtine o matrice cu un nr de linii egal cu acela al matricei
Ai (DIM(i)) si cu un nr de coloane egal cu acela al matricei Ak (DIM(k+1));
-inmultind matricele Ak+1 x.....x Aj se obtine o matrice cu un nr de linii egal cu acela al
matricei Ak+1 (DIM(k+1)) si cu un nr de coloane egal cu acela al matricei Aj (DIM(j+1));
-prin inmultirea celor doua matrice se obtine matricea rezultat al inmultirii Aix....xAj, iar pt
aceasta inmultire de matrice se efectueaza DIM(i) xDIM(k+1) xDIM(j+1) inmultiri;
~Relatia sintetizeaza faptul ca pt a obtine nr de inmultiri optim pt produsul Aix....xAj se
inmultesc doua matrice, una obtinuta ca produs optim intre Aix....xAk si cealalalta obtinuta ca
produs optim intre Ak+1x....xAj, in ipoteza in care cunoastem nr de inmultiri necesar efectuarii
acestor doua produse orucare ar fi k, cuprins intre limitele date.
~Aceasta observatie este o consecinta directra a programarii dinamice si anume ca produsul
efectuat optim intre matricele prezentate se reduce in ultima istanta la a efectua un produs
intre 2 matrice cu conditia ca acestea sa fie calculate optim(produsul lor sa aiba un numar
minim de inmultit).
Se pune problema cum putem efectua acest calcul utilizand relatiile prezentate.Pentru
exemplificare vom utiliza exemplul dat la inceputul acestui capitol.Datorita relatiei 1, diagonala
pricipala a maricei A( cu 4 lini si 4 coloane) va fi alcatuita numai din elemente avand valoarea
0. s
Initial se pot calcula numai elemente A(i,i+1),adica A(1,2),A(2,3),A(3,4)-elemente situate pe o
paralela la digonala principala a matricei A.Este cazul sa observam ca portiunea din matrice
situata sub diagonala principala este neeutilizata.In concluzie,avem
A(1,2)=100,A(2,3)=10,A(3,4)=100.Matricea A va arata astfel:

0 100 x x
x 0 10 x
A= x x 0 100
x x x 0

In continuare calculam:
A(1,3)=min{A(1,k)
+A(k+1,3)+DIM(1)*DIM(k+1)*DIM(4)}=min{0+10+10*1*1,100+0+10*10*1}=20;
A(2,4)=min{A(2,k)
+A(k+1,4)+DIM(2)*DIM(k+1)*DIM(5)}=min{0+100+1*10*10,10+0+1*1*10}=20;
A(1,4)=min{A(1,k)
+A(k+1,4)+DIM(1)*DIM(K+1)*DIM(5)}=min{0+20+10*1*10,100+100+10*10,20+0+10*1*10}=12

320
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

0;

.
0 100 20 120
x 0 10 20
A= x x 0 100
x x x 0
In concluzie,pt. exemplul nostru, se fac minim 120 de inmultiri,rezultat luat din matricea A si
anume A(1,4).

{Prin programare dinamica sa se determine numarul minim de inmultiri care sa se faca


cind se dau dimensiunile matricelor
ex:n=4
10 1 10 1 10}

program inm_optima;
const nmax=20;
type vector=array[1..nmax] of word;
tabl=array[1..nmax,1..nmax] of word;
var p:vector;
m:tabl;n,i,j,k,imin:integer;min,v:word;
procedure paranteze(i,j:integer);
var k:integer;
begin
if i<j then begin
k:=m[j,i];
if i<>k then begin
write('(');
paranteze(i,k);
write(')');
end
else paranteze(i,k);
write('x');
if k+1<>j then begin
write('(');
paranteze(k+1,j);
write(')')
end
else paranteze(k+1,j);
end
else write('A',i)
end;
begin
write('Nr. de matrici:');
readln(n);
writeln('Dimensiuni matricelor:');
for i:=1 to n+1 do read(p[i]);
for i:=n downto 1 do
for j:=i+1 to n do
begin
min:=m[i,i]+m[i+1,j]+p[i]*p[i+1]*p[j+1];
imin:=i;
for k:=i+1 to j-1 do
begin
v:=m[i,k]+m[k+1,j]+p[i]*p[k+1]*p[j+1];
if min>v then begin
min:=v;

321
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

imin:=k
end;
end;
m[i,j]:=min;
m[j,i]:=imin;
end;
writeln('Numarul minim de inmultiri este:',m[1,n]);
writeln('Aceasta se obtine pentru urmatoarea ordine a inmultirilor');
paranteze(1,n);
readln;
end.
6.Implementarea metodelor numerice
6.2 Rezolvarea sistemelor de ecuatii
liniare

6.2.1 Metoda Jacobi


Fie sistemul A x=b ,n ecuatii cu n necunoscute , compatibil determinat A=aij € Mn (R)
B=bi.
Fie

( )
a11……………..0

( )
. . . 0……………0
N=D= , L= a12 .
. . . . .
. . .
0……….....ann an1……..ann-1.0

)
0 a12…………a1n

(
. . .
R= . . .
. an-1n
0………………0

P=N-A=-(L+R)=>A=N-P
Ax=b => Nx(K+1)=Px (K) +b , dorind sa aploximam solutia sistemului printr-un
termen al lui x^k.

X(k+1)=N -1 * P * x(k)+N -1 *b deci xi (k+1) =1/aii *(bi- ∑a x ij j (k)


) ,i=1..n, k€N.
J=1
J<>i

OBS :

( ) -( )
A=L+D+R a11……………..0 a11……………..a1n
P=N-A= . . . . . .
. . .
. . . . . .
. . . an1……….....ann
0……….....ann
-(aij) , j<>i
=
aii=0

Fie G=N -1 *P=D-1*(L+R)

G=N -1 *(N-A)=N -1 *N- N -1 * A rezulta gij=√ij - aij/aii , i,j=1,n


OBS :

322
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

X (k+1) =N -1 *P*x (k) +N -1 *b, G, ma intereseaza norma lui si pun conditiile |g ij|<1 rezulta
n
∑aij >1 <= >∑|aii/aij|<1 = >||G||=max ∑|gij|=max ∑|aij/aii|<1
=>|aij|/
j=1 j=1 1≤i≤n ; j=1 j=1
j<>i j<>i j<>i

p→∞
Cum||G||<1=>||G||p 0

||x (m+1) -x (m) ||=||G(x (m) -x (m-1) ||=…=||G (m) || || (x (1) -x(0) )||
si deci cum
||x (k+p) -x (k) ||=|x (k+p) -x (k+p-1) +x (k+p-1) -x (k+p-2) +...-x (k) ||≤
≤||x (k+p) -x (k+p-1) ||+||x (k+p-1) -x (k+p-2) ||+...+)||+||x (k+p-1) -x (k+p-2) ||+...+||x (k+1) -
-x ( k) || ≤||G|| k+p-1 *||x (1) -x^ (0) ||+...||G|| k *||x (-1) -x (0) ||=
=(||G|| k+p-1 +...||G|| k )*||x (1) -x (0) ||=||G|| k *(1-||G|| p /(1-||G||)*||x (1) -x (0) ||
deci , cand p→∞ ||x (k+p) -x (k) || ≤ ||G|| (k) * (1-||G|| (p) )/1-||G||) * ||x (1) -x (0) || rezulta
||x-x (k) ||<||G|| k * 1 / (1-||G||)*||x (1 ) -x (0) ||

PROGRAM JACOBI ;
Const max=10 ;
Type vector=array[1..10] of real;
Var x,b:vector; a:array[1..10,1..10]of real;
n,i:integer;
function rezolva (nit:integer :boolean;
var y:vector;c,j,k:integer; v:real; g:boolean;
function ZERO:Boolean;
var L,m:integer ; t:real;
begin
zero:=false;
L:=j;
While (l<n) and (a[I,j]=0 do L:=L+1
If (a[L,j]<>0 then zero:=true;
end;

begin
g:=true;i:=0;
repeat
for j:=1 to n do
if zero and g then
begin
y[j]:=x[j];v:=0;
for k:=1 to n do
if j<>k thenn v:=v +a[i,k]*y[k];
x[j]:=(=b[j]-v)/a[I,j]);
end
else g:=false;
v:=0;
i:=i+1;
for k:=1 to n do
v:=v + sqr(x[k]-y[k]);
until (sqrt(v),1.e-6) or (i>nit) or not g;
end;
rezolva:=g and (i<= nit);
end;
begin
citesc pe n, a[i,j], b[i]

323
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to n do x[i]:=1;


if NOT rezolva (200) then writeln (‘incompatibil’)
else
begin writeln(‘solutia sistemului este’)
write(‘x=c’);
for i:=1 to n-1 do write (x[i]);
end;
end.

6.2.2 Metode directe de rezolvare a sistemelor de ecuatii liniare


(GAUSS)
Ax=b , A€R (nxn) , b €r^n
Etapa1)triangularizarea marticei asociate sistemului (sub diagonala principala am 0)
Etapa2)rezolvam sistemul asociat matrice rerultate

ETAPA1
Triangulizarea se face la randul ei intr-un numar finit de etape optinand de sirul martice
( 1) (2) (n)
A =A,A ,...,A unde

( )
(k) (k) (k) (k) (k)
a11 a12…………….a1 k-1 a 1 k………………….a 1n
(k) (k) (k) (k)
0 a22…… ……....a 2 k-1 a 2 k…………………..a 2 n
………………………………………………………………………….
A= (k) (k) (k)
( k)
0 0………….ak-1k-1 ak-1k………………….ak-1n
akk≠0 (k) (k)
0 0……………..0 akk …………………….akn
…………………………………………………………………………
(k) (k)
0 0……………..0 ank…………………….ann

( )
1 0………0 0…………0
0 1………0 0…………0
Fie M= ……………………….………..
0 0………-mk+1 k 1…………0
………………………………..
0 0………-mn k 0…………1

(k) (k)
Mik=aik/akk , k+1≤i≤n
(k+1) (k)
A =Mk * A

(K+1) (k)
aij = aij ,1≤j≤n ,i≤j≤n =>primele k linii raman necunoscute in matrice
0 ,i≤j≤k , j+1≤i≤n=>primele j coloane de sub diagonala principala sub zero
(k) (k) (k) (k) (k) (k) (k) (k) (k) (k) (k)
aij -mik * akj = aij-aik / akk* akj=(aij * akk- akk * aik)/akk , i≥k+1

j≤n

324
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

j>i≥k+1
elementele situate in liniile
si coloanele k+1,k+2,k+3
….n se schimba dupa regula
dreptunghiului
(k) (k)
k……akk………akj………….
(k) (k)
i…….aik………aij…………..

( )
1 -1 2
2 1 1 (1) (1) (1) (1)
A= 1 2 -1 ,A=A , a 11=1 , m2 1=(a2 1)/a11=2/1=2
(1)
m31=a31=1/1=1

ETAPA2 forma matricei : diagonale care se va obtine va arata astfel :

c1

( ) ( )
r11 r12 r13…….r1n .
0 r22 r23………..r2n .
R= ………………………… ,,, ,termenii liberi c = .
0 0 0………….rnn .
.
cn

( )
Y1
Sistemul devine Ry=c ,y= .
.
.
OBS : yn

R se obtine din prelucrarea matricei extrase (A,b) unde coloana n+1 care este ocupata de b sei
prelucreaza la fel ca celelalte componente.
Vectorul de solutii finale ale sistemului adica y se obtine dupa formele :
-yn=c / rnn
n
-yi=(ci - ∑ r ik * y k)/r ii, i=n-1,n-2,...,1.
k=i+1

Program Paranormal ;
Type matrice=array[1..10,1..10] of real ;
Var a:matrice;
b,x:vector;
i,iv,j,k,l:integer;
temp:real;
t:boolean;
BEGIN
Citesc pe n,aij,bi
For j:1 to n-1 do begin
iv:=j;
t:=true;
while (iv<=n) and t do
if a[iv,j]=0 then iv:=iv+1
else t:=false;
if t then begin
writeln(‘determinatul sistemului nul’);

325
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end;
if (j<>iv) then begin
for k:=j to ndo begin
temp:=a[j,k];
a[[j,k]:=a[iv,k];
a[iv,k]:=Temp;
end;
temp:=b[j];
b[j]:=b[iv];
b[iv]:=temp;
end;
for l:=j+1 to n do begin
for k:=j+1 to n do
a[l,k]:=a[l,k]-a[j,k]*a[l,j]/a[j,j];
b[l]:=b[l]-b[j]*a[l,j]/z[j,j];
end;
end;
if a[n,n]=0 then begin
writeln)’determinantul principal nul’);
exit;
end;
x[n]:=b[n]/a[n,n];
for i:=n-1 downto 1do begin
temp:=b[i];
for j:=i+1 to n do temp:=temp-a[I,j]*x[j];
x[i]:=temp/a[i,i];
nd;
for i:=1 to n do
writeln(x[i]);
readln;
end.

6.1 Rezolvarea ecuatiilor transcendente si algebrice


Ecuatiile algebrice sunt de forma
n n-1
a0 x +a1 x +…+an-1 x + an=0, ai€R

Fie P un polinom si polinoamele :


1
P0=P,P1=P,...,PK-1=PK-1*QK-PK+1.1≤k≤m-1,Pk+1este restul impartirii lui Pk-1 la Pk cu semn schimbat.
DEFINITIE :Sunt P0,P1,...,Pm se numeste sirul lui Sturm.
N(c)=numarul variatiilor de semn pentru x=c din sirul lui Sturm ,elementele nule fiind eliminate.
TEOREMA
Fie a,b ,din R,a<b.Daca Pm are radacini multiple si a,b nu sunt radacini ale plinomului P, atunci numarul
radacinilor ecuatiei P(x)=0 situate in intervalul (a,) este N(a)-N(b).

Fie N-numarul variatiilor de semn din subsirul obtinut prin eliminarea elementelor nule
N-numarul variatiilor de semn din subsirul obtinut prin inlocuirea elementelor nule dupa
algoritmul :
Ck-1≠, Ck=Ck+1=...=Ck+L-1=0,Ck+L≠0
Inlocuit cu
l+i
C* k+i=(-1) sgn(Ck+l),i€[0,L-1];
Teorema Budan Founci,a<b€R,care nu sunt radacini ale lui P .
,Numarul radacinilor reale ale lui P din intervalul (a,b) este N(a)- N(b) sau interior acestuia cu un numar
par .

326
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

APROXIMAREA FUNCTIILOR PRIN INTERPOLARE

DEFINITIE
 
Se numeste polinom de interpolare al functiei f pe nodurile x1,...xn, un polinom P cu
proprietatile :gr(p)≤n-1,p(xi)=yi,1≤i≤n unde f :[a,b]→R, f(xi)=yi ,xi€[a,b],1≤i≤n.

Teorema : Polinomul de interpolare al functiei f pe nodurile x1,..,xn exista si este unic.


Demonstrati :
x x
Gr(p) ≤n-1, p(x)=a0+a1 +...+an-1 n-1, p(xi)=yi,1≤i≤n
Sistemul n ecuatii cu n necunoscute ai ,1≤i≤n, ai unuc determinanti neomogen cu

n-1
1 x1......x1
D= .................. =∏(xi-xj)≠0,1≤j≤i≤n are solutii unice
n-1
1 xn.......xn n-1

n-1 n-1
a0+a1 xk+…an-1 * xk =f(xk) a0+a1 xk+…+an-1 xk +an f(xn)=0
n-1 n-1
a0+a1 x +…+an-1 * x =P(x) a0+a1 x+…+an-1 x +an-1 P(x)=0

system liniar omogen ,an≠0 are n+1 ecuatii si n+1 necunoscute =>determinantul e nul.

n- 1 n-1 n-1
1 x1…..x1 f(x1) 1 x1.....x1 0 1 x 1.....x1 f(x1)
n-1 ................................ ...............................
1 x2…...x2 f(x2) n-1 n-1
……………….. =0 1 xn......xn 0 + 1 xn.....xn f(xn) =0
n-1 n-1 n-1
1 xn……xn f(xn) 1 x......x P(x) 1 x .......x 0
n-1
1 x……x P(x)

n-1 n-1
1 x1......x1 1 x1......x1 f(x1)
P(x)* ..................... + .................... =0 => p(x)=D2/D1.
n-1 n-1
1 xn.......xn 1 xn.......xn f(xn)
n-1
1 x.......x 0

D1
D2

327
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Interpolare Langrange

Fie gk 1≤k≤n polinoame de gradul n-1 pentru care g k(xk)=1,gk(xi)=0,1≤k≤n,i≠k


N n

gk(x)=C ∏(x-xi)== ∏(x-xi)/(xk-xi),1≤l≤n


i=1 i=1
i≠k i≠k
n n n

Fie Ln(x)= ∑f(xk)g (x),Ln9xi)= ∑f(xk)*g (xi)= ∑f(xk)* ∂ xi=f(xi)


k k

polinom de interpolare Lagrange


n n
Ln(x)= ∑f(xk)* ∏(x-xi)/(xk-xi)
K=1 i=1

ω(x)= ∏(x-xi)
j=1

program lagrange;
type sir=array[1..100] of real;
var fx,vp,bk:real;
x,y:sir;
n,I,j,m:integer;
begin
readln(n);
n:=n+1;
readln(fx);
for i:=1 to n do
begin
readnl(x[i],y[i]);end;
for i:=1 to n do
begin
bk:=1;
for j:=1 to n do
if i<>j then
bk:=bk *(fx-x[i])/(x[j]-x[i]);
vp:=vp+b[k]*y[i];
end;
write(vp);
end.
Interpolare Newton
Stiu
F<x1,…xn>=(f<X1,…,X m-1>-< f<X2,…,X m>)/(X1-Xm)
P(x)=f(X1)+f(x1,x2) * (x-x1)+…
Program newton;
Var x,y:array[1..100] of integer;
S:real;
Xx,I,j,m:integer;
Begin
Readln(m);
For i:=1 to m do

328
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Read(x[i],y[i]);
For j:=1 to m-1 do
For i:=m downto j+1 do
Y[i]:=(y[i-1]-y[i])/(x[i-j]-x[i]);
For j:=0 to m do
Begin
S:=y[m];
For i:=y[i]+(j-x[i]) *s;
Write(s);
End.

METODA BISECTIEI
(INJUMATATIRII),COARDEI,TANGENTEI
METODA INJUMATATIRII

TEOREMA LUI DARBOUX:fie I un interval,f:IR,apre proprietatea


lui Darboux pe intervalul I daca oricare ar fi x1<x2 din intervalul
I,oricare ar fi c din intervalul (f(x1),f(x2)),exista cel putin un
punct x din intevalul (x1,x2) astfel incat f(x)=c
Orice functie continua are proprietatea lui Darboux
F:[a,b]R ,f(x)=0,f continua cu f(a)<0 si f(b)>0.Fie c=(a+b)/2
Definim
-daca f( c )>0 atunci
a1=a
b1=c
sau
-daca f( c )<0 atunci
a1=c
b1=b
Analog construiesc
F:[a1,b1]R, f continua cu f(a1)<0 si f(b1)>0, c1=(a1+b1)/2

Deci cream niste siruri date prin
a0=a,b0=b, c0=(a0+b0)/2
pentru n>0
-daca f( cn )>0 atunci
an=cn-1

329
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

bn=bn-1
sau
-daca f( cn )<0 atunci
an=an-1
bn=cn-1
unde cn=( an + bn)/2
oricare ar fi m>=n daca f( cn )=0 atunci
am=an-1 bm=bn-1 cm=cn-1

siruri convergente
an -->a bn -->b cn -->c
METODA COARDEI

F:[a,b]R ,f(x)=0,f continua cu f(a)<0 si f(b)>0.Fie c=(a+b)/2


Scriem dreapta care trece prin (a,f(a),(b,f(b))

((y-f(a) )/( f(b)-f(a)=( x-a)) / (b-a)


Ca sa intersecteze OX avem y=0 rezulta

Prin notatia x=c ca avem c=( a*f(b)-b*f(a))/(f(b)-f(a))


Deci construim
A0=a,b0=b, c0=( a0*f(b0)-b0*f(a0))/(f(b0)-f(a0))
Pentru n>0
-daca f( cn-1 )>0 atunci
an=cn-1
bn=bn-1
sau
-daca f( cn-1 )<0 atunci
an=an-1
bn=cn-1
unde cn= cn =( an *f(bn)- bn *f(an))/(f(bn)-f(an))
oricare ar fi m>=n daca f( cn )=0 atunci
am=an-1 bm=bn-1 cm=cn-1

siruri convergente
an -->a bn -->b cn -->c

330
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

METODA TANGENTEI(NEWTON)

f(x)=0,f ( z-r,z+r)R,exista a>0,b>0 si |f’(x)|>=a, |f’(x)|>=a,x


apartine de I ,f de doua ori derivabila
Tangenta in (xn ,f(xn ) ) este xn+1 = xn + f(xn )/f’(xn )
Pentru ca:
y-f( xn ) =f’( ‫() ع‬x- xn )
cum y=0  xn -x= f(xn )/f’(xn )  x = xn+1 + f(xn )/f’(xn )
{Folosind parametrii de tip functie si procedura sa se rezolve o
ecuatie
prin metoda injumatatirii,tangentei si coardei pe un interval dat}
{$f+}
type functie=function(x:real):real;
procedura=procedure(var a,b,x,y:real;f:functie);
var car:char; a,b:real;
function f(x:real):real;
begin
f:=sin(x)-x;end;
procedure injumat(var a,b,x,y:real;f:functie);
begin
x:=(a+b)/2;y:=f(x);end;
procedure coarda(var a,b,x,y:real;f:functie);
begin

x:=a-(b-a)/(f(b)-f(a))*f(a);y:=f(x);end;
procedure tangenta(var a,b,x,y:real;f:functie);
function derivata(f:functie;x0:real):real;
const h=1.e-6;
begin
derivata:=(f(x0+h)-f(x0))/h;end;
begin
x:=x-f(x)/derivata(f,x);y:=f(x);
end;
procedure radacina(f:functie;p:procedura);
const eps=1.e-10;
var epsa,b,x,y:real;i:integer;
begin
write('inceputul intervalui a=');readln(a);
write('sfirsitul intervalui b=');readln(b);
i:=0;
repeat
p(a,b,x,y,f);i:=i+1;
if (f(a)<0)=(y<0) then a:=x else b:=x;
until (abs(a-b)<eps) or (y=0) or (i>200);

331
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if i>200 then write('solutia nu afost gasita in 200 de pasi')


else
writeln('solutia ',x:12:7);
end;
begin
writeln('alegeti metoda de rezolvare a ecuatiei ');
write('a=metoda injumatairii intervalului ');
write('b=metoda coardei ');
write('c=metoda tangentei ');
writeln;
write('optiunea');readln(car);
case car of
'a':radacina(f,injumat);
'b':radacina(f,coarda);
'c':radacina(f,tangenta);
else
writeln('varianta eronata ');
end;
readln;
end.

METODE DE CALCUL A INTEGRALELOR(PENTRU


GRADUL II)
{Cu functii pe intervalul[0,1] calculam cu metoda trapezelor,metoda
simpson
si metoda recurenta, integrala din functia f(x,m)=(e^-x)*(x-1)^m}
var m,n,i,semn,k:integer;
a,b,h,sum,integr,s1,s2:real;
function f(x:real):real;
var prod:real;
k:integer;
begin
prod:=1;
for k:=1 to m do
prod:=prod*(x-1);
f:=exp(-x)*prod;
end;
begin
write('dati parametrul functiei m=');
readln(m);
write('cate subintervale aveti m=');
readln(n);
a:=0;
b:=1;
h:=(b-a)/n;
sum:=0;
for i:=1 to n-1 do
sum:=sum+f(i*h);
integr:=h*(0.5*(f(a)+f(b))+sum);
writeln('integrala PRIN METODA TRAPEZELOR este ',integr:20:11);
writeln('prin metoda simpson avem integrala ');
if odd(n) then n:=n+1;
s1:=0;
s2:=0;
for i:=1 to n do begin
if i mod 2=0 then s1:=s1+f(i*h) else s2:=s2+f(i*h);
end;
integr:=h*(f(a)+4*s1+2*s2-f(b))/3;
writeln(integr:20:11);
integr:=1-exp(-1);

332
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

semn:=1;
for k:=1 to m do begin
semn:=-semn;
integr:=semn+k*integr;
end;
writeln('recurent integrala este ',integr:20:11);
readln;
end.
{Sa se caculeze prin formula trapezelor o integrala dintr-o functie}
{$f+}
type ff=function(x:real):real;
var a,b,int:real;n:integer;
function f1(x:real):real;
begin
f1:=sin(ln(x))/x;
end;
procedure tr(a,b:real;f:ff;n:integer;var s:real);
var h:real;i:integer;
begin
h:=(b-a)/n;
s:=(f(a)+f(b))/2;
for i:=1 to n-1 do
s:=s+f(a+i*h);
s:=s*h;
end;
begin
write('a=');readln(a); write('b=');readln(b);write('n=');readln(n);
tr(a,b,f1,n,int);
writeln('integrala este ',int:8:2);
readln;
end.

{Cu functii sa se caculeze pe intervalul [0,pi/2] integrala din


f(x)=(sin(x))^m
cu metoda Simpson}
const n=100;
h:real=1/100;
function ss(m:integer;x:real):real;
var re,si:real;i:integer;
begin
si:=sin(x);
if m=0 then
si:=1
else
if m>0 then
begin
re:=1;
for i:=1 to m do
re:=re*si;
ss:=re
end
else
begin
re:=1;
for i:=m to -1 do
re:=re/si;
ss:=re;
end;
end;
function sim(m:integer):real;
var i:1..n;

333
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

s1,s2:real;
begin
s1:=0;
s2:=0;
for i:=1 to n div 2 do
begin
s1:=s1+ss(m,(2*i-1)*h);
s2:=s2+ss(m ,2*i*h);end;
sim:=h/3*(ss(m,0)-ss(m,pi/2)+4*s1+2*s2);
end;
var m:integer;
begin
write(' m=');
readln(m);
writeln(' integrala este ',sim(m):20:11);
readln;
end.

7.Alocare dinamica
7.1 Tipuri specifice alocarii dinamice a memoriei
Memoria interna poate fi privita ca o succesiune de octeti.Numarul de ordine al unui octet se
numeste adresa lui.Adresa unei variabile nu trebuie confundata cu valoarea pe care aceasta o
memoreaza.
Definitie: Adresa primului octet al variabilei se numeste adresa variabilei.
Adresele variabilelor se memoreaza cu ajutorul variabilelor de tip pointer.
Notiunea de variabila dinamica

Ati invatat inca din clasa a IX-a ca o variabila este o entitate caracterizata prin trei
atribute:tip, valoare si adresa .Primele doua
atribute au fost foarte des intalnite pana acum.Atributul adresa va face obiectul notiunilor in acest
capitol.
Pentru inceput ,consideram un exemplu foarte simplu , o variabila x de tipul integer.Declaratia ei
va este cunoscuta:
var x: integer;

Variabila x de mai sus se numeste variabila statica. O variabila statica se caracterizeaza prin
faptul ca in momentul declarari ,
compilatorul ii un anumit spatiu de memorie. Marimea spatiului rezervat unei variabile depinde de tipul
acesteia . De exemplu ,pentru
o variabila de tipul integer se aloca 2 octeti, pentru una de tipul real 6 octeti .
Variabila x se numeste “pointer catre un intreg” sau”referinta catre un intreg”.Fireste ca tipul de
date al variabilei x nu va mai
fi integer ci ,un tip de date nou , numit “tipul pointer catre un intreg” sau “tipul referinta catre un
intreg “, notat integer .
Declaratia necesara este: var x:^integer:Pe scurt vom spune ca x este un pointer catre un
intreg.Caracterul “ ^ ” se numeste operatorul
De adresare “sageata”.

Tipurile de date “pointer catre ….” sunt anonime .Un tip pointer poate fi insa denumit ,ca
orice tip anonim, cu cuvantul cheie type.
Exemplu :
Pentru a declare trei pointeri catre numere reale ,putem scrie: var x,y,z:^real;

334
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Alocarea si eliberarea dinamica a memoriei

Fie urmatoarea declaratie a tipului “pointer catre intreg ” : type pint=^integer ;


Alocarea memoriei pentru o variabila dinamica , sau pe scurt alocarea dinamica a memoriei , se
realizeaza in program ,in
momentul utilizarii variabilei .Pentru aceasta folosim procedura new, care are doua forme:
new (<pointer>)
<pointer>:=new(<tip>);
unde: - <pointer>→numele (identificatorului) pointerului ;
- <tip>→ tipul pointerului;
Pentru eliberarea memoriei alocate unei variabile dinamice ,apelam procedura dispose , cu
sintaxa:
dispose(<pointer>);

Exemplu:
Memoria alocata anterior pentru variabila dinamica x^ alocata anterior, poate fi eliberata cu
dispose(x);

Pointerul NIL

In general ,un poiter contine adresa unei variabile dinamice ,mai exact adresa zonei de
mrmorie unde este depozitata valoarea
variabilei dinamice. Este insa posibil ca in timpul executiei unui program ,un pointer sa primeasca
drept valoare adresa unei locatii
de memorie “goala” ,in care nu se gaseste nici o valoare. In acest caz vom spune ca pointerul este “in
vant” si ca valoarea sa este NIL.
Acest NIL reprezinta de fapt o constanta predefinita a limbajului cu sens de “nimic”
(nul) ,si poate fi atribuit numai variabilelor
de un tip pointer.

Atribuiri de pointeri

Un pointer poate fi atribuit altui pointer ,printr-o instructiune de genul


<dest> :=<sursa>,unde <sursa> si <dest> sunt pointeri de
acelasi tip . Astfel, pointerul <dest> va primi ca valoare adresa memorata in pointerul <sursa>.Cu alte
cuvinte ,cei doi pointeri vor adresa aceeasi locatie de memorie , motiv pentru care are loc automat si
atribuire intre valorilereferite de pointeri: <dest>^:=<sursa>^. Nu este necesara
alocarea alocarea memoriei pentru pointerul destinatie <dest>, aceasta avand loc automat in urma
atribuirii de pointeri.

Transmiterea pointerilor ca parametri

Un pointer poate fi transmis ca parametru unei proceduri sau functii, dar pentru aceasta este
obligatoriu sa denumim tipul anonim al
pointerului respectiv (stim ca in antetul unui subprogram nu putem folosi tipuri anonime).
Exemplu :
Ne propunem sa declaram o procedura P care sa primeasca drept parametri doi pointeri x si y
catre intreg. Asadar x si y vor fi de
tipul ^ integer.
Este incorect sa scriem antetul procedurii astfel :
procedure P(x,y:^ integer);
Trebuie sa denumim tipul ^integer dandu-I de exemplu numele pint ;

335
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

type pint =^integer;


Acum putem scrie antetul procedurii in felul urmator :
procedure P(x,y :pint);

TIPUL DE DATE POINTER

Type nume_pointer= ^ tip;


Var v:nume_pointer;
Exemplu:
Type adr=^integer;
Var a1,a2:adr;
Begin
a1:=a2;
End.

Adresa pentru tipul pointer


Var x:integer;
A:^integer;
Begin
X:=10;
A=@x;
Write(a^);
End.

Alocarea spatiului pentru variabila poiter p si elberarea lui


Procedure new(var p:pointer);
Procedure dispose (var p :pointer);
Ex:
Var adr1:^integer;
New(adr1);adr^:=7;
Writeln(adr1);dispose(adr1);
End;
7.2 Structuri de date implementate dinamic

7.2.2 Structura de tip stivă


Stiva este o listă pentru care singurele operaţii permise sunt:

● Adăugarea unui element în stivă;


● Eliminarea, consultarea, sau modificarea ultimului element introdus în stivă.

Stiva funcţionează pe principiul LIFO (Last In First Out) – “ultimul intrat, primul ieşit”.

Pentru a înţelege modul de lucru cu stiva, ne imaginăm un număr n de farfurii identice, aşezate
una peste alta (o “stivă” de farfurii). Adăugarea sau scoaterea unei farfurii se face, cu uşurinţă, numai în
vârful stivei. Oricât ar părea de simplu principiul stivei, el are consecinţe uriaşe în programare.

Stivele se pot aloca secvenţial (ca vectori). Fie ST[i] un vector. ST[1], ST[2], … , ST[n] pot reţine numai
litere sau numai cifre. O variabilă k indică în permanenţă vârful stivei, adică ultimul element introdus.

În stivă iniţial vidă se introduce litera A, vârful stivei va fi la nivelul 1,


(k=1);
336
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

A
B
A
Introducem în stivă litera B, deci k va lua valoarea 2.

Scoatem din stivă pe B (A nu poate fi scos deocamdată); k=1

Scoatem din stivă pe A; stiva rămâne vidă k=0

Observaţii:

În mod practic, la scoaterea unei variabile din stivă, valoarea variabilei ce indică vârful stivei scade cu 1, iar atunci
când scriem ceva în stivă, o eventuală valoare reziduală se pierde.

Pe un anumit nivel se reţine, de regulă, o singură informaţie (literă sau cifră), însă este posibil, aşa cum va rezulta
din exemplele prezentate în lucrare, să avem mai multe informaţii, caz în care avem stive duble, triple, etc.

În cazul stivei, alocarea secvenţială nu prezintă mari dezavantaje, ca în cazul mai general, al listelor, pentru că nu
se fac operaţii de inserare sau ştergere în interiorul stivei. Singurul dezavantaj, în comparaţie cu alocarea dinamică
înlănţuită este dat de faptul că numărul de noduri care pot fi memorate la un moment dat este mai mic – depinde de
gradul de ocupare al segmentului de date.

În literatura de specialitate veţi întâlni termenul PUSH pentru operaţia de adăugare în stivă a unei înregistrări şi
POP, pentru extragere.

Exemple:

□ Funcţia Manna-Pnueli. Se citeşte xЄZ. Se cere programul pentru calculul funcţiei:

F(x)= x-1, x≥12


F(F(x+2)), x<12

Vom începe prin a studia modul de calcul al funcţiei pentru x=15 şi x=8.

f(15)=14;
f(8)=f(f(10))=f(f(f(12)))=f(f(11))=f(f(f(13)))=f(f(12))=f(11)=f(f(13))= f(12)=11.
Algoritmul va folosi o stivă ST şi o variabilă k, ce indică în permanenţă vârful stivei. Algoritmul se
bazează pe următoarele considerente:
■ la o nouă autoapelare a funcţiei f, se urcă în stivă (k se incrementează cu 1) şi se pune noua valoare.

■ în situaţia în care pentru valoarea aflată pe nivelul k se poate calcula funcţia, se coboară în stivă, punându-se pe
acest nivel noua valoare.

■ algoritmul se încheie când se ajunge în stivă la nivelul 0.

Pentru exemplul dat, prezentăm schematic funcţionarea sa:

12 13

10 10 11 11
337
8 8
8 8 8
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

12 13
11 12
8 11
f=11

□ Programul următor calculează funcţia Manna-Pnueli, utilizând


stiva alocată dinamic. Lucrul cu stiva se face prin utilizarea funcţiilor
PUSH (PUNE) şi POP (SCOATE).
Etapa1)elemental din varful stivei

punerea unui element in stiva

scoaterea unui element din stiva

338
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

{ Functia lui MaNa- while not vida(a,dim) do


Pnueli.calculati f(x)=x-1 daca begin
x>=12 y:=elimin(a,dim);
alfel f(x)=f(f(x+2)) daca x<12 for i:=1 to dim do
ex:x=8 writeln(a[i]);writeln;
=>11} if y>=12 then
program stiva1; {writeln('valoarea functiei se
const nmax=5; poate calcula direct') }
type stiva=array[1..nmax] of if not vida(a,dim) then
byte; a[dim]:=y-1
var a: stiva; else
dim,n,i:byte; else
x,y:byte; begin
function adaug(a,dim,y);
vida(x:stiva;dim:byte):boolean; for i:=1 to dim do
begin writeln(a[i]); writeln;
if dim >0 then vida:=false else adaug(a,dim,y+2);
vida:=true; for i:=1 to dim do
end; writeln(a[i]);
end;
function end;
plina(x:stiva;dim:byte):boolean write('manna pnueli(',x,')=',y-
; 1);
begin end.
if dim <nmax then plina:=false DINAMIC
else plina:=true; {Sa se simuleze formula lui manna pnueli cu
end; stive pentru a se pune
procedure adaug(var x:stiva;var in evidenta operatiile in stiva f(x)=x-1
dim:byte;y:byte); dacax>=12 alfel f(x)=f(f(x+2))
begin ex:n=8}
inc(dim); program stiva;
x[dim]:=y; type adresa=^nod;
end; nod=record
info:integer;
function elimin(var x:stiva;var adr_inap:adresa;
dim:byte):byte; end;
begin var v:adresa;
elimin:=x[dim] ; n,man:integer;
dec(dim); procedure push(var v:adresa;n:integer);
end; var c:adresa;
begin
begin if v=nil then
write('x=');readln(x); begin
adaug(a,dim,x);

339
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

new(v);
v^.info:=n; DINAMIC IN GENERAL
v^.adr_inap:=nil; {Sa se creeze o stiva.
end Scrieti doua proceduri diferite
else care elimina elemente in stiva}
begin type ref=^inr;
new(c); inr=record
c^.info:=n; nr:integer;
c^.adr_inap:=v; urm:ref;
v:=c; end;
end; var p:ref;
end; i,n:integer;
procedure pop(var v:adresa); procedure b(var p:ref);
var c:adresa; var c:ref;
begin begin
if v=nil then writeln('stiva este vida') new(c);
else writeln(' pe cine pui in stiva
begin ');readln(c^.nr);
c:=v; c^.urm:=p;
v:=v^.adr_inap; p:=c;
end;
dispose(c)
procedure s(var p:ref);
end;
var c:ref;
end;
begin
procedure tipar(v:adresa);
if p=nil then
var c:adresa;
writeln(' goala ')
begin
else
c:=v;
begin
while c<> nil do writeln(' scot din stiva pe');
begin writeln(p^.nr);
writeln(c^.info);c:=c^.adr_inap; c:=p;
end; p:=p^.urm;
end; dispose(c);
begin end;
write('n='); end;
readln(n); procedure s1(var p:ref);
push(v,n); var q:ref;
while v<>nil do begin
if v^.info <12 then q:=p;
begin p:=q^.urm;
push(v,v^.info+2); dispose(q);
tipar(v); readln; end;
end
else begin
begin write('dati un numar n>=3 ');
man:=v^.info; readln(n);
pop(v); for i:=1 to n do
tipar(v); b(p);
readln; writeln('-----------elimin
elementul din virful stivei');
if v<>nil then s1(p);
v^.info:=man-1; for i:=1 to n do
end; s(p);
writeln('f=',man-1) ;
readln; readln;
end. end.

□ Funcţia lui Ackermann. Se dă funcţia următoare, definită pe produsul cartezian NXN.. Se citesc m şi
n. Să se calculeze Ack(m, n).

340
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

n+1, m=0
Ack(m,n)= Ack(m-1, 1), n=0
Ack(m-1, Ack(m, n-1)), altfel

Pentru a elabora algoritmul, studiem un exemplu numeric:

ack(2,1)=ack(1,ack(2,0))=ack(1, ack(1,1))=ack(1, ack(0, ack(1,0))= ack(1, ack(0, ack(0,1))=ack(1,


ack(0,2))=ack(1,3)=ack(0, ack(1,2))= ack(0, ack(0, ack(1,1))=ack(0, ack(0, ack(0, ack(1,0))))= ack(0,
ack(0, ack(0, ack(0,1))))=ack(0, ack(0, ack(0,2)))=ack(0,,ack(0,3))= ack(0,4)=5.

Pentru calculul acestei funcţii, folosim o stivă dublă, ST. Iniţial, valorile m şi n se reţin la nivelul 1. Pe
nivelul k al stivei se reţin valorile curente m şi n. În funcţie de valorile acestora se procedează astfel:

■ pentru m şi n diferite de 0, este necesar un nou calcul de funcţie, caz în care se urcă în stivă şi pe noul
nivel se pun argumente m şi n-1.

■ pentru cazul n=0, se rămâne pe acelaşi nivel în stivă, punând în locul lui m valoarea m-1, iar în locul
lui n valoarea 1.

■ în situaţia în care m=0, funcţia se poate calcula; se coboară în stivă şi se înlocuieşte valoarea lui m cu
m-1, valoarea lui n cu valoarea calculată anterior.

În continuare, prezentăm grafic modul de funcţionare a algoritmului pentru exemplul ack(2,1):

10 01
20 11 11 11
21 21 21 21 21

10
01 11 11
11
02 02 13 12 12
12
21 12
13 03
12 13 13
13 13 13 04

ack(2,1)=5.

VAR ST:ARRAY[0..1000,0..2] OF INTEGER; if (st[k,0]>0 and st[k,1]>0)


M,n,k:integer; begin
Begin k:=k+1;
Readln(m,n); st[k,0] =st[k-1,0];
K:=1; st[k,1] =st[k-1,1] – 1;
st[k,0]: =m; st[k,1] :=n; end
while (k>0) do else

341
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if (st[k,1]<>0) k:=k-1;
begin if (k>0)
st[k,0] =st[k,0] – 1; { st[k,0] =st[k,0] – 1;
st[k,1] = 1; st[k,1] =st[k+1,1] +1;
end end;
end;
else write(”ac(“m, n”) = ”,st[1,1] +1);
begin end.

7.2.3 Structura de tip coadă


 O coadă este o listă pentru care toate inserările sunt făcute la unul din capete, toate ştergerile
(consultările, modificările) la celălalt capăt.

Coada funcţionează pe principiul FIFO (First In First Out) – “primul intrat, primul ieşit”.

Este cu totul nerecomandabilă alocarea secvenţială a cozii, deoarece în această situaţie,


are loc un fenomen de migraţie a datelor către ultimele componente ale vectorului (cele de indice
mare).

Să presupunem că simulăm o coadă cu ajutorul unui vector cu zece componente, care


reţin numere întregi. Introducem în coadă, pe rând, numerele 1, 2, 3, 4.

1 2 3 4

Dacă scoatem din coadă pe 1 şi introducem în coadă pe 5, coada va arăta astfel:

2 3 4 5

Scoatem din coadă pe 2 şi introducem pe 6:

3 4 5 6

Se observă acest fenomen de “migraţie”.

Alocarea dinamică înlănţuită a cozii. O variabilă v va reţine adresa elementului care


urmează a fi scos (servit). O alta, numită sf, va reţine adresa elementului introdus în coadă.
Figura următoare prezintă o coadă în care primul element care urmează a fi scos are adresa în v,
iar ultimul introdus are adresa sf.

v sf

7 3 5 2
Etapa 1)

342
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

punerea unui element

stergerea unui element

varful cozii este acum numarul 982

{Considerind in doua fisiere niste numere ordonate inlantuita care sa fie COADA pentru ca la listare sa
crescator in fiecare fie afisate in
sa se preia numarele in ordine descrescatoare si sa ordine crescatoare
se puna intr-o lista simplu

343
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Sa se puna datele ordonate in alt fisier din lista var c:po;


creata anterior} begin
type po=^nod; c:=p;
nod=record while(c<>nil) do
info:integer; begin
leg:po; write(c^.info, ' ');
end; c:=c^.leg;
var p,q,d,u:po; end;
f,g:text; end;
procedure o; procedure li;
var a,b:integer; var H:text;
begin var c:integer;
p:=nil; begin
assign(f,'f1.pas'); assign(h,'ff.pas');rewrite(h);
assign(g,'f2.pas'); d:=p;c:=0;
reset(f); while d<>nil do
reset(g); begin
read(f,a);read(g,b); writeln(d^.info);writeln(h,d^.info);
while (not eof(f) and not eof(g)) do inc(c);d:=d^.leg;
begin end;
new(q); writeln(' am atitea inregistrari',c);
if a<b then begin
q^.info:=a;read(f,a); close(h);
end end;
else begin
if (a=b) then begin o; {L;
q^.info:=a; writeln;}
read(f,a);read(g,b); Li;
end readln;
else end.
begin CU LISTE DUBLU INLANTUITE
q^.info:=b; { Sa se creeze o structura de coada}
read(g,b); type ref=^inr;
end; inr=record
IF (P=NIL) THEN BEGIN nr:integer;
as,ad:ref;
q^.leg:=p; end;
p:=q; var p,u:ref;i,n:integer;
u:=p; procedure b(var u:ref);
end var c:ref;
else begin
begin new(c);
q^.leg:=nil;u^.leg:=q;u:=q; writeln(' pe cine pui in coada ');readln(c^.nr);
end; c^.ad:=nil;
end; c^.as:=nil;
while (not eof(f)) do begin if u<>nil then u^.ad:=c else
new(q);q^.info:=a;q^.leg:=nil; p:=c;
u^.leg:=q;u:=q; u:=c;
read(f,a); end;
end; procedure s(var p:ref);
var c:ref;
while (not eof(g)) do begin
begin if p=nil then writeln(' e goala ') else
new(q);q^.info:=b;q^.leg:=nil;u^.leg:=q; begin
u:=q; writeln(' pe cine scot ');
read(g,b); writeln(p^.nr);
end; c:=p;p:=p^.ad;
close(f);close(g); p^.as:=nil;
end; dispose(c);
procedure L; end;

344
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; for i:=1 to n do


s(p);
begin
writeln(' cite elemente dai n>=3');readln(n); readln;
for i:=1 to n do end.
b(u);

7.2.1 Listă liniară simplu inlantuita si dublu inlantuita

Prezentarea structurii

 O listă liniară este o colecţie de n≥0 noduri, X₁, X₂, … , Xn aflate într-o relaţie de ordine.
Astfel, X₁ este primul nod al listei, X₂ este al doilea nod al listei … Xn este ultimul nod.
Operaţiile permise sunt:

□ Accesul la oricare nod al listei în scopul citirii sau modificării informaţiei conţinute de acesta.

□ Adăugarea unui nod, indiferent de poziţia pe care o ocupă în listă.

□ Ştergerea unui nod, indiferent de poziţia pe care o ocupă în listă.

□ Schimbarea poziţiei unui nod în cadrul listei.

Există două metode de alocare a unei liste liniare: alocarea secvenţială şi alocarea
înlănţuită.

Liste alocate secvenţial

Nodurile listei ocupă poziţii succesive în memorie. Acest tip de alocare l-am întâlnit des,
de câte ori am utilizat vectori.

Exemplu: un vector are n componente de tip real. Se cere să se sorteze vectorul crescător.
Algoritmul are ca dată de intrare o listă liniară, cu n noduri de tip real. Ieşirea este tot o listă
liniară, cu aceleaşi noduri, dar în altă ordine. Să presupunem că utilizăm sortarea prin
interschimbare. O interschimbare a nodurilor i şi j se reduce la următoarele operaţii, premise în
listă:

■ man = v[i]; - se citeşte nodul i şi se memorează – accesez nodul i în vederea citirii;

■ v[i] v[i+1]; - accesez nodul i+1 în vederea citirii (operaţie permisă) şi accesez nodul i în vederea
modificării informaţiei reţinute (operaţie permisă).

■ v[i+1] = man; - accesez nodul i+1 în vederea modificării informaţiei reţinute de el.

În concluzie, sortarea se realizează prin utilizarea operaţiilor permise asupra unei liste
liniare.

 Avantajul alocării secvenţiale este dat de faptul că programatorul are acces direct la oricare din
nodurile listei, la fel ca la componentele unui vector.

 Dezavantajul alocării secvenţiale este dat de faptul că operaţiile de adăugare, eliminare sau
schimbare de poziţie a unui nod necesită un efort mare de calcul, ca în exemplul următor, în care
se elimină un nod:

Fie lista alocată secvenţial:


7 3 1 2 8 9 5 8 3 2 6 ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙

345
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Eliminăm al doilea nod –conţinut 3.


7 1 2 8 9 5 8 3 2 6 ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙
◄▬▬▬▬▬▬▬▬▬▬▬▬
Este obligatoriu ca nodurile următoare să fie deplasate către stânga:
7 1 2 8 9 5 8 3 2 6 ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙ ∙∙∙

Liste alocate înlănţuit


Există două feluri de alocare înlănţuită: alocare simplu înlănţuită şi alocare înlănţuită. În
acest paragraf prezentăm principiile alocării înlănţuite, urmând ca în paragraful următor să
arătăm modul în care implementăm listele alocate înlănţuit.

1. O listă liniară simplu înlănţuită este o structură de forma:

in₁ adr₂ in₂ adr₃ inn nil


adr₁ adr₂ adrn

Semnificaţia notaţiilor folosite este următoarea:

■ adr₁, adr₂, adr₃, … , adrn reprezintă adresele celor n înregistrări;

■ in₁, in₂, in₃, … , inn reprezintă informaţiile conţinute de noduri, de altă natură decât cele de adresă;

■ nil – are semnificaţia “nici o adresă” – elementul este ultimul în listă.

După cum observăm, fiecare nod, cu excepţia ultimului, reţine adresa nodului următor.

2. Alocarea dublu înlănţuită. Alocarea simplu înlănţuită permite parcurgerea listei într-un singur sens
(de la stânga la dreapta). În cazul în care se doreşte ca lista să poată fi parcursă în ambele sensuri
se utilizează alocarea dublu înlănţuită. Aici fiecare nod reţine adresele predecesorului şi
succesorului său, aşa cum se vede în figura următoare:

nil in₁ adr₂ adr₁ in₂ adr₃ adrn-1 inn nil


adr₁ adr₂ adrn

 Dezavantajele alocării înlănţuite sunt:

1. Accesul la un nod al listei se face prin parcurgerea nodurilor care în preced. Aceasta necesită un
efort de calcul.
2. Informaţiile de adresă, prezente în cadrul fiecărui nod, ocupă memorie.

 Avantajele alocării înlănţuite sunt date de faptul că operaţiile de adăugare sau eliminare a unui nod se
fac rapid. Exemplele sunt date pentru lista liniară simplu înlănţuită, dar bine înţelese, ne permit să
deducem singuri modul de efectuare a operaţiilor respective pentru liste dublu înlănţuite.

a) Adăugarea unui nod.

Fie lista:

7 adr₃ 346 9 nil


Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

3 adr₂
adr₁ adr₂ adrn

Dorim să adăugăm după nodul cu informaţia 3, un altul cu informaţia 5.

Etapele sunt:

□ Se alocă spaţiu în memorie pentru un nou nod – indiferent unde:

3 adr₂
7 adr₃
9 nil

adr₁ adr₂ adrn


adrt

□ Se completează informaţiile pentru nodul creat – câmpul de adresă trebuie să conţină adresa nodului
care trebuie să-i urmeze în listă:

3 adr₂
7 adr₃
9 nil

5 adr₂
adrt

□ Se modifică adresa nodului care precede nodul nou creat. Adresa trebuie să fie a nodului nou creat:

adrt

3 adrt 7 adr₃ 9 nil

5 adr₂ 347
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

De acum, putem “privi” lista aşa cum am fost obişnuiţi:

3 adrt 5 adr₂ 7 adr₃ 9 nil


adr₁ adrt adr₂ adrn

b) Ştergerea unui nod. Pentru a exemplifica operaţiile efectuate în acest caz vom folosi a de mai sus,
la care ştergem al doilea nod (cel cu informaţia 5). Iată etapele:

□ Informaţia de adresă a nodului care îl precede trebuie să reţină adresa nodului următor:

3 adr₂ 5 adr₂ 7 adr₃ 9 nil


adr₁ adrt adr₂ adrn

□ Memoria ocupată de nodul care urmează a fi şters este eliberată:

3 adr₂ 7 adr₃ 9 nil


adr₁ adr₂ adrn

De acum, putem privi lista aşa cum am fost obişnuiţi.

3 adr₂ 7 adr₃ 9 nil

adr₁ adr₂ adrn

Observaţii:
În cazul alocării înlănţuite, adresele de memorare ale nodurilor consecutive nu sunt neapărat
consecutive. Pentru a realiza acest lucru este suficient să analizaţi cazul ştergerii unui nod (sau acela al
adăugării unui nod).

 Prin alocarea memoriei pentru un nod înţelegem rezervarea spaţiului necesar memorării informaţiilor
conţinute de acesta. Evident, se poate aloca memorie doar dacă există memorie disponibilă, adică nu
este ocupată de alte variabile.

 Pentru eliberarea memoriei ocupate de un nod înţelegem că spaţiul ocupat de acesta devine disponibil
– este pus la dispoziţia programatorului, pentru ca, eventual, acesta să fie din nou alocat.

 Este important să folosim termenii corect. De exemplu, nu putem folosi în loc de “alocarea
memoriei” termenul “crearea memoriei”, tot aşa cum nu este corect să folosim în loc de “eliberarea
memoriei” termenul “ştergere a memoriei”.

348
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Noţiunile care privesc alocarea şi eliberarea memoriei sunt prezentate în paragraful următor.

Liste liniare alocate simplu inlantuit


Definitia listelor
Def.:O lista liniara este o colectie de n>=0 noduri, X1,X2,…,Xn, aflate intr-o
relatie de ordine.Astfel, X1 este primul nod al listei, X2 este al doilea nod al
listei,…, Xn este ultimul nod.Operatiile permise sunt:
 Accesul la oricare nod al listei in scopul citirii sau modificarii informatiei
continute de acesta.
 Adaugarea unui nod, indiferent de pozitia pe care o ocupa in lista.
 Stergerea unui nod,indiferent de pozitia pe care o ocupa in lista.
 Schimbarea pozitiei unui nod in cadrul listei.

Liste liniare alocate simplu inlantuit


Prezentare generala

O lista liniara simplu inlantuita este o structura de forma:


in1 adr1 in2 adr2 inn 0
adr1 adr2 adrn
Dupa cum se observa, fiecare nod, cu exceptia ultimului, retine adresa
nodului urmator.
1. Accesul la un nod al listei se face parcurgand nodurile care il preced.
2. Informatiile ocupa memorie, fiind prezente in cadrul fiecarui nod.
3. Avantajele alocarii inlantuite sunt date de rapiditatea operatiilor de adaugare si eliminare.
In cadrul unei astfel de liste, zona de memorie rezervata fiecarui elev se numeste
nod sau celula.
Definitie.Numim cod (celula) o unitate informationala de sine statatoare
(elementara) care contine informatii utile si date de legatura.Se numeste lista un
ansamblu de noduri (celule).
Exista mai multe tipuri de liste, dintre care:listele liniare simplu inlantuite, listeel
liniare dublu inlantuite, listele circulare, stivele si cozile.
Liste liniare simplu inlantuite cu numere intregi
Reprezentare
O astfel de lista va memora elementele unui sir de numere intregi si este alcatuita fireste
din noduri.Fiecare nod contine doua campuri: un numar al sirului(informatia utila) si adresa la
care se gaseste numarul urmator din sir(pointer catre nodul urmator).
Numerele memorate in noduri se mai numesc si cheile listei.
Pentru ultimul nod, pointerul catre nodul urmator marcheaza sfarsitul listei si are valoarea NIL.
Etapa1)

349
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

inserarea nui element

stergerea unui element

350
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

gasirea unui element

CREAREA SI AFISAREA LISTELOR SIMPLU INLANTUITE


type ref=^inr; c^.urm:=nil;
inr=record p:=c;u:=c;
nr:integer; for i:=2 to n do
urm:ref; begin
end; writeln('introduceti inregistrarea ',i);
var qq,p,c,u:ref; a:array[1..15] of ref; new(c);readln(c^.nr);c^.urm:=nil;u^.urm:=c;
nn,n,i:integer; u:=c;
procedure init(var p:ref); end;
begin
writeln(' cite inregistrari vreti sa introduceti end;
');readln(n);
new(c); writeln('introduceti inregistrarea prima procedure afisare(p:ref);
'); var c:ref;
readln(c^.nr); begin

351
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

c:=p; end;
while (c <>nil) do begin
begin init(p);
writeln(c^.nr:6); afisare(p);
c:=c^.urm; readln;
end; end.

Operatii asupra unei liste liniare


{
Sa se scrie toate operatiile cu o lista simplu writeln('dati numarul care-l puneti dupa ua
inlantuita} inregistrare ');
type ref=^inr; readln(c^.nr);
inr=record c^.urm:=nil;
nr:integer; u^.urm:=c;
urm:ref; u:=c;
end; end;
var p,c,u:ref; procedure adaugunlasfirsitmaimulte;
n,i:integer; var multe:integer;
procedure init; begin
begin writeln('cite inregistrari vreti sa mai puneti dupa
writeln(' cite inregistrari vreti sa introduceti ua ');readln(multe);
');readln(n); for i:=1 to multe do
new(c); writeln('introduceti inregistrarea pa '); begin
readln(c^.nr); new(c);
c^.urm:=nil; writeln('dati numarul care-l puneti dupa ua
p:=c;u:=c; inregistrare ',i);
for i:=2 to n do readln(c^.nr);
begin c^.urm:=nil;
writeln('introduceti inregistrarea ',i); u^.urm:=c;
new(c);readln(c^.nr);c^.urm:=nil;u^.urm:=c; u:=c;
u:=c; end;end;
end;
end; procedure pununadupacecaut;
procedure inserareinaintedepa; var cecaut:integer; pecinepun :ref;
begin
begin writeln('introduceti valoarea inainte de care
new(c); vreti sa faceti adaugarea ');readln(cecaut);
writeln('pe cine inserati inaite de pa inreg.(dati c:=p;
un numar ');readln(c^.nr); while(c<>nil) and (c^.nr<>cecaut) do
c^.urm:=p; c:=c^.urm;
p:=c; if (c=nil) then writeln(' nu este ce cauti in lista ')
end; else
begin
procedure inserareinaintedepamaimulte; new(pecinepun);
var multe:integer; writeln(' pe cine vrei sa pui ');
begin readln(pecinepun^.nr);
writeln('cite inregisrari vreti sa inserati inainte pecinepun^.urm:=c^.urm;
de pa ');readln(multe); c^.urm:=pecinepun ;
for i:=1 to multe do end;
begin end;
new(c);
writeln('pe cine inserati inaite de pa i(dati un procedure punmaimulteinaintedececaut;
numar ',i);readln(c^.nr); var cecaut:integer; pecinepun :ref;
c^.urm:=p; potadauga:boolean;
p:=c; end; begin
end; potadauga :=true;
procedure adaugunlasfirsit; writeln('introduceti valoarea inainte de care
begin vreti sa faceti adaugarea ');readln(cecaut);
new(c); c:=p;
while potadauga do

352
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

begin var oretinpepenua,desters:ref;


while (c<>nil) and(c^.nr<>cecaut) do begin
c:=c^.urm; c:=p;
while (c<>u) do
if (c=nil) then potadauga:=false
else begin
begin oretinpepenua :=c;
new(pecinepun); c:=c^.urm;
writeln(' pe cine vrei sa pui '); end;
readln(pecinepun^.nr); desters :=c;
pecinepun^.urm:=c^.urm; oretinpepenua^.urm :=nil;
c^.urm:=pecinepun ; u:=oretinpepenua ;
c:=c^.urm; dispose( desters);
end; end;
end;end;
procedure pununadupamaimulte; procedure stergdupaunacareocaut;
var cecaut:integer; pecinepun :ref; var oretinpepenua,desters:ref;cecaut:integer;
begin begin
writeln('dupa a cit-a intergistrare vreti sa
writeln('introduceti dupa a cit -a inregistrare stergeti ');readln(cecaut);
vreti sa faceti adaugarea ');readln(cecaut); c:=p;
c:=p; for i:=1 to cecaut do
for i:=1 to cecaut-1 do
c:=c^.urm; begin
begin oretinpepenua :=c;
new(pecinepun); c:=c^.urm;
writeln(' pe cine vrei sa pui '); end;
readln(pecinepun^.nr); desters :=c;
pecinepun^.urm:=c^.urm; oretinpepenua^.urm :=c^.urm;
c^.urm:=pecinepun ;
c:=c^.urm; dispose( desters);
end; end;
end;
procedure pununainaintedemaimulte;
var cecaut:integer; pecinepun :ref;
begin procedure sterguele;
var oretinpepenua,desters:ref;multe:integer;
writeln('introduceti inainte de a cit -a begin
inregistrare vreti sa faceti inseararea writeln('cite vreti sa stergeti incepind de la
');readln(cecaut); sfirsit spre inceput ');readln(multe);
c:=p; for i:=1 to multe do
for i:=1 to cecaut-2 do begin
c:=c^.urm; c:=p;
begin while (c<>u) do
new(pecinepun);
writeln(' pe cine vrei sa pui '); begin
readln(pecinepun^.nr); oretinpepenua :=c;
pecinepun^.urm:=c^.urm; c:=c^.urm;
c^.urm:=pecinepun ; end;
c:=c^.urm; desters :=c;
end; oretinpepenua^.urm :=nil;
end; u:=oretinpepenua ;
procedure stergpa; dispose( desters);
var desters:ref; end;
begin end;
desters :=p;
p:=p^.urm;
dispose( desters); procedure stergdelapamaimulte;
end; var desters:ref;multe:integer;
procedure stergua; begin

353
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln('cite vreti sa stergeti incepind de la pa c:=p;


');readln(multe);
for i:=1 to multe do while (c<>nil) and (c^.nr<>cecaut) do
begin begin
desters :=p; oretin:=c;
p:=p^.urm; c:=c^.urm;end;
dispose( desters); if c=nil then potsterge :=false
end; else
end; begin
osterg:=c;
procedure stergdupacecaut; oretin^.urm:=c^.urm;
var osterg:ref;cecaut:integer; dispose(osterg);
begin end;
end;end;
c:=p; procedure afisare;
writeln(' dupa ce valoare vrei sa stergi'); begin
readln(cecaut); c:=p;
while (c<>nil) and (c^.nr<>cecaut) do while (c <>nil) do
c:=c^.urm; begin
if c=nil then writeln(' nu este in lista ') writeln(c^.nr:6);
else c:=c^.urm;
begin end;
osterg:=c^.urm; end;
c^.urm:=c^.urm^.urm; procedure modificpa;
{dispose(osterg); } begin
end; c:=p;
end; writeln('cu cine modifici pe pa');readln(c^.nr);

procedure stergcecaut; end;


var oretin,osterg:ref;cecaut:integer; procedure modificua;
begin begin
c:=u;
c:=p; writeln('cu cine modifici pe ua');readln(c^.nr);
writeln(' ce valoare vrei sa stergi');
readln(cecaut); end;
while (c<>nil) and (c^.nr<>cecaut) do procedure modificcepozitiecaut;
begin var cecaut:integer;
oretin:=c; begin
c:=c^.urm;end; c:=p;
if c=nil then writeln(' nu este in lista ') writeln(' a cit-a inregistrare vrei sa o modifici');
else readln(cecaut);
begin for i:=1 to cecaut-1 do
osterg:=c; c:=c^.urm;
oretin^.urm:=c^.urm; writeln(' cu cine o modifici');
dispose(osterg); readln(c^.nr);
end; end;
end;

procedure stergcecautdeciteoriapare; begin


var init;
oretin,osterg:ref;cecaut:integer;potsterge:boole afisare;
an; inserareinaintedepa;
begin afisare;
writeln(' ce valoare vrei sa stergi'); inserareinaintedepamaimulte;
readln(cecaut); afisare;
potsterge:=true; adaugunlasfirsit;
afisare;
while potsterge do adaugunlasfirsitmaimulte;
begin afisare;

354
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

pununadupamaimulte; pununadupacecaut;afisare;
afisare; stergdupacecaut;
pununainaintedemaimulte; afisare;
afisare; writeln('o sterg pe pa '); stergcecaut;
stergpa ;afisare; afisare;
stergdelapamaimulte; afisare; stergcecautdeciteoriapare; afisare;
stergua; modificpa;
writeln('o sterg pe ua '); afisare;
afisare; modificua; afisare;
sterguele;afisare; modificcepozitiecaut; afisare;
stergdupaunacareocaut; readln;
afisare; end.

Liste alocate dublu inlantuit

O lista alocata dublu inlantuit este o structura de date de


forma:

0 in1 adr2 adr1 in2 adr3 adrn-1 inn 0 0


0000adr3
adr1 adr2
adrn
Operatiile posibile asupra unei liste dublu inlantuite sunt:

1) creare;
2) adaugare la dreapta;
3) adaugare la stanga;
4) adaugare in interiorul listei;
5) stergere din interiorul listei;
6) stergere la stanga listei;
7) stergere la dreapta listei;
8) listare de la stanga la dreapta;
9) listare de la dreapta la stanga.

1) Creare

O lista dublu inlantuita se creeaza cu o singura inregistrare.Pentru a ajunge la numarul de inregistrari


dorit, utilizam functii de adaugare la stanga si la dreapta.Functia creare realizeaza citirea informatiei
numerice, alocarea de spatiu pentru inregistrare, completarea inregistrarii cu informatia si completarea
adreselor la dreapta si la stanga cu 0.

2) Adaugare la dreapta

Functia add citeste informatia numerica, aloca spatiu pentru inregistrare, completeaza adresele,
modifica adresa la dreapta a inregistrarii din s cu adresa noii inregistrari si ii atribuie
lui s valoarea noii inregistrari.

3) Adaugare la stanga

4) Adaugare in interiorul listei

Functia includ parcurge lista pentru a gasi inregistrarea cu informatia m, in dreapta careia urmeaza sa
introducem noua inregistrare, citeste informatia, aloca spatiu, completeaza informatia, completeaza

355
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

adresa stanga a noii inregistrari cu valoarea adresei inregistrarii de informatie m, si completeaza adresa
dreapta a noii inregistrari cu valoarea adresei dreapta a inregistrarii cu informatia utila m.

5) Stergere in interiorul listei

Functia Sterg parcurge lista pentru a gasi informatia care va fi stearsa, atribuie inregistrarii precedente
campul de adresa dreapta al inregistrarii care va fi stearsa, iar inregistrarii care urmeaza celei care va fi
stearsa i se atribuie campul de adresa stanga al inregistrarii pe care o stergem, dupa care se elibereaza
spatiul de memorie rezervat inregistrarii care se sterge.

6)-7) Stergere la stanga si la dreapta listei

8) Listare de la stanga la dreapta

Functia listare porneste din stanga listei si tipareste informatia numerica a fiecarei inregistrari, atata
timp cat nu s-a ajuns la capatul listei.
OPERATII CU LISTE DUBLU INLANTUITE
{Cu liste dublu inlantuite sa se simuleze end;
crearea ,listarea in ambele sensuri si stergerea procedure adugadupaultima;
ultimului,primului element ,inserarea dupa un begin
anumit numar de inregistrari new(c);
sau stergerea elementui care are un anumit writeln(' pe cine adugi dupa ultima ');
numar de inregistrare} readln(c^.nr); writeln('------------------');
type ref=^inr; c^.ad:=nil;
inr=record c^.as:=u;
as:ref; u^.ad:=c;
nr:integer; u:=c;
ad:ref; end;
end; procedure adaugadupaa_p1_acomponenta;
var p,c,u:ref; var p1:integer;q:ref;
n,i:integer; begin
procedure creare; c:=p;
begin writeln(' dupa a cita componenta
writeln('n=');readln(n); adaugi(inserezi ');
new(c); readln(p1); writeln('------------------');
writeln(' primul element ');readln(c^.nr); for i:=1 to p1-1 do
c^.ad:=nil; c:=c^.ad;
c^.as:=nil; new(q);
p:=c; writeln(' dati componenta care o inserati ');
u:=c; readln(q^.nr); writeln('------------------');
for i:=2 to n do q^.ad:=c^.ad;
begin c^.ad^.as:=q;
new(c); q^.as:=c;
writeln(' dati integistrarea ',i); c^.ad:=q;
readln(c^.nr); end;
c^.ad:=nil; procedure stegultima;
c^.as:=u; var q:ref;
u^.ad:=c; begin
u:=c; q:=u;
end; u:=u^.as;
end; u^.ad:=nil;
procedure adauginaintedeprima; dispose(q);
begin end;
new(c);
writeln('pe cine adaug inainte de prima '); procedure stegprima;
readln(c^.nr); var q:ref;
c^.ad:=p; begin
p^.as:=c; q:=p;
c^.as:=nil; p:=p^.ad;
p:=c; p^.as:=nil;

356
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

dispose(q); while(c<>nil) do
end; begin
procedure stergA_p1_componenta; writeln(c^.nr,' ');
var p1:integer;q:ref; c:=c^.ad;
begin end;
c:=p; end;
writeln(' dati componenta care o stergeti din
lista ');readln(p1); procedure listare1;
writeln('------------------'); var c:ref;
for i:=1 to p1-1 do begin
c:=c^.ad; c:=u;
q:=c; while(c<>nil) do
c^.as^.ad:=c^.ad; begin
c^.ad^.as:=c^.as; writeln(c^.nr,' ');
dispose(q) c:=c^.as;
end; end;
procedure ins1; end;
var i:integer;d,q:ref;
begin begin
writeln(' in fata cui inserati ');readln(i); creare;
writeln('------------------'); writeln('------------------');
d:=p; listare; writeln('sterg pe ultima
while(i<>d^.nr) and (d<>nil) do ------------------');
d:=d^.ad; stegultima;
if d= nil then writeln(' nu ') writeln('o listez de la sfirsit spre
else inceput------------------');
begin listare1;
new(q); adauginaintedeprima;
writeln('informatia care o inserati '); writeln('------------------');
readln(q^.nr); listare; writeln('------------------');
q^.ad:=d; adugadupaultima; listare;
q^.as:=d^.as; writeln('------------------');
d^.as^.ad:=q; adaugadupaa_p1_acomponenta; listare;
d^.as:=q; writeln(' sterg prima ------------------');
end; stegprima;listare; writeln('------------------');
end; stergA_p1_componenta; listare;
writeln('------------------');
procedure listare; ins1; listare;
var c:ref; readln;
begin end.
c:=p;

7.2.4 Arbore binar


Arbori

Definitie : Un graf conex si fara cicluri se numeste arbore .


Teorema
Fie un graf G=(X,U) . Urmatoarele afirmatii sunt echivalente :
1. G este arbore .
2. G este un graf conex ,minimal in raport cu aceasta propietate (eliminand o muchie oarecare
se obtine un graf ne-conex).
3. G este un graf fara cicluri,maximal in raport cu aceasta propietate (adaugand o muchie
oarecare, se obtine un graf care are cel putin un ciclu).
In cazul arborilor ,in loc de “varfuri” si “muchii”,se folosesc cu precadere termenii sinonimi “noduri”
respectiv “arce”.
Teorema : Un arbore cu n varfuri are n-1 muchii.

Detaliem si sistematizam in continuare cateva propietati care caracterizeaza un arbore :


● exista un nod in care nu intra nici un arc, numit radacina arborelui.

357
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

● cu exceptia radacinii, fiecare nod are propietatea ca in el intra un singur arc. Aceasta leaga nodul
respectiv de un alt nod numit predecesor sau parinte.
● dintr-un nod pot iesi unul sau mai multe arce. Fiecare astfel de arc , leaga nodul rsepectiv de un
alt nod numit succesor sau fiu al nodului.
● nodurile sunt organizate pe nivele , primul nivel fiind ocupat de nodul-radacina. Nodurile de pe
ultimul nivel se caracterizeaza prin faptul ca din ele nu mai iese nici un arc , si se numesc noduri
terminale sau frunze.
● nodurile pot contine o asa-numita informatie utila care poate fi de orice tip . De obicei aceste
informatii se mai numesc si chei ale arborelui.

Arbori binari

Definitie
Un arbore cu propietatea ca fiecare nod cu exceptia frunzelor , are cel mult doi descendenti
(succesori ) se numeste arbore binar.
Intr-un arbore binar ,cei doi succesori ai unui nod (daca exista), se numeste succesor stang
respectiv arbore drept.
Definitie
Un arbore cu propietatea ca fiecare nod ,cu exceptia frunzelor , are exact doi descendenti
(succesori) se numeste arbore binar complet .
Etapa 1)

nod radacina e 58,nod terminal(frunza) e 7

358
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

tatal nodului cu cheia de valoare zero este nodul cu valoare 15


nodul cu valoarea doi are doi fii(descendenti) cu valoarea cheilor de 0 (descendent stang) si
11(descendent drept)
nivelul 0 contine nodul cu valoarea cheii 15
nivelul 1 contine nodurile cu valoarea cheilor 2 76
nivelul 2 contine nodurile cu valoarea cheilor 0 11 56 90
nivelul 3 contine nodurile cu valoarea cheilor 38 63
nivelul 4 contine nodurile cu valoarea cheilor 75
deci AVEM 5 niveluri
Arborele este dezechilibrat pentru ca nodurile terminal ear trebui sa fie pe nivelurile 3 sau 4 dar la noi
avem noduri terminale si pe nivelul 2 (adica pe 0 si 90)
Exemplu de mai jos este de arbore echilibrat

etepa 2)parcurgerea in inordine

359
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

360
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

361
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

{ Creati un arbore cu chei intregi.Parcurgeti in procedure preordine(p:arbore);


postordine,inordine,preordine arborele creat.} begin
if p<>nil then
{ Rezolvare : 1 begin
2 write(p^.info:4);
0 preordine(p^.st);
0 preordine(p^.dr);
3 end
0 end;
0 procedure inordine(p:arbore);
} begin
if p<>nil then
program ParcurgereArb; begin
type arbore=^nod; inordine(p^.st);
nod=record write(p^.info:4);
info:integer; inordine(p^.dr);
st,dr:arbore end
end; end;
var rad:arbore; procedure postordine(p:arbore);
function radacina:arbore; begin
var x:integer;nou:arbore; if p<>nil then
begin begin
write('Info:');read(x); postordine(p^.st);
if x<>0 then postordine(p^.dr);
begin write(p^.info:4);
new(nou); end
nou^.info:=x; end;
write('Stanga lui ',x,':'); begin
nou^.st:=radacina; rad:=radacina;
write('Dreapta lui ',x,':'); preordine(rad);
nou^.dr:=radacina; writeln;
radacina:=nou inordine(rad);
end writeln;
else radacina:=nil; postordine(rad);
end; end.
7.2.5 Arbore binar de cautare
Definitie. Se numeste arbore de cautare un arbore binar ale carui
noduri au o cheie de identificare,iar pentru fiecare nod avem
proprietatiile urmatoare:
- orice cheie asociata unui nod al subbarborelui stang este mai mica decat cheia asociata
nodului;

362
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- orice cheie asociata unui nod al subarborelui drept este mai mare decat cheia asociata
nodului.

Cheile de identificare sunt distincte !

Alaturat observati un arbore de cautare.

1. INSERAREA

Crearea arborilor de cautare se face aplicand de un nr de ori operatia de inserare. Regula de inserare
este urmatoarea:

 Se compara cheia asociata unui nod cu cheia inregistrarii care se insereaza. Avem trei posibilitati:

- cheia coincide cu nr – se renunta la inserarea acelui numar;


- cheia este mai mare decat numarul – se incearca inserarea in subarborele stang;
- cheia este mai mica decat numarul – se incearca inserarea in subarborele drept.

 Inserarea propriu-zisa se realizeaza atunci cand subarborele stang,respectiv


drept,este vid,astfel se reia.

Vezi procedura INSERARE.

2. CAUTAREA

Se face in mod asemanatorcu inserarea motiv pentru care nu o mai comentam.

3. LISTAREA

Informatia se poate lista utilizand oricare din metodele cunoscute pentru parcurgerea arborilor. Daca
dorim listarea informatiilor in ordinea strict crescatoare a cheilor,se utilizeaza metoda stang-varf-dreapta
(inordine), intrucat pentru orice nod avem urmatoarele:

 cheile nodurilor din subarborele stang sunt mai mici decat cheia asociata
nodului;
 cheile nodurilor din subarborele drept sunt mai mari decat cheia asociata
nodului.

Vezi procedura SVD.

4. STERGEREA

Dupa stergerea unui nod care are o anumita cheie, arborele ramas trebuie sa fie de cautare.

Se disting 4 situatii posibile:

a) nodul care urmeaza sa fie sters este nod terminal – in acest caz se face stergerea
avand grija ca la parintele lui sa inlocuim adresa catre el cu nil;

363
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

b) nodul care urmeaza a fi sters subordoneaza un singur subarbor – cel drept – caz in
care parintelui se va inlocui adresa catre el cu adresa subarborelui drept,iar nodul
respectiv se sterge;
c) nodul care urmeaza a fi sters subordoneaza un singur subarbore – cel stang – caz in
care parintelui i se va inlocui adresa catre el cu adresa subarborelui stang, iar nodul
respectiv se sterge;
d) nodul care urmeaza a fi sters( dupa cum vom vedea, acesta se va sterge numai logic)
subordoneaza doi subarbori, caz in care se fac operatiile:

- se indentifica cel mai din dreapta nod al subarborelui stang coorespunzator nodului care
urmeaza a fi sters (acesta va fi sters in mod efectiv, nu inainte de a muta informatiile sale la
nodul care se sterge logic);
- cheia acestuia si alte informatii utile continute de el se muta la nodul care urmeaza a fi sters
- subarborele stang al nodului care se va sterge fizic se leaga:
- in stanga nodului care se sterge logic (daca nodul indentificat ca cel mai din dreapta din
subarborele stang este descendent direct al nodului care se sterge logic)
- in dreapta tatalui nodului care se sterge fizic( in caz contrar);

Exemple de stergere:

1. Arborelui din stanga i se sterge nodul 8. acesta nu subordoneaza nici un alt arbore.

2. Arborelui din stanga i se sterge nodul 9. acesta subordoneaza un singur subarbore, cel
drept.

3. Arborelui din stanga i se sterge nodul 3. Cel mai din dreapta nod al subarborelui stang este 1.
se obtine:

364
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

4. Arborelui din stanga i se sterge nodul 7. cel mai din dreapta nod al subarborelui stang este 6.
tatal nodului care se sterge fizic este 3. in dreapta sa se leaga subarborele 5 4 . se obtine:

Vezi procedura STERG. In situatia in care nodul care urmeaza a fi sters subordoneaza doi arbori,se
apeleaza procedura CMMD.

 Intrebarea la care trebuie sa raspundem in continuare este urmatoarea:de ece daca


se sterge in acest mod un nod,arborele ramane de cautare? Stergerea unui nod se
face in mod dinstinct pentru fiecare din cele 4 cazuriaratate. Datorita simplitati
prelucrarii primele tri cazuri nu necesita comentarii. In cazul 4 se indentifica nodul cel
mai din dreaptadin arborele stang. Cheia acestuia trece in locul cheii nodului care se
sterge. Aceasta este mai mica decat cheia initiala,este in acelasi timp cea mai mare
din subarborele stang,deci este cea mai mare cheie mai mica decat cheia care se
sterge. Iata motivul pentru care aceasta trece in locul cheii sterse logic.
 Transmiterea parametrului c se face prin referinta. Adresa de alocare va fi trimisa
automat parintelui,caadresa de subarbore stang sau drept (duopa caz).
 Altgoritmul are complexitatea in cazul cel mai defavorabil 0(n 2). In cazul in care, de
exemplu cheile inserate sunt in ordine crescatoare, arborele va degenera intr-o lista
liniara –orice nod are numai un descendent drept,iar
 inserarea unui nod inseamna parcurgerea tuturor nodurilor deja inserate in pasul
anterior.

Teoria regasirii informatiei este deosebit de importanta pentru viata practica. Aceasta conduce la o
cautare rapida (putine comparatii).

365
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Etapa 1)

inserez un noduri

366
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

stergerea unui nod care nu are fii de exemplu nodul cu cheia 90

stergerea unui nod care are un fiu stang

367
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

stergerea unui nod care are mai multe niveluri sub el de exemplu o sa stergem de mai jos elemental cu cheia 27

stergerea unui nod cu 2 descendenti de exemplu de mai jos pe valoarea cheii 43

368
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

cautarea unui element de exemplu caut pe valoarea cheii 29

{Sa se creeze un arbore binar de cautare.}


program creare_arbore_de_cautare;
type adr=^nod;
nod=record
v:integer;
st,dr:adr;
end;
var rad:adr;
i,n:byte;
x:integer;

369
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

procedure adauga(var r:adr; x:integer);


begin
if r=nil then begin
new(r);
r^.v:=x;
r^.st:=nil; r^.dr:=nil;
end
else if x<=r^.v then adauga(r^.st,x)
else adauga(r^.dr,x);
end;
procedure inord(r:adr);
begin
if r<>nil then begin
inord(r^.st);
write(' ',r^.v);
inord(r^.dr);
end;
end;
begin
write('n='); readln(n);
new(rad);
write('dati sirul:');
writeln(' primul nod ');
read(rad^.v);
rad^.st:=nil; rad^.dr:=nil;
for i:=2 to n do
begin
writeln(' nodul al ',i,'lea');
read(x);
adauga(rad,x);
end;
writeln('inord:');
inord(rad);
readln;
end.

7.2.6 Operatii specifice referitoare la arbori de cautare


program cautare; end;
uses crt; procedure caut(var c,adr:ref;k:integer);
type ref=^inr; begin
inr=record if c<>nil then if c^.nr<k then caut(c^.ad,adr,k)
nr:integer; else if c^.nr>k then
as,ad:ref; caut(c^.as,adr,k)
end; else adr:=c
var v,man:ref; else adr:=nil;
k:integer; end;
opt:char; procedure parcurg(c:ref);
procedure inserare(var c:ref;k:integer); begin
var d:ref; if c<>nil then begin
begin parcurg(c^.as);
if c<>nil then writeln(c^.nr);
if c^.nr=k then writeln('nr deja inserat') parcurg(c^.ad);
else end;
if c^.nr<k then inserare(c^.ad,k) end;
else inserare(c^.as,k) procedure cmmd(var c,f:ref);
else begin begin
new(c); if f^.ad<>nil then cmmd(c,f^.ad)
c^.as:=nil; else begin
c^.ad:=nil; c^.nr:=f^.nr;
c^.nr:=k; man:=f;
end; f:=f^.as;

370
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

dispose(man); else
end; sterg(c^.as,k)
end; else
procedure sterg(var c:ref;k:integer); writeln('numar absent -tentativa
var f:ref; esuata')
begin end;
if c<>nil then if c^.nr=k then begin
if (c^.as=nil)and(c^.ad=nil) v:=nil;
then begin repeat
dispose(c); write('optiunea');
c:=nil; readln(opt);
end case opt of
else 'i':begin
if c^.as=nil write('k=');readln(k);
then begin inserare(v,k)
f:=c^.ad; end;
dispose(c); 'l':parcurg(v);
c:=f; 'c':begin
end write ('k=');readln(k);
else caut(v,man,k);
if c^.ad=nil if (man<>nil) then writeln(k)
then begin else writeln('nu exista acest nod');
f:=c^.as; end;
dispose(c); 's':begin
c:=f; write('se sterge numarul');readln(k);
end sterg(v,k);
else end;
cmmd(c,c^.as) end;
else until opt='t'
if c^.nr<k then end.
sterg(c^.ad,k)
Forma poloneza –aplicatii-la coada

Se da o expresie aritmetica cefoloseste operatorii `=`,`-`,`*`,`/` precum


si `(`, `)`. Fiecare operand este o litera. Se cere sa se converteasca
aceasta expresie intr-o expresie in forma poloneza(postfixata).
Definim expresia in forma polonezarecursiv,astfel:

- un operand este o expresie in forma poloneza


- daca E1 si E2 sunt doua expresii in poloneza si # un operator, E1 E2 # este o expresie in
forma poloneza;
- orice expresie in forma poloneza se obtine aplicand regulile de mai sus de un numar finit de
ori.

Exemple:
EXPRESIE ARITMETICA EXPREIE IN FORMA POLONEZA
A+b Ab+
A*(b+c) Abc+*
A*(b+c)-e/(a+d)+h Abc+*ead+/-h+
 Forma poloneza este o forma de scriere a expresiilor aritmetice in care parantezele
nu mai sunt puse (din acest motiv o expresie scrisa in forma poloneza se mai
numeste expresie scrisa fara paranteze), dar aceasta nu duce la calculul eronat al
exp.

Expresiili aritmetice pot fi reprezentate utilizand arbori binari,respectand urmatoarele reguli:

371
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- fiecare operatie corespunde unui nod terminal, avand ca informatie


utila operatia respectiva;
- fiecare nod terminal este etichetat cu o variabila sau o constanta;
- pentru fiecare nod neterminal subarborele din stanga si cel din
dreapta reprezita,in aceasta ordine,cei doi operanzi;
- radacina corespunde ultimei operatiiexecutate la evacuarea
expresiei.

Exemplu: expresiei (a+b)*c-d/e i se asociaza arborele binar din figura de mai jos. Parcurgerea acestui
arbore in postordine va da chiar forma poloneza:ab+c*de/-. Utilizand cele spise pentru rezolvarea
problemei, vom proceda in felul urmator:

 construim arborele binar asociat expresiei


aritmetice;
 il parcurgem in postrdine pentru a obtine forma
poloneza.

Pentru constructia arborelui vom acorda prioriati operatorilor si operanzilor(mai putin parantezelor),dupa
cum urmeaza:

- prioritatea initiala a operatorilor `x`, `-`, este 1;


- prioritatea initiala a operatorilor `*`, `/` este 10;
- la prioritatea unui operator se aduna 10 pentru fiecare pereche de
paranteze intre care se gaseste;
- prioritatea unui operand este 1000.

Inprogram acest lucru se realizeaza astfel:

- se citeste expresia aritmetica in variabila e;


- se utilizeaza o variabila j care indica ce numar se adauga la
prioritatea initiala unui operator(la intalnirea unei paranteze descise
j creste cu10, iar la intalnirea unei paranteze inchise j scade cu 10);
- se parcurge expresia caracter cu caracter si se pun in vector p
pioritatile acestor operatori si operanzi (mai putin ale parantezelor);
- in eft se construieste expresia far paranteze ( la expresia aritmetica
initiala lipsesc parantezele), iar in pfp se obtine vectorul, prioritatilor
dincare, spre deosebire de p,lipsesccomponentele coresp
parantezelor (acestea nu aveau nici o valoare).

Utilizand efp si pfp cu ajutorul functieiarb se construieste arborele atasat expresiei aritmetice. Un nod al
acestui arbore are ca informatie utila un operator sau un operand.

Conform tehnicii DIVIDE ET IMPERA, functia arb procedeaza in felul urmator:

 de la limita superioara catre limita inferioara cauta operatorul sau


operandul cu prioritate minima, retinand pozitia acestuia. Acesta constitue
informatia utila din nord,care va fi completata;

372
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 in situatia in care limita inferioara este diferita de limita superioara,pentru


completarea adresei subarborelui din stanga si a subarborelui din dreapta
se reapeleaza functia , iar in caz contrar aceste campuri capata valoarea
nil.

Pentru listarea in postordine se utilizeaza procedura PARC.

Program fp;
Type ref =^inr; Procedure parc (c:ref);
Sir :array[1..30] of char; Begin
Vector=array[1..30] of integer; Ifc<>nil
Inr=record Then
As,ad:ref; Begin
Op:char Parc(c^.as);
End; Parc(c^.ad);
Var e,efp:sir; Write(c^.op)
Pfp,p:vector; End
I,j,n:integer; End;
C:ref;
A:char Begin
Function arb (li,ls:integer;var efp:sir:var J:=0;read( a); n:=1;
pfp:vector);ref; Whilea<>`.` do
Var c:ref Begin
I,j,min:integer; E[n]:=a;n:=n+1;read( a);
Begin End;
Min:=pfp[ls]; N:=n-1;
I:=ls; For i:=1 to n do
For j:=ls downto li do Case e[i] of
If pfp[j]<min `)`:j:=j-10;
Then `(`:j:=j+10;
Begin `+`,`-`:p[i]:=j+1;
min:=pfp[j]; `*`,`/`:p[i]:j+10
I:=j; else p[i]:=1000
End; end;
New( c);arb:=c; arb^.op:=efp[i]; j:=1;
If li=ls for i:=1 to n do
Then if(e[i]<>`)`) and(e[i]<>`(`)
Begin then begin
Arb^.as:=nil;arb^.ad:=nil; efp[j]:=e[i];
End pfp[j]:=p[i];
Else j:=j+1
Begin end;
Arb^.as:=arb(li,i-1,efp,pfp); c:=arb(1,j-1,efp,pfp);
Arb^.ad:=arb(i+1,ls,efp,pfp) parc( c );
End writeln;
End; end.

Aplicatie. Dandu-se o expresie in forma poloneza postfixata,sa se scrie un program care sa genereze
programul de calcul al expresiei utilizand numai instructiuni de atribuire cu un singur operator. Se vor
introduce variabelele auxiliare x0,x1,…,xn.

Exemplu. Pentru expresia aritmetica a*(b+c)-e/(a+d)+h forma poloneza este abc+*ead+/-h+. Se


genereaza urmatorul program de calcul:

X0=b+c
X1=a*x0

373
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

X2=a+d
X3=e/x2
X4=x1-x3
X5=x4+h.

Pentru realizarea scopului propus procedam astfel:

a) folosim o stiva dbla ST,care permite memorarea variabilelor x0,x1,…,xn,a,b,..,z.


b) Forma poloneza se gaseste in fp;
c) Din fp se citeste caracter cu caracter iar rezultatul citirii se trateaza diferential astfel:

- in cazul in care caracterul citit este operand, se incarca in stiva;


- in cazul in care caracterul citit este operator,se scot din stiva
continuturile ultimelor doua niveluri si se face tiparirea sub forma:-
xj=variabila penultima in stiva,operator,variabila ultima in stiva, iar
variabila tiparita se retine i stiva.

Procedeul se repeta ata timp cat nu au fost citite toate caracterele. Pe exemplul considerat, rularea
decurge astfel:

A,b,c se incarca in stiva; C


B
A
X0 La citirea opeatorului ``+``se tipareste x0=b+c si xo se pune in stiva.
A

X1 Citirea operatorului ``*`` determina tiparirea x1=a*x0 si se pune in stiva.

D
A
E E,a,d se incarca in stiva;

X1

X2
E Se tipareste x2=a+d;

X1

X3 Se citeste ``/``, se tipareste X3=e/X2;


X1

Se citeste ``-``, se tipareste X4=X1-X3


X4

h Caracterul ``h`` se pune in stiva;


X4

374
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

La citirea peratorului ``+`` se tipareste x5=x4+h


X5

Intrucat au fost citite toate caracterel, altgoritmul se incheie.

Program fp_pc;
Type stiva=array[1..100,1..2] of char;
Var st:stiva;
Fp:string[100];
I,j,k:integer;
C:string[1];

Begin
Write( ` forma poloneza este=`);
Readln( fp);
K:=0;j:=0;
For i:=1 to lenght(fp) do
Case fp[i] of
`a`..`z`:begin
k:=k+1;
st[k,2]:=fp[i];
st[k,1]:=` `
end;
`+`,`-`,`*`,`/`,:
begin
writeln(`x`,j,`=`,st[k-1,1],st[k-1,2],fp[i],st[k,1],st[k,2]);
k:=k+1;
st[k,1]:=`x`;str(j:1,c);st[k,2]:=c[1];
j:=j+1
end
end{case}
end.

 procedeul indicat este utilizt pentru compilarea expresiilor. Se cunoaste faptul ca procesorul are
instructiuni care permit o singura operatie si doi operanzi. O expresie trbuie adusa sub forma
prezenta,pentru obtinerea codului masina. Altgoritmii utilizati sunt de acest tip (evident,acestia sunt si
optimizanti).

8.Teoria grafurilor
8.1 Definitie.Metode de reprezentare
Notiunea de graf neorientat , adiacente , incidenta, grad
Se numeste graf neorientat , o pereghe ordonata de multimi (X,U)unde:
-X este multimea finita si nevida de elemente numite varfuri sau noduri;
-U este o multime de perechi neordonate de cate doua elemete din X, numite muchii sau arce .

Pentru o muchie uk=(a,b), vom spune ca :

375
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

-varfurile a si b sunt adiacente si se numesc extremitatile muchiei u k;


-muchia uk si varfurile a sunt incidente in graf .La fel , muchia u k si varful b ;
-muchia (a,b) este totuna cu (b,a)
Gradul unui varf x , notat d(x) , reprezinta numarul muchiilor care trec prin nodul x

Un varf care are gradul 0 , se numeste varf izolat


Un varf care are gradul 1 , se numeste varf terminal .
Aplicatie
Construirea matricei de adiacenta prin “citirea muchiilor “de la tastatura :
Procedure citire_graf;
Var I,j,k,x,y:integer;
Begin
Readln(n);
Readln(M);
For I:=1 to n do
For j:=1 to n do
A[I,j]:=0;

For k:=1 to m do
Begin
Write(‘dati muchia”);
Repeat
Readln(x,y);
Until (x>=1)and (x<=n)and(y>=1) and (y<=n) ;
A[x,y]:=1;
A[y,x]:=1;
End;

Listele vecinilor

Pt fiecare nod I formam lista vecinilor lui I .Asta cuprinde toate nodurile care sunt extremitati ale
muchiilor care trec prin nodul I .

Reprezentarea grafului ca un vector de muchii

Fiecare muchie a grafului poate fi privita ca o inregistrare cu doua componente :cele doua varfuri care
constituie extremitatile muchiei .Notam aceste extremitati cu nod 1 si nod 2 , putem defini tipul de date
TMUCHIE, astfel :
Type tmuchie =record
Nod1 ,nod2:integer;
End;

Reprezentarea grafurilor neorientate

Consideram un graf neorientat g=(X,U) cu m muchii si n varfuri numerotate 1,2,3,4,….,n.

Matricea de adiacenta
Este o matrice a cu n linii si n coloane , in care elementele a[I,j]se definesc astfel :
a[I,j]= 1 , daca exista muchia [I,j] cu I<>j
0 in caz contrar

8.2 Notiunea de graf


partial,subgraf,lant,drum,ciclu,circuit

376
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Grafuri orientate –notiuni de baza

Grafuri orientate – noţiuni de bază

Noţiunea de graf orientat.


Un exemplu de graf orientat este: reţeaua de străzi a unui oraş. Străzile sunt muchii în graf, iar
intersecţiile reprezintă vârfurile grafului. Întrucât mergând pe jos ne putem deplasa pe orice stradă în
ambele sensuri, vom spune că din punctul de vedere al pietonilor, „graful unui oraş” este neorientat.
Cu totul altfel stau lucrurile în ceea ce priveşte conducătorii auto, pentru că în orice oraş există străzi cu
sens unic. Pentru un şofer străzile trebuie să primească în graf o anumită orientare. Desigur că acele
străzi pe care se poate circula în ambele sensuri vor primi orientare dublă. Am ajuns astfel la noţiunea
de graf orientat.
Numim graf orientat, o pereche ordonată de mulţimi G=(X,U), unde:
X este o mulţime finită şi nevidă numită mulţimea nodurilor (vârfurilor);
U este o mulţime formată din perechi ordonate de elemente ale lui X, numită mulţimea arcelor
(muchiilor)
observaţii:
Prin noţiunea de perechi ordonate nu trebuie să
înţelegem că o muchie este mai mare decât alta, ci pur
U1
şi simplu că facem deosebire între o muchie de forma
(x,z) şi o alta de forma (y,x). Cu alte cuvinte muchiile
1
sunt diferenţiate prin ordinea de scriere a simbolurilor.
Arcul (x,y) nu este tot una cu arcul (y,x).
Exemplu: U2
Pentru graful G=(X,U) din figura 1. avem: X={1, 2, 3, 4}
2
şi U={u1, u2, u3, u4, u5, u6, u7,}= {(1,1), (2,1), (3,2),
(2,3), (2,4), (3,4), (3,4)} U3
arc va fi de forma u= (x,y), unde x se numeşte U5
extremitate iniţială, iar y se numeşte extremitate finală a U4
arcului. Cu alte cuvinte, “arcul iese din nodul x şi intră în
nodul y”. La fel ca la grafurile neorientate, vom spune că 3
nodurile x şi y sunt adiacente, iar arcul u şi nodul x sunt U6
incidente (la fel arcul x şi nodul y). Nodul y se numeşte 4
succesor al lui x, iar nodul x se numeşte predecesor al
U7
lui y. Un arc de forma (x,x), care iese din nodul x şi intră
tot x, se numeşte buclă.
Exemplu: Figura1
În graful din figura 1, avem bucla (1,1).
Într-un graf putem avea două sau mai multe arce identice.
Exemplu:
În graful din figura 1, există două arce identice, u6 = u7 = (3,4)
Definiţie
Se numeşte p-graf, un graf orientat în care numărul arcelor identice este mai mic sau egal cu o valoare
dată p.
În cele ce urmează vom analiza numai 1-grafuri fără bucle.
Graful unui vârf. Mulţimile Γ şi ω
Gradul exterior al unui vârf x, notat d*(x), reprezintă numărul arcelor care ies din nodul x, adică numărul
arcelor de forma (x,z) ε U.
Analog, se defineşte gradul interior al unui vârf x, notat d-(x), ca fiind numărul arcelor care intră în nodul
x (de forma (y,x) ε U).
Exemplu:
În graful reprezentat în figura 1, pentru nodul x=2, avem:
d*(2) =3 → există trei arce care ies din nodul 2, şi anume : u2=(2,1), u4=(2,3) şi u5 = (2,4).
d-(2) =1 → în nodul 2 intră un singur arc, în speţă arcul u3=(3,2).
Se mai definesc următoarele mulţimi:
  x   y  X x, y  U 
→ mulţimea nodurilor ce constituie extremităţi finale ale arcelor care
pleacă din nodul x. Pe scurt, mulţimea succesorilor lui x;

377
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

  x   y  X  y, x  U 
→ mulţimea nodurilor ce constituie extremităţi iniţiale ale arcelor care
pleacă din nodul x. Pe scurt, mulţimea predecesorilor lui x;
Exemplu:
În graful din figura 1, pentru nodul x=2, avem:
- Γ+(2) = {1,3,4} → urmare a faptului că muchiile care pleacă din nodul 2 sunt (2,1), (2,3) şi (2,4), putem
spune că mulţimea succesorilor nodului 2 este {1,3,4}.

378
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- Γ-(2) = {3} → în nodul 2 intră doar muchia (3,2), deci mulţimea predecesorilor lui 2 conţine doar nodul
3.
ω+(x) = {u = (x,y)| u ε U} → mulţimea arcelor care ies din nodul x;
ω-(x) = {u = (y,x)| u ε U} → mulţimea arcelor care intră în nodul x;
Exemplu:
În graful din figura 1, pentru nodul 2, avem:
ω+(x) = {(2,1), (2,3), (2,4)}, ω-(x) = {(3,2)}
Graf parţial şi subgraf
Fie graful G = (X,U). Un graf parţial al lui G, este un graf G 1= (X,V), cu V  U . Altfel spus, un graf
parţial G1 al lui G, este chiar G, sau se obţine din G păstrând toate vârfurile şi suprimând nişte muchii.
Fie graful G = (X,U). Un graf parţial al lui G, este un graf G 1= (Y,T), unde V  X şi T  U , iar T va
conţine numai muchiile care au ambele extremităţi în Y. Altfel spus, un graf parţial G 1 al lui G, se obţine
din G eliminând nişte vârfuri şi păstrând doar acele muchii care au ambele extremităţi în mulţimea
vârfurilor rămase.
Exemplu:
Se consideră graful G = (X,U) din figura 2, în care X = {1,2,3,4,5,6} şi U={u1, u2, u3, u4, u5, u6, u7}.
- Construim graful parţial G1 = (X,V), unde X = {1,2,3,4,5,6} şi V = { u2, u3, u4, u6, u7} (figura 3)
din graful G au fost eliminate arcele u1 şi u5.
- Construim subgraful G2 = (Y,T), unde Y = {3,4,5,6} şi T = {u4, u5, u6, u7} (figura 4) din graful G
au fost eliminate nodurile 1 şi 2 precum şi arcele u1, u2 şi u3 care au o extremitate în afara
mulţimii nodurilor rămase.
Reprezentarea grafurilor orientate
Considerăm un graf orientat G= (X,U) cu m arce şi n noduri.
Cele mai cunoscute forme de reprezentare sunt: matricea de adiacenţă, matricea vârfuri – arce,
matricea drumurilor şi listele vecinilor.
Matricea de adiacenţă

u2 u2
1 2 1 2
u1
u3 u3
u4 u5 u4 u4
3 3 3 u5
4 4 4
5 5 5
u7 u6 u7 u7
u6 u6

6 6 6
Figura 2 Figura 3 Figura 4

Are aceeaşi semnificaţie ca în cazul grafurilor neorientate: fiecare element a[i,j], cu i,j ε {1,2,...,n}, este: 1
dacă există arcul (i,j), respectiv 0 în caz contrar.
Datorită orientării, aşa cum am mai spus, arcul (i,j) nu este totuna cu arcul (j,i). Prin urmare, a[i,j] ≠ a[j,i].
Aşadar matricea de adiacenţă nu mai este simetrică faţă de diagonala principală, aşa cum se întâmpla
în cazul grafurilor neorientate.
Exemplu:
Pentru graful G=(X,U) din figura 5, matricea de adiacenţă este:
coloana 1 2 3 4

0 0 0 0 1

1 0 1 1 2
A=
0 0 0 1 3

0 1 0 0 4

379
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

2
3

Continuăm cu câteva 1 aplicaţii.


Aplicaţie:
Citirea de la tastatură şi 4 afişarea matricei
de adiacenţă
Prin citirea matricei de Figura 5 adiacenţă de la
tastatură, putem memora arcele existente
între nodurile unui graf. În cazul grafurilor
neorientate, citeam doar “porţiunea” de deasupra diagonalei principale în matrice, deoarece matricea
este simetrică. Acum trebuie să citim toate elementele matricei. Avem de-a face cu algoritmii banali de
citire şi afişare a unei matrice cu n linii şi n coloane (unde n este numărul de noduri) în două cicluri for,
deci nu considerăm că mai sunt necesare alte explicaţii. Prezentăm în continuare procedurile
citire_matrice şi afişare_matrice.
Procedure citire_matrice;
{citeşte matricea de adiacenţă a de la tastatură}
var i,j: integer;
begin
writeln('Nr. Noduri: '); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('[',i,',',j,']=');
readln(a[i,j]);
end;
end;

Procedure afişare_matrice;
{afişează matricea de adiacenţă a}
var i,j: integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln();
end;
end;

Aplicaţie:
Citirea matricei de adiacenţă dintr-un fişier text
Aceasta este absolut similară cu cea prezentată la grafuri neorientate, unde a fost explicată pe larg. De
fapt, este vorba despre algoritmul de citire a unei matrice oarecare dintr-un fişier text. Plecăm de la
presupunerea că fişierul conţine pe primul rând valoarea lui n, apoi pe fiecare din următoarele n rânduri
elementele unei linii a matricei separate de spaţii.
Procedure cit_matr_fis;
{citeşte numărul de noduri si matricea de adiacenta a din fişierul text cu descriptorul f}
var i,j: integer; nume_fis: string;
begin
write('Daţi numele fişierului '); readln(nume_fis);
assign(f,nume_fis); reset(f);
readln(f,n);
for i:=1 to n do
begin

380
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for j:=1 to n do read(f,a[i,j]);


readln(f);
end;
close(f);
end;

Aplicaţie:
Construirea matricei de adiacenţă prin citirea “arcelor” de la tastatură
Se citesc de la tastatură m perechi de numere întregi de forma (x,y) reprezentând extremităţile celor m
arce ale grafului, şi se construieşte matricea de adiacenţă a, cu n linii şi n coloane.
Mai întâi citim m şi n (numărul de arce respectiv numărul de noduri), şi iniţializăm toată matricea de
adiacenţă cu 0, în două cicluri for. Apoi, într-un alt ciclu for, cu k de la i la m, citim cele m perechi de
întregi (x,y).
- Citirea fiecărei perechi (x,z) se face cu validare: repetă citirea lui x şi y până când ambele
valori sunt în intervalul [1,n].
repeat
readln(x,y);
until (x>=1) and x(<=n) and (y>=1) and (y<=n) and (x<>y);
- Pentru fiecare (x,y), marcăm în matricea de adiacenţă existenţa arcului (x,y), prin atribuirea
a[x,y]:=1. Spre deosebire de grafurile neorientate, nu se mai face şi atribuirea a[y,x]:=1,
deoarece arcul (x,y) nu e identic cu arcul (y,x).
Algoritmul prezentat a fost inclus în procedura citire_graf.
Procedure citire_graf;
var i, j, k, x, y: integer;
begin
write('Nr. Arce:'); readln(m);
write('Nr. Vârfuri'); readln(n);
{iniţializează cu 0 toata matricea de adiacenta}
for i:=1 to n do
for j:=1 to n do
a[i,j]:=0;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Muchia ',k,': ');
repeat
readln(x,y);
until (x>=1) and x(<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare pereche, marchează arcul in matricea de adiacenta}
a[x,y]:=1;
end;
end;

Aplicaţie:
Determinarea gradului exterior şi a gradului interior ale unui nod oarecare x
Scriem o funcţie {d_plus(x:integer):integer;} care returnează, gradul exterior al nodului x (notat d*(x)).
Gradul exterior al unui nod x este numărul arcelor care ies din nodul x, adică numărul arcelor de forma
(x,j), cu j ε {1, 2, ... , n}. Luăm ca exemplu graful cu n=4 noduri de mai jos, împreună cu matricea sa de
adiacenţă:
1 2 3 4

0 0 0 0 1

A= 1 0 1 1 2

0 0 0 1 3
2
0 1 0 30 4

381
1
4
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Analizăm gradul exterior al nodului 2. Arcele care ies din nodul 2 sunt: (2,1), (2,3), (2,4) (nu şi (4,2)).
Urmare a existenţei acestor arce, în matricea de adiacenţă vom avea a[2,1] = a[2,3] = a[2,4] = 1. Unde
se găsesc în matricea de adiacenţă toate valorile de 1 corespunzătoare arcelor ce ies din nodul 2? Pe
linia 2! Pe caz general, valorile de 1 de pe linia x în matricea de adiacenţă, reprezintă arcele care ies din
nodul x. Deci gradul exterior al nodului x, adică numărul arcelor care ies din nodul x este egal cu
numărul valorilor de 1 de pe linia x a matricei.
Aşadar algoritmul implementat în funcţia d_plus este foarte simplu:
Iniţializăm cu 0 o variabilă nr. în care numărăm valorile de 1 de pe linia x a matricei. Într-un ciclu,
parcurgem coloanele j=1, 2, ..., n ale liniei x. Pentru fiecare valoare a lui j, testăm elementul a[x,j] de pe
linia x şi coloana j. Dacă aceasta are valoarea 1, atunci incrementăm nr. În final funcţia va returna ultima
valoare a variabilei nr.
Function d_plus(x:integer):integer;
{returnează gradul exterior d* pentru un nod x; acesta este numărul valorilor de 1 de pe linia x a matricei
de adiacenta}
var nr.,j: integer;
begin
nr.:=0;
for j:=1 to n do
if a[x,j] = 1 then nr:=nr + 1;
d_plus:=nr;
end;

Observaţie:
Destul de asemănător este şi algoritmul pentru determinarea gradului interior al nodului x (d- (x) ).
Acesta reprezintă numărul arcelor care intră în nodul x, adică numărul arcelor de forma (i,x), cu i ε {1,
2, ..., n}. Să vedem unde se regăsesc în matricea de adiacenţă arcele care intră în nodul x, luând ca
exemplu x=4 pentru graful anterior. Arcele care intră în nodul 4 sunt (3,4) şi (2,4). Rezultă că în matrice
avem a[3,4] = a[2,4] = 1. Am “reperat” astfel valorile de 1 de pe coloana 4 a matricei de adiacenţă. În
acest moment putem concluziona că gradul interior al unui nod oarecare x reprezintă numărul valorilor
de 1 de pe coloana x a matricei. Se poate scrie o funcţie asemănătoare cu cea de mai sus, care să
returneze câte valori de 1 se găsesc pe coloana x.
function d_minus(x: integer): integer;
{returnează gradul interior d- pentru un nod x; acesta este numărul valorilor de 1 de pe coloana x a
matricei de adiacenta}
var nr, i: integer;
begin
nr:=0;
for i:=1 to n do
if a[i,x]=1 then nr:=nr+1;
d_minus:=nr;
end;

Matricea vârfuri – arce


Este o matrice b cu n linii şi m coloane, în care fiecare element b[i,j] este:
- 1, dacă nodul i este o extremitate iniţială a arcului u j;
- -1, dacă nodul i este o extremitate finală a arcului u j;
- 0, dacă nodul i nu este o extremitate a arcului uj.
Exemplu:
Pentru graful de mai jos cu n=4 noduri şi m=5 arce, matricea vârfuri – arce este:
1 0 0 0 0

-1 -1 -1 0 0

0 1 0 1 -1

382
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

0 0 1 -1 1

u1 u3
u2
1
u4
3 4

u5
Figura 6

Pentru a exemplifica construcţia matricei, vom deduce elementele liniei 3:


- a[3,1]= 0 pentru că nodul 3 nu este o extremitate a arcului u1. Analog, a[3,3]= 0 deoarece
nodul 3 nu este extremitate a arcului u3.
- a[3,5]= -1 pentru că nodul 3 este o extremitate finală a arcului u5.
- a[3,2]= 1 şi a[3,4]= 1 întrucât nodul 3 este o extremitate iniţială a arcului u2 respectiv u4.
Observaţii:
Pe fiecare coloană j (aferentă arcului uj), avem exact două elemente nenule: un 1 (linia i pe care se află
reprezintă extremitatea iniţială a arcului uj) şi un -1 (linia i pe care se află reprezintă extremitatea finală a
arcului uj)
Numărul valorilor de 1 de pe linia i, reprezintă gradul exterior al nodului i (numărul arcelor ce au ca
extremitate iniţială pe i), iar numărul valorilor de -1 de pe linia i reprezintă gradul interior al nodului i
(numărul arcelor care au ca extremitate finală pe i).
Listele vecinilor
Pentru fiecare nod x se construiesc două liste ale vecinilor săi:
- L*(x) → lista vecinilor succesori; conţine nodurile ce sunt extremităţi finale ale arcelor care ies
din nodul x.
- L-(x) → lista vecinilor predecesori; conţine nodurile ce sunt extremităţi iniţiale ale arcelor care
intră în nodul x.
Exemplu:
În graful din figura 6 de mai sus, pentru nodul x=4 avem:
- arcele care ies din nodul 4 sunt (4,2) şi (4,3). În consecinţă, lista vecinilor succesori L*(4)
conţine nodurile 2 şi 3;
- în nodul 4 intră un singur arc, şi anume (3,4), motiv pentru care lista vecinilor predecesori L-(4)
conţine doar nodul 3.
Prezentăm în continuare aceste liste ale vecinilor pentru graful din figura 6.

Nodul x L*(x) L-(x)


1 2 vidă
2 vidă 1,3,4
3 2,4 4
4 2,3 3

Matricea drumurilor
Această matrice va fi reprezentată în cadrul capitolului “Drumuri şi circuite în grafuri orientate”.
Reprezentarea grafului ca un vector de muchii
Fiecare arc al grafului poate fi privit ca o înregistrare cu două componente, în speţă cele două noduri
care constituie extremităţile arcului:
- nod_in -> nodul din care iese arcul (“nodul de început” al arcului);
- nod_sf -> nodul în care intră arcul (“nodul de sfârşit” al arcului);
Putem defini tipul de date ARC, astfel:
type ARC=record

383
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

nod_in, nod_sf: integer;


end;
Graful în ansamblul său, este o mulţime de arce, adică o mulţime de elemente de tipul ARC. În
consecinţă, definim graful ca un “vector de arce”, adică un vector de elemente de tipul ARC:
var v: array [1..25] of ARC;
Numărul real de elemente este numărul de arce m. Astfel, elementele efectiv folosite ale vectorului vor fi
v[1], v[2],..., v[m]. Fiecare element {1, 2, ..., m}) este de tipul ARC şi reprezintă unv[i] (cu i arc al
grafului, având două componente:
v[i].nod_in şi v[i].nod_sf -> nodurile extremităţi ale arcului.

Nodurile izolate într-un graf orientat


Se citesc de la tastatură m perechi de numere întregi (x,y) reprezentând extremităţile arcelor unui graf
orientat cu n noduri şi m arce. Să se stabilească dacă în graful astfel definit există noduri izolate (prin
care să nu treacă nici un arc).

Întreaga rezolvare este cuprinsă în procedura {noduri_izolate;} fără parametri.


Mai întâi citim numărul de noduri n şi numărul de arce m. Definim doi vectori:
- dp va conţine gradele exterioare (d*) ale tuturor nodurilor;
- dm va conţine gradele interioare (d-) ale tuturor nodurilor.
Astfel, dp[i] şi dm[i] vor fi gradul exterior respectiv gradul interior al nodului i, pentru i=1, 2, ..., n.
Iniţializăm cu 0 toate gradele exterioare şi interioare ale tuturor nodurilor: într-un ciclu cu i de la 1 la n,
facem atribuirile dp[i]:=0 şi dm[i]:=0
Pentru a citi cele m arce, parcurgem un ciclu k de la 1 la m, şi la fiecare pas:
- citim o pereche de numere întregi (x,y), cu validarea valorilor introduse: repetă (reia) citirea lui
x şi y, până când ambele valori sunt >= 1 şi >= n. Fiecare pereche va reprezenta care iese din
nodul x şi intră în nodul y.
- întrucât arcul (x,y) iese din nodul x şi intră în nodul y, rezultă că:
- gradul exterior al nodului x (numărul arcelor care ies din nodul x) va creşte cu 1;
- gradul interior al nodului y (numărul arcelor care intră în nodul y) va creşte cu 1.
Deci se fac atribuirile dp[x]:= dp[x]+1 şi dm[y]:= dm[y]+1.
Aşadar la citirea fiecărui arc am actualizat gradele nodurilor – extremităţi ale sale. Astfel, după
încheierea citirii vectorii dp şi dm vor conţine gradele exterioare respectiv interioare ale tuturor nodurilor.
Un nod x se numeşte izolat dacă prin el nu trece nici un arc. Altfel spus, nu iese nici un arc din el şi nu
intră nici un arc în el, adică dp[x]=dm[x]=0. În continuare, vom număra nodurile izolate în variabila nr, pe
care o iniţializăm cu 0. Parcurgem “în paralel” cei doi vectori ai gradelor dp şi dm, într-un ciclu cu i=1, 2,
3, ..., n. La fiecare pas, testăm dacă nodul i este izolat, adică dacă dp[i]=0 şi dm[i]=0; în caz afirmativ
afişăm respectivul nod i şi incrementăm numărul nr al nodurilor izolate.
nr:=0;
for i:=1 to n do
if(dp[i]=0) and (dp[i]=0) then
begin
write(i,' ');
nr:=nr+1;
end;
După încheierea acestei parcurgeri, dacă numărul vârfurilor izolate este diferit de 0 atunci îl afişăm, iar
în caz contrar tipărim un mesaj din care să rezulte că graful nu are noduri izolate.
Program XI_7;
type vect =array[1..20] of integer;
var n,m:integer;
a:array[1..20,1..20] of integer;
dp,dm:vect;

procedure noduri_izolate;
var i,j,k,x,y,nr:integer;
begin
write('Nr.arce : '); readln(m);
write('Nr.noduri: '); readln(n);
{iniţializează cu 0 vectorii gradelor dp şi dm}
for i:=1 to n do
begin

384
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

dp[i]:=0; dm[i]:=0;
end;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Arcul ',k,': ');
repeat
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare arc (x,y), incrementează gradul exterior al lui x şi gradul interior al lui y}
dp[x]:=dp[x]+1; dm[y]:=dm[y]+1;
end;
writeln; nr:=0; {nr=numărul nodurilor izolate}
for i:=1 to n do
{dacă ambele grade ale lui i sunt 0,am găsit un vârf izolat, pe care-l afişăm şi incrementăm nr}
if (dp[i]=0) and (dm[i]=0) then
begin
write(i,' '); nr:=nr+1;
end;
writeln;
if nr<>0 then writeln('Graful are ',nr, ' noduri izolate')
else writeln ('Graful nu are noduri izolate');
end;

begin
noduri_izolate;
end.

Celebritate.
Se dă un grup format din n persoane, care se cunosc sau nu între ele. De la tastatură se introduc m
perechi de numere întregi (x,y) cu semnificaţia ”persoana x cunoaşte pe persoana y”. relaţia de
cunoştinţă nu este neapărat reciprocă. Numim celebritate, o persoană care este cunoscută de către
toate celelalte persoane din grup, dar ea nu cunoaşte pe nici un alt membru al grupului. Să se
determine dacă din grup există o astfel de celebritate.

Interpretarea datelor.
Problema poate fi modelată într-un graf orientat, în care nodurile sunt persoanele 1,2,3...n, iar arcele
sunt relaţiile de cunoştinţă între aceste persoane. O relaţie de cunoştinţă este de forma (x,y) cu
semnificaţia “persoana x o cunoaşte pe persoana y”. De exemplu, dacă grupul are n=4 persoane, iar
cele m=5 “relaţii de cunoştinţă” sunt (1,3), (2,3), (4,3), (1,2), (1,4), atunci graful şi matricea sa de
adiacenţă arată astfel:
3
0 1 1 1
 
0 0 1 0
A
0 0 0 0
 
0 0 1 0  4
 1
Să analizăm persoana reprezentată prin nodul 3:
- există relaţiile de cunoştinţă (1,3), (2,3) şi
(4,3), adică persoana 3 este cunoscută de
către 1,2 şi 4. Mai exact, persoana 3 2 este
cunoscută de către toate celelalte
persoane din grup;
- nu există nici o relaţie de cunoştinţă de forma (3,p). Cu alte cuvinte, persoana 3 nu cunoaşte
pe nimeni.
În concluzie, persoana 3 este ceea ce numim celebritate. În graf, existenţa celebrităţii se interpretează
astfel:
- în nodul 3 intră arce “ieşite” din toate celelalte noduri;

385
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- din nodul 3 nu iese nici un arc.


Rezolvare
În procedura citire_graf se citesc de la tastatură m perechi de numere întregi de forma (x,y)
reprezentând extremităţile celor m arce ale grafului, şi se constituie matricea de adiacenţă a, cu n linii *
n coloane.
Algoritmul de căutare a celebrităţii cuprins în procedura celebritate.
Pentru început, vom căuta o persoană pe care o vom numi în continuare candidat la celebritate.
Memorăm acest candidat în variabila candid. Presupunem că iniţial candidatul este persoana 1
(candid:=1). “Cercetăm” celelalte persoane, într-un ciclu cu i de la 2 la n. Pentru fiecare persoană i,
trebuie să facem o testare. În cazul în care candidatul “actual” candid o cunoaşte i (a[candid,i] este 1)
candid nu mai poate fi celebritate (celebritate nu trebuie să cunoască nici o altă persoană din grup !). În
această situaţie, noul candidat la celebritate devine i (candid:=1).
La finele parcurgerii de mai sus, în variabila candid vom avea aşadar un candidat la celebritate. Mai
rămâne să vedem dacă acest candidat este cunoscut de către celelalte persoane. În exemplul de mai
sus, urmare a faptului că persoana 3 este celebritate, avem relaţiile (1,3), (2,3) şi (4,3), adică
a[1,3]=a[2,3]=a[4,3]=0. În consecinţă, pe coloana 3 avem n-1 valori de 1. Pe caz general, trebuie să
numărăm valorile de 1 de pe coloana candid în matricea de adiacenţă, în adiacenţă, iar dacă găsim n-1
valori, atunci persoana candid este într-adevăr celebritate.
Program XI_8;
var n, m: integer; a: array[1..20, 1..20] of integer;
procedure citire_graf;
var i, j, k, x, y: integer;
begin
write('Nr. arce: '); readln(m);
write('Nr. noduri: '); readln(n);
{iniţializează cu 0 toata matricea de adiacenta}
for i:=1 to n do
for j:=1 to m do
a[i,j]:=0;
{citeşte m perechi (x,y) reprezentând arcele grafului}
for k:=1 to m do
begin
write('Arcul ',k,': ');
repeat
readln(x,y);
until (x>=1) and (x<=n) and (y>=1) and (y<=n) and (x<>y);
{pentru fiecare pereche marchează arcul in matricea de adiacenta}
a[x,y]:=1;
end;
end;

procedure celebritate;
var i, j, candid, nr : integer;
begin
candid:=1; {candid va reprezenta candidatul la celebritate, care iniţial este persoana 1}
for i:=2 to n do
{daca candidatul îl cunoaşte pe i, el nu mai poate fi celebritate noul candidat devine i}
if a[candid, i]=1 then candid:=i;
nr:=0; {numaram in nr cate persoane îl cunosc pe candidatul candid}
for i:=1 to n do
if a[i, candid]=1 then nr:=nr+1;
{verificam daca intr-adevăr candid este celebritate}
if nr=n-1 then writeln('Persoana ', candid,' este celebritate')
else writeln('Nu exista celebritate in grup');
end;

begin
citire_graf; celebritate;
end.
Drumuri si circuite in grafuri orientate

386
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Se numeşte lanţ intr-un graf orientat, o mulţime de arce L={u 1,u2,...,uk}, cu proprietatea ca oricare doua
arce vecine in mulţime au o extremitate comuna.
Un lanţ este de fapt un traseu care uneşte prin arce doua noduri numite extremităţile lanţului, fără a tine
cont de orientarea arcelor componente.
Se numeşte drum în graful G, un şir de noduri D={z 1, z2, z3, …, zk}, unde z1, z2, z3, …, zk aparţin lui x, cu
proprietatea că oricare două noduri consecutive sunt adiacente, adică există arcele [z 1, z2], [z2, z3], …,
[zk-1,zk] aparţin lui U.
Practic, un drum poate fi privit ca un traseu în care toate arcele au aceeaşi orientare, dată de sensul de
deplasare de la z1 la zk.
Dacă nodurile z1, z2, z3, …, zk sunt distincte două câte două, drumul se numeşte elementar. În caz
contrar, drumul este ne-elementar.
Asemenea uni lanţ într-un graf neorientat, un drum într-un graf orientat este de fapt un traseu pe care l-
am parcurge între două noduri deplasându-ne de-a lungul unor arce şi trecând prin nişte noduri
intermediare. Deosebirea unui drum faţă de un lanţ constă în faptul că de-a lungul unui arc ne putem
deplasa numai în sensul dat de orientarea arcului.
Se numeşte circuit într-un graf, un lanţ L={z 1, z2, z3, …, zk} cu proprietatea că z1=zk şi arcele [z1, z2], [z2,
z3], …, [zk-1,zk] sunt distincte două câte două.
Dacă într-un circuit, toate nodurile cu excepţia primului şi ultimului sunt distincte două câte două, atunci
circuitul se numeşte elementar. În caz contrar, el este ne-elementar.

u2
1 2

u1
u3
u4 u5
3
4
5
u7 u6

6
Figura 8

Matricea drumurilor.
Este o matrice d cu n linii şi n coloane, în care fiecare element d[i,j] este :
- 1, dacă există drum de la nodul i la nodul j în graf;
- 0, în caz contrar.
Algoritmul Roy-Warshall de determinare a matricei drumurilor
Matricea drumurilor se obţine aplicând matricei de adiacenţă transformări succesive. Vom spune că
există drum de la nodul i la nodul j, dacă găsim un nod k (diferit de i, j) cu proprietatea că există drum de
la i la k şi drum de la j la k. Astfel:
 un element a[i, j] care este 0, devine 1, dacă există un nod k astfel încât a[i, k]=1 şi a[k, j]=1.
Pentru a găsi arcele nodului k, trebuie parcurse pe rând în varianta k toate nodurile 1, 2, …, n.
for k:=1 to n do
for i:=to n do {i≠k}
for j:=1 to n do {j≠k}
if (a[i, j]=0) and (i<>k) and (j<>k) then
a[i, j]:=a[i,k]*a[k, j];
Atribuirea a[i, j]:=a[i,k]*a[k, j] este o scriere elegantă a regulii de mai sus:
în cazul în care unul din elementele a[i,k], a[k, j] este 0, a[i, j] va rămâne 0;
dacă a[i, k]=1 şi a [k, j]=1, atunci a[i, j] devine 1.

Un CD valoros
Într-un grup sunt n elevi, băieţi şi fete, pe care-i numerotăm 1, 2, … , n. Fiecare elev cunoaşte o parte
dintre ceilalţi elevi. Relaţia de cunoştinţă nu este neapărat reciprocă (dacă x îl cunoaşte pe y, asta nu
înseamnă că şi y trebuie să îl cunoască pe x). Unul dintre elevi are un CD foarte valoros, cu multe
jocuri demonstrative, pe care toţi membri grupului vor să-l aibă fie şi pentru scurt timp, pentru a şi-l

387
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

copia pe calculatorul propriu. CD—ul circulă printre membrii grupului în felul următor: fiecare elev după
ce l-a primit de la altcineva îl dă mai departe, dar numai unui elev pe care îl cunoaşte, pentru că nu
doreşte să ajungă în mâna unor persoane în care nu poate avea încredere. Determinaţi o modalitate
(dacă există) prin care CD-ul să circule exact o singură dată pe la fiecare elev, transmiterea lui făcându-
se numai către o cunoştinţă, iar în final CD-ul să ajungă din nou la proprietarul său.
Interpretarea datelor
Relaţiile de cunoştinţă din cadrul grupului pot fi reţinute într-o matrice a cu n linii şi n coloane, în fiecare
element a[i, j] este: 1 dacă elevul i îl cunoaşte pe elevul j, respectiv 0 în caz contrar. Cu datele
problemei putem construi un graf în care nodurile sunt elevii 1, 2, 3,…, n, iar arcele sunt relaţiile de
cunoştinţă din grup. Astfel, va exista arc de la nodul x la nodul y dacă elevul x în cunoaşte pe elevul y.
Întrucât în enunţ se precizează că relaţiile de cunoştinţă nu sunt neapărat reciproce („x cunoaşte pe y”
nu implică „y cunoaşte pe x”), rezultă că avem de-a face cu un graf orientat. Matricea a definită mai
înainte este tocmai matricea de adiacenţă a grafului.
„Traseul” pe care îl parcurge CD-ul pleacă dintr-un nod (proprietarul său), trecând prin fiecare nod (pe la
fiecare elev) o singură dată. Transmiterea se face numai către o cunoştinţă. Astfel, de la elevul x va
ajunge la elevul y numai dacă există arc (cunoştinţă) de la x la y. În final, traseul se încheie în nodul de
unde a plecat (CD-ul se întoarce la proprietarul iniţial). Un traseu care respectă condiţiile de mai sus nu
este altceva decât un circuit elementar care trece prin toate nodurile grafului: drum deoarece poate
trece de la un nod la altul numai printr-un arc, elementar deoarece nu trece de două ori prin acelaşi nod,
şi în sfârşit circuit pentru că revine în nodul de plecare.
Rezolvare
Folosim metoda backtracking. Fiecare astfel de circuit elementar care trece prin toate nodurile grafului,
va fi o soluţie memorată în vectorul stivă st. Aşadar elementele vectorului st sunt noduri ale grafului.
O soluţie (st[1], st[2], …, st[p] ) este finală dacă
- conţine n nivele, adică p=n (au fost „puşi pe stivă” toţi cei n elevi, adică toate cele n noduri)
- st[n]=x (pentru a fi ciclu trebui să revină în nodul de plecare, adică „elevul de pe ultimul nivel”, st[n],
trebuie să fie proprietarul memorat iniţial în x).
Procedura {citire_matrice;} citeşte matricea de adiacenţă (relaţiile de cunoştinţă). În două cicluri for,
cu i, j=1, 2, …, n, se citesc toate elementele a[i, j]. Această procedură a fost prezentată ca aplicaţie în
lecţia „Reprezentarea grafurilor orientate”
Procedura {iniţializări;} realizează iniţializarea stivei şi a proprietarului CD-ului.
- într-un ciclu for, se iniţializează cu 0 întreg vectorul-stivă;
- se citeşte numărul de ordine al proprietarului CD-ului în variabila x (nodul de plecare).
Procedura {tipar(p:integer):} afişează o configuraţie (st[1], st[2], …, st[p]) a vectorului-stivă.

Funcţia {valid(p:integer):boolean;} verifică pentru fiecare nivel p dacă st[p]I a generat o soluţie
(st[1], st[2], …, st[p]) validă.
Testarea se face prin intermediul unei variabile booleene ok, iniţializează cu TRUE. În primul rând, din
nodul st[p-1] se poate ajunge în
nodul st[p] numai printr-un arc (orice drum/circuit trece prin arce). Aşadar nodul st[p] este valid numai
dacă există arc de la st[p-1] la st[p], adică a[st[p-1], st[p]]=1 (această condiţie provine din faptul că
fiecare elev va transmite CD-ul numai prin cunoştinţă, ia relaţia de cunoştinţă este marcată în graf printr-
un arc). În caz contrar ok devine FALSE.
ok:=TRUE;
if a [ st[p], st[p-1]]=0 then
ok:=FALSE;
Dacă ok a rămas TRUE, urmează testarea celei de-a doua condiţii. Am spus că soluţia este finală dacă
p=n, iar pe ultimul nivel trebuie să se găsească nodul x. Dar pe ultimul nivel anterior lui n nu putem
avea nodul x (CD-ul revine la proprietar, dar numai după ce a trecut pe la ceilalţi elevi, pe la fiecare o
singură dată).
if ok then
if (p<n) and (st[p]=x)
then
ok:=FALSE
Dacă ok a rămas în continuare TRUE, mai avem şi o a treia condiţie. Nodul st[p] să nu se mai
găsească pe stivă (urmare a faptului că CD-ul trebuie să treacă pe la fiecare elev o singură dată).
Parcurgem într-un ciclu nivelele i=1, 2, …, p-1 anterioare lui p. Dacă găsim un st[i] egal cu st[p],
înseamnă că st[p] se mai găsesc pe un nivel anterior, deci ok devine şi în cazul acesta FALSE.
if ok then
for i:=1 to p-1 do

388
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if st[p]= st[i] then


ok:=FALSE
Procedura recursivă {bktr(p:integer);} “tratează” un nivel oarecare p al stivei.
 prin variabila val vor trece pe rând, într-un ciclu, toate valorile care teoretic ar putea fi puse pe
nivelul p. Pentru fiecare dintre aceste valori:
 dacă respectiva valoare a generat o soluţie validă (dacă funcţia valid(p) a returnat
TRUE), atunci:
- dacă soluţia respectivă e şi finală o tipărim (apelând procedura tipar (p)); în
caz contrar trecem la nivelul următor (pentru a completa soluţia cu un nou
nivel), prin auto-apelul bktr(p+1).
În programul principal, apelăm procedurile iniţializări şi citire_matrice, apoi declanşăm lanţul recursiv
prin apelul bktr(1) (plecăm de la nivelul 1 al stivei).
Program XI_10;
var n,x:integer;
st:array[1..20] of integer;
a:array[1..20,1..20] of integer;

procedure citire_matrice;
{citeste matricea de adiacenta a de la tastatura}
var I,j:integer;
begin
write (‘numarul de noduri: ’); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write (‘[‘, i, ’,’, j, ‘]=’); readln(a[i, j]);
end;
end;

procedure initializari;
{initializeaza stiva si citeste datele problemei}
var i:integer;
begin
write (‘Cine este proprietarul: ’); readln(x);
for i:=1 to 25 do st[i]:=0;
end;

procedure tipar (p:integer);


{tipareste o solutie memorata in vectorul st}
var k:integer;
begin;
write (x, ’ ’);
for k:=1 to p do write (st[k]:4, ‘ ’);
writeln;
end;

function valid (p:integer): boolean;


{testeaza daca valoarea pusa pe nivelul p a generat o solutie valida, returnand TRUE sau FALSE}
var nr, i:integer; ok:boolean;
begin
{CD-il poate circula numai intre elevii care se cunosc, deci elevul st[p-1] trebuie sa il cunoasca pe st[p]
pentru a-i putea da CD-ul mai departe}
ok:=TRUE;
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).
 
Î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.

389
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

if a[st[p-1], st[p]]=0 then ok:=FALSE;


if ok then
{proprietarul x nu se poate gasi pe un nivel anterior ultimului}
if (p<n) and (st[p]=x) then ok:=FALSE;
if ok then
{elevul st[p] nu trebuie sa se mai gaseasca pe nivelele anterioare}
for i:=1 to p-1 do
if st[p]= st[i] then ok:=FALSE;
valid:=ok;
end;

procedure bktr (p:integer);


{implementeaza algoritmul de backtracking recursiv}
var val:integer;
begin
{in variabila val trec pe rand toate valorile care ar putea fi incercate pe nivelul p al stivei}
for val:=1 to n do
begin
st[p]:=val; {pune o noua valoare pe nivelul p}
if valid(p) then {daca solutia obtinuta e valida}
{o solutie e finala daca CD-ul a trecut pe la n elevi (p=n) si ultimul e proprietarul (st[p]=x)}
if (p=n) and (st[n]=x) then tipar (p) {daca e si finala, tipareste solutia}
else bktr (p+1); {trece la nivelul urmator in stiva, pentru a completa solutia}
end;
end;

begin;
initializai; citire_matrice; bktr(1); {plecam de la nivelul 1 pe stiva}
end.

Definitie :
Numim graf orientat ,o pereche ordonata de multimi G=(X,U), unde :
- x este o multime finita si nevida numita miltimea nodurilor (varfurilor);
- U este o multime formata din perechi ordonate de elemente ale lui X,numita multimea
arcelor (muchiilor).

Definitie
Se numeste p-graf ,un graf orientat in care numarul arcelor identice este mai mic sau egal cu o valoare
data p.

390
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exista mai multe metode de reprezentare in memorie a unui graf orientat:


1-metoda matricei adiacente:
1, pentru[I,j] apartin de g
a[I,j]=
0, pentru[I,j]nu apartinde g

Gradul unui varf . Multimea Γsi ω


Matricea costurilor

Pentru evidentierea costurilor tuturor arcelor unui graf cu n noduri se poate defini o matrice a, cu
n linii * n coloane.Exista doua forme ale acestei matrici:
Forma a): Fiecare element a[i,j] poate fi:
c , daca exista un arc de cost c>0 intre nodurile i si j;
0, daca i=j;
+∞ ,daca nu exista arc intre nodurile i si j .

Forma b): Este absolut similara,cu singura deosebire ca in loc de +∞ avem -∞.
Forma a) se foloseste pentru determinarea drumurilor de cost minim intre doua noduri , iar forma b)
este utilizata in aflarea drumurilor de cost maxim.
Daca dorim sa citim matrice costurilor ,evident ca nu putem introduce de la tastatura “+”! In loc de +
vom da un numar intreg foarte mare.

Definitie
Gradul exterior al unui varf x, notat d+(x), reprezinta numarul arcelor care ies din nodul x,adica
numarul arcelor de forma (x,y)
apartine de U.
Analog , se defineste gradul interior al unui varf x, notat d¯(x), ca fiind numarul arcelor care intra
in nodul x (de forma (x,y) apartine U)

Reprezentarea grafurilor orientate

Consideram un graf orientat G=(X,U) cu m arce si n noduri.


Cele mai cunoscute forme de reprezentare sunt : matricea de adiacenta , matricea varfuri-arce,
matricea drumurilor si listele vecinilor.

Matricea de adiacenta

Are aceeasi semnificatie ca in cazul grafurilor neorientate :fiecare element a[I,j] ,cu I,j apartine de
{1, 2,….,n} ,este: 1 daca exista arcul (I,j), respectiv 0 in caz contrar.
Datorita orientarii, asa cum am mai spus , arcul (I,j) nu este totuna cu arcul (j,I).Prin urmare ,
a[I,j]≠a[j,I].Asadar matricea de
adiacenta nu mai este simetrica fata de diagonala principala , asa cum se intampla in cazul grafurilor
neorientate .

Matricea varfuri-arce

Este o matrice b cu n linii si m coloane, in care fiecare element b[I,j] este;


● 1, daca nodul i este o extremitate initiala a arcului uj;
● -1, daca nodul I este o extremitate finala a arcului uj;
● 0, daca nodul I nu este o extremitate a arcului uj;

Listele vecinilor

391
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Pentru fiecare nod x se construiesc doua liste ale vecinilor sai:


► L+(x) → lista vecinilor succesori ; contine nodurile ce sunt extremitati finale ale arcelor care ies
din nodul x.
► L‾ (x) → lista vecinilor predecesori ; contine nodurile ce sunt extremitati initiale ale arcelor care
intra in nodul x.
Matricea drumurilor
procedure formarea_matrice_drumuri;
{formeaza matricea drumurilor (memorata tot in a), cu algoritmul Roy-Warshall}
var i,j,k:integer;
begin
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if a[i,j]=0 then a[i,j]:=a[i,k]*a[k,j];
end;
Grafuri neorientate
Definiţie. Se numeşte graf neorientat o pereche ordonată de mulţimi (X, U), X fiind o mulţime
finită şi nevidă de elemente numite noduri sau vârfuri, iar U o mulţime de perechi neordonate
( submulţimi cu două elemente) din X, numite muchii.
Ex.

2 6
1 +8
3
5

7
4
Fig.1

Pentru graful de mai sus avem:


X={1, 2, 3, 4, 5, 6, 7, 8}
U={[1,2], [1,4], [1,5], [2,3], [2,5], [3,4], [6,7]}
Dacă u1 şi u2 sunt două muchii care au o extremitate comună ele se vor numi adiacente.
Definiţie. Un graf parţial al grafului G=(X,U) este un graf G 1=(X,V) astfel încât VU, adică G1
are aceeaşi mulţime de vârfuri ca G iar mulţimea de muchii V este chiar U sau o submulţime a acesteia.
Ex. Mai jos avem un graf parţial al grafului de mai sus (Fig.1)
6
2 +8
1
3
5

7
4
Fig.2

Cu alte cuvinte, un graf parţial al unui graf se obţine păstrând aceeaşi mulţime de vârfuri şi
eliminând o parte din muchii.
Definiţie. Un subgraf al unui graf G=(X,U) este un graf H=(Y,V) astfel încât Y  X iar V conţine
toate muchiile din U care au ambele extremităţi în Y. Vom spune că subgraful H este indus sau generat
de mulţimea de vârfuri Y.
Ex. Mai jos avem un subgraf al grafului din Fig.1 obţinut prin eliminarea nodului 3

2 6
+8
1
5

392
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

7
4
Definiţie. Gradul unui vârf x este numărul muchiilor incidente cu x.
Gradul vârfului x se notează cu d(x).
Ex. în Fig.1 d(1)=3, d(4)=2, d(8)=0, d(6)=1
Un vârf care are gradul 0 se numeşte vârf izolat.
Un vârf care are gradul 1 se numeşte vârf terminal.
Propoziţia 1. Dacă un graf G=(X,U) are m muchii şi n vârfuri iar X={x 1,x2,..,xn}, atunci
d(x1)+d(x2)+...+d(xn)=2m.
Corolar. În orice graf G există un număr par de vârfuri de grad impar.
Definiţie. Se numeşte graf complet cu n vârfuri un graf care are proprietatea că orice două
noduri diferite sunt adiacente.
Propoziţia 2. Un graf complet Kn are n(n-1)/2 muchii.
Definiţie. Un graf G=(X,U) se numeşte bipartit dacă există două mulţimi nevide A, B astfel
încât X=A U B, A  B = şi orice muchie u a lui G are o extremitate în A iar cealaltă în B.
Definiţie. Un graf bipartit se numeşte complet dacă pentru orice x din A şi orice y din B, există
în G muchia [x,y].

Definitie.Un drum al unui graf orientat L=[x0,x1,x2,…xp] este o succesiune de


varfuri cu proprietatea ca [x0,x1]aparrtine de g, [x1,x2] la fel, s.a.
-x0 si xp = extremitatile drumului;
-p=lungimea drumului;
-daca x0,x1,…,xp sunt distincte doua cate doua drumul=elementar;
-daca x0=xp,drumul=circuit
-daca toate varfurile circuitului, cu exceptia primului si ultimului sunt distincte,
circuitul=elementar;
-un circuit elementar care trece prin toate nodurile grafului se numeste circuit
hamiltonian.
Definitie.Daca multimea g are proprietatea de simetrie, graful se numeste neorientat.
Definitie.Un graf partial al unui graf neorientat dat G=(X,G) este un graf G1=(X,g1 unde G1 inclus
sau=cu G.
Definitie.Un subgraf al unui graf neorientat G=(X,g) este un graf H=(Y<G1), unde Y inclus in X, iar
muchiile din G1 sunt toate muchiile din G care au ambele extremitati in multimea Y.
Definitie.Lant.Pentru graful neorientat , un lant este o succesiune de varfuri cu proprietatea ca oricare
doua varfuri sunt adiacente.

Graf complet si bipartit

Se numeste graf complet cu n varfuri , notat Kn , un graf G=(X,U) cu proprietatea ca oricare doua
varfuri sunt adiacente adica :
() x,y є x → ca exista muchia [x,y] apartine de U
Teorema:
Un graf complet cu n varfuri , are n(n-1)/2 muchii.
Definitia :
Se numeste graf bipatrat ,un graf G=(X,U) cu propietate ca exista doua multimi A si B incluse in X,
astfel incat :
-A ∩ B=Ø ,A U B=X,
-toate muchiile grafului au o extremitate in A si cealalta in B .
Definitie :
Se numeste graf bipatrat complet, un graf bipatrat cu propietatea ca pentru orice varf x din A si orice
varf y din B,exista muchia (x,y) (unde A si B sunt cele doua submultimi care partitioneaza miltimea
varfurilor X).

Notiunea de lant si ciclu

393
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Definitie :
Se numeste lant in graful G ,o succesiune de varfuri (z1, z2,z3 ,….zk),unde x1,x2,…,xk apartine de X ,
cu propietatea ca oricare doua varfuri consecutive sunt adiacente ,adica exista muchiile [z1, z2],[z2 ,z3],
….,[zk-1,zk] apartine de U.
Varfurile z1 si zk se numesc extremitatile lantului ,iar numarul de muchii care intra in componenta sa
reprezinta lungimea lantului .
Definitie :
Se numeste ciclu intr-un graf ,un lant L=(z1,z2,….zk) cu propietatea ca z1=zk si muchiile [z1,z2 ],
[z2,z3], ….,[zk-1,zk] sunt disticte doua cate doua.
Daca intr-un ciclu , toate varfurile cu exceptia primului si a ultimului sunt disticte doua cate
doua ,atunci
ciclul se numeste elementar .In contrar, el este neelementar.

Problema rezolvata
Lant intr-un graf

Sa se verifice daca o secventa de varfuri data reprezinta un lant elementar si neelementar intr-un graf
neorientat. Numarul de varfuri si matricea de adiacenta se citesc de la tastatura, iar secventa testata se
gaseste in fisierul “lant .txt”(varfurile sunt scrise in fisier pe un singur rand separate prin spatii).

program X1-5;

uses crt;
var a:array[1..20,1..20] of integer ;
n,I,j,k:integer;
z:array[1..20] of integer;
procedure citire matrice;
{citeste numarul de muchi si muchiile de forma (x,y),si construieste matricea de adiacenta}
var I,j,x,y:integer
begin
{citeste numarul de varfuri n}
write (‘numarul de varfuri :’) ;
readln (n) ;
{initializeaza cu 0 diagonala principala}
for I:=1 to n do a[I,i]:=0;
{citeste portiunea din matrice situata deasupra diagonalei principala}
for I:=1 to n-1 do
for j:=I+1 to n do
begin
writeln (‘exista muchie intre’ ,I,’ si ‘,j, ‘ ? [1/0] ‘);
{citeste elementul a[I,j] cu validare (el trebuie sa fie 0 sau 1)}
repeat
readln (a[I,j]);
until (a[I,j]=0 ) or (a[I,j]=1);
a[j,i] :=a[I,j];
end;
end;

procedure secventa ;
var f:text; ok:boolean;
begin
assign(f, ‘lant./txt’); reset(f);
{citeste secventa de varfuri din fisier in vectorul z=(z[1],z[2],…,z[k])
k:=0;
while not seekeoln (f) do
begin
k:=k+1; read(f,z[k]);
end;
close (f);

394
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

{afiseaza vectorul z ce contine secventa}


for I:=1 to k do write(z[I], ‘ ‘);
writeln ;
{verifica daca doua varfuri consecutive in secventa sunt adiacente (daca secventa e lant)}
ok:=TRUE;
for I:=1to k-1 do
if a[z[I],z[I+1]]=0 then ok:=FALSE;
if ok then write (‘lant’)
else writeln (‘secventa nu este in lant ‘);
if ok then
begin
{in cazul in care e lant ,testeaza daca varfurile sunt disticte intre ele(adica lant elementar ) }
for I:=1 to k-1 do
for j:=I+1 to k do
if z[I]=z[j] then ok:=FALSE;
if ok then writeln (‘elementar’)
else writeln (‘ne-elementar ‘);
end;
end;
begin
citire_matrice; secventa ;
end.

8.3 Parcurgerea grafurilor orientate


1.Parcurgerea in latime(BF-breadth first)
-parcurgerea in latime se face incepand de la un nod I, pe care il consideram parcurs;
-parcurgem apoi toti descendentii sai – multimea nodurilor j pentru care exista
[I,j]apartin de g;
-parcurgem apoi toti descendentii nodurilor parcurse la pasul anterior.
Parcurgerea BF se efectueaza prin utilizarea structurii numita coada, avand grija ca un
nod sa fie vizitat o singura data. Coada va fi alocata prin utilizarea unui vector.

395
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

PARCURGEREA GRAFURILOR
{Parcuregerea in latime nerecursiv si recursivla writeln(' care este nodul de plecare ');readln(pl);
grafuri vi[pl]:=1;
ex: co[1]:=pl;
n=6 p:=1;
8 muchii si anume (1,2),(1,3)(1,4),(2,4),(2,3),(3,4), u:=1;
(3,6),(4,5) while p<=u do
=>1 2 3 4 6 5 } begin
uses crt; el:=co[p];
var a:array[1..20,1..20] of integer; for j:=1 to n do
co,vi:array[1..20] of integer; if (a[el,j]=1) and (vi[j]=0) then begin
i,n,el,j,p,u,pl,m,x,y:integer; u:=u+1;
co[u]:=j;
procedure pp(i:integer); vi[j]:=1;
var j:integer; end;
begin p:=p+1;
for j:=1 to n do end;
if (a[co[i],j]=1) and( vi[j]=0) then begin for i:=1 to u do
u:=u+1; write(co[i],' ');
co[u]:=j; pp(1);
vi[j]:=1; writeln(' parcurgere recursiva in latime ');
end; for i:=1 to u do
if i<=u then pp(i+1); write(co[i],' ');
end; readln;
begin end.
clrscr;
writeln(' n=');readln(n); {Parcuregerea in adincime la grafuri neorientate
writeln(' nuamrul de muchii ');readln(m); ex:n=5
for i:=1 to m do m=4
begin si anume (1 2),(1 5), ( 2 3),(2 4)
writeln('dati muchia ',i); nodul de pelecare este 1 =>
writeln( 'primul nod al muchiei ');readln(x); 12345
writeln(' nodul de sfirsit al muchiei ');readln(y); }
a[x,y]:=1;a[y,x]:=1; uses crt;
end; var a:array[1..20,1..20] of integer;
for i:=1 to n do vi:array[1..20] of integer;
vi[i]:=0; i,n,el,j,p,u,pl,m,x,y:integer;

396
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

for i:=1 to m do
procedure pp(pl:integer); begin
var j:integer; writeln('dati muchia ',i);
begin writeln( 'primul nod al muchiei ');readln(x);
write(pl,' ');vi[pl]:=1; writeln(' nodul de sfirsit al muchiei ');readln(y);
for j:=1 to n do a[x,y]:=1;a[y,x]:=1;
if (a[pl,j]=1) and (vi[j]=0) then pp(j); end;
end; for i:=1 to n do
vi[i]:=0;
writeln(' care este nodul de plecare ');readln(pl);
begin pp(pl);
clrscr; readln;
writeln(' n=');readln(n); end.
writeln(' numarul de muchii ');readln(m);

8.4 Conexitate/ tare conexe ,determinarea componentelor conexe/tare


conexe
Graf conex
CONEXITATE

Fie G=(X, U) un graf neorientat, X={x1, x2, ..., x2}.


Definiţie. Se numeşte lanţ în G succesiunea de vârfuri L={x i1, xi2,..., xik} cu proprietatea că orice două
noduri consecutive din L sunt adiacente, adică [xi1, xi2], [xi2, xi3],..., [xik-1, xik]  U.
Dacă vârfurile xi1, xi2,..., xik sunt diferite două câte două atunci lanţul se numeşte elementar. În caz
contrar, lanţul este neelementar.
1 2 5

8
7

3 4 6

Ex. L1=[1,2,4] – lanţ elementar


L2=[1,2,3,1,2,4] – lanţ neelementar
Definiţie. Se numeşte ciclu în G un lanţ L pentru care x i1=xik şi toate muchiile adică [x i1, xi2], [xi2, xi3],...,
[xik-1, xik] sunt diferite două câte două.
Ex. C=[1,2,3,1] este un ciclu.
Definiţie. Se numeşte ciclu elementar un ciclu care are proprietatea că oricare două vârfuri ale sale,
cu excepţia primului şi ultimului, sunt diferite două câte două.
Ex. C1=[1,2,3,1] este ciclu elementar.
C2=[3,1,2,4,8,2,3] este un ciclu neelementar.
Definiţie. Un graf G se numeşte conex dacă pentru orice două vârfuri x şi y diferite ale sale există un
lanţ care le leagă.
Definiţie. Se numeşte componentă conexă a grafului G=(X, U) un subgraf C=(X 1, U1), conex, a lui G
care are proprietatea că nu există nici un lanţ în G care să lege un vârf din X 1 cu un vârf din X-X1.

Un graf G este conex , daca oricare ar fi doua varfuri ale sale ,exista un lant care le leaga.
Definitie:
Se numeste componenta conexa a grafului G=(X,U),un subgraf G1=(X1,U1) a lui
G ,conex , cu propietatea ca nu exista nici un lant care sa lege un nod din X1 cu un nod din X-
X1(pentru orice nod , nu exista un lant intre acel nod si nodurile care nu fac parte din subgraf).
Program componenteconexe;

397
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

var m,n ,pi,ps,prim, p, j:=1;


nc:integer; while (j<=n) and
a:array[1..20,1..20] of (prim_nev= -1) do
integer; begin
d,c,viz:array[1..20] of if viz[j]=0 then
integer; prim_nev:=j;
procedure citire_graf; j:=j+1;
{citeste numarul de muchii si end;
muchiile de forma (x,y), si nevizitat:=prim_nev;
construieste matricea de end;
adiacenta}
var I,j,k,x,y:integer; function conex:boolean;
begin {verifica daca varful este
{citeste numarul de varfuri n conex,returnand TRUE sau FALSE}
si numarul de muchii m} var k,pi,ps,z:imteger;
write (‘Numarul de varfuri :’); begin
readln(n); {face o parcurgere a grafului cu
write (‘Numarul de algoritmul BF, plecanddin nodul de
muchii:’); readln(m); start prim}
{initializeaza cu 0 intreg for k:=1 to 20 do c[k]:=0;
vectorul gradelor d} for p;=1 to 20 do viz[p]:=0;
for i:=1 to n do d[i]:=0; write (‘Dati varful de plecare’);
{initializeaza cu 0 toata readln(prim);
matricea de adiacenta} pi:=1; ps:=1;
for i:=1 to n do c[1]:=prim; viz[prim]:=1;
for j:=1 to n do while ps<pi do
a[i,j]=0; begin
{citeste m perechi de numere z:=c[ps];
intregi de forma (x,y)} for k:=1 to n do
{pentru fiecare pereche, if (a[z,k]=1) and (viz[k]=0)
actualizeaza cu 1 elementele then
a[x,y] si a[y,x] care begin
identifica muchia (x,y)} pi:=pi+1; c[pi]:=k;
for k:=1 to mdo viz[k]:=1;
begin end;
writeln(‘Dati muchia cu ps:=ps+1;
numarul de ordine’,k,’:’); end;
repeat for k:=1 to pi do write(c[k]:3);
readln(x,y); if nevizitat=-1 then conex:=TRUE
until(x>=1) and (x<=n) else conex:=
and (y>=n) and (y<=n); FALSE;
a[x,y]:=1; a[y,x]:=1;
d[x]:=d[x]+1; d[y]:=d[y] end;
+1; begin
end; writeln(‘Afisam componentele
end; conexe:’);
citire_graf; writeln;
function nevizitat :integer; if conex:=TRUE then
{parcurge tabloul viz: writeln (‘Graful este conex’)
returneaza primul nod
nevizitat,sau –1 daca nu mai else
sunt noduri nevizitate} writeln(‘Graful NU este conex’);
var prim_nev,j:integer: end.
begin
prim_nev:=-1;
Graf tare conex .Componente tare conexe

Definitie:

398
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Un graf orientat G=(X,U) este tare conex, daca pentru oricare doua noduri x si y apartin
de X, exista un drum de la x la y precum si un drum de la y la x.

Definitie
Fiind dat un graf orientat G=(X,U), se numeste componenta tare conexa a lui G ,un
subgraf G1=(X1,U1),tare conex, si maximal in raport cu aceasta propietate (adica pentru orice
nod x apartine de X-X1, subgraful indus de X1 U{x} nu mai este tare conex).
APLICATIE
Algoritmul de descompunere a unui graf in componente tare conexe .
Componenta tare conexa din care face parte nodul i, este multimea :
S[i] ∩ P[i] U{i}

program tare_conexe; end;


type multime=set of byte; end;
var a:array[1..20,1..20] of integer ;
S,P,C:array[1..20] of multime; procedure
n,nc: integer; L:multime; formarea_matrice_drumur
i;
procedure citire_matrice; {formeaza matricea
{citeste numarul de noduri n si drumurilor (memorata tot
matrice de adiacenta a ,din fisierul in a), cu algoritmul Roy-
text} Warshall}
var i,j:integer; nume_fis:string; var i,j,k:integer;
f:text; begin
begin for k:=1 to n do
write(‘Dati numele for i:=1 to n do
fisierului ‘); for j:=1 to n do
readln(nume_fis); if a[i,j]=0 then
assign(f,nume_fis); a[i,j]:=a[i,k]*a[k,j];
reset(f); end;
readln(f,n);
for i:=1 to n do procedure det_S
begin (i:integer); {determina
for j:=1 to n do multimea S[i]}
read(f,a[i,j] ); var k:integer;
readln(f); begin
end; S[i]:=[ ];
end; for k:=1 to n do
if a[i,k]=1 then
procedure afisare_matrice; S[i]:=S[i]+[k] ;
{afiseaza matricea de end;
adiacenta }
var i,j:integer; procedure det_P
begin (i:integer); {determina
writeln (‘Graful are ‘ ,n, multimea P[i]}
‘ varfuri’); var k:integer;
writeln( ‘Matricea de begin
adiacenta este ‘); P[i]:=[ ];
for i:=1 to n do for k:=1 to n do
begin if a[k,i]=1 then
for j:=1 to n do P[i]:=P[i] +[k];
write(a[i,j]:2) ; end;
writeln;

399
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

procedure formare_
det_tare_conexe; matrice_drumuri;
{descompune graful in afisare_matrice; det_
componente tare conexe} tare_conexe;
var i,k:integer; end.
begin COMPONENTE TARE
L:=[ ]; {initializeaza CONEXE
multimea L a nodurilor EX:
care au fost incluse in {Se considera o multime
vreo componenta} formata din n persoane in
nc:=0; {initializeaza care fiecare persoana
numarul componentelor se cunoaste pe sine si
tare conexe} eventual alte persoane. Sa
for i:=1 to n do se formeze grupuri in
{parcurge nodurile de la i care fiecare persoana sa
1 la n}
if not (i in L) then cunoasca toate celelalte
{daca nodul i nu a fost persoane din grup( o
deja inclus in vreo persoana apartine unui
componenta} singur grup).
begin Relalia „ x cunoaste pe y"
{inaugureaza o nu este in mod normal nici
noua componenta ,deci simetrica, nici tranzitiva.
creste numarul
componentelor} Rezolvare
nc:=nc+1; Rezolvarea se bazeaza pe
det_S(i); algoritmul de determinare
{determina S[i]} a componentelor tare
det_P(i); conexe intr-un
{determina P[i]} graf orientat.}
C[i]:=(S[i]*P[i] ) +
[i]; {calculeaza program tareconexe;
componenta tare conexa type
C[i]} mat=array[1..50,1..50] of
{adauga C[i] la byte;
multimea nodurilor care var f:text;
fac deja parte dintr-o n:byte;
componenta} a:mat;
L:=L+C[i]; procedure citeste;
{tipareste var i,x,y:byte;
componenta conexa C[i]} begin
writeln assign(f,'in7.pas');
(‘Componenta conexa ] reset(f);
‘,nc, ‘este ‘ ); readln(f,n);
for k:=1 to n do
if k in C[i] then while not eof(f) do
write(k:3); begin
writeln; readln(f,x,y);
end; a[x,y]:=1;
end; end;
close(f);
begin end;
citire_ matrice;
afisare_matrice; procedure
Roy_Warshall;

400
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

var i,j,k:byte; viz[i]:=true;


begin for j:=1 to n do
for k:=1 to n do if(j<>i)and
for i:=1 to n do (a[i,j]<>0)and(a[j,i]<>0)th
for j:=1 to n do en
if a[i,j]=0 then begin
a[i,j]:=a[i,k]*a[k,j]; write(j,' ');
end; viz[j]:=true;
end;
procedure componente; k:=k+1;
var k,i,j:byte; writeln
viz:array[1..50] of end;
boolean; end;
begin
for i:=1 to n do begin
viz[i]:=false; citeste;
k:=1; Roy_Warshall;
for i:=1 to n do componente;
if not viz[i] then readln;
begin end.
writeln('Componenta',k,':
');
write(i,' ');

8.5 Drumuri minime si maxime in grafuri


orientate(Dijkstra,Roy-Floyd)

Consideram un graf orientat G=(X,U) cu n noduri, in care fiecarui arc ii este asociat un numar
intreg numit cost. Semnificatia
acestui cost poate fi foarte variata , in functie de domeniul pe care il descrie graful .

Matricea costurilor

Pentru evidentierea costurilor tuturor arcelor unui graf cu n noduri se poate defini o matrice a, cu
n linii * n coloane.Exista doua forme ale acestei matrici:
Forma a): Fiecare element a[i,j] poate fi:
c , daca exista un arc de cost c>0 intre nodurile i si j;
0 , daca i=j;
+∞ ,daca nu exista arc intre nodurile i si j .

Forma b): Este absolut similara,cu singura deosebire ca in loc de +∞ avem -∞.
Forma a) se foloseste pentru determinarea drumurilor de cost minim intre doua noduri , iar
forma b) este utilizata in aflarea drumurilor de cost maxim.

401
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Daca dorim sa citim matrice costurilor ,evident ca nu putem introduce de la tastatura “+”! In
loc de + vom da un numar intreg foarte mare.
Algoritmul lui Dijkstra

Se consideră un graf neorientat, conex cu N noduri. Graful este dat prin matricea
costurilor A.

c, dacã existã un arc c între nodurile i si j



Aij  0, daca i  j
x, dac nu exista un arc intre nodurile i si j

Se consideră un nod iniţial R. Se cer lungimile drumurilor minime de la R la celelalte noduri ale
grafului, precum şi nodurile prin care trec aceste drumuri.
Problema are numeroase aplicaţii practice. Să presupunem că dispunem de o hartă cu oraşele
unei ţări. Acestea sunt unite prin şosele. Oraşele formează nodurile grafului, iar şoselele – arcele
acestuia. Algoritmul furnizează drumurile optime de la un oraş iniţial la celelalte oraşe. Este
interesant de observat faptul că, spre deosebire de alţi algoritmi, acesta furnizează şi nodurile
prin care trec drumurile optime, nu numai lungimile acestora.

Exemplu: Se consideră graful din figură:

Pentru acest graf matricea costurilor este:

0  13  16 8 
 
 0  6  10 
13  0 14  11 
 
 6 14 0 5 17 
16   5 0 7 

8 10 11 17 7 0 

Întrucât graful este neorientat, matricea este simetrică.


Algoritmul selectează nodurile grafului, unul câte unul, în ordinea crescătoare a costului
drumului de la nodul R la ele, într-o mulţime S, care iniţial conţine numai nodul R. În felul

402
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

acesta ne încadrăm în strategia generală GREEDY. În procesul de prelucrare se folosesc trei


vectori: D,S şi T.
Vectorul D este vectorul costurilor de la nodul R la celelalte noduri ale grafului. Prin D(I), unde
I{1..N}, se înţelege costul drumului găsit la un moment dat, între nodul R şi nodul I.
Vectorul T indică drumurile găsite între nodul R şi celelalte noduri ale grafului.
Vectorul S (vector caracteristic) indică mulţimea S a nodurilor selectate. S(I)=0 dacă nodul I este
neselectat şi S(I)=1 dacă nodul I este selectat.

Prezentarea algoritmului.
P1) Nodul R este adăugat mulţimii S iniţial vidă (S(R)=1);
- costurile drumurilor de la R la fiecare nod al grafului se preiau în vectorul D de pe linia R
a matricii A;
- pentru toate nodurile I având un cost al drumului de la R la ele finit, se pune T(I)=R.
P2) Se execută de n-1 ori secvenţa
- printre nodurile neselectate se caută cel aflat la distanţa minimă faţă de R şi se selectează
adăugându-l mulţimii S;
- pentru fiecare din nodurile neselectate se actualizează în D costul drumurilor de la R la
el, utilizând ca nod intermediar nodul selectat, procedând în felul următor: se compară distanţa
existentă în vectorul D cu suma dintre distanţa existentă în D pentru nodul selectat şi distanţa de
la nodul selectat la nodul pentru care se face actualizarea distanţei (preluată din A), iar în cazul
în care suma este mai mică, elementul din D corespunzător nodului pentru care se face
actualizarea capătă ca valoare aceasă sumă şi elementul din T corespuzător aceluiaşi nod ia
valoarea nodului selectat (drumul trece prin acest nod). Presupunând că a fost selectat nodul K,
se actualizează distanţa pentru nodul L şi se compară D(K)+A(K,L) cu D(L).
P3) Pentru fiecare nod al grafului, cu excepţia lui R, se trasează drumul de la R la el.

Pentu acest exemplu se consideră R=1.


Linia 1 a matricei A aste încărcată în vectorul D, vectorii S şi T au iniţial valorile care
se observă:
D 0  1  1
3 6 8

S 1 0
0 0 0 0

T 0 0
1 0 1 0

Se selectează nodul 6 (costul drumului minim).


Se actualizează conţinutul vectirilor D, S şi T.

D(6)+A(6,2)=8+10=18< D(2)=18 şi T(2)=6


D(6)+A(6,3)=8+11=19>13D(3)=13.
D(6)+A(6,4)=8+17=25< D(4)=25 şi T(4)=6.
D(6)+A(6,5)=8+7=15<16 D(5)=15 şi T(5)=6.

1 1 2 1
D 0 8 3 5 5 8

S 1 0 0 0 0 1

T 0 6 1 6 6 1

Se selectează nodul 3.

403
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

D(3)+A(3,2)=13+>18D(2)=18.
D(3)+A(3,4)=13+14=27>25D(3)=13.
D(3)+A(3,5)=13+>15D(5)=15.

0 1 1 2 1
D 8 3 5 5 8

S 1 0
1 0 0 1

T
0 6 1 6 6 1

Se selectează nodul 5.
D(5)+A(5,2)=15+>18D(2)=18.
D(5)+A(5,4)=15+5=20D(4)=20 şi T(4)=5.

1 1 2 1
D 0 8 3 0 5 8

S 1 0 1 0 1 1

T 0 6 1 5 6 1

Se selectează nodul 2.
D(2)+A(2,4)=18+6=24>20D(4)=20.

1 1 2 1 8
D 0 8 3 0 5

S 1 1 1 0 1 1

1
T 0 6 1 5 6

Se selectează nodul 4.
În continuare, pentru fiecare nod se trasează drumul de la nodul iniţial la el.
Vom considera, ca exemplu, nodul 4. Distanţa de la nodul 1 la el D(4) şi anume 20.
Avem T(4)=5; T(5)=6; T(6)=1; drumul trece prin nodurile 1,6,5.
Avem A(1,6)=8; A(6,5)=7; A(5,4)=5.Rezultă 8+5+7=20.
Întrucât drumul se trasează în ordine inversă faţă de cum este găsit, în program se foloseşte o
procedură recursivă.
În cele ce urmează vom nota nodurile cu Ni1,Ni2,…,Nin. Acestea sunt tot nodurile 1,2,…,R,
…,N cosiderate în altă ordine. Nodului R îi corespunde nodul Ni1.

Demonstrarea algoritmului.

Lema 1. Algoritmul selectează nodurile în ordinea costului drumului de la nodul iniţial la ele.

Demonstraţie:
Utilizăm metoda inducţiei matematice. Prima dată se selectează nodul Ni2 (are costul drumului
minim faţă de Ni1). Aceasta înseamnă că ipoteza de inducţie se verifică pentru prima selecţie.

404
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Presupunem că nu au fost selectate nodurile Ni2,Ni3,…,Nip (p<n) în ordinea costului drumului


de la Ni1 la ele. Se selectează nodul Nip+1. Presupunem, prin absurd, că există un alt nod N1,
neselectat, care are un cost al drumului de la Ni1 la el mai scăzut decât al nodului Nip+1. Atunci,
acesta poate fi plasat în şirul nodurilor deja selectate, aşezate în ordinea distanţei faţă de Ni1, în
următoarele două moduri:
1) Ni1,…,N1,…,Nip,Nip+1.
În acest caz, se contrazice ipoteza de inducţie (nodurile Ni1,…,Nip erau aşezate în ordine
distanţei faţă de Ni1).

2) Ni2,…, Nip,N1,Nip+1.
Aici este contrazisă alegerea lui Nip+1. Acesta a fost ales ca nod cu distanţă minimă faţă de Nil
dintre toate nodurile neselectate, iar N1 este un nod neselectat.

Lema 2. Orice drum optim de la nodul iniţial la oricare din nodurile selectate trece numai prin
noduri selectate.

Demonstraţie:
Presupunem prin absurd că există un drum de cost mai mic de la Ni1 la Nik (Nik este un nod
deja selectat) care nu trece numai prin noduri selectate. Fie Nz primul nod prin care trece acest
drum şi care nu este selectat. Aceasta înseamnă că nodul Nz are costul drumului de la Ni1 la el
mai mic decât cel de la Ni1 la Nik (nod care este selectat). Aceasta contrazice LEMA 1.

TEOREMĂ.
Odată selectat un nod, nu există un drum de cost mai mic între Ni1 şi el, decât drumul de cost
indicat de vectorul D.

Demonstraţie:
În demonstrarea acestui fapt utilizăm metoda inducţiei matematice.
Pentru selectarea lui Ni2 afirmaţia este evidentă, întrucât acesta este cel mai apropiat de Ni1.
Presupunem selectate nodurile Ni2,…,Nip. Selectăm Nip+1. Presupunem că de la Ni1 la el există
un drum de cost mai mic decât cel indicat de vectorul D.
Avem două posibilităţi:

1) Drumul de cost mai mic trece numai prin noduri selectate.


Analizăm modul de funcţionare a algoritmului până în acest moment.
La selecţia nodurilor Ni1,…,Nip s-au actualizat distanţele reţinute în vectorul D (pentru fiecare
nod neselectat s-a comparat vechea distanţă reţinută în D cu suma dintre distanţa de la Ni1 la
nodul selectat şi distanţa de la nodul selectat la nodul pentru care se face actualizarea, iar în cazul
în care suma din urmă era mai mică, aceasta era reţinută în vectorul D). În concluzie, nu există
un drum mai scurt între Ni1 şi Nip+1 care trece numai prin noduri selectate.

2) Drumul de cost mai mic trece şi prin noduri neselectate.


În acest caz se contrazice LEMA 2.

elementar separate prin spatii;


- pe urmatoarele n linii se gasesc valorile matricei
{Fiind dat un graf neorientat G si doua varfuri x si y de adiacenta separate
in acest graf, sa se prin spatii. Datele de iesire se vor afrsa pe ecran si
determine un lant elementar de lungime minima, vor consta in:
avand ca extremitati - mesajul "Nu exista lanl elementar Fntre cele doua
varfurile date. Datele de intrare se citesc din fisierul varfuri"
Graf.dat care are sau
urmatoarea componenta: - mesajul "Lantul minim are lungimea .... ", iar pe
- pe prima linie se afla numarul de varfuri ale linia urmatoare varfurile
grafului(n); lantului
- pe a doua linie sunt inscrise cele doua extremitati separate printr-un spatiu.
ale lantului

405
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Rezolvare if a[x,y]=infinit then writeln('Nu exista lant


Rezolvarea acestei probleme se bazeaza pe formarea elementar intre cele doua varfuri')
matricei lanturilor. Un else
element al acestei matrici va contine Iungimea begin
lantului minim dintre varfurile writeln('Drumul minim are lungimea:',a[x,y]);
corespunzatoare liniei si coloanei.} write(x,' ');
program lant_elementar; drum(x,y);
const infinit=100; end;
type matrice=array[1..20,1..20] of byte; readln;
var n,x,y:byte;a:matrice;f:text; end.
procedure citeste;
var i,j,p,q:byte; ALGORITMUL DIJKSTRA
begin Program dijkstra;
assign(f,'in2.pas');reset(f); Type mat=array[1..10,1..10] of integer;
readln(f,n); vect=array[1..10] of integer;
var a:mat;
for i:=1 to n do s,t,d:vect;
for j:=1 to n do n,I,j,r,min,poz:integer;
if i=j then a[i,j]:=0
else a[i,j]:=infinit; procedure drum(I:integer);
readln(f,x,y); begin
while not eof(f) do if t[i]<>0
begin then
readln(f,p,q); begin
a[P,q]:=1; a[q,P]:=1; drum(t[i]);write(i);
end; end
close(f) else write(I);
end;
end; begin
prOcedure mat_drumuri; write (‘n=’);readln(n);
var i,j,k:byte; writeln(‘Introduceţi matricea
begin costurilor’);
for k:=1 to n do for I:=1 to n do
for i:=1 to n do for j:=I+1 to n do
for j:=1 to n do begin
if a[i,j]>a[i,k]+a[k,j] then write(‘a[‘,I,’,’,j,’]=’);
begin readln(a[I,j]); a[j,I]:=a[I,j];
a[i,j]:=a[i,k]+a[k,j]; end;
a[j,i]:=a[i,j]; writeln(‘Introduceţi nodul de pornire’);
end; write(‘r=’); readln(r);
end; for I:=1 to n do
procedure drum(v1,v2:byte); begin
var k:byte;gasit:boolean; s[I]:=0; t[I]:=0;
begin a[I,I]:=0;
k:=1;gasit:=false; end;
while(k<=n)and not gasit do s[r]:=1;
begin for I:=1 to n do
if(v1<>k)and(v2<>k)and(a[v1,v2]=a[v1,k] begin
+a[k,v2])then d[I]:=a[r,I];
begin if I<>r then
drum(v1,k);drum(k,v2); t[I]:=r;
gasit:=true; end;
end; for I:=1 to n-1 do
k:=k+1; begin
end; min:=30000;
if not gasit then write(v2,' '); for j:=1 to n do
end; if s[j]=0 then
begin begin
citeste; min:=d[j];
mat_drumuri; poz:=j;

406
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; if I<>r then


s[poz]:=1; begin
for j:=1 to n do writeln(‘Distanţa de la nodul’,r,’la
if s[j]=0 then nodul’,’este ‘,d[I]);
if d[j]>d[poz]+a[poz,j] then drum[I];
begin writeln;
d[j]:=d[poz] end;
+a[poz,j]; end.
t[j]:=poz;
end;
end;
for I:=1 to n do

Algoritmul Roy Floyd


Fiind dat un graf prin matricea ponderilor sa se calculeze drumul (lungimea lui adica
suma costurilor) minim de la orice doua noduri din graf.

matricea ponderilor este


019ω 3
ω 0 7 3 ω
ω ω 0 ω ω
1 ω 2 0 ω
ω 4 ω 2 0

Etapa 1)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 1
a[4,2]= ω >a[4,1]+a[1,2]=1+1=2 deci a[4,2]=2
a[4,5]=ω>a[4,1]+a[1,5]=1+3=4 deci a[4,5]=4
matricea ponderilor este

019ω 3
ω 0 7 3 ω
ω ω 0 ω ω
1 2 2 0 4
ω 4 ω 2 0

407
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Etapa 2)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 2
a[1,3]=9>a[1,2]+a[2,3]=1+7=8 deci a[1,3]=8
a[1,4]=ω>a[1,2]+a[2,4]=1+3=4 deci a[1,4]=4
a[5,3]=ω>a[1,2]+a[2,3]=4+7=11 deci a[5,3]=11
a[5,4]=ω>a[5,2]+a[2,4]=4+3=7 deci neschimbat

matricea ponderilor este

0184 3

408
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

ω 0 7 3 ω
ω ω 0 ω ω
1 2 2 0 4
ω 4 11 2 0

Etapa 3)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 3 dar nu avem nimic nou.
Etapa 4)Caut drumurile optime intre oricare doua noduri dar drumurile trec prin nodul
intermediar 4
a[1,3]=ω>a[1,4]+a[4,3]=4+2=6 deci a[1,3]=6
a[2,1]=ω>a[2,4]+a[4,1]=3+1=4 deci a[2,1]=4
a[2,3]=ω>a[2,4]+a[4,3]=3+2=5 deci a[2,3]=5
a[2,5]=ω>a[2,4]+a[4,5]=3+4=7 deci a[2,5]=7
a[5,1]=ω>a[5,4]+a[4,1]=2+1=3 deci a[5,1]=3
a[5,3]=ω>a[5,4]+a[4,3]=2+2=4 deci a[5,3]=4

0164 3
4 0 5 3 7
ω ω 0 ω ω
1 2 2 0 4
3 4 4 2 0

409
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

{Fiind dat un graf orientat si var a:array [1..50,1..50] of


conex cum n noduri .Sa se real;
determine n,i,j:integer;
drumul cel mai scurt intre doua
noduri(exemplu intre primul si procedure drum(i,j:integer);
ultimul var k:integer;gasit:boolean;
) adica drumul care are costul begin
cel mai mic Se va introduce k:=1;
acolo unde nu avem arc orientat gasit:=false;
sau nu avem drum while (k<=n) and not gasit do
intre doua noduri o cifra mare begin
cum ar fi 300 pe rol de infinit if (i<>k) and (j<>k) and
VARIANTA 1;fiind date n orase (a[i,j]=a[i,k]+a[k,j])
si costurile tuturor drumurilor then
directe begin
care exista intre orase sa se drum (i,k);
afle costul minim de a ajunge drum(k,j);
dintr-un oras in oricare altul} gasit:=true;
program dm; end;
type matrice=array[1..9,1..9] k:=k+1;
of integer; end;
var a:matrice; if not gasit then
i,j,k,n:integer; write(j,' ');
begin end;
write('n=');
readln(n); procedure scriu(ni,nf:byte);
for i:=1 to n do begin
for j:=1 to n do if a[ni,nf]<minfinit then begin
if i<>j then writeln('drumul de la ',ni,'
begin la ',nf,' are lungimea
write('a[',i,',',j,']='); ',a[ni,nf]:5:0);
readln(a[i,j]); write(ni,' ');
end; drum(ni,nf);
for k:=1 to n do end
for i:=1 to n do else write('nu este drum de la
for j:=1 to n do ',ni,' la ',nf);
if a[i,j]>a[i,k]+a[k,j] then writeln;
a[i,j]:=a[i,k]+a[k,j]; end;
writeln;
writeln('matricea este '); procedure lungime;
for i:=1 to n do var i,j,k:integer;
begin begin
for j:=1 to n do for k:=1 to n do
write(a[i,j],' '); for i:=1 to n do
readln; for j:=1 to n do
end if a[i,j]>a[i,k]+a[k,j] then
end. a[i,j]:=a[i,k]+a[k,j];
{Fiind dat un graf orientat si end;
conex cum n noduri .Sa se
determine begin
drumul cel mai scurt intre doua write('n=');
noduri(exemplu intre primul si readln(n);
ultimul for i:=1 to n do
) adica drumul care are costul for j:=1 to n do
cel mai mic Se va introduce if i=j then
acolo unde nu avem arc orientat a[i,j]:=0
sau nu avem drum else a[i,j]:=minfinit;
intre doua noduri o cifra mare for i:=1 to n do
cum ar fi 300 pe rol de for j:=1 to n do
infinit} if i<>j then
const minfinit=1.e20; begin

410
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write('a[',i,',',j,']='); scriu(i,j);
readln(a[i,j]); writeln;
end; readln;
lungime; end.
for i:=1 to n do
for j:=1 to n do

8.6 Grafuri euleriene si hamiltoniene


Grafuri hamiltoniene
Definitie:
Se numeste ciclu hamiltonian intr-un graf, un ciclu elementar care contine toate varfurile grafului .
Se numeste graf hamiltonian ,un graf care contine un ciclu hamiltonian.
Se numeste lant hamiltonian intr-un graf, un lant elementar care contine toate varfurile grafului.
Teorema:
Daca intr-un graf G=(X,U) cu n>=3 varfuri, gradul fiecarui varf x verifica conditia d(x)>=n/2,
atuncigraful este hamiltonian,

procedure afis(x:sir;k:integer);
{ Se citeste matricea de adiacenta la un var i:integer;
graf neorientat begin
Sa se genereze toate ciclurile hamiltoniene for i:=1 to k do
ale acestuia write( x[i] ,' ');
write(x[1]:4);
ex:n=3 writeln;
=>1 3 2 1 end;
1 2 3 1}
type sir =array[1..100] of integer; begin

var x:sir; write('dati numarul de noduri din graf');


p,i,j,k,n,k1:integer; readln(n);
as,ev:boolean;
a:array[1..50,1..50] of integer; for i:=1 to n-1 do
begin
procedure succesor(var x:sir;k:integer;var for j:=i+1 to n do
as:boolean); begin
begin write('numarul ',i,',',j,' este ');
if (x[k]<n) then begin readln(a[i,j]);
as:=true; x[k]:=x[k]+1; a[j,i]:=a[i,j];
end;
end end;x[1]:=1;
else k:=2; j:=0;
as:=false; x[k]:=1;
end; while(k>0) do
begin
procedure valid(x:sir;k:integer;var repeat
ev:boolean); succesor(x,k,as);
var i:integer; if as then valid(x,k,ev)
begin until (as and ev) or (not as);
ev:=true; if as then
if a[x[k-1],x[k]]=0 then ev:=false if (k=n) then
else afis(x,k)
begin else
for i:=1 to k-1 do begin
if x[k]=x[i] then ev:=false; k:=k+1;
if (k=n) and(a[x[n],x[1]]=0) then ev:=false; x[k]:=1;
end; end
end; else
k:=k-1 ;

411
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end; end.
readln;
Grafuri euleriene
Definitie:
Se numeste ciclu eulerian intr-un graf, un ciclu care contine toate muchiile grafului.
Se numeste graf eulerian, un graf care contine un ciclu eulerian.

Teorema:
Un graf fara varfuri izolate este eulerian, daca si numai daca este conex, si gradele tuturor
varfurilor sunt numere pare
function conex:boolean;
{Stiind ca un graf conex(are o singura var b,viz:array[1..20] of byte;
componenta conexa) , i,j,p,u,v:byte;
fara virfuri izolate si care are gradele fiecarui begin
virf un numar par for j:=1 to n do
Sa se determine daca este ciclu eulerian sa nu viz[j]:=0;
ex:n=3 b[1]:=1;
m=3 si anume (1,2),(1,3),(2,3) p:=1;
=>1 2 3 1 e ciclu eulerian} u:=1;
var eulerian:boolean; viz[1]:=1;
e,grd,nd,c1:array[1..20] of integer; while p<=u do begin
a:array[1..20,1..20] of integer; v:=b[p];
n,m,i,j,k,k1,x,y,l:integer; for j:=1 to n do
viz:array[1..20] of byte; if (a[v,j]=1) and (viz[j]=0) then
function izolate:boolean; begin
var i,j,m,intr:byte; u:=u+1;
begin b[u]:=j;
izolate:=false; viz[j]:=1;
for i:=1 to n do end;
begin p:=p+1;
intr:=0; end;
for j:=1 to n do conex:=true;
intr:=intr+a[i,j]; for i:=1 to n do
grd[i]:=intr; if viz[i]=0 then begin
if intr=0 then begin conex:=false;
izolate:=true; break;
break; end;
end; end;
end; begin
end; write(' cite noduri are graful n=');
function gradepare:boolean; readln(n);
var i:byte; write(' cite muchii are graful m=');
begin readln(m);
gradepare:=true; for I:=1 to n do
for i:=1 to n do for j:=1 to n do
if odd(grd[i]) then begin a[i,j]:=0;
gradepare:=false; writeln('dati muchiile ');
break; for i:=1 to m do
end; begin
end; writeln('primul nod al muchiei ',i,' este
');readln(x);

412
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

writeln('urmatorul nod al muchiei ',i,' este break;


');readln(y); end;
a[x,y]:=1; k1:=1;
a[y,x]:=1; repeat
end; for j:=1 to n do
eulerian:=not izolate and gradepare and conex; if a[c1[k1],j]=1 then begin
if not eulerian then writeln ('graful nu este k1:=K1+1;
eulerian ') c1[k1]:=j;
else a[c1[k1-1],j]:=0;
begin a[j,c1[k1-1]]:=0;
writeln('este eulerian '); grd[j]:=grd[j]-1;
nd[1]:=1; grd[c1[k1-1]]:=grd[c1[k1-1]]-1;
k:=1; break;
repeat end;
for j:=1 to n do until c1[k1]=c1[1];
if a[nd[k],j]=1 then begin for j:=k downto L do
k:=k+1; nd[j+k1-1]:=nd[j];
nd[k]:=j; for j:=1 to k1-1 do
a[nd[k-1],j]:=0; nd[j+1]:=c1[j+1];
a[j,nd[k-1]]:=0; k:=K+k1-1;
grd[j]:=grd[j]-1; end;
grd[nd[k-1]]:=grd[nd[k-1]]-1; writeln('un ciclu care trece prin toate muchiile
break; este ');
end; for i:=1 to m+1 do
until nd[k]=1; write(' ',nd[i]);
while k-1 <m do begin end;
for i:=1 to k-1 do readln;
if grd[nd[i]]>0 then begin end.
c1[1]:=nd[i];
L:=i;

8.7 Arbori,arbori partiali de cost minim


Arbori
Noţiunea de arbore

Definiţie. Se numeşte arbore un graf orientat care este conex si nu conţine cicluri.

Problema. Se citeşte un graf sa se scrie un program care sa verifice daca este arbore.

1. Mai întâi trebuie văzut daca graful este conex. In cazul grafurilor orientate aceasta problema se rezolva printr-o
simpla parcurgere in adâncime (DF). Dar in cazul grafurilor neorientate? Aici apare o problema. De la nodul i la
nodul j exista doua arce, de la i la j si de la j la i. Aceasta conduce la semnalarea unui ciclu fals. Pentru rezolvarea,
după alegerea unei muchii ,de exemplu de la i la j se elimina muchia de la j la i. In final daca au fost atinse toate
nodurile(adică daca orice componenta a vectorului s retine numai 1) înseamnă ca graful este conex.

2. Trebuie analizat daca graful nu are cicluri. Aceasta problema se rezolva tot cu ajutorul parcurgerii in adâncime.
Parcurgerea asigura selecţia unei muchi o singura data. Daca graful are cel puţin un ciclu, atunci un nod este atins
de doua ori. Cum ne putem da seama ca aceasta are loc? simplu, daca a fost atins un nod i , după care s[i]=1.

In aceste condiţii, nu se face decât o simpla parcurgere in adâncime. Iată programul:

program arbore ;

413
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

uses grafuri;
var s:array[1.. 50] of byte;
A:mat_ad;
gasit:boolean;
n,i,suma:integer;

procedure df_r(nod:byte);
var k:byte;
begin
s[nod]:=1;
for k:=1 to n do
if (a[nod,k]=1)
then
begin
a[k,nod]:=0;
if s[k]=0; then df_r(k)
else gasit:=true;
end;
end ;

begin
clrscr;
citiren( ` graf.txt `,a,n);
df_r(1);
suma:=0;
for i:=1 to n do suma:=suma +s[i];
if suma<>n then
writeln( `graful nu este conex `);
else if gasit then writeln( ` graful are ce putin un ciclu `);
else writeln( ` este arbore `);
end. .

 Complexitatea algoritmului este cea a parcurgerii in adancime:O(m),unde m reprezintă numărul de muchii.

Mai jos este reprezentat grafic acelasi arbore in mai multe feluri. Ultimele 3 reprezentări sunt
făcute considerând pe rând ca vârf al arborelui nodurile 1,3,2. de asemenea ultimele trei
reprezentări justifica si denumirea data grafurilor conexe si fara cicluri, cea de arbori.

414
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Teorema. Fie G un graf neorientat cu n noduri. G este arbore daca si numai daca g are n-1 muchii si nu
contine cicluri.

Demonstraţie :

 Vom demonstra prin inducţie. Daca n=1,numarul muchiilor este 0(se verifica). Vom presupune
proprietatea adevărata pentru arbori cu n noduri(vom avea n-1 muchii). Fie un arbore cu n+1 noduri.
Exista cel putin un nod terminal(nod care are o singura muchie incident). Daca nu ar exista un astfel de
nod, arborele va contine cicluri(se contrazice definiţia). Eliminam nodul terminal si muchia care ii este
incident. Obţinem un arbore cu n noduri. Conform ipotezei făcute aceasta va avea n-1 muchii.
Înseamnă ca arborele cu n+1 noduri va avea n muchii(n- 1 +1).

 Fie un graf cu n-1 muchii care nu contine cicluri. Rămâne de dovedit ca G este conex. Vom
demonstra prin reducere la absurd. Presupunem ca G nu este conex. Fie G 1, G2, .. ,Gp componentele
conexe. Fiecare dintre ele indeplineste conditiile:

2) Este conexa(asa a fost aleasa);


3) Nu contine cicluri(pentru ca G nu contine cicluri).

Rezulta ca fiecare dintre ele este arbore. Fie mi numarul muchiilor si ni numarul nodurilor fiecarui arbore
Gi. Avem mi=ni-1. Dar m1+m2+….+mp=n-1. Rezulta: n1-1+n2-1+…..np-1=n-1, deci n1+n2+…..+np=n+p-1.
Dar G are n noduri. Rezulta :n+p-1=n,deci p=1. In concluzie exista o singura componenta conexa care
nu contine cicluri. Deci G este arbore.

 Din demonsratie s-a vazut ca un graf neorientat fara


cicluri dar neconex este alcătuit, din mai mulţi arbori.
Din acest motiv, un astfel de graf se numeşte pădure !
 Tot in aceasta demonstatie, a fost introdus termenul de nod terminal al unui arbore cu
o singura muchie incident.

 Ati reţinut, ca arborele poate fi privit ca avand un anumit varf ! Varf al arborelui poate
fi oricare nod al sau, deci si unul termial !

415
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Algoritmul lui Prim

Fie G=(X,) un graf neorientat şi conex. Graful este dat prin matricea costurilor. Se cere să se
determine arborele de cost parţial minim (între oricare două noduri să existe un drum), iar în plus suma
muchiilor să fie minimă.
O problemă concretă, în care intervine problema enunţată, este cea a conectării oraşelor cu
cost minim.
Avem N oraşe precum şi costul conectării anumitor perechi de oraşe. Se cere să se genereze
muchii care asigură existenţa unui drum între oricare două oraşe astfel încât costul cuplării să fie
minim.
Pentru rezolvare se folosesc trei vectori:
-vectorul S, vector caracteristic. Avem S(I)=0 dacă nodul I nu aparţine arborelui construit şi
S(I)=1 în caz contrar;
-vectorul T reţine pentru fiecare nod care se adaugă arborelui nodul părinte al acestuia (cu
ajutorul acestui vector se poate reconstitui arborele);
-vectorul P reţine pentru fiecare nod C costul arcului de la părinte la el.

Prezentarea algoritmului.

P1) Se citeşte N (numărul nodurilor), matricea costurilor A şi nodul de pornire V (S(V)=1);

P2) Se alege muchia de cost minim (L,C) care are o extremitate într-unul din nodurile
arborelui deja construit (S(L)=1), iar cealălaltă într-un nod care nu aparţine arborelui (S(C)=0). Se pune
T(C)=L şi P(C)=A(L,C);

P3) Dacă nu au fost alese N-1 muchii, se reia pasul 2.

Exemplu. Fie graful din figura următoare: (s=(0 1 1 1 1) )

3 2

5 2

416
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

2 1 5

4 3

4
Se porneşte cu nodul 1(v=1).
Alegem muchia de cost minim (1,2).
S=(0 0 2 2 1)

Pentru nodurile 1 şi 2, ca puncte de plecare, se alege muchia de cost


minim (2,4) si s=(0 0 4 0 1)

1
4

Pentru nodurile 1,2 şi 4 se alege muchia de cost minim (1,5).


S=(0 0 4 0 0)

2 3
5

417

41
2 5
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Pentru nodurile 1,2,4 şi 5 se alege muchia de cost minim (4,3) .

1
3
2

4
3

s=(0 0 0 0 0)
Am ales patru muchii şi s-a obţinut muchia de cost minim.
Configuraţiile finale ale vectorilor T şi P sunt:

1 2 3 4 5
T 0 1 4 2 1
P 0 2 4 1 3

Dacă pornim dintr-un alt nod, este posibil să obţinem un alt arbore dar şi el va avea costul
minim.

Demonstrarea algoritmului.

În urma aplicării algoritmului se obţine un arbore (vom avea N noduri şi N-1 muchii).
Rămâne de demonstrat că acest arbore este de cost minim. Notăm cu Gk=(Xk,k) arborele
obţinut după alegerea a k muchii, cu k{1,2,…,N-1}. Fie G1 un arbore de cost minim. Fie M1,M2,
…,Mk primele k muchii găsite în urma aplicării algoritmului pentru arborele Gk+1. Considerăm că
muchia Mk este prima muchie care nu aparţine lui G1. Fie P şi Q cele două noduri unite de muchia Mk.
Este evident că în G1, cele două nu sunt unite direct (în caz contrar muchia Mk ar face parte din arborele
G1). Aceasta înseamnă că în G1, nodurile P şi Q sunt unite printr-un lanţ. Acest lanţ nu aparţine lui G k+1,
pentru că el împreună cu Mk ar forma un ciclu. Înseamnă că acest lanţ uneşte în G1 două noduri, P1 şi
Q1 cu P1Xk şi Q1Xk. În caz contrar dacă ar uni numai noduri din Xk înseamnă că Gkm ar conţine un
lanţ (conţine muchia Mk, care uneşte pe P şi Q, conţine şi restul lanţului din G1 pentru că primele k
noduri în G1 şi Gk sunt legate identic). Presupunem nodurile P1 şi Q1 unite prin muchia M1. Înlocuim
în G1 pe M1 cu Mk. În urma acestei înlocuiri,G1 se transformă într-un alt arbore G2. Dar
A(P,Q)A(P1,Q1) pentru că în caz contrar, prin logica algoritmului, s-ar fi ales muchia M1. Aceasta
înseamnă că arborele parţial G2 rămâne tot de cost minim. În plus G1 şi Gk+1 au k+1 muchii care
coincid. Repetăm procedeul până obţinem coincidenţa a n-1 muchii. Rezultă de aici că l-am
transformat pe G1 în arborele generat de algoritm fără a-i modifica costul. În concluzie arborele generat
de algoritm este de cost minim.

418
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Program prim;
Type matrice=array[1..9,1..9] of integer;
vector=array[1..9]of integer;
var a:matrice;
s,t,p:vector;
n,I,j,k,v,min,l,c:integer;
begin
write(‘n=’); readln(n);
for l:=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;
write (‘nodul de pornire=’); readln(v);
for I:=1 to n do begin
s[I]:=0;
t[I]:=0;
p[I]:=0
end;
s[v]:=1;
for k:=1 to n-1 do begin
min:=30000;
for I:=1 to n do
for j:=1 to n do
if (s[I]=1)and (s[j]=0)and (min>a[I,j])then
begin
min:=a[I,j];
I:=I;
c:=j
end;

s[c]:=1; t[c]:=1; p[c]:=a[1,c]


end;
for I:=1 to n do
write (t[I],’ ‘);
writeln;
for I:=1 to n do
write(p[I],’ ‘);
end.

8.8 Arbori cu radacina:metode specifice de


reprezentare in memorie.Arbori binari

ARBORI SI ARBORESCENTE
Arbori
Noţiunea de arbore

Definiţie. Se numeşte arbore un graf orientat care este conex si nu conţine cicluri.

419
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Problema. Se citeşte un graf sa se scrie un program care sa verifice daca este arbore.

1. Mai întâi trebuie văzut daca graful este conex. In cazul grafurilor orientate aceasta problema se rezolva printr-o
simpla parcurgere in adâncime (DF). Dar in cazul grafurilor neorientate? Aici apare o problema. De la nodul i la
nodul j exista doua arce, de la i la j si de la j la i. Aceasta conduce la semnalarea unui ciclu fals. Pentru rezolvarea,
după alegerea unei muchii ,de exemplu de la i la j se elimina muchia de la j la i. In final daca au fost atinse toate
nodurile(adică daca orice componenta a vectorului s retine numai 1) înseamnă ca graful este conex.

2. Trebuie analizat daca graful nu are cicluri. Aceasta problema se rezolva tot cu ajutorul parcurgerii in adâncime.
Parcurgerea asigura selecţia unei muchi o singura data. Daca graful are cel puţin un ciclu, atunci un nod este atins
de doua ori. Cum ne putem da seama ca aceasta are loc? simplu, daca a fost atins un nod i , după care s[i]=1.

In aceste condiţii, nu se face decât o simpla parcurgere in adâncime. Iată programul:

program arbore ;
uses grafuri;
var s:array[1.. 50] of byte;
A:mat_ad;

420
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

gasit:boolean;
n,i,suma:integer;

procedure df_r(nod:byte);
var k:byte;
begin
s[nod]:=1;
for k:=1 to n do
if (a[nod,k]=1)
then
begin
a[k,nod]:=0;
if s[k]=0; then df_r(k)
else gasit:=true;
end;
end ;

begin
clrscr;
citiren( ` graf.txt `,a,n);
df_r(1);
suma:=0;
for i:=1 to n do suma:=suma +s[i];
if suma<>n then
writeln( `graful nu este conex `);
else if gasit then writeln( ` graful are ce putin un ciclu `);
else writeln( ` este arbore `);
end. .

 Complexitatea algoritmului este cea a parcurgerii in adancime:O(m),unde m reprezintă numărul de muchii.

Mai jos este reprezentat grafic acelasi arbore in mai multe feluri. Ultimele 3 reprezentări sunt
făcute considerând pe rând ca vârf al arborelui nodurile 1,3,2. de asemenea ultimele trei
reprezentări justifica si denumirea data grafurilor conexe si fara cicluri, cea de arbori.

421
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Teorema. Fie G un graf neorientat cu n noduri. G este arbore daca si numai daca g are n-1 muchii si nu
contine cicluri.

Demonstraţie :

 Vom demonstra prin inducţie. Daca n=1,numarul muchiilor este 0(se verifica). Vom presupune
proprietatea adevărata pentru arbori cu n noduri(vom avea n-1 muchii). Fie un arbore cu n+1 noduri.
Exista cel putin un nod terminal(nod care are o singura muchie incident). Daca nu ar exista un astfel de
nod, arborele va contine cicluri(se contrazice definiţia). Eliminam nodul terminal si muchia care ii este
incident. Obţinem un arbore cu n noduri. Conform ipotezei făcute aceasta va avea n-1 muchii.
Înseamnă ca arborele cu n+1 noduri va avea n muchii(n- 1 +1).

 Fie un graf cu n-1 muchii care nu contine cicluri. Rămâne de dovedit ca G este conex. Vom
demonstra prin reducere la absurd. Presupunem ca G nu este conex. Fie G 1, G2, .. ,Gp componentele
conexe. Fiecare dintre ele indeplineste conditiile:

4) Este conexa(asa a fost aleasa);


5) Nu contine cicluri(pentru ca G nu contine cicluri).

Rezulta ca fiecare dintre ele este arbore. Fie mi numarul muchiilor si ni numarul nodurilor fiecarui arbore
Gi. Avem mi=ni-1. Dar m1+m2+….+mp=n-1. Rezulta: n1-1+n2-1+…..np-1=n-1, deci n1+n2+…..+np=n+p-1.
Dar G are n noduri. Rezulta :n+p-1=n,deci p=1. In concluzie exista o singura componenta conexa care
nu contine cicluri. Deci G este arbore.

 Din demonsratie s-a vazut ca un graf neorientat fara


cicluri dar neconex este alcătuit, din mai mulţi arbori.
Din acest motiv, un astfel de graf se numeşte pădure !
 Tot in aceasta demonsratie, a fost introdus termenul de nod terminal al unui arbore cu
o singura muchie incident.

 Ati reţinut, ca arborele poate fi privit ca avand un anumit varf ! Varf al arborelui poate
fi oricare nod al sau, deci si unul termial !

Metode de memorare a arborilor

1. asa cum am aratat, un arbore este un graf neorientat, cu anumite


proprietati. Aceasta inseamna ca el poate fi reprezentat ca un graf. De aici
rezulta ca pentru reprezentarea unui arbore se pot utilza:

- matricea de adiacenta;
- liste de adiacente.
2. O a doua forma de reprezentare a arborilor este legatura de tip TATA . arborele se
reprezinta sub forma unui vector t cu n componente: daca t[i]=k, atunci nodul i
este descendent al nodului k. Daca nodul i este varf, t[i]=0.

422
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

5 3 5 5 0 3 4 1 7--------- k
1 2 3 4 5 6 7 8 9 --------- t[i]

 Legatura de tip TATA se mai numeste si legatura cu referinte ascendente.

 In mod evident, legatura de tip TATA este determinata si de nodul ales ca varf ! Daca, de exemplu
pentru acelasi arbor varful este 9, reprezentarea este alta. Este ca si cum „apucam” arborele de un nod
si celelalte cad !

 De fapt prin legatura de tip TATA se reprezinta o padure !

035003 417
123456789

 Aceasta reprezentare a mai fost intalnita. De exemplu, la altgoritmul lui Dijkstra !

3.Codul lui Puffer(facultativ). Pentru a reprezenta un arbore oarecare se pot utiliza doi vectori, pe care-i
vom numi t-de la nodul terminal – si pt – de la parinte nod terminal. Modul in care acestia retin datele
este explicat mai jos:

 Se cauta cel mai mic nod terminal, acesta este retinut in vectorul t iar parintele sau este
memorat in vectorul pt.
 Se obtine un nou arbore renuntand la nodul terminal si la muchia care-l uneste de parinte.
 Procedeul se rea pana cand ramane un arbore cu un singur nod.

Exemplu .

Pentru arborele alaturat cel mai mic nod terminal este doi,iar parintele trei.

423
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In noul arbore ,cel mai mic nod terminal este 6, iar parintele lui 6 este 3.

Cel mai mic nod terminal este 3, iar parintele 5.

Cel mai mic nod terminal este 8, iar parintele sau este 1.

Cel mai mic nod terminal este 1, iar parintele sau este 5.

424
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Pana in acest moment am


memorat arborele prin utilizarea a 2 vectori t si pt. Fiecare dintre ei, are n-1 componente!

 Prin logica altgoritmului nodul care ramane este cel mai mare adica nodul n. Acesta este ultimul
memorat in vectorul pt.Prin urmare, daca se cunoaste n sunt suficiente n-2 componente pentru vectorul
pt.

 Foarte important! Vectorul t se poate reconstitui doar daca cunoastem vectorul pt. aceasta inseamna
ca un arbore cu n noduri a fost memorat doar printr-un vector cu n-2 componente!

Pentru reconstituirea vectorului t pornim de la pt,vom incepe prin a memora in pt, numarul n, pentru
componenta n-1. vectorul t se reconstituie prin formula:

i{1,2…n-1}

425
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

t[i]=min{kk{t[1]=t[2],…t[i-1],pt[i],pt[i+1]…pt[n-1]}}

Cum s-a dedus formula de mai sus?

- daca numarul se gaseste in pt[i],pt[i+1],…pt[n-1] inseamna ca nodul respectiv nu a fost eliminat pana
la pasul i, pentru ca este parinte.
- daca numarul se gaseste in t[1],t[2],…t[i-1] inseamna ca a fost extras la unul din pasii anteriori.
- dintre nodurile care nu se gasesc ca mai sus , la pasul i a fost extras nodul minim.

Exemplu. Plecam de la n=9,si pt={3 3 5 1 5 4 7 }


Pasul 1
T={}
Pt={3 3 5 1 5 4 7,9}
Cel mai mic numar care nu se gaseste in pt si este intre 1 si 9 este 2.

Pasul 2
T={2}
Pt={3 3 5 1 5 4 7,9}
Se alege 6.

Pasul 3.
T={2 6 }
Pt={3 3 5 1 5 4 7,9}
Se alege 3.

Programul care urmeaza citeste de la tastatura n si pt, dupa care tipareste vectorul t.

Program puffer;
Var t,pt:array[1..50] of byte;
Var i,j,k,n:byte;
Gasit:boolean;
Begin
Write(`n=`);readln(n);
For i:=1 to n-2 do begin
Write(`pt[`,i,`]=`);readln(pt[i]);
End;
Pt[n-1]:=n;
K:=n;
For i:=1 to n-1 do
Begin
K:=1;
Repeat
Gasit:=false;
For j:=1 to i-1 do
If t[j]=k then
Gasit:=true;
If not gasit
Then
For j:=1 to n-1 do
If pt[j]=k then
gasit: = true;
if gasit then k:=k+1;
until not gasit;
st[i]:=k;
end;
for i:=1 to n-1 do

426
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

write(t[i],` `);
end.

 Foarte important. Cati arbori cu n noduri exista? Vectorul pt are n-2 componente si
fiecare componenta poate retine valori intre 1 si n. Deci exista n n-2 arbori cu n noduri.
 Pornind de la u un arbore ,i se asociaza prin codul lui Puffer un vector cu n-2
componente. Se arata usor ca daca arborii sunt diferiti codificarea lor este diferita. Tot
asa, pornind de la un vector cu n-2 componente, unde fiecare ia valori intr 1 si n se
ajunge la un arbore. Cu alte cuvinte am definit o functie f pe multim,ea arborilor care
ia valori in produsul cartezian:

(1,2,…n)*(1,2,…n)*…(1,2,…n)

 Din cele aratate rezulta ca f este bijectiva. Prin urmare tinand cont de faptul ca functia
este definita pe o multime finita,numarul de elemente al codomeniului este egal cu
numarul de elemente al domeniului de definitie. Aceasta explica modul in care a fost
determinat numarul de arbori
 Codul lui pruffer asociaza acelasi cod arborelui indiferent de reprezntarea grafica
folosita.

Arbori

Definitie : Un graf conex si fara cicluri se numeste arbore .


Teorema
Fie un graf G=(X,U) . Urmatoarele afirmatii sunt echivalente :
4. G este arbore .
5. G este un graf conex ,minimal in raport cu aceasta propietate (eliminand o muchie oarecare
se obtine un graf ne-conex).
6. G este un graf fara cicluri,maximal in raport cu aceasta propietate (adaugand o muchie
oarecare, se obtine un graf care are cel putin un ciclu).
In cazul arborilor ,in loc de “varfuri” si “muchii”,se folosesc cu precadere termenii sinonimi “noduri”
respectiv “arce”.
Teorema : Un arbore cu n varfuri are n-1 muchii.

Detaliem si sistematizam in continuare cateva propietati care caracterizeaza un arbore :


● exista un nod in care nu intra nici un arc, numit radacina arborelui.
● cu exceptia radacinii, fiecare nod are propietatea ca in el intra un singur arc. Aceasta leaga nodul
respectiv de un alt nod numit predecesor sau parinte.
● dintr-un nod pot iesi unul sau mai multe arce. Fiecare astfel de arc , leaga nodul rsepectiv de un
alt nod numit succesor sau fiu al nodului.
● nodurile sunt organizate pe nivele , primul nivel fiind ocupat de nodul-radacina. Nodurile de pe
ultimul nivel se caracterizeaza prin faptul ca din ele nu mai iese nici un arc , si se numesc noduri
terminale sau frunze.
● nodurile pot contine o asa-numita informatie utila care poate fi de orice tip . De obicei aceste
informatii se mai numesc si chei ale arborelui.

Arbori binari

Definitie
Un arbore cu propietatea ca fiecare nod cu exceptia frunzelor , are cel mult doi descendenti
(succesori )
se numeste arbore binar.

427
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Intr-un arbore binar ,cei doi succesori ai unui nod (daca exista), se numeste succesor stang
respectiv arbore drept.
Definitie
Un arbore cu propietatea ca fiecare nod ,cu exceptia frunzelor , are exact doi descendenti
(succesori) se numeste arbore binar complet .
Notiunea de arborescenta

Notiunea de arbore poate fii extinsa si pentru grafuri orientate.


Definitie. Fiind date doua noduri i si j ale unui graf orientat, se spune ca exista un lant de la i la j daca
exista o succesiune de arce, indiferent de sensul lor prin care cele doua noduri sunt unite.
 Daca exista un lant de de la i la j, exista si unul de la j la i.

Definitie. Un graf orientat G=(x,) exte conex daca  ijx


exista un lant de la i la j.

 Daca un graf orientat este tare conex, atunci el este conex, dar reciproca nu este
adevarata. Graful de mai sus este conex.
Definitie. Un graf orientat admite un ciclu daca exista un mod i, pentru care exista un lant de la i
la i.

Exemplu. In graful anterior nodurile 4 2 3 sunt unite printr-un ciclu.

Definitie. Un graf orientat este arbore daca nu este conex si nu admite cicluri.

Exemple:

1. Graful anterior nu este arbore pentru ca admite un ciclu.


2.

428
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Definitie. Un graf orentat g=(x,) admite o radacina vx daca pentru orice xx-(v) exista un drum
(atnete, nu lant) de la v la x.

Exemple:

1. graful de mai sus nu admite o radacina. De exemplu nu exista drum de la 1 la 3


(1 nu este radacina), nu exista drum de la 3 la 4 (nici 3 nu este radacina) etc.

2. Graful alaturat are radacinile 1, 2, 3,4.

Definitie. Se numeste arborescenta un graf orientat care indeplineste simultant doua conditii :
1.Este arbore;
2.Admite radacina.

 Intr-o arborestenta radacina este unica. Daca de exemplu exista doua radacini v 1 si v2 atunci exista
drum de la v1 la v2 si de la v2 la v1. aceasta presupune existenta unui ciclu, deci nu este arbore.
 De regula, atunci cand se da o arborescenta se preciaza radacina sa.

Alaturat este prezentata o arborescenta de radacina 2.

 Se observa ca din radacina pleaca arce, nu intra. Daca ar si intra s-ar obtine un ciclu.

 de asemenea, orice nod are un singur predecesor. Daca, prin absurd, ar avea doi sau mai multi, s-ar
obtine un ciclu care include radacina.

Problema. Se citeste un graf orientat. Acesta este dat prin matricea de adiacenta.se cere ca programul
dv. sa decida daca graful este sau nu oarborescenta. In caz afirmativ, se va tipari radacina acesteia.

429
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Rezolvare.

1. Tebuie decis mai intai daca graful orientat este arbore. Acesta se face printr-o singura
parcurgere in adancime,asemanator cu altgoriymul aplicat in cazul grafurilor orienta.
2. In cazul cand graful este arbore , trebuie vazut daca acesta are o radacina. Se testeaza, pe
rand, fiecare nod daca indeplineste conditia de radacina. Fiecare test se face printr-o
parcurgere in adancime pornind de la nodul respectiv.

Program arborescent;
Uses grafuri;
Var s:array[1..50] of byte;
A,b:mat_ad;
Gasit,ok,radacina:boolean;
N,i,suma,r:integer;

Procedure df_r(nod:byte);
Var k:byte;
Begin
S[nod]:=1;
For k:=1 to n do
If (a[nod,k]=1) or (a[k,nod]=1)
Then
Begin
A[k,nod]:=0;a[nod,k]:=0;
If s[k]+0 then df_r(k)
Else gasit:=true;
End
End;

Procedure df_r1(nod:byte);
Var k:byte;
Begin
S[nod]:=1;
For k:=1 to n do
If(a[nod,k]=1)and(s[k]=0)
Then df_r1(k)
End;
Begin
Citire(‚graf.txt’,a,n);
B:=a; df_r(1); suma:=0;
For i:= 1 to n do suma:=suma=s[i];
If suma<>n then writeln(‚graful nu este conex’)
Else writeln(‚graful este conex’);
If gasit then writeln(‚graful are cel putin un ciclu’)
Else writeln(‚graful nu are cicluri’);
If (suma=n) and not gasit
Then
Begin
Writeln(‚este arbore’);ok:=true;
End;
A:=b;
If(ok)
Then
Begin
R:=1;
Repeat
Suma:=0;
For i:=1 to n do s[i]:=0;

430
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Df_r1( r ) ;
For i:=1 to n do suma:=suma +s[i];
If suma=n
Then
Begin
Writeln(‚radacina este’,r);writeln(‚este arborescenta’);
Radacina:=true;
End
Else r:=r+1;
Until (radacina) or (r>n);
If not radacina then writeln(‚nu are radacina’)
End
End.

 Testul de abordare se face in o(m) , unde m reprezinta nr. muchiilor.


In concluzie altgoritmul are complexitatea o(nXm).

Arbori binari

Notiunea de arbore binar

Programatorii folosesc de multe ori prin abuz de limbaj, termenul de arbore, in loc de arborescenta.
In astfel de cazuri se specifica radacina care se mai numeste si varf si se considera ca sensul arcelor
este implicit,motiv pentru care nu se mai reprezinta grafic.

In cazul in care arborescenta are cel mult doi descendenti, unul stang si unul drept, spunem ca avem
un arbore binar.

431
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exemplu. Mai jos vedeti o arborescenta cu radacina 1 care este un arbore binar. Alaturat obs. Modul in
care se reprezinta grafic renuntand la sensurile arcelor, care sunt implicite.

 Se presupune ca nodurile sunt asezate pe mai multe niveluri. Radacina este pe


nivelul 0, descenndentii direci directi ai radacini sunt pe nivelul 1, descendentii directi
ai nodurilor de pe nivelul 1 sunt pe nivelul 2 etc.
 Numarul de niveluri mai putin cel al radacinii, ocupate de nodurile grafului,se numeste
adancimea arborelui binar.
 Vom face dinstinctie intre descendentul stang si cel drept. De exemplu, arborii de mai
jos sunt considerati dinstincti.

Modalitati de reprezentare a arborilor binari

432
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Desigur, arborii binari pot fi reprezentati ca orice grf orientat, dar


aceasta forma este deosebit de greoaie in aplicatii. Din acest motiv
sunt cu mult mai convenabile reprezentarile pe care le urmarim in
continuare.
2. reprezentarea cu ajutorul vectorilor ( clasica ).

Un arbore binar poate fi reprezentat cu ajutorul a doi vectori, pe care ii vom numi st (de la stanga ) si dr
(de la dreapta). Pentru fiecare nod i dintre cele n, st[i] retine nr. de ordine al nodului stang subordonat
de i, iar dr[i] retine nr de ordine al nodului drept subordonat de i. Daca nu exista nod subordonat retine
0.

Exemplu. Arborele binar cu 7 noduri si v=1 de pe pagina anterioara se reprezinta astfel:

st 2 4 5 0 0 0 0

1 2 3 4 5 6 7

dr 3 0 6 0 7 0 0

3. Reprezentarea in HEAP (actuala).

Fiecare nod al arborelui este reprezentat in HEAP de o inregistrare cu urmatoarea structura:

Type ref= inr;


Inr-record
Info:integer;
St,dr:ref
End;

Programul va retine doar adresa radacinii (varfului). In aplicatii veti intalni numeroase exemple in acest
sens, motiv pentru care ne oprim aici cu aceasta reprezentare.

4. Reprezentarea cu ajutorul legaturii TATA.

433
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Aceasta a mai fost prezentata in cazul arborilor neorientati. Mentionam doar faptul ca aceasta
reprezentare este neconvenabila in majoritatea aplicatiilor.

Modalitati de parcurgere a arborilor binari

In scopul prelucrarii,este necesar ca nodurile arborelui binar sa fie vizitate. Axista mai
multe modalitati de parcurgere a arborilor binari carer difera prin ordinea de vizitare
a nodurilor.

 Putem considera ca fiecare nod al arborelui binar subordoneaza un


subarbore binar stang si unul drept. Pe baza acestei observatii putem
scrie usor subprograme recursive pentru diverse le modalitati de
pacurgere.

Principalele modalitati de parcurgere ale unui arbore binar sunt:

A) Parcurgerea in inordine – SVD – se se patrcurge


mai intai subarborele stang, apoi varful apoi
subarborele drept.
B) Parcurgerea in preordine – VSD – se parcurge
mai intai subarborele stang, apoi subarborele
drept.
C) Parcurgerea in postordine – SD – se parcurge
mai intai subarborele stang, apoi subarborele
drept, apoi varful.
D) Parcurgerea in adancime – a fost studiata pentru
grafuri, aici se aplica in particular. Se parcurge
radacina, apoi nodurile de pe nivelul 1,apoi cele
de pe nivelul 2 etc.

 De exemplu parcurgerea SDV se face pe urmatoarea idee: varful


subordoneaza doi subarbori: cel stang si cel drept. Se trece la
subarborele stang, apoi la varf, apoi la subarborele drept. Pentru fiecare
subarbore se repeta rationamentul.

Ordinea de parcurgere pentru arborele alaturat este: inordine –SDV-:4 2 1 5 7 3 6


preordine –VSD-:1 2 4 3 5 7 6
postordine –SDV-:4 2 7 5 6 3 1
latime:1 2 3 4 5 6 7

434
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Programul urmator citeste si parcurge in inordine,postordine si


preordine un arbore binar. Arborele este retinut in HEAP. Pentru a
marca faptul ca descendentul unui anumit nod lipseste se introduce
0.

Program arbori; arb ^.st:=arb;


Type ref= ^inr; arb ^. dr:=arb;
Inr=record end
St,dr:ref; else arb:=nil
Nr:integer end;
End;
Var c:ref; procedure svd (c:ref);
begin
if c<nil
Procedure vsd (c:ref); then
Begin begin
Writeln(c .nr); svd(c ^.st);
Vsd(c ^.st); writeln(c^ .nr);
Vsd(c^ .dr) svd(c^ .dr)
End end
End; end;

Function arb :ref; begin


Var n:integer; c:=arb;
C:ref; writeln(`parcurg svd’);
Begin svd( c);
Write(‚n=’);readln(n);
If n<> o writeln(`parcurg vsd’);
Then vsd( c);
Begin writeln(`parcurg sdv’);
New( c ); sdv( c);
Arb:=c; end.
arb.nr:=n;

 Nodurile arborelui se introduc in ordinea:

124000350700600

435
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Atat pentru introducerea arborelui, cat si pentru parcurgeri s-au utilizat tehnici

recursive care decurg din tehnica DIVIDE et IMPERA !

Programul urmator efectueaza aceleasi parcurgeri ca si precedentul,


numai ca graful este reprezentat cu ajutorul vectorilor.
Begin
Program arbori; If (nod<>0)
Var n,i,v:integer; Then
St,dr:array[1..50] of integer; Begin
Writeln(nod);
Procedure sdv(nod:byte); Vsd(st[nod]);
Begin Vsd(dr[nod]);
If (nod<>0) End;
Then End;
Begin
Sdv(st[nod]); Begin
Sdv(dr[nod]); Citire;
Writeln(nod); Writeln(`svd’0;svd(v);
End; Writeln( `vsd’);vsd(v);
End; Writeln(`sdv’);sdv(v);
End.
Pocedure vsd(nod:byte);

10. Notiuni e birotica


10.1 Editorul de texte (microsoft word)

Procesoare de texte. Word.

Procesorul de texte este un program folosit pentru prelucrarea textelor. Un


document poate conţine, pe lângă textul propriu-zis, şi grafice, tabele, desene, imagini
etc.

Programul Word este un procesor de texte profesional care ne permite:


 crearea unui document cu: text, imagini, sunete, ecuaţii, tabele, simboluri speciale:,
, , etc;
 tipărirea unui document;
 salvarea documentelor pe disk sau diskete;

Prin tehnoredactarea unui document se înţelege succesiunea de operaţii prin


care documentul scris –inclusiv grafica pe care o conţine- poate fi tipărit.

Pentru a tehnoredacta un document, trebuie să ne gândim la următoarele:


 aranjarea textului în pagină (alegerea tipului de pagină);
 alegerea unui anumit tip de scris:
 Normal,
 Bold - îngroşat,

436
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Italic – înclinat,
 Underline – subliniat;
 alegerea unui anumit tip de caracter (Font) şi a mărimii acestuia (Size);
 introducerea textului;
 alinierea automată a textului:
 la stânga (Left),
 la dreapta (Rigth),
 la centru (Center) sau
 aliniere “la stânga şi la dreapta” (Justify);
 inserarea în text a imaginilor; inserarea de tabele, grafice;
 tipărirea documentului.
Prima grijă pe care trebuie să o avem când redactăm un document este de a
stabili tipul de pagină, marginile textului faţă de marginile paginii (încadrarea
documentului în pagină). După ce ne-am stabilit aceste caracteristici, putem să ne
concentrăm atenţia asupra următoarelor aspecte privind textul:
 stabilirea tipului de caractere (font);
 stabilirea dimensiunii font-ului;
 numerotarea paginilor, ş.a.

Lansarea în execuţie a Word - ului

Procesorul Word se lansează,


uzual, din aplicaţia Start, prin
poziţionarea pe opţiunea Programs,
care conduce la derularea unui meniu ce
are ca opţiune programul Word (ca în
figura alăturată).
Lansarea în execuţie a
procesorului de texte Word se realizează
printr-un dublu-clic pe butonul stâng al
mouse-ului.

După ce am solicitat încărcarea procesorului Word, pe ecran vom avea următoarea


fereastră:

Bara meniu general

Bara de butoane Standard

FEREASTRA DE EDITARE

437
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Pe ultima linie a ecranului se găsesc informaţii referitoare la numărul paginii care se


editează, numărul liniei şi coloanei pe care ne aflăm la un moment dat, etc.

Bara de meniu general conţine opţiunile:


 File – selectarea acestei opţiuni ne oferă, prin derularea unui meniu vertical, posibilităţile
de lucru cu întregul document (fişier): salvare pe disk sau dischetă, regăsire şi
deschidere pentru noi operaţii cu documentul, tipărirea documentului.
 Edit – această opţiune se referă la facilităţile oferite de Word privind editarea (scrierea,
conceperea) documentului: selectarea unui fragment dintr-un text şi mutarea
sau copierea lui în alt loc din document, ştergerea unui fragment selectat,
căutare rapidă a unui cuvânt, înlocuiri rapide a unor cuvinte, mutări, ştergeri şi
copieri de alte obiecte (desene, grafice ş.a.)
 View - selectarea acestei opţiuni ne oferă variantele de vizualizare a documentului pe
ecran
 Insert - această opţiune se referă la facilităţile oferite de Word privind inserarea în
document a imaginilor, fişierelor create cu alte editoare (text sau imagini),
notelor de subsol, numere de pagină, cuprins-uri, .
 Format - selectarea acestei opţiuni ne oferă posibilitatea de a stabili stilul de caractere
utilizat, dimensiunea caracterelor, spaţierea dintre caractere şi dintre linii,
fixarea unor borduri, scrierea textului pe coloane, ş.a.
 Tools - această opţiune se referă la facilităţile oferite de Word privind personalizarea
editorului Word. Acesta poate verifica permanent corectitudinea gramaticală a
textului, ne putem fixa limba în care este scris textul, putem alege butoane
rapide care să apară permanent pe ecran pentru rapiditate la editare, ş.a.
Totuşi aceste facilităţi încetinesc viteza de lucru cu editorul.
 Table - această opţiune se referă la facilităţile oferite de Word privind lucrul cu tabele
inserate într-un document.
 Window - selectarea acestei opţiuni ne oferă posibilitatea de a stabili modalităţile de lucru
cu mai multe documente simultan, aflate în ferestre diferite.
 Help – prin selectarea acestei opţiuni vom fi ajutaţi să înţelegem toate facilităţile oferite de
Word, prin texte şi imagini exemplificative, afişate pe ecran.

Observaţii.

 Oricare dintre opţiunile oferite de Bara de meniu general poate fi selectată direct cu
tastatura prin apăsarea tastei Alt simultan cu litera subliniată.
 Cu mouse-ul, opţiunea dorită se selectează prin poziţionarea acestuia pe textul opţiunii şi
apăsarea pe butonul stâng.
 Autorul şi-a propus o prezentare necesară şi suficientă pentru realizarea unor documente
corecte şi frumos prezentate.
 O parte dintre facilităţile oferite prin opţiunile descrise anterior vor fi prezentate în această
carte, iar pentru celelalte urez succes celor care vor să se perfecţioneze în Word pentru
perseverenţa de a descoperi şi alte facilităţi.

Bara de butoane standard.

Această bară, care poate să se întindă pe mai multe linii, conţine butoane a căror
apăsare ne conduce rapid spre o opţiune oferită de editorul Word prin meniurile sale descrise
anterior. Oricare dintre butoanele afişate pe ecran se află printre opţiunile meniurilor din bara
de meniu general.

438
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Butoanele afişate pe ecran pot fi cele standard, prezente de obicei imediat sub bara
de meniu general, dar utilizatorul îşi poate alege şi alte butoane care să fie afişate pe ecran, în
funcţie de preferinţele sale de lucru (butoane pentru desene, tabele, lucrul pe Internet, ş.a.).

Multe dintre butoanele oferite de editorul Word vor fi prezentate în continuare în


această carte.

Exerciţii.

 Dacă aveţi la dispoziţie un calculator, intraţi în editorul de texte Word. Explicaţi ce


comenzi aţi dat sau pe ce aţi apăsat pentru a lansa în execuţie Word-ul.
 Dacă aveţi la dispoziţie un calculator, activaţi opţiunea File a barei de meniu
general şi spuneţi ce se întâmplă după apăsarea tastei Enter sau după apăsarea
butonului stâng al mouse-ului.
 Executaţi manevrele de la exerciţiul anterior pentru fiecare dintre opţiunile barei de
meniu general pentru a vă acomoda cu ceea ce apare pe ecran la selectarea
fiecărei opţiuni.
Şi acum la lucru!

CUM Creăm un document nou?


Un document nou se creează prin una din modalităţile următoare:

1
3 Creare document
nou
2
Creare document nou

1. printr-un dublu-clic pe butonul New din bara de butoane Standard;


2. din meniul File se alege opţiunea New…;
3. direct: se acţionează simultan tastele Ctrl şi N.

CUM SelectĂM tipul de pagină ?

Ne propunem să realizăm un document în care scriem numele şi adresa.

439
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Dorim ca documentul să fie tipărit pe o foaie A4 (formatul A4 are dimensiunile 210 mm


şi 297 mm şi este un format standard).
Ne interesează să stabilim spaţiile pe care le lăsăm la începutul şi sfârşitul paginii ( Top
şi Bottom), la stânga şi la dreapta ei(Left şi Rigth).

În figura de mai jos schiţăm amplasamentul textului în pagină şi marginile paginii.

1 2

3
Popescu Carol Flaviu
Str. Ec Teodoroiu nr. 15
Timşoara.

1 Reprezintă marginea care se lasă liberă în stânga paginii;


2 Reprezintă marginea care se lasă liberă în dreapta paginii;
3 Reprezintă marginea care se lasă liberă la începutul paginii;
4 Reprezintă marginea care se lasă liberă la sfârşitul paginii.

Modalităţile de stabilire a acestor margini şi a formatului paginii se


realizează prin selectarea din meniul File a opţiunii Page Setup….

Opţiunea Page Setup ne permite fixarea următoarelor elemente:


Paper Size
 dimensiunile paginii (A4, A3, B5…);
 orientarea paginii:
 Portrait (vertical);
 Landscape (orizontal).

Margins:
- Left - la stânga ;
- Rigth - la dreapta;

440
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- Top - sus;
- Bottom - jos.

PAGE SETUP - permite stabilirea dimensiunilor paginii şi anume:

Margins - sus, jos, stânga, dreapta.


Paper Size - permite stabilirea tipului de pagină folosită la imprimantă (ex.: A4, B4,
A5, LETTER, etc.) şi aşezarea paginii (verticală - Portrait ; orizontală -
Landscape)
Paper Source – stabileşte tipul hârtiei folosită de imprimantă - Tractor (hârtie cu
găurele), Manual Feed (folosită pentru hârtie A4) etc.
Layout - permite numărarea rândurilor de pe o pagină.

CUM Deschidem un document existent?

Deschiderea unui document existent se face printr-una din cele trei metode
de mai jos, primele două fiind reprezentate în figura care urmează:

1
Deschiderea unui
document creat
2
anterior
Deschiderea unui
document creat
anterior

O1. printr-un dublu-clic pe butonul Open din bara de butoane Standard;


O2. din meniul File se alege opţiunea Open…
O3. se acţionează simultan tastele Ctrl şi O.

Când dorim să deschidem un document, după ce am solicitat acest lucru, pe ecran va


apare o fereastră de dialog, în care vom specifica:
1. Discul pe care se găseşte documentul pe care îl căutăm;
2. Numele documentului ;
3. Tipul documentului (Word sau scris cu alt program de editare)

Discul pe care
căutăm documentul;
Numele documentului;
Tipul documentului

441
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

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. Un


document conţine informaţii ce se păstrează, de obicei, pentru a nu face aceeaşi muncă de
realizare a documentului de mai multe ori.
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


“foldere” (pentru Windows) sau “directoare” (pentru MS-DOS).

Un folder poate conţine mai multe foldere, eventual documente , ş.a.m.d.


Organizarea informaţiilor în foldere se poate observa în figura de mai jos:

Cum Salvăm un document?


folder
Salvarea unui document impune salvarea conţinutului acestuia pe un suport
extern, adică: hard-disk, dischetă, CD , în vederea utilizării ulterioare.

Folder Fişier
 
Documentele 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.

- SAVE - este utilizat pentru a da un nume documentului care este editat în acel moment. Pot fi
salvate mai multe versiuni ale aceluiaşi document (alegând opţiunea SAVE VERSION …). Se poate stabili
exact locul (folder-ul) unde sã se facã salvarea, cu opţiunea SAVE IN.

- SAVE AS - permite salvarea unui document existent şi sub un alt nume, de fapt executã o copiere a
fişierului existent.

- SAVE AS HTML - permite salvarea unui document ca paginã de Web (Internet).

- VERSIONS - permite salvarea mai multor versiuni ale aceluiaşi document.

442
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Operaţia de salvare a unui document este de două feluri:


 salvarea pentru prima dată a documentului;
 salvarea unui document în urma unor modificări pe care i le-am făcut.

Dacă salvăm un document pentru prima dată, într-o fereastră dialog este solicitat
numele documentului.

Salvarea unui document se va face prin una din următoarele metode:


1. printr-un dublu-clic pe butonul Save din bara de butoane Standard;
2. alegem opţiunea Save din meniul File

1
Butonul Save
2

Opţiunea Save
Dacă documentul pe care îl edităm suferă prima operaţie de salvare, pe ecran apare o
fereastră de dialog ca în figura de mai jos, unde se va specifica numele pe care îl va primi
documentul.

Numele documentului

Cum Tipărim un document?


Tipărirea unui document este operaţia prin care listăm documentul pe hârtie.
Operaţia se poate realiza dacă avem instalată o imprimantă la calculator.
Tipărirea unui document se face printr-una din următoarele metode:
1. alegem opţiunea Print din meniul File;
2. prin dublu-clic pe butonul Print din bara de butoane standard;
3. apăsând simultan tastele Ctrl şi P.

2 Butonul Print

1 Opţiunea Print

443
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

În urma efectuării uneia din operaţiile enumerate, pe ecran apare o fereastră de dialog, în care trebuie
să fixăm:

- imprimanta la care vom tipări;


- ce tipărim:
1. întregul document ( All );
2. pagina curentă ( Curent page );
3. textul selectat ( Selection);
4. de la pagina … la pagina … ( Pages ).
- numărul de exemplare tipărite (copii);

1 Tipul imprimantei

Caracteristicile
4
imprimantei
3 Nr. de copii

2
Ce tipărim

 alegerea opţiunii Properties conduce la apariţia ferestrei de dialog din figura de mai
jos, ce va permite selectarea caracteristicilor imprimantei.

Proprietăţi ale hârtiei

Calitatea imprimării

Opţiuni despre imprimantă

Tipul hârtiei (A4, A5, ş.a.)

Modul de scriere pe hârtie


(Portrait –pe verticală,
Landscape –pe orizontală)

444
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Prin selectarea opţiunii Print Preview… din meniul File sau a butonului din
bara de butoane standard, vom vizualiza documentul înainte de trimiterea spre imprimantă.

Exerciţii.

1. Creaţi o copie de rezervă a document “carte.doc” sub numele de “test1.doc”. Descrieţi


paşii pe care i-aţi parcurs.
2. Deschideţi documentul “test1.doc” şi previzualizaţi-l. Descrieţi paşii pe care i-aţi parcurs.
3. Verificaţi formatul şi marginile paginii, precum şi tipul de imprimantă.
4. Tipăriţi documentul la o imprimantă HP Deskjet 690.
Descrieţi paşii pe care-i parcurgeţi pentru a obţine documentul tipărit.

Facilităţi de editare
Marcarea unei secvenţe dintr-un text.

Această operaţie are ca efect selectarea unui fragment de text în vederea efectuării
de operaţii asupra lui. Marcarea se realizează în două moduri:

folosind tastatura:
 se poziţionează cursorul de scriere înaintea caracterului de început al
textului pe care dorim să-l marcăm;
 cu tasta Shift apăsată simultan cu una din săgeţi, deplasăm cursorul până
la sfârşitul secvenţei de text pe care o marcăm.

folosind mouse-ul:
 se poziţionează cursorul înaintea caracterului de început al textului pe
care dorim să-l marcăm;
 cu butonul stâng al mouse-ului apăsat, deplasăm cursorul spre sfârşitul
secvenţei de text.

Fragmentul de text marcat apare pe ecran în video invers . Renunţarea la selecţie


este efectul apăsării tastei Esc.
Copierea unei secvenţe de text marcat înseamnă “lăsarea” textului şi în locul
unde se află, dar şi crearea unei copii în Clipboard a textului marcat. Copierea unei
secvenţe de text anterior marcat se poate face astfel:

 executăm dublu-clic pe butonul (Copy) al barei de butoane standard;


 selectăm din meniul Edit opţiunea Copy;
 folosim combinaţia de taste Ctrl+Ins;

Dacă cerneala este neagră, iar fondul este alb, atunci în video invers textul apare scris cu alb pe
negru.

Prin Clipboard înţelegem o zonă de memorie în care se memorează un text selectat, un desen selectat
sau orice obiect selectat.

445
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 executăm clic pe butonul dreapta al mouse-ului pe elementul selectat. Se va derula un


meniu din care alegem opţiunea Copy.

Prin inserare înţelegem aducerea conţinutului din clipboard în locul unde se află
poziţionat cursorul în document. Inserarea unei secvenţe de text se poate face astfel:

 executăm dublu-clic pe butonul (Paste) din bara de butoane standard;

 selectăm din meniul Edit opţiunea Paste;


 folosim combinaţia de taste Shift+Ins;
 executăm clic pe butonul dreapta al mouse-ului pe elementul selectat. Se va derula un
meniu din care alegem opţiunea Paste.

Mutarea unei secvenţe de text marcat înseamnă ştergerea textului marcat din locul
unde se află şi copierea lui în Clipboard.

Mutarea unei secvenţe de text presupune:

executăm dublu-clic pe butonul (Cut) din bara de butoane standard;


 folosim combinaţia de taste Shift+Del
 selectăm din meniul Edit a opţiunea Cut;
 executăm clic pe butonul dreapta al mouse-ului pe elementul selectat din care alegem
opţiunea Cut.

Meniul Edit, prin selectarea opţiunii Find, ne permite căutarea şi înlocuirea unor şiruri
de caractere sau cuvinte.

Căutare fără înlocuire

Căutare cu înlocuire

În tabelul de mai jos veţi găsi efectele produse de apăsarea unor taste sau combinaţii
de taste:

Tasta Efectul
 Deplasare cursor cu un caracter spre dreapta

 Deplasare cursor cu un caracter spre stânga

 Deplasare cursor cu o linie în sus

446
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Deplasare cursor cu o linie în jos

Ctrl+ Deplasare cursor cu un cuvânt spre dreapta

Ctrl+ Deplasare cursor cu un cuvânt spre stânga

Ctrl+ Deplasare cursor cu un paragraf în sus

Ctrl+ Deplasare cursor cu un paragraf în jos

Delete Şterge caracterul indicat de cursor

 Tasta ne grupată (singulară) – şterge caracterul din faţa cursorului

Caps Lock Comută între folosirea tastelor ca litere mici sau mari. De obicei se
lucrează cu litere mici.
Shift - Dacă tastatura este setată pe litere mici (Caps Lock inactiv), prin
apăsarea simultană a tastei Shift şi a unei litere, se obţine litera mare,
iar pentru cifre – se obţine caracterul de sus inscripţionat pe tastă.
- Dacă tastatura este setată pe litere mari (Caps Lock activ), prin
apăsarea simultană a tastei Shift şi a unei litere, se obţine litera mică
End Sfârşitul liniei curente
Home Începutul liniei curente
PgUp Un ecran în sus
PgDown Un ecran în jos
Ctrl+Home Începutul documentului
Ctrl+End Sfârşitul documentului

Exerciţii

1. Căutaţi în text cuvântul “–ti” şi înlocuiţi-l cu “–ţi”;


2. Copiaţi un cuvânt des utilizat în text şi inseraţi-l ori de câte ori este necesar.
3. Alegeţi răspunsul corect la întrebarea: Ce este Clipboard-ul?
 Clipboard-ul este o zonă de memorie
 Clipboard-ul este o zonă de text
 Clipboard-ul este o componentă a calculatorului.
4. Alegeţi răspunsul corect la întrebarea: Care sunt operaţiile care folosesc Clipboard-ul?
 Copy, Cut şi Paste
 Save, Save as…
 Print, Page Setup

Cum Formatăm un document

Formatarea este de două feluri:

 formatarea caracterelor folosite în text;


 formatarea paragrafelor textului.

Formatarea caracterelor
Pentru formatarea caracterelor trebuie să stabilim:

447
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 tipul de caracter ( Font );


 stilul de scriere;
 dimensiunea caracterului ( Size ).

Stilul de scriere se referă la unele atribute ale caracterelor:


 îngroşat ( Bold );
 înclinat ( Italic );
 subliniat ( Underline ).

Pentru formatarea textului unui document putem folosi opţiunile Font şi Paragraph din
meniul Format.

Cum alegem fontul?


Font-ul este format dintr-un set de maxim 256 caractere cu un aspect grafic
asemănător. Fiecare astfel de set de caractere are un nume: Arial, Arial Black, Arial Narrow,
Times New Roman, Symbol, Courier, Courier New, etc. Atât selectarea unui font, cât şi a
dimensiunii acestuia, se face prin deschiderea listelor ascunse ale meniului Formatting, situate
pe bara de butoane amintită, astfel:

Alegerea tipului font-


ului de scriere

Stilurile de scriere (Bold Italic Underline ) le obţinem fie folosind butoanele de


pe bara de butoane standard, fie combinaţii de taste, fie din meniul Format/Font.

Cum alegem culoarea font-ului


Selectarea culorii font-ului unui text selectat sau a textului ce urmează a fi scris,
se obţine astfel: din bara de butoane de formatare (de obicei este pe bara inferioară a
ecranului), alegem butonul Font Color, care determină apariţia unei palete de culori
pe care le putem alege pentru caractere.

Formatarea la nivel de paragraf

Formatarea la nivel de paragraf se realizează prin alegerea opţiunilor din meniul


Format şi din submeniul Paragraph.
Alinierea textului se face prin alegerea opţiunilor ce se găsesc pe bara de
butoane de formatare. Formele de aliniere de pe pe bara de butoane de formatare sunt:
 aliniere la stânga ( Left );
 aliniere la dreapta ( Rigth );

448
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 aliniere centrată ( Center );


 aliniere “la stânga şi la dreapta” ( Justify).

Exerciţii

1. Scrieţi un document în care fiecare paragraf să difere de celelalte prin : stil, font sau
culoare.
2. Modificaţi în text culoarea de scriere pentru toate cuvintele de început de paragraf.
3. În documentul în care lucraţi scrieţi o pagină în care fiecare paragraf să difere de
celelalte prin modul de aliniere a textului: aliniere la stânga ( Left ); aliniere la dreapta
( Rigth ); aliniere centrată ( Center ); aliniere “la stânga şi la dreapta” (Justify).

Inserarea obiectelor grafice în text

De cele mai multe ori dorim să obţinem un document mai deosebit, care să conţină
imagini grafice, texte artistice sau formule matematice. Acestea dau documentului un aspect
deosebit.
Prin obiecte grafice înţelegem imagini grafice, texte artistice, formule matematice,
ş.a.

Inserarea obiectelor grafice în document se face în două moduri:


- din meniul Insert, alegând opţiunea Picture
- prin selectarea unor butoane de pe bara Drawing.

Trasarea liniilor drepte

 De pe bara de butoane Drawing vom alege unealta Line;

 din caseta cu grosimi de linii vom selecta grosimea dorită;

 poziţionăm, pe document, cursorul mouse-ului în poziţia de început a liniei şi, menţinând


apăsat butonul stânga, “tragem” cursorul spre poziţia finală;
 se eliberează butonul mouse-ului.

Trasarea săgeţilor.

De pe bara Drawing alegem butonul pentru trasare săgeţi şi trasăm săgeata dorită.

Modificarea săgeţilor.

Pentru modificarea stilului săgeţii, după selectarea acesteia, se va acţiona butonul de


stil săgeată, de unde ne alegem stilul dorit, ca în figura alăturată.

449
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Umbre.

Setarea umbrelor

Folosind butonul Shadow, după selectarea unui desen, se va alege stilul de


umbră.

Opţiunea Shadow Settings… ne permite modificarea grosimii umbrei, a


luminozităţii acesteia, precum şi a culorii sale.

Efecte 3-D

Pentru a obţine efecte speciale în spaţiul tridimensional, selectăm


desenul, acţionăm butonul 3-D şi pe ecran se va derula o listă ca în figura
alăturată, din care selectăm opţiunea dorită.

Opţiunea 3-D Settings… ne permite modificarea adâncimii 3-D, a


luminozităţii acesteia, precum şi a culorii sale.

Alte butoane.

Acţionarea butonului AutoShapes ne permite alegerea unor desene speciale


pe care le putem insera în documentul pe care îl creăm. Odată inserate în document,
aceste desene pot fi selectate şi modificate după necesităţi.
Lista AutoShapes conţine mai multe opţiuni, iar fiecare opţiune ne conduce la
derularea câte unei liste cu desene predefinite.

inserarea altor tipuri de imagini


Meniul Insert, prin opţiunea Picture ne permite inserarea altor tipuri de imagini:

 imagini din colecţii (Clip Art… );


 imagini captate de la scaner (From Scaner);
 grafice sau diagrame rezultate prin prelucrarea unor date statistice (Chart).

Atunci când dorim să realizăm un document deosebit ca prezentare, este


normal să-l “înfrumuseţăm” cu desene sau imagini. În cele ce urmează vom vedea
cum inserăm desene oferite de Clip Art.

După ce am
derulat meniul Insert, ne
deplasăm cu bara de
opţiuni pe Clip Art… şi
executăm dublu-clic pe
butonul stâng al mouse-
ului sau apăsăm tasta
Enter.

450

Categorii de imagini Imagine selectată


Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Vom avea plăcerea să ne alegem din colecţia de imagini desenate oferite de Clip
Art şi afişate pe ecran ca în figura alăturată:

Să presupunem că dorim să inserăm în documentul nostru imaginea alăturată.

Iată cum procedăm: după ce am găsit-o printre imaginile din Clip Art, o selectăm şi :
 fie executăm dublu-clic pe butonul stâng al mouse-ului,
 fie apăsăm tasta Enter după poziţionarea pe opţiunea Insert,
 fie executăm dublu-clic pe butonul stâng al mouse-ului după poziţionarea pe
opţiunea Insert.
În urma operaţiilor efectuate, imaginea dorită va fi inserată în documentul pe
care-l realizăm.
Odată inserată imaginea în document, ne interesează să o ajustăm la anumite dimensiuni, să o
aşezăm în pagină în anumite locuri, să o copiem în mai multe locuri, ş.a.
Operaţiile amintite anterior se pot realiza dacă vom şti următoarele:
1. Cum se selectează o imagine
2. Cum se copiază o imagine
3. Cum se mută o imagine
4. Cum se şterge o imagine
5. Cum se redimensionează o imagine

Selectarea unei imagini inserate în document se realizează prin dublu-clic pe butonul stâng al
mouse-ului când cursorul
mouse-ului se află în
interiorul imaginii.

Selectarea imaginii va fi
evidenţiată în document prin prezenţa
unor pătrate de marcare a figurii
selectate care marchează suprafaţa
ocupată de imagine.
Operaţiile 2 şi 3 (Copy,
Move) se realizează prin intermediul
Clipboad-ului, la fel ca în cazul
textelor selectate, numai că în acest caz
operaţiile se fac asupra unei imagini
selectate.
Pătrate de marcare a figurii selectate
Exerciţii
1. Descrieţi în cuvinte cum se realizează copierea unei imagini.
2. Descrieţi în cuvinte cum se realizează mutarea unei imagini.
3. Ce obţineţi prin folosirea opţiunii Paste din meniul Edit?

451
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Redimensionarea unei imagini

Redimensionarea unei imagini presupune mărirea sau micşorarea imaginii,


proporţional sau deformat (mai lată sau mai înaltă).
Redimensionarea unei imagini presupune selectarea acesteia, iar după aceea
poziţionarea mouse-ului pe unul din pătratele de marcare a figurii selectat până
cursorul mouse-ului se transformă în săgeţi bidirecţionale ( ). Ţinând butonul
stâng al mouse-ului apăsat şi deplasând cursorul mouse-ului, vom obţine micşorarea
sau mărirea figurii selectate.

OBSERVAŢII.
 Dacă poziţionăm cursorul mouse-ului pe pătratele din colţurile figurii, vom obţine o
deformare proporţională.
 Dacă poziţionăm cursorul mouse-ului pe pătratele din unul dintre mijloacele laturilor
figurii, vom obţine o deformare neproporţională.

Exerciţii
1. Scrieţi o scrisoare pe hârtie format A4, cu marginile de 1,84 cm. Inseraţi din Clip
Art un PORUMBEL;
2. Concepeţi o felicitare de 8 Martie
3. În documentul ales anterior pentru explicaţii apare textul FELICITARE, scris cu
efecte speciale.

După cum am mai spus în acest capitol,


prin selectarea butonului WordArt ,
vom putea insera un text artistic
(WordArt), cu orientare verticală sau
orizontală.

Pe ecran ne va apare o fereastră ca


în imaginea alăturată, din care vom selecta
tipul de scris cu efecte speciale pe care îl
dorim şi apăsăm OK sau prin dublu-clic pe butonul stâng al mouse-ului.

În continuare ne va apare fereastra


alăturată, prin care ni se solicită textul pe care îl
dorim.
După introducerea textului, apăsăm OK
sau executăm dublu-clic pe butonul stâng al
mouse-ului iar în documentul nostru va fi inserat
textul dorit cu efectele alese.

Observaţii.

Editare text

452 Formatul
Word-art-ului
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Dacă dorim deformarea textului, îl selectăm ca pe o imagine şi îl deformăm după


metodele descrise la imagini.

 Putem modifica textul, apăsând butonul stâng al mouse-ului pe textul selectat,


urmând să apară pe ecran un meniu derulant ca în figura care urmează. Prin
alegerea opţiunii Edit text… putem să facem modificările dorite.

 În acelaşi meniu derulant, descris anterior, apare şi opţiunea Format Word-art,


care ne permite modificarea tipului de scris.

Inserarea de tabele

Un tabel este format din linii şi coloane.


Căsuţa care se află la intersecţia unei linii cu o coloană se numeşte celulă.

Linie

Celulă
Coloană

Când dorim să inserăm un tabel într-un document, mai întâi vom deplasa
cursorul în locul în care dorim să fie inserat tabelul.
Inserarea propriu-zisă a tabelului se poate face în mai multe feluri:

1. din meniul Tabel se alege opţiunea Insert Table…;


2. din bara de butoane standard se selectează butonul Insert Table;
3. din bara de butoane standard se selectează butonul Tables and Borders;

Folosirea opţiunii Insert Table… duce la apariţia unei ferestre de dialog Insert Table
în care putem selecta:

 Numărul de coloane;
 Numărul de linii;
 Dimensiunea coloanelor;
 Un format predefinit de tabel cu care este înzestrat
Word-ul.

453
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

O altă formă de inserare a unui tabel se poate face prin alegerea butonului
Tables and Borders pentru care butonul mouse-ului se transformă într-un creion cu care se
poate desena un tabel cu mâna.
Butonul Insert Table din bara de butoane standard permite inserarea unui tabel.
Selectarea butonului determină apariţia unei casete modificabile care simulează un tabel,
unde, prin menţinerea apăsată a butonului stânga al mouse-ului se pot stabili numărul de linii
şi coloane ale tabelului.

formatarea unui tabel

Formatarea unui tabel presupune modificarea dimensiunilor celulelor, ştergerea


liniilor şi coloanelor, Inserarea liniilor şi coloanelor ş.a.

 Modificarea dimensiunilor celulelor se poate face:


 automat – selectăm opţiunea Cell Heigth and Width… din meniul Table ;
 manual – cu ajutorul rigletei, prin “drag and drop” cu mouse-ul.

Rigleta cu marcajul
Marcajul pentru linii pentru coloane
Celula activă

 Ştergerea liniilor şi coloanelor:


 se selectează mai întâi celulele ;
 se selectează din meniul Table opţiunea Delete Cell… Pe ecran va apare o fereastră de dialog, din
care vom alege unul dintre butoanele radio în funcţie de cum se doreşte ştergerea celulelor.

 Inserarea liniilor şi coloanelor :


 se selectează mai întâi celulele ;
 se selectează din meniul Table opţiunea Insert Cell… Pe ecran va apare o fereastră de dialog, din
care vom alege unul dintre butoanele radio în funcţie de cum se doreşte inserarea celulelor.
OBSERVAŢII
Pentru inserarea rapidă a unei linii într-un tabel, poziţionăm cursorul de scriere la sfârşitul liniei după
care apăsăm Enter.
Tehnica “drag and drop” constă în selectarea cu mouse-ul a unui obiect şi, ţinând apăsat butonul
stâng al mouse-ului, deplasăm obiectul spre o nouă poziţie (“tragere”).

454
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exerciţii
1. Creaţi un tabel cu următoarea structură:

Date personale
Nume şi prenume
Data naşterii Adresa Telefon
1. Ionescu Andrei 01.01.1985 Str. Victoriei, Nr.2 212212
2. Vlad Liviu 15.03.1987 Str. 1 Decembrie 1918 213456

2. Inseraţi două linii în acest tabel, iar după aceea ştergeţi o coloană, de exemplu: Telefon.
10.2 Editorul de foi Microsoft Excel
EXCEL

Deschiderea programului Excel


Pentru a deschide Excel se efectuează paşii următori:
1. Se execută clic pe butonul Start, iar pe ecran va apărea meniul Start.
2. Se selectează Programs, iar pe ecran va apărea meniul Programs.
3. Se selectează opţiunea Microsoft Excel pentru a deschide programul.
Ecranul de deschidere din Excel prezintă un registru de calcul gol, având eticheta Book1.
Definiţie: Fişierele din Excel sunt denumite registre de calcul. Orice registru de calcul este format
din trei foi de calcul (însă se pot adăuga sau elimina oricâte foi de calcul este necesar). Fiecare foaie de
calcul este formată din coloane şi rânduri care se intersectează, formând casete numite celule, în care
se introduce text. Etichetele din partea de jos a registrului de calcul (cu inscripţiile Sheet1, Sheet2 etc.)
permit răsfoirea foilor de calcul executând clic pe ele cu mouse-ul.

Componentele ferestrei Excel


Fereastra Excel are numeroase elemente comune cu ferestrele Windows, inclusiv o
bară de meniuri (de unde se pot selecta comenzi), o bară de stare (care indică starea

Bara de meniuri

Bare cu
instrumente
Bara de formule

Capetele coloanelor

Selector

Capetele rândurilor

Suprafaţa foii
de calcul 455

Bara de stare
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

activităţii curente) şi bare cu instrumente (care conţin butoane şi liste derulante prin
care se obţine un acces rapid la comenzile şi facilităţile utilizate frecvent).
Fig. 3.1. Elementele ferestrei Excel

În plus, fereastra conţine câteva elemente unice în Excel, printre care:


Bara de formule Când se introdus informaţii într-o celulă, tot ceea ce se scrie apare pe bara de
formule. Tot pe această bară este indicată şi poziţia celulei.
Fereastra registrului de calcul Orice fişier creat cu Excel este un registru de calcul care conţine
una sau mai multe foi de calcul. Se pot deschide concomitent mai multe fişiere (registre de calcul),
fiecare având propria fereastră.
Capetele de coloană Literele din partea superioară a foii de calcul, prin care sunt identificate
coloanele foii de calcul.
Capete de rânduri Numerele din stânga foii de calcul, prin care sunt identificate rândurile foii de
calcul.
Selector Conturul care indică celula activă.

Introducerea diferitelor tipuri de date


Tipuri de date
Pentru a crea o foaie de calcul care să poată fi utilizată, trebuie introduse date în celulele din
interiorul ei. Tipurile de date care se pot introduce sunt:
* Text
* Cifre
* Data (calendaristică)
* Ora
* Formule
* Funcţii

Introducerea textului
Textul este o combinaţie de litere, cifre şi spaţii. În configuraţia prestabilită, textul este aliniat
automat la stânga, în interiorul celulei.
Pentru a introduce text într-o celulă:
1. Se execută clic pe celula în care se doreşte introducerea textului.
2. Se introduce textul. Pe măsură ce este scris textul, acesta apare în celulă şi pe bara de
formule.
3. Se apasă tasta Enter. Textul introdus va apărea în celulă, aliniat la stânga. Dacă s-a făcut o
greşeală şi se doreşte renunţarea la datele introduse, se va apăsa tasta Esc.

Introducerea textului în capetele de coloană şi de rând


Datele introduse pot identificate pe baza capetelor de coloane şi de rânduri. Capetele coloanelor
apar în partea superioară a foii de calcul, sub titlu. Capetele rândurilor sunt plasate în partea stângă a
foii de calcul, de regulă în coloana A.
Capetele coloanelor arată semnificaţia numerelor cuprinse în fiecare coloană. De regulă,
etichetele coloanelor indică perioadele de timp – cum ar fi ani, luni, zile etc. Capetele rândurilor arată ce
reprezintă numerele din fiecare rând. De regulă, capetele rândurilor conţin diverse categorii de date,
cum ar fi denumirile produselor, numele angajaţilor sau încasările şi cheltuielile din buget.
Când se introduce textul unui cap de coloană, se apasă tasta Tab în locul tastei Enter pentru a
trece de la o celulă la alta. Când se introduce textul pentru capetele rândurilor, se foloseşte în schimb
tasta cu săgeata orientată în jos.

456
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Adăugarea unor comentarii la celule


Se pot folosi pentru celule comentarii în care se includ informaţii detaliate despre datele dintr-o
foaie de calcul. De exemplu, se poate preciza aici scopul unei anumite formule sau datele care trebuie
actualizate. După ce a fost creat un comentariu, acesta poate fi citit oricând.
Pentru a adăuga un comentariu la o celulă, se efectuează paşii următori:
1. Se selectează celula în care se va adăuga un comentariu.
2. Se deschide meniul Insert şi se selectează Comment, sau se execută clic pe butonul New
Comment de pe bara cu instrumente.
3. Se introduce comentariul
4. Se execută clic în afara celulei. În colţul din dreapta-sus al celulei va apărea un triunghi roşu,
care indică faptul că celula conţine un comentariu.
Pentru a citi ulterior comentariile, se plasează indicatorul mouse-ului pe o celulă care are un
punct roşu în colţul din dreapta-sus. Excel va afişa comentariul.

Introducerea cifrelor
Numerele care se pot introduce pot conţine caracterele numerice 0-9 şi următoarele caractere
speciale: + - / . , ( ) $ %. Aceasta înseamnă că se pot include virgule, puncte zecimale, semnul dolarului,
procent şi paranteze, împreună cu valorile introduse.
Deşi se pot include şi semnele de punctuaţie atunci când se introduc datele, nu este obligatoriu
să se facă acest lucru. De exemplu, în loc să se scrie nişte sume în dolari pe o coloană şi să se includă
semnul dolarului, virgule şi puncte zecimale, se pot scrie direct numerele, de exemplu 700 sau 81546,
iar apoi să formataţi coloana folosind opţiunea de formatare pentru valută. Excel va transforma valorile
introduse în $700.00 şi $81,546.00 sau în $700 şi $81546, în funcţie de numărul zecimalelor specificate.
Pentru a introduce un număr:
1. Se execută clic pe celula în care se introduce numărul.
2. Se introduce numărul. Pentru a introduce un număr negativ, se plasează în faţa lui un semn
minus, sau se trece numărul între paranteze. Pentru a introduce o fracţie, se plasează înaintea ei un 0,
de exemplu 0 1/2 (în caz contrar, Excel va interpreta intrarea ca pe o dată calendaristică).
3. Se apasă tasta Enter, iar numărul introdus va apărea în celulă aliniat la dreapta.

457
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Introducerea datei şi a orei


Data şi ora se pot introduce în diferite formate. Când se introduce data folosind formatul
prezentat în tabelul de mai jos, Excel o converteşte într-un număr ce indică numărul de zile care s-au
scurs de la 1 ianuarie 1900 până la data respectivă. Chiar dacă nu se va vedea acest număr (Excel
afişează data în formatul obişnuit), valoarea va fi folosită de fiecare dată când se va utiliza în calcule
data calendaristică introdusă.
Tabelul 3.1. Formatele acceptate pentru dată şi oră
Exemplu
Format
M/D 4/8
M-YY 4-58
MM/DD/YY 4/8/58 sau 04/08/58
MMM-YY Jan-92
MMMMMMMMM-YY September-43
MMMMMMMMM DD, YYYY September 9,1999
DD-MMM-YY 28-Oct-95
DD-MMM 6-Jul
HH:MM 16:50
HH:MM:SS 8:22:59
HH:MM AM/PM 7:45 PM
HH:MM:SS AM/PM 11:45:16 AM
MM/DD/YY HH:MM 11/8/80 4:20
Dacă se introduce o coloană de date, se poate specifica mai întâi formatul dorit pentru dată.
Apoi, când se introduc datele, Excel le va adapta automat pentru a corespunde formatului ales. De
exemplu, dacă vrem ca datele să fie afişate în formatul MMMMMMMMM DD, YYYY. În loc să se scrie
integral fiecare dată în parte, se poate selecta formatul respectiv pentru coloană şi apoi se va scrie
9/3/98, iar Excel va modifica formatul pentru a rezulta September 3, 1998. Pentru a formata o coloană,
se execută clic pe capul coloanei pentru a o selecta. Apoi, se deschide meniul Format şi se selectează
Cells. În eticheta Numbers, se selectează formatul dorit pentru dată.

Copierea rapidă a intrărilor


Se poate copia din celule alăturate o intrare existentă, efectuând paşii următori:
1. Se execută clic pe marcajul de completare (din dreapta jos) al celulei al cărei conţinut se va
copia.
2. Se trage marcajul de completare în jos sau spre dreapta pentru a copia datele în celulele
alăturate. Va apărea o căsuţă care arată exact ce date sunt copiate în celelalte celule.
În cazul în care se copiază un număr, o lună sau alt obiect care poate fi interpretat ca serie (cum
ar fi January, February etc.), dar nu se doreşte crearea unei serii – ci numai copierea conţinutului exact
al celulei respective – se va ţine apăsată tasta Ctrl atunci când se trage marcajul de completare.

Introducerea unei serii cu funcţia AutoFill


Introducerea seriilor (cum ar 1997, 1998, 1999 şi 2000) este asemănătoare cu copierea
conţinutului celulelor. Când se trage marcajul de completare al celulei de origine, funcţia AutoFill
interpretează prima intrare şi completează seria pe baza acesteia. De exemplu, dacă se scrie 1997 într-
o celulă, apoi se trage marcajul de umplere al celulei peste celule adiacente, se va crea seria 1997,
1998, 1999 etc. Când se efectuează tragerea, căsuţa care apare pe ecran arată exact ce se copiază,
astfel încât se va putea crea exact seria dorită prin oprirea în celula corespunzătoare.

Introducerea datelor care se repetă cu funcţia AutoComplete


Când se introduc primele litere ale unei intrări, funcţia AutoComplete poate completa în mod
inteligent intrarea pe baza intrărilor care au fost deja introduse în acea coloană. Funcţia AutoComplete
poate fi folosită numai pentru date introduse în coloane, nu şi pe rânduri. De exemplu, dacă se introduc
numele ţărilor de origine pentru o serie de produse, se va scrie numele ţării o dată, iar data viitoare se
începe doar introducerea numelui respectiv. Funcţia AutoComplete va completa restul.

458
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Efectuarea calculelor cu ajutorul formulelor


Ce este o formulă ?
Formulele sunt folosite în foile de calcul pentru efectuarea calculelor cu cifrele introduse. Cu
ajutorul formulelor se pot efectua operaţii de adunare, scădere, înmulţire şi împărţire, folosind valorile
din diferite celule.
Formulele sunt formate, de regulă, din una sau mai multe adrese de celule sau valori, şi un
operator matematic, cum ar fi + (adunare), - (scădere), * (înmulţire) sau / (împărţire). De exemplu, dacă
se doreşte calcularea mediei a trei valori aflate în celulele A1, B1 şi C1, se introduce în celula în care
trebuie să apară rezultatul următoarea formulă:
=(A1+B1+C1)/3
În tabelul următor este o listă cu operatorii matematici care pot fi folosiţi pentru a crea formule:
Tabelul 3.2. Operatorii matematici din Excel
Operaţie Tip de formulă Rezultat
Operator
^ ridicare la =A1^3 Redă rezultatul ridicării la puterea trei a valorii din A1.
putere
Redă suma valorilor din celulele A1 şi A2.
+ =A1+A2
adunare Redă diferenţa dintre valoarea din celula A1 şi valoarea din
- =A1-A2 celulaA2.
scădere
Înmulţeşte cu 3 valoarea din celula A2.
* =A2*3
înmulţire Împarte la 50 valoarea din celula A1.
/ =A1/50
împărţire Redă media valorilor din celulele A1 – A3.
=(A1+A2+A3)/3
combinaţie

Ordinea operaţiilor
Excel efectuează calculele din cadrul unei formule în următoarea ordine:
I. Operaţiile dintre paranteze
II. Ridicarea la putere
III. Înmulţiri şi împărţiri
IV. Adunări şi scăderi

Dacă nu se respectă această ordine de calcul, nu se va obţine rezultatul corect. De exemplu,


dacă se doreşte stabilirea mediei valorilor din celulele A1, B1 şi C1 şi se introduce formula
=A1+B1+C1/3, se va obţine un rezultat greşit. Valoarea C1 va fi împărţită la 3, iar rezultatul va fi adunat
cu A1+B1. Pentru a calcula mai întâi suma valorilor A1, B1 şi C1, trebuie inclus grupul de valori între
paranteze, adică =(A1+B1+C1)/3.

Introducerea formulelor
Pentru a introduce formula de la tastatură se efectuează paşii următori:
1. Se selectează celula în care va apărea rezultatul formulei.
2. Se scrie semnul egal (=).
3. Se scrie formula. Aceasta va apărea pe bara de formule.
4. Apăsând tasta Enter Excel va calcula rezultatul.

459
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Calcularea rezultatelor fără introducerea unei formule


Se poate obţine suma unui grup de celule şi selectând pur şi simplu celulele respective şi citind
rezultatul de pe bara de stare. Astfel se poate afla şi media, valoarea minimă sau cea maximă, şi
numărul celulelor dintr-un domeniu. Pentru aceasta, se execută clic pe butonul din dreapta pe bara de
stare şi se selectează opţiunea dorită din meniul de comenzi rapide care apare pe ecran.

Efectuarea calculelor cu funcţii


Ce sunt funcţiile ?
Funcţiile sunt formule complexe preformatate, folosite pentru executarea unei serii de operaţii cu
un grup specificat de valori. De exemplu, pentru a calcula suma unei serii de numere din celulele A1 –
H1, se poate folosi funcţia =SUM(A1:H1) în locul introducerii formulei =A1+B1+C1+D1+E1+F1+G1+H1.
Funcţiile pot folosi referinţe la domenii de celule (cum ar fi B1:B3) sau valori numerice (de exemplu
5556.23).
Orice funcţie este formată din următoarele trei elemente:
* Semnul = arată că ceea ce urmează este o funcţie (o formulă).
* Denumirea funcţiei, de exemplu SUM, arată ce operaţie va fi efectuată.
* Argumentul, cum ar fi (A1:H1), indică adresele celulelor cu valorile afectate de funcţie.
Argumentul este adeseori un domeniu de celule, dar poate fi şi mult mai complex.

Tabelul 3.3. Funcţiile Excel cel mai des folosite


Exemplu Descriere
Funcţie
AVERAGE =AVERAGE(B4:B9) Calculează o medie.
COUNT =COUNT(A3:A7) Cuantifică valorile numerice dintr-un domeniu. De exemplu, dacă
un domeniu conţine câteva celule cu text şi alte celule cu
numere, se poate afla câte numere sunt în grupul respectiv.
Numără toate celulele din grup care nu sunt goale. De exemplu,
COUNTA =COUNTA(B4:B10) dacă un grup cuprinde câteva celule cu text şi alte celule cu
numere, se poate afla câte celule din grup conţin text.
Permite punerea unei condiţii într-o formulă. În acest exemplu,
dacă A3 este mai mare sau egal cu 100, este folosită formula
IF =IF(A3>=100,A3*2,A2*2) A3*2. Dacă A3 este mai mică de 100, este folosită formula A2*2.
Redă valoarea maximă dintr-un grup de celule.
Redă valoarea minimă dintr-un grup de celule.
Calculează suma care trebuie achitată periodic pentru un
MAX =MAX(B4:B10) împrumut, dacă se indică dobânda, numărul perioadelor de plată
MIN =MIN(B4:B10) şi avansul ca argumente. Exemplu: =PMT(.0825/12,360,180000)
PMT =PMT(rate,nper,pv) pentru un împrumut pe 30 de ani cu dobândă 8,25% şi avans de
180000$.
Calculează depozitul care trebuie constituit în fiecare perioadă
pentru a obţine o anumită valoare în viitor. Exemplu:
=PMT(.07/12,60,,10000) calculează depozitul necesar pentru
realizarea de 10.000$ la o dobândă de 7% cu plăţi lunare timp
PMT =PMT(rate,nper,,fv) de 5 ani (60 de luni).
Calculează totalul pentru un domeniu de celule.
Calculează totalul într-un domeniu rg pentru fiecare celulă din
sumrg care corespunde criteriilor specificate. De exemplu,
=SUMIF(A2:A4,100,B2:B4) adună celulele din grupul A2:A4
pentru care celula corespondentă din coloana B este mai mare
SUM =SUM(A1:A10) decât 100.
SUMIF =SUMIF(rg,criteria,sumrg)

460
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Schimbarea formatului numerelor


Formatarea valorilor
Valorile numerice, în general, sunt mai mult decât simple numere. Ele reprezintă o valoare
monetară, o dată, un procent, sau o valoare de orice altă natură. Excel oferă o paletă largă de formate
numerice, care sunt prezentate în tabelul următor:
Tabelul 3.4. Formatele numerice din Excel
Exemple Descriere
Format
numeric
General 10.6 Excel afişează valoarea aşa cum se introduce. Adică, acest format afişează
$456,908.00 simbolurile pentru valută sau procent numai dacă se introduc de la tastatură.
Formatul prestabilit Number are două zecimale. Numerele negative apar scrise
Number 3400.50 cu roşu şi între paranteze, precedate de semnul minus.
(-120.39) Formatul prestabilit Currency are două zecimale şi simbolul dolarului. Numerele
negative apar scrise cu roşu şi între paranteze.
Currency $3,400.50 Se poate folosi acest format pentru a alinia simbolul dolarului şi zecimalele în
(Valută) ($3,400.50) coloană. Formatul Accounting prestabilit conţine două zecimale şi simbolul
Accounting $3,400.00 pentru dolar.
(Contabilitate) $978.21 Formatul Date prestabilit cuprinde luna şi ziua separate de o bară oblică (/); se
poate selecta însă şi un alt format din cele disponibile.
Date (Dată) 11/7 Formatul Time prestabilit conţine ora şi minutele separate de două puncte; se
poate opta şi pentru afişarea secundelor, sau a particulelor AM sau PM.
Formatul Percentage prestabilit cuprinde două zecimale. Excel înmulţeşte
Time (Ora) 10:00 valoarea din celulă cu 100 şi afişează rezultatul însoţit de simbolul pentru
procent.
Formatul prestabilit Fraction poate reprezenta cel mult o cifră pe fiecare parte a
Percentage 99.50% barei. Folosind acest format se va afişa numărul de cifre necesar pe fiecare
(Procent) parte a barei şi tipul de fracţie (cum ar fi jumătăţi, sferturi, optimi etc.).
Formatul Scientific prestabilit cuprinde două zecimale. Folosiţi acest format
Fraction 1/2 pentru afişarea numerelor în format ştiinţific.
(Fracţie) Folosind formatul Text se va afişa atât text, cât şi numere, în aceeaşi celulă.
Excel va afişa exact ceea ce se introduce de la tastatură.
Acest format este conceput special pentru afişarea codurilor poştale, a
Scientific 3.40E+03 numerelor de telefon şi a codurilor personale, astfel încât să nu fie necesară
(Ştiinţific) folosirea unor caractere speciale, cum ar fi liniuţele.
Text 135RV90 Formatul Custom este pentru crearea propriului format numeric. Se poate folosi
unul din codurile pentru formatare din lista Type, care va fi modificat. Simbolul #
reprezintă un marcaj de rezervare pentru un număr, iar 0 reprezintă un marcaj
Special 02110 de rezervare pentru zero.

Custom 00.0%
(Personalizat)

461
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

După stabilirea formatului numeric adecvat, se vor efectua paşii următori:


1. Se selectează celula sau domeniul de celule ce conţine valorile care vor fi formatate.
2. Se deschide meniul Format şi se selectează Cells. Pe ecran va apărea caseta de dialog
Format Cells.

Fig.3.2. Caseta de dialog Format Cells având afişată eticheta Numbers

3. Se execută clic pe eticheta Numbers.


4. În lista Category, se selectează categoria pentru formatul numeric ce va fi folosit. În caseta
Sample se poate vedea cum arată formatul prestabilit pentru categoria respectivă.
5. Se efectuează modificările dorite pe formatul respectiv.
6. Se execută clic pe OK. Excel va reformata celulele selectate conform opţiunilor alese.

Crearea diagramelor
Tipuri de diagrame
În Excel se pot crea diferite tipuri de diagrame. Tipul ce va fi ales depinde de datele ce trebuie să
fie reprezentate. Principalele tipuri de diagrame, împreună cu destinaţia lor, sunt:
Pie (circulară) Se foloseşte acest tip pentru a reprezenta relaţia dintre părţile unui întreg.
Bar (bară) Acest tip se foloseşte pentru compararea valorilor într-un anumit moment.
Column (coloană) LA fel ca diagrama de tip bară, se poate folosi pentru evidenţierea
diferenţelor dintre elemente.
Line (linie) Se foloseşte pentru a sublinia tendinţele de evoluţie şi variaţia valorilor în timp.
Scatter (prin puncte) La fel ca diagrama liniară se foloseşte pentru a sublinia diferenţa dintre
două seturi de valori.
Area (zonală) La fel ca diagrama liniară se foloseşte pentru a sublinia amploarea variaţiei
valorilor în timp.
Majoritatea acestor tipuri de diagrame există şi în variante tridimensionale. Pe lângă faptul că au
un aspect mai profesionist decât diagramele standard, bidimensionale, diagramele 3-D sunt mai
relevante pentru diferenţele dintre seturile de date.

Terminologie specifică

462
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Serii de date Barele, sectoarele de cerc, liniile şi celelalte elemente care


constituie valorile reprezentate în diagramă. De exemplu, o diagramă
poate fi formată dintr-o mulţime de bare asemănătoare, care să reprezinte
o serie de valori pentru acelaşi articol. Barele dintr-o serie au toate acelaşi
model. Dacă sunt mai multe modele de bare, fiecare model va reprezenta
altă serie de date. De exemplu, pentru reprezentarea vânzărilor din zona1
faţă de zona 2, trebuie folosite două serii de date – câte una pentru
fiecare zonă. Adesea, seriile de date corespund cu rândurile de date din
foaia de calcul.
Categorie Categoriile reprezintă numărul de elemente dintr-o serie. Se pot avea două serii de
date pentru compararea vânzărilor din două zone diferite, şi patru categorii pentru compararea acestor
vânzări pe patru trimestre. Unele diagrame au o singură categorie, în timp ce altele au mai multe. În
mod normal, categoriile corespund coloanelor în care se află datele din diagramă, iar titlurile categoriilor
provin capetele de coloană.
Axă O latură a diagramei. O diagramă bidimensională are o axă X (orizontală) şi o axă Y
(verticală). Pe axa X apar toate seriile şi categoriile de date din diagramă. Dacă aveţi mai multe
categorii, axa X poate avea şi etichete care indică ce categorie reprezintă fiecare. Pe axa Y sunt
reprezentate valorile de pe bare, linii sau punctele graficului. Într-o diagramă tridimensională, axa Z
reprezintă planul vertical, în timp ce axa X (lungimea) şi axa Y (lăţimea) reprezintă cele două laturi ale
bazei diagramei.
Legendă Defineşte diferitele serii de date reprezentate. De exemplu, legenda unei diagrame
circulare va indica ce reprezintă fiecare sector de cerc în parte.
Linii de reţea Scot în evidenţă scala axelor X sau Y pentru seriile de date. De exemplu, liniile de
reţea principale pentru axa Y pot ajuta să se urmărească un punct de pe axa X sau de pe axa Y pentru
a afla valoarea lui exactă.

Crearea unei diagrame


Se pot crea diagrame ca parte a unei foi de calcul sau independent, într-o foaie de calcul
separată. În cazul în care se creează o diagramă înglobată, ea va fi tipărită împreună cu datele din foaia
de calcul, pe când o diagramă independentă poate fi tipărită separat. Ambele tipuri de digrame sunt
legate de datele din foaia de calcul pe care le reprezintă, astfel încât, atunci când se modifică datele,
diagrama este actualizată automat.
Butonul Chart Wizard de pe bara cu instrumente standard permite crearea rapidă a unei
diagrame. Pentru a folosi butonul Chart Wizard, se vor efectua următorii paşi:
1. Se selectează datele care vor fi reprezentate în diagramă. Dacă au fost introduse nume sau
alte denumiri şi se doreşte ca şi acestea să fie incluse în diagramă, trebuie să fie selectate.
2. Se execută clic pe butonul Chart Wizard de pe bara cu instrumente standard.
3. Pe ecran va apărea caseta de dialog Chart Wizard Step 1 of 4, ca în fig.3.3. Se selectează un
tip de digramă din caseta Chart Type şi un subtip (o variantă a tipului de diagramă selectat) din caseta
Chart Sub-Type. Se execută clic pe Next>.

463
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Fig.3.3. Caseta de dialog Chart Wizard


4. Excel întreabă utilizatorul dacă domeniul selectat este corect. Se poate modifica domeniul
selectat scriind un alt domeniu, sau executând clic pe butonul Collapse Dialog (aflat la capătul din
dreapta al casetei de text Data Range) şi selectând domeniul care va fi folosit.
5. În configuraţia prestabilită, programul Excel presupune că diferitele serii de date se află pe
rânduri. Se poate schimba această opţiune pentru coloane, dacă este cazul, selectând Series in
Columns. Când se termină selectările se execută clic pe Next>.
6. Se execută clic pe etichete diferite spre a selecta opţiunile pentru diagramă. De exemplu, se
poate şterge legenda executând clic pe eticheta Legend şi deselectând Show Legend. Se poate
adăuga un titlu pentru diagramă în eticheta Titles. Dacă se doreşte adăugarea unor etichete pentru date
(etichete care prezintă valoarea exactă din graficul de tip bară, linie etc.) se execută clic pe eticheta
Data Labels. După ce se termină aceste modificări, se execută clic pe Next>.
7. În fine, utilizatorul este întrebat dacă doreşte inserarea diagramei (ca obiect) în foaia de calcul
curentă, sau dacă doreşte crearea unei foi de calcul speciale pentru ea. Se alege opţiunea dorită şi se
execută clic pe butonul Finish. Pe ecran va apărea diagrama în forma finală.
Pentru a modifica aspectul diagramei se poate folosi bara cu instrumente pentru diagrame (Chart
toolbar). Aceasta se poate activa deschizând meniul View, selectând Toolbars, apoi Chart.
Fig.3.4. Bara cu instrumente pentru diagrame
Tabelul 3.5. Butoanele de pe bara cu instrumente pentru diagrame

464
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Domeniu de utilizare
Denumire
Chart Objects Executând clic aici se va putea selecta partea din diagramă care se va modifica. Se poate, de
asemenea, executa clic pe secţiunea vizată, pentru a o selecta.
Format Object Se execută clic aici pentru a modifica atributele de formatare ale obiectului a cărui denumire
apare în caseta de text Chart Objects.
Chart Type Se execută clic pe săgeată pentru a schimba tipul de digramă – de exemplu, din diagramă de
tip bară, în una de tip linie. Dacă se execută clic direct pe buton, va fi aplicat tipul de diagramă
afişat.
Legend Se execută clic pe aceasta pentru a afişa sau a ascunde o legendă.
Data Table Se execută clic pe aceasta pentru a introduce un tabel de date, sau o altă structură care
conţine datele ce stau la baza diagramei.
By Row Se execută clic pe acesta dacă seriile de date sunt structurate pe rânduri.
By Column Se execută clic pe acesta dacă seriile de date sunt aranjate pe coloane.
Angle Text Downward Se execută clic pe acest pentru a înclina textul în jos.
Angle Text Upward
Se execută clic pe acesta pentru a înclina textul în sus.

POWERPOINT (grafica pt. marketing )


Start / Programs /Microsoft Powerpoint apar optiunile :autocontent Wizard (prezentare de tip
strategie , vanzari , instruire );template( crearea unei expuneri precizand doar continutul );
blank presentation ( se pleaca de la zero in realizarea expunerii); open an existing presentation
(deschiderea unui document creat anterior ).

Obs.1: cele expuse mai sus sunt echivalente cu :File /New / avem optiunile ( general ;
presentation design  fundal strategie template ; presentation  fundal organizare ; Web
pagesfacilitati internet ).
Obs.2 : ca la Word avem submeniurile : Tools / Spelling ( verifica ortografia ); Tools / language
( aleg tipul de dictionar ); Tools / style checker ( verifica dintr-o data punctuatia , gramatica ,
claritatea ,/Options  imi stabileste conditiile ) ,Tools / auto correct ( ne corecteaza greselile ce
le fac de regula ); Tools customize ( se definesc meniurile , iconurile si comenzile );Tools
/Options  optiuni pt vizualizare , editare , tiperire , salvare , gramatica .
Tools / Add Ins activez meniurile ce lipsesc ca in Excel ); Tools / macro cu optiunile : macros
( aleg macroul ce-l aplic 0;record new macro ( creez un macro ) ca in Excel.
Daca cand pornesc calculatorul aleg “ auto contents wizard “( strategie ) ; next , tipul
prezentarii , numele autorului si celui ce prezinta enter .
Obs.3: in meniul Format avem submeniuri asemanatoare cu cele din Word : font , bullet ,
alignment , line spacing ).

465
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In meniul FORMAT mai avem submeniurile : replace font ( ce tip de font inlocuim si cu ce ;
slide layout ( aleg un tip de diapozitiv ) ,slide color scheme ( schimbarea
fundalului ) ,background ( validez “omit background graphics from master , aleg fill effects ,
apply ) ; apply design ( stil de scris pe diferite niveluri ) .
Crearea unei noi prezentari File /new / presentation design / aleg tipul sablonului / O.K.
Daca fac clic pe dreapta pe un obiect ( chiar text ) avem optiunile : cut , paste , copy ( ca la
word ) , format auto shape ( fundal pt. obiect ); action settings / aleg “mouse Clink” si run
program  unde cu Browse aleg un program executabil ; custom animation (efecte de
animatie la textul selectat ); set autoshape defaults  anuleaza modificarile facute ) ; grouping
( grupari de elemente ); order ( pozitionarea pe straturi ) ; exit edit text ( iese din modul editare ).
Moduri de vizualizare : slide ( diapozitiv ); outline ( sinteza ) ; slide sorter ( sortare diapozitiv );
slide show ( pe tot ecranul ), toate astea sunt submeniuri ale submeniului VIEW.
Obs.4 : salvarea , inchiderea , deschiderea unui document se face ca in word (imprimarea ).
Marirea diapozitivelor – latime , inaltime , de unde incepe numerotarea se stabileste de la
File / page setup .
Editarea unui diapozitiv principal View / master/ slide master de la care se imprumuta
caracteristici catre alte diapozitive .

11.Reţele. Internet
11.1 Reţele de calculatoare, clasificarea reţelelor, protocoale
de reţea (noţiuni generale)
Structura reţelelor de calculatoare

Două sau mai multe calculatoare pot să facă schimb de date între ele prin două modalităţi:

      Off line – schimbul de date realizându-se prin intermediul dischetelor;

      On line – schimbul de date realizându-se prin intermediul unui cablu electric sau linii de
comunicaţie.

O reţea se formează atunci când mai multe PC sunt conectate unele la altele, astfel încât să
poată comunica între ele.

Dacă reţeaua este compusă din PC aflate în acelaşi loc este numită reţea locală (LAN).
Acestea sunt calculatoare care de obicei se afla în acelaşi departament, secţie de lucru sau sediu de
firma. O reţea locală a unei firme este denumită intranet, pentru a face distincţia de internet. Accesul la
intranet este în general limitat la angajaţii unei firme. Informaţiile existente în intranet sunt informaţii ale
firmei, şi deci intră din punct de vedere juridic şi organizatoric sub incidenţa secretului de serviciu.

466
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In cazul în care calculatoarele sunt răspândite pe o arie mult mai mare, reţeaua este numită
reţea de mari dimensiuni (WAN). Aceste reţele pot fi alcătuite din calculatoare aflate în oraşe sau ţări
diferite.

Internet-ul este un conglomerat la scară mondială de reţele de calculatoare. Internetul nu este


proprietatea nici unei firme şi nu este coordonat de nici o firmă şi reprezintă o reţea de reţele de
calculatoare care pot comunica între ele.

Majoritatea reţelelor sunt formate din câte un server şi clienţii conectaţi la reţea.

O reţea de calculatoare oferă o gamă largă de avantaje, printre care putem enumera:

   Comunicarea prin posta electronică;

   Datele centralizate pot fi accesate de calculatoarele din reţea;

   Resursele pot fi partajate între calculatoare (de exemplu modemuri, imprimante, etc);

   Posibilitatea de a crea copii de siguranţă în server.

Intr-o reţea locală de componente similare (tip Peer-to- peer) toate staţiile de lucru sunt
interconectate şi partajează imprimantele, fişierele, dosarele şi alte resurse. Toate persoanele care
folosesc reţeaua îşi salvează fişierele în propriile calculatoare, ceea ce face ca gestionarea fişierelor să
fie dificilă. Aceste reţele nu trebuie să includă mai mult de 10 calculatoare.

Intr-o reţea client-server, informaţiile sunt stocate mult mai eficient, prin intermediul calculatorului
principal folosit ca server de fişiere, în care toţi utilizatorii reţelei îşi salvează propriile date. Serverul de
fişiere este de regulă un calculator ce se află de obicei într-o cameră specială separată şi nu este folosit
individual.

Reţeaua locală este configurată de persoane specializate şi este condusă de un administrator de


reţea.

Utilizatorii trebuie doar să ştie să se conecteze la reţea şi să acceseze resursele care sunt puse
la dispoziţie de către administrator. In Windows 95, dacă este folosită o reţea, pe suprafaţa de lucru
apare pictograma denumita Network Neighborhood, care prin activare afişează punctele de acces la
calculatoarele şi imprimantele din reţea. Dosarul Entire Network, a cărui pictogramă apare în dosarul
Network Neighborhood, afişează punctele de acces la resursele de calculatoare din afara grupei de
lucru.

La executarea dublu clic pe pictograma Network Neighborhood, acesta se deschide şi apar


pictogramele tuturor PC din sistem, cu denumirea fiecărui calculator sub pictograma respectivă.

După deschiderea ferestrei Network Neighborhood, se execută dublu clic pe un server sau alt
calculator din fereastră, pentru a vedea ce resurse sunt la dispoziţie pentru solicitant. Apoi se activează
dosarul sau un periferic cu care se lucrează ca şi cum ar aparţine calculatorului solicitant. Pentru
aceasta se foloseşte bara orizontală superioară.

Pentru închiderea ferestrei Network Neighborhood se foloseşte aceeaşi metodă ca pentru orice
fereastră Windows 95, selectând din meniul File opţiunea Close din meniul ferestrei sau executând clic
pe butonul Close (X) din coltul din dreapta sus al ferestrei. Inchiderea ferestrei nu determină
deconectarea de la reţea, decât atunci când se comandă întreruperea legăturii sau este închis
calculatorul.

467
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

11.2 Reţeaua Internet – descriere generală, adresarea în


Internet
Utilizarea internetului

a. Scurt istoric

Predecesorul Internetului este prima reţea de comunicaţii cu calculatoare ARPAnet, creata de


Ministerul Apărării – SUA în 1969, care ulterior în 1983 s-a divizat în două sisteme diferite: MILNET
exclusiv pentru operaţiunile militare şi respectiv ARPAnet rezervat domeniilor civile. Cele două mari
reţele au rămas conectate, astfel încât utilizatorii să poată schimba informaţii, şi astfel acest sistem
interconectat a fost cunoscut sub numele de Internet.

In 1986, Fundaţia Naţională pentru ştiinţă a SUA a creat NSFNET (National Science Fondation
Network) pentru a conecta supercalculatoarele de mare viteză din SUA, aceasta din raţiuni ştiinţifice.
Această ultimă reţea a preluat şi reţelele ARPAnet.

Reţeaua Internet-ul este descentralizată şi parţial anarhică. Nu există un organism administrativ


fix sau alte organisme care să fixeze regulile de funcţionare, cu excepţia ISOC – care este o
organizaţie cu caracter voluntar şi scopul său este promovarea schimbului global de informaţii.

Dezvoltarea reţelei Internet a fost spectaculoasă, astfel că în 1985 erau conectate aproximativ
2.000 de calculatoare, în 1997 cca. 9 milioane de calculatoare.

In prezent oricare posesor al unui calculator conectat la o linie telefonica poate avea acces la
Internet.

Pentru conectarea la Internet, trebuie îndeplinite următoarele condiţii minimale: un PC


performant, dotat cu Windows 95 sau unul mai performant dotat cu un modem specializat pentru
aceasta, o linie telefonică şi un abonament la un furnizor de servicii Internet independent sau un serviciu
comercial on-line.
 

b. Facilităţi asigurate de INTERNET 

Internetul în prezent asigură accesul la următoarele servicii şi facilităţi:

   World Wide Web (WWW) sau pe scurt Web, este uriaşă colecţie de documente care conţin
informaţii ce sunt păstrate pe calculatoare răspândite în toată lumea. WWW a fost creat în
Elveţia la Centre Europeen de Recherche Nucleare (CERN). Documentele sunt create cu o
tehnologie specială, numită hipertext. Mulţi pun semnul egalităţii între Internet şi Web,
întrucât Web-ul are cea mai mare pondere în serviciile Internet. De altfel a apărut expresia Surf
in Web, care înseamnă plimbare prin Internet.

   Use Net, protocol ce poate fi folosit pentru cuplarea la grupurile de discuţii, pentru a colabora
cu alţi colaboratori conectaţi la Internet.

   File Transfer Protocol, permite transferarea de fişiere de pe un calculator-gazdă pe altul.

   Internet Relay Chat, poate fi folosit pentru a purta conversaţii în direct, chiar se pot organiza
conferinte video şi audio.

   Posta electronică (e-mail), prezentată la paragraful 8.2.


 

468
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

c. Protocoale folosite pe internet pentru a lucra în WWW  

Pentru a lucra în Web sunt folosite mai multe protocoale:

   Internet protocol (IP), fiind cel mai simplu protocol de comunicare între calculatoare;

   Transmission Control Protocol (TCP), care este mai performant decât cel de mai sus
întrucât asigură corectarea erorilor de transmisie.

Deoarece cele două protocoale prezentate mai sus sunt folosite de regulă împreună, ele sunt
menţionate mereu împreună sub forma TCP / IP.

   File Transfer Protocol (FTP), defineşte modul în care este transferat un fişier generic dintr-
un calculator în altul. fişierul poate fi de forma: document, program, o imagine, etc.

   Hyper Text Markup Language (HTML), care defineşte o metodă de adăugare a atributelor
de formatare în fişierele de text, pentru a fi vizualizate fişierele de text citite ca nişte titluri,
paragrafe centrate şi imagini înglobate.

   Hyper Text Transfer Protocol (HTTP), defineşte modul în care calculatoarele transmit
fişierele HTML în ambele direcţii.
 

d. Utilizarea reţelei Web 

WWW este o colecţie de milioane de documente cu diferite informaţii care sunt păstrate pe
calculatoare răspândite în întreaga lume. Pentru a uşura accesul la aceste informaţii se dau în
continuare câteva definiţii:

   Pagina Web reprezintă un document Web;

   Situl Web este o colecţie de pagini Web, care aparţin aceleaşi instituţii sau persoane;

   Pagina sursă (Home Page) este pagina principală dintr-un sit Web;

   Hipertextul reprezintă metoda folosită pentru a organiza informaţia în reţeaua Web.
Folosindu-se această metodă, textele sau imaginile evidenţiate într-un document reprezintă
trimiteri la alte documente care conţin informaţii suplimentare;

   Hypermedia reprezintă o extindere a metodei hypertext, prin care trimiterile sunt extinse şi la
alte medii cum sunt sunetele şi imaginile video;

   URL (Uniform Resource Locator) reprezintă adresa unei locaţii cu informaţii din reţeaua
Internet. Aceasta este formată din trei părţi:

      Numele protocolului. Precizează tipul resursei Internet. In tabelul 8.3 sunt prezentate
câteva tipuri de resursă.

      Numele gazdei. Prezintă numele calculatorului pe care este stocată informaţia.

      Calea fişierului. Precizează numele fişierului în care se găseste informaţia şi calea de
cataloage până la catalogul în care se află fişierul.

   Browserul este un program care ajută la găsirea şi citirea informaţiilor în documentele html
ale reţelei Web şi asigură următoarele operaţii mai importante:

469
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

      Deplasarea printre documentele web şi vizualizarea lor;

      Folosirea semnelor de carte şi a istoricului pentru regăsirea rapidă a informaţiilor;

      Copierea informaţiilor în fişiere în calculatorul propriu.

Cele mai cunoscute browsere sunt:

      Internet Explorer a fost creat de Microsoft şi inclus în sistemele de operare Windows 95
şi 98.

      Netscape Navigator, care a fost creat de Netscape Communication Corporation, poate fi
folosit în sistemele windows 95 şi 98.

11.3 (*) Serviciile reţelei Internet (transferarea fişierelor prin


ftp, poşta electronică, www,
telnet)
Utilizarea poştei electronice 

Poşta Internet – Email-ul este o formă modernă de comunicare, ce combină rapiditatea unui apel
telefonic cu înregistrarea şi expedierea unei scrisori. Transmiterea scrisorii durează doar câteva
secunde, iar destinatarul poate răspunde când doreşte şi în plus nu trebuie contactat direct destinatarul
pentru transmiterea scrisorii.

Un alt avantaj al poştei electronice este preţul scăzut al abonamentului, de cca. 2…3 $ pe lună şi
respectiv costul scăzut al transmisiei şi recepţiei scrisorilor prin E-mail, care se taxează pentru
impulsurile telefonice de câteva secunde dintre abonat şi server, server care se află de obicei în acelaşi
oraş cu abonatul.

Dezavantajul poştei electronice este că nu asigură inviolabilitatea corespondentei.

O adresă de E-mail are două părţi, Prima parte este numele utilizatorului sau orice alt nume ales de
utilizator urmată de semnul @ şi a doua parte este numele contului de la posta electronică urmat adesea de
simbolul tării în care se află serverul. De obicei numele contului se confundă cu numele serverului la care
este abonat calculatorul gazdă. Deci o adresă poate fi scrisă sub forma: aalecu@fx.ro unde aalecu
reprezintă numele utilizatorului calculatorului gazdă., fx numele serverului şi ro prescurtarea de la România.
In caz că nu apare numele tării, se subînţelege că serverul se află în SUA şi în general aparţine de una din
următoarele şapte domenii de organizaţie diferite, aşa cum se observă din Tabelul 8.1

Tabelul 8.1.

Cod Domeniu
.com Entităţi comerciale
.edu Instituţii educaţionale
.gov Instituţii guvernamentale non-militare ale SUA

470
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

.int Instituţii internaţionale (NATO).


.mil Instituţii militare SUA.
.net Resurse de reţea
.org Organizaţii non-profit.

Comunicarea prin posta electronică

Pentru utilizarea poştei electronice, firma gazdă la care se face abonamentul pentru E-mail
livrează clientului pachetul de programe care asigură funcţia de agent utilizator, printre care enumerăm:

   Outlook Express Mail;

   Eudora.

Cu Outlook Express Mail se poate trimite mesaje prin E-mail oricărei persoane a cărei adresă de
E-mail există pe Internet, intranet şi post individual abonat la un server. Se pot trimite în plus fişiere,
rapoarte, scrisori şi foi de calcul tabelar – sub formă de anexe la mesajele transmise. De obicei
programul Outlook Express Mail este folosit de clienţii abonaţi la Internet.

Eudora este un pachet de programe folosit de obicei de clienţii abonaţi la o postă electronică (un
server), numai pentru E-mail.

Un program de postă asigură în general următoarele operaţii:

   Compunerea, transmiterea şi recepţia mesajelor;

   Administrarea mesajelor primite: vizualizarea, arhivarea pe disc sau tipărirea lor, ştergerea;

   Retransmiterea către alţi destinatari a mesajelor primite;

   Confirmarea trimiterii mesajului;

   Confirmarea de către destinatar a recepţionării mesajului;

   Folosirea fişierelor cu semnături;

   Ataşarea unor fişiere ;

Un mesaj E-mail este format din patru elemente:

   Antetul (Header), care este un text cu care începe mesajul. Conţine informaţii despre destinatar,
autor, subiect şi ora transmisiei;

   Corpul (Body), care reprezintă mesajul propriu zis;

   Semnătura (Signature), care este un text care se adaugă la sfârşitul mesajului poştal, şi
cuprinde cel puţin numele autorului. Mulţi autori introduc de obicei în plus numele firmei şi
numărul de telefon unde pot fi contactaţi.

   Anexele ataşate mesajului (Attach binary file), prezentate la pct..8.2.2.

471
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

La compunerea unui mesaj, este bine să se ţină cont de anumite facilităţi pe care programele
de postă electronică le asigură, prezentate în

Tabelul 8.2.

Facilitatea Semnificaţia
Pseudonim (Alias) Permite să se definească nume alternative, scurte
şi familiare pentru anumiţi utilizatori.
Copii (Carbon Copy) Permite să se transmită mesajul la mai multe
adrese.
Inserarea de fişiere Permite înserarea de fişiere în corpul mesajului.
(Including File)
Lista de adrese Se defineşte o lista de adrese sau grupuri de
(Mailing List) adrese cărora li se pot trimite mesaje prin
E-mail-uri .
Confirmarea primirii Permite trimiţătorului unui mesaj să primească
(Receipt Notification) confirmarea sosirii la destinaţie a mesajului.

-           Subject – se completează opţional de expeditor cu o scurtă descriere a mesajului;

-           Body – se construieşte mesajul de transmis.

      Se execută clic pe un buton din fereastră pentru a expedia mesajul. Acest buton este
denumit de obicei Send;

      Se face conectarea la reţea şi se execută clic pe comanda de expediere ( Send / Send
Only), şi / sau pe cea de expediere şi primire mesaje (Get All) sau alte comenzi similare pe
care le asigură programul. După ce s-a transmis mesajul, conţinutul acestuia este mutat
automat în dosarul Send items.

      Dacă se doreşte doar primirea unor mesaje depuse la server, se face conectarea la reţea
prin comanda Get Mail sau alta asemănătoare, funcţie de programul folosit.

Se poate răspunde la un mesaj în mai multe moduri:

   Răspuns către expeditor (Reply). In acest caz adresa destinatarului este completată automat,
fiind preluată din adresa expeditorului la al cărui mesaj se răspunde. Răspunsul poate fi de
două feluri, cu păstrarea textului sosit sau fără păstrarea lui în răspuns. La clicarea pe
butonul (Reply), apare mesajul (Quote original message) la care se poate răspunde cu
(Yes) sau (No).

   Reexpedierea mesajului (Forward), acţiune prin care mesajul este retransmis către un alt
destinatar. Adresa expeditorului iniţial este înlocuită cu adresa utilizatorului care reexpediază

472
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

mesajul;

   Redirecţionarea mesajului (Redirect), prin care mesajul este transmis către un alt destinatar,
păstrându-se ca adresă de expeditor, adresa expeditorului iniţial.

Gestionarea fişierelor ataşate la mesajele E-mail 

Dacă este folosită posta electronică, nu este nevoie de fax sau oficiu poştal pentru a trimite
documente. Acestea pot fi ataşate la un mesaj şi trimise destinatarului.

Gestionarea fişierelor constă din:

   Ataşarea fişierelor la mesajele transmise;

   Extragerea fişierelor ataşate din mesaje;

   Folosirea WinZip-ului pentru a lucra cu fişierele atasate şi arhivate;

a. Ataşarea unui fişier la un mesaj

Pentru a ataşa un fişier la un mesaj, se trage cu mouse-ul fişierul din Windows Explorer şi se
plasează în corpul mesajului cu care trebuie transmis. Va apare o pictogramă şi numele fişierului în
corpul mesajului. Se pot ataşa oricâte fişiere în corpul unui mesaj.

In cazul utilizării programului Outlook Express Mail, se alege din meniul principal Insert, opţiunea
File Attachment. Apoi se alege fişierul dorit din caseta de dialog File Attachment şi în final se execută
clic pe Attach. Va apare un panou în partea de jos a ferestrei în care se află textul mesajului, care va
conţine câte o pictogramă pentru fiecare fişier ataşat la mesaj.

b. Extragerea fişierelor ataşate, din mesaje

Extragerea se obţine prin clicarea pe pictograma agrafă a mesajului. Opţional se poate


copia/muta fişierul în dosarul dorit.

In cadrul programului Outlook Express, se poate afişa conţinutul unui fişier ataşat, efectuând
dublu clic pe icoana aferenta..

c. Folosirea WinZip-ului pentru a lucra cu fişierele ataşate şi arhivate

Se pot economisi timp, efort şi bani, comprimând fişierele înainte de a le ataşa la un mesaj de
postă. Pentru a crea un fişier Zip şi a adăuga fişiere în el, se vor executa următoarele manevre:

      In Window Explorer vor fi selectate fişierele care trebuiesc comprimate.

      Se execută apoi clic-dreapta pe fişierele selectate şi în continuare se va alege comanda Add
to Zip. Dacă această comandă nu apare, înseamnă că programul WinZip nu este instalat pe
PC.

473
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

      Se scrie calea şi numele fişierului ZIP în câmpul Add to Archive.

      Se execută apoi clic pe Add, iar WinZip va adăuga fişierele selectate în fişierul ZIP.

      După examinarea conţinutului fişierului ZIP, se închide WinZip executând clic pe butonul X
din bara de titlu. Acum fişierul comprimat poate fi ataşat la mesajul E-mail.

Extragerea unui fişier ZIP ataşat la un mesaj de postă E-mail, se face după cum urmează:

      Se execută dublu-clic pe pictograma fişierului ZIP din cadrul mesajului. Programul WinZip va
afişa conţinutul fişierului.

      Se alege din meniul principal Action, Extract şi se va vizualiza caseta de dialog Extract.

      Se închide programul WinZip.

      Se execută dublu-clic pe fişierul ZIP din mesajul E-mail şi în cadrul programului WinZip va fi afişat
conţinutul fişierului ZIP.

Facilităţi asigurate de INTERNET 

Internetul în prezent asigură accesul la următoarele servicii şi facilităţi:

   World Wide Web (WWW) sau pe scurt Web, este uriaşă colecţie de documente care conţin
informaţii ce sunt păstrate pe calculatoare răspândite în toată lumea. WWW a fost creat în
Elveţia la Centre Europeen de Recherche Nucleare (CERN). Documentele sunt create cu o
tehnologie specială, numită hipertext. Mulţi pun semnul egalităţii între Internet şi Web,
întrucât Web-ul are cea mai mare pondere în serviciile Internet. De altfel a apărut expresia Surf
in Web, care înseamnă plimbare prin Internet.

   Use Net, protocol ce poate fi folosit pentru cuplarea la grupurile de discuţii, pentru a colabora
cu alţi colaboratori conectaţi la Internet.

   File Transfer Protocol, permite transferarea de fişiere de pe un calculator-gazdă pe altul.

   Internet Relay Chat, poate fi folosit pentru a purta conversaţii în direct, chiar se pot organiza
conferinte video şi audio.

   Posta electronică (e-mail), prezentată la paragraful 8.2.


 

c. Protocoale folosite pe internet pentru a lucra în WWW  

Pentru a lucra în Web sunt folosite mai multe protocoale:

   Internet protocol (IP), fiind cel mai simplu protocol de comunicare între calculatoare;

   Transmission Control Protocol (TCP), care este mai performant decât cel de mai sus
întrucât asigură corectarea erorilor de transmisie.

Deoarece cele două protocoale prezentate mai sus sunt folosite de regulă împreună, ele sunt
menţionate mereu împreună sub forma TCP / IP.

474
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

   File Transfer Protocol (FTP), defineşte modul în care este transferat un fişier generic dintr-
un calculator în altul. fişierul poate fi de forma: document, program, o imagine, etc.

   Hyper Text Markup Language (HTML), care defineşte o metodă de adăugare a atributelor
de formatare în fişierele de text, pentru a fi vizualizate fişierele de text citite ca nişte titluri,
paragrafe centrate şi imagini înglobate.

   Hyper Text Transfer Protocol (HTTP), defineşte modul în care calculatoarele transmit
fişierele HTML în ambele direcţii.
 

d. Utilizarea reţelei Web 

WWW este o colecţie de milioane de documente cu diferite informaţii care sunt păstrate pe
calculatoare răspândite în întreaga lume. Pentru a uşura accesul la aceste informaţii se dau în
continuare câteva definiţii:

   Pagina Web reprezintă un document Web;

   Situl Web este o colecţie de pagini Web, care aparţin aceleaşi instituţii sau persoane;

   Pagina sursă (Home Page) este pagina principală dintr-un sit Web;

   Hipertextul reprezintă metoda folosită pentru a organiza informaţia în reţeaua Web.
Folosindu-se această metodă, textele sau imaginile evidenţiate într-un document reprezintă
trimiteri la alte documente care conţin informaţii suplimentare;

   Hypermedia reprezintă o extindere a metodei hypertext, prin care trimiterile sunt extinse şi la
alte medii cum sunt sunetele şi imaginile video;

   URL (Uniform Resource Locator) reprezintă adresa unei locaţii cu informaţii din reţeaua
Internet. Aceasta este formată din trei părţi:

      Numele protocolului. Precizează tipul resursei Internet. In tabelul 8.3 sunt prezentate
câteva tipuri de resursă.

      Numele gazdei. Prezintă numele calculatorului pe care este stocată informaţia.

      Calea fişierului. Precizează numele fişierului în care se găseste informaţia şi calea de
cataloage până la catalogul în care se află fişierul.

   Browserul este un program care ajută la găsirea şi citirea informaţiilor în documentele html
ale reţelei Web şi asigură următoarele operaţii mai importante:

      Deplasarea printre documentele web şi vizualizarea lor;

      Folosirea semnelor de carte şi a istoricului pentru regăsirea rapidă a informaţiilor;

      Copierea informaţiilor în fişiere în calculatorul propriu.

Cele mai cunoscute browsere sunt:

      Internet Explorer a fost creat de Microsoft şi inclus în sistemele de operare Windows 95
şi 98.

475
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

      Netscape Navigator, care a fost creat de Netscape Communication Corporation, poate fi
folosit în sistemele windows 95 şi 98.

11.3 (*) Căutarea informaţiei pe Internet – motoare de


căutare

Căutarea informaţiei se poate realiza după:

      Adresa URL a paginii Web;

      Cuvinte cheie care descriu subiectul cercetat;

      Semne de carte.

Tabelul 8.3.

Diferite tipuri de adrese URL


 

Format Exemplu
http:// http:// www.pub.ro
telnet:// telnet://onramp.net
Gopher:// gopher:// gopher.umc.edu
ftp:// ftp:// ftp.mcp.com/que
file:/// file:/// cIwindows/readme.bat

Reţeaua Web funcţionează pe baza relaţiei client-server, serverul fiind calculatorul pe care se
găsesc unul sau mai multe situri Web, iar clientul este calculatorul de pe care se emite cererea de
informaţii.

In continuare este prezentat un exemplu de căutare a unor informaţii folosind browserul Internet
Explorer în cadrul unui calculator utilat cu sistemul de operare Windows 95 şi conectat la un server la
care este abonat.

   Se execută un clic pe caseta Internet explorer din suprafaţa de lucru a mediului Windows 95.

   Va apare pe ecran tabloul Dial-up Connection. Se vor completa rubricile: User name şi
Password cu cuvintele din protocolul de închiriere pentru folosirea reţelei Internet încheiat cu
serverul. Apoi se antrenează tasta Connect.

   Va apare o suprafaţă de lucru pentru Internet. Se introduce în bara orizontală superioară
adresa unei locaţii în care se caută anumite informaţii.

476
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In cazul prezent se va scrie www.pub.ro care reprezintă adresa în Web pentru Universitatea
Politehnică Bucuresti.

   Va apare pagina sursă. Se va clica pe caseta relansin şi vor apărea o serie de informaţii
referitoare la programul de cercetare Relansin.

   La închiderea lucrului, se clichează pe X şi se părăseşte suprafaţa de lucru Internet Explorer.

   Apare din nou suprafaţa de lucru a mediului Windows 95. Se clichează caseta cu două
monitoare cuplate din bara orizontală de jos şi apare un tablou şi se va clica pe tasta
Disconnect.

e. Atenţionări şi codul de conduită 

Alegeţi cu atenţie mesajele necesare de pe Internet. Circulă şi multe informaţii neinteresante


(gunoaie) sau obscene.

Orice fişier copiat de pe Internet trebuie mai întâi devirusat.

Informaţiile care circulă pe Internet trec de la un calculator la altul, şi pot fi interceptate de


persoane din lanţul de transmitere. Deci evitaţi să transmiteţi informaţii personale ca: adresă, număr de
telefon, numărul cardului de plată, etc.

Nu daţi adresa cutiei poştale unor persoane necunoscute, pentru ca să nu aveţi surprize
neplăcute.

Utilizatorii de Internet folosesc codul de conduită numit Netiquette. Dintre regulile sale se
enumera în continuare:

      Nu fiţi nepoliticos şi nu utilizaţi inutil resursele reţelei Internet;

      Transmiteţi informaţii cât mai concise;

      Nu scrieţi mesajele cu majuscule, sunt mai greu de citit şi dau impresia de nepoliteţe.

      Nu declanşaţi un război al insultelor.

      Furnizorul de servicii Internet la care sunteţi abonat poate închide conexiunea, dacă prea
mult timp fiind conectat on-line, nu o folosiţi.

      Nu folosiţi munca altora fără a le cere permisiunea. Astfel unii utilizatori preiau din reţea
texte, imagini şi videoclipuri asupra cărora acţionează legea dreptului de autor.

477
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Dacă doriţi să citaţi o sursă on-line în propriile lucrări, informaţi-vă care sunt modalităţile legale
prin care se obţine aprobarea pentru citare.

Pentru citarea în lucrarea proprie a unor paragrafe sau informaţii culese on-line, Asociaţia
Americană de Fiziologie a propus aşa cum se vede din Tabelul 8.3, următorul standard pentru
integrarea citatelor: Autor (i), Data publicării, Titlul documentului, Tipul documentului, URL, Data
vizionării.

478
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Tabelul 8.4.
 

Titlul Conţinutul
Autor ( i ) Numele fiecăruia dintre autorii documentului. Dacă pagina
Web conţine doar / şi o adresă de e-mail sau un pseudonim,
treceţi-le şi pe acestea.
Data publicării Data la care a fost publicat documentul. De obicei la sfârşitul
documentului se găseşte data celei mai recente actualizări a
unei pagini Web.
Titlul Titlul paginii Web aşa cum apare în bara de titlu a
documentului browserului.
Tipul Poate fi unul din tipurile de documente enumerate în Tabelul
documentului 8.5.
URL Adresa URL completată, poate fi una din adresele
enumerate în Tabelul 8.3.
Data vizitării Data la care aţi găsit materialul citat în vizita pe Internet.
Este bine să fie menţionat deoarece informaţiile Internet se
schimbă în mod frecvent.

Tabelul 8.5.

Tipuri de documente care pot fi citate

Tipul documentului Descriere


Database Bază de date on-line
Digitized Image Imagine digitală, fişier grafic (GIF,JPG, etc)
Digitized Sound File Sunet digital, fişier audio (WAV,AU, etc.)
Digitized Video File Video clip digital, fişier video (AVI,MOV, etc.)
Electronic Data File Alte fişiere
FTP Archive Dosar dintr-o arhivă FTP
Gopher Menu Meniu Gopher, locaţie dintr-un document.
On-line News Posting Mesaj dintr-un grup de discuţii UseNet
On-line Search Query Rezultatul unei interogări on-line
On-line Serial Mesaj distribuitor periodic prin e-mail
On-line Service Serviciu accesat prin Telnet
PostScript File Fişier Postcript.
Text File Fişier de text simplu.
WAIS Database Bază de date WAIS cu acces public
WAIS Query Rezultatul unei interogări WAIS
WWW document Pagină Web

9. Baze de date
9.1 Definirea bazei de date
SISTEME DE GESTIUNE A BAZELOR DE DATE
9.1.1Aspecte privind organizarea datelor
Organizarea datelor presupune umatoarelor activitati:
-definirea ,structurarea,ordonarea si gruparea in colectii de date;
-stabilirea relatiilor intre date,intre elementele unei colectii de date;

479
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

-reprezentarea lor pe un spot informational


Definirea uniu model de date impune precizarea urmatoarelor elemente:
-structurile de date si stabilirea relatiilor intre date;
-operatori;
-restrictii de integritate
Intre date se pot stabili urmatoarele tipuri de date:
-unu la unu ;
 -unu la mai multi;
-multi la multi;
Operatori:citire,inserare,modificare,join etc.
Restrictii de integritate:corectitudinea datelor.
Modele de date:ierarhice,retea,relationale,orientate pe obiect,logice de date.
9.1.2 Baze de date
9.1.2.1 Definirea unei baze de date
Scopul principal al unei baze de date consta in stocarea datelor in vederea satisfacerii facile a cerintelor
utilizatorului,utilizand tehnica de calcul.deci,baza de date apare ca un sistem de
inmagazinare,regasire,actualizare si intretinere a datelor necesare procesului de fundamentare a
deciziei.
Definitia 1.1.2 O baza de date este o colectie structurata de date atasate unui fenomen al
lumii reale pe care incercam sa-l modelam.
Baza de date implica patru componenete:
 date
 hardware
 software
 utilizatori
9.1.2.2 Arhitecturi standardizate pentru bazele de date
Pe plan international exista mai multe grupuri specializate in standardizarea conceptelor ce
apar in dezvoltarea bazelor de date,cele mai importante fiind DBTG,CODASYL,ANSI/X3/SPARC,grupul
IMB.
In general ,o arhitectura cuprinde urmatoarele componente :
 baza de date propriu-zisa in care se memoreaza colectia de date;
 sistemul de gestiune al bazei de date
 un dictionar al bazei de date
 mijloace hard utilizate
 personal implicat:utilizatori finali sau de specialitate,programatori si operatori.
Datele pot fi definite pe trei nivele:
-nivel intern;
-nivel conceptual;
-nivel extern.
9.1.2.3 Limbaje pentru baze de date
1. Limbaje pentru definirea datelor(LDD)
Realizeaza definirea entitatilor si a atributelor acestora prin nume,forma de memorare,lungime.
2.Limbaje pentru manipularea datelor(LMD)
In general,o comanda are urmatoarea structura:
-operatia care poate fi calcul aritmetic sau logic,editare,extragere,manipulare
-criterii de selectie
-mod de acces
-forma de editare.
2. Limbaje pentru controlul datelor(LCD)
Se refera la asigurarea confidentialitatii si integritatii datelor,la salvarea informatiei in carzul unor
incidente,la obtinerea unor performante,la rezolvarea unor probleme de concurenta.
9.1.2.4 Avantajele utilizarii bazelor de date
Acestea sunt urmatoarele:
 Poate fi redusa redundanta datelor
 Se poate evita inconsistenta datelor
 Datele pot fi partajate

480
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 Se poate obtine standardizarea


 Se pot aplica restrictii de securitate a datelor
 Poate fi mentinuta integritatea datelor prin existenta unor proceduri de validare ,unor protocoale de
control concurent a unor proceduri de refacere a bazei de date dupa incidente
 Pot fi echilibrate cerintele conflictuale
Intr-o baza de date nu se doreste ca aplicatiile sa fie deperndente de date din motivele :
-diferite aplicatii au nevoie de viziuni diferite ale acelorasi date
-administratorul bazei de date trebuie sa aiba sa schimbe structura de memorare sau strategia de acces
fara sa modifice aplicatii existente.
9.1.3 SISTEMUL DE GESTIUNE A BAZEI DE DATE(SGBD)
9.1.3.1 Definirea sistemului de gestiune a bazei de date
Definitia 1.1.3 Sistemul de gestiune a bazei de date reprezinta softwar-ul care asigura realizarea
urmatoarelor activitati:
-definirea structurii bazei de date
-incaracrea datelor in baze de date
-accesul la date
-intretinea bazei de date
-reorganizarea bazei de date
-securitatea datelor
9.1.3.2 Obiectivele unui sistem de gestiune a bazelor de date
1. Asigurarea independentei datelor
Aceasta trebuie privita din doua puncte de vedere:
-independenta fizica
-independenta logica
2. Asigurarea unei redundante minime si controlate a datelor din baza de date
3. Asigurarea unor facilitati sporite de utilizare a datelor
Aceasta presupune:
-folosira datelor de catre mai multi utilizatori in diferite scopuri;
-accesul cat mai simplu al utilizatorilor la date
-existenta unor limbaje performante de regasire a datelor
-acces multicriterial al sistemului de gestiune
-utilizarea unui limbaj natural
3. Sporire gradului de securitate a datelor
4. Asigurarea integritatii datelor
5. Asigurarea partajabilitatii datelor

9.1.3.3 Functiile unui sistem de gestiune a bazelor de date


1.Functia de descriere a datelor
2.Functia de manipulare a datelor
Aceasta realizeaza activitatile :
-crearea bazei de date;
-adaugarea de noi inregistrari;
-suprimarea unor inregistrari;
-modificarea valorilor corespunzatoare unor campuri;
-cautatea ,sortarea si editarea partiala sau totala a unei inregistrari virtuale.

9.2 Clasificarea bazelor de date (modelul relaţional,


modelul reţea, modelul ierarhic)
Aplicaţiile de tip “bază de date” se referă la acele produse livrate utilizatorului “la cheie” pentru
a-şi rezolva o problemă concretă. Aplicaţiile de tip “bază de date” existente pe piaţa românească se pot
împărţi în trei mari grupe, după finalitatea datelor manevrate:
a. a.       baze de date personale;

481
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

b. b.      baze de date informaţionale;


c. c.       baze de date pentru gestiunea economică.
 
a. Bazele de date “personale” sunt mici colecţii de date care prezintă interes şi sunt manipulate
de un singur utilizator. Câteva exemple tipice sunt următoarele: agendă telefonică, planificarea de
întruniri, evidenţa cărţilor din biblioteca personală. Pentru astfel de utilizări restrânse ale unei baze de
date, se poate folosi aplicaţia Card File disponibilă în pachetul Windows 3.x.
b. Bazele de date de tip informaţional sunt în general caracterizate de un volum foarte mare de
date (informaţii) ce sunt destinate publicului larg. Ele pot fi considerate adevărate “birouri de informaţii”
computerizate. Domeniul de aplicabilitate a acestor baze de date este extrem de diversificat şi face
imposibilă o clasificare.
c. Bazele de date pentru gestiunea economică reprezintă colecţii de date necesare şi utilizate
pentru gestionarea unei întreprinderi. Aplicaţiile cele mai reprezentative care operează cu astfel de baze
de date sunt produsele CIEL.
 
Pentru a înţelege mai bine cum este alcătuită şi cum funcţionează o bază de date, trebuiesc
specificate câteva noţiuni privind teoria generală a bazelor de date, cu aplicabilitate în arheologie:
Datele dintr-o colecţie de entităţi pot fi unite şi rezumate în moduri
diferite pentru a produce informaţie. Informaţia este o colecţie de date plasată în
context, care poate fi furnizată de către o situaţie sau de alte date.
Pentru a creşte (mării) bazele umane de cunoştinţe mentale memorate,
omul colectează şi memorează date în formă automată. O astfel de colecţie se
numeşte bază de date. Ea reprezintă nu numai date despre entităţi dar şi date
despre relaţiile dintre entităţi. Pe baza aceleaşi structuri funcţionează o bază de
date şi într-un calculator.
 
Există două forme de baze de date:
a. a.       baze de date fizice, care sunt reprezentări pe medii de memorare a
entităţilor, atributelor şi a relaţiilor dintre ele;
b. b.      baze de date logice, care reprezintă entităţi, atribute şi relaţiile
independente de modul în care datele şi relaţiile sunt reprezentate şi
memorate într-o bază de date fizică.
 
           Modele de baze de date
 
Există trei categorii de modele de baze de date:
1. 1.      modelul relaţional;
2. 2.      modelul reţea;
3. 3.      modelul arborescent (ierarhic).
 
9.2 1.      Modelul relaţional
 
Un model relaţional de baze de date cuprinde trei componente principale:
                     structura datelor prin definirea unor domenii (valori atomice)
şi a relaţiilor “n” (atribute, tupluri, chei primare);
                     integrarea datelor prin impunerea unor restricţii;
                     prelucrarea datelor prin operaţii din algebra relaţională sau
calcul relaţional.
 
Modelul relaţional se bazează pe noţiunea matematică de relaţie (din
teoria mulţimilor) definită ca o submulţime a produsului cartezian a unei liste
finite de mulţimi numite domenii. Elementele unei relaţii se numesc tupluri (sau

482
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

n-cupluri), iar numărul de domenii din produsul cartezian se numeşte arietatea


relaţiei (FOTACHE 1997, 102).
 
De obicei relaţiile sunt reprezentate sub forma unor tabele în care fiecare
rând reprezintă un tuplu şi fiecare coloană reprezintă valorile tuplurilor dintr-
un domeniu dat al produsului cartezian.
În reprezentarea sub formă de tabel a unei relaţii, coloanelor şi
domeniilor corespunzătoare lor, li se asociază nume intitulate atribute. Mulţimea
numelor atributelor unei relaţii se numeşte schemă relaţională.
 
Deci prin relaţie se înţelege o mulţime de funcţii definite pe o mulţime de
atribute cu valori în reuniunea unor domenii, cu restricţia ca valoarea
corespunzătoare fiecărui atribut să se afle în domeniul asociat acelui atribut.
 
Se numeşte cheie candidat al unei relaţii R coloana sau mulţimea de
coloane din R pentru care valorile corespunzătoare din oricare două tupluri nu
coincid, deci identifică tuplurile prin relaţia respectivă şi nu conţin strict o
submulţime de coloane cu această proprietate. Pentru fiecare relaţie se alege un
candidat de cheie care se numeşte cheie primară a relaţiei. Tuplurile unei relaţii
nu pot să conţină valoarea nulă în coloane ce aparţin cheii primare. Eventualii
candidaţi de chei diferiţi de cheia primară se numesc chei alternante. Se numeşte
cheie străină o coloană sau o mulţime de coloane a unei relaţii R 1 ale cărei valori,
dacă nu sunt nule, coincid cu valori ale unei chei primare dintr-o relaţie R, nu
neapărat distinctă de R1.
 
Mulţimea tuturor schemelor relaţionale corespunzătoare unei aplicaţii se
numeşte schema bazei de date relaţionale, iar conţinutul curent al relaţiilor, la un
moment dat, se numeşte bază de date relaţională.
 
În modelul relaţional, entităţile sunt reprezentate sub formă de relaţii în
care schema relaţională conţine toate atributele entităţii şi fiecare tuplu al
relaţiei corespunde unui element al entităţii.
Cele mai multe cereri ale unui utilizator privesc determinarea unor
informaţii cu anumite proprietăţi, iar răspunsul posibil este o relaţie care descrie
toate elementele cu aceste proprietăţi. Modul de prezentare al răspunsului
depinde de interfaţa dintre DBMS şi utilizator.
 
Exemplu:
 
9.2 2.      Modelul reţea
 
Modelul reţea este cel mai apropiat de forma de reprezentare a bazelor de
date sub forma diagramelor entitate-relaţie. Deosebirea constă în faptul că toate
relaţiile ce apar pot fi numai binare şi de tipul 1:1 sau 1:N. Această restricţie
permite reprezentarea grafică a unei baze de date de tip reţea sub forma unui
graf direcţionat numit reţea.
Într-o reţea, nodurile corespund entităţilor şi relaţiile sunt reprezentate
prin săgeţi între noduri (de la tată la fiu) şi anume săgeţi simple dacă relaţia este
de tipul 1:1 şi săgeţi duble dacă relaţia este de tipul 1:N.
 

483
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

În modelul reţea, entităţilor le corespund fişiere logice care au drept


câmpuri atributele entităţii şi eventuale câmpuri de legătură pentru relaţii.
Fiecărui element al entităţii îi corespunde o înregistrare logică. Dacă
înregistrările sunt identificate numai prin relaţia cu alte entităţi, atunci se mai
adaugă la înregistrarea logică încă un câmp ce cuprinde un număr de ordine
care permite identificarea acestor înregistrări.
 
Operaţiile cele mai frecvente pentru modelul reţea se împart în două
categorii:
         căutarea unor elemente ale unor entităţi cu anumite proprietăţi
sau căutarea unor informaţii prin utilizarea legăturilor între entităţi;
         navigarea în reţeaua de date.
 
9.2 3.      Modelul ierarhic
 
Modelul ierarhic (arborescent) este considerat un caz particular al
modelului reţea, în care diagrama asociată este o pădure (mulţime de arbori) şi în
care toate legăturile sunt pe direcţia drumului, de la rădăcină la nodul fiu din
relaţie, toate relaţiile fiind de tipul 1:N.
La fel ca în cazul celorlalte două modele, există posibilitatea interpretării
diagramelor entitate-relaţie sub forma modelului ierarhic. Pentru evitarea
redundanţelor în modelul ierarhic, se foloseşte noţiunea de element virtual, care
înlocuieşte dublura unui element prin adresa elementului respectiv, fiecare
element apărând în baza de date reală o singură dată.
Operaţiile din bazele de date de tip ierarhic se traduc în procese de
parcurgere a arborilor. Elementele virtuale permit legarea informaţiilor din
aceeaşi entitate sau din entităţi diferite.
Implementarea la nivel logic pentru modelul ierarhic poate fi cea utilizată
pentru modelul reţea sau prin înregistrări de lungime variabilă.
Datele sunt stocate pe mediul extern în ordinea dată de parcurgerea în
preordine a arborilor, ceea ce uşurează determinarea informaţiilor pentru
cererile care se referă la descendenţii unor noduri printr-un număr mic de
accese la mediul extern.

9.3 Prezentarea conceptelor de bază ale unui sistem de


gestiune a bazelor de date
Ce este o bază de date ?
 
O bază de date conţine toate informaţiile necesare despre obiectele ce intervin într-o mulţime
de aplicaţii, relaţiile logice dintre aceste informaţii şi tehnicile de prelucrare corespunzătoare. În bazele
de date are loc o integrare a datelor, în sensul că mai multe fişiere sunt privite în ansamblu, eliminându-
se informaţiile redundante. Este permis accesul simultan la aceleaşi date, situate în acelaşi loc sau
distribuite spaţial, a mai multor persoane prin mai multe tipuri de interogări (BÂSCĂ 1997, 11; DESPI &
1999, 2).
O bază de date poate fi:
         integrată;
         partajată.
 

484
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Prin “integrată” înţelegem că baza de date poate fi gândită ca o unificare de mai multe fişiere
de date, distincte şi neredundante.
Prin “partajarea” unei baze de date se înţelege că bucăţile individuale de date
din baza de date pot fi partajate între mai mulţi utilizatori individuali, fiecare dintre ei
putând avea acces la aceeaşi bucată de date simultan (sisteme multiutilizator).
 
Hardul unui sistem de baze de date constă din volumele de memorare secundare (discuri,
dischete sau benzi magnetice) pe care rezidă baza de date, împreună cu aparatele, unităţile de control
şi canalele respective.
 
Între baza de date fizică (adică datele aşa cum sunt ele memorate pe suport) şi utilizatorii
sistemului există un nivel de software, numit sistem de gestionare a bazelor de date (DBMS – Data
Base Management System), care permite construirea unor baze de date, introducerea informaţiilor în
baza de date şi dezvoltarea de aplicaţii privind bazele de date.
Un DBMS dă posibilitatea utilizatorului să aibă acces la date folosind un limbaj de nivel înalt,
apropiat de modul obişnuit de exprimare, pentru a obţine informaţii, utilizatorul făcând abstracţie de
algoritmii aplicaţi pentru selectarea datelor implicate şi a modului de memorare a lor. DBMS-ul este deci
o interfaţă între utilizator şi sistemul de operare.
 
Orice DBMS conţine un limbaj de descriere a datelor (LDD) care permite descrierea structurii
unei baze de date, a fiecărei componente a ei, a relaţiilor dintre componente, a drepturilor de acces ale
utilizatorului la baza de date, a restricţiilor în reprezentarea informaţiilor, etc. LDD-ul este utilizat atât
pentru proiectarea bazelor de date, cât şi pentru redefinirea lor.
 
O altă componentă a DBMS este limbajul de cereri (LC) sau limbajul de prelucrare a datelor
(LPD), ce permite operaţii asupra datelor aflate în baza de date, cum ar fi:
              încărcarea bazei de date;
              inserarea unui nou element;
              ştergerea unui element;
              modificarea unui element;
              căutarea unor elemente;
              realizarea de diferite statistici asupra datelor.
 
Limbajele LDD şi LC sunt extinderi ale unor limbaje de programare numite limbaje gazdă.
Compilarea succesiunilor de comenzi pentru descrierea datelor sau pentru operarea cu date se reduce
la transformarea acestor comenzi într-o succesiune de instrucţiuni ale limbajelor gazdă care, prin
executare, să dea efectul dorit. O altă modalitate de operare este aceea a transformării comenzilor în
lansări de programe executabile.

Utilizatorii sistemelor de gestionare a bazelor de date (DBMS) se grupează în trei categorii:


a. a.       programatorii de aplicaţie (care scriu programele aplicaţie în limbaje de
programare: Cobol, C, etc.) sau în limbaje de programare specifice: dBase,
FoxPro, etc.);
b. b.      end-userii sau utilizatorii (care accesează baza de date de la un terminal,
folosind un limbaj de interogare numit “query language”);
c. c.       administratorii bazelor de date DBA (care stabilesc structura iniţială a bazei
de date şi modul de memorare a datelor la nivel fizic, acordă utilizatorilor drepturi
de acces la baza de date sau părţi ale ei, asigură securitatea datelor, modifică
structura şi întreţine baza de date).
      Datele operaţionale
 
Datele operaţionale sunt date din bazele de date, distincte de datele de intrare, ieşire
sau alte tipuri de date. O bază de date este o colecţie de date operaţionale folosite de către
aplicaţiile sistem ale unei instituţii (Muzeu, Bibliotecă, Intreprindere, etc.)
Datele de intrare sunt informaţii introduse în sistem din lumea exterioară, de obicei
prin terminale.
Datele de ieşire se referă la mesajele şi rapoartele extrase din sistem (tipărite sau
afişate pe ecran).

485
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Entităţile de bază sunt elementele constitutive ale unei baze de date (expl. materialul
arheologic, materialul bibliografic, materialul grafic, etc.). Între aceste entităţi există
întotdeauna asociaţii sau relaţii ce le leagă într-o bază de date comună.
Relaţiile dintre entităţi sunt la rândul lor părţi ale datelor operaţionale, chiar mai
importante decât entităţile asociate. O relaţie poate fi asociată la una, două sau trei entităţi, iar
o entitate poate fi asociată la oricâte relaţii.
      Independenţa datelor
 
Modul în care datele sunt organizate pe suportul secundar de stocare şi modul în care
ele sunt accesate depind de cerinţele aplicaţiei şi de ştiinţa organizării datelor şi tehnicile de
acces.
Imunitatea aplicaţiilor la modificările de structură a memorării şi a strategiei de acces
se numeşte independenţă a datelor.
Tipuri de modificări pe care administratorul bazei de date (DBA) poate să le facă:
         reprezentarea datelor numerice (câmpul numeric poate fi memorat în formă
internă aritmetică sau ca un şir de caractere);
         reprezentarea datelor caracter (un câmp şir de caractere poate fi memorat în
mai multe coduri de caractere : ASCII, EBCDIC, etc.).
 
Terminologie:
       Un câmp este cea mai mică unitate de date stocată în baza de date.
       Baza de date conţine mai multe ocurenţe sau instanţe pentru fiecare din
tipurile de câmpuri.
       O înregistrare este o colecţie de nume de câmpuri asociate.
       O ocurenţă sau instanţă de înregistrare constă dintr-un grup de ocurenţe de
câmp înrudite (asociate) şi reprezintă o asociere între ele.
       Un fişier este o colecţie a tuturor înregistrărilor de unul sau mai multe tipuri.
       Într-o bază de date, un câmp numeric poate avea două unităţi metrice (inches
şi centimetrii) la alegerea utilizatorului.
 
Structura înregistrărilor memorate
 
Într-o bază de date, două tipuri de înregistrări pot fi combinate într-unul singur.
Exemplu:
înregistrarea 1.: neolitic, Vinča, ceramică pictată, străchini (…)
înregistrarea 2.: neolitic, Petreşti, ceramică pictată, străchini (…)
structură integrată: neolitic, Vinča, Petreşti, ceramică pictată, străchini
(…)
 
Astfel se explică faptul că înregistrarea logică a unei aplicaţii poate consta dintr-o
submulţime a unei înregistrări memorate, adică anumite câmpuri memorate pot fi invizibile
pentru o aplicaţie particulară (de exemplu elementele care se repetă). La fel, un singur tip de
înregistrare memorată poate fi despicat în două, pentru a particulariza anumite aplicaţii.
 
  Structura fişierelor memorate
 
Un fişier poate fi implementat fizic în memorie în mai multe moduri:
         poate fi în întregime conţinut într-un volum de memorare (expl.: disc
magnetic);
         poate fi împărţit pe mai multe volume de tipuri diferite;
         poate fi sau nu fizic secvenţial, în concordanţă cu valorile unui anumit câmp;
         poate avea unul sau mai mulţi indecşi asociaţi;
         poate fi construit cu pointeri;
         înregistrările pot fi blocate sau nu, etc.

486
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

 
Baza de date trebuie să fie în stare să crească fără a afecta aplicaţiile existente,
aceasta fiind raţiunea majoră a independenţei datelor.
 
    Arhitectura unui sistem de baze de date
 
a. a.      nivelul exterior scheme exterioare
(vederile utilizatorilor
individuali)
 

b. b.      nivelul conceptual


(vederile comune utilizatorilor)
 
c. c.       nivelul intern
(vederile memorate)
 
O bază de date poate fi privită din mai multe puncte de vedere:
a. a.       opţiunea utilizatorului, care lucrează cu anumită părţi ale unei baze de date
numite vederi;
b. b.      opţiunea administratorului bazei de date care integrează toate vederile
referitoare la baza de date într-un singur model numit schemă conceptuală, ea
reprezentând nivelul logic al bazei de date;
c. c.       opţiunile implementatorului bazei de date (coincide uneori cu cele ale
administratorului) care priveşte baza de date ca pe o colecţie de fişiere memorate
pe diferite medii externe (benzi şi discuri magnetice), ele constituind nivelul fizic
al bazelor de date.
 
Primele două nivele sunt descrise prin planuri ce constau în enumerarea tipurilor de entităţi ce
apar în baza de date, relaţiile dintre aceste tipuri de entităţi şi modul de trecere de la noţiunile acestui
nivel la nivelul imediat următor. În mod curent, aceste planuri se numesc scheme externe, subscheme
conceptuale sau vederi, pentru primul nivel şi scheme conceptuale pentru al doilea nivel. Descrierile la
nivel fizic sunt făcute prin scheme interne sau scheme fizice.
 
Scheme externe
 
O schemă externă reprezintă conţinutul bazei de date aşa cum este ea văzută de un utilizator
particular.
Exemplu:
Pentru un utilizator poate să apară într-o vedere atributul număr străchini (= numărul
fragmentelor ceramice de tipul “N”), dar la nivel logic şi fizic acest atribut nu este indicat, din cauza
permanentei modificări a conţinutului său. În acest caz se foloseşte la nivel logic atributul ceramică (=
numărul total general de fragmente ceramice) din care se scad atributele nr. oale, nr. farfurii, nr.
chiupuri, etc. (= numărul fragmentelor ceramice “M”≠”N”) din baza de date. Astfel se permite aflarea
numărului exact al fragmentelor ceramice de tip strachină din baza de date.
 
Pentru utilizatorul obişnuit, modul de definire a vederilor este transparent, el putând să obţină
sau să modifice informaţiile dorite prin intermediul unor comenzi cu structură dată, folosind formule
predefinite pe care le completează sau poate utiliza un sistem de meniuri.
În reprezentarea intuitivă a vederilor intervin noţiunile de entitate, relaţie, atribut, cheie,
funcţionalitate, diagramă, şi altele pe care le vom definii ulterior.
Schema externă este scrisă într-un sublimbaj de definire a datelor (SLDD) dintr-un DLL numit
adesea DLL extern.
  Scheme conceptuale
 
O schemă conceptuală este o reprezentare a întregii informaţii conţinute în
baza de date ce combină subschemele vederilor ce privesc o anumită aplicaţie într-un

487
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

model unitar. Acest tip de schemă trebuie să se bazeze pe un model teoretic şi să fie
simplă, adică uşor de înţeles şi de prelucrat.
 
Sistemele de gestiune a bazelor de date au fost clasificate în trei grupe mari,
în funcţie de tipul elementelor cu care lucrează şi a structurilor obţinute:
a. a.       modelul reţea – permite lucrul cu entităţi şi relaţii binare de tipul 1:1 şi 1:N,
diagrama rezultată fiind un graf oarecare;
b. b.      modelul arborescent (ierarhic) – permite lucrul cu entităţi şi relaţii binare de
tipul 1:1 şi 1:N, iar diagrama este alcătuită dintr-o mulţime de arbori;
c. c.       modelul relaţional – în care intervin numai relaţii şi operaţii cu aceste relaţii.
 
Scheme interne
 
Schemele interne descriu diferitele fişiere utilizate pentru memorarea
informaţiilor bazei de date şi modul de operare cu ele. Există mai multe moduri de
organizare a fişierelor, cele mai cunoscute fiind:
         organizarea secvenţială;
         organizarea cu index rar;
         organizarea cu index dens;
         organizarea cu dispersie;
         organizarea folosind B-arbori.
 
Traducerea schemelor conceptuale în scheme interne se face, de obicei,
automat de către DBMS. Pe lângă stabilirea diferitelor tipuri de înregistrări utilizate
în reprezentarea fizică a datelor, se specifică şi existenţa indecşilor asociaţi unor
fişiere, semnificaţia câmpurilor înregistrărilor, ordinea de apariţie a înregistrărilor şi
modul de acces.
Corespondenţa dintre scheme poartă numele de mapare şi este de două tipuri:
         mapare conceptuală / internă (vederea conceptuală / baza de date memorată);
         mapare externă / conceptuală (vedere externă particulară / vedere
conceptuală).
 
Sistemul de gestiune a bazelor de date (DBMS) este softul (programul) care
coordonează toate accesele la baza de date, în modul următor:
a. a.       un utilizator emite o cerere de acces, folosind un limbaj particular de
manipulare a datelor;
b. b.      DBMS-ul interceptează cererea şi o interpretează;
c. c.       DBMS-ul inspectează, pe rând, schema externă, maparea
externă/conceptuală, schema conceptuală, maparea conceptuală/internă şi
definiţia de structură de memorare;
d. d.      DBMS-ul realizează operaţiile necesare asupra bazei de date memorate.
 
Administratorul bazei de date (DBA) urmează apoi să gestioneze operaţiile
specifice, responsabilităţile lui incluzând:
         decizia asupra conţinutului informaţiei inclusă în baza de date;
         decizia asupra structurii de memorare şi a structurii de acces;
         legătura cu utilizatorii;
         definirea procedurilor de verificări autorizate şi de validări;
         definirea unei strategii pentru salvări şi restaurări;
         monitorizarea performanţei şi răspunsuri la schimbări de cerinţe.
 
Pentru aceasta DBA are la îndemână un număr de programe utilitare pentru a
se ajuta în rezolvarea acestor sarcini:
         rutina de încărcare (pentru a crea versiunea iniţială a bazei de date);

488
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

         rutina de reorganizare (pentru a reorganiza baza de date prin eliminarea


datelor perimate şi introducerea altora noi);
         rutine jurnaliere (pentru a nota orice operaţie asupra bazei de date împreună
cu identificarea utilizatorului care a efectuat-o);
         rutine de restaurare (pentru a restaura baza de date la o stare anterioară unui
eşec hard sau de programare);
         rutina de analiză statistică (pentru a sista în realizarea performanţei).
 
Instrumentul utilizat de DBA în lucrul cu programele utilitare este dicţionarul
de date. El este o bază de date ce conţine date despre date, adică descrieri ale
obiectelor sistemului.
De asemenea atât DBA cât şi utilizatorul beneficiază de o interfaţă utilizator
pentru a uşura accesul la date. Această interfaţă poate fi definită ca un ecran în sistem,
sub care totul devine invizibil pentru utilizator. Interfaţa se află întotdeauna la nivelul
extern.
 
Într-un sistem de baze de date (DBMS) datele sunt memorate la locaţia la care sunt folosite
mai des, dar ele sunt disponibile (prin reţeaua de comunicaţii) şi utilizatorilor din alte locaţii. Acest tip de
bază de date, împrăştiată într-o reţea de calculatoare se numeşte bază de date distribuite.
SRUCTURA RELATIONALA A DATELOR

Prezentarea sructurii relationale a datelor impune definirea notiunilor de


domeniu , atribut , relatie si schema a unei relatii [6].
In figura 2.2.1 se prezinta un model relational ce corespunde unei multimi
concrete de caracteristici despre lumea reala .Orarul de zbor al avioanelor
poseda o sructura de date relationala .Pentru fiecare linie aeriana din orarul de
zbor sunt date caracteristicile :numarul cursei, aeroportul de decolare, aeroportul
de aterizare, ora decolarii, ora aterizarii.
Fiecare avion este determinat de multimea valorilor de fiecare linie.Trebuie sa ne
limitam numai la actele date care pot sa apara in definirea coloanei.Coloana cu
numele ,Punct de decolare(PD) contine numele aeroporturilor liniilor aeriene
considerate.Coloana Ora decolarii (OD) (respectiv, Ora aterizarii (OA))exprima
ora la care are loc decolarea (respectiv , aterizarea).Coloana cu numele Punct de
aterizare (PA) contine numele aeroportului unde se aterizeaza.
Nr Punct de Punct de Ora de Ora de
zbor(nr) decolare(Pd) aterizare(pa) decolare(Od) aterizare(oa)
70 Bucuresti Craiova 16:59 17:50
75 Craiova Bucuresti 07:25 08:25
80 Bucuresti Timisoara 17:30 19:30
85 Timisoara Bucuresti 07:15 09:25
90 Timisoara Craiova 10:15 13:20
Atributul reprezinta coloana unei tabele de date , caracterizata printr-un
nume. Numele coloanei (atributului ) exprima de obicei semnificatia valorilor
din cadrul coloanei respective .Fiecarui nume de atribut ii corespunde un
domeniu Di numit domeniu numit domeniul atributului Ai ,1in si se va nota
cu dom(Ai) .Pt a diferentia coloanele care contin valori ale aceluiasi domeniu si
a elimina astfel dependenta de pozitie in cadrul tabelei , se asociaza fiecarei
coloane un nume distinct.
Pentru tabelul din figura 2.2.1 avem atributele NR,PD,PA,OD,OA si
domeniile asociate dom(NR), dom(PD), dom (PA), dom (OD),dom (OA).
De exemplu , dom (PD) ={Bucuresti ,Craiova,Timisoara}.

489
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Fie D1 , D2 , …,Dn domenii finite , nu neaparat disjuncte.Produsul cartezian


D1xD2x…xDn al acestora este definit de multimea tuplurilor <v1 ,v2,…, vn>
unde v1єD1,v2єD2,…,vn єDn. Numarul n defineste aritatea tuplului.
Definitia 2.2.2 O relatie r pe multimile D1,D2,…,Dn este o submultime a
produsului cartezian D1x D2 x … Dn , deci o multime de tupluri.
Exista si un alt mod de a defini o relatie, si anume , ca o multime finita de
functii. Asociem fiecarui domeniu Di un atribut Ai si definim relatia r ca fiind o
multime de tupluri {t1,t2,… ,tn} , unde ti : {A1, A2, … ,An} - D1 D2 … Dn si ti
(A j) єDj pentru orice valori ale lui i si j .Intr-o relatie , tuplurile trebuie sa fie
distincte (nu se admit duplicari ale tuplurilor). De obicei ,vom nota relatia cu r
sau r{A1,A2, … , An} .
Orarul din figura 2.2.1 reprezinta un exemplu de relatie pe care o vom numi
orar.Continutul informational al liniei nu depinde de ordinea coloanelor , de
exemplu coloanele PS si PA pot fi interschimbate.
Definirea unei relatii ca o multime de tupluri sau ca o multime de functii se
refera la multimi care variaza in timp (se adauga , se sterg, sau se modifica
elemente).Pentru a caracteriza o relatie este nevoie de un element invariant in
timp , iar acest invariant este dat de structura relatiei (schema relatiei).
Definitia 2.2.3 Multimea tuturor atributelor R={A 1, A2 , … ,
An}corespunzatoare unei relatii o numim schema relatiei si o notam r(A1 , A2 , …
, A n) .
Schema relatiei orar se defineste astfel: orar (NR,PD,PA,OD,OA).
Schema unei relatii mai este cunoscuta si sub numele de intensia unei relatii ,
ca expresie a proprietetilor comune si invariante ale tuplurilor care compun
relatia .Spre deosebire de intensie , extensia unei relatii reprezinta multimea
tuplurilor care compun la un moment relatia , multime care este variabila in
timp . De obicei , extensia unei relatii este stocata fizic in spatiul asociat bazei
de date , caz in care relatia se numeste relatie de baza .Exista situatii in care
extensia nu este memorata in baza de date . Este cazul asa numitelor relatii
virtuale , cunoscute si sub numele de relatii derivate sau viziuni. Acestea sunt
definite implicit , pe baza altor relatii , prin intrmediul unei expresii relationale
iar stabilirea tuplurilor care o compun se face prin evaluarea expresiei.
Asadar , putem reprezenta o relatie printr-un tabel bidimensional in care
fiecare linie corespunde unui tuplu si fiecare coloana corespunde unui
domenui din produsul cartezian. Numarul atributelor defineste gradul relatiei ,
iar numarul de tupluri cardinalitatea relatiei .
Fiecare linie a relatiei este o multime de valori , cate una pentru fiecare
nume de atribut .Linia relatiei se numeste tuplu. In figura 2.2.1 relatia orar este
formata din 5 tupluri . Unul dintre acestea , notat cu t , este definit astfel:
t(NR)=75 , t(PD) = Craiova , t(PA)=Bucuresti,t(OD)=7.25, t(OA)=8.25
Valoarea concreta a tuplului t pentru atributul A o numim Avaloarea
tuplului t , iar daca t este considerata ca functie , atunci Avaloarea tuplului o
vom nota cu t(a). Pentru X R, restrictia tuplului t la X o notam cu t/X sau t(X)
si o vom numi Xvaloarea tuplului t .
Pentru relatia orar , consideram un tuplu t oarecare , de exemplu primul
tuplu din relatie . {PD , PA} – valoarea tuplului t este tuplul t’ pentru care
t’(PD)=Bucuresti, t’(PA)= Craiova.

1.2.1 FORME NORMALE IN BAZE DE DATE


In lucrul cu baze se manifesta o serie de anomalii datorita dependentelor
“nedorite” ce se manifesta intre datele din cadrul relatiilor bazei.Aceste
dependente determina cresterea redundantei datelor si reducerea flexibilitatii
structurii bazei de date .Formele normale ale relatiilor sunt definite in raport de

490
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

anomaliile care pot apare in lucrul cu aceste relatii , deci in functie de anumite
dependente “nedorite”.
O relatie este intr-o anumita forma normala particulara daca satisface o
multime specificata de restrictii . Pana in prezent se cunosc cinci forme normale
ale relatiilor dintr-o baza de date.
Fie r[A1,…,An]o relatie si X={Ai1 ,…,Aip}{A1,…,Am} o multime de atribute .
Reamintim ca ,prin proiectia relatiei r pe X se intelege r’[A i1,…,Aip]=Ai1,
…,Ain(r)unde pt p=(a1,a2,…,an) r , avem x p=p[X]=(ai1 ,ai2 ,…,aip) r’ (si toate
elementele din r’ sunt distincte).
Fie relatiile r(X,Y), s(X,Z) si X,Y,Z multimi de atribute , XZφ.Prin join-
ul natural al relatiilor r si s se intelege :
r⊲⊳s={(x(t),y(t),z(v)) t  r, v  s,y(t)=y(v)}
O relatie r se poate descompune in mai multe relatii noi : r 1 ,r2 ,
…,rm.Aceasta descompunere este corecta , daca : r= r 1⊲⊳r2 ⊲⊳…⊲⊳rm.
Vom da un exemplu de descompunere care nu este corecta .Fie relatiile :
r[NUME,VARSTA,SALARIU,LOCALITATE]
r1[NUME,SALARIU]
r2[VARSTA,SALARIU,LOCALITATE].
si presupunem ca pt r avem urmatoarea extensie:
NUME VARSTA SALARIU LOCALITATE

Ionescu 30 800000 Arad


Popescu 40 1200000 Oradea
Georgescu 60 1500000 Iasi
Calinescu 25 1200000 Arad

In acest caz se obtine:


r 1

NUME SALARIU

Ionescu 800000
Popescu 1200000
Georgescu 1500000
Calinescu 1200000

r 2
VARSTA SALARIU LOCALITATE
30 800000 Arad
40 1200000 Oradea
60 1500000 Iasi
25 1200000 Arad

491
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

r1 ⊲⊳r2
NUME VARSTA SALARIU LOCALITATEA
Ionescu 30 800000 Arad
Popescu 40 1200000 Oradea
Popescu 40 1200000 Arad
Avram 60 1500000 Iasi
Calinescu 25 1200000 Arad
Calinescu 25 1200000 Oradea

Este posibil , ca in diverse aplicatii sa apara atribute (simple sau compuse),


ce au mai multe valori pt un element din relatie.Aceste atribute formeaza un
atribut repetitiv .Prin atribut simplu vom intelege un singur atribut din relate,
iar prin atribut compus o multime de atribute (cel putin doua).
Consideram , de exemplu relatia :
persoana[NUME,AN-NASTERE,PROFESIA,NUME-COPIL,AN-NASTERE-
COPIL] cu atributul NUME cheie primara.Perechea {NUME-COPLI,AN-
NASTERE-COPIL}este un grup repetitiv , deoarece relatia poate avea
urmatoarea extensie:
Popa 1970 inginer Daniel 1992
Anca 1994
Viorel 1998
Ionescu 1966 economist Andrei 1989
Magda 1993
De asemenea, relatia:
carte [COTA,AUTOR,TITLU,EDITURA,AN-APARITIE,CUVINTE-
CHIE]cu atributul cheie COTA cheie primara , are atributele respective
AUTOR si CUVINTE-CHEIE.Ocarte poate avea mai multi autori si mai multe
cuvinte cheie.
Grupele de atribute repetitive creeaza greutati in memorarea diverselor
relatii si de aceea se incearca emiterea lor,fara apierde insa din informatii.Daca
r[A1, …,An]este o relatie , unde A m+1 ,…,An formeaza un grup repetitiv , atunci
relatia r se poate descompune in doua relatii fara atribute repetitive .Daca A 1`,
…,Ap, p<m , este o cheie pt relatia r atunci cele doua relatii in care se
descompune r sunt:
r′[A1,A2,…,Am]=A1,…,Ap,Am+1,..,An(r)
r″[A1,A2,…,Ap,Am+1,…,An]=A1,…,Ap,Am+1,…,An (r)

Astfel , relatiile persoana si carte se descompun in doua , respectiv trei relatii:


parinte[NUME,AN-NASTERE,PROFESIA]
copil[NUME,NUMECOPIL,AN-NASTERE-COPIL]
autori[COTA,AUTOR]
carti[COTA,TITLU,EDITURA,AN-APARITIE]
cuvinte[COTA,CUVANT-CHEIE]
Definitia2.2.8 [3] O relatie este in prima forma normala (FN1)daca nu
contine grupuri (de atribute ) repetitive .

492
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Urmatoarele forma normale utilizeaza notiunea de dependenta functionala


intre submultimi de artibute .Stabilirea dependentelor functionale este sarcina
administratorului bazei si depinde de semnificatia datelor care se memeoreaza in
relatie . Operatiile de actualizare a datelor (adaugare,modificare,stergere) nu
trebuie sa modifice dependentele functionale existente.
Definitia 2.2.9 Fie r[A1,…,An] o relatie si X, Y {A1,…,An}.Atributul Y este
complet dependent functional de X , daca Y este dependent functional de
X(XY)si nu este dependent functional de nici o submultime de atribute din X
(pt aceasta dependenta functionala trebiue ca X sa fie atribut compus).
Fie r [A1,…,An] orelatie si CA={A1,…,An} o cheie .Presupunem ca exista
YA, YC=(Y nu este chie ), Y dependent functional de XC (Y este complet
dependent functional de o submultime stricta de atribute cheie).Dependenta
XY se poate elimina daca relatia r se descompune in urmatoarele doua relatii:
r=[XY]=xy(r)
r=[AY ]=AY(r)
Definitia2.2.10 [3] O relatie este in a doua forma normala (FN2) daca este de
prima forma normala si orice atribut (simplu sau compus) este complet
dependent de cheie sau este inclus in cheie.
Exemplul 2.2.6 Se considera urmatoarea relatie (cu rezultatele la examene):
examen [NUME-STUDENT,DISCIPLINA,NOTA,PROFESOR]
in care cheia este {NUME-STUDENT,DISCIPLINA}si unei discipline ii
corespunde un singur cadru didactic , iar uni cadru didactic pot sa-i corespunda
mai multe discipline , deci avem dependenta functionala
DISCIPLINAPROFESOR.
De aici deducem ca atributul PROFESOR nu este complet dependent
functional de cheie.Atunci , relatia examen se poate descompune in urmatoarele
doua relatii:
apreciere [NUME-STUDENT,DISCIPLINA,NOTA] si
stat-functii[DISCIPLINA,PROFESOR]
Daca depndenta functionala DISCIPLINAPROFESOR nu este
respectata , atunci poate apare o inconsistenta .Fie doua elemente din relatie:

T …DISCIPLINA … PROFESOR
……………………………………
t1 …ANALIZA … POPA
t2 …ANALIZA … POPA
……………………………………..

Daca in t1 vsloarea atributului PROFESOR se schimba, dar in t 2 nu se face


schimbarea, atunci dependenta functionala nu este respectata si apare o
inconsistenta (la aceeasi disciplina apar cadre didactice diferite).
Definitia 2.2.11 Un atribut Z este tranzitiv dependent de atributul X daca
exista Y astfel incat XY,YZ, iar YX nu are loc si Z nu e inclus in XY.
Daca C este o cheie si Y un atribut tranzitiv dependent de cheie , atunci
exista un X care verifica CX si XY .Deoarece relatia este in forma normala
FN2 , obtinem ca Y este complet dependent de C, deci XC = si exista o
dependenta XY , iar X nu este cheie.

493
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Daca r[A1,…,An]are cheia C si exista atributul Y{A1,…,An} ,tranzitiv


dependent de C si care nu este cheie (adica YC=), atunci relatia r se poate
descompune in urmatoarele relatii (se elimina dependenta functionala XY):
r[XY]=XY(r)
r=[AY ]=AY(r)

494
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Definitia 2.2.12 [3] Orelatie este in a treia forma normala (FN3) daca si
numai daca relatia r este in a doua forma normala si fiecare atribut care nu este
cheie (nu participa la o cheie) nu este tranzitiv dependent de nici o cheie a lui r.
Exemplul 2.2.7 Se considera urmatoarea relatie (cu rezultatele obtinute de
absolventi la lucrarea de diploma):
diploma[NUME-ABSOLVENT,NOTA,CADRU-DID –INDR,CATEDRA]
cu cheia NUME-ABSOLVENT.
Se obseva ca avem urmatoarele dependente functionale:
CADRU-DID-INDRCATEDRA
NUME-ABSOLVENTCADRU-DID-INDR
Relatia initiala se poate , atunci descompunerea in urmatoarele doua relatii :
rezultate[NUME-ABSOLVENT,NOTA,CADRU-DID-INDR]
indrumatori[CADRU-DID-INDR,CATEDRA].
Dupa definitia ormei normale FN3 data de E.F/Codd[16] , ulterior , au mai
aparut o serie de noi definitii:
 O relatie r este in a treia forma normala Boyce-Codd(FNBC) daca orice
determinant este cheie (principala sau seundara).
 O relatie este in a treia forma normala C.J.Date (FN3 Date) [4] daca orice
atribut care nu este cheie, nu este tranzitiv dependent de cheia principala.
Exemplul 2.2.8 Transportul local pe timp de o saptamana dintr-un oras este
specificat de relatia:
transport [ZI,NR-TRASEU,NR-MASINA,COND-AUTO]
unde COND-AUTO este numele conducatorului auto (el conduce o singura
masina , dar pe acea masina o poate conduce si un alt conducator).Avem cheia :
{ZI,NR-TRASEU, NR-MASINA} si dependenta COND-AUTONR-MASINA.
Relatia definita este in FN3 Date (NR-MASINA)apare in cheie , dar nu este
in FNBC si se poate descompune in urmatoarele doua relatii :
traseu [ZI,NR-TRASEU,NR-MASINA]
soferi[NR-MASINA,COND-AUTO]
Definitia 2.2.13 Fie relatia r [A1, A2,…,An]si doua multimi de atribute
X,Y{A1,…,An} .Spunem ca Y este multiplu dependent funcional de X(XY)
daca si numai daca pt orice t 1, t2  r pt care x(t1)=x (t2) exista t1 si t2  r astfel
incat :
x(t1)=x(t2)=x(t3)=x(t4)
y(t1)=y(t2)=y(t3)=y(t4)
A-X-Y(t1)=y(t2)=A-X-Y(t3)=A-x-Y(t4)
Dependenta XY se numeste dependenta functionala multipla sau
dependenta multivaloare si se poate reprezenta astfel:

X Y A-X-Y
t1 v u1 w1
t2 v u2 w2
t3 v u1 w2
t4 v u2 w1

Daca A=XY sau YX, atunci dependenta XY se numeste tricviala.

495
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Definitia 2.2.14 [3] O relatie r este in a patra forma normala (FN4) daca pt
dependentele funcionale multiple , avem XY este dependenta triviala sau X
este cheie pt r.
Aceasta definitie difera de definitia formei FNBC doar prin folosirea
dependentelor functionale multiple in locul celor simple.

496
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Exemplul 2.2.9 Consideram relatia carte in care se observa ca avem


urmatoarele dependente functionale:
COTAAUTOR ;COTA CUVANT-CHEIE.
COTA{TITLU,EDITURA,AN-APARITIE}
carte
AUTOR COTA TITLU EDITURA AN- CUVINTE-
APARITIE CHEIE
Popescu I. 1 Mara ALL 1990 Rom
Slavici I. 1 Mara ALL 1990 Rom
Popescu I. 1 Mara ALL 1990 Roman
Slavici I. 1 Mara ALL 1990 Roman
Tudor P. 2 Baze de Teora 1993 Bdate
Ioan S. 2 date Teora 1993 Bdate
Vigu T. 2 Baze de Teora 1993 Bdate
Tudor P. 2 date Teora 1993 Rom
Ioan S. 2 Baze de Teora 1993 Rom
Vigu T. 2 date Teora 1993 Rom
Baze de
date
Baze de
date
Baze de
date

Pt a forma FN4 , vom descompune relatia in urmatoarele relatii:


COTA TITLU EDITURA AN-APARITIE
1 Mara ALL 1990
2 Baze de date Teora 1993

COTA AUTOR
1 Popescu I.
1 Slavici I.
2 Tudor P.
2 Ioan S.
2 Vigu T.

COTA CUVANT-
CHEIE
1 Rom
1 Roman
2 Bdate
2 Rom

Definitia 2.2.15 Fie relatia r [A1, A2, …, An]si r1[x1],…,rm[xm] o


descompunere a relatiei r . Relatia r satisface defpendenta join notata *(r 1,…,rm)
, daca r = r1 ⊲ ⊳ r2 ⊲ ⊳ … ⊲⊳rm .Daca una din relatiile ri este egala cu r ,
atunci aceasta dependenta este triviala.
Sa consideram o relatie r si o dependenta join*(r 1,r2) , unde r1[X],r2[Y] sunt
relatii . Cu aceste presupuneri , avem : r = r1⊲⊳r2 .

497
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Fie t1, t2  r si valotile lor date prin urmatorul tabel:


X-Y XY Y-X
x(t1) u1 V ….
x(t2) u 2 V ….
……………………………………………….
…… V w1
y(t1)
…… V w2
y(t2)

Daca se calculeaza r1⊲⊳r2 , care este egala cu r , rezulta faptul ca mai avem
doua elemente t3 si t4 din r cu valorile urmatoare:
X-Y XY Y-X
t1 u1 v w1
t2 u2 v w2
…………………………………………………
t3 u1 v w1
t4 u2 v w2

De aici , se deduce ca XYX sau XY Y , deci dependenta


join*(r1,..,rm) este echivalenta cu dependenta functionala multipla.
Definitia 2.2.16 [5] O relatie este in forma normala cinci (FN 5) cu
respectarea unei multimi D de dependente functionale multiple sau join , daca
fiecare dependenta *(r1 ,…,rm) este fie triviala , fie Xi este cheie (avem ri[Xi])pt
r , pt toate valorile lui i.
Cu alte cuvinte , o relatie r este in FN5 daca orice dependenta join definita
pe r este implicata de cheile candidat ale lui r.
Exemplul 2.2.10 Fie relatia cursa [CP#,CA#,PD,PA], unde CP-codul pilotului
, CA-codul avionului, PD si PA punctul de decolare , respectiv aterizare.
In aceasta relatie , care este in FN4 , nu exista dependente functionale
multiple, dar exista o redundanta logica , care va ridica probleme la actualizare.
cursa

CP# CA# PA PD
11 100 Sibiu Iasi
10 100 Iasi Sibiu
10 100 Sibiu Iasi
10 101 Sibiu Iasi

Descompunem relatia cursa prin proiectie in :


r1 (CP#,CA#)
r2 (CP#,PD,PA)
r3 (CP#,PD,PA)
Se observa ca, cursa r1⊲⊳r2; cursa r2⊲⊳r3; cursa r1⊲⊳r3, dar cursa
=r1⊲⊳r2⊲⊳r3 .
In relatia r1⊲⊳r2 a aparut un tuplu (10,101,Iasi,Sibiu)care nu exista in
cursa .Daca ar fi existat , ar fi avut loc multidependenta CPCA si astfel
descompunerea reversibila a relatie cursa r1 si r2.
r 1

498
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

CP# CA#
11 100
10 100
10 101

r2
CP# PD PA
11 Sibiu Iasi
10 Iasi Sibiu
10 Sibiu Iasi

r3
CA# PD PA
100 Sibiu Iasi
100 Iasi Sibiu
101 Sibiu Iasi

r1⊲⊳r2
CP# CA# PD PA
11 100 Sibiu Iasi
10 100 Iasi Sibiu
10 100 Sibiu Iasi
10 101 Iasi Sibiu
10 101 Sibiu Iasi

1.2.2. TEHNICA NORMALIZARII RELATIILOR


Proiectarea schemei conceptuale a unei baze de date presupune parcurgerea
urmatoarelor etepe:
1. Determinarea formei normale in care trbuie sa se afle relatiile din baza de
date .In majoritatea cazurilor bazele de date reltionale sunt constituite din
relatii aflate in FN1 sau FN2 .Acest lucru se explica prin faprull ca formele
normale superioare , desi reduc dificultatea de realizare a operatiilor de
actualizare , reduc in acelasi timp si performantele operatiilor de regasire a
datelor.Relatiile aflate in forme normale superioare contin un nr mic de
atribute si acest lucru favorizeaza opertiile de actualizare a datelor , dar
ingreuneaza procesul de regasire a lor , deoarece satisfacerea cererilor de
date impune interogarea simultana a mai multor relatii, deci efectuarea unor
operatii de join , care sunt costisitoare in termenii resurselor de calcul
solocitate.
2. Stabilirea relatiilor care sa faca din BD,in forma normala precizata la etapa
anteriora . Presupune definirea schemei relatiilor si a restrictiilor de
integrare .Modul prin care se stabileste multimea de relatii din baza de date ,
se numeste tehnica relatiilor.
3. Descrierea schemei conceptuale in limbajul de descriere a datelor utilizat de
SGBD-ul relational ce se utilizeaza.
In obtinerea unei baze de date performanta , un rol important il are tehnica
normalizarii relatiilor .Aceasta tehnica permite obtinerea schemei conceptuale
printr-un proces de ameliorare progresiva a unei scheme concepute initial,prin

499
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

utilizarea formelor normale.Dupa fiecare etapa de ameliorare , relatiile din baza


ating un anumit grad de perfectiune , prin eliminarea unui anumit tip de
dependente nedorite (dependente functionale partiale,tranzitive,multivaloare),
deci se afla intr-o anumita forma normala.
Procesul de ameliorare , trebuie sa satisfaca urmatoarele cerinte:
 sa garanteze conservarea datelor , adica in schema conceptuala finala
trebuie sa figureze toate datele din schema initiala;
 sa garanteze conservarea dependentelor dintre date, adica in schema
finala fiecare dependenta trebuie sa aiba determinantul si determinatul in
schema aceleiasi relatii;
 sa reprezinte o descompunere minimala a relatiilor initiale.Nici una din
relatiile care compun schema finala nu trebuie sa fie continuta intr-o alta
relatie din aceasta schema .
Necesitatea normalizarii este ilustrata in exemplul urmator.
Fie schema relationala avion(NR,TIP,CAPACITATE,LOCALITATE), cu
cheia primara numarul avionului (NR).
avion
NR TIP CAPACITATE LOCALITATE
100 IAR500 90 Brasov
101 IAR500 90 Arad
102 ROMBA 100 Bucuresti
103 C 200 Timisoara
TU154
Presupunem ca in cadrul companiei , exista restrictia : “toate avioanele de
acelasi tip au aceeasi capacitate” care este de fapt o dependenta functionala de
forma TIPCAPACITATE .
Datorita acestei dependente , pot exista redundante in date sau pot sa apara
anomalii la reactualizare.Astfel , in relatia de mai sus , avem o redundanta logica
(perechea <IAR 500 ,90>apare de mai multe ori)precum si anomalii l
areactualizare : daca dorim sa stergem avionul cu nr 102 , vom pierde informatia
care ne arata ca un avion ROMBAC are capacitatea 100.
De asemenea , daca dorim sa modificam capacitatea avionului IAR 500 , de la
90 la 190 de locuri putem intalni urmatoarele anomalii: modificand un singur
tuplu,relatia devine incoerenta (restrictia nu mai este verificata), iar daca
modificam toate tuplurile cu IAR 500 , costul modificarii creste semnificativ.
Prezentam in continuare procedeul de ameliorare a schemei conceptuale
initiale , care consta in aducerea acesteia la diferite forme normale([4]).
Aducerea relatiilor la FN1
Presupune eliminarea atributelor compuse si a celor repetitive.Aducerea unei
relatii in FN1 se realizeaza atfel:
1.Se trec in relatie , in locul atributelor compuse componentele acestora , ca
atribute simple.

Aducerea relatiilor in FN2

Presupune eliminarea dependentelor functionale partiale din relatiile aflate in


FN1.Procesul de aducere a unei relatii din FN1 in FN2 se desfasoara astfel
1.Pentru fiecare dependenta functionala partiala se creaza o noua relatie,cu

500
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

schema constituita din determinantul si determinantul acestei dependente.


2.Daca in relatia initiala exista mai multe dependente functionale partiale cu
acelasi determinant,pentru toate acestea se creaza o singura relatie cu sche
ma constituita din determinantul,luat o singura data si din determinantii
depoendentelor considerate.
3.Se determina cheia primara a fiecarei noi relatii creata in pasul1.Aceasta va
fi formata din atributul/atributele din determinantul dependentei functiona-
le partiale,care a stat la baza constituirii relatiei.
4.Se analizeaza relatiile rezultate la pasul 1.Daca aceste relatii contin depen-
dente functionale partiale se reia procesul de aducere in FN2,astfel procesu
s-a terminat.
Aducerea relatiilor in FN3
Presupune aducera unei relatii in FN2 in FN3 prin aliminarea dependente-
lor tranzitive.
1.Pentru fiecare dependenta functionala tranzitiva se transfera atributele implicate in
dependenta tranzitiva intr-o noua relatie.
2.Se determina cheia primara a fiecarei noi relatii creata la pasul 1.
3.Se introduc in relatia initiala in locul atributelor transferate,cheile primare determinate
la pasul2.
4.Se reanalizeaza relatia initiala .Daca in cadrul ei exista noi dependente
tranzitive,atunci se face transfer la pasul1,altfel procesul de aducere la FN3
s-a terminat.
A treia forma normala poate fi obtinuta si cu ajutorul unei scheme sinteza
([8],[9]).Algoritmul de sinteza construieste o acoperire minimala F+ a depen-
dentelor functionale totale.Se elimina atributele si dependentele functionale
redundante.Multimea F este partitionata in grupuri Fi,astfel incat in fiecare
grupa Fisunt dependente functionale care au acelasi membru stang si nu esxis
ta doua grupuri cu acelasi membru stang.Fiecare grup Fi produce o schema
FN3.Algoritmul realizeaza o descompunere ce conserva dependentele.
Vom ilustra algoritmul pe un exemplu.Fie A1.A2,…,Am o multime de atribute
Si fie E o multime de dependente functionale f1,f2,fn de forma fi:xi->yj,unde
Xi=Ai1,Ai2,Aik si Yj=Aj1,Aj2,…,Aj

9.4 Operaţii specifice prelucrării bazelor de date (creare,


adăugare, modificare, ştergere,
sortare, căutare, vizualizare, interogare)
1.1 MODELUL RELATIONAL AL DATELOR

Modelul relational al datelor a fost acceptat aproape fara rezerve de atat


specialistii din domeniu bazelor de date cat si de utilizatori ,inca de la aparitia
primului articol al lui Codd E. F. [1] , prin care erau puse bazele acestui model
asamblist al datelor a fost lansata de catre Childs D.F. in 1968 ,care a subliniat
faptul ca orice structura de date poate fi reprezentata printr-una sau mai multe
tabele de date , in cadrul carora este necesar sa existe informatii de legatura , in
vederea stabilirii unor legaturi intre acestea.
S-a constatat ca, prin utilizarea sistemelor relationale este posibila atingerea
unor obiective importante ale organizarii datelor in comparatie cu modelele

501
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

ierarhice si retea [2]:


1. Asigurare unui grad sporit de independenta a programelor de aplicatie fata de
modul de reprezentare interna a datelor si metodele de acces la date.In
precizarea prelucrarilor asupra datelor ,programele nu fac apel la pointeri sau
alte elemente ale schemei interne a bazei de date .
2. Furnizarea unor metode si tehnici eficiente de control a coerentei si redundantei
datelor .Modelul relational ,prin tehnica normalizarii relatiilor permite definirea
unei structuri conceptuale optime a datelor , prin care se minimizeaza riscurile
de eroare la actualizare, reducandu-se redundanta datelor.
3. Oferirea unor facilitati multiple de definire si manipulare a datelor.In primul
rand modelul relational ofera posibilitatea utilizarii unor limbaje
procedurale ,bazate pe algebra relationala ,precum si a unor limbaje
neprocedurale ce au la baza calculul relational.
4. Ameliorarea integritatii si confidentialitatii datelor.Modelul relational
realizeaza acest lucru prin mecanisme flexibile si eficace de specificare si
utilizare a restrictiilor de integritate si a relatiilor virtuale.
Componentele modelului relational sunt: structura relationala a datelor, prin
care datele sunt organizate sub forma unor tablouri bidimensionale (tabele ) de
date , numite relatii, operatorii modelului relational , ce definesc operatiile care se
pot efectua asupra relatiilor ,in scopul realizarii functiilor de prelucrare asupra
bazei de date ,respectiv consultarea ,inserarea,modificarea si stergerea
datelor ,precum si restrictiilede integritate care permit definirea starilor coerente
ale bazei de date.
1.1.1 SRUCTURA RELATIONALA A DATELOR

Prezentarea sructurii relationale a datelor impune definirea notiunilor de


domeniu , atribut , relatie si schema a unei relatii [6].
In figura 2.2.1 se prezinta un model relational ce corespunde unei multimi
concrete de caracteristici despre lumea reala .Orarul de zbor al avioanelor
poseda o sructura de date relationala .Pentru fiecare linie aeriana din orarul de
zbor sunt date caracteristicile :numarul cursei, aeroportul de decolare, aeroportul
de aterizare, ora decolarii, ora aterizarii.
Fiecare avion este determinat de multimea valorilor de fiecare linie.Trebuie sa ne
limitam numai la actele date care pot sa apara in definirea coloanei.Coloana cu
numele ,Punct de decolare(PD) contine numele aeroporturilor liniilor aeriene
considerate.Coloana Ora decolarii (OD) (respectiv, Ora aterizarii (OA))exprima
ora la care are loc decolarea (respectiv , aterizarea).Coloana cu numele Punct de
aterizare (PA) contine numele aeroportului unde se aterizeaza.
Nr Punct de Punct de Ora de Ora de
zbor(nr) decolare(Pd) aterizare(pa) decolare(Od) aterizare(oa)
70 Bucuresti Craiova 16:59 17:50
75 Craiova Bucuresti 07:25 08:25
80 Bucuresti Timisoara 17:30 19:30
85 Timisoara Bucuresti 07:15 09:25
90 Timisoara Craiova 10:15 13:20
Definitia 2.2.1 Domeniul reprezinta o multime de valori ,caracterizat printr-un nume
si este definit fie explicit prin enumerarea tuturor componentelor sale,fie printr-o
proprietate distinctiva a valorilor din domeniul respectiv.
Penrtu tabelul din figura 2.2.1 se pot da urmatoarele exemple:

502
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

D1={Bucuresti,Craiova,Timisoara}
D2={x / xєN , xє[1,100]}
Atributul reprezinta coloana unei tabele de date , caracterizata printr-un
nume. Numele coloanei (atributului ) exprima de obicei semnificatia valorilor
din cadrul coloanei respective .Fiecarui nume de atribut ii corespunde un
domeniu Di numit domeniu numit domeniul atributului Ai ,1in si se va nota
cu dom(Ai) .Pt a diferentia coloanele care contin valori ale aceluiasi domeniu si
a elimina astfel dependenta de pozitie in cadrul tabelei , se asociaza fiecarei
coloane un nume distinct.
Pentru tabelul din figura 2.2.1 avem atributele NR,PD,PA,OD,OA si
domeniile asociate dom(NR), dom(PD), dom (PA), dom (OD),dom (OA).
De exemplu , dom (PD) ={Bucuresti ,Craiova,Timisoara}.
Fie D1 , D2 , …,Dn domenii finite , nu neaparat disjuncte.Produsul cartezian
D1xD2x…xDn al acestora este definit de multimea tuplurilor <v1 ,v2,…, vn>
unde v1єD1,v2єD2,…,vn єDn. Numarul n defineste aritatea tuplului.
Definitia 2.2.2 O relatie r pe multimile D1,D2,…,Dn este o submultime a
produsului cartezian D1x D2 x … Dn , deci o multime de tupluri.
Exista si un alt mod de a defini o relatie, si anume , ca o multime finita de
functii. Asociem fiecarui domeniu Di un atribut Ai si definim relatia r ca fiind o
multime de tupluri {t1,t2,… ,tn} , unde ti : {A1, A2, … ,An} - D1 D2 … Dn si ti
(A j) єDj pentru orice valori ale lui i si j .Intr-o relatie , tuplurile trebuie sa fie
distincte (nu se admit duplicari ale tuplurilor). De obicei ,vom nota relatia cu r
sau r{A1,A2, … , An} .
Orarul din figura 2.2.1 reprezinta un exemplu de relatie pe care o vom numi
orar.Continutul informational al liniei nu depinde de ordinea coloanelor , de
exemplu coloanele PS si PA pot fi interschimbate.
Definirea unei relatii ca o multime de tupluri sau ca o multime de functii se
refera la multimi care variaza in timp (se adauga , se sterg, sau se modifica
elemente).Pentru a caracteriza o relatie este nevoie de un element invariant in
timp , iar acest invariant este dat de structura relatiei (schema relatiei).
Definitia 2.2.3 Multimea tuturor atributelor R={A 1, A2 , … ,
An}corespunzatoare unei relatii o numim schema relatiei si o notam r(A1 , A2 , …
, A n) .
Schema relatiei orar se defineste astfel: orar (NR,PD,PA,OD,OA).
Schema unei relatii mai este cunoscuta si sub numele de intensia unei relatii ,
ca expresie a proprietetilor comune si invariante ale tuplurilor care compun
relatia .Spre deosebire de intensie , extensia unei relatii reprezinta multimea
tuplurilor care compun la un moment relatia , multime care este variabila in
timp . De obicei , extensia unei relatii este stocata fizic in spatiul asociat bazei
de date , caz in care relatia se numeste relatie de baza .Exista situatii in care
extensia nu este memorata in baza de date . Este cazul asa numitelor relatii
virtuale , cunoscute si sub numele de relatii derivate sau viziuni. Acestea sunt
definite implicit , pe baza altor relatii , prin intrmediul unei expresii relationale
iar stabilirea tuplurilor care o compun se face prin evaluarea expresiei.
Asadar , putem reprezenta o relatie printr-un tabel bidimensional in care
fiecare linie corespunde unui tuplu si fiecare coloana corespunde unui
domenui din produsul cartezian. Numarul atributelor defineste gradul relatiei ,
iar numarul de tupluri cardinalitatea relatiei .
Fiecare linie a relatiei este o multime de valori , cate una pentru fiecare
nume de atribut .Linia relatiei se numeste tuplu. In figura 2.2.1 relatia orar este
formata din 5 tupluri . Unul dintre acestea , notat cu t , este definit astfel:
t(NR)=75 , t(PD) = Craiova , t(PA)=Bucuresti,t(OD)=7.25, t(OA)=8.25
Valoarea concreta a tuplului t pentru atributul A o numim Avaloarea
tuplului t , iar daca t este considerata ca functie , atunci Avaloarea tuplului o

503
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

vom nota cu t(a). Pentru X R, restrictia tuplului t la X o notam cu t/X sau t(X)
si o vom numi Xvaloarea tuplului t .
Pentru relatia orar , consideram un tuplu t oarecare , de exemplu primul
tuplu din relatie . {PD , PA} – valoarea tuplului t este tuplul t’ pentru care
t’(PD)=Bucuresti, t’(PA)= Craiova.
Asupra tuplurilor unei relarii se pot efectua urmatoarele operatii:
2. Adaugarea. Permite adaugarea de noi tupluri la o relatie .
Astfel , pentru relatia r{A1 , A2 , … , An} operatia are forma :
ADD(r: A1= d1 , A2 = d2 , … ,An = dn)
De exemplu , adaugarea unui tuplu la relatia orar se face astfel:
ADD(orar : NR =99, PD =Oradea , PA = Bucuresti , OD = 20 , OA =
22)
Cand ordinea atributelor este fixata aceasta poate fi scrisa sub forma :
ADD(orar : 99, Oradea , Bucuresti, 20 , 22)
Scopul operatiei de adaugare este de a adauga un tuplu la o anumita
relatie r ,dar rezultatul adaugarii nu este conform cu scopul acesteia in
urmatoarele cazuri:
- tuplul de adaugat nu corespunde schemei relatiei;
- anumite valori ale tuplului nu apartin domenuilui respectiv ;
- tuplul de adaugat coincide dupa cheie (vezi 2.2.1.3) cu tuplul din relatie .
De exemplu , adaugarea in relatia orar , a tuplului :
ADD (orar: NR :90 , PD :Iasi , PA : Sibiu , PD :16 , PA :12)
nu e permisa , deoarece nu respecta prima conditie .
2. Stergerea. Aceasta operatie se introduce pentru a elimina tupluri din relatie .
Pentru o relatie r , operatia are forma :
DEL(r :A1 =d1 , A2 =d2 , … , An =dn)
Atunci cand numele atributelor sunt ordonate , se pot scrie mai simplu :
DEL( r : d1 , d2 , … , dn)
De exemplu , pentru relatia orar , stergerea primului tuplu , se realizeaza
astfel:
DEL(orar : 70 , Bucuresti , Craiova , 16:59 , 17:50)
Deoarece , intr-o relatie , tuplurile sunt identifcate unic prin valoarea unei
chei (vezi 2.2.1.3) , este suficient pentru a realiza stergerea , sa definim numai
valoarea cheii .
Daca K= {B1 , B2 , … , Bn} este o cheie , atunci se poate utiliza urmatoarea
forma directa:
DEL ( r : B1 = c1 , B2 =c2 , … , Bn = cn )
De exemplu , varianta scurta a operatiei de strgere din relatia orar este :
DEL (orar : 70)
Daca tuplul ce doreste a fi sters , nu exista in relatia r atunci se genereaza o
eroare .
3.Modificarea . Se refera la faptul ca anumite valori dintr-un tuplu se pot
modifica .
Pentru o relatie oarecare r si pentru submultimea {c1 , c2 , … , cp} {A1 , A2 ,
… , An} , operatia de modificare are forma:
CH (r : A1 =d1 , A2 =d2 , … , An =dn ; C1 = c1 , … , Cp = cp)
Daca K ={B1 , … , Bn } este o cheie , atunci operatia de modificare se poate
scrie :
CH( r : B1 = d1 ,…, Bm = dm ; C1 = c1 ,…, Cp = cp)
Pentru relatia orar , operatia de modificare a primului tuplu are forma :
CH(orar : NR = 70 , PD = Bucuresti , PA = Craiova , OD = 16:59 ,
OA = 17:50 , OD = 18 , OA = 19) sau utilizand numai cheia operatiei :
CH (orar : NR = 70 , OD = 18 , OA = 19)

504
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

1.1.2. OPERATORII MODELULUI RELATIONAL


Modelul relational ofera doua colectii de operatori pe relatii , si anume :
algebra relationala (AR) si calcul relational (CR). E.F. Codd a introdus algebra
relationala (AR) ca o colectie de operatii pe relatii , fiecare operatie avand drept
operanzi una sau mai multe relatii si avand ca rezultat o relatie .
Unele operatii ale AR pot fi definite prin intermediul altor operatii . In acest
sens , putem vorbi de operatii de baza , precum : reuniunea , diferenta ,
produsul cartezian , etc. dar si de operatii derivate : intersectia , diviziunea ,
etc.
Ulterior , la operatiile standard au fost adaugate si alte operatii , numite
extensii ale AR standard, precum : complementarea , splitarea (spargerea),
inchiderea tranzitiva , etc.
In general , operatiile AR pot fi grupate in:
- operatii traditionale pe multimi (reuniunea , intersectia , diferenta , produsul
cartezian );
- operatii relationale speciale (selectia , protectia , join-ul , etc.)
In continuare vom prezenta principalele operatii ale AR , precum si modul lor
de utilizare.
1.Reunuinea. Este o operatie definita pe doua relatii r si s cu aceeasi schema
R si consta in construirea unei noi relatii q , cu aceeasi schema R si avand drept
extensie tuplurile din r si s luate impreuna o singura data .
Noutaiile uzuale pentru aceasta operatie sunt : r  s, OR (r,s), UNION(r,s).
Considerand tuplurile ca transformari , avem urmatoarea definitie formala a
reuniunii:
r s ={t / t є r}{t / t є s}
Exemplul 2.2.1 Fie orar 1 si orar 2 doua relatii cu aceeasi schema R(NR, PD,
PA, OD,OA).
orar 1
NR PD PA OD OA
75 Craiova Bucuresti 07:15 08:25
80 Bucuresti Timisoara 17:30 19:30
85 Timisoara Bucuresti 07:15 09:25
90 Timisoara Craiova 10:15 13:20

orar 2
NR PD PA OD OA
75 Craiova Bucuresti 07:15 08:25

80 Bucuresti Timisoara 17:30 19 :30


95 Timisoara Arad 11:15 11:25
96 Timisoara Oradea 12:15 13:20

Prin operatia de reuniune a celor doua se obtine un nou orar :


(orar1 orar 2)
NR PD PA OD OA

75 Craiova Bucuresti 07:15 08:25

505
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

80 Bucuresti Timisoara 17:30 19:30


85 Timisoara Bucuresti 07:15 09:25
90 Timisoara Craiova 10:15 13:20
95 Timisoara Arad 11:15 11:25
96 Timisoara Oradea 12:15 13:20

2.Diferenta . Reprezinta o operatie definita pe doua relatii r si s cu aceeasi


schema R, si consta in construirea unei noi relatii q , cu aceeasi schema R si
avand drept extensie tuplurile din r care nu se regasesc in s .
Notatiile uzuale pentru aceasta operatie sunt : r-s , REMOVE (r,s),
MINUS(r,s)
Considerand tuplurile ca transformari , avem urmatoarea definitie formala
a diferentei :
r-s ={t / t є r }-{t / t є s}
Diferenta relatiilor orar1 si orar 2 din exemplul 2.2.1 ne conduce la
urmatoarea relatie:
NR PD PA OD OA
85 Timisoara Bucuresti 07:15 09:25
90 Timisoara Craiova 10:15 13:20

3. Intersectia . Reprezinta o operatie definita pe doua relatii r si s cu aceeasi


schema R , si consta in construirea unei noi relatii q , cu aceeasi schema R si
avand drept extensie tuplurile comune din r si s .

Notatiile uzuale pentru aceasta operatie sunt :


, INTERSECT(r,s), AND(r,s).
Intersectia realtiilor orar 1 si orar 2 din exemlul 2.2.1 , ne conduce la
relatia:
NR PD PA OD OA
75 Craiova Bucuresti 07:15 08:25
80 Bucuresti Timisoara 17:30 19:30

Intersectia reprezinta o operatie derivata , care poate fi exprimata prin


intermadiul diferentei astfel: r  s= r – (r -s) sau rs= s – (s- r).
4.Produs cartezian . Reprezinta o operatie definita pe doua relatii r si s de
schema R ,respectiv S , si consta in construirea unei noi relatii q , a carei schema
Q , se obtine din concatenarea schemelor relatiilor r si s iar extensia lui q se
obtine din toate combinatiile tuplurilor din r cu cele din s.
Notatiile uzuale pentru aceasta operatie sunt : r x s, PRODUCT(r,s) ,
TIMES(r,s).
Considerand tuplurile ca transformari , avem urmatoarea definitie formala a
produsului cartezian :
r x s = {t / (t1 є r)(t2 є s ) (t[R]=t1) (t[S]=t2)}
Fie pilot o relatie cu urmatoarela extensie :
pilot
NUME VARSTA

506
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Popa 35
Vigu 40
Produsul cartezian al relatiei orar 1 din exemplul 2.2.1. si pilot , ne conduce la
urmatoarea relatie:
NR PD PA OD OA NUME VARSTA

75 Craiova Bucuresti 07:15 08:25 Popa 35


80 Bucuresti Timisoara 17:30 19:30 Popa 35
85 Timisoara Bucuresti 07:15 09:25 Popa 35
90 Timisoara Craiova 10:15 13:20 Popa 35
75 Craiova Bucuresti 07:25 08:25 Vigu 40
80 Bucuresti Timisoara 17:30 19:30 Vigu 40
85 Timisoara Bucuresti 07:15 09:25 Vigu 40
90 Timisoara Craiova 10:15 13:20 Vigu 40

5. Selectia. Reprezinta o operatie definita asupra unei relatii r , si consta in


construirea unei relatii s , cu schema identica cu cea a relatiei r si a carei extensie
este constituita din acele tupluri din r care satisfac o conditie mentionata explicit
in cadrul operatiei . Conditia este in general de forma :< atribut operator de
comparatie valoare>.

Notatiile uzuale in aceasta operatie sunt : σ conditie (r) , r[conditie ] sau


RESTRICT(r ,conditie ). Considerand tuplurile ca transformari , operatorul de
selectie se poate defini astefel :
σA=a (r)={t ε r / t (A)=a}
Selectia σ PD=Timisoara (orar 1 ) se aplica relatiei orar 2 din exemplul 2.2.1, ne
conduce la urmatoarea relatie:
NR PD PA OD OA

85 Timisoara Bucuresti 07:15 09:25

90 Timisoara Craiova 10:15 13:20

6.Proiectia. Reprezinta o operatie definita aupra unei relatii r si consta in


construirea unei relatii s in care se regasesc numai acele atribute din r specificate
explicit in cadrul operatiei.Suprimarea unor atribute din r poate avea ca efect
aparitia unor tupluri duplicate ce vor trebui eliminate.Prin operatia de proiectie
se trece la o de la relatie de grad n la o relatie de grad m, mai mic decat cel
initial.
Notatiile uzuale pt aceasta operatie sunt: Π A1 ,A2,…,Am (r), PROJECT(r, A1,
A2,…,Am).
Considerand tuplurile ca transformari , operatorul de proiectie se poate
defini astfel :
Πx = {t(X) / t ε r}
Aplicarea operatorului ΠPD,PA(orar 1) relatiei orar 1 din exemplul 2.2.1 ne
conduce la urmatoarea relatie:

507
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

PD PA
Craiova Bucuresti
Bucuresti Timisoara
TImisoara Bucuresti
Timisoara Craiova

7.Join(Jonctiunea sau unirea) [7] Reprezinta o operatie definita pe doua relatii


r si s , operatie care consta din construirea unei noi relatii q , prin concatenarea
unor tupluri din r cu tupluri din s.Se concateneaza acele tupluri din r si s care
satisfac o anumita conditie.Extensia relatei q va contine acele tupluri care
satisfac conditia de concatenare.
Notatiile uzuale pentru aceasta operatie sunt : r ⋈ codities sau
JOIN(s,r,conditie).
In general conditia de concatenare are urmatoarea forma :
<atribut din r operator de comparatie atribut s>.
In functie de operatorul de comparatie , join-ul poate fi de mai multe
tipuri.Cel mai important tip , in sensul celei mai frecvente utilizari este echijoin-
ul , care reprezinta o operatie de join, dirijata de o conditie de forma urmatoare
:<atribut din r =atribut din s>.
Definitia 2.2.4. fie relatiile r si s de schema R respectiv S, cu A i є R si Bi є S,
dom(Ai)=dom (Bi ), i=1 ,…, m . Relatia:
q(RS)={t : tr ε s , astfel incat t(R) =tr , t(S)=ts , t(Ai)=t(Bi), i=1,…,m}
se numeste echijoin-ul relatiilor in raport cu A1=B1=…=Am=Bm si se noteaza cu
r[A1=B1=…=Am=Bm]s .
Considerand relatia oras , de forma urmatoare:
oras
PD JUDET

Timisoar Timis
a
Craiova Dolj
Oradea Bihor

Operatia orar 1⋈PD=PDoras aplicata relatiilor orar 1 din exzemplul 2.2.1 si


oras definita sus, ne conduce la urmatoarea relatie:

NR PD PA OD OA PD JUDET

75 Craiova Bucuresti 07:15 08:25 Craiova Dolj


85 Timisoara Bucuresti 07:15 09:25 Timisoara Timis
90 Timisoara Craiova 10:15 13:20 Timisoara Timis

508
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Operatia de mai jos se poate exprima cu ajutorul operatiilor de produs


cartezian si selectie , rezultatul unui join fiind acelas cu rezultatul unei selectii
operate asupra unui produs cartezian , adica :
JOIN (r,s,conditie )=RESTRICT(PRODUCT(r,s,conditie ), conditie)

509
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Produsul cartezian reprezinta o operatie laborioasa si foarte costisitoare , ceea


ce face ca in locul produsului sa fie utilizat join-ul ori de cate ori acest lucru este
posibil.
In cazul echijoin-ului , schema relatiei rezultat , contine toate atributele
celor doi operanzi si de aceea vor exista cel putin doua valori egale in fiecare
tuplu . Join-ul natural elimina aceasta redundanta , fiind definita in mod similar
cu echijoin-ul cu observatia ca atributele cu acelas nume se trec o singura data i
relatia rezultat iar extensia se compune din concatenarea tuplurilor lui r cu
tuplurile lui s care prezinta aceleas valori pentru atributele cu acelas nume .
Notatia uzuala pt aceasta operatie este : r⋈s.
Join-ul natural al relatiilor orar 1 din exemplul 2.2.1. si oras definita mai
sus , ne conduce la urmatoarea relatie:
NR PD PA OD OA JUDET
75 Craiova Bucuresti 07:15 08:25 Dolj
85 Timisoara Bucuresti 07:15 09:25 Timis
90 Timisoara Craiova 10:15 13:20 Timis

Join extern . Atunci cand relatiile care participa la join nu au proiectii


identice pe atriburul de jonctiune (atributul nu are acelaesi valori in relatiile
care se jonctioneaza ), operatia de join conduce la pierderea de tupluri , cel putin
dintr-o relatie . pt a evita pierderile de informatie a fost definit join-ul extern , ca
o operatie prin care din doua relatii r si s se obtine o noua relatie q prin join-ul
relatiilor s si r , relatie la care se adauga si tuplurile din r si s care nu au
participat la join .Aceste tupluri sunt completate in relatia q cu valori “null” pt
artibutele relatiei corespondente (r, respectiv s).
Notatiile uzuale pt desemnarea unei join extrem sunt :r⋈.s sau EXT-
JOIN(r,s).
Join-ul extern al relatiilor orar 1si oras conduce la urmatoarea relatie :
NR PD PA OD OA JUDET

75 Craiova Bucuresti 07:15 08:25 Dolj


80 Bucuresti Timisoara 17:30 19:30 Null
85 Timisoara Bucuresti 07:15 09:25 Timis
90 Timisoara Craiova 10:15 13:20 Timis
Nul Oradea Null Null Null Bihor
l

Semi-join . Aceasta operatie a fost introdusa de Bernstein P.A. , fiind


necesara la definirea procesului de optimizare a interogarilor .Semi-jonctiunea
conserva atributele unei singure relatii participante la join si reprezinta o
operatie pe doua relatii r si s in urma careia rezulta o noua relatie ce contine
numai tuplurile din relatia r care participa la join .Notatiile uzuale pt aceasta
operatie sunt : r⋈s sau SEMIJOIN(r,s).
Astfel , orar1><oras conduce la urmatoarea relatie :
NR PD PA OD OA
75 Craiova Bucuresti 07:15 08:25

510
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

85 Timisoara Bucuresti 07:15 09:25


90 Timisoara Craiova 10:15 13:20

8.Diviziunea . Reprezinta o operatie din AR definita asupra unei relatii r de


schema : R(A1:D1 , …,Ap: Dk, Ap+1: D1, …,An: Dm), operatie care consta din
construirea , cu ajutorul unei relatii s(Ap+1 : D1 , … , An : Dm) a relatiei q (A1 :
D1 , …, Ap : Dk) . Tuplurile relatiei q , concatenate cu tuplurile relatiei s permit
obtinerea tuplurilor relatiei r .
Definitia 2.2.5 Fie r si s doua relatii de schema R respectiv S , cu S  R si
R’=R-S .Relatia : r’(R’)={t :ts  s ,  tr  r astefel incat tr (S)=ts , tr (R’ )=t } se
numeste diviziunea relatiei r la s .
Operatia de diviziune este o operatie derivata , care poate exprima prin
intermediul diferentei , prudusului cartezian si proiectiei astfel :
r / s =A1,A2,…,Ap(r) - A1,A2,…,Ap((A1,A2,…,Ap(r)x s )-r)
Consideram relatiile drept si tip de forma urmatoare :
drept
Pilot Tip avion

Dan AIRBUS

Dan TU154

Ion TU154

Ion AIRBUS

Mihai TU154

tip
Tip avion
AIRBUS
TU154

Daca dorim sa obtinem pilotii care au drept de zbor pe toate tipurile de


avionane, calculam drept+tip , si rezulta relatia :

Pilot
Dan
Ion

9. Complementarea . Complementul unei relatii reprezinta multimea


tuplurilor din produsul cartezian al domeniilor asociate atributelor relatiei , care

511
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

nu figureaza in extensia relatiei considerate .Este obligatoriu ca domeniile sa fie


finite.Cardinalitatea rezultatului poate fi extrem de mare, ceea ce face ca
operatia sa fie destul de rar utilizata.
Sa consideram , de exemplu , pt relatia drept definita la operatia de
diviziune , urmatoarele valori ale domeniilor :
Pilot={Dan,Ion,Mihai,Andrei}
Tip avion={AIRBUS,TU154,IAR500}
Complementul relatiei drept este :
Pilot Tip avion

Dan IAR500
Ion IAR500
Mihai AIRBUS
Mihai IAR500
Andrei IAR500
Andrei AIRBUS
Andrei TU154

10.Splitarea (spargerea). Este o operatie aditionala din AR , definita asupra


unei relatii r si care, pe baza uneiconditii definite asupra atributelor lui r permite
construirea a doua relatii r1 si r2 , cu aceeasi schema cu r .Extensia lui r1 contine
tuplurile din r care indeplinesc conditia specificata , iar r 2 pe cele care nu
verifica aceasta conditie.
Pt relatia drept definita mai sus si conditia Pilot=”Dan”, operatia de
splitare produce ca rezultat relatiile drept 1 si drept 2:
drept 1
Pilot Tip avion
Dan AIRBUS
Dan TU154

drept2
Pilot Tip avion
Ion TU154
Ion AIRBUS
Mihai TU154

11.Inchiderea tranzitiva . Este o operatie aditionala din AR prin care se pot


adauga noi tupluri la o relatie .Operatia de inchidere tranzitiva presupune
efectuarea in mod repetat a secventei de operatii : join-protectie-reuniune.
Numarul de executii depinde de continutul relatiei . Inchiderea tranzitiva se
defineste asupra unei relatii r , a carei schema contine doua atribute A 1 si A2 cu
acelasi domeniu , si consta in adaugarea la relatia r a tuplurilor care se obtin
succesiv prin tranzitivitate , in sensul ca , daca exista in r tuplurile <a,b> si <b,c>
se va adauga la r si tuplul <a,c>.Notatiile uzuale pt aceasta operatie sunt : (r), r,
CLOSE()r.

512
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Prezentam mai jos , o relatie legatura ce ne arata legaturile aeriene intre


anumite localitati precum si inchiderea tranzitiva a relatiei (legatura).
Legatura
PD PA
Bucuresti Iasi
Bucuresti Timisoara
Timisoara Arad
Timisoara Craiova

(legatura)
PD PA
Bucuresti Iasi
Bucuresti Timisoara
Timisoara Arad
Timisoara Craiova
Bucuresti Arad
Bucuresti Craiova

O expresie a AR este constituita dintr-o serie de relatii, legate prin operatii


di AR . Sa consideram , de exemplu doua relatii r si s cu schemele r(A,B) si s(B,
C). Cu ajutorul acestor relatii putem defini o expresie E 1 , astfel :
E1=πc(σA=a(r⊲⊳s )).
In formularea unei expresii se pot introduce relatii intermediare .De
exemplu , expresia E1se poate reprezenta cu ajutorul unor relatii intermadiare
X1 si X2 , astfel :
X1= r⊲⊳s
X2 = σA=a(X1)
E1= πc (X2)
Prin calcularea unei expresii algebrice E se obtine o relatie unica .Prin
urmare , E reprezinta o trnsformare a unei multimi de relatii intr-o singura
relatie .In expresii se admit paranteze rotunde si se presupune ca nici un
operator binar nu are prioritate in executie fata de un altul cu exceptia
intersectiei fata de reuniune.
Schema unei expresii depinde de schemele relatiilor care o compun .
Notam cu sch(e) schema expresiei algebrice E , care se poate defini recursiv
conform urmatoarelor reguli:
1.Daca E este ri atunci sch(E)=Ri.
2.Daca E=E1∪E2 , E1∩E2, E1-E2 sau σc(E1) unde c reprezinta conditii, atunci
sch(E)=sch(E1).
3.Daca E=Πx (E1) atunci sch(E)=X.
4.Daca E=E1⊲⊳E2 , atunci sch(E)= sch(E1)∪sch(E2).
5.Daca E=E1 / E2 atunci sch(E)=sch(E1)-sch(E2).
Doua expresii sunt echivalente , daca in urma evaluariilor se obtine ca
rezultat aceeasi relatie .

513
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

De exemplu, expresiile:
E1= c(σA=a (r1⊲⊳r2))
E3 =c(B(σA=a(r 1)) ⊲⊳r 2)
sunt echivalente , considerand r 1 (A,B) si r2 (B,C).
Calculul relational (CR) reprezinta o adaptare a clculului cu predicate la
domeniul bazelor de date relationale .Ideea de baza o constituie identificarea
unei relatii cu un predicat .
Pe baza unor predicate (relatii) initiale , prin aplicarea unor operatori ai
calculului cu predicate se pot defini noi predicate (relatii).Spre deosebire de
derivarea “procedurala “a relatiilor din cadrul AR,CR permite definirea
neprocedurala , “declarativa ”a relatiilor , in sensul precizarii lor prin
intermeduil proprietatilor tuplurilor si nu prin maniera de derivare efectiva
acestor tupluri.
Calculul relational are doua variante :
1.Calculul relational orientat pe tuplu. Reprezinta varianta initiala , introdusa
de Codd E.[6] , in care CR utilizeza variabile definite asupra relatiilor , variabile
ale caror valori reprezinta tupluri de relatie .Din acest motiv , variabilele au fost
denumite variabile tuplu , iar calculul relational primit numele de calcul
relational orientat pe tuplu.
Cea mai simpla constructie a a calculului relational se numeste atom (sau
formula atomica) . Un atom este constituit din termeni (constante ,variabile
tuplu si operatori) si poate avea una din urmatoarele forme :
 r(v), unde r este numele unei relatii , v variabila tuplu reprezentand un tuplu
al relatiei r.De exemplu , orar (z).
 v[i] comp w[j] , unde v si w sunt variabile tuplu iar comp este un operator de
comparare (<,=,<=,>,>=,<>).Semnificatia atomului este a i-a componenta a
tuplului v se afla in relatia comp cu a j-a componenta a tuplului w.De
exemplu , v[2]=w[3].
 v[i]compk sau k comp v[i], unde v variabila tuplu , comp este un operator de
comparare iar k o constanta .Semnificatia atomului este : a i-a componenta a
tuplului v se afla in relatia comp cu constanta k . De exemplu , v[2]>5 sau
5<v[2].
Pe baza atomilor cu ajutorul unor operatori se pot construi formule mai
complexe in cadrul calculului relational orientat pe tuplu sunt utilizati urmatorii
operatori:conectorii uzuali (conjunctia , disjunctia, negatia)precum si
cuantificatori universali ()si existentiali ().
Se numeste variabila tuplu libera o variabila asupra careia nu actioneaza
nici un cuantificator . O variabila tuplu legata reprezinta o variabila asupra
careia ationeaza un cuantificator universal sau existential.
Daca F1 si F2 sunt formule , atunci F1 F2 , F1 F2 , F1 , F2 , (s F1),
(sF2), (vF1) si ( v F2)sunt formule , in care s si v sunt variabile tuplu care
apar in F1 respectiv F2 .
Se numeste expresie a calculului relational orientat pe tuplu o constructie E
de forma : E={t/ F(t)} unde F reprezinta o formula din calculul relational
orientat pe tuplu , iar t este o variabila tuplu si anume singura variabila tuplu
libera din formula F.
Ca si expresiile din AR , expresiile din calculul relational orientat pe tuplu
reprezinta definitii ale unor relatii .In forma prezentata anterior , aceste expresii

514
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

permit exprimarea unor relatii infinite , adica relatii cu un numar infinit de


tupluri.
De exemplu ,expresia: Ei ={t / r (t)} semnifica relatia formata din toate
tuplurile care nu apartin lui r .Deoarece este imposibil de precizat “toate
tuplurile posibile “, se impune o definitie mai clara a expresiilor din calculul
relational orientat pe tuplu.
Se numeste expresie bine formata o expresie de forma : E{t / F(t)} unde F
reprezinta o formula din calculul relational orientat pe tuplu , iar t este singura
variabila libera din formula F , si in plus fiecare componenta a lui t este un
element al lui DOM(F) .DOM(F)reprezinta o multime de simboluri care , fie
apar explicit in F , fie sunt componente ale tuplurilor unei relatii r , mentionata
in F .Multimea DOM(F) este finita.
O expresie din calculul relational orientat pe tuplu se considera bine formata
daca satisface urmatoarele conditii :
Fiecare componenta a lui t apartine lui DOM(F).
1. Daca intr-o expresie de forma : (v)F(v) , fiecare componenta a variabilei v
apartine lui DOM(F), atunci v satisfave F.
2. Daca intr-o expresie de forma : (v)F(v), fiecare componenta a variabilei v
apartine lui DOM(F), atunci v satisface F.
Oexpresie din calculul relational orientat pe tuplu reprezinta definitia unei
relatii , definitie formulata prin intermediul proprietatilor pe care le au tuplurile
care compun relatia .De exemplu , considerand relatiile r 1 si r 2 , cu schemele R1
(A,B) si R2(B,C) putem defini o expresie bine formata Ee , astfel:
Ee ={t / (v) (s) (r(t)r1 (v)r2 (s)(v[1]=a)(s[1]=v[2])(t[1]=s[2]))}
Expresia Ee reprezinta definitia unei relatii care contine ca tupluri acele
valori ale atributului C care au asociate in join-ul relatiilor r 1 si r2 valoarea “a”
pentru atributul A.Se observa ca expresia E e exprima proprietatile tuplurilor
care intra in componenta unei relatii si nu modul de derivare efectiva a acestei
relatii , asa cum este cazul expresiilor E 1 si E2 definite mai sus , care sunt definitii
procedurale ale relatiei Ee .
Exemplul 2.2.2 Consideram relatiile orar 1 si oras definite mai sus .Daca dorim
sa aflam judetul in care se afla un anumit Punct de decolare (PD) , de exemplu
Timisoara , putem sa utilizam expresia E1 .Aceasta se rescrie atfel : E1
=JUDET(σPD=Timisoara(orar1 ⊲⊳oras))
Prin join-ul natural orar 1⊲⊳oras se obtine relatia cursa :
cursa
NR PD PA OD OA JUDET

75 Craiova Bucuresti 07:15 08:25 Dolj


85 Timisoara Bucuresti 07:15 09:25 Timis
90 Timisoara Craiova 10:15 13:20 Timis

Prin selectia σPD=Timisoara (cursa) se obtine relatia:


aero
NR PD PA OD OA JUDET
85 Timisoara Bucuresti 07:15 09:25 Timis
90 Timisoara Craiova 10:15 13:20 Timis
In final , prin ΠJUDET(aero) se obtine relatia :

515
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

JUDET
Timis
Aceeasi problema o putem rezolva si prin evaluarea expresiei E e , care se rescrie
astfel:
Ee ={t / (v) (s) (r(t)orar 1 (v) oras (s)
(v[1]=Timisoara)(s[1]=v[2])(t[1]=s[2]))}
Se observa faptul ca s[1] identifica atributul PD din relatia oras , v[2] identifica
atributul PD , din relatia orar 1 , deci se poate realiza join-ul natural al celor
doua relatii si apoi pe rezultatul join-ului se aplica selectia v[1]=Timisoara , iar
pe acest rezultat se identifica t[1] cu atributul s[2](adica JUDET) si proiectia pe
acest atribut conduce la relatia :
JUDET
Timis
Deci, cele doua expresii conduc la acelasi rezultat .

9.5 Relaţii între baze de date


Noţiuni şi termeni tehnici uzuali
 
a. a.       O entitate este reprezentată din datele de acelaşi tip ale unui obiect
specific. Obiectele pot fi fixate în clase de obiecte numite entităţi
asociate. Un tip de entitate reprezintă o semnificaţie, pe când o
instanţă de entitate reprezintă fapte.
b. b.      Fiecare entitate este descrisă de o mulţime de proprietăţi esenţiale
numite atribute. Pentru diferitele elemente ale entităţii, atributele pot
să primească valori din anumite mulţimi numite domeniul atributului
respectiv.
c. c.       Un atribut sau o mulţime de atribute pentru care valorile asociate
determină în mod unic orice element al entităţii respective se numeşte
cheie. Orice entitate admite cel puţin o cheie, deci toate elementele
unei entităţi sunt distincte. În cazul în care există elemente care să
aibă aceleaşi valori pentru toate atributele, se ia drept cheie un atribut
suplimentar reprezentat de numărul asociat elementului în entitatea
respectivă, care defineşte în mod unic elementul.
d. d.      Numim relaţie între entităţile E1,E2,………,Ek orice submulţime a
produsului cartezian al mulţimilor elementelor celor k entităţi, adică
mulţimi de elemente de forma (e 1,e2,……...,ek), unde e1 este un element
din E1, e2 este un element din E2 ş.a.m.d. O astfel de relaţie o notăm
REL(E1,E2,……...,Ek), unde REL este numele asociat relaţiei, şi putem
spune că relaţia are arietatea k. De cele mai multe ori k=2, deci se
lucrează cu relaţii binare.
În cazul relaţiilor binare, se poate face o clasificare a lor în funcţie de
câte elemente corespund fiecărui element dintr-o entitate în cealaltă
entitate, după cum urmează:
1. 1.      relaţie unu-la-unu (notată 1:1), în cazul în care fiecărui element
din prima entitate îi corespunde cel mult un element din a doua
entitate şi reciproc;
2. 2.      relaţie unul-la-mai-mulţi (notată 1:N), în cazul în care fiecărui
element al primei entităţi îi pot corespunde mai multe elemente din

516
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

a doua entitate, dar fiecărui element din a doua entitate îi


corespunde cel mult un element din prima entitate.
3. 3.      relaţie mai-mulţi-la-mai-mulţi (notată M:N), în cazul în care
fiecărui element al primei entităţi îi pot corespunde mai multe
elemente din a doua entitate şi reciproc.
e. e.       Informaţiile privind structura unei vederi sunt sintetizate grafic
într-o diagramă entitate-relaţie, care pune în evidenţă entităţile ce
intervin, reprezentate prin dreptunghiuri, atributele asociate lor
reprezentate prin elipse, şi diferite relaţii ce se stabilesc între entităţi
reprezentate prin săgeţi (cu vârf dublu către entitatea pe care pot
apărea mai multe elemente în relaţie cu un element din cealaltă
entitate).

SISTEMUL DE GESTIUNE AL BAZELOR DE DATE(SGBD)


7.2FUNCTII SGBD

FUNCTII

FUNCTIA este o componenta a sistemului de gestiune a bazelor de date care se aplica unor
operanzi si reintoarce utilizatorului un rezultat(o valoare numerica,un sir de caractere, o valoare logica
etc.).Rolul si mecanismul de functionare este cel cunoscut din matematica.Functiile se impart in mai
multe clase in func
-tie de natura operanzilor carora li se aplica dar este dificila o delimitare clara in categorii distincte.

Functii de tip caracter


ALLTRIM(expr_car) –Returneaza un sir de caractere din care a eliminat spatii nesimnificative.expr_car
Este sirul initial care contine spatii nesemnificative.
ASC(expr_car) -Returneaza codul ASCII al primului caracter din expresie. Orice alt caracter din
Expr_ car este ignorat.

AT(expr_car1,expr _
Car2,[expr_num]) –Returneaza pozitia unei expresii de tip caracter in alta:
Expr_car1-este sirul care se cauta ;
Expr_car2-este sirul in care se cauta;
Expr_num-reprezinta a cata aparitie a expr-car1 in expr_car2 se cauta(implicit
expr_
Num =1,adica se cauta prima aparitie).
Daca expr_car1 nu se gaseste in expr_car2 se returneaza 0. Cautarea realizata
prin
AT() tine cont de scrierea cu litere mici si mari ; pentru a nu face diferente se
foloses
-te functi ATC().
BETWEEN(expr_1,
Expr_2,expr_3) -Indica daca o expresie de tip caracter,numerica sau data calendaristica se afla
intre
Alte doua expresii de acelasi tip.functia returneaza(.T.)daca expr_1 este mai mare
sau
Egala cu expr_2 si mai mica sau egala cu expr_3(expr_2<=expr_1<=expr_3), si
(.F.)
In caz contrar.
CHR(expr_num) -Returneaza caracterul al carui cod ASCII este dat de valoarea expresiei expr_num.

517
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

CTOD(expr_car) -Converteste o expresie de tip sir de caractere intr-o expresie de tip data. Expresia
de
Tip caracter trebie sa contina o data valida cuprinsa intre “1/1/100”si “12/31/9999”

Formatul implicit pentru expr_car este


“ll/zz/aa”dar caesta poate fi modificat prin
SET DATE si SET CENTURY. Daca secolul nu este specificat la introducerea
datei ,
Se considera implicit secolulu 20.

ISALPHA(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera. Toate celelalte
caractere
Sunt ignorate.

ISLOWER(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera mica. Toate celelalte
caractere sunt ignorate.

ISUPPER(expr_
Car) -Returneaza (.T.) daca expresia caracter incepe cu o litera mare. Toate celelalte
carac
-tere sunt ignorate.
LEN(expr_car) - Returneaza lungimea unei expresii de tip caracter.
LOWER(expr_car)-Converteste toate literele din expr_car in litere mici.
LIKE(expr_car1,
Expr_car2) -Compara doua expresii de tip caracter. Expr_car1 poate contine caracterele *si?
pentru cautari globale .Functia returneaza(.T.) daca expresia expr_car2 se
potriveste
cu sablonul expr_car1 si(.F.) in caz contrar.
LEFT(expr_car,
Expr_num) -Returneaza caracterele din stanga.
Expr_car-reprezinta expresia din care se extrag caractere .
Expr_num-reprezinta numarul de caractere returnate.
Observatie: Functia LEFT() este identica cu o functie SUBSTR() cu pozitia de
inceput1.

Ltrim(expr_
Car) -Elimina spatiile nesemnificative dintr-o expresie. Se foloseste de obicei in combinatie
cu
Functia STR() pentru a converti numere in siruri de caractere .

OCCURS(expr
car1,expr_car2) –Returneaza numarul de aparitii ale unei expresii in interiorul celeilalte.
Expr_car1-expresia care se cauta ..
Expr_car2-expresia in care se cauta.
Daca o expresie nu se gaseste in cealalta se returneaza 0.

518
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

PADL(expr,expr
num,[expr_car]) –Aliniaza la dreapta.
PADR(expr,expr
num,[expr_car]) –Aliniaza la stanga.

PADC(expr,expr
num,[expr_car]) –Centreaza
expr- expresia care se aliniaza.
Expr_num-numarul de pozitii pe care se va face alinierea.
Expr_car – textul de fundal peste care se suprapune expresia de aliniat. Implicit
aceasta
Expresie este vida , se va face o aliniere simpla.
REPLICATE
(expr_car,expr
_num) -Returneaza un sir de caractere rezultata din repetarea expresiaei de tip caracter de
un
numar de ori .expr_car este sirul de caractere care se repeta iar expr_num indica de
ca
-te ori se va repeta expresia.

RIGHT(expr
car,expr_num) -Returneaza cararcterele cele mai din dreapta .
expr_num-indica cate caractere va avea noul sir. Daca se indica un numar de
caractere
mai mare decat lungimea expresiei expr_car se va returna tot sirul de caractere
desem-
nat de expr_car.
RTRIM(expr_car)-Elimina spatiile insignifiante dintr-o expresie. Functia este identica cu TRIM() .

SPACE(expr

num) -Returneaza un sir compus din spatii.expr_num reprezinta numarul de spatii returnate.
STR(expr_num1,
[expr_num2[,
expr_num3]]) -Converteste un numar intr-un sir de caractere.
Expr_num1-reprezinta numarul de convertit.
Expr_num2-reprezintanumarul de caractere pe care se face conversia,incluzand
punctul
Zecimal si cifrele zecimale. Daca se specifica o lungime mai mare decat
nr.
De cifre rezultate se vor adauga spatii in stanga nr-ului. Daca se
specifica o
Lungime mai maica decat nr.-ul de cifre rezultate ,STR() va returna un
sir
De asteriscuri indicand depasirea.
Expr_num3-reprezinta numarul de pozitii zecimale care se returneaza . Daca se
specifica
Mai putine zecimale decat are nr-ul se va face o trunchiere pe nr-ul de
pozi-
Tii specificat.
SUBSTR(expr_car,
Expr_num1[,expr
_num2]) -Returneaza un nr specificat de caractere dintr-o expresie de tip caracter.
Expr_car-expresia din care se extrag caractere

519
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Expr_num1-reprezinta pozitia in cadrul expresiei expr_car din care incepe extragerea.


Prima pozitie intr-o expresie de tip caracter este 1.

Expr_num2-reprezinta nr-ul de caractere extrase. Daca parametrul lipseste se vor


extra-
Ge toate caracterele pana la sfarsitul expresiei.
TRIM(expr_car) –Elimina spatiile insignifiante dintr-o expresie. Functia este identica cu RTRIM().
UPPER(expr_car)-Converteste toate literele din expr_car in litere mari.

FUNCTII NUMERICE
Exista functii numerice corespondente pentru toate functiile trigonometrice,exponentiale,
loga-
Ritmi,radicali valoarea luiPi,etc.
INT(expr_num) -Returneaza partea intreaga a unei expresii numerice.
ROUND(expr_num1,
Expr_num2) -Rotunjeste o expresie numerica, cu un numar de zecimale precizat.SET
DECIMALS este ignorat.
Expr_num1-expresia de rotunjit
expr _num2 –numarul de zecimale la care se face rotunjirea. Daca se
precizeaza o valoare negativa, se va returna un numar intreg
continand in fata punctului zecimal un numar de zerouri pre-
cizat prin expr_num2.
Exemplu :ROUND(1234.1962,-1)produce 1230.0000
ROUND(1234.1962,-2)produce 1200.0000
ROUND(1234.1962,-3)produce 1000.0000
VAL(expr_car) -Returneaza valoarea numerica a unui sir de caractere compus din cifre .
Daca
Primul caracter din sir nu este o cifra VAL() returneaza 0.
Functii de tip data calendaristica

CDOW(expr_data) -Returneaza numele zilei din saptamana pentru o data calendaristica.


CMONTH(expr_data) -Returneaza numele care corespunde expresiei de tip data.
DATE() -Returneaza data sistem.
DAY(expr_data) -Returneaza numarul zilei din luna pentru o expresie de tip data.
DOW(expr_data) -Returneaza numarul zilei din saptamana pentru o expresie de tip data(1pt.
Duminica si 7 pentru sambata).
DTOC(expr_data,
[1]) -Converteste o expresie de tip data in sir de caractere.
DTOS(expr_data) -Converteste o expresie de tip data intr-un sir de 8 cifre in forma aaaallzz.

GOMONTH(expr_
Data,expr_num) -Returneaza o data cu un nr de luni inainte sau dupa data precizata .
MONTH(expr_data) -Returneaza nr-ul lunii (1-12) pentru o expresie data .
SECONDS() -Returneaza nr-ul de secunde care a trecut de la miezul noptii in forma de
mii
De secunde.
TIME() -Returneaza ceasul sistem intr-un format cu 24 de ore sub forma unui sir de
8
Caractere(hh:mm:ss)
YEAR(expr_data) -Returneaza anul pt o expresie de tip data. Valoarea returnata contine
intotdea-
Una si secolul, nu este afectata de SET CENTURY.

520
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Functii referitoare la fisiere baza de date

ALIAS([nr_zona]) -Returneaza aliasul zonei de lucru curente sau al unei zone de lucru
precizate.
Daca nu gaseste nici o baza de date deschisa in zona precizata va returna
sirul
Nul.
SELECT([0|1]) -Returneaza numarul zonei de lucru curente (SELECT (0))sau cel mai mare
nu
-mar de zona ne folosit (SELECT(1))
BOF([nr_zona|alias]) -Returneaza (.T.) daca pointerul dearticol este pozitionatla inceputul bazei de
Date implicit referirea se face la zona de lucru curenta dar se poate preciza
si o
Alta zona de lucru. Daca nu gaseste o baza de date deschisa va returna (.F.)

DELETED([alias|nr_
Zona]) -Returneaza (.T.) daca articolul curent este marcat pentru stergere . implicit
se
Refera la zona de lucru curenta dar se poate folosi pentru o zona de lucru
preci-
-zata prin alias sau nr_zona
EOF([nr_zona|alias]) -Returneaza (.T.) daca pointerul de articol este pozitiuonat la sfarsitul bazei
de
Date. Pointerul de articol este pozitionat la sfarsitul bazei de date:
-cand s-a incercat o mutare a pointerului de articol ultimul articol din baza de
date;
-cand o comanda LOCATE sau SEEK a esuat . In caz contrar
returneaza(.F.)
implicit referirea se face la zona de lucru curenta dar se poate preciza si o
alta
zona de lucru. Daca nu gaseste o baza de date deschisa va rteturna (.F.)
FCOUNT([nr_zona|
Alias]) -Returneaza numarul de campuri prntru o baza de date deschisa

FOUND([nr_zona|
Alias]) -Returneaza (.T.) daca ultima comanda Continue ,LOCATE sau SEEK s-a
teminat cu succes.
RECCOUNT([nr_
Zona|alias]) -Returneaza numarul de articole din baza de date
RECNO([nr_zona|
Alias]) -Returneaza numarul articolului curent.

RECSIZE([nr_zona|

Alias]) -Returneaza lungimea unui articol din baza de date

POSIBILTATI DE LUCRU IN FOXPRO


Accesarea programului FOXPRO se face fie din Windows prin etapele
Start/Programs/Windows explorer/fpd26/fox. exe fie din Norton Commander cand ma plasez pe
calea C:/fp26/fox. exe. .
1) Crearea unei baze de date (tabele) se face cu Create[<numele tabelei care se creeaza
>/?] ,introduc campurile care pot fi : numerice, caractere, data caldaristica, cu zecimale (float)

521
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

sau logice, memo (cifre si litere),dupa care o sa fim intrebati daca introducem inregistrarile
si aleg YES si cu CTRL +W salvez informatiile.
In crearea tabelelor mai intervin comenzii ca :
COPY TO<noua tabela care se creeaza cu aceiasi stuctura cu cea
deschisa in prealabil >STRUCTURE
EXTENDED[ FIELDS<campurile care apar>]FIELDS
LIKE< conditia de aparitie a campurilor >]FIELDS
EXCEPT< conditie complementara >]

CREATE[<se creaza aceasta tabela cu aceiasi structura ca si tabela de dupa clauza from
>]FROM<numele tabelei ce se importa ca strucura>

Copierea sructurii unei tabele intr-o alta tabela se face cu :


COPY STRUCTURE TO <numelee tabelei nou create >[FIELDS<lista caracteristici pentru
aparitie a campurilor>]FIELDS EXCEPT <conditia>]FIELDS LIKE <conditie de aparitie a
campurilor pe noua baza de date>]

2) Pentru a efectua orice prelucrare a unei informatii dintr-o baza de


date , aceasta in prealabil trebuie deschisa:
_USE[<nume tabela >/?][IN<zona de lucru unde se deschide tabela >][AGAIN][INDEX<fisierele
index care se deschid si ele >/?][ORDER<numarul fisierului index care se deschide
primul>]/[<cheia principal dupa care se sorteaza>][OF<denumirea fisierului index compus de
unde face parte cheia principala>][ASCENDING][DESCENDING][ALIAS<o noua denumire a tabelei
prin care poate fi accesate>]
Inchiderea bazelor de date se face cu una din comenzile:CLOSE ALL sau CLOSE
DATABASE

3) Adaugarea unei inregistrari goale se face cu {APPEND[BLANK] iar adaugarea in baza de


date activa (deschisa acum) se face cu:
_APPEND FROM < de unde se importa date>/?[FIELDS<campurile ale caror valori vor fi
adaugate >]/FIELDS LIKE< conditiile indeplinite de campuri>/[FIELDS EXCEPT<conditii
complememtare>][FOR<conditii de adaugare>][TYPE]WIDTH<delimitatorul dintre campuri >
Adaugarea dintr-un tablou intr-o baza de date se face cu:
APPEND FROM ARRAY <din ce tablou se iau inregistrari cas a pun in tabela activa [FOR<conditiile
ce trebuie indeplinite de inregistrari pentru a le pune in tabel ]
[FIELDS <decat campurile in care se pun elementele>|FIELDS LIKE <conditiile care le indeplinesc
campurile >| FIELDS EXCEPT<conditii complementare >]

4)Modificarea inregistrarilor se face fie pe linie cu CHANGE fie pe coloana cu


BROWSE cu structura urmatoare :
CHANGE [FIELDS<campurile care se afiseaza >]
[<domeniul in care se fac modificari >][FOR<conditiile pentru care se fac modificari >][WHILE <pana
cand se fac modificari>][FONT<tipul de litera ,marimea >][STYLE <stilul de litere>][FREEZE<numai
acest camp se poate modifica>][KEY<cheia index indeplineste aceasta conditie>] [NOAPPEND]
[NOCLEAR] [TITLE<titlul ferestrei “change”>][VALID[:F] <conditiile dupa care se poate trece la o noua
inregistrare >] [WHEN <permite sau nu oselectarea unei inregistrari>][ERROR<mesaj de eroare cand
clauza valid nu este indeplinita >][WINDOW<ferastra in care apar modificarile >][IN SCREEN][COLOR
SCHEME<paleta de culori>]

5)Marcarea pentru stergere se face cu :


DELETE[<domeniul >][FOR<conditia de stergere>]
[WHILE<pana cand se sterge>]
Acumularea marcarii pentru stergere are aceeasi structura numai ca in loc de “DELETE”se
foloseste”RECALL” in comanda anterioara .
Stergerea efectiva(eventual a unui camp memo)se face cu:PACK[MEMO]
[DBF] iar stergerea tuturor inregistrarilor se face cu ZAP,stergerea unor fisiere(baze de date ,tabele)se
face cu DELETE FILE[<numele lor>|?]

522
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Deosebirea intere indexare si sortare este ca fisierele index ocupa spatiu mult mai mic.

8.LUCRUL CU TABELELE UNEI BAZE DE DATE

SORTAREA SI INDEXAREA TABELELOR

In prealabil baza de date care o sortez trebuie deschisa iar baza de date sortata trebuie si ea
deschiosa si sortata .
SORT ON< campul dupa care se sorteaza >[A/C/D]
TO<nume tabela sortata> FOR< conditie de sortare >
SORT TO<nume tabela sortata> ON <nume camp >
FIELDS<lista campuri >|FIELDS LIKE<conditie>
|FIELDS EXCEPT<conditie complementara>]
INDEX ON <campul dupa care se indexeaza >TO <fisierul simplu index ce se creaza >|TAG <cheia
principala daca am mai multe campuri de indexat>[ OF <fisierul de unde iau campurile de indexare >]
[ FOR L<conditie de indexare >][COMPACT][ASCENDING][DESCENDING] [ADDITIVE]
Transformarea in sir de caractere a campurilor se face asa : STR <camp numeric>,DTOS<camp dat>
Deschiderea fisierelor index simple se poate face o data cu baza de date initiala iar cele compuse
separat astfel :
USE<baza de date sursa >INDEX <fisierele index>
USE<baza de date sursa >TAG<fisierele index>
SET INDEX TO [<fisierele index ce se deschid |?][ORDER< numarul fisierului index care se deschide
primul>][OF< numele fisierului index compus>][ASCENDING|DESCENDING][ADDITIVE]
SET ORDER TO TAG < cheia ce se deschide >
In cazul alterarii informatiilor cu operatii diverse avem REINDEX.
Gasirea inregistrarilor se face asa:{GO [RECORD]<numarul inregistrarii>[IN<unde caut>]
{GO TOP/GO BOTTOM [IN <unde caut>]
{SKIP<+-urca sau coboara cu atatea inregistrari >IN<unde>
{LOCATE FOR <conditie de localizare >[domeniu][WHILE<pana cand>]iae la bazele de date indexate
astfel:{SEEK<valoare pe care ma pozitionez din campul indexat>{FIND <sirul de caractere pe care-l
caut din campul indexat >
{SET FILTER TO <conditie de filtrare>}

COMENZI PENTRU REALIZAREA LEGATURILOR INTRE


TABELE

RELATII INTRE FISIERE BAZE DE DATE

Posibilitatea de a stabili relatii este una dintre facilitatile care confera putere FOXPRO-ului.O relatie
este o legatura intre doua fisiere deschise,bazata pe o referinta comuna cum ar fi un camp sau numarul
de articole.Se creaza relatii pentru a conecta temporar articole din diferite baze de date,ceea ce permite
accesul simultan la informatiile continute de acestea.
Sunt valabile consideratiile prezentate la instructiunea SET RELATION.
Cand se stabileste o relatie,nu conteaza daca baza de date parinte este indexata sau nu.In schimb
baza de date fiu trebuie sa fie indexata daca nu doriti sa se faca prin numarul de articole.

a. Relatia printr-un camp comun


Cand baza de date fiu este indexata,expresia de legatura pe care-o creati trebuie sa fie de
aceasi forma,tip si lungime cu expresia chei de indexare a bazei de date fiu.FOXPRO evalueaza
expresia de legatura pentru articolul curent din baza de date parinte si apoi cauta articolul
corespunzator(cu aceeasi valoare a chei de indexare) din baza de date fiu.

523
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

b. Relatia prin numar de articol


Cand baza de date fiu nu este indexata,expresia de legatura pe care o creati trebuie sa fie
numerica,deoarece ea va fi folosita pentru a gasi un numar de articol.Daca expresia de legatura
nu este numerica,va apare mesajul de eroare “Database is not indexed”.FOXPRO evalueaza
expresia de legatura penrtu articolul curent din baza de date parinte si apoi cauta articolul cu
numarul de ordine corespunzator in baza de date fiu.

STABILIREA RELATIILOR

Inainte de a incepe legarea bazelor de date trebuie sa va asigurati ca sunteti in forma ecran
“View” a ferestrei “View”.Toate fisierele pe care doriti sa le legati trebuie sa fie deschise in zone de lucru
distincte.
Din lista zonelor de lucru,selectati baza de date care va deveni baza de date parinte.Alegeti
butonul Relations.Numele bazei de date parinte va apare in lista Relations cu o sageata care pleaca din
el.In continuare,din lista zonelor de lucru,selectati baza de date legata.
Daca baza de date legata este indexata si are stabilit indexul principal,va fi activat
generatorul de expresii.Daca baza de date legata este ordonata dupa un camp care exista identic in
baza de date parinte,FOXPRO va introduce automat acel camp in expresia de legatura.Puteti schimba
acest camp sau puteti crea alta relatie de legatura.
Daca baza de date legata este indexata dar nu are stabilit indexul principal,va apare un
dialog Set Index Order pentru a stabili indexul principal in maniera discutata la indexare.
Daca baza de date legata nu este indexata,FOXPRO presupune ca doriti sa creati o expresie
de legatura bazata pe numarul de articole.
Cand expresia de legatura are forma dorita,alegeti optiunea <<OK>> si observati in fereastra
“View” stabilirea relatiei.
UTILIZAREA INFORMATIILOR DIN
MAI MULTE BAZE DE DATE

O aplicatie complexa lucreaza cu informatii multiple,aranjate in mai multe baze de date.Scopul


fragmentarii este acela de a conferi viteza de lucru,de a nu gestiona inutil,in diferite parti ale
aplicatiei,informatii care nu se prelucreaza si,nu in ultimul rand,acela de a conferi siguranta datelor
manipulate.Vulnerabilitatea datelor scade prin fractionarea lor.
Informatiile atasate unei aplicatii pot exista in mai multe baze de date,dar,in general,aceste baze
de date sunt legate pe baza unui camp comun,unic in fiecare articol.Acest camp se numeste camp
cheie si are rol esential in utilizarea informatiilor distribuite in mai multe baze de date.
FOXPRO permite utilizarea simultana a maximum 25 de baze de date.Pentru fiecare baza de
date,sistemul de gestiune rezerva o zona de lucru curenta,numerotata de la 1 la 25 (sau de la A la J si
de la 11la 25).Programatorul are acces la un moment dat numai la o singura zona de lucru;aceasta
zona de lucru se numeste “zona de lucru curenta”.Zona de lucru curenta poate fi modificata de
programator prin selectare.Vom explica cele spuse anterior printr-un exemplu.

Exemplu:
Consideram doua fisiere baza de date CLIENTI.DBF cu structura:

Cod_client N 7
Den_client C 35
Cont_banca C 15
Den_banca C 20
Cont_cec C 15
Adresa C 25
Den_loc C 20
Telefon C 12
Fox C 12
Si FACTURI.DBF cu structura

Nrf N 8
Dataf D 8
Cod_ben N 7
Val_fact N 14 2

524
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Aceste fisiere pot fi deschise in doua zone de lucru astfel:

SELECT 1
USE CLIENTI
SELECT 2
USE FACTURI

Deci instructiunea de selectare a zonei de lucru este SELECT si poate avea urmatoarea sintaxa:

SELECT n|alias

Implicit este activa zona de lucru 1.Puteti selecta o anumita zona de lucru precizandu-i numarul prin
n.SELECT 0 are ca efect
selectarea zonei de lucru ne folosite cu cel mai mic numar de ordine.
Dupa deschiderea unei baze dedat intr-o anumita zona,acesta poate fi selectata prin aliasul
sau.Aliasul implicit al unei baze de date este numele sau (fara extensia.DBF).Se poate atribui bazei de
date un alt nume _alias decat numele implicit prin specificarea lui in comanda USE astfel:
USE…ALIAS nume_alias
Un nume_alias poate fi format din maximum 10 caractere (litere,cifre si liniuta de subliniere) si
incepe obligatoriu printr-o litera sau cu liniuta de subliniere.
Specificarea campurilor dintr-o baza de date deschisa in alta zona de lucru decat zona curenta se
face cu ajutorul numelui_alias astfel:alias.camp sau alias->camp.
Inchiderea bazelor de date deschise in diferite zone de lucru se face prin selectarea fiecarei zone
in parte si inchiderea bazei de date din zona respectiva astfel:

SELECT 1
USE
SELECT 2
USE

Sau utilizand comanda CLOSE ALL.


Scopul deschiderii mai multor baze de date este prelucrarea simultana a articolelor din bazele de
date deschise .Doua sau mai multe baze de date se pot lega :

1. Pe baza numarului de secventa a articolelor din bazele de date in cauza (se presupune de
regula,ca bazele de date au acelasi numar de articole);este o legatura fizica intre bazele de date;
2. Pe baza unei chei de indexare;prin acest procedeu,frecvent utilizat,se stabileste o legatura logica
intre articolele din bazele de date deschise simultan.

In ambele cazuri,sistemul gestioneaza pointeri de articol pentru fiecare zona de lucru .Pointerii se
pot sincroniza prin comanda:SET RELATION.
Formatul comenzii este:

SET RELATION TO|expr_1INTOn1|alias1


|,expr_2 INTOn2| alias2…| [additive]|

Comanda SET RELATION stabileste o relatie intre doua baze de date deschise.Inainte de a
stabili relatia,o baza de date (baza de date parinte sau principala ) trebuie deschisa in zona de lucru
curenta iar cealalta(baza de date fiu sau legata) sa fie deschisa in alta zona de lucru.
Dupa crearea relatiei, o mutare a pointerului de articol in baza de date parinte,este insotita de
mutarea pointerului de articol in baza de date legata pe articolul corespunzator.Daca nu se gaseste un
articol corespondent in baza de date legata,pointerul de articol din baza de date fiu este pozitionat la
sfarsitul bazei de date.
Expresia de legatura expr_1este de obicei cheia de indexare a indexului principal al bazei de date
fiu.
INTO n1 | alias1,indica prin numar sau alias,zona de lucru in care este deschisa baza de date fiu.
Comanda SET RELATION TO anuleaza toate relatiile de legatura ale bazei de date din zona de
lucru curenta .

525
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Se pot crea mai multe relatii de legatura intre baza de date din zona de lucru curenta si baze de
date deschise in alte zone de lucru prin precizarea mai multor relatii separate prin virgula in forma
comenzii.
Utilizarea clauzei ADDITIVE are ca efect pastrarea tuturor relatiilor stabilite in zona de lucru
curenta,anterior.In caz contrar acestea sunt anulate.

Exemplu:

Considerand bazele de date descrise anterior si tinand cont de faptul ca in baza de date
FACTURI campul cod_ben constituie codul unui client,printr-o relatie intre cele doua baze de date
astfel:

SELE 1
USE clienti
INDEX ON cod_client TO codcind
SELE 2
USE facturi
SET RELA TO cod_ben INTO clienti
BROW FIELDS nrf,dataf,clienti.den_client,valf

Un caz particular al relatiilor intre bazele de date il constituie legatura”Unu la n” (1-To –Many).O
legatura”Unu la n”,pune in corespondenta mai multe articole din baza de date fiu,unui singur articol din
baza de date parinte .
Cand se prelucreaza baze de date legate prin legatura”Unu la n”,pointerul de articol ramane pozitionat
pe un articol din baza de date parinte,pana se prelucreaza toate articolele care ii corespund in baza de
date fiu.
Stabilirea unei relatii”Unu la n” se realizeaza intr-o maniera similara cu cea pentru stabilirea unei
relatii “Unu la unu”.Se incepe cu stabilirea unei relatii normale “Unu la unu” intre fiu si parinte (prin
comanda SET RELATION) dupa care se foloseste comanda SET SKIP pentru a transforma legatura
stabilita intr-o legatura”Unu la n”.]
Sintaxa comenzii SET SKIP este urmatoarea :

SET SKIP TO |alias1 |,alias2|…|

Daca baza de date parinte este legata de mai multe baze de date fiu (care au aliasurile alias1,
alias2, …) atunci relatiile respective pot fi transformate in relatii”Unu la n”printr-o comanda SET SKIP.
In comenziile care au efect asupra unui anumit domeniu de articole
(DISPLAY,LIST,etc.),articolele din baza de date parinte se vor repeta pentru fiecare articol
corespondent din baza de date fiu.
Anularea unei relatii “Unu la n” se realizeaza cu comanda SET SKIP TO (fara parametrii).
Exemplu:
In exemplul antertior s-a considerat ca parinte baza de date FACTURI iar baza de date CLIENTI
a fost considerata baza de date fiu.Daca schimbam modul de abordaresi consideram baza de date
CLIENTI ca baza de date parinte si baza de date facturi ca baza de date fiu si tinem cont de faptul ca
unui client ii pot corespunde mai multe facturi putem evidentia o relatie “Unu la n” astfel:
SELE 1
USE CLIENTI
SELE 2
USE FACTURI
INDEX ON cod_ben to FACTBEN
SELE CLIENTI
SET RELA TO cod_client INTO FACTURI
SET SKIP TO FACTURI
BROWSE FIELDS facturi.nrf,facturi.dataf,;den_client,facturi.valf

526
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

GESTIUNEA ECRANULUI
REGIUNI DE EDITARE:

Introducerea unor informatii de lungime variabila(care vor completa campuri memo din bazele de
date)se poate face prin instructiunea:
@lin,col EDIT variabila/camp
SIZE expr_num1,expr_num2
[FUNCTION expr_car] [DEFAULT expr]
[MESSAGE expr_car2]
[VALID expr_log1 [ERROR expr_car3]]
[WHEN expr_log2] [NOMODIFY] [SCROLL][TAB]
[COLOR SCHEME expr_num4/COLOR lista_culori]
Dupa activarea prin READ,continutul variabilei sau campului specificat este afisat in regiunea de
editare.La iesirea dintr-o regiune de editare,modificarile facute pot fi salvate.
Tastati TAB sau CTRL+TAB pentru a salva modificarile si a trece la obiectul urmator sau SHIFT+TAB
pentru a salva modificarile si a trece la obiectul anterior.Tastati ESC pentru a abandona modificarile si a
trece la obiectul urmator.Daca folositi clauza VALID pentru editarea unui camp memo,modificarile vor fi
salvate sau nu in functie de valoarea expresiei expr_log1.
Daca expr_log1 este adevarata(.T.),modificarile se salveaza daca tastati TAB,CTRL+TAB sau
SHIFT+TAB pentru a iesi dintr-o regiune de editare.Tastand ESC modificarile se pierd.
Daca tastati TAB,CTRL+TAB sau SHIFT+TAB pentru a salva modificarile dintr-un camp memo iar
expr_log1 este falsa (.F.) vi se cere confirmarea salvarii.Tastand apoi ESC modificarile se salveaza.
Toate facilitatile de editare din FOX PRO cum ar fi decuparea(CUT),
copierea(COPY),refacerea(PASTE) sunt disponibile si in regiunile de editare.Textul introdus poate fi
defilat pe verticala si va fi aranjat intre marginile regiunii

Important:
Clauzele care apar si la @...GET,au aceeasi semnificatie.
Clauza SIZE trebuie inclusa pentru a specifica inaltimea si latimea regiunii de
editare.Inaltimea(exprimata in numar de linii) este specificata prin expr_num1 iar latimea (exprimata in
numar de coloane)este specificata prin expr_num2.
Daca expr_num1 este 1, va aparea o regiune de editare speciala sub forma de linie.Se poate defila
orizontal continutul. Tastand ENTER se trece la urmatorul obiect
Pentru a specifica modul de aranjare al textului intre marginile regiunii de
editare se poate folosi clauza FUNCTION cu obtiunile I sau J .Orice alt caracter
inclus in clauza FUNCTION este ignorat
Optiune Efect
I Centreaza textul in regiunea de editare
J Aliniaza textul la dreapta. Implicit, textul este
aliniat la stinga.
In exemplul urmator se creaza o regiune de editare in care textul este
aliniat la dreapta:
STORE’ text ce se aliniaza la dreapta’ to text @2,2 EDIT text
FUNCTION’J’ size 5,50 READ
Clauza Semnificatia
NOMODIFY Indica doar afisarea textului fara a permite
Modificarea lui. Se poate defila si copia textul
Dar nu poate fi modificat.
SCROLL Prin includerea acestei clauze va apare o bara de
defilare in dreapta regiunii de editare( daca inaltimea
este minimum 3).Bara de defilare va permite o
deplasare rapida in interiorul textului cu ajutorul
mouse-ului si va da o imagine a pozitiei in zona de text

527
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Va apare bara de defilare doar daca textul este mai


mare decat capacitatea regiunii de editare.
TAB Implicit,tastand TAB, nu se introduce un caracter
TAB in interiorul textului din regiunea de editare
Tastand TAB sau CTRL+TAB salvati modificarile si se
trece la obiectul urmator.
Implicit culorile regiunilor de editare deriva di schema 2 de culoare ,cea
pentru meniuri utilizator.
Folosirea perechilor de culori pentru elementele unei regiuni de editare
este data in tabelul urmator .
Pereche de culori Element afectat
2 Textul regiunii de editare
3 Bara de defilare *
5 Textul explicativ (clauza Message)
6 Textul selectat intr-o regiune.

*Se folosesc culorile invers:Bara de defilare foloseste culoarea de prim plan iar
controlerele culoarea de fond.
Exemplu:
Considerand baza de date MARFURI, cu structura:
COD_MARFA Numeric 11
DEN_MARFA Character 30
UM Character 3
PRET Numeric 11 2
INFO Memo 10
Programul scris anterior pentru adaugare de articole in baza de date se va
modifica pentru a introduce informatii in campul memo.Se foloseste comanda
@...EDIT
*program ADAMARFA.PRG-‘adauga marfuri in catalog set talk off
set color of scheme 1 to w+ /b,n/bg
@ 0,0 clear to 24,79
@0,0 to 3,79 double
@1,2 say “Curs FOX PRO”
@2,1 say padc (“Exemplu-Program adaugare; articole intr-o BD”,78)
USE marfuri
adaug=.t.
do while adaug...

Oprirea executiei prin WAIT


Instructiunea WAIT opreste executia programului pana la apasarea unei taste
sau un clic pe mouse.Formatul instructiunii este :
WAIT [expr_car] [TO var_mem]
[TIMEOUT expr_num] [WINDOW]
WAIT fara nici o alta clauza are ca efect afisarea mesajului implicit “Press any
key to continue...”.Programatorul poate sa-si defineasca mesajul pe care doreste
sa-l afiseze prin expr _car.Mesajul poate fi specificat prin numele unei variabile
de tip sir de caractere sau poate fi un sir de caractere incadrat de
ghilimele,apostrofuri sau paranteze drepte.

528
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Clauza TO var_mem,are ca efect memorareaa valorii tastate in variabila de


memorie precizata prin var_mem.Daca clauza nu apare valoarea tastata se
pierde.Variabila var_mem nu trebuie definita in prealabil.Daca se tasteaza
ENTER sau un caracter netiparibil in variabila var_mem se memoreaza un sir
vid.
Prin clauza TIME OUT expr_num se poate defini durata asteptarii in secunde
sau fractiuni de secunda.Daca dupa expirarea timpului precizat nu s-a tastat
nimic sau nu s-a apasat butonul mouse-ului asteptarea se va termina si in
var_mem(daca s-a precizat)se memoreaza sirul vid.
Daca se specifica clauza WINDOW mesajul precizat prin expr_car sau mesajul
implicit”PRESS ANY KEY TO CONTINUE...” vor aparea in coltul dreapta sus
ca mesaj sistem.
CREAREA MENIURILOR

CREREA MENIURILOR POPUP


Pentru a crea meniuri POPUP se foloseste comanda:@<lin,col>MENU
tablou,expr_num1[,expr_num2]
[TITLE expr_car][SHADOW]
Aceasta comanda permite crearea unui popup in pozitia dorita .Un popup este o
cutie cu chenar care contine o lista de optiuni din care puteti alege.Popup-ul
poate avea si un titlu care se afisaza in partea de sus.Activarea unui popup se
realizeaza prin comanda READ MENU.La un moment dat poate fi activat un
singur popup.

CLAUZA SEMNIFICATIA

Lin si col Reprezinta coordonatele de reprezentare ale


Coltului stanga sus pentru meniul popup.

Tablou Reprezinta un tablou unidimensional care contine


Optiunile care apar in popup.Optiunile trebuie sa
Fie de tip caracter si lungimea maxima pe care
Poate fi afisata o optiune este de 76 caractere

Expr_num1 Reprezinta numarul total de optiuni accesibile in


Meniul popup.De exemplu,daca tabloul are 10
Elemente iar valoarea lui expr_num1 este 5,vor fi
Accesibile doar primele 5 elemente din tablou ca
Optiuni in meniul popup.

Expr_num2 Reprezinta numarul de optiuni afisate in meniul


Popup.Daca expr_num1>expr_num2,se vor
Afisa doar expr_num2 optiuni,celelalte
Urmand a fi defilate cu ajutorul tastaturii sau
Mouse-ului.

Title expr_car Reprezinta titlul meniului popup care


Va fi afisat pe bara de sus a cutiei care
Contine meniul.

529
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Shadow Are ca efect afisarea unei zone intunecate in


Spatele cutiei cu meniul,adica afisarea cu
Umbra.Informatiile acoperite de umbra
Ramin inca vizibile.Implicit meniurile
Popup nu au umbra.

Instructiunea READ MENU are formatul:READ MENU TO var_mem


Comana activeaza un meniu popup definit prin @...MENIU.

GESTIUNEA CULORILOR
Culorile pot fi modificate in doua feluri:

1. Utilizand dialogul de “Alegere culori”(Color Picker) care apare dupa alegerea optiunii COLOR... din meniul WINDOW
2. Prin comenzi SET

Termenii utilizati in gestiunea culorilor sunt:

1. Perechea de culori;
2. Lista de perechi de culori;
3. Schema de culori;
4. Setul de culori.
PERECHEA DE CULORI

Perechea de culori consta din culoarea de fundal si culoarea de prim plan.Culorile se specifica printr-o
abreviere.Se foloseste un * pentru a indica clipirea.Caracterul + va indica stralucirea.Codurile culorilor sunt prezentate in tabelul
urmator:
Culoarea Codul
Black(Negru) N
Blank X
Blue(Albastru) B
Brown(Ocru) GR
Cyan(Bleu) BG
Green(Verde) G
Magenta(Mov) RB
Red(Rosu) R
White(Alb) W
Yellow(Galben) GR+

Pentru monitoarele monocrome exista doar patru posibilitati de afisare:

1. Alb(W);
2. Negru(N);
3. Subliniere(U);
4. Video invers(I);
IMPORTANT:
Culoarea Blank se foloseste la introducerea parolelor.

LISTA DE PERECHI DE CULORI

Este formata din 1-10 perechi de culori separate prin


virgula.O schema de culori este compusa din 10 perechi de culori.
EXEMPLU:
- pentru monitoare color:
w+/b,w+/bg,gr+/b,gr+/b,r+/b,v+/gr,gr+/rb,n+/n,gr+/b,r+/b

530
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

- pentru monitoare monocrome:


w/n,n+/w,w+/n,w+/n,w/n,u+/n,w+/n,-,w+/n,w/n

In lista de perechi de culori pentru monitoare monocrome perechea a 8-a lipseste deoarece nu este permisa
umbrirea.

SCHEMA DE CULORI

Este un set de 10 perechi de culori .Schemele de culori controleaza culorile elementelor interfetei FOXPRO.(Ex.
Schema 8 pentru ferestrele sistem ).Fiecare pereche de culori din lista de perechi de culori corespunde unui element din schema.

SETUL DE CULORI

Este compus din 24 de scheme de culoare.


In tabelul urmator este prezentat modul de asignare a schemelor de culoare pentru elementele interfetei
FOXPRO.
Elementul afectat Schema de culoare
Ferestre utilizator Schema 1
Meniuri utilizator Schema 2
Bara de meniuri Schema 3
Meniuri popup Schema 4
Ferestre de dialog Schema 5
Popup-uri in dialoguri Schema 6
Alerte Schema 7
Ferestre sistem Schema 8
Popup-uri in ferestre Schema 9
Fereastra Browse Schema 10
Fereastra Report Schema 11
Popup-uri in alerte Schema 12
Rezervate Schema 13-16
Utilizate in aplicatii Schema 17-24

Folosirea perechilor de culori din cadrul schemei 1 de culoare este


urmatoarea:
Perechea Elementul afectat
1 campuri SAY
2 campuri GET
3 bordura
4 titluri ,elemente active
5 titluri si mesaje
6 elementul selectat
7 ceasul,tastele de apel
8 umbra
9 controlere active
10 controlere dezactivate

Folosirea perechilor de culori din cadrul schemei 2 de culoare este urmatoarea:

Perechea Elementul afectat


1 optiuni dezactivate

531
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

2 optiuni disponibile
3 bordura
4 titlurile meniurilor
5 mesajul explicativ
6 optiunea selectata
7 taste de apel
8 umbra
9 controlere active
10 controlere dezactivate

Tabele complete privind asignarea perechilor de culori pentru fiecare schema sunt cuprinse in Help-ul sistem prrecum si in
manualul “FOXPRO Developer’s Guide”.
O comanda de modificare a culorilor este :

SET COLOR OF SCHEME expr_num1 TO


[[lista_perechi_culori] \ [SCHEME expr_num2]]

Aceasta comanda permite modificarea culorilor unei scheme prin specificare unei liste de perechi de culori sau a altei scheme.

Clauza Semnificatia
Expr_num1 Reprezinta numarul schemei ale carei culori se modifica ; ppoate lua valori intre 1si
24.
lista_perechi_culori Reprezinta perechile de culori asignate schemei .Puteti specifica intre 1si 10 culori. Nu este
necesar sa se specifice toate cele 10 perechi de culori.Se pot modifica culorile selectiv prin
introducerea unei virgule pentru fiecare pereche care ramane neschimbata .
SCHEME expr_num2 Reprezinta schema din care se preiau noile culori .Se realizeaza o copiere a culorilor schemei
precizata prin expr_num2 pentru schema precizata prin expr_num1.

Exemplu:
Pentru a schimba culoarea bordurii(perechea 3) din
ferestrele utilizator (schema 1) in alb pe rosu si a lasa nemodificate
toate celelalte culori se utilizeaza comanda:
SET COLOR OF SCHEME 1 TO , , W/R

Putem afla care sunt culorile dintr-o anumita schema folosind functia SCHEME (expr_num1\,expr_num2\)
Functia returneaza un sir de caractere, care reprezinta o
pereche de culori sau o lista de perechi de culori dintr-o schema
precizata.
Prin expr_num1 se specifica numarul schemei ale carei culori intereseaza.Daca al doilea parametru lipseste se
returneaza toate cele 10 perechi de culori.
Daca se doreste doar o anumita pereche de culori din schema se va specifica prin expr_num2 pozitia perechii care
intereseaza.De exemplu daca expr_num2 este 4, se va returna a patra pereche de culori.

Exemplu:
Comanda urmatoare returneaza a treia pereche de culori din schema 4:
? SCHEME (4,3)

STERGEREA ECRANULUI

Pentru ca programatorul sa fie asigurat ca pe ecran nu exista alte informatii decat cele pe care le doreste ,este nevoie
sa stabileasca un regim de lucru adecvat prin instructiuni SET.
Dupa stabilirea regimului de lucru ecranul trebuie sters cu instructiunea CLEAR;aceasta sterge tot ecranul intre
coordonatele (0,0)si (24,79).
Daca situatia o cere, anumite informatii pot sa ramana pe ecran,iar programatorul poate sterge doar un dreptunghi,definit
prin coordonatele coltului stanga sus,respectiv dreapta jos.Aceasta stergere se poate realiza prin:
@ l1,c1\CLEAR\CLEAR TO l2,c2\
Daca lipseste clauza CLEAR sau CLEAR TO, se va sterge un dreptunghi al carui colt stanga sus este precizat, iar
coltul dreapta jos este coltul de jos al ecranului.

532
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

REALIZAREA DESENELOR

Uneori este necesara desenarea unor dreptunghiuri ce chenar simplu sau


dublu care sa incadreze anumite informatii sau este necesara trasarea unor
linii.Acest lucru se poate realiza folosind instructiunea:
@ l1,c1 TO l2,c2\DOUBLE\PANEL\sir_caractere_chenar\
Daca nu se specifica nici una din clauzele optionale se va trasa o cutie simpla.Daca l1 si l2 au aceeasi valoare, atunci
se va trasa o linie orizontala.Daca c1 si c2 au aceeasi valoare se va trasa o linie verticala.
Utilizand clauza DOUBLE se va trasa o linie dubla.Clauza PANEL are ca efect trasarea unei linii solide.
Daca se specifica un sir de caractere pentru chenar, acestea trebuie specificate(separate prin virgule) in ordinea:
1. bara de sus(ls=chr(196); ld=chr(205))
2. bara de jos
3. bara din stanga(bv=chr(179); bvd=chr(186))
4. bara din dreapta
5. coltul stanga sus(cdss=chr(201); css=chr(218))
6. coltil dreapta sus(cdds=chr(187); cds=chr(191))
7. coltul stanga jos(cdsj=chr(200); csj=chr(192))
8. coltul dreapta jos(cddj=chr(188); cdj=chr(217))

Pentru a trasa cutia cu un singur caracter se poate preciza un sir format dintr-un singur caracter.

Exemplu:
@ 10 ,0 TO 22,40 “*”
Efect similar comenzii @...TO in forma cu sir de caractere pentru chenar produce comanda :
@ l1,c1,l2,c2 BOX\ sir_de_caractere\
Comanda @...BOX traseaza o cutie.Daca se precizeaza un sir_de_caractere, aceasta se va oflosi pentru trasarea
cutiei.Trebuie precizate pana la 9 caractere(cate unul pentru fiecare colt, cate unul pentru fiecare latura si unul pentru
umplere).Caracterele din sir vor fi parcurse pentru trasare in sensul acelor de ceasornic incepand din coltul stanga sus.Pentru
umplere se foloseste al noualea caracter.Daca se specifica un singur caracter, acesta este folosit la trasarea cutiei.

Exemplu:
@ 10,20,14,60 BOX
@ 10,20,14,60 BOX REPLICATE (chr(177),9)

COMENZI PRIVIND INTRODUCEREA SI AFISAREA PE


ECRAN

O afisare simpla pe ecran se face prin instructiunile:


?\ ??\ expr_1\,expr_2\...\
Un singur ? are ca efect trecerea la o linie noua inaintea unei afisari.Daca nu se specifica nici o expresie, va fi afisata o
linie goala.Virgula care separa expr_1,expr_2,... are ca efect separarea printr-un spatiu a rezultatelor afisate.
Doua ?? au ca efect afisarea pe aceeasi linie, in pozitia curenta de pe ecran.

533
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

In cazul folosirii instructiunii de mai sus, la umplerea cu informatie,ecranul este defilat.


Pentru a permite un control eficient al afisarii se utilizeaza instructiunea:
@ lin,col SAY expr\ PICTURE sablon\ \ FUNCTION cod\

Se va evalua expresia expr si rezultatul se va afisa in linia si coloana indicate pe ecran (daca este activ SET DEVICE
TO SCREEN) sau la imprimanta (daca este activ SET DEVICE TO PRINTER).
Prin aceasta instructiune ecranul poate fi gestionat dinamic, prin cresterea numarului de linie pentru afisare
(lin=lin+1).Deasemenea, afisarea informatiilor pe ecran se poate face in orice ordine, deoarece ecranul este considerat ca fiind
“adresabil”, in sensul ca fiecare caracter are coordonatele linie si coloana bine stabilite.Gestiunea dinamica a ecranului este
favorizata de functiile sistemului COL() si ROW() care returneaza coordonatele pozitiei curente a cursorului pe ecran.

Exemplu:
@ 10,20 say “Acesta este un text”
@ row ( ) +1,0 say “Text pe linia urmatoare”
@ row ( ) ,col ( ) +10 “scriu pe aceeasi linie”

In forma @ lin , col SAY expr, instructiunea permite numai afisarea sirurilor de caractere.Celelalte tipuri de date
(numerice,logice,date calendaristice), trebuie trasformate inainte de afisare in siruri de caractere.
La tiparire poate fi utilizat un sablon sau o functie de conversie sau ambele. Un sablon poate contine si coduri ale
functiilor de conversie caz in care incepe cu @ dar o functie de conversie nu poate contine decat codurile proprii.
Sablonul specificat dupa clauza PICTURE poate contine orice caracter ; numai cele care vor fi prezentate in continuare
au un rol activ in afisarea sau in preluarea datelor .Daca in sablon sunt incluse si alte caractere, acestea se afiseaza.

Cod in sablon Semnificatia


A Permite doar litere.
L Permite numai valori logice.
N Permite numai litere si cifre.
X Permite orice caracter.
Y Permite doar valori logice Y,y,N,n.
9 Permite doar cifre si semn algebric.
# Permite cifre ,semn si spatiu.
! Converteste literele mici in litere mari.
$ Afiseaza simbolul monetar stabilit prin SET.
0 Zerourile de la inceputul numerelor se inlocuiesc cu *.
.(punct) Stabileste pozitia punctului zecimal.
, (virgula) Stabileste reprezentarea pe grupe a numerelor.

Codurile functiilor de conversie sunt prezentate in tabelul urmator:

Codul functiei Semnificatie


A Admite numai caractere alfabetice.
B Aliniazala dreapta numerele afisate.
C Scrie CR(CREDIT) dupa un numar pozitiv.
D Utilizeaza formatul american pentru o data.
E Utilizeaza formatul BRITISH pentru o data..
I Centreza un text.
J Aliniaza la stanga un text.
L Transforma spatiile din fata unui numar in zerouri.
Sn Limiteaza lungimea de afisare la n caractere;
Se permite astfel defilarea pe orizontala in interiorul campului.
T Elimina spatiie nesemnificative.
X Scrie DB(DEBIT) dupa numerele negative.
Z O valoare 0 este tiparita prin spatii.
( Numerele negative se scriu intre paranteze.
! Converteste literele mici in litere mari.
^ Afiseaza numerele cu notatia stiintifica.
$ Afiseaza numerele in format monetar.

Exemplu:
@ 10,10 say “Hello!” PICT “@!”
@ 12,10 say 1234. 25 FUNCTION “$”
@ 14,10 say 1235. 25
PICT “9999999.99” FUNCTION “$”

CITIREA DATELOR DE PE ECRAN

Programatorul poate sa introduca date cu ajutorul instructiunilor de afisare concatenate cu instructiuni de


citire.Citirea datelor se face de la tastatura , (prin tastarea lor); ele apar in ecou pe ecran si sunt transferate unor variabile de
memorie definite corespunzator de utilizator.
Sintaxa instructiunii de initiere a procesului de citire de la tastatura este:
@ lin,col SAY “ text” GET variabila

534
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Efectul instructiunii este afisarea pe ecran a textului dintre ghilimele pe linia lin
Si in coloana col si initierea procesului de citire a variabilei variabila mentionata dupa GET.In program pot fi mai multe
asemenea instructiuni , succesuve sau nu.Citirea se realizeaza de fapt numai la intalnirea instructiunii READ care are ca efect
citirea tuturor varibilelor specificate prin toate optiunile GET anterioare ei . Utilizatorul va trebui sa tasteze valori pentru aceste
variabile.Textul dintre ghilimele are rol explicativ, pentru ca utilizatorul sa cunoasca in orice moment ce fel de date se introduc .

Exemplu:
CLEAR
SET TALK OFF
@ 1,1 to 23,79 DOUBLE
@ 2,3 say “B.B. Computer”
@ 2,50 say padl (“Curs FAP1, 29)
@ 5,1 say padc (“TEST MODUL 4 – FOXPRO”,77)
@ 7,5 to 20,75
*identificare cursant
nume=space (15)
prenume=space(20)
@ 10,8 say “ Nume :” get nume
@ 11,8 say “Prenume:” get prenume
read

In exemplul de mai sus, se initializeaza variabilele de memorie cu spatii, apoi se face initializarea citirii lor folosind
instructiunea GET si in final se face citirea efectiva prin instructiunea READ.
Instructiunea de citire poate sa impuna formatul variabilei,limitele in care trebuie sa fie cuprinsa variabila precum si
alte conditii de validare a datelor introduse.O forma mai generala a instructiunii GET este:

@ lin,col [SAY expr_1 [PICTURE sablon_1][FUNCTION cod_1]]


GET variabila [PICTURE sablon_2][FUNCTION cod_2]
[DEFAULT expr_2][MESSAGE expr_car1]
[RANGE expr_3,expr_4]
[VALID expr_log1[ERROR expr_car2]][WHEN expr_log2]
[COLOR SCHEME expr_num \ COLOR lista culori]

Daca se utilizeaza GET cu SAY in fata ,se va introduce automat un spatiu intre expresia tiparita prin SAY si pozitia
din care incepe GET.
Clauzele PICTURE si FUNCTION au aceeasi semnificatie cu cea prezentata pentru SAY.

Clauza Semnificatia
DEFAULT expr_2 Daca variabila specificata dupa GET, nu exista, ea va fi creata si initializata cu valoarea
specificata prin expr_2.DEFAULT nu are efect asupra campurilor dintr-un fisier.Daca nu exista
clauza DEFAULT si variabila specificata dupa GET nu exista, va apare o alerta cu mesajul
“Variable <variabila> not found”.Daca DEFAULT apare dar variabila specificata dupa
GET exista, DEFAULT este ignorat.
MESSAGE expr_car1 Are ca efect afisarea mesajului expr_car1 pe ultima linie a ecranului, atunci cand cursorul este
pozitionat pe GET-ul respectiv.
RANGE
Expr_3,expr_4 Poate fi utilizat cu variabile de tip caracter, numeric sau data pentru a specifica un domaniu de
valori permise.Daca valorile introduse nu se incadreaza in domeniul precizat,va apare un
mesajde eroare care va indica domeniul permis.verificarea domeniului se face doar in cazul
modificarii valorii variabilei precizate prin GET; daca ea ramane neschimbata(se tasteaza
ENTER),clauza RANGE nu are efect.
WHEN expr_log2 Permite sau nu accesul la GET in functie de rezultatul evaluarii expresiei logice expr_log2.Daca
expresia returneaza (.T.), este permis accesul la GET; in caz contrar cursorul se deplaseaza pe
GET-ul urmator.
VALID expr_log1 Permite validarea intrarii .Expresia logica expr_log1 este evaluata la fiecare iesire dintr-un
GET .Daca dupa evaluare expresia logica returneaza (.T.) , valoarea introdusa este
considerata corecta si se trece la citirea unei noi valori.In caz contrar, valoarea introdusa este
considerata incorecta , va apare un mesaj care va cere sa introduceti o alta valoare dupa ce
tastati un SPATIU (sa dispara mesajul de eroare), si nu se avanseaza la o alta citire decat
dupa introducerea unei valori corecte sau tastand ESC .
ERROR expr_car2 Permite specificarea de catre utilizator a mesajului de eroare care se va afisa atunci cand
conditia specificata dupa clauza VALID este falsa.
COLOR SCHEME
Expr_num \ COLOR

535
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Lista_culori Daca nu se include clauza COLOR , culorile folosite de @ ... GET sunt determinate de
schema de culori pentru fereastra principala FOXPRO care este ecranul.
Se pot specifica explicit culorile fie precizand numarul unei scheme de culoare prin clauza
COLOR SCHEME fie indicand un set de perechi de culori prin clauza COLOR.

In tabelul urmator sunt prezentate perechile de culori folosite de @ ... GET.

Perechea de culori Zona afectata

1 zona de afisare SAY


2 zona de editare
5 mesajul din clauza MESSAGE
6 zona de editare a GET-ului selectat

Exemplu:
Virsta=0
An_nastere=0
Rasp=.F.
@ 5,5 say “Introduceti virsta:” get virsta;
pict “999” range 0,120
@ 6,5 say “Anul nasterii:” get an_nastere;
pict “9999” valid an_nastere<=year(date ( ) )
@ 7,5 say “Raspunsurile sunt corecte? (Y/N) “;
get rasp pict “Y”
read

Instructiunea READ ,activeaza obiecte create prin @ ... GET.


Cand READ este activa ,puteti tasta ENTER,TAB sau sagetile sus-jos pentru a trece de la un obiect la altul Mutarea de la un
obiect la altul se face in ordinea in care acestea sunt plasate in program.Cand lucrati cu mouse-ul,
puteti selecta un obiect printr-un click pe mouse dupa ce v-ati pozitionat pe obiectul dorit.
Introducerea textului intr-un obiect GET ,respecta regulile de editare a textelor cunoscute.Iesirea dintr-un READ se
face in mai multe feluri:
1. Deplasand cursorul in fata primului GET ,
2. Deplasand cursorul dupa ultimul GET ,
3. Tastand ESC ,
4. Tastand CTRL+W.

Pentru a anula initierea proceselor de citire de variabile ,proces lansat prin secvente de GET-uri ,programatorul
poate folosi instructiunea CLEAR GETS.Acesta are ca efect invalidarea tuturor secventelor @ ... GET ,anterioare ei .Pot fi
initiate in continuare noi procese de citire de variabile.

Exemplu:
Program pentru introducerea datelor pprin dialog cu utilizatorul intr-o baza de date MARFURI ,.cu structura:
COD_MARFA Numeric 11
DEN_MARFA Character 30
UM Character 3
PRET Numeric 11 2
INFO Character 40

Imaginea ecranului pentru introducerea de date este cea din figura urmatoare:

Program ADAMARFA. PRG -- adauga marfuri in catalog


set talk of
set color of scheme 1 to w+/b,n/bg
@ 0,0 clear to 24,79
@ 0,0 to 3,79 double
@ 1,2 say “Curs FOXPRO”
@ 2,1 say padc(“Exemplu – Program adãugare ; articole intr-o BD”,78)
USE mãrfuri
adaug=.t.
do while adaug
set color of scheme 1 to n/bg,w+/r
@ 4,0 clear to 20,79
@ 4,0 to 20,79
@ 5,2 say “Adãugare mãrfuri”
mcodm=0
mdenm=space(30)
minfo=space(40)
mun=space(3)
mpret=0.00
set color of scheme 1 to w+/b,n/bg

536
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

@ 6,11 clear to 13,69


@ 6,11 to 13,69
@ 6,25 say “Informatii despre marfã”
Comenzi care folosesc operatori relationali

Copy to – unde se copiaza din tabela activa


Fields < ce cimpuri > for < conditie de copiere>
While<pana cand>Tipe>extensia unde copiez>
OBS.1:baza de date din care se ia informatiile trebuie deschise.Regasirea de date in mai multe
tabele si concentrarea lor intr-o noua tabela se face asa:
SELECT*/<campuri>FROM<tabelele de unde se iau toate campurile sau doar cele
numite>[INTO<noua tabela unde se pun >TO FILE<nume fisier unde se pun >/Toprinter?TO screen]
WHERE<filtrul de selectie al inregistrarilor>[UNION<o noua comanda selectata pentru ao
combina cu cea curenta>] [ORDER BY < ordonarea si selectarea dupa acest criteriu>].
Pentru legarea a doua tabele acestea trebuie deschise in doua zone diferite si indexate dupa un camp
comun cu comanda:
JOIN WITH< tabela din alta zona , nu cea curenta>TO< tabela unde se pun campurile din cele
doua tabele conectate>[FOR <campul comun din cea curenta = tabela_din_cealalalta _zona;campul
comun>] [FIELDS< campurile care se copiaza , iar cele care nu se afla in zona curenta se specifica si
denumirea bazei de date>]
Sortarea unui tabel se face asa:
SORT TO<numele_tabelei_care va fi deja rezultatul sortarii>ON<campul de sortare >[/ A] [_D]
[C] [ASCENDING] [DESCENDING] [FOR<conditie>] [WHILE<pana cand>] FIELDS<campurile care se
pun la tabela ce va fi rezultatul sortarii>]

Obs.2:tabela sortata va trebui la randul ei deschisa si listata.


Totalizarea unui camp (indexat pentru a fi unic ),adica insumarea valorilor din camp se face asa:
TOTAL TO<numele tabelei unde se pune totalul>ON<campul indexat pentru ca valorile sa fie
unice>[FIELDS<campurile din tabela initiala care se totalizeaza>][FOR<conditii de totalizare>]
[WHILE<pana cand>].

8.1 MODUL DE LUCRU PROGRAMAT.CREAREA FISIERELOR .PRG

COMUNICATIA INTRE PROCEDURI

Crearea fisierelor .prg se realizeaza sciind in ferastra command MODI COMM NUME_FISIER
Procedura apelanta poate beneficia de rezultatele procedurii apelate prin parametrii rezultanti cu
comanda: DO < numele fisierului apelat > [ WITH ]
{<ce rezultate transmite la apelant > [ IN< numele fisierului in care se {apeleaza fisierul si in cadrul
caruia se executa>]
Obs1: avem parametrii globali:
-de intrare (cei care se prelucreaza si se dau in programul apelant efectiv)
-de iesire (rezultatele care se folosesc in programul apelant si sunt evaluate aici)
*parametrii locali (care nu folosesc in programul principal dar sunt rezultate necesare local)
Parametrii locali sunt definiti in procedura apelanta si contin rezultatele obtinute si nu sunt recunoscute
decat in procedura iar comenzile sunt :
{PRIVATE<.lista variabila memorie>

537
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

{PRIVATE ALL [LIKE<conditie </ EXCEPT< conditie complementara< ]


Parametrii globali sunt definiti in procedura apelanta si se declara asa :
PUBLIC< lista variabila de memorie >
PUBLIC [ ARRAY ]<numele tabloului >(<nr. de linii , nr. de coloane>)

TRANSFERUL INFORMATILOR INTRE PROGRAME

Pentru a utiliza aceleasi nume de variabile ,atat in programul apelat cat si in programele
apelate,programatorul are posibilitatea de a declara variabile private (locale) prin instructiunea:

PRIVATE lista_de_variabile
Sau

PRIVATE ALL\LIKE sablon\EXCEPT sablon\

Instructiunea poate mentiona variabile care se exclud din lista si care sunt deci variabile
globale. Optiunea ALL permite definirea tuturor variabilelor ca variabile locale
Pentru ca o variabila sa fie utilizata in acelasi fel de mai multe programe (variabila sa fi
purtatoare de informatie intre programele care se apeleaza),ea trebuie sa fie declarata variabila
publica printr-o instructiune:

PUBLIC lista_de_variabile

Toate variabilele continute in lista_de_variabile din declaratia de mai sus devin publice
(globale);cade in sarcina programatorului controlul corect al valorilor care se atribuie acestor
variabile in cursul derularii programelor.

PROCEDURI

Un caz particular de prgrame sursa sunt acele programe care contin secvente executabile
delimitate in proceduri .Din punctul de vedere al editorului de texte ,procedurile se editeaza la fel ca si
programele . fisierul de proceduri este un fisier de tip .PRG.

Procedurile sunt delimitate de cuvantul de PROCEDURE urmat de numele procedurii (nume


valid FOX PRO,maximul 10 caractere ,litere, cifre si liniuta de subliniere) si se termina prin cuvantul
RETURN.Dupa numele proceduri este obligatoriu sa se specifice parametrii procedurii respective .

Lista de parametri contine atat parametrii de apel ai procedurii, care sunt transmisi de la
programul apelant, cat si paremetrii care contin valorile pe care le returneaza procedura. In particular
procedura poate sa nu returnze nimic ,si poate fi apelata fara parametrii (actioneaza asupra variabilelor
globale sau a mediului de lucru .paremetrii procedurii se specifica printr-o instructiune :
PARAMETRES lista _de_parametrii
Orice procedura poate fi apelata numai dupa activarea fisierului care contine procedura.Activarea
fisierului de proceduri se face cu instructiunea SET PROCEDURE TO nume fis_procedurii
Lansarea in executie a procedurii se face prin programul apelant asemanator cu lansarea in executie a
oricarui program dar este necesara specificarea suplimentara a parametrilor.Paramatrii de apel ai
procedurii se specifica la lansare ,astfel :
DO nume procedura [WITH lista_de _parametri]
Numarul de parametrii din declaratia PARAMETER aflata in corpul procedurii trebuie sa fie
identic cu numarul de parametrii din instructiunea de apel a procedurii.
Fisierul de proceduri prezentat contine trei proceduri care au numele UNU ,DOI si
SALAR.Fiecare procedura are specificata lista de parametrii necesari pentru executia procedurii in
cauza si se termina cu instructiunea RETURN.Procedurile se vor apela independent din priogramul
principal sau din alte programe ;fiecare declaratie de tip Procedure va reprezenta un punct de intrare in
program .Instructiunea Return determina iesirea din fisierul de proceduri ,transferul valorilor spre
programul apelant si executia urmatoarei instructiuni ,aflate imediat dupa apelul procedurii.
Programul de mai sus apeleaza proceduirile din fisierul de proceduri.Programatorul poate avea mai
multe fisiere de proceduri ,dar la un moment dat numai un singur fisier de proceduri este activ.Orice

538
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

instructiune de forma :
SET PROCEDURE TO fis_de_proceduri

Inchide fisierul din proceduri anterior deschis si-l activeaza pe cel specificat prin fis_de_proceduri
Fisirul de proceduri se inchide cu una din comenzile :
SET PROCEDURE TO
sau
CLOSE PROCEDURE.

IV. COMENZI PENTRU REALIZAREA GRAFICII.


{ DEFINE BOX FROM < coloana stanga > TO <coloana dreapta >
HEIGHT < inaltimea > [ AT LINE < nr. liniei cu care incepe desenarea ariei >]
[ SINGLE/ DOUBLE/ < caractere bordura pentru chenar >]

{@ < linie stanga sus , coloana stanga sus , linie dreapta jos , coloana dreapta jos> BOX <
caracterul cu care se face chenarul >

{@< linie stanga sus , coloana stanga sus> TO <linie dreapta jos , coloana dreapta jos >
[ DOUBLE / PANEL / <caracter pentru bordura >]
[ PATTERN < fundal >]

CREAREA MENIURILOR VERTICALE:


{ DEFINE POPUP < nume meniu vertical > FROM < linie stanga sus
coloana dreapta jos>] [ IN [ WINDOW ] < numele ferestrei in care apare meniul > / IN SCREEN ]
[ FOOTER < titlu pentru meniu >] [ KEY < combinatia de taste cu care se selecteaza > ] [ MARGINT ]
[ MARK < caracterul care apare in fata optiunii cand e selectata > ] [ MESSAGE < mesajul care apare
cand selectezi meniul >] [ MOVER ] [ MULTISELECT] [ PROMT FIELD < camp dintr-o baza de date ce
va fi meniu> ] [PROMPT FILES LIKE < conditia din ce director , cu ce extensie se iau fisiere ce o sa
apara in meniu> ] [ SHADOW ] [ TITLE < titluri in partea superioara a ferestrei > ] [ COLOR SCHEME <
nr. schemei > / COLOR < lista de culori > ]
In cadrul meniurilor verticale se definesc meniurile bar astfel :

DEFINE BAR < nr. asignat optiunii din meniu > OF < numele meniului vertical din care mai face parte >
PROMPT < mesajul intre ghilimele care apare ca submeniu > [ BEFORE <
plasarea meniului bar actual in fata barului cu nr. sau numele spus aici ]
[ KEY < combinatie de taste pentru selectie > ] [ MARK < caracterul din fata]
[MESSAGE<mesajul care apare la selectia submeniului>] [SKIP[FOR<o
coloana prin care este inclusa sau nu optiunea de submeniu in cadrul
meniului vertical >][COLOR<lista de culori >COLOR SCHEME<nr. schemei
>.]Crearea unui meniu orizontal se face asa:{DEFINE MENU <nume meniu
orizontal >[BAR AT LINE<nr. liniei unde imi apare meniul pe ecran >]
[IN[WINDOW<numele ferestrei unde imi apare meniul >][IN SCREEN]
[KEY<combinatia de taste cu care se activeaza >][MARK<caracterul care
apare in fata lui cind e selectat >][MESSAGGE<un mesaj cind e selectat >]
[NOMARGIN][COLOR<lipsa de culori > /COLOR SCHEME <schema>In
cadrul meniurilor orizontale se definesc submeniurile.;
Aplicatii de meniuri

PROGRAM . PRG.

Definire menu linie


Definire pad pad1 of linie prompt “/<cont”at 0,5
Definire pad pad2 of linie prompt “/<note “ at 0,18
Definire pad pad3 of linie prompt “/<abandon” at 0,35
On pad pad1 of linie activate popup popcont

539
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

On pad pad2 of linie activate popup popnote


On pad pad3 of linie activate popup popaband
Define popup popcont title “conturi” shadow
Define bar 1 of popcont prompt “\<adãugare”
Define bar 2 of popcont prompt “\<modificare”
Define bar 3 of popcont prompt “\<stergere”
Define bar 4 of popcont prompt “\<listare”
Define bar 5 of popcont prompt “\listare “ skip
Define bar 6 of popcont prompt “iesire în \<FOX”
On selection popup popcont do proced
Define popup popnote title “note” shadow
Define bar 1 of popnote prompt “\<adãugare”
Define bar 2 of popnote prompt “\<modificare”
Define bar 3 of popnote prompt “\<stergere”
Define bar 4 of popnote prompt “\<listare “
Define bar 5 of popnote prompt “\<listare “ skip
Define bar 6 of popnote prompt “iesire în \<FOX”
On selection popup popnote do proced 2
Define popupp popband title “abandon” shadow
Define bar 1 of popband prompt “iesire în \<FOX”
Define bar 2 of popband prompt “iesire în” skip
Define bar 3 of popband prompt “iesire în \<DOS”
On selection popup popband do proced 5
Activate Menu Line

MENIURI . PRG

Define Menu Fructe


Define pad f1 of fructe prompt ”\<deschidere>” mark chr(3)
Define pad f2 of fructe prompt “\<modificare>” mark chr(4)
Define pad f3 of fructe prompt “\<listare >” mark chr(5)
Define pad f4 of fructe prompt “\<adãugare >” mark chr(6)
Define pad f5 of fructe prompt “\<iesire>” mark chr (7)

@ 12,5 say “Ati ales”


On selection pad f1 of fructe do deschidere
On selection pad f2 of fructe do modificare
On selection pad f3 of fructe do listare
On selection pad f4 of fructe do adãugare
On selection pad f5 of fructe do iesire
Activate Menu Fructe
Procedure deschidere
Use ?
Return
Procedure modificare
Browse
Return
Procedure listare
List
Return
Procedure adãugare
Append
Return
Procedure iesire
Quit
Return

540
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

8.1 MODUL DE LUCRU PROGRAMAT


STRUCTURI DE CONTROL IN PROGRAMARE

Atribuirea <variabila>=<expresie>
STORE<valoarea>TO<variabilele ce iau valoarea specificata>
Comenzi de afisare pe ecran
?/??[<expresia ce se evalueaza si rezultatul il pune pe ecran>] [PICTURE<formatul afisajului>]
[AT<coloana unde se face afisarea>] [FONT<numele si marimea fontului>] [STYLE<stilul scrisului>].
???<evaluarea expresiei ce se va lista la imprimanta>. Afisarea la anumite coordonate de linie si
coloana se face asa:
@<linie,coloana>say<intre ghilimele se pune mesajul ce se va tipari>[PICTURE<cate caractere sa fie
si cum>] [FUNCTION<conditie valabila pentru toate caracterele>] [FONT<nume
font,marimea>]STYLE<stilul de litera>] [COLOR<lista de culori pentru font>]
Editarea variabilei unde se memoreaza raspunsul la mesajul@…say…de mai sus se face
asa:@<linie,coloana>GET<numele variabilei in care se editeaza>analog ca mai sus[ENABLE ?
DISABLE] [DEFAULT] [MESSAGE<mesajul la introducerea valorilor>[RANGE<minim,mazim pantru
variabila>] [SIZE<inaltime,latime pentru editare>] [VALID<conditia pentru camp>] [ERROR<mesajul de
eroarecand nu e indeplinita conditia din campul de la clauza valida] [WHEN<unul di campuri
indeplineste o anumita conditie>] [COLOR SCHEME<numar>]

Comanda @…GET… este urmata de asteptarea introducerii valorilor cu comanda de


citire :READ[CYCLE][ACTIVATE<ce fereastra activez cand fac introducerea datelor>]
[WITH<denumirea ferestrei>] [SHOW<readuc pe ecran campul implicat in conditia logica de
activare a ferestrei >] [WHEN<se accepta introducerea ce indeplinesc conditia de aici >]
[OBJECT<al catalea obiect va fi activat in comanda de citire initial>] [LOCK/ NOLOCK]
[COLOR<lista culori >]
Crearea de liste din elemente ale FOXPRO-ului adica din popupuri sau din baze de date se face
asa:structure este identica cu cea de la@…get dar mai apar in plus [FROM < numele tabloului de unde
se iau elementele ce se pun in lista >] [RANGE <minim,maxim>| POPUP<nume meniu popup de unde
se iau elementele>] obs 3:La meniurile verticale apare clauza ^ in operatiunea FUNCTION si e inclus
simbolul intre ghilimele.Crearea de comutatoare,butoane invizibile,butoane radio se poate face cu
aceeasi structura ca si @…get…cu deosebirea ca ,in clauza RANGE<inaltimea,latimea butonului > iar
in clauza FUNCTION intre ghilimele:*C pentru comutator,*R pentru butoane radio,*I pentru invizibile si
cu optiunile immediate:H pentru orizontal,V pentru vertical.
Campurile memo se editeaza intr-o zona rectangulara speciala,comanda este cu aceleasi optiuni ca
@…GET…dar cuvantul GET este inlocuit cu EDIT.
Introducerea datelor de tip caracter (sau numeric) se face cu comenzile:
ACCEPT< intre ghilimele se cere introducerea unei date de tip caracter >TO< variabila unde se
memoreaza >
INPUT< intre ghilimele se va cere introducerea unei date de tip numeric) TO<variabila unde se
memoreaza>
3) Structura alternativa: IF<conditia>
simpla comenzi
[ELSE comenzi]
ENDIF
Cu mai multe ramuri DO CASE
CASE<conditia 1>
<comanda 1>
CASE<conditia 2>
<comanda 2>

OTHER WISE
Comanda
END CASE
4) Structura repetitiva
DO WHILE<conditie indeplinita>

541
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

<executa comanda>
[LOOP] -se reia comanda do while
[EXIT]-iesire fortata din ciclu
ENDDO
FOR <variabila ce ia valori>=valoare initiala TO finala
<comanda>
[EXIT]
[LOOP]
ENDFOR /NEXT
Pentru parcurgerea unei table
SCAN [domeniu] [FOR<conditie>] [WHILE<pana cand>]
<comenzile>
[LOOP]
[EXIT]
ENDSCAN

ELEMENTE DE GRAFICA
Ferestre in Fox Pro

Ferestrele utilizator sunt singurele ferestre spre care poate fi redi-

rectata afisarea si se pot crea doar prin comanda DEFINE WIN-


DOW.
Ferestre utilizator nu cuprind ferestre “Browse” ferestre sistem,
ferestre de editare , ferestre de proiectare rapoarte ,etc.
Prin comenzile create ,sau Modify Comand,report Label si File se afiseaza ferestrele al caror nume
deriva din numele fisierului creat sau modificat .

Crearea ferestrei utilizator

DEFINE WINDOW nume_fereastra _1

FROM lin_1,col_1 to lin_2,col_2


|IN (WINDOW) nume fereastra_2 |IN SCREEN|
|FOOTER expr_car1| |TITLE expr_car2|
|DOUBLE|PANEL|NONE|
SYSTEM|sir_caracter_ bordure|
|CLOSE|NOCLOSE|
|FLOAT|NOFLOAT|
|GROW|NOGROW|
|MINIMIZE|
|SHADOW|
|ZOOM |NOZOOM|
|FILL exr_cas3|
|COLOR SCHEME exp_nume|COLOR

Activarea unei ferestre utilizator

Activare Window|nume_fereastra_1|nume_fereastra

542
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

|BOTTOM|TOP|SAME||NOSHOW|

Clauze Semnificatia
Nume_ fereastra_1 Reprezinta ferestrele care ur-
Nume_fereastra_2 meaza sa fie activate.
ALL Activeaza toate ferestrele
definite.
|N|WINDOW Plaseaza fereastra activata
nume_fereastra_n pe ecran.
BOTTOM|TOP| Controleaza locul unde
SAME ferestrele activate sunt plasate

Relativ la ferestrele activate an-

terior.
NOSHOW Dicteaza iesirile catre fereastra

utilizator fara a o face vizibila

Dezactivarea unei ferestre utilizator.


Folosim comanda DEACTIVATE WINDOW
DEACTIVATE WINDOW nume_fereastra
nume_fereastra_2…||ALL
Clause Semnificatia
Nume_fereastra_1 Reprezinta ferestrele care vor
Nume_fereastra 2 fi dezactivate
ALL Dezactiveaza toate ferestrele
definite

Stergerea de pe ecran a unei ferestre

HIDE WINDOW nume_fereastra_1|,

Nume fereastra_2 ..||ALL

|IN |WINDOW|nume_fereastra_n|SCREEN|SAVE|

Clauze Semnificatia

Nume_fereastra_1 Reprezinta ferestrele care vor fi

Nume_fereastra_2 ascunse.

ALL Ascunde toate ferestrele

IN|WINDOW Specifica o fereastra parinte care


Nume_fereastrele_n contine fereastra fiu ascunsa.
IN|WINDOW| Plaseaza fereastra activa pe ecran

543
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

SCREEN
SAVE Plaseaza imaginea ferestrei pe
ecran sau intr-o alta fereastra
dupa ce a fost ascunsa .

Plasarea pe ecran a unei ferestre definite anterior

Clauze Semnificatia
Nume_fereastra_1 Reprezinta ferestre care vor fi
Nume_fereastra_2 plane pe ecran.
ALL Plaseaza toate ferestrele pe ecran
IN|WINDOW| Fereastra este deschisa in interiorul.
Nume_fereastra_n unei ferestre parinte fara a prelua
insa caracteristicile acesteia.
IN SCREEN Permite amplasarea explicita a
frerestrei pe ecran si nu in interioru
altei ferestre.
REFRESH Clauza se foloseste pentru a redese-
na o fereastra ‘BROWSE’.
TOP Plaseaza fereastra in fata tuturor
celorlalte ferestre afisate
BOTTOM Plaseaza fereastra in spatele tutu-
ror ferestrelor afisate.
SAME Afecteaza numai ferestrele care au
afisate sau activate anterior si apoi
prin DEACTIVATE WIND
Clauze Semnificatia
SAVE Pastreaza imaginea ferestrei pe ecran
sau intr-o alta fereastra dupa ce fe-
reastra a fost ascunsa.

Mutarea ferestrelor
Comanda MOVE WINDOW
MOVE WINDOW nume fereastra TO lin,col
|BY expr_num 1.expr_num 2
Clauza Semnificatia
Nume fereastra Numele ferestrei care se muta
TO lin ,col Muta fereastra in pozitia deter-
minata de coordonatele lin si col
BY expr _num1 Muta fereastra intr-o pozitie re-Expr_num2
lativa fata de pozitia curenta
expr_num1 respectiv expr_num2
specifica numarul de linii res-
pectiv coloane cu care se depla-
Seaza fata de pozitia curenta.
GENERATORUL DE MACHETE ECRAN

Stabilirea caracteristicilor globale ale ecranului

Dupa ce a fost pornit generatorul de ecrane,vom stabili unde vor aparea obiectele pe ecran in timpul
executiei programului generat in acest caz
existand doua posibilitati :pe ecranul FoxPro sau in ferestre plasate in

544
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

Pentru ca ,dupa generare ,obiectele sa apara pe ecranul FoxPro,se


realizeaza urmatoarele operatii :

-se alege operatiunea Screen Layout ...(aspectul ecranului )din sub-


meniul Screen,ceea ce va avea ca efect deschiderea unei ferestre de
dialog avand acelasi nume ;
-in interiorul acesteia se selecteaza butonul radio Desktop,specificandu-se
astfel ca obiectele vor aparea pe ecranul FoxPro .
Modificand continutul casutelor text din sectiunea Size :(marime ) ale a-
cestei ferestre de dialog ,se delimiteaza aria de pe ecran in care vor fi afisate
obiectele,dar nu vor fi modificate dimensiunile ecranului FoxPro.
Daca se doreste ca obiectele definite sa apara intr-o fereastra distincta ,
plasata in fata ecranului FoxPro,se alege butonul radio Window din fereastra
de dialog Screen Layout. In acest caz, modificand continutul casutelor text
din sectiunile Size:,pot fi specificate dimensiunile ferestrei dupa cum urmeaza:
-in casuta text Height:(inaltime) se specifica numarul de linii pe care se va intinde fereastra;
-in casuta text Width: (va fi precizat numarul de coloane pe care le va ocupa fereastra;
In mod implicit,dimensiunile acesteia coincid cu cele ale ferestrei de
configurare a ecranului, dar le pot chiar depasi. Specificarile facute in ca-
sutele text Row: (linie) si Column:(coloana)din sectiunea Position:(pozitie),
indica pozitia fata de coltul din stanga sus al ecranului in care va aparea fe-
reastra, in timpul executiei programului ce va fi generat.
Modificand continutul casutelor text aflate sub butonul radio Desktop,
se pot specifica cateva caracteristici ale ferestrei, dupa cum urmeaza:
-Name (nume)- numele ce va fi atribuit ferestrei;
-Title(titlu)- sir de caractere care va fi afisat in centrul imaginii superioa-re a ferestrei;
-Footer(text de subsol)- sir de caractere care va fi afisat in centrull si caracteristicile ferestrei in care
vor aparea obiectele se specifica prin inferioare a ferestrei.

Tipul si caracteristicile ferestrei in care vor aparea obiectele se spe-


cifica prin intermediul ferestrei de dialog Window Type(tipul ferestrei):
-din fereastra de dialog Screen Layout se alege declansatorul <Type...>
(tip), ceea ce va avea ca efect deschiderea ferstrei de dialog Window Type
(tipul ferestrei);
-din lista ascunsa Type, aflata in partea superioara a acesteia, se alege
tipul de fereastra dorit, lista acestora fiind prezentata in tabelul urmator:

In cazul ferestrei de tip User, pot fi specificate caracteristicile acesteia


folosid comutatoarele si butoanele radio din sectiunile Attributes(atribut) si
Border(chenar), care au urmatoarele semnificatii:
-Close (inchisa)- poate fi inchisa;
- Float (mobila)- poate fi mutata;
- Shadow,nonepanel,single,double…
OBIECTE DE CONTROL SI LISTE

545
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

OBIECTE

LISTE

PROPRIETATI ALE
FORMULARELOR(MACHETELOR
ECRAN)

ASPECTE LUATE PRIN COMPARATIE INTE FOXPRO SI VIZUALFOX.


CONSTRUCTIA EVALUATOARELOR PE
CALCULATOR(LA OLIMPIADE SI CONCURSURI)
{$n+}
program eval_permanent;
{
Parametrii :
1 - fisier de intrare
2 - fisier iesire comisie
3 - fisier iesire concurent
4 - numarul testului
}

const pct:array[1..10] of integer=(10,10,10,10,10,10,10,10,10,10);

var pt:real;
i,n:longint;
cod,j,m,maxp:integer;
www:byte;
fi:text;
a:array[0..100,0..100] of integer;
{$I PUNCTAJ.inc}

procedure eroare(s:string;p:real);
begin
writeln(s);
punctaj(paramstr(4),p);
halt;
end;

procedure date;
var i,j:integer;
begin
assign(fi,paramstr(1));
reset(fi);
readln(fi,n);
for i:=1 to n do
begin
for j:=1 to n do
begin

546
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

read(fi,a[i,j]);
if a[i,j]=1 then a[i,j]:=-1;
end;
readln(fi);
end;
close(fi);
end;

procedure calcul;
var i,j,b,k:integer;
begin
maxp:=0;
k:=0;
for i:=1 to n do
for j:=1 to n do
if a[i,j]<>-1 then
begin
b:=a[i-1,j];
if b>a[i,j-1] then b:=a[i,j-1];
if b>a[i-1,j-1] then b:=a[i-1,j-1];
if b<>-1 then
a[i,j]:=b+1
else a[i,j]:=1;
if maxp=0 then
begin
maxp:=b+1;{l1:=i;c1:=j;}
end
else
if maxp<b+1 then
begin
k:=0;
maxp:=b+1;
{l2:=l1;
c2:=c1;
l1:=i;
c1:=j;}
end
else
if maxp=b+1 then
begin
k:=1;
{l2:=i;
c2:=j;}
end;
end;
end;

function verific(l,c:integer):boolean;
begin
verific:=true;
if a[l,c+maxp-1]<>maxp then verific:=false;
end;

procedure citire;
var f,g:text;l,c,i,j,lc,cc,max,maxc,nr,nrc:integer;
x:array[1..100] of integer;
ok:boolean;
begin
date;
calcul;

547
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

assign(f,paramstr(2));
assign(g,paramstr(3));
reset(f);
{$I-}
reset(g);
{$I+}
if ioresult<>0 then eroare('Fisier de iesire inexistent!',0);
readln(g,max);
readln(f,maxc);
if max<>maxc then
eroare('Latura diferita!',0);
if seekeof(g) then
eroare('Lipseste nr. solutiilor!',0);
readln(g,nr);
readln(f,nrc);
if nr<>nrc then
eroare('Nr. solutiilor diferit!',0);
if seekeof(g) then
eroare('Lipsesc coordonatele!',0);
for i:=1 to nrc do
begin
readln(g,l,c);
readln(f,lc,cc);
if not verific(l,c) then
eroare('Coordonate gresite!',0);
if seekeof(f) then
if not seekeof(g) then
eroare('Nr. diferit de coordonate in fisierele soluie concurent
si comisie!',0);
if not seekeof(f) then
if seekeof(g) then
eroare('Nr. diferit de coordonate in fisierele soluie concurent
si comisie!',0);
end;
eroare('Corect!',10);
close(g);
close(f);
end;

begin
pt:=0;
val(paramstr(4),www,cod);
citire;
end.
EXEMPLU :
program verif;
var f:text;
c,e:array[1..40] of byte;
i,n:byte;s,ss,x:integer;
stri:string;
procedure error(a:string);
begin
writeln(a);halt
end;
begin
assign(f,'caramele.in');reset(f);
readln(f,n);s:=0;
for i:=1 to n do begin read(f,c[i]);s:=s+c[i] end;
close(f);
assign(f,'caramele.out');{$I-}reset(f);{$I+}
if ioresult<>0 then error('Fisier de date inexistent');

548
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

i:=0;ss:=0;
while not seekeof(f) do begin
{$I-}read(f,x);{$I+}
if ioresult<>0 then error('Date nenumerice');
if (i<0)or (i>n) then error('Indice incorect');
if e[x]=1 then error('Punguta duplicat');
e[x]:=1;ss:=ss+c[x];inc(i)
end;
if i<> n div 2 then error('Numar diferit de pungute pentru
L/B');
str(abs(s-2*ss),stri);
error('Date valide. Diferenta obtinuta='+stri)
end.
{$n+}
program eval_permanent;
{
Parametrii :
1 - fisier de intrare
2 - fisier iesire comisie
3 - fisier iesire concurent
4 - numarul testului
}

const pct:array[1..10] of integer=(10,10,10,10,10,10,10,10,10,10);

var pt:real;
i,a,b,n:longint;
cod,j,m:integer;
www:byte;
{$I PUNCTAJ.INC}

procedure eroare(s:string;p:real);
begin
writeln(s);
punctaj(paramstr(4),p);
halt;
end;

procedure citire;
var f,g:text;x,y:char;
begin
assign(f,paramstr(2));
assign(g,paramstr(3));
reset(f);
{$I-}
reset(g);
{$I+}
if ioresult<>0 then eroare('Fisier de iesire inexistent!',0);
{$I-}
while not eof(f) and not eof(g) do
begin

while not eoln(f) and not eoln(g) do


begin
read(f,x);
read(g,y);
if (x<>y) then eroare('Incorect',0);
if ioresult<>0 then break;
end;
if eoln(g) and not eoln(f) then eroare('Fisier incomplet',0);

549
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

while not eoln(g) do


begin
read(g,y);
if y<>' ' then eroare('Fisier de iesire cu format incorect!',0);
end;
readln(f);
readln(g);
end;
if ioresult<>0 then eroare('Fisier de iesire cu format
incorect!',0);
eroare('Corect',pct[www]);
close(g);
close(f);
end;

begin
pt:=0;
val(paramstr(4),www,cod);
citire;
end.
Unit Timer;

Interface

Function Ms: LongInt;


Function Seconds:longint;

Implementation

Uses Dos;

Function Ms: LongInt;


Var
Hour, Minute, Second, Sec100: Word;
LHour, LMinute, LSecond, LSec100: LongInt;
Total : LongInt;

Begin
Gettime(Hour, Minute, Second, Sec100);
Lhour := Hour;
Lminute := Minute;
LSecond := Second;
Total := Sec100;
Total := Total + (LSecond * 100);
Total := Total + ((LMinute * 60) * 100);
Ms := Total + (((LHour * 60) * 60) * 100);
End;

Function Seconds:longint;
{ returns number of 1/100 s since midnight }
var dostime:record t,s,m,h:byte end;
begin
asm
mov ax, 2c00h
int 21h
mov word ptr dostime.m, cx
mov word ptr dostime.t, dx
end;
with dostime do
Seconds:=(longint(h*60+m)*60+s);

550
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

end;

End.

CUPRINS

Prefata…………………………..……………………………………………………………..1
Exemple de roboti………….………………………………………………………………….2
Structura robotilor…………………………………………………………………………..…5
Sistemul mecanic al robotului…….……………………….………………………………..…
33
Sistemul de actionare si comanda la roboti……………………………………………………
39
Senzori…………………………………………………………………………………………
48
Aplicatii roboti ficşi si mobili in
industrie……………………………………………………..62
Constructia electronica a unui robot……….………………………………………………...…
93

Limbajele Pascal si C++ in paralel…………………………………….………………..…...…


101

Cuprins……………………………………………………………………………………...…
117

551
Rezolvarea temelor pentru concursurile de titularizare si grade didactice in informatica
Prof.Bogdan Constantin

552

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