Sunteți pe pagina 1din 155

TEMA 1)

Sistem de calcul .Comenzi uzuale


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.

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ă 1, care nu-şi pierd conţinutul
atunci când sistemul de calcul este oprit. Exemple de suporturi de memorie externă:

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

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


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

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


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

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


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

 display (monitor)
 imprimanta
 plotter.

1.2 Unitate centrală: componente, funcţii


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

Un calculator e compus din 5 elemente:


1. unitate de intrare (mouse, tastatura, scanner)
2. unitate de iesire (imprimanta, monitor)
3. unitate centale de prel (cpu)
4. memoria

1
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).
5. reteaua de comunicatie sau magistrala de comunicatii (bus) care interconecteaza toate
elementele sistemului si conecteaza sistemul cu exteriorul.

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

Structura hardware a calculatorului 

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

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

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

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

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

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

      Extragerea instrucţiunilor din memoria internă;

      Analiza instrucţiunilor;

      Comanda pentru executarea fiecărei operaţii;


      Extragerea datelor de intrare din memoria internă;

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

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

   Dispozitivele periferice de intrare;

   Dispozitivele periferice de ieşire;

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

1.3 Unitatea de memorie :structura si functii


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

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

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

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

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

1.4 Dispozitive periferice


    Cuplarea dispozitivelor periferice. Tipuri de interfeţe    

       Interfaţa ocupă un loc aparte în arhitectura unui sistem de calcul.  Ea poate fi definită ca o
componentă care asigură o conexiune între două elemente, astfel încât acestea să poată lucra împreună.
Componentele electronice care fac ca dispozitivele periferice de intrare-ieşire şi unităţile de memorie
externă să poată comunica cu procesorul sunt interfeţele hardware.  Suportul fizic al comunicării îl
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.
    USB (Universal Serial Bus) este un port serial de mare viteză care suportă până la 127 de
periferice înlănţuite. La un astfel de port se pot cupla dispozitive precum scanner-ul, mouse-
ul, imprimanta, tastatura, unităţi CD-ROM.
    Interfaţa MIDI. Acest tip de interfaţă este utilizat pentru cuplarea tastaturii MIDI sau a
joistick-ului. De obicei portul MIDI este parte componentă a plăcii de sunet.
    Placa de sunet este o interfaţă care permite stocarea sunetelor în format digital şi redarea lor
prin intermediul boxelor. Cuplarea acestei interfeţe se face la magistrale ISA sau PCI.
    Placa video este tipul de interfaţă specifică pentru diverse dispozitive video: monitor,
cameră video, etc. Există plăci video care se pot cupla la magistrale ISA, PCI sau AGP.
    Prin intermediul interfeţei paralele se pot transfera simultan mai mulţi biţi prin fire paralele,
aceasta conducând la creşterea vitezei de transfer faţă de cea obţinută prin interfaţa serială.
Diverse dispozitive se pot conecta la interfaţa paralelă (imprimanta, scanner, CD-ROM, ZIP, 
etc.).
    Gestionarea unităţilor de memorie externă se face prin intermediul controller-elor de discuri.
Controller-ul de dischete constituie interfaţa pentru unitatea de dischetă. Pentru unităţile de
HARD-DISK şi CD-ROM există două tipuri de interfeţe mai uzuale: IDE (EIDE) şi SCSI. 

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

                - o conexiune cu perifericul;

                - o conexiune pe magistrală.

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

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

     

     Placa video

    
   Placa video este “mediatorul” între procesorul “sistemului gazdă” şi dispozitivul de
afişare video, ea realizând prelucrarea finală a informaţiei ce trebuie afişată şi generând,
totodată, comenzile de afişare.
    Dacă prelucrarea realizată de placa video se referă la stabilirea dimensiunilor de
afişare, generare de caractere, operaţii pe zone de pixeli, generarea comenzilor de afişare
face trimitere la informaţia de culoare a pixelilor, semnale de sincronizare pe orizontală
şi verticală (HSYNC si VSYNC).
    
  
 
    Componentele de bază, asociate plăcii video, sunt:
        -memoria video;
        -coprocesorul video;
        -controller-ul de magistrală;
        -controller-ul de atribute;
        -circuitele de conversie numeric/analogică (RAMDAC);
        -generatoarele de tact;
        -video-Bios-ul;
 
 
   În imaginea de mai jos se pot identifica  componentele  unei placi video (care dispune
de TV, FM Tuner şi realizează şi captură video):
 

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

     

Caracteristicile plăcii video


 
       1.Adresabilitatea de pixel        
- este dată de numărul de pixeli pe care placa video îi poate afişa, într-
un anumit mod video. Adresabilităţile standard sunt  cele din tabelul
de mai jos:
Număr mod video
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.
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.
  
 
   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:
        Mai trebuie amintit că odată cu creşterea nivelului de miniaturizare există tendinţa ca şi interfeţele
placă video şi placă de sunet să fie integrate constructiv pe placa de bază, fapt ce înlătură necesitatea
cuplării lor prin sloturi sau conectori. Totuşi, utilizatorul are posibilitatea să dezactiveze o astfel de
interfaţă ("on board") şi să-şi conecteze una externă , mai performantă.

Dispozitive periferice de intrare

 Tastatura

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

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

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

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

Floppy discul

Toate calculatoarele posedă o unitate de citire a discurilor flexibile (Floppy disc). Capacitatea
discurilor flexibile depinde de tipul discului şi densitatea de înregistrare, din acest punct de vedere sunt:
      Discul cu dublă densitate (DD), cu o capacitate de 720 ko;

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

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

Mouse–ul

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


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

      Operaţia de indicare (point);

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

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

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

Compact discul

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

Scannerul 

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

Scannerul este caracterizat de următoarele elemente:

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

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

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

Dispozitive periferice de ieşire

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

Tip monitor Rezoluţie Număr de culori


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

Imprimanta

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

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

Tip Caracteristici Domenii de utilizare


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

- rezoluţie 300 dpi;

- preţ mediu consumabile.


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

- preţ mic consumabile.


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

- preţ mare consumabile.


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

- preţ foarte redus pentru consumabile

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


2.Sisteme de operare
2.1 Concepte de baza si caracteristici ale sistemelor de
operare(structură, funcţii,
elemente de interfaţă)

Sistemul de operare este interfaţa intre hardware-ul calculatorului şi utilizator; este alcătuit dintr-o
colecţie de programe care gestionează resursele calculatorului şi controlează întreaga lui activitate.

Sistemul de operare asigura in principal următoarele funcţii:

      gestiunea resurselor fizice ale calculatorului şi a dispozitivelor periferice;

      gestiunea operaţiilor de intrare/ieşire;

      gestiunea datelor (fişierelor) pe suportul de memorie externă;

      controlul încărcării în memoria internă, punerii în funcţiune şi încetării activităţii pentru
programele utilizator;

      sesizarea evenimentelor deosebite care apar în timpul execuţiei şi tratarea acestor
evenimente (mesaje de erori şi recomandări de rezolvare);

      asigurarea interfeţei cu utilizatorul, accesul acestuia pentru controlul programului,


examinarea stării sistemului.

  Structură
Componentele sistemului de operare:

      nucleul (kernel);

      interfaţa (shell).

Nucleul sistemului de operare conţine programele care gestionează resursele calculatorului şi


controlează activitatea echipamentelor şi a programelor. Primele cinci funcţii menţionate mai sus, sunt
realizate de nucleu.

In continuare sunt prezentate succint funcţiile:


   Gestiunea resurselor fizice (procesorul, memoria internă şi sistemul de intrare/ieşire).
Sistemul de operare ţine cont de volumul de resurse, viteza cu care lucrează fiecare resursă şi
dependenţa funcţională dintre resurse. De exemplu se alocă unui program memorie internă şi
dispozitivul periferic prin care sunt furnizate datele necesare prelucrării.
   Gestiunea operaţiilor de intrare/ieşire la nivel fizic şi logic. La nivel fizic sunt asigurate
operaţiile de intrare/ieşire cu echipamentele periferice prin care se realizează citirea/scrierea
datelor pe suportul de informaţie, acţionându-se direct asupra dispozitivului periferic. Sunt
asigurate operaţiile de intrare/ieşire cu echipamentele periferice la nivel logic. Prin aceste operaţii
se realizează organizarea, accesul, stocarea şi regăsirea datelor pe suportul de informaţie.
Unitatea logica de acces la echipamentele periferice este fişierul.

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

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

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


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.


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

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


“directoare” (pentru sistemul de operare MS-DOS).
Un director poate conţine unul sau mai multe subdirectoare şi, eventual, unul sau
mai multe fişiere, ş.a.m.d. Organizarea informaţiilor în subdirectoare se poate observa în
figura următoare:

c:

autoexec.bat config.sys command.com


Ion Dana BP NC

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


BIN USERS
Alex

a.exe … . tp.exe IXA XIC


Ion XB

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


a.doc b.doc

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:

 
Î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.
 Numele discului
 Calea prin care se ajunge la fişier
 Numele(obligatoriu) şi extensia fişierului.

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

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

Suportul magnetic Calea Numele fisierului Extensia fisierului


(unitatea de disketa a: )

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

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:

 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

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.

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.

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.

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:

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

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


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.
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.
TEMA 3)
PRINCIPIILE PROGRAMARII STRUCTURATE
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…);
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:
- 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ă
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
[]
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 [].
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
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
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
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;
 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;
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
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
[]
Î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.
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:
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ă:
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 :
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 :
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
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 ;
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
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:
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;
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.
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
[]
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
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
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
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.
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

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


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.

TEMA 4)
ELEMENTE DE BAZA ALE LIMBAJULUI PASCAL
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ă
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ă.
4.2 Elemente de bază ale limbajului Pascal
4.2.1 Vocabularul limbajului

Vocabularul oricărui limbaj este format din:


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

4.2.2 Identificatori
Un identificator este o succesiune de litere sau cifre sau caracterul special’_’ din
care primul caracter nu poate fi cifră. Cu ajutorul identificaorilor se asociază nume
constantelor, variabilelor, procedurilor etc.
Exemple de identificatori: a1, tasta, un_numar.
Exemple eronate: 4ar, mt& (primul începe cu o literă , al doilea conţine un
caracter nepermis). O categorie specială de identificatori este dată de cuvintele cheie
ale limbajului(au un înţeles bine definit şi nu pot fi folosite în alte context).
Acestea sunt:
AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,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?
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 ‘$’.
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;
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.

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

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

Tipuri ordinale definite de utilizator


Utilizatorul are posibilitatea să definească două tipuri de date ordinale:
 tipul enumerare;
 tipul subdomeniu.
Pentru definirea unui tip propriu se foloseşte următoarea declaraţie:
type nume_tip=definitie tip
unde:
 prin nume_tip înţelegem numele tipului;
 definiţia tipului este specificată fiecărui tip în parte.
Declaraţia tipurilor este plasată după declaraţiile de constante simbolice(dacă
există)şi precede declaraţiile de variabile.
Tipul enumerare.
A fost prevazut în limbaj în ideea de a scrie programe clare(care să fie uşor
înţelese de o persoană care le analizează). Ce-i drept, se pot scrie toate genurile de
programe şi fără a-l folosi. toate genurile de programe şi fără a-l folosi.
Un tip ordinal, se se defineşte prin scrierea mulţimilor din care este alcătuit.
Numele valorilor pot fi formate din litere şi cifre, dar orice nume trebuie să înceapă cu
o literă.

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

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

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


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

var v_1, v_2, v_3: tip_1;


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

Diagrama de sintaxa este data mai jos.

VA identificator : tip ;
R
:

 Atentie! In limbajul Pascal trebuie sa se declare toate variabilele si inainte de a fi


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

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


4.2.6 Operatori
Operatorii sunt de trei feluri:
 Operatori aritmetici;
 Operatori relationali;
 Operatori logici;
Exemple de operatori: +, *, >, etc.
Operatorii aritmetici sunt de doua feluri:
 Operatori unari(+ si - ~semnul unui numar);
 Operatori binari(+, -, *, div, mod).
Operatorii unari actioneaza asupra unui singur operand.Acesta poate fi o variabila sau constanata de tip
intreg. Operanziise gasesc intotdeauna in dreapta lor.
Operatorii binari actioneza asupra a doi operanzi.un operand se gaseste intotdeauna in stanga
operatorului, celalalt in dreapta sa.
 Operatorul + are semnificatia de adunare.Operanzi sai sunt de tip real sau intreg. Se poate ca
unul sa fie de tip intreg si celalalt de tip real. Daca cel putin unul din operanzi este real rezultatul
este real, altfel este intreg.
 Operatorul – are semnificatia de scadere.
 Operatorul * are semnificatia de inmultire.
 Operatorul / are semnificatia de impartire.Operanzii pot fi de tip real sau intreg dar rezultatul va fi
intotdeauna de tip real.
 Operatorul div are semnificatia de impartire intreaga. Operanzii sunt in mod obligatoriu de tip
intreg. De asemenea, fiecare operand trebuie sa fie separat cu cel putin un spatiu de operator.
 Operatorul mod are semnificatia de rest al impartirii pentru numere intregi.
Operatorii relationali sunt >, >=, <, <=, =. Toti operatoriirelationali sunt binari(actioneza asupra a doi
operanzi).Rezultatul aplicarii unui operator relationaleste intotdeaun o valoare logica (True sau False).
 Operatorul < arata daca este adevarata sau nu relatia a<b. In caz ca relatia este
adevarata rezultatul va fi True, altfel va fi False.
 Operatorul <= arata daca este adevarata sau nu relatia a<=b.
 Operatorul > arata daca este adevarata sau nu relatia a>b.
 Operatorul >= arata daca este adevatata sau nu relatia a>=b.
 Operatorul = arata daca este adevarata sau nu relatia a=b.
Operatorii logici sunt not (negare), and (si), or (sau), xor (sau exclusiv). Cu exceptia operatorului not
care este unar,restul operatorilor sunt binari. Operanziipot fi de tip logic real sau intreg. In acest capitol
vom considera numai operanzide tip logic; in acest caz rezultatul va fi intotdeauna o valoare de tip
logic(true sau false).
 Operatorul not (negare). Modul de actiune se poate observa mai jos.
Not (True) =False;
Not (False)=True;
 Operatorul and (si).Regula de obtinerea rezultatului este: rezultatul este true
numai daca ambii operanzi au valoarea True (altfel rezultatul este false).
 Operatorul or (sau).Regula: daca unul dintre operanzi este true ,rezultatul va fi
true, altfel va fi false.
 Operatorul xor (sau exclusiv). Regula: daca argumentele sunt diferite rezultatul
este true, contrar el este false.

Prioritatea operatorilor

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

Operatori – reguli de prioritate si evaluare


LIMBAJUL PASCAL

Prioritate Operator Evaluare


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

4.2.7 Structura programelor


Structura programelor Pascal
Să vedem cum arată cel mai simplu program Pascal:
program usor;
begin
end.
Programul de mai sus este corect, cu toate acestea el nu face nici o operaţie. Dacă îl analizăm, putem
trage primele concluzii:
 Orice program Pascal începe cu cuvântul program, uramat de numele programului (nume pe care
l-am ales pentru a-l ’boteza’);
 Orice program Pascal conţine cuvintele begin şi end;
 După numele programului punem ’;’(caracterul punct şi virgulă);
 Orice program Pascal se termină cu ’.’ (caracterul punct).
În exemplul nostru, programul se numeşte uşor.
Observaţie 1. La scrierea unui program nu are importanţă dacă folosim litere mari sau mici. De
exemplu, programul de mai sus ar putea arăta şi astfel(deşi nu este o formă elegantă de prezentare):
PrograM uSoR;
BeGin
End.
Observaţie 2. Nu are importanţă nici plasarea cuvintelor pe linie, nici spaţiile dintre ele.
Programul de mai sus poate fi scris şi aşa:
pRogrAm usor;BeGin End.

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

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

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

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

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


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

Prioritate Operator

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

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

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

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

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


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

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

In continuare prezentam diagramale de sintaxa pentru notiunea de expresie.

expresie
+

termen operator aditiv


-
termen

termen
factor operator multiplicativ

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

1. Uitam sa punem semnul inmultirii.


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

Tipul expresiilor

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


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

4.2.10 Atribuirea
Sintaxa instructiunii de atribuire
LIMBAJUL PASCAL
id_variabila:=valoare/expresie;
Precizare: Tipul variabilei trebuie sa coincida
cu tipul valorii/expresiei.
Prin operatia de atribuire se retine o anumita data dintr-o variabila. Ea are mai multe forme ,pe
care le vom prezenta pe rand.
Forma1.
V:=data
Semnificatia este urmatoarea:
 V este numele unei variabile de un tip oarecare;
 := notatia pentru operatia de atribuire;
 data – o valoare de un tip oareacare.
Cu o singura exceptie ,tipul variabileitrebie sa coincida cu tipul valorii atribuite. Exceptia este
urmatoarea: unei variabile de tip real i se poate atribui o data de tip intreg.
Real d;
D:=7;
Forma 2
V1:=v2; unde v1 si v2sunt nume de variabile. Cu o exceptie , tipul celor doua variabile
trebuie dsa coincida. Efectul este ca variabila v1 va retine continutul variabilei v2. Dupa aplicarea
acestei operatii,continutul variabilei v2 ramane nemodificat, iar continutul variabilei v2 se pierde.
Observatie: Nu este indiferentmodul de scriere a variabilelor in cadrul atribuirii. Atribuirea a:=b
nu este identica cu b:=a. Este adevarat ca , dupa atribuire ,cele doua variabile vor avea acelasi continut.
Insa este important ce continut( al lui b dupa prima atribuire, al lui a dupa a doua).
Forma 3
V:=expresie;
Initial se evalueaza expresia, iar valoarea obtinuta este atribuita variabilei v. Consideram ca daca
cel putin unul din operanzi este real, tipul expresiei este real si poate fi atribuit doar unei variabile de
tip real,iardaca toti operanzii sunt intregi, tipul expresiei este intreg si poate fi atribuit unei variabile de
tip intreg sau real. Facem conventia ca operatorul da intot deauna un rezultat de tip real,chiar daca
ambii operanzi sunt intregi.
Exemplu: Fie c o variabila de tip integer care retine numarul 4 si d o variabila de tip real care
contine numarul 7.3. Efectuam atribuirea d:=c+1. Dupa atribuire continutul lor va fi: c=4;d=5.
Explicatie: Am vazut ca este posibil ca unei variabile de tip real sa-i atribuim o valoare
intreaga. Este normal sa fie asa pentru ca multimea numerelor intregi este submultome a numerelor
reale.

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

4.2.11 Citirea /scrierea datelor


Citirea si scrierea datelor
Prin operatia de intrare se intelege preluarea unei date de la un dispozitivde intrare catre memoria
de intrare a calculatorului ,in zona de memorie rezervata pentru aceasta, adica in variabila.
Dispozitivele de intrare pot fi tastatura ;o unitate de discheta; o unitate de disc, etc.
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.
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:

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

TEMA 5)
INSTRUCTIUNILE LIMBAJULUI PASCAL
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;


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

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

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

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.

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.

TEMA 6)
TIPURI STRUCTURATE DE DATE
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) =
= 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,
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

EXEMPLU:
{Se citesc n numere naturale intr-un vector.sa var i,n:byte;
se calculeze media aritmetica a acestora} a:array[1..50]of integer;
program media; s:integer;m:real;
uses crt; begin
clrscr; begin
write('n='); clrscr;
readln(n); write('n=');
for i:=1 to n do begin readln(n);
write('a[',i,']='); for i:=1 to n do begin
readln(a[i]); write('a[',i,']=');
end; readln(a[i]);
s:=0;for i:=1 to n do end;
s:=s+a[i]; repeat;
m:=s/n; ordonat:=true;
write('media este',m:8:2); for i:=1 to n-1 do
readkey; if a[i]>a[i+1] then begin
end. aux:=a[i];
a[i]:=a[i+1];
{ SE DA UN VECTOR CU N ordonat:=false;
ELEMENTE.SA SE ORDONEZE end;
CRESCATOR PRIN METODA BULELOR. } until ordonat;
program PR10; writeln('sirul ordonat este');
uses crt; for i:=1 to n do
var i,n:byte; write(a[i],'');
A:array[1..20] of integer; readkey;
aUX:integer; end.
ORDONAT:BOOLEAN;

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
. . . . .
a m-1,1 a
m-1,2 . . a
m-1,n

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

 Tabloul de mai sus se numeste A.


 Elementele sale sunt a1,1 ,a1,2 , … , am,n .
 Prin ai,j se intelege elementul care se gaseste in linia i si coloana j.
Aici k=2, n1 =m,n2 =n,T=R.
MASIVE BIDIMENSIONALE (matrice)
Este aproape sigur că în activitatea de programare, matricele ocupă ca importanţă un loc
deosebit.Lucrul corect cu o matrice oferă rezultate rapide, cum la fel de adevărat este că utilizarea
defectuoasă reduce considerabil şansa de a obţine rezultate corecte.
Singura posibilitate de arealiza programe corecte utilizând matrice, este cunoaşterea mecanismelor de
implementare a acestora în diferite limbaje de programare ,precum şi studierea proprietăţilor ce decurg
din ele.
Pornind de la ideea că o matrice este formată din linii, iar liniile sunt formate din elemente ,se
ajunge la modelul grafic al matricei, care apare sub forma unei arborescenţe organizate pe trei nivele.

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

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

Modelul grafic

l1 l2 Lm

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

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


D(ai,j)
A
Nivelul grafic presupune existenţa a 3 nivele:
- la nivelul cel mai înalt se află întregul, matricea a
- 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: -exista cel putin un element impar
-calculul sumei elementelor de pe linie para si - sa se spuna daca elementele de pe diagonala
colona impara principala sunt sortate descrescator
-suma elementelor din intervalul -2..4 - sa se spuna daca doua linii date din matrice
-suma elementelor care sunt patrate perfecte coincid
-cine este primul element impar -sa se calculeze maximul de sub diagonala
-sunt elemente impare pe o anumite linie data principala
sau nu sunt -sa se calculeze produsul celor doua matrice
-toate elementele din matrice sunt impare? - sa se insereze la inceput o linie
-toate elementele de deasupra diagonalei -adaugati o coloana care are produsul
principale sunt impare elementelor de pe linie
-inserati o coloana pe o anumita pozitie writeln;k:=0;writeln(' dati linia pe care cautati
-sortati descrescator elementele de pe o elemente impare ');readln(p);
anumita coloana data for j:=1 to n do
-afisati rezultatele if (a[p,j] mod 2 <>0) then begin
} k:=k+1;
var pp,p,k,max,s,i,j,m,n:byte; if k=1 then max:=a[p,j];end;
a,y,z:array[0..10,0..10] of integer; if k=0 then writeln(' nu sunt elemente impare
ok:boolean; pe linia ',p) else
begin write('primul element impar de pe linia ',p,'este
writeln(' dati numarul de linii egal cu numarul ',max);
de coloane '); writeln;k:=0;
write('cite linii are matricea ');readln(m); writeln(' dati numarul de ordine al elementului
write('cite coloane are matricea ');readln(n); care-l verificati daca este impar ');readln(p);
for i:=1 to m do for i:=1 to n do
for j:=1 to n do for j:=1 to n do
begin if (a[i,j] mod 2 <>0) then begin
writeln('a[',i,',',j,']=');readln(a[i,j]); k:=k+1;
end; if k=p then max:=a[i,j];end;
for i:=1 to m do begin if k<p then writeln(' nu sunt elemente impare
for j:=1 to n do pe linia ',p) else
write(a[i,j],' ');writeln; write('al ',p,'element impar este ',max);
end; ok:=true;
s:=0; for i:=1 to n do
for i:=1 to m do for j:=1 to n do
for j:=1 to n do if a[i,j] mod 2 =0 then ok:=false;
if (j mod 2 =0)and (i mod 2 =0) then writeln('toate elementele din matrice sunt
s:=s+a[i,j]; impare ',ok);
write('suma elementelor de pe linie para si ok:=true;
coloana para ',s); for i:=1 to n do
for j:=1 to n do
s:=0; if i>j then
for i:=1 to m do if a[i,j] mod 2 =0 then ok:=false;
for j:=1 to n do writeln('toate elementele de deasupra
if (a[i,j]>-2) and (a[i,j]<4) then s:=s+a[i,j]; diagonalei secundare sunt impare ',ok);
write('suma elementelor din intervalul (-2,4) ok:=false;
',s); for i:=1 to n do
writeln; for j:=1 to n do
s:=0; if a[i,j] mod 2 <>0 then ok:=true;
for i:=1 to m do writeln('cel putin in element este impar? ',ok);
for j:=1 to n do k:=0;
if (sqr(trunc(sqrt(a[i,j])))=a[i,j]) then for i:=1 to n do
s:=s+a[i,j]; for j:=1 to n do
write('suma elementelor care sunt patrate if (i<j) and (a[i,j] mod 2 <>0) then k:=k+1;
perfecte ',s); writeln('e vre-un element impar? ',ok);
i:=0;writeln; ok:=false;
repeat for i:=1 to n-1 do
i:=i+1; if a[i,i] >a[i+1,i+1] then ok:=true;
j:=0; writeln('elementele de pe diagonala principala
repeat sunt sortate descrescator ? ',ok);
j:=j+1; writeln(' ce linie comparati ');readln(k);
until (i>m) or (a[i,j] mod 2 <>0); writeln(' cu ce coloana comparati ');readln(p);
until (j>n) or (a[i,j] mod 2 <>0); ok:=false;
if i>m then writeln(' nu am elemente impare') for i:=1 to n do
else if a[k,i] <>a[i,p] then ok:=true;
write('primul element impar este writeln('elementele de pe linia ',k,' sunt
',a[i,j]);writeln; aceleasi cu elementele de pe linia ',p,' ? ',ok);
for i:=1 to m do max:=a[1,2];
for j:=1 to n do for i:=1 to n do
if (a[i,j] mod 2 <>0 ) then max:=a[i,j]; for j:=1 to n do
write('cel mai mare impar ',max); if (i>j) then
if a[i,j]>max then max:=a[i,j]; for j:=1 to n do
writeln(' maximul elementelor de sub write(a[i,j],' ');writeln;
diagonala principala ',max); end;
writeln('introduceti a doua matrice '); writeln(' adaug o coloana care are ca elemente
writeln(' dati numarul de linii egal cu numarul produsul elementelor pe linie ');
de coloane '); for i:=1 to m do
write('cite linii are matricea ');readln(m); for j:=1 to n do
write('cite coloane are matricea ');readln(n); z[i,j]:=a[i,j];
for i:=1 to m do for i:=1 to m do
for j:=1 to n do begin
begin s:=1;
writeln('b[',i,',',j,']=');readln(y[i,j]); for k:=1 to n do
end; s:=s*a[i,k];
for i:=1 to m do z[i,n+1]:=s;
for j:=1 to n do end;
begin for i:=1 to m do begin
s:=0; for j:=1 to n+1 do
for k:=1 to n do write(z[i,j],' ');writeln;
s:=s+a[i,k]*y[k,j]; end;
z[i,j]:=s; writeln(' dati pozitia in care inserati o coloana
end; ');readln(p);
writeln('produsul matricelor este '); writeln(' inserez pe coloana ',p,' elemente');
for i:=1 to m do begin for j:=n+1 downto p+1 do
for j:=1 to n do begin
write(z[i,j],' ');writeln; for i:=1 to m do
end; z[i,j]:=z[i,j-1];
for j:=1 to n do end;
begin for I:=1 to n do
writeln(' elementul inserat la inceput in begin
matricea y cu ordinea ',j,' este '); write('elementul[',i, ',',j,']=');readln(z[i,p]);
readln(z[0,j]);end; end;
for i:=1 to m do for i:=1 to m do begin
for j:=1 to n do for j:=1 to n+1 do
z[i,j]:=y[i,j]; write(z[i,j],' ');writeln;
for i:=0 to m do begin end;
for j:=1 to n do writeln(' sortati descrescator in matricea b pe
write(z[i,j],' ');writeln; diagonala principala k=');
end; readln(k);
{writeln(' dati coloana care o eliminati din repeat
matricea a ');readln(p); p:=1;
for j:=p to n-1 do for i:=1 to m-1 do
begin if y[i,k]<y[i+1,k] then
for i:=1 to m do begin
a[i,j]:=a[i,j+1]; p:=0;
end; pp:=y[i,k];
for i:=1 to m do begin y[i,k]:=y[i+1,k];
for j:=1 to n-1 do y[i+1,k]:=pp;
write(a[i,j],' ');writeln; end;
end;} until p=1;
writeln(' dati linia care o eliminati din matricea for i:=1 to m do begin
a ');readln(p); for j:=1 to n do
for i:=p to m-1 do write(y[i,j],' ');writeln;
begin end;
for j:=1 to n do
a[i,j]:=a[i+1,j]; readln;
end; end.
for i:=1 to m-1 do begin

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

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.

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;
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
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:
{ Se considera un tablou bidimensional a cu n linii si n coloane (1<=n<=50) componente intregi si un numar intreg
k.
Se cere sa se afiseze tabloul a cu componente intregi .
Se cere ca prin operatii de interschimbare de linii si
coloane sa se obtina un tablou cu elementele de pe diagonala principala
ordonate crescator.}
uses crt ;
var
a: array [1..50,1..50] of integer;
i,j,n,sw: byte;
aux: integer;
begin
clrscr;
write ('n='); readln (n); writeln('dati elementele matricei ');
for i:=1 to n do
for j:=1 to n do begin

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

Din punct de vedere al conţinutului lor, fişierele se împart în două categorii:

1.FIŞIERE TEXT, în care sunt memorate caractere organizate în linii consecutive ce sunt separate
printr-un marcaj de sfârşit de linie ( caractere de control CARRIAGE, RETURN şi LINE FEED). În această
categorie intră fişiere ce conţin programe sursă, fişiere document şi orice alte fişiere cu componentele caractere
grupate în linii.
Fişierele text reprezintă nişte fişiere secvenţiale; componentele lor pot fi prelucrate numai în ordinea în
care apar.
După modul în care a fost deschis, asupra unui astfel de fişier pot fi efectuate numai operaţii de un singur
tip. Dacă fişierul a fost deschis prin RESET, asupra lui pot fi efectuate numai operaţii de citire, iar dacă a fost
deschis prin REWRITE sau APPEND, asupra lui se pot efectua numai operaţii de scriere.

2. FIŞIERE CU COMPONENTE DE ALTE TIPURI, DEFINITE DE UTILIZATOR


Această categorie cuprinde fişiere care conţin programe executabile sau date
înregistrate.
Fişierele cu tip reprezintă o succesiune de înregistrări de acelaşi tip, aflate pe acelaşi suport. Înregistrările
pot fi de tip simplu (standard sau definit de utilizator) sau structurat (ARRAY, STRING, RECORD).
În procesul de prelucrare a fişierelor se folosesc anumite funcţii şi proceduri standard de uz general,
acestea sunt:
- 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.
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) …
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
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
î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.
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:
populare, consultare, modificare adaugare si stergere. Operatiile se realizeaza în acces
secvential sau direct. De fapt, distinctia între cele doua tipuri de acces este fortata,
deoarece mecanismul lor este mult mai simplu: se citesc/scriu articole din/în pozitia
curenta. Plasarea se poate realiza prin parcurgere secventiala (prin operatiile de
citire/scriere) sau direct, prin procedura Seek.

· Popularea se realizeaza cu Write, dupa o deschidere cu Rewrite. În paralel cu


popularea se pot realiza si operatii de citire.
· Consultarea se realizeaza cu Read, dupa o deschidere cu Reset. În paralel, se pot
realiza si operatii de scriere.
· Adaugarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia
de adaugare necesita tinerea evidentei din partea utilizatorului a casetelor "goale",
anterior rezervate. Se pot adauga articole si peste FileSize(f), operatia având caracter
de extindere a fisierului.
· Modificarea se realizeaza cu procedura Write, dupa o deschidere cu Reset. Operatia
necesita uzual o citire, o plasare a pointerului pe numarul relativ FilePos(f)-1 si apoi o
scriere.
· Stergerea fizica se poate realiza prin suprascrierea articolului de sters, obtinuta ca
efect al deplasarii articolelor ce îi urmeaza în fisier, cu o pozitie spre stânga. Stergerea
ultimului articol duplicat în urma deplasarii se asigura prin plasarea pointerului de
fisier pe articolul FileSize(f)-1, urmat de executia procedurii Truncate(f) care
modifica lungimea fisierului în intrarea din director.

Datorita pierderii corespondentei dintre continut si pozitia articolelor, în majoritatea


aplicatiilor se prefera stergerea logica, realizabila prin procedeuri ale utilizatorului,
dar care implica unele rezolvari înca din faza de proiectare a structurii fisierelor.

Fisiere fara tip

Fisierele fara tip sunt construite, logic, din blocuri de lungime fixa, asupra carora nu
se face nici o ipoteza de structura. Fisierele fara tip se mai numesc fisiere cu
prelucrare la nivel de bloc. Unitatea de transfer este blocul, a carui lungime este
definita, implicit sau explicit, la deschiderea fisierului (parametrul RecSize).
Transferul datelor între memoria interna si suportul extern se realizeaza fara
conversie.

Blocurilor, fiind de lungime fixa, (lbloc) li se asociaza numere relative începând de la


zero. Accesul la blocuri se poate face secvential sau direct. Pozitionarea directa pe un
bloc cu numar relativ r se realizeaza cu procedura Seek(f,r). Functia Eof(f) are
valoarea TRUE daca pointerul este plasat dupa ultimul bloc (la o deplasare egala cu n
´lbloc fata de începutul fisierului, unde n este numarul blocurilor). Valoarea curenta a
pointerului poate fi determinata prin functia Filepos(f), iar numarul de blocuri din
fisier prin functia Filesize(f). Tentativa de citire a unui bloc cu numarul relativ mai
mare decât al ultimului generaza eroare de I/E. La scrierea blocului cu numarul relativ
k, cele k blocuri precedente au spatiu rezervat în suportul extern. Citirea blocurilor se
face cu procedura BlockRead, iar scrierea cu procedura BlockWrite. Procedurile de
I/E pot transfera unul sau mai multe blocuri, în functie de valoarea specificata prin
parametrul Count.

Din cele prezentate, se poate observa ca între fisierele cu tip si cele fara tip exista
multe asemanari de prelucrare. Dintre aceste, cele mai importante se refera la faptul
ca transferul este binar (fara conversie) si ca entitatile transferate (articolul sau blocul)
au lungime fixa. Deosebirea esentiala dintre cele doua tipuri de fisiere consta în aceea
ca la fisierele cu tip, articolul are definita o structura, iar la cele fara tip, blocului nu i
se asociaza o structura.

Procedura Rewrite deschide un fisier nou pentru creare (creeaza eticheta în director).
Declaratia ei este: Rewrite(VAR f[;RecSize:WORD]). RecSize precizeaza marimea,
în octeti, a blocului care va fi citit/scris cu procedurile BlockRead, respectiv
BlockWrite. Când argumentul RecSize lipseste, se considera implicit ca blocul are
lungimea de 128 octeti. Valoarea maxima a argumentului este 65535. Daca fisierul
exista în suport, acesta va fi sters si se creeaza noul fisier în locul sau. Daca fisierul f
este deschis, procedura îl închide, îl sterge si recreeaza intrarea sa în director. Dupa
executia procedurii, pointerul de fisier se plaseaza pe începutul sau (pe primul bloc).
În fisier este admisa atât scrierea, cât si citirea datelor. Dupa executia procedurii,
Eof(f) este TRUE.

Procedura Reset deschide un fisier existent (identifica fisierul în director). Declaratia


ei este: Reset(VAR f [;RecSize:WORD]). RecSize are aceeasi semnificatie ca la
procedura Rewrite. Daca fisierul nu exista, se genereaza eroare de I/E (IOResult are
valoare diferita de zero). Daca fisierul f este deschis, îl închide si apoi îl redeschide.
Dupa executia procedurii, pointerul de fisier se plaseaza pe începutul sau (pe primul
bloc). În fisier este admisa atât citirea, cât si scrierea datelor. Dupa executia
procedurii, Eof(f) este TRUE daca fisierul este vid sau FALSE, în caz contrar.

Procedura Close realizeaza închiderea unui fisier.

Declaratia ei este:Close(VAR f). Variabila f indica un fisier deschis anterior prin


Reset sau Rewrite.

Citirea blocurilor se realizeaza cu procedura BlockRead, definita astfel:


BlockRead(VAR f:FILE;VAR Buf;Count:WORD[;VAR Ind:WORD])
unde:

· f este o variabila care indica un fisier fara tip;


· Buf este o variabila a carei adresa reprezinta începutul zonei de memorie în care se
depun datele citite;
· Count corespunde unei expresii a carei valoare specifica numarul maxim de blocuri
ce vor fi citite. Blocurile citite vor fi depuse în memorie unul dupa altul;
· Ind este o variabila în care sistemul depune, dupa citire, numarul de blocuri efectiv
transferate. În cazul în care parametrul corespunzator lui Ind este absent si numarul
blocurilor efectiv transferate este mai mic decât Count, se produce eroare de I/E.

Procedura citeste unul sau mai multe blocuri, începând cu cel pe care este plasat
pointerul, pe care îl avanseaza dupa ultimul bloc transferat. Tentativa de citire a unui
bloc cu numarul relativ mai mare sau egal cu FileSize(f) genereaza eroare de I/E
(IOResult are valoare diferita de zero).

Scrierea blocurilor se realizeaza cu procedura BlockWrite, definita astfel:


BlockWrite(VAR f:FILE; VAR Buf; Count:WORD [;VAR Ind:WORD])
unde f, Buf, Count, Ind au aceleasi semnificatii ca la procedura BlockRead.

Procedura scrie unul sau mai multe blocuri începând cu pozitia în care se afla
pointerul, pe care îl avanseaza dupa ultimul bloc scris. Se reaminteste ca datele se
memoreaza în blocul extern identic cu forma lor fizica din memoria interna.

Functiile Eof, FilePos, FileSize si procedura Seek functioneaza identic ca în cazul


fisierelor cu tip, referind sau referindu-se la blocuri. Numarul de blocuri este
determinat prin împartirea întreaga a lungimii fisierului, exprimata în octeti, la
lungimea blocului. Ultimul bloc din fisier are numarul relativ egal cu FileSize(f)-1.
Când se efectueaza operatii de scriere, valoarea FileSize(f)´lbloc este înscrisa dinamic
în FIB.

{Fie doua fisiere de numere reale date write(f1,x);


descrescator
readln;
Sa se creeze un al treilea fisier care contine
elemente din primele doua si m:=m+1;

care au elementele in ordine descrescatoare} writeln(' mai sunt date de introdus


d/n');readln(si);
var f1,f2,f:file of real;
until si<>'d';
x,y:real;
n:=0;rewrite(f2);
si:char;
repeat
i,j,m,n:integer;
writeln(' dati valori descrescatoare in al doilea
begin fisier ');

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

assign(f,'f.3'); write(f2,x);

rewrite(f1);writeln; readln;

m:=0; n:=n+1;

repeat writeln(' mai sunt date de introdus


d/n');readln(si);
writeln(' dati valori descrescatoare in primul
fisier'); until si<>'d';

read(x);
writeln('f1 are ',m ,'articole f2 are ',n ,' articole read(f,x);
');
write(x:5:0);
reset(f1);reset(f2);rewrite(f);
end;
writeln;
readln;
read(f1,x);read(f2,y);i:=1;j:=1;
end.
while (i<=m) and (j<=n) do
{Sa se scrie un fisier cu tip care memoreaza
if x<y then begin numele elevilor,clasa si
o suma de care dispun si in care sa se faca
write(f,y); totalul pe clase
Sa se determine suma maxima si cine o detine,
if j<n then read(f2,y);j:=j+1; sa se adauge elevi la o clasa si sa se listeze
Sa se extraga o anumita suma sau sa se depuna
de catre un elev de la o anumita clasa}
end type ar=record
cl:string[5];
else nu:string[20];
su:word
begin end;
var fis1,fis2: file of ar;
write(f,x); art1,art2:ar;nr,tot,i,n:word;sfirsit,b:boolean;op:
char;
num,c1:string[5];sum,nm,max:word;
if i<m then read(f1,x);i:=i+1;
nn:array[1..100] of longint;s,j:longint;
end; begin
assign(fis1,'cec');
while i<=m do rewrite(fis1);
write('n=');readln(n);
begin for i:=1 to n do
with art1 do
write(f,x); begin
write('clasa ');readln(cl);
write('nume');readln(nu);
if i<m then read(f1,x);i:=i+1;
write('suma');readln(su);
write(fis1,art1);
end; end;
reset(fis1);read(fis1,art1);tot:=art1.su;c1:=art1.
while j<=n do cl;writeln;
writeln('clasa',art1.cl);
begin writeln('numele ',art1.nu);
writeln(art1.su);
write(f,y);if j<n then read(f2,y);j:=j+1; while not eof(fis1) do
begin
read(fis1,art1);
end; with art1 do
if c1=cl then begin
writeln;writeln(' fisierul f este '); writeln(' ' ,nu,' ',su); tot:=tot+su;
end
reset(f); else
begin
while not eof(f) do writeln(' suma totala ',tot);
tot:=su;
c1:=cl;
begin
writeln('clasa',cl);
writeln(' ',nu,' ',cl); begin
end; end; seek(fis1,nr);
writeln(' suma totala=',tot); read(fis1,art1);
close(fis1); with art1 do
reset(fis1); begin
max:=0; if (c1<>cl) or (num<>nu) then writeln(' nr de
while not eof(fis1) do ordine gresit pentru ',num,' ',c1)
begin else
read(fis1,art1); begin
if art1.su>max then begin b:=true;
i:=1; if op in['i','I'] then
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';
assign(f2,'fff.dat');
writeln(' dati inregistrari in al doilea fisier ');
rewrite(f2);
repeat
write('numele ');readln(inreg.nume);
write('virsta');
readln(inreg.virsta);
write(f2,inreg);
write('continuati y/n');readln(c);
until c='n';
reset(f1); writeln(' primul fisier ');
while not eof(f1) do
begin
read(f1,i);
writeln(i.nume,' ',i.virsta);
end;

reset(f2); writeln(' al doile fisier ');


while not eof(f2) do
begin
read(f2,i);
writeln(i.nume,' ',i.virsta);
end;

close(f1);close(f2);
readln;
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
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.

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

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

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
prin alte limbaje (COBOL, FORTRAN, C, BASIC), sisteme de gestiune a bazelor de
date (DBASE, FOXPRO etc.), constituind unicul mijloc de compatibilitate directa.

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

etapa 1)

etapa2)

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

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



etapa 3) la fel…
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
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)

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

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