CUPRINS

CUPRINS............................................................................................I
Capitolul I....
3.3.2. Caractere whitespace...............................................57
       3.3.3. Caractere speciale şi de punctu...
Instrucţiuni.......................................................................................80
    5.1. Instrucţiun...
7.1. Operatori pointer...........................................................123
      7.1.1. Importanţa tipului de ba...
9.3. Modularizarea programelor.........................................195
Capitolul X.......................................
........................................................................................................246
Utilizarea ecr...
Capitolul I

         INTRODUCERE ÎN
 ARHITECURA SISTEMELOR DE CALCUL



1.1. Importanţa limbajului C

        Creat în an...
-     capacitatea de programare atât la nivel înalt cât şi la
              nivel scăzut – ceea ce dă posibilitatea utiliz...
calculatoare. În principiu, ele simplifică interacţiunea dintre programe
şi utilizatorii acestora. Astfel, diferite comenz...
aplicaţiei şi, implicit, a programului, prin filozofia de rezolvare a
problemelor folosind limbajul. Din aceste puncte de ...
Echipamente de ieşire




                                                         Echipamente de stocare date
           ...
plasează pe placa de bază (mainboard) a calculatorului
         împreună cu memoria internă RAM. În plus faţă de aceste
  ...
    minicalculator (minicomputer): Un calculator multiutilizator
         (multi-user) capabil să lucreze simultan cu zec...
pentru prima oară circuitul Intel 8080 care a fost folosit in sistemele
Altair şi IMSAI. Curând după aceea au apărut proce...
De aceea, un calculator necesită şi o memorie care să găzduiască date
şi programe.
        Memoria este formată din punct ...
Deoarece capacitatea de memorie a unui calculator nu poate fi
atât de mare încât să poată păstra toate programele pe vrem ...
unitatea centrală. Cuplarea la calculator a tastaturii se face prin
intermediul unui cablu de conectare.
       Din punct ...
butoane. Acum există mouse-uri cu 5 butoane şi 2 rotiţe ce îndeplinesc
o serie de funcţii corespunzătoare unor taste speci...
vacuum, similar cu cel de la televizor şi trei tunuri de electroni
(corespunzătoare celor trei culori fundamentale).
     ...
Programele de calculator, cunoscute sub numele de software,
sunt constituite dintr-o serie de instrucţiuni pe care le exec...
de operare pune la dispoziţia aplicaţiilor o serie de servicii care permit
programelor să aloce memorie, să acceseze difer...
Aplicaţie



                                                         Disk-drive

                                        ...
     multitasking: Permit mai multor programe să ruleze în acelaşi
          timp (execuţie concurentă).
      multithre...
capabilităţilor hardware ale calculatoarelor, acesta s-a transformat,
prin dezvoltări succesive, în Windows.
        Indif...
sistemul de operare trebuie să controleze diferite componente
       hardware;
   •   surse de programe scrise în diferite...
Pe scurt, un compilator este un program special care procesează
instrucţiuni scrise într-un limbaj de programare particula...
Cu alte cuvinte, un program executabil (executable program -
aflat pe disc cu extensia .exe) se obţine prin salvarea pe di...
numele nume.exe la care adresele nu mai sunt simbolice ci
         absolute relativ la adresa de început a programului. La...
Programele de descriere a paginii (Page Description Languages)
ca PostScript spre exemplu folosesc un interpretor. Fiecare...
Instrucţiunile în limbajul
de nivel înalt se introduc
de la tastaturã.




                                         Tot ce...
REPREZENTAREA DATELOR ÎN
               CALCULATOR


       Se ştie că un calculator numeric prelucrează numere binare.
Ac...
internă sunt necesare convenţii de reprezentare: indiferent de tipul
datelor, acestea vor fi colecţii sau şiruri de cifre ...
-    cum se reprezintă intern un număr întreg negativ
    -    cum se face conversia de la reprezentarea externă la cea
  ...
întreagă şi câte la partea fracţionară sau dacă dorim reprezentare
ştiinţifică sau nu. De altfel şi operatorul uman face a...
Forma generală de reprezentare externă a numerelor întregi este
de forma:
                      N b = ±c n −1c n − 2 .......
0+1=1
         1+0=1
         1+1=0, transport 1 spre rangul următor
Astfel, să facem adunarea 37+25 în binar:
           ...
2.2.2. Reprezentarea externă a numerelor reale

       Semnificativă pentru utilizatorul uman este reprezentarea
zecimală ...
Partea întreagă a unui număr real se reprezintă binar precum
numerele întregi (cu sau fără semn). Pentru a determina parte...
număr infinit de cifre se poate reprezenta într-o altă bază pe un
                             1
număr finit de cifre ( ex...
Un număr binar este o colecţie de cifre binare ponderate fiecare
cu o putere a lui 2. Bitul corespunzător ponderii celei m...
10110112 = -1x26 + 1x24 + 1x23 + 1x21 + 1x20 = -64 + 27 = -37

2.3.2 Adunarea, scăderea şi înmulţirea numerelor întregi

 ...
25 − 37 = 25 + (−37) = 0011001 + 1011011
                             0011001 +
− 37 = 1011011
                         ...
funcţie de semnul rezultatului, se ia decizia reprezentării corecte a
rezultatului.
       Spre exemplu, să calculăm (-25)...
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Carte C 2003
Upcoming SlideShare
Loading in...5
×

Carte C 2003

13,050

Published on

Basic C programming book

Published in: Education, Business, Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,050
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
494
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Carte C 2003"

  1. 1. CUPRINS CUPRINS............................................................................................I Capitolul I...........................................................................................1 INTRODUCERE ÎN..........................................................................1 ARHITECURA SISTEMELOR DE CALCUL...............................1 1.1. Importanţa limbajului C....................................................1 1.2 Arhitectura de bază a unui calculator.................................4 1.2.1 Microprocesorul.........................................................7 1.2.2 Memoria.....................................................................8 1.2.3 Echipamentele periferice..........................................10 1.3. Programarea calculatorului.............................................13 1.3.1. Sistemul de operare.................................................14 1.3.2. Tipuri de fişiere.......................................................18 1.3.3. Construirea fişierului executabil.............................19 Capitolul II.......................................................................................24 REPREZENTAREA DATELOR ÎN CALCULATOR.................25 2.1. Reprezentarea internă/externă a numerelor....................26 2.2. Reprezentarea externă a numerelor.................................27 2.2.1. Reprezentarea externă a numerelor întregi..............28 2.2.2. Reprezentarea externă a numerelor reale................31 2.3 Reprezentarea internă a numerelor..................................33 2.3.1. Reprezentarea internă a numerelor întregi..............33 2.3.2 Adunarea, scăderea şi înmulţirea numerelor întregi.35 2.3.3 Reprezentarea internă a numerelor reale..................37 Game de reprezentare pentru numerele reale....................49 2.3.5. Codificare BCD.......................................................50 Capitolul III......................................................................................52 ELEMENTELE DE BAZĂ ALE LIMABJULUI C.....................52 3.1. Crearea şi lansarea în execuţie a unui program C...........52 3.2. Structura unui program C................................................54 3.3. Mulţimea caracterelor ....................................................56 3.3.1. Litere şi numere.......................................................57 I
  2. 2. 3.3.2. Caractere whitespace...............................................57 3.3.3. Caractere speciale şi de punctuaţie..........................57 3.3.4. Secvenţe escape.......................................................58 3.4. Identificatori....................................................................59 3.5. Cuvintele cheie ale limbajului C.....................................60 3.6. Constante.........................................................................60 3.6.1. Constante caracter...................................................61 3.6.2. Constante întregi.....................................................61 3.6.3. Constante în virgulă mobilă....................................61 3.6.4. Constante şir............................................................62 3.6.5. Constanta zero.........................................................63 3.6.6. Obiecte constante....................................................63 3.6.7. Enumerări ...............................................................64 Capitolul IV......................................................................................64 ..........................................................................................................64 Operanzi şi operatori în C...............................................................64 4.1. Operanzi .........................................................................65 4.2. Operatori ........................................................................65 4.2.1. Operatori aritmetici.................................................66 4.2.2. Operatori de incrementare şi decrementare.............67 4.2.3. Operatori relaţionali................................................67 4.2.4. Operatori logici.......................................................68 4.2.5. Operatori logici la nivel de bit.................................69 4.2.6. Operatorul de atribuire............................................74 4.2.7. Operatorul sizeof.....................................................74 4.2.8. Operatorul ternar ?.................................................75 4.2.9. Operatorul virgulă...................................................76 4.2.10. Operatorul de forţare a tipului sau de conversie explicită (expresie cast)........................................77 4.2.11. Operatorii paranteză..............................................77 4.2.12. Operatorul adresă..................................................78 4.2.13. Alţi operatori ai limbajului C................................78 4.2.14. Regula conversiilor implicite şi precedenţa operatorilor...........................................................78 Capitolul V.......................................................................................80 ..........................................................................................................80 II
  3. 3. Instrucţiuni.......................................................................................80 5.1. Instrucţiuni etichetate (instrucţiunea goto).....................80 5.2. Instrucţiuni expresie........................................................81 5.3. Instrucţiuni compuse.......................................................82 5.4. Instrucţiuni de selecţie....................................................82 5.4.1. Instrucţiunea if.........................................................82 5.4.2. Instrucţiuni de selecţie multiplă: if - else if.............84 5.4.3. Instrucţiunea switch.................................................85 5.5. Instrucţiuni repetitive......................................................87 5.5.1. Instrucţiunea for......................................................87 5.5.2. Instrucţiunea while..................................................90 5.5.3. Instrucţiunea do-while.............................................92 5.5.4. Bucle încuibate........................................................94 5.5.5. Instrucţiunea break..................................................96 5.5.6. Instrucţiunea continue.............................................97 Capitolul VI......................................................................................97 ..........................................................................................................97 TIPURI DE DATE STRUCTURATE ...........................................97 6.1. Tablouri unidimensionale...............................................98 6.1.1. Constante şir............................................................99 6.1.2. Iniţializarea vectorilor de caractere.......................100 6.1.3. Funcţii pentru prelucrarea şirurilor (fişierul antet string.h)...............................................................102 6.2. Tablouri cu două dimensiuni (matrice).........................104 6.2.1. Iniţializarea matricelor..........................................105 6.2.2. Tablouri bidimensionale de şiruri.........................106 6.3. Tablouri multidimensionale..........................................106 6.4. Structuri.........................................................................107 6.4.1. Tablouri de structuri..............................................109 6.4.2. Introducerea structurilor în funcţii........................115 6.4.3. Tablouri şi structuri în structuri.............................119 6.5. Uniuni...........................................................................119 6.6. Enumerări......................................................................121 Capitolul VII..................................................................................123 ........................................................................................................123 POINTERI.....................................................................................123 III
  4. 4. 7.1. Operatori pointer...........................................................123 7.1.1. Importanţa tipului de bază.....................................125 7.1.2. Expresii în care intervin pointeri...........................125 7.2. Pointeri şi tablouri.........................................................130 7.2.1. Indexarea pointerilor.............................................131 7.2.2. Pointeri şi şiruri ....................................................133 7.2.3. Preluarea adresei unui element al unui tablou.......134 7.2.4. Tablouri de pointeri...............................................134 7.2.5. Pointeri la pointeri.................................................135 7.2.6. Iniţializarea pointerilor..........................................136 7.2.7. Alocarea dinamică a memoriei..............................137 7.2.8. Pointeri la structuri................................................139 7.2.9. Structuri dinamice liniare de tip listă...................142 Capitolul VIII.................................................................................155 FUNCŢII.......................................................................................155 8.1. Forma generală a unei funcţii.......................................155 8.2. Reîntoarcerea dintr-o funcţie........................................158 8.3. Valori returnate.............................................................159 8.4. Domeniul unei funcţii...................................................160 8.4.1. Variabile locale.....................................................160 8.4.2. Parametri formali...................................................162 8.4.3. Variabile globale...................................................163 8.5. Apelul funcţiilor............................................................167 8.6. Apelul funcţiilor având ca argumente tablouri.............168 8.7. Argumentele argc şi argv ale funcţiei main()...............172 8.8. Funcţii care returnează valori neîntregi........................173 8.9. Returnarea pointerilor...................................................174 8.10. Funcţii de tip void.......................................................177 8.11. Funcţii prototip............................................................178 8.12. Funcţii recursive..........................................................180 8.13. Clase de memorare (specificatori sau atribute)...........181 8.14. Pointeri la funcţii.........................................................187 Capitolul IX....................................................................................188 PREPROCESAREA.....................................................................189 9.1. Directive uzuale............................................................189 9.2. Directive pentru compilare condiţionată.......................191 IV
  5. 5. 9.3. Modularizarea programelor.........................................195 Capitolul X.....................................................................................200 ........................................................................................................200 INTRĂRI/IEŞIRI...........................................................................200 10.1. Funcţii de intrare şi ieşire - stdio.h..............................200 10.2. Operaţii cu fişiere........................................................203 10.3. Nivelul inferior de prelucrare a fişierelor...................206 10.3.1. Deschiderea unui fişier........................................206 10.3.2. Scrierea într-un fişier...........................................210 10.3.3. Citirea dintr-un fişier...........................................212 10.3.4. Închiderea unui fişier...........................................214 10.3.5. Poziţionarea într-un fişier....................................214 10.3.6 Ştergerea unui fişier.............................................216 10.3.7. Exemple de utilizare a funcţiilor de intrare/ieşire de nivel inferior.......................................................217 10.4. Nivelul superior de prelucrare a fişierelor..................222 10.4.1. Funcţia fopen()....................................................223 10.4.2. Funcţia fclose()....................................................224 10.4.3. Funcţiile rename() şi remove()...........................225 10.4.4. Funcţii de tratare a erorilor..................................225 10.4.5. Funcţii cu acces direct.........................................226 10.4.6. Funcţii pentru poziţionare...................................228 10.4.7. Ieşiri cu format....................................................229 10.4.8. Intrări cu format..................................................232 10.4.9. Funcţii de citire şi scriere a caracterelor..............235 Capitolul XI....................................................................................239 ........................................................................................................239 Utilizarea ecranului.......................................................................239 în mod text.....................................................................................239 11.1. Setarea ecranului în mod text......................................240 11.2. Definirea unei ferestre.................................................241 11.3. Ştergerea unei ferestre.................................................241 11.4. Deplasarea cursorului..................................................241 11.5. Setarea culorilor..........................................................242 11.6. Funcţii pentru gestiunea textelor.................................243 Capitolul XII..................................................................................246 V
  6. 6. ........................................................................................................246 Utilizarea ecranului.......................................................................246 în mod GRAFIC............................................................................246 12.1. Iniţializarea modului grafic.........................................247 12.2. Gestiunea culorilor......................................................249 12.3. Setarea ecranului.........................................................251 12.4. Utilizarea textelor în mod grafic.................................251 12.5. Gestiunea imaginilor...................................................253 12.6. Desenarea şi colorarea figurilor geometrice...............254 Capitolul XIII.................................................................................260 Funcţii matematice .......................................................................260 13.1 Funcţii trigonometrice..................................................261 13.2 Funcţii trigonometrice inverse.....................................261 13.3 Funcţii hiperbolice.......................................................261 13.4 Funcţii exponenţiale şi logaritmice..............................262 13.5 Generarea de numere aleatoare....................................262 13.6 Alte tipuri de funcţii matematice.................................263 Capitolul XIV.................................................................................264 ELEMENTE DE PROGRAMARE AVANSATĂ.......................264 14.1 Gestionarea memoriei..................................................264 14.1.1 Memoria convenţională........................................264 14.1.2 Memoria expandată..............................................267 14.1.3 Memoria extinsă...................................................268 14.1.4 Stiva......................................................................268 14.2 Servicii DOS şi BIOS..................................................269 14.2.1 Serviciile BIOS....................................................270 14.2.2 Serviciile DOS......................................................274 14.3 Bibliotecile C...............................................................277 14.3.1 Reutilizarea unui cod obiect.................................278 14.3.2 Lucrul cu fişiere bibliotecă...................................278 14.3 Fişierele antet...............................................................279 BIBLIOGRAFIE............................................................................279 VI
  7. 7. Capitolul I INTRODUCERE ÎN ARHITECURA SISTEMELOR DE CALCUL 1.1. Importanţa limbajului C Creat în anul 1972 de programatorii de sistem Dennis M. Ritchie şi Brian W. Kernighan de la Bell Laboratories cu scopul de a asigura implementarea portabilă a sistemului de operare UNIX, C-ul este astăzi unul din cele mai cunoscute şi puternice limbaje de programare. Eficient, economic şi portabil, C-ul este o alegere bună pentru realizarea oricărui tip de programe, de la editoare de texte, jocuri cu facilităţi grafice, programe de gestiune şi pentru calcule ştiinţifice, până la programe de sistem, constituind unul dintre cele mai puternice instrumente de programare. Adesea referit ca limbaj portabil, C-ul permite transferul programelor între calculatoare cu diferite procesoare şi în acelaşi timp facilitează utilizarea caracteristicilor specifice ale maşinilor particulare, programele scrise în C fiind considerate cele mai portabile. Dacă evoluţia limbajelor de programare a adus în prim plan nume ca FORTRAN, LISP, COBOL, ALGOL-60 sau PASCAL, unele cu răspândire mai mult ”academică” – fiind folosite pentru a prezenta conceptele de bază sau conceptele avansate de programare – ca de pildă ALGOL-60 sau PASCAL, altele cu răspândire industrială masivă – ca de pildă FORTRAN şi COBOL – limbajul C a pătruns mai lent, dar foarte sigur. Realitatea arată clar că, în momentul de faţă, piaţa producătorilor de programe este dominată net de C şi de variantele evoluate ale acestuia. Elementele principale care au contribuit la succesul C-ului sunt următoarele: - modularizarea programelor – ce dă posibilitatea unui singur programator să stăpânească relativ uşor programe de zeci de mii de linii de sursă; 1
  8. 8. - capacitatea de programare atât la nivel înalt cât şi la nivel scăzut – ceea ce dă posibilitatea utilizatorului de a programa fie fără a ”simţi” sistemul de operare şi maşina de calcul, fie la un nivel apropiat de sistemul de operare ceea ce permite un control foarte bun al eficienţei programului din punct de vedere viteză/memorie; - portabilitatea programelor – ce permite utilizarea programelor scrise în C pe o mare varietate de calculatoare şi sisteme de operare; - facilităţile de reprezentare şi prelucrare a datelor – materializate printr-un număr mare de operatori şi funcţii de bibliotecă ce fac programarea mult mai uşoară. Prin anii ’80 interesul pentru programarea orientată pe obiecte a crescut, ceea ce a condus la apariţia de limbaje care să permită utilizarea ei în scrierea programelor. Limbajul C a fost dezvoltat şi el în această direcţie şi în anul 1980 a fost dat publicităţii limbajul C++, elaborat de Bjarne Stroustrup de la AT&T. La ora actuală, majoritatea limbajelor de programare moderne au fost dezvoltate în direcţia programării orientate pe obiecte. Limbajul C++, ca şi limbajul C, se bucură de o portabilitate mare şi este implementat pe o gamă largă de calculatoare începând cu microcalculatoare şi până la cele mai mari supercalculatoare. Limbajul C++ a fost implementat pe microcalculatoarele compatibile IBM PC în mai multe variante. Cele mai importante implementări ale limbajelor C++ pe aceste calculatoare sunt cele realizate de firmele Microsoft şi Borland. Conceptele programării orientate pe obiecte au influenţat în mare măsură dezvoltarea limbajelor de programare în ultimul deceniu. De obicei, multe limbaje au fost extinse astfel încât ele să admită conceptele mai importante ale programării orientate pe obiecte. Uneori s-au făcut mai multe extensii ale aceluiaşi limbaj. De exemplu, limbajul C++ are ca extensii limbajul E ce permite crearea şi gestiunea obiectelor persistente, lucru deosebit de important pentru sistemele de gestiune a bazelor de date, limbajul O ce încearcă să îmbine facilităţile de nivel înalt cu cele ale programării de sistem, limbajul Avalon/C++ destinat calculului distribuit, şi nu în ultimul rând binecunoscutul de acum limbaj Java, specializat în aplicaţii Internet. Interfeţele utilizator au atins o mare dezvoltare datorită facilităţilor oferite de componentele hardware ale diferitelor 2
  9. 9. calculatoare. În principiu, ele simplifică interacţiunea dintre programe şi utilizatorii acestora. Astfel, diferite comenzi, date de intrare sau rezultate pot fi exprimate simplu şi natural utilizând diferite standarde care conţin ferestre, bare de meniuri, cutii de dialoguri, butoane, etc. Cu ajutorul mouse-ului toate acestea pot fi accesate extrem de rapid şi uşor fără a mai fi nevoie să cunoşti şi să memorezi o serie întreagă comenzi ale sistemului de operare sau ale limbajului de programare. Toate acestea conduc la interfeţe simple şi vizuale, accesibile unui segment foarte larg de utilizatori. Implementarea interfeţelor este mult simplificată prin utilizarea limbajelor orientate spre obiecte, aceasta mai ales datorită posibilităţii de a utiliza componente standardizate aflate în biblioteci specifice. Importanţa aplicării conceptului de reutilizare a codului rezultă din faptul că interfeţele utilizator adesea ocupă 40% din codul total al aplicaţiei. Firma Borland comercializează o bibliotecă de componente standardizate care pot fi utilizate folosind limbajul C++, bibliotecă cunoscută sub numele Turbo Vision. De obicei, interfeţele utilizator gestionează ecranul în mod grafic. O astfel de interfaţă utilizator se numeşte interfaţă utilizator grafică. Una din cele mai populare interfeţe utilizator grafice pentru calculatoarele IBM PC este produsul Windows oferit de firma Microsoft. Windows este un mediu de programare ce amplifică facilităţile oferite de sistemul de operare MS-DOS. Aplicaţiile Windows se pot dezvolta folosind diferite medii de dezvoltare ca: Turbo C++ pentru Windows, Pascal pentru Windows, Microsoft C++, Microsoft Visual Basic, Visual C şi Visual C++. Componentele Visual permit specificarea în mod grafic a interfeţei utilizator, a unei aplicaţii, folosind mouse-ul, iar aplicaţia propriu-zisă se programează într-un limbaj de tip Basic, C sau C++. Dacă în ani ’70 se considera că o persoană este rezonabil să se poată ocupa de o aplicaţie de 4-5 mii de instrucţiuni, în prezent, în condiţiile folosirii limbajelor de programare orientate pe obiecte, această medie a ajuns la peste 25 de mii de instrucţiuni. Un limbaj de programare trebuie privit nu doar la suprafaţa sa – sintaxă şi mod de butonare a calculatorului pentru o implementare particulară – ci mai ales în profunzime, prin conceptele pe care se bazează, prin stilul de programare, prin modul de structurare a 3
  10. 10. aplicaţiei şi, implicit, a programului, prin filozofia de rezolvare a problemelor folosind limbajul. Din aceste puncte de vedere, C-ul nu poate lipsi din cultura unui programator, iar pentru un profesionist C- ul este, şi mai mult, o necesitate vitală, acesta fiind piatra de temelie pentru înţelegerea şi utilizarea eficientă a limbajelor de nivel înalt orientate pe obiecte şi Visual. 1.2 Arhitectura de bază a unui calculator Calculatoarele de tip PC (calculatoare personale) reprezintă cele mai răspândite şi mai utilizate dintre calculatoare, datorită gradului de accesibilitate şi preţului relativ scăzut. Indiferent de tipul calculatorului, modul general de concepţie, de alcătuire şi funcţionare este acelaşi. Calculatorul este o maşină programabilă. Două dintre principalele caracteristici ale unui calculator sunt: 1. Răspunde la un set specific de instrucţiuni într-o manieră bine definită. 2. Calculatorul poate executa o listă preînregistrată de instrucţiuni, numită program. Calculatoarele moderne sunt electronice şi numerice.  Partea de circuite electrice şi electronice precum şi conexiunile fizice dintre ele se numeşte hardware.  Totalitatea programelor precum şi datele aferente acestor programe poartă denumirea de software. 4
  11. 11. Echipamente de ieşire Echipamente de stocare date (HDD, FDD, CD-ROM, etc.) UPC Unitatea de procesare şi control Echipamente de intrare Fig.1.1 Configuraţia standard pentru utilizator Partea hardware a unui calculator este formată din totalitatea componentelor sale fizice. Toate calculatoarele de uz general necesită următoarele componente hardware:  memorie: Permite calculatorului să stocheze, cel puţin temporar, date şi programe.  dispozitive de stocare externe: Permit calculatoarelor să stocheze permanent programe şi mari cantităţi de date. Cele mai uzuale dispozitive de stocare externă sunt HDD (hard disk drives), FDD (floppy disk drive) şi CD-ROM (Compact Disk-Read Only Memory) sau CD-R/W (Compact Disk- Read/Write).  dispozitive de intrare : În mod uzual sunt reprezentate de tastatură (keyboard) şi de mouse. Aceste dispozitive reprezintă calea uzuală de introducere a datelor şi instrucţiunilor care gestionează funcţionarea unui calculator.  dispozitive de ieşire: Reprezintă modalitatea prin care calculatorul transmite utilizatorului uman rezultatele execuţiei programelor. Ecranul monitorului sau imprimanta sunt astfel de dispozitive uzuale.  unitatea de procesare şi control (UPC) : Este partea principală a unui calculator deoarece este componenta care execută instrucţiunile. În mod uzual această unitate de procesare şi control este reprezentată de un microprocesor care se 5
  12. 12. plasează pe placa de bază (mainboard) a calculatorului împreună cu memoria internă RAM. În plus faţă de aceste componente orice calculator este prevăzut cu o magistrală (bus) prin care se gestionează modalitatea de transmitere a datelor între componentele de bază ale calculatorului. Magistrala reprezintă o colecţie de trasee electrice care leagă microprocesorul de dispozitivele de intrare/ieşire şi de dispozitivele interne/externe de stocare a datelor. Putem distinge magistrala de date, magistrala de adrese şi magistrala de comandă şi control. În figura 1.2 este prezentată interacţiunea dintre componentele HARD principale ale unui calculator. Calculatoarele pot fi în general clasificate după dimensiuni sau putere de calcul. Nu se poate face însă la ora actuală o distincţie netă între următoarele categorii de calculatoare: PC (Personal Computer): Un calculator de dimensiuni mici, monoutilizator (single-user), bazat pe un microprocesor. În plus acesta este dotat standard cu tastatură, mouse, monitor şi dispozitive periferice de stocare a datelor. Memoria secundară Echipament UNITATEA Echipament de intrare CENTRALĂ de ieşire Memoria principală Fig. 1.2 Arhitectura minimală a unui sistem de calcul  staţii de lucru (workstation): Un calculator monoutilizator de mare putere. Aceasta este asemănător unui PC dar are un microprocesor mai puternic şi un monitor de înaltă calitate (rezoluţie mai mare). 6
  13. 13.  minicalculator (minicomputer): Un calculator multiutilizator (multi-user) capabil să lucreze simultan cu zeci sau chiar sute de utilizatori.  mainframe: Un calculator multiutilizator capabil să lucreze simultan cu sute sau chiar mii de utilizatori.  supercomputer: Un computer extrem de rapid care poate executa sute de milioane de operaţii într-o secundă. 1.2.1 Microprocesorul Microprocesorul este cea mai importantă şi cea mai scumpă componentă a unui calculator de performanţele acesteia depinzând în mare măsură rezultatele întregului sistem. Din punct de vedere fizic, microprocesorul este un cip ce conţine un circuit integrat complex ce îi permite să prelucreze informaţii prin executarea unor operaţii logice şi matematice diverse (adunări, scăderi, înmulţiri, împărţiri, comparări de numere). El este compus din două părţi importante: unitatea de execuţie (EU – Execution Unit) şi unitatea de interfaţă a magistralei de date (BIU – Bus Interface Unit). Prima componentă realizează efectiv operaţiile, iar cea de-a doua are funcţia de transfer a datelor de la şi înspre microprocesor. Microprocesorul reprezintă de fapt unitatea centrală a unui calculator şi îndeplineşte o serie de activităţi specifice cum ar fi: execută operaţii aritmetice şi logice, decodifică instrucţiuni speciale, transmite altor cipuri din sistem semnale de control. Toate aceste operaţii sunt executate cu ajutorul unor zone de memorie ale microprocesorului, numite registre. Orice microprocesor are un set finit de instrucţiuni pe care le recunoaşte şi pe care le poate executa. Calculatoarele IBM PC folosesc procesoare INTEL sau compatibile, realizate de alte companii cum ar fi: AMD, NexGen, CYRIX. Numele microprocesorului este folosit la identificarea calculatorului. Se folosesc frecvent expresii de tipul calculator 386, calculator 486, calculator Pentium II, etc. În 1971 firma Intel a fost abordata de o companie Japoneza, acum dispărută, pentru a construi un circuit dedicat pentru un nou calculator. Designerul Ted Hoff a propus o soluţie programabilă, de uz general, şi astfel s-a născut circuitul Intel 4004. Au urmat la scurt timp chipurile 4040 si 8008 dar lor le lipseau multe din caracteristicile microprocesoarelor aşa cum le ştim noi azi. În 1974 Intel a prezentat 7
  14. 14. pentru prima oară circuitul Intel 8080 care a fost folosit in sistemele Altair şi IMSAI. Curând după aceea au apărut procesoarele Motorola 6800 şi 6502 de la MOS Technology. Doi dintre proiectanţii de la Intel au părăsit firma, creând corporaţia ZILOG care a produs chipul Z80 (compatibil cu 8080 dar cu set de instrucţiuni mai puternic şi de două ori mai rapid. Cipul Intel 4004 a fost primul procesor comercial, lansat la sfârşitul anului 1971. La un preţ de circa 200$ şi înglobând 2300 de tranzistori, cipul 4004 dezvolta mai multă putere de calcul decât ENIAC, primul calculator electronic, cu 25 de ani în urma. Faţă de cele 18.000 de tuburi cu vacuum ce ocupau 900 metri cubi, procesorul 4004 putea dezvolta 60.000 de operaţii pe secundă. Această invenţie a contribuit la revoluţionarea domeniilor de aplicaţii ale computerelor, dând startul unui adevărat galop de inovaţii tehnologice. Următorul pas a fost în 1980, când IBM a inclus un procesor Intel în arhitectura primului PC. Astăzi PC-urile sunt pretutindeni în jurul nostru. Un copil care lucrează la o maşina ce incorporează un procesor Pentium Pro beneficiază de mult mai multă putere de calcul decât dispunea guvernul SUA în perioada lansării primelor echipaje umane către Lună. Într-un număr aniversar al publicaţiei Communications of the ACM, Gordon Moore, co-fondator al companiei Intel, era optimist în privinţa evoluţiei PC-urilor şi a microprocesoarelor: "complexitatea microprocesoarelor, care se măsoară prin numărul de tranzistori pe cip, s-a dublat aproape constant la fiecare 18 luni, de la apariţia primului prototip 4004. Aceasta evoluţie exponenţială a determinat o continuă creştere a performanţelor PC-urilor şi o scădere a costului procesului de calcul. Pe când în 1991 un PC bazat pe procesorul Intel 486 costa aproape 225$ pentru o performanţă de un milion de instrucţiuni pe secundă (MIPS), astăzi, un sistem desktop ce utilizează un cip Pentium Pro este evaluat la circa 7$ pe MIPS. Nu se întrevede nici o dificultate care să frâneze această rată de dezvoltare". 1.2.2 Memoria Microprocesorul are capacitatea de a memora date care urmează a fi prelucrate, cât şi rezultatele intermediare. Se observă că rolul său principal este de a prelucra şi transmite informaţiile şi rezultatele şi deci capacitatea sa de memorare este mică neputând stoca programe. 8
  15. 15. De aceea, un calculator necesită şi o memorie care să găzduiască date şi programe. Memoria este formată din punct de vedere fizic din cipuri ce stochează informaţia sub forma a două niveluri de tensiune ce corespund valorilor 0 şi 1 din sistemul de numeraţie. Celulele de bază ale memoriei (ce pot avea valoarea 0 sau 1) se numesc biţi şi ele reprezintă particulele cele mai mici de informaţie din calculator. Pentru citirea informaţiilor nu se folosesc biţi în mod individual ci aceştia sunt grupaţi într-o succesiune. Astfel o succesiune de 8 biţi formează un octet (sau un byte) aceasta reprezentând unitatea de măsură a capacităţii de memorie. Deoarece reprezentarea numerelor în calculator se face în baza 2 şi nu în baza 10, aşa cum suntem obişnuiţi în mod normal să lucrăm, şi multiplii unui byte vor fi puteri ale lui 2, astfel: 1 KB=210B=1024 B 1 MB=210KB=1 048 576 B 1 GB=210MB=230 B Abrevierile K (kilo), M (mega), G (giga) se scriu de obicei cu litere mari şi reprezintă mii, milioane şi, respectiv, miliarde. Memoria unui calculator are două componente: memoria principală (internă) şi memoria secundară (externă). Memoria internă este memoria ce poate fi accesată în mod direct de către microprocesor şi în care sunt încărcate programele înainte de a fi executate de către microprocesor. Dacă primele procesoare puteau accesa doar 1 MB de memorie astăzi un procesor Pentium poate accesa peste 256 MB. Memoria principală este formată din două tipuri de circuite: cip-uri ROM şi cip-uri RAM. Circuitele de tip ROM (Read Only Memory) au memorate programele care controlează iniţial calculatorul (sistemul de operare). Aceste memorii pot fi doar citite (conţinutul lor nu poate fi modificat). Înscrierea conţinutului acestor memorii se face de către fabricant, iar operaţiunea de înscriere cu programe se mai numeşte „arderea memoriilor”. Circuitele de tip RAM (Random Acces Memory ) sunt memorii la care utilizatorul are acces şi al căror conţinut se şterge la deconectarea calculatorului. În memoria RAM informaţia este stocată temporar. De exemplu, programele de aplicaţii curente şi datele asociate acestor aplicaţii sunt încărcate în memoria RAM înainte de a fi prelucrate de către microprocesor. 9
  16. 16. Deoarece capacitatea de memorie a unui calculator nu poate fi atât de mare încât să poată păstra toate programele pe vrem să le executăm, a apărut necesitatea existenţei unor memorii externe, care să fie solicitate la nevoie. Rolul acestora îl joacă discurile şi ele pot fi asemănate cu cărţile dintr-o bibliotecă pe care le putem consulta ori de câte ori avem nevoie de anumite informaţii. Primele discuri apărute pentru PC-uri, numite şi dischete, floppy disk-uri sau discuri flexibile, permiteau stocarea a maximum 160 KB de informaţie. Astăzi mai există doar dischete cu diametrul de 3.5 inch cu capacitatea de 1,44 MB. Existenţa acestora pare a fi pusă însă în pericol de apariţia CD-urilor reinscriptibile a căror capacitate de memorare depăşeşte 700 MB iar evoluţia tehnologică, din ce în ce mai rapidă, dă semne că lucrurile nu se vor opri aici. Dischetele folosesc metode magnetice de memorare a informaţiei motiv pentru care ele se mai numesc şi suporturi magnetice de informaţie. Principala componentă a unui calculator utilizată pentru memorarea programelor o reprezintă hard discul. Acesta poate fi asemănat cu o dischetă de mare capacitate, integrată într-o unitate încapsulată. Iniţial, puţine PC-uri prezentau hard discuri, dar cum preţurile acestora au scăzut considerabil, iar performanţele şi capacităţile au crescut, în prezent toate calculatoarele prezintă acest dispozitiv. În clipa de faţă, capacitatea de memorare a unui hard disc a depăşit valoarea de 40 de GB. 1.2.3 Echipamentele periferice Comunicarea om-maşină se realizează cu ajutorul echipamentelor periferice prin intermediul cărora utilizatorul poate programa sau da anumite comenzi calculatorului sau poate vizualiza rezultatele obţinute de către anumite programe. Principalele echipamente periferice ale unui calculator sunt următoarele: tastatura, mouse-ul, scanner-ul, monitorul şi imprimanta. Ele pot fi grupate în echipamente de intrare – cele prin care calculatorul primeşte informaţii sau comenzi (tastatură, mouse, scanner) - şi echipamente de ieşire – cele prin care calculatorul transmite informaţii în exterior (monitor, imprimantă). În continuare sunt prezentate câteva caracteristici ale fiecărui echipament. Tastatura – este principalul dispozitiv de intrare al calculatorului prin intermediul căruia se transmit comenzi către 10
  17. 17. unitatea centrală. Cuplarea la calculator a tastaturii se face prin intermediul unui cablu de conectare. Din punct de vedere al dispunerii tastelor, tastatura se aseamănă destul de mult cu cea a unei maşini de scris dar are şi părţi care o individualizează. Primele tastaturi au avut 83/84 de taste, pentru ca, ulterior, ele să fie îmbogăţite prin dublarea tastelor existente sau adăugarea altora noi, ajungându-se la 101/102 taste. Din punct de vedere al funcţionalităţii lor ele pot fi împărţite în patru categorii: - taste alfanumerice; - taste cu scopuri speciale; - taste direcţionale şi numerice; - taste funcţionale. Tastele alfanumerice conţin literele, cifrele şi semnele de punctuaţie şi ocupă partea centrală a tastaturii. Acţionarea unei astfel de taste determină apariţia caracterului corespunzător pe ecranul calculatorului. Tastele cu scopuri speciale sunt aşezate în acelaşi bloc cu tastele alfanumerice şi determină efectuarea anumitor acţiuni fără înscrierea de caractere pe ecran. Tastele de mişcare se află situate în partea dreaptă a tastaturii şi ele funcţionează în două moduri, care pot fi comutate prin acţionarea altei taste, aflate deasupra lor, pe care scrie NumLock. Dacă ledul corespunzător acestei taste este aprins, modul de lucru este numeric, în caz contrar fiind comutat pe semnificaţia direcţională. Tastele funcţionale sunt un grup de 12 taste situate în partea de sus a tastaturii având pe ele litera F urmată de un număr între 1 şi 12. Acţionarea acestor taste determină efectuarea unor operaţii specifice de la program la program. Mouse-ul – este tot un echipament de intrare mai uşor de manevrat decât tastatura dar care poate efectua mai puţine operaţii. Totuşi, foarte multe aplicaţii (în special aplicaţiile grafice) nu mai pot fi concepute fără mouse. Un mouse are aspectul unei bucăţi de săpun, uşor manevrabil, având dedesubt o bilă poziţionabilă, cu sensibilitate şi viteză reglabile. Mişcarea maouse-ului pe o suprafaţă plană este corelată cu deplasarea pe ecran a unui cursor cu o formă deosebită: cruciuliţă, săgeată, etc. Declanşarea unei acţiuni se face prin poziţionarea cursorului în zona corespunzătoare şi apăsarea unuia dintre butoanele aflate pe partea posterioară. Iniţial un mouse avea două sau trei 11
  18. 18. butoane. Acum există mouse-uri cu 5 butoane şi 2 rotiţe ce îndeplinesc o serie de funcţii corespunzătoare unor taste speciale. Folosirea mouse-ului uşurează mult munca utilizatorilor, nemaifiind necesar ca aceştia să memoreze numărul relativ mare de comenzi corespunzător fiecărui produs, ca în situaţia în care se foloseşte numai tastatura. Utilitatea mouse-ului este şi mai evidentă în cazul aplicaţiilor grafice. De altfel, WINDOWS este un sistem de operare creat special pentru lucrul cu mouse-ul. Scanner-ul – reprezintă dispozitive care se cuplează la un PC şi cu care, prin intermediul unui software adecvat, se pot capta imagini, fotografii, texte etc., în vederea unei prelucrări ulterioare. Astfel se pot manevra imagini foto, se pot crea efecte grafice speciale, care nu se pot obţine prin metode tradiţionale. După captare, imaginea poate fi prelucrată, mutată, mărită, micşorată, rotită, colorată, umbrită, suprapusă cu altă imagine etc. Cu un software de recunoaştere optică a caracterelor datele sau documentele tipărite pe coli de hârtie pot fi transformate în fişiere, putându-se realiza chiar o stocare a lor sub formă de arhivă. Monitorul - Sistemul video este format din două părţi: un adaptor (placă) video şi un monitor sau display. Adaptorul video reprezintă dispozitivul care realizează legătura (interfaţa) cu calculatorul şi se află în interiorul acestuia. El va fi corespunzător tipului de monitor video care îi este ataşat. Adaptorul video realizează o rezoluţie orizontală şi una verticală. Rezoluţia reprezintă numărul de elemente, în cazul de faţă puncte – pixeli – care pot fi afişate pe ecran. De exemplu, un monitor VGA, în mod video, are o rezoluţie de 640 x 480 pixeli. Standardul VGA (Video Graphics Array) a fost introdus de către IBM o dată cu calculatoarele PS/2, iar modurile video VGA reprezintă un superset al standardelor video anterioare, CGA (Color Graphics Adapter) şi EGA (Enhanced Graphics Adapter). Cea mai importantă îmbunătăţire adusă de standardul VGA a fost rezoluţia superioară a caracterelor în modul text, precum şi posibilitatea de a afişa 256 de culori la un moment dat. Monitorul, denumit uneori şi display, permite vizualizarea datelor introduse de la tastatură sau rezultate în urma execuţiei unor comenzi sau programe, fiind încadrat în categoria echipamentelor periferice de ieşire. Ca piesă principală, monitorul conţine un tub de 12
  19. 19. vacuum, similar cu cel de la televizor şi trei tunuri de electroni (corespunzătoare celor trei culori fundamentale). Standardele video MDA, CGA şi EGA folosesc monitoare digitale. Datele care descriu culorile pixelilor sunt trimise de adaptorul video la monitor sub forma unor serii de semnale digitale care sunt echivalente unor serii de biţi. Standardul VGA a introdus un nou tip de monitor care utilizează semnale analogice pentru transferul informaţiilor privind culoarea de la adaptorul video la monitor. Dacă semnalele digitale prezintă niveluri care indică prezenţa sau absenţa unui bit, semnalele analogice pot prezenta orice valoare între una minimă şi una maximă. Imprimanta - Reprezintă un dispozitiv care poate fi ataşat unui calculator, cu scopul tipăririi de texte şi grafică, putând fi considerată un fel de maşină de scris automată. Până în prezent au fost realizate un număr destul de mare de tipuri de imprimante pentru PC-uri, ele diferind atât prin performanţe, cât şi prin modalităţile tehnice de ralizare. Fiecare dintre ele prezintă avantaje şi dezavantaje, ideal fiind a o folosi pe cea care corespunde cel mai bine tipului de lucrări executate. În funcţie de modul în care este realizată imprimarea se disting următoarele tipuri de imprimante: - imprimante matriceale cu 9, 18 sau 24 de ace – realizează imprimarea prin impactul acelor peste o bandă de hârtie; - imprimante cu jet de cerneală – funcţionează prin pulverizarea fină a unor picături de cerneală pe hârtia de imprimat; - imprimante laser – ce utilizează o rază laser sau mici diode luminiscente care încarcă electrostatic un tambur de imprimare, corespunzător caracterului care urmează a fi imprimat; - imprimante rapide de linii – ce imprimă mai multe linii odată, fiind folosite mai mult la sisteme de calcul de dimensiuni mari. Calitatea imprimării creşte de la primul la ultimul tip prezentat, dar în mod corespunzător şi preţul echipamentului. 1.3. Programarea calculatorului 13
  20. 20. Programele de calculator, cunoscute sub numele de software, sunt constituite dintr-o serie de instrucţiuni pe care le execută calculatorul. Când se creează un program, trebuie specificate instrucţiunile pe care calculatorul trebuie să le execute pentru a realiza operaţiile dorite. Procesul de definire a instrucţiunilor pe care le execută calculatorul se numeşte programare. Programele executate pe un calculator pot fi împărţite în trei categorii: • programe de aplicaţie – sunt acele programe care interacţionează direct cu utilizatorul, specializate în realizarea unei categorii de prelucrări. Editoarele de texte, programele pentru gestiunea bazelor de date, programele de tehnoredactare asistată de calculator, de grafică etc. sunt programe de aplicaţie. • utilitare – programe, care la fel ca programele de aplicaţie, interacţionează direct cu utilizatorul, dar, spre deosebire de acestea, realizează prelucrări de uz general. Utilitarele realizează o serie de operaţii de „gospodărie” cum ar fi: copierea fişierelor, pregătirea discurilor magnetice pentru utilizare, crearea de copii de salvare, testarea echipamentului, etc. • programe de sistem – realizează legătura între componentele electronice ale calculatorului şi programele de aplicaţie şi utilitare. Rolul programului de sistem este acela de a uşura sarcina programatorului, simplificând îndeplinirea acelor sarcini care sunt comune marii majorităţi a programelor de aplicaţie: alocarea memoriei, afişarea caracterelor pe ecran şi la imprimantă, citirea caracterelor de la tastatură, accesul la informaţiile stocate pe disc magnetic, etc. 1.3.1. Sistemul de operare Sistemul de operare este o parte componentă a software-ului unui calculator, care mai cuprinde un număr variabil de programe utilitare selectate conform cu necesităţile programatorilor. Sistemul de operare este un program cu funcţii de coordonare şi control asupra resurselor fizice ale calculatorului şi care intermediază dialogul om-calculator. Sistemul de operare permite rularea programelor şi păstrarea informaţiilor pe disc. În plus, fiecare sistem 14
  21. 21. de operare pune la dispoziţia aplicaţiilor o serie de servicii care permit programelor să aloce memorie, să acceseze diferite echipamente periferice, cum ar fi imprimanta, şi să gestioneze alte resurse ale calculatorului. Un sistem de operare trebuie să aibă capacitatea de a se adapta rapid la modificările tehnologice, rămânând în acelaşi timp compatibil cu hardware-ul anterior. Lanţul de comunicare utilizator – calculator este prezentat în Figura 1.3: Sistemul de operare este cel mai important program care rulează pe un calculator. Orice calculator de uz general este dotat cu un sistem de operare care permite execuţia altor programe. Sistemele de operare execută operaţiuni de bază precum: recunoaşterea unei intrări de la tastatură (preluare caracter), trimiterea unui caracter pentru afişare pe ecranul monitorului, gestionarea fişierelor şi a directoarelor pe disc (floppy-disk sau hard-disk), controlul fluxului de date cu echipamentele periferice ca drivere de disc sau imprimante. CALCULATOR SISTEM DE OPERARE APLICAŢII UTILIZATOR Fig. 1.3. Comunicarea utilizator - calculator 15
  22. 22. Aplicaţie Disk-drive Sistem de operare Mouse Monitor Tastaturã Imprimantã Fig. 1.4 Rolul sistemului de operare Sistemul de operare al unui calculator este partea de software necesară şi suficientă pentru execuţia oricăror alte aplicaţii dorite de utilizator. Un calculator nu poate funcţiona decât sub gestiunea unui sistem de operare. Orice aplicaţie lansată în execuţie de către un utilizator apelează la resursele puse la dispoziţie de către sistemul de operare. Sistemul de operare interfaţează calculatorul cu operatorul uman de o manieră cât mai transparentă cu putinţă astfel încât utilizatorul nu trebuie să facă eforturi mari de adaptare dacă lucrează cu arhitecturi hardware diferite. Pentru sisteme mai mari, sistemele de operare au responsabilităţi şi capabilităţi şi mai mari. Ele acţionează ca un gestionar al traficului de date şi al execuţiei programelor. În principal sistemul de operare asigură ca diferite programe şi diferiţi utilizatori să nu interfereze unele cu altele. Sistemul de operare este de asemenea responsabil cu securitatea, asigurând inaccesibilitatea persoanelor neautorizate la resursele sistemului. Sistemele de operare se pot clasifica după cum urmează:  multi-user: Permit ca doi sau mai mulţi utilizatori să ruleze în acelaşi timp programe (utilizatori concurenţi). Anumite sisteme de operare permit sute sau chiar mii de utilizatori concurenţi.  multiprocesor: Permit execuţia unui program pe mai mult de un microprocesor. 16
  23. 23.  multitasking: Permit mai multor programe să ruleze în acelaşi timp (execuţie concurentă).  multithreading: Permit diferitelor părţi ale unui program să fie executate concurent.  timp real (real time): Răspund instantaneu la diferite intrări. Sistemele de operare de uz general, ca DOS sau UNIX nu sunt sisteme de operare de timp real. Sistemele de operare furnizează o platformă software pe baza căreia alte programe, numite programe de aplicaţie, pot rula (pot fi executate). Programele de aplicaţie trebuie să fie scrise pentru a rula pe baza unui anumit sistem de operare. Alegerea unui anumit sistem de operare determină în consecinţă mulţimea aplicaţiilor care pot fi rulate pe calculatorul respectiv. Pentru PC-uri, cele mai populare sisteme de operare sunt DOS, OS/2 sau Windows, dar mai sunt disponibile şi altele precum Linux. Ca utilizator se interacţionează cu sistemul de operare prin intermediul unor comenzi. Spre exemplu, sistemul de operare DOS acceptă comenzi precum COPY sau RENAME pentru a copia fişiere sau pentru a le redenumi. Aceste comenzi sunt acceptate şi executate de o parte a sistemului de operare numită procesor de comenzi sau interpretor de linie de comandă. Interfaţele grafice cu utilizatorul (GUI, Graphical user interfaces) permit introducerea unor comenzi prin selectarea şi acţionarea cu mouse-ul a unor obiecte grafice care apar pe ecran. Spre exemplu, sistemul de operare Windows are un desktop ca intefaţă garfică cu utilizatorul. Pe acest desktop (birou) se află diferite simboluri grafice (icoane, icons) ataşate diferitelor aplicaţii disponibile pe calculatorul respectiv. Utilizatorul are multiple posibilităţi de configurare a acestei intefeţe grafice. Primul sistem de operare creat pentru calculatoare a fost CP/M (Control Program for Microcomputers), realizat pentru calculatoarele pe 8 biţi. O dată cu perfecţionarea componentelor HARD s-a impus şi necesitatea dezvoltării unui SOFT adecvat. Astfel, în 1981, a apărut prima versiune a sistemului de operare MS-DOS. Sistemul de operare MS–DOS (MicroSoft Disk Operating System) este destinat gestionării resurselor software si hardware ale microcalculatoarelor cu o arhitectura de tip IBM – PC sau compatibilă cu aceasta şi echipate cu procesoare 8086 sau 80x86, Pentium. Odată cu creşterea 17
  24. 24. capabilităţilor hardware ale calculatoarelor, acesta s-a transformat, prin dezvoltări succesive, în Windows. Indiferent de sistemul de operare utilizat, din punctul de vedere al utilizatorului, informaţiile sunt scrise pe disc sub forma unor fişiere. Un fişier este o colecţie de informaţii grupate sub acelaşi nume. Un fişier poate fi un program executabil, un text, o imagine, un grup de comenzi sau orice altceva. Un fişier este identificat prin numele său. Numele unui fişier este format dintr-un şir de caractere (care în funcţie de sistemul de operare este limitat la un anumit număr maxim de caractere), urmate eventual de semnul punct (.) şi de încă maximum 4 caractere, numite extensie, ca de exemplu: nume.ext. Pentru a putea avea acces rapid la fişiere, sistemul de operare creează nişte fişiere speciale, numite directoare, care pot fi asemănate cu cuprinsul unei cărţi, deoarece ele conţin numele fişierelor şi adresa de început a acestora. De asemenea, un director poate conţine la rândul său alte directoare creându-se astfel o structură arborescentă de directoare în care poate fi găsit foarte repede un anumit fişier. 1.3.2. Tipuri de fişiere Fişierele se pot împărţi în două categorii – executabile şi neexecutabile. În prima categorie intră acele fişiere al căror nume scris în dreptul prompterului (în cazul sistemului de operare DOS) determină executarea unor activităţi de către sistemul de operare. O parte dintre fişierele executabile sunt programe şi sunt recunoscute prin extensia lor care poate fi EXE sau COM, altele fiind constituite în fişiere de comenzi proprii sistemului de operare, a căror extensie este BAT. Fişierele COM, numite adesea şi comenzi, conţin informaţii în formatul imagine de memorie. Ele sunt mai compacte şi mai rapide decât fişierele EXE, dar lungimea lor nu poate să depăşească 64 K. Fişierele EXE pot să ajungă la dimensiuni mai mari prin segmentarea programului în fragmente a căror dimensiune să fie de maximum 64K. Dintre fişierele neexecutabile vom aminti câteva mai importante: • fişiere text ; • fişiere cu extensia SYS sau DRV, cunoscute sub numele de driver-e şi care conţin instrucţiuni despre modul în care 18
  25. 25. sistemul de operare trebuie să controleze diferite componente hardware; • surse de programe scrise în diferite limbaje (cu extensiile PAS – limbajul Pascal, C – limbajul C, CPP – limbajul C++, etc.); • fişiere care conţin informaţii intermediare între cele în limbaj sursă şi cele executabile (extensiile OBJ, OVL); • fişiere ce conţin imagini (extensiile JPEG, GIF, BMP); • fişiere ce conţin sunete (extensiile WAV, MIDI, MP3) etc. 1.3.3. Construirea fişierului executabil Instrucţiunile pe care le execută un calculator sunt de fapt grupuri de 1 ş 0 (cifre binare) care reprezintă semnale electronice produse în interiorul calculatorului. Pentru a programa primele calculatoare (în anii 1940-1950), programatorii trebuiau să înţeleagă modul în care calculatorul interpreta diferitele combinaţii de 0 şi 1, deoarece programatorii scriau toate programele folosind cifre binare. Cum programele deveneau din ce în ce mai mari, acest mod de lucru a devenit foarte incomod pentru programatori. De aceea au fost create limbaje de programare care permit exprimarea instrucţiunilor calculatorului într-o formă mai accesibilă programatorului. După ce programatorul scrie instrucţiunile într-un fişier - numit fişier sursă, un al doilea program – numit compilator, converteşte instrucţiunile limbajului de programare în şirurile 1 şi 0 – cunoscute sub numele de cod maşină. Pentru a obţine un program executabil, orice program sursă trebuie eventual translatat (tradus) în limbaj cod maşină sau cod obiect pe care îl poate înţelege microprocesorul. În urma acestui proces, alături de fişierul sursă apare şi fişierul cod obiect (object file.) Această translatare sau traducere este efectuată de către compilatoare, interpretoare sau asambloare. Compilatorul este folosit pentru transformarea codului sursă, adică a programului scris într-un limbaj de programare de nivel înalt, în cod obiect (object code). Acest cod obiect va fi transformat în faza de editare de legături în cod maşină executabil de microprocesorul sistemului de calcul. Programatorii scriu programe într-o formă numită cod sursă. Acest cod sursă parcurge apoi câţiva paşi înainte de a deveni program executabil. 19
  26. 26. Pe scurt, un compilator este un program special care procesează instrucţiuni scrise într-un limbaj de programare particular şi le transformă în limbaj maşină sau cod maşină pe care îl poate executa microprocesorul. La ora actuală un limbaj de programare este inclus într-un mediu de programare mai complex care include un editor de texte pentru introducerea instrucţiunilor în limbajul de programare de nivel înalt, un compilator şi un editor de legături folosite pentru translatarea codului sursă în cod maşină. În mod tipic, un programator scrie declaraţii într-un limbaj precum Pascal, C sau MATLAB folosind un editor. Se creează astfel un fişier numit fişier cod sursă ce conţine o colecţie de instrucţiuni şi declaraţii scrise în limbajul respectiv. Primul pas este prelucrarea codului sursă de către compilator, care translatează instrucţiunile de nivel înalt într-o serie de instrucţiuni cod obiect. Când este lansat în execuţie compilatorul acesta, într-o primă etapă, lansează un analizor sintactic, gramatical, numit parser. Acesta parcurge şi analizează sintactic, secvenţial, în ordinea în care au fost introduse, toate instrucţiunile scrise în limbajul de nivel înalt. O instrucţiune de nivel înalt se translatează într-una sau mai multe instrucţiuni specifice microprocesorului pentru care a fost conceput compilatorul. Aceste instrucţiuni ale microprocesorului sunt înlocuite cu codurile lor binare, fiecare instrucţiune a microprocesorului fiind codificată de către constructor. Codurile binare ale instrucţiunilor microprocesorului împreună cu reprezentările interne ale datelor manipulate formează codul obiect. Deci în unul sau mai multe faze (parserul este una dintre faze) din codul sursă de intrare se produce un cod de ieşire, numit în mod tradiţional cod obiect. Este foarte important ca referiri la alte module de cod să fie corect reprezentate în acest cod obiect. Pasul final în producerea programului executabil, după ce compilatorul a produs codul obiect, este prelucrarea codului obiect de către un editor de legături (link-editor sau linker). Acest linker combină diferitele module (le leagă) şi dă valori reale, efective, tuturor adreselor simbolice existente în codul obiect. În urma acestei prelucrări se obţine codul maşină, salvat într-un fişier cu extensia .exe. Acest cod maşină poate fi executat secvenţial, instrucţiune cu instrucţiune, de către microprocesor. 20
  27. 27. Cu alte cuvinte, un program executabil (executable program - aflat pe disc cu extensia .exe) se obţine prin salvarea pe disc a codului maşină obţinut prin prelucrarea succesivă a fişierului cod sursă de către compilator (compiler) şi apoi de către link-editor (linker). Fig. 1.5 Procesul de elaborare a unui program executabil Procesul de obţinere a unui executabil este prezentat în figura de mai jos. Blocurile tridimensionale reprezintă entităţile principale ale mediului de programare: editorul de texte, compilatorul (compiler) şi editorul de legături (linker). Blocurile dreptunghiulare reprezintă fişierele rezultate în urma aplicării celor trei utilitare de sistem:  în urma utilizării editorului de texte obţinem fişierul text sursă cod cu numele generic “nume”. Dacă folosim limbajul de programare C spre exemplu, se obţine fişierul nume.c care se va salva pe disc.  în urma lansării în execuţie a compilatorului, acesta preia fişierul sursă şi îl prelucrează corespunzător, semnalizându-se toate erorile fatale pentru program sau avertismente utile programatorului în procesul de depanare. În cazul în care compilarea se efectuează cu succes, se obţine un fişier cod obiect, salvat pe disc sub numele nume.obj  în urma lansării în execuţie a editorului de legături, se preia fişierul cod obiect nume.obj şi se leagă cu toate modulele necesare (inclusiv funcţii de bibliotecă sau alte module externe), obţinându-se un program executabil (cod maşină) cu 21
  28. 28. numele nume.exe la care adresele nu mai sunt simbolice ci absolute relativ la adresa de început a programului. La lansarea în execuţie a programului fluxul de informaţie este complet controlat de către microprocesor, toate salturile de adresă fiind făcute corespunzător. Interpretorul (interpreter) este un program care execută instrucţiuni scrise într-un limbaj de nivel înalt. Numai anumite limbaje de nivel înalt, spre exemplu BASIC, LISP sau MATLAB, sunt prevăzute cu un interpretor. Există două modalităţi de a executa un program scris în limbaj de nivel înalt. Cel mai comun mod este acela de a compila programul. Cealaltă modalitate este “pasarea” programului unui interpretor. Un interpretor translatează instrucţiunile de nivel înalt într-o formă intermediară care este apoi executată. Prin contrast, un compilator translatează instrucţiunile de nivel înalt direct în limbaj maşină (cod maşină). Programele compilate rulează în general mai rapid decât cele interpretate. Un alt avantaj al programelor compilate este acela al desprinderii din context în sensul că programele executabile generate în urma procesului de compilare pot fi executate direct sub sistemul de operare al calculatorului. Un program interpretat se execută sub mediul în care a fost creat. Spre exemplu, pentru a rula un program scris în limbajul BASIC se lansează în execuţie mediul BASIC, apoi se deschide fişierul sursă-BASIC corespunzător şi se lansează interpretorul de BASIC pentru execuţia sa. Avantajul unui interpretor este acela al evitării procesului de compilare consumator de timp în cazul în care avem programe de mari dimensiuni. Interpretorul poate executa imediat programele sursă. Pentru acest motiv interpretoarele se folosesc mai ales în procesul de dezvoltare al programelor, când programatorul doreşte adăugarea unor mici porţiuni de program pe care să le testeze rapid. De asemenea, interpretoarele permit o programare interactivă fiind des folosite în procesul de instrucţie. În mediul de programare MATLAB, mediu interpretor, orice comandă utilizator se execută imediat. Se pot edita şi fişiere script, care conţin secvenţe de comenzi care se execută secvenţial. 22
  29. 29. Programele de descriere a paginii (Page Description Languages) ca PostScript spre exemplu folosesc un interpretor. Fiecare imprimantă PostScript are incorporat un interpretor care execută instrucţiuni PostScript. Asamblorul (assembler) este un program care face translaţia unui program scris în limbaj de asamblare (limbaj de nivel scăzut, corespunzător microprocesorului sistemului de calcul) în limbaj cod maşină. Putem spune că asamblorul reprezintă pentru limbajul de asamblare ceea ce reprezintă compilatorul pentru limbajele de nivel înalt. Cum limbajul de asamblare conţine instrucţiuni mai puţin complexe decât cele de nivel înalt, asamblorul face practic o convertire biunivocă între mnemonicele limbajului de asamblare şi codurile binare corespunzătoare acestor mnemonice (instrucţiuni). 23
  30. 30. Instrucţiunile în limbajul de nivel înalt se introduc de la tastaturã. Tot ce se introduce de la tastaturã este vizibil pe monitor Editor de texte (eventual incorporat în mediu) Fişier text (fişier sursã) cu extensia adecvatã: nume.pas (limbaj Pascal) nume.c (limbaj C) nume.cpp (limbaj C++) nume.bas (limbaj BASIC), etc. Fişierul sursã cu numele “nume” şi extensia corespunzãtoare se salveazã din memoria RAM pe harddisk Compilator Se compileazã fişierul sursã Se obţine fişierul cod obiect: nume.obj Se salveazã pe harddisk fişierul nume.obj Link-editare (legarea tuturor modulelor necesare) Se obţine fişierul cod maşinã (executabil): nume.exe Se salveazã pe harddisk fişierul nume.exe Lansarea în execuţie de cãtre sistemul de operare a executabilului nume.exe Fig. 1.6 Detalierea procesului de generare a unui executabil Capitolul II 24
  31. 31. REPREZENTAREA DATELOR ÎN CALCULATOR Se ştie că un calculator numeric prelucrează numere binare. Acest lucru ţine de suportul fizic de manipulare, transport şi stocare a datelor interne, mai bine zis este legat de faptul că semnalul fizic purtător de informaţie este o tensiune continuă cu două valori: una înaltă (High) şi una joasă (Low). Acestor două valori li se asociază natural două valori logice: T (true, adevărat) şi F (false, fals) sau cele două cifre binare1 şi 0. Tensiune High=’1’ Low=’0’ timp Ca urmare a acestei asocieri spunem, prin abuz de limbaj, că un calculator numeric prelucrează numere binare. Ca şi un număr zecimal, un număr binar are mai multe cifre binare. Sistemul de numeraţie binar folosit pentru reprezentarea informaţiei în calculatoare este un sistem de numeraţie ponderal, întocmai ca sistemul de numeraţie zecimal. Reprezentarea naturală a numerelor la nivelul percepţiei umane este cea zecimală, pe când reprezentarea proprie maşinilor de calcul este cea binară. De aici rezultă necesitatea compatibilizării sau interfaţării între aceste două moduri de reprezentare a numerelor. Cum cele două sisteme de numeraţie sunt ponderale, o primă diferenţă este aceea că sistemul zecimal foloseşte ca ponderi puterile întregi (pozitive sau negative) ale lui 10 (zece) iar sistemul binar va folosi puterile întregi (pozitive sau negative) ale lui 2. În altă ordine de idei, dacă pentru reprezentarea externă sunt semnificative simbolurile de reprezentare (cifre, semnele + sau -, punct zecimal sau binar, mantisă sau exponent), pentru reprezentarea 25
  32. 32. internă sunt necesare convenţii de reprezentare: indiferent de tipul datelor, acestea vor fi colecţii sau şiruri de cifre binare cărora, prin convenţie, li se atribuie semnificaţii. Într-o primă instanţă, este foarte important să facem o distincţie între tipurile de date recunoscute de un calculator (sau mai bine zis de microprocesorul cu care este dotat calculatorul personal) şi formatele de reprezentare ale acestor date ce reprezintă convenţii pentru reprezentarea tipurilor de date, atât la nivel intern (în memoria calculatorului) cât şi la nivel extern, al percepţiei umane. Din punctul de vedere al tipurilor de date care sunt implementate în limbajul C putem spune că distingem două mari categorii, date de tip întreg (integer) şi date de tip real (float). Formatele de reprezentare internă/externă vor fi prezentate în cele ce urmează. Cel mai simplu de reprezentat sunt numerele naturale. Se face apoi trecerea la numerele întregi negative şi apoi la numerele reale care au o parte întreagă şi una fracţionară. 2.1. Reprezentarea internă/externă a numerelor Reprezentarea internă a numerelor se referă la modul în care se stochează datele în memoria RAM a calculatorului sau în regiştrii microprocesorului. În acest format se prelucrează numerele pentru implementarea diverselor operaţii aritmetice. La nivelul calculatorului informaţia nu poate fi decât binară. În această reprezentare putem scrie numere întregi pozitive sau negative sau numere reale. Există un standard IEEE care reglementează modul de reprezentare internă a datelor. Reprezentarea externă este reprezentarea numerelor la nivelul utilizatorului uman, deci în principiu se poate folosi orice bază de numeraţie pentru reprezentarea numerelor. La nivel de reprezentare externă se foloseşte semnul “-” în faţa unui număr în cazul în care acesta este negativ sau punctul care separă partea întreagă de cea fracţionară. De asemenea, numerele întregi interpretate fără semn se pot afişa şi în format binar, octal sau hexazecimal, deci în bazele 2, 8 sau 16. În cele ce urmează ne vom pune următoarele probleme: - cum se reprezintă extern un număr natural - cum se reprezintă intern un număr natural - cum se reprezintă extern un număr întreg negativ 26
  33. 33. - cum se reprezintă intern un număr întreg negativ - cum se face conversia de la reprezentarea externă la cea internă - cum se face conversia de la reprezentarea internă la cea externă 2.2. Reprezentarea externă a numerelor În ceea ce priveşte reprezentarea externă, nu sunt nici un fel de dificultăţi deoarece fiecare este familiarizat cu reprezentarea zecimală a numerelor naturale sau reale. Trebuie menţionat de la început că orice tip de reprezentare pe care o vom folosi este ponderală în sensul că poziţia cifrelor în număr nu este întâmplătoare ci conformă cu o pondere corespunzătoare unei puteri a bazei de numeraţie. O caracteristică a reprezentărilor externe este folosirea unor convenţii de format unanim acceptate şi de altfel foarte naturale pentru un utilizator uman. Spre exemplu, pentru a exprima numere negative se foloseşte semnul “-” iar pentru reprezentarea numerelor reale se foloseşte punctul “.” pentru delimitarea părţii întregi de cea fracţionară. De asemenea, suntem familiarizaţi şi cu notaţia ştiinţifică în care intervine mantisa şi exponentul (în virgulă mobilă). Reprezentarea zecimală este cea mai naturală pentru utilizatorul uman. Vom oferi în continuare câteva exemple de reprezentări zecimale externe: Număr Reprezentare Reprezentare normală ştiinţifică 37 37 0.37x102 -37 -37 -0.37x102 0.375 0.375 0.375x100 -0.375 -0.375 -0.375x100 0.00375 0.00375 0.375x10-2 -0.00375 -0.00375 -0.375x10-2 12.375 12.375 0.12375x102 -12.375 -12.375 -0.12375x102 În general dorim să obţinem rezultatele numerice ale programelor pe care le concepem într-o formă de reprezentare accesibilă. Totuşi, calculatorul trebuie informat asupra formatului de reprezentare în care dorim să se afişeze datele necesare. Aceasta înseamnă că va trebui să specificăm câte cifre se vor folosi la partea 27
  34. 34. întreagă şi câte la partea fracţionară sau dacă dorim reprezentare ştiinţifică sau nu. De altfel şi operatorul uman face aceleaşi convenţii 1 de reprezentare. Spre exemplu ştim că numărul nu poate fi exact 3 reprezentat ca un număr zecimal, deci fixăm un format de reprezentare. Dacă formatul ale se limitează la 4 cifre zecimale, atunci 1 vom scrie ≅ 0.3333 3 Limbajul C are o serie de funcţii de reprezentare cu format a datelor numerice sau alfanumerice prin care programatorul poate impune un format extern cu care se manipulează datele. 2.2.1. Reprezentarea externă a numerelor întregi Numerele naturale se pot reprezenta fie în baza de numeraţie 10, fie în orice altă bază. În general, un număr întreg în baza b se poate reprezenta cu un număr predeterminat de cifre ci ∈ B = { 0,1,2,....., b − 2, b − 1} . Mulţimea B reprezintă mulţimea cifrelor sau simbolurilor de reprezentare. Spre exemplu: b = 2 ⇒ B = { 0,1} b = 7 ⇒ B = { 0,1,2,3,4,5,6} b = 10 ⇒ B = { 0,1,2,3,4,5,6,7,8,9} Noi suntem obişnuiţi să folosim mulţimea cifrelor zecimale. Dacă totuşi se foloseşte o bază de reprezentare mai mare decât 10, atunci mulţimea cifrelor zecimale nu mai este suficientă pentru reprezentarea numerelor în acea bază. Spre exemplu să considerăm baza b = 16 care va folosi 16 cifre hexazecimale (sau mai simplu hexa). Prin convenţie, cele 16 cifre hexazecimale vor fi: Cifra Simbol Cifra Simbol 0 0 8 8 1 1 9 9 2 2 10 A 3 3 11 B 4 4 12 C 5 5 13 D 6 6 14 E 7 7 15 F 28
  35. 35. Forma generală de reprezentare externă a numerelor întregi este de forma:  N b = ±c n −1c n − 2 ......c 2 c1c 0  c k ∈ B = { 0,1,2,....., b − 2, b − 1} Valoarea numerică zecimală a numărului N b va fi: ( ) ∑ ck ⋅ b k n −1 N b = ± c n−1 ⋅ b n −1 + c n − 2 ⋅ b n− 2 + ... + c1 ⋅ b1 + c 0 ⋅ b 0 = ± k =0 În continuare vom studia următoarele probleme: - cum se face conversia unui număr din baza b = 10 în baza b=2 - cum se face conversia inversă, din baza b = 2 în baza b = 10 - cum se face conversia dintr-o bază oarecare b1 în altă bază b2 Pentru a reprezenta un număr natural din baza 10 în baza 2, se împarte succesiv numărul la 2 şi se utilizează resturile la aceste împărţiri în ordinea inversă de cum au fost obţinute. a) Conversia din baza 10 în baza 2 şi invers Fie de exemplu numărul zecimal 37. Reprezentarea sa binară va fi obţinută astfel: 3710 = 1001012 37 2 36 18 2 1 18 9 2 0 8 4 2 1 4 2 2 0 2 1 0 Conversia inversă, din baza 2 în baza 10 este simplă şi utilizează ponderea 2: 25 24 23 22 21 20 1001012 = 1 0 0 1 0 1 = 1x25 + 1x22 + 1x20=37 Cu aceste numere naturale putem face o serie de operaţii aritmetice. Adunarea numerelor naturale binare se face întocmai ca la cele în reprezentare în baza 10, după regula: 0+0=0 29
  36. 36. 0+1=1 1+0=1 1+1=0, transport 1 spre rangul următor Astfel, să facem adunarea 37+25 în binar: 37 1 0 0 1 0 1+ 25 11001 62 111110 Se observă cum se obţine rezultatul corect. Înmulţirea se face în mod asemănător, ca o adunare repetată. Spre exemplu, să calculăm 37x25 37 1 0 0 1 0 1x 25 11001 100101 100101 100101 925 1110 011101 11100111012 = 1x20 + 1x22 + 1x23 +1x24 +1x27 +1x28+1x29 = 1+4+8+16+128+256+512 = 92510 b) Conversia dintr-o bază oarecare b1 într-o altă bază b2 . Fie spre exemplu numărul 4911 care se doreşte scris în baza 13. Pentru a realiza această conversie, vom folosi baza intermediară 10. Vom converti mai întâi 4A11 în baza 10 şi apoi numărul zecimal obţinut îl vom trece în baza 13. Se observă cum un număr în baza 11 poate conţine şi cifra A=10 iar un număr în baza 13 poate conţine cifrele A=10, B=11, C=12. 4 A11 = 10 ⋅110 + 4 ⋅111 = 44 + 10 = 5410 54 13 52 4 13 2 0 0 4 5310 = 4213 4 A11 = 4213 30
  37. 37. 2.2.2. Reprezentarea externă a numerelor reale Semnificativă pentru utilizatorul uman este reprezentarea zecimală (în baza b=10) a numerelor reale, cu care suntem obişnuiţi. Faţă de reprezentarea numerelor întregi, la numerele reale intervine simbolul punct “.” care delimitează partea întreagă de partea fracţionară. Cu alte cuvinte, cu ajutorul numerelor reale putem reprezenta şi numere care nu sunt întregi. Forma generală a unui număr real reprezentat într-o bază oarecare b este:  N b = ±c n −1c n − 2 ...c1c 0 • c −1c − 2 ...c − m +1c − m  c k ∈ B = { 0,1,2,..., b − 2, b − 1} Valoarea zecimală a numărului de mai sus va fi: ( ) ∑ ck ⋅ b k n− 1 N10 = ± cn − 1b n − 1 + cn − 2b n − 2 + c1b1 + c0b 0 + c− 1b − 1 + c− 2 ⋅ b − 2 + c− m + 1b − m + 1 + c− m b − m = ± k= −m Se observă cum punctul delimitează partea întreagă (exprimată printr-o combinaţie de puteri pozitive ale bazei b) şi partea fracţionară (exprimată printr-o combinaţie de puteri negative ale bazei b). Semnificaţie pentru programator şi pentru producătorii de software sau microprocesoare au bazele de reprezentare b = 10 şi b = 2 , deoarece baza 10 este naturală pentru reprezentarea externă a numerelor iar baza 2 este naturală pentru reprezentarea binară, internă, a numerelor. În formulele de mai sus avem o reprezentare a unui număr real cu n cifre pentru partea întreagă şi m cifre pentru partea fracţionară. Aşa cum în sistemul zecimal reprezentăm cu un număr finit de cifre zecimale numerele reale, acelaşi lucru se va întâmpla şi în sistemul binar. Punctul binar va avea o semnificaţie asemănătoare cu punctul zecimal, care face separarea între partea întreagă şi cea fracţionară. Cifrele binare situate după punctul binar vor corespunde puterilor negative ale lui 2. Astfel, în general, un număr real va avea reprezentarea binară: ( N 2 = ± bm bm− 1...b1b0 .b− 1b− 2 ...b− n = bm 2 m + bm− 1 2 m− 1 + b1 21 + b0 20 + b− 1 2 − 1 + b− 2 2 − 2 + ... + b− n 2 − n ) Spre exemplu, numărul 12.25 va avea reprezentarea binară: 12.2510 = 1100.01 = 2 3 + 2 2 + 2 −2 31
  38. 38. Partea întreagă a unui număr real se reprezintă binar precum numerele întregi (cu sau fără semn). Pentru a determina partea fracţionară, se procedează în mod invers ca la partea întreagă. Astfel, dacă partea fracţionară zecimală se reprezintă binar, atunci aceasta se înmulţeşte succesiv cu 2. Dacă rezultatul depăşeşte valoarea 1, atunci se înscrie un bit 1. Se continuă mai departe cu dublarea valorii care depăşeşte 1. Dacă rezultatul nu depăşeşte valoarea 1, atunci se înscrie un bit 0 şi se continuă multiplicarea cu 2. Spre exemplificare, vom vedea cum se obţine reprezentarea binară a lui 12.25. Partea întreagă este 12. Ea se reprezintă binar prin împărţiri succesive la 2 şi considerarea resturilor. Partea fracţionară este 0.25 Partea P.F. x 2 Noua Bitul fracţionară P.F. înscris P.F. 0.25 0.5 0 0.5 1 0 1 0 Obţinem exact rezultatul căutat: 12.25 = 1100.01 Să mai considerăm un alt exemplu. Să reprezentăm numărul 5.37 Partea întreagă are reprezentarea 510 =1012 Partea P.F. x 2 Noua Bitul fracţionară P.F. P.F. înscris 0.37 0.74 0.74 0 0.74 1.48 0.48 1 0.48 0.96 0.96 0 0.96 1.92 0.92 1 0.92 1.84 0.84 1 0.84 1.68 0.68 1 0.68 1.36 0.36 1 0.36 0.72 0.72 0 0.72 1.44 0.44 1 Etc.. Etc.. Obţinem: 5.3710 = 101.010111101...2 Cu cât mai multe cifre binare vom reţine după punctul binar, cu atât vom fi mai aproape de valoarea exactă 5.37. Obţinem un rezultat foarte important: Deşi un număr zecimal poate avea un număr finit de cifre zecimale după punctul zecimal, reprezentarea sa binară internă poate avea un număr infinit de cifre binare. Este valabilă şi reciproca: un număr real zecimal cu un 32
  39. 39. număr infinit de cifre se poate reprezenta într-o altă bază pe un 1 număr finit de cifre ( ex: = 0.3333...3...10 = 0.13 ). Cum orice 3 reprezentare binară internă este pe un număr finit de biţi, numărul poate să nu fie reprezentat exact în calculator, ci cu o anumită aproximaţie. Acest lucru este decisiv pentru a înţelege importanţa lungimii reprezentării numerelor în calculator. Cu cât un număr binar se reprezintă pe un număr mai mare de biţi, cu atât precizia de reprezentare creşte. 2.3 Reprezentarea internă a numerelor Deoarece semnalul intern purtător de informaţie într-un calculator este de tip binar, un număr zecimal (întreg sau real) se va reprezenta intern în baza 2 cu ajutorul unui număr binar. O cifră binară se numeşte bit (Binary Digit) şi poate fi fie 0 fie 1. În reprezentarea externă a numerelor am văzut că se poate folosi orice bază de numeraţie (cu cifrele corespunzătoare). De asemenea, numerele pot fi prefixate cu un simbol de semn ± şi pot include în reprezentare şi punctul de separaţie între partea întreagă şi cea fracţionară. În reprezentarea internă acest lucru nu mai este posibil deoarece semnele plus (+), minus (-) sau punct (.) nu au nici o semnificaţie pentru calculator. Orice număr (orice tip de dată) este reprezentat la nivel intern de un număr prestabilit de biţi. Specialiştii din industria software au ajuns la un consens de reprezentare concretizat prin standardul IEEE 754 de reprezentare a internă a numerelor reale în computere. Reprezentarea internă a numerelor a impus în limbajul C definirea aşa-numitelor tipuri de date. Tipul unei date reprezintă modul în care microprocesorul stochează în memorie şi prelucrează cu ajutorul regiştrilor interni o dată. Tipul unei date se referă la lungimea sa de reprezentare (pe câţi biţi se reprezintă data) precum şi ce semnificaţie au anumite câmpuri de biţi din cadrul reprezentării. 2.3.1. Reprezentarea internă a numerelor întregi 33
  40. 40. Un număr binar este o colecţie de cifre binare ponderate fiecare cu o putere a lui 2. Bitul corespunzător ponderii celei mai mari, situat cel mai în stânga, se numeşte MSB (Most Significand Bit) iar cel corespunzător ponderii celei mai mici, situat cel mai în dreapta, se numeşte LSB (Less Significand Bit). În cazul reprezentării binare a numerelor naturale, reprezentarea externă (cea percepută de operatorul uman) şi cea internă (cea prelucrată de procesorul calculatorului) sunt asemănătoare. Cum pentru operatorul uman operatorii ‘+’ sau ‘-‘ semnifică faptul că un număr este pozitiv sau negativ, este necesară o convenţie pentru reprezentarea internă a numerelor întregi negative. Această convenţie prevede folosirea MSB pentru reprezentarea semnului numerelor întregi. Dacă numărul este pozitiv, se adaugă în poziţia MSB bitul de semn ‘0’, iar dacă numărul este negativ se utilizează în poziţia MSB bitul de semn ‘1’. Mai mult, numerele negative se reprezintă în aşa numitul complement faţă de 2. Reprezentarea numerelor întregi negative în complement faţă de 2 Această formă de reprezentare a numerelor negative necesită parcurgerea următorilor paşi: pas1. Se reprezintă modulul numărului negativ, folosind bit de semn (egal cu 0, evident) pas2. Se complementează toţi biţii numărului astfel obţinut. Complementarea înseamnă transformarea bitului 0 în bitul 1 şi a bitului 1 în bitul 0. pas3. Numărul astfel obţinut se adună cu 1. De exemplu, să reprezentăm numărul -37. 3710 = 1001012 = [ 0] 100101 pas1. |-37| = 37 bit semn pas2. 0100101---->1011010 pas3. 1011010 + 1 = 1011011 => -3710 = 10110112 Evident, MSB este bitul de semn şi este egal cu 1. La o primă vedere, este posibil să credem că prin utilizarea complementului faţă de 2 putem pierde semnificaţia numărului negativ. Pentru a vedea ce număr negativ este reprezentat, putem repeta procedeul de mai sus şi obţinem reprezentarea numărului pozitiv dat de modulul său. O modalitate mai simplă este alocarea ponderii corespunzătoare bitului de semn dar pe care o considerăm că reprezintă un număr negativ. Astfel: 34
  41. 41. 10110112 = -1x26 + 1x24 + 1x23 + 1x21 + 1x20 = -64 + 27 = -37 2.3.2 Adunarea, scăderea şi înmulţirea numerelor întregi Aceste operaţii se execută folosind reprezentarea în complement faţă de 2 a numerelor întregi, sau, mai bine zis, se execută folosind în algoritmi bitul de semn ca pe un bit obişnuit. De exemplu, dorim să calculăm: 37-25 25-37 (-25)x37 (-25)x(-37) Pentru efectuarea acestor calcule, vom scrie reprezentările cu bit de semn ale numerelor implicate: 2510 = 110012 = 011001 − 25 = 100111  10 2  3710 = 1001012 = 0100101 − 3710 = 1011011  Se observă că 25 şi (-25) se reprezintă pe 6 biţi iar 37 şi (-37) pe 7 biţi. Deoarece am observat că biţii unui întreg cu semn nu au toţi aceeaşi semnificaţie, este nevoie să reprezentăm numerele cu care lucrăm pe un acelaşi număr de biţi. La adunări sau scăderi, biţii de semn se vor afla în aceeaşi poziţie (vor avea aceeaşi pondere) şi vom obţine astfel rezultate corecte. Pentru a avea o scriere pe un acelaşi număr de biţi, se adaugă (completează) la stânga bitul de semn de un număr corespunzător de ori. Astfel: 37 − 25 = 37 + (−25) = 0100101 + 1100111 0100101 + − 2510 = 1001112 = 1100111  1100111 25 = 0110012 = 0011001 −−−−−− 0001100 = 1210 35
  42. 42. 25 − 37 = 25 + (−37) = 0011001 + 1011011 0011001 + − 37 = 1011011  1011011 25 = 0110012 = 0011001 −−−−−− 1110100 = −64 + 52 = −12 În continuare vom pune în evidenţă importanţa gamei de reprezentare, adică a domeniului de valori ale datelor. Să considerăm, spre exemplu, adunarea a două numere cu semn reprezentate pe un octet (8 biţi). Aceste numere sunt cuprinse în gama [− 2 , 2 − 1] 7 7 = [ − 128, 127] . Dacă vom dori să adunăm două numere din acest domeniu şi să reprezentăm rezultatul tot pe un octet, putem avea surprize. De exemplu, să considerăm operaţiile (117-12) şi (117+12). Se observă că operanzii sunt în gama de reprezentare a numerelor cu semn pe 8 biţi. Prin prima scădere, ne aşteptăm să obţinem un rezultat, 105, în aceeaşi gamă de reprezentare. 117-12=117+(-12) = 01110101+11110100 = 01101001 = 10510, rezultat corect. 117+12 = 01110101+00001100 = 10000001 = -12710, rezultat evident incorect. Incorectitudinea provine de la faptul că rezultatul a depăşit gama de reprezentare. Dacă rezultatul este interpretat pe 9 biţi de exemplu, gama de reprezentare devine [ − 256, 255] şi rezultatul va fi 117+12 = 001110101+000001100 = 010000001 = 12910, rezultat corect. Ca o concluzie preliminară, reţinem că pentru a obţine rezultate corecte este necesar să precizăm dacă se lucrează sau nu cu bit de semn şi pe câţi biţi se face reprezentarea, pentru că numai în acest context interpretarea rezultatelor este corectă. În ceea ce priveşte înmulţirea numerelor întregi cu semn (cu bit de semn), aici problema nu mai are o rezolvare asemănătoare, în sensul că nu putem trata biţii de semn la fel cu cei de reprezentare ai valorii. Astfel, procesorul studiază biţii de semn şi ia o decizie în privinţa semnului rezultatului. De fapt, se realizează funcţia logică XOR a biţilor de semn. Numerele negative se vor lua în modul, iar operaţiile de înmulţire se vor face numai cu numere pozitive. La final, 36
  43. 43. funcţie de semnul rezultatului, se ia decizia reprezentării corecte a rezultatului. Spre exemplu, să calculăm (-25)x37. Pentru aceasta, procesorul va primi pentru procesare următoarele două numere: 37 x(−25) = [ 0]100101 × [1]100111 Se analizează separat biţii de semn şi se ia decizia că rezultatul va fi negativ, deci, la final, se va reprezenta în complement faţă de 2. Mai departe se va lucra cu 25, modulul numărului (-25), care se obţine prin complementarea faţă de 2 a numărului binar 1100111: 11001110011000+1=0011001 Se va reţine pentru procesare numai numărul (fără semn) 11001, care se va înmulţi cu numărul (fără semn) 100101, obţinând, aşa cum am arătat mai sus, valoarea 1110011101. Mai departe, se adaugă bitul de semn, 0 pentru numere pozitive, obţinându-se 01110011101. Acest ultim număr se va complementa faţă de 2, obţinându-se 10001100010+1=[1]0001100011, adică valoarea -1024+99 = -925, valoarea corectă. Ca o concluzie, pentru a furniza rezultate corecte, procesorul va trebui informat în permanenţă despre ce fel de numere prelucrează (cu sau fără semn) şi care este lungimea lor de reprezentare (toate trebuie să aibă aceeaşi lungime). Reprezentarea în complement faţă de 2 se poate folosi şi pentru numerele reale negative, bitul de semn fiind MSB de la partea întreagă. Astfel, -12.25 poate avea reprezentarea: 12.2510 = 1100.012 → 01100.01 01100.01 → 10011.10 + 0.01 = 10011.11 10011.112 = −2 4 + 21 + 2 0 + 2 −1 + 2 −2 = −16 + 3 + 0.75 = −12.2510 Pentru înmulţirea numerelor reale rămân valabile considerentele de la numere întregi. În cazul de mai sus, problema reprezentării numărului negativ a fost rezolvată cu ajutorul bitului de semn dar problema reprezentării punctului binar va avea altă rezolvare. 2.3.3 Reprezentarea internă a numerelor reale Din considerentele de la reprezentarea externă a datelor putem trage alte concluzii importante din punct de vedere al reprezentării 37

×