Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Limbaje de programare
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

 

2.1 Comunicatia om-masina
2.2 Tipuri de numere reprezentabile in calculator
2.3 Valori de adevar
2.4 Siruri de caractere
2.5 Tipuri primitive de valori ale unui limbaj de programare
2.6 Tablouri de elemente
2.7 Expresii de calcul
2.8 Variabile
2.9 Instructiuni

2.1 Comunicatia om-masina

Pentru a executa un program de calculator este necesar sa putem comunica cu unitatea centrala pentru a-i furniza instructiunile necesare. Cel mai simplu mod de a le comunica este inscrierea codului instructiunilor direct in memoria calculatorului de unde pot fi citite de catre unitatea centrala. Aceasta cale este insa extrem de anevoioasa pentru programator pentru ca el trebuie sa invete sa se exprime coerent intr-un limbaj ale carui componente de baza sunt coduri numerice.

O alternativa mai buna este folosirea unui limbaj de comunicatie format dintr-un numar foarte mic de cuvinte si caractere speciale impreuna cu un set de conventii care sa ajute la descrierea numerelor si a operatiilor care trebuiesc executate cu aceste numere. Limbajul trebuie sa fie atat de simplu incat calculatorul sa poata traduce singur, prin intermediul unui program numit compilator, frazele acestui limbaj in instructiuni ale unitatii centrale. Ori de cate ori vom imagina un nou limbaj de comunicatie cu calculatorul va trebui sa cream un nou program compilator care sa traduca acest limbaj in instructiuni ale unitatii centrale, numite uneori si instructiuni masina.

In realitate folosirea termenului de limbaj de c




omunicatie nu este extrem de fericita pentru ca de obicei noi doar instruim calculatorul ce are de facut si cum trebuie sa faca acel lucru, fara sa-i dam vreo sansa acestuia sa comenteze sarcinile primite. In continuare vom numi aceste limbaje simplificate limbaje de programare pentru a le deosebi de limbajele pe care le folosim pentru a comunica cu alti oameni si pe care le vom numi limbaje naturale.

Limbajele de programare trebuie sa ne ofere o cale de descriere a modulului in care dorim sa reprezentam informatiile cu care lucreaza programul, o cale de a specifica operatiile care trebuiesc executate cu aceste informatii si o cale de a controla ordinea in care sunt executate aceste operatii.

In plus, limbajele de programare trebuie sa respecte urmatorul principiu fundamental: rezultatul executiei unei comenzi dintr-un limbaj de programare trebuie sa fie complet determinat. Asta inseamna ca in limbajele de programare nu este permisa nici o forma de ambiguitate a exprimarii.

Informatiile reprezentate in memoria calculatorului si prelucrate de catre un program scris intr-un limbaj de programare se numesc date. Tipurile de date care se pot descrie direct cu un anumit limbaj de programare se numesc tipurile de date elementare ale limbajului. Operatiile elementare posibil de exprimat intr-un limbaj de programare se numesc instructiuni ale limbajului.

Limbajele de programare au evoluat foarte mult de la inceputurile calculatoarelor. Tendinta generala este aceea de apropiere treptata de limbajele naturale si de modul in care acestea descriu si utilizeaza informatiile. Abstractiile exprimabile cu ajutorul limbajelor de programare sunt din ce in ce mai multe si cuprind o gama din ce in ce mai larga a notiunilor fundamentale cu care opereaza mintea umana.

Un alt aspect in care se reflecta evolutia limbajelor de programare este reprezentat de cresterea profunzimii si calitatii controlului pe care compilatoarele il fac in momentul traducerii din limbaj de programare in limbaj masina, astfel incat sansa de a gresi la descrierea programului sa fie cat mai mica.

Cu toate ca limbajele de programare au facut pasi esentiali in ultimul timp, ele au ramas totusi foarte departe de limbajele naturale. Pentru a programa un calculator, trebuie sa poti gandi si sa poti descrie problemele intr-unul dintre limbajele pe care acesta le intelege. Din acest motiv, scrierea programelor continua sa ramana o activitate rezervata unui grup de initiati, chiar daca acest grup este in continua crestere. ^

2.2 Tipuri de numere reprezentabile in calculator

Desi toate informatiile reprezentabile direct in memoria calculatorului sunt doar numere naturale, constructorii calculatoarelor de astazi au diversificat tipurile acestora prin stabilirea unor conventii de reprezentare pentru numerele negative, reale si pentru caractere. Aceste conventii folosesc numerele naturale pentru reprezentarea celorlalte tipuri de numere. Uneori, reprezentarile ocupa mai mult de un octet in memoria calculatorului, dimensiunile obisnuite fiind 1, 2, 4 sau 8 octeti. Sau, echivalent, 8, 16, 32 sau 64 de biti.

Numerele naturale sunt intotdeauna pozitive. Pentru reprezentarea unui numar intreg cu semn pot fi folosite doua numere naturale. Primul dintre acestea, avand doar doua valori posibile, reprezinta semnul numarului si se poate reprezenta folosind o singura cifra binara. Daca valoarea acestei cifre binare este 0, numarul final este pozitiv, iar daca valoarea cifrei este 1, numarul final este negativ. Al doilea numar natural folosit in reprezentarea numerelor intregi cu semn contine valoarea absoluta a numarului final. Aceasta conventie, desi are dezavantajul ca ofera doua reprezentari pentru numarul zero, un zero pozitiv si altul negativ, este foarte aproape de reprezentarea numerelor cu semn folosita de calculatoarele moderne.

In realitate, conventia care se foloseste pentru reprezentarea numerelor intregi cu semn este asa numita reprezentare in complement fata de doi. Aceasta reprezinta numerele negative prin complementarea valorii lor absolute bit cu bit si apoi adunarea valorii 1 la numarul rezultat. Complementarea valorii unui bit se face inlocuind valoarea 1 cu 0 si valoarea 0 cu 1. Daca avem de exemplu numarul 1, reprezentat pe un octet ca un sir de opt cifre binare 00000001, complementarea bitcu bit a acestui numar este numarul reprezentat pe un octet prin11111110.

Pentru a reprezenta valoarea -1 nu ne mai ramane altceva de facut decat sa adunam la numarul rezultat in urma complementarii un 1 si reprezentarea finala a numarului intreg negativ -1 pe un octet este 11111111.

In aceasta reprezentare, numarul 00000000 binar reprezinta numarul 0 iar numarul 10000000, care mai inainte reprezenta numarul 0 negativ, acum reprezinta numarul -128. Intr-adevar, numarul 128 se poate reprezenta in binar prin 10000000. Complementat, acest numar devine 01111111 si dupa adunarea cu 1, 10000000. Observati ca numerele 128 si -128 au aceeasi reprezentare. Conventia este aceea ca se pastreaza reprezentarea pentru -128 si se elimina cea pentru 128. Alegerea este datorata faptului ca toate numerele pozitive au in primul bit valoarea 0 si toate cele negative valoarea -1. Prin transformarea lui 10000000 in -128 se pastreaza aceasta regula.

Folosind reprezentarea in complement fata de doi, numerele intregi reprezentabile pe un octet sunt in intervalul -128 pana la 127, adica -27 pana la 27 -1. In general, daca avem o configuratie de n cifre binare, folosind reprezentarea in complement fata de doi putem reprezenta numerele intregi din intervalul inchis -2n-1 pana la 2n-1-1. In practica, se folosesc numere intregi cu semn reprezentate pe 1 octet, 2 octeti, 4 octeti si 8 octeti, respectiv 8, 16, 32 si 64 de biti.

Daca dorim sa reprezentam un numar real in memoria calculatorului, o putem face memorand cateva cifre semnificative ale acestuia plus o informatie legata de ordinul sau de marime. In acest fel, desi pierdem precizia numarului, putem reprezenta valori foarte aproape de zero sau foarte departe de aceasta valoare.

Solutia de reprezentare este aceea de a pastra doua numere cu semn care reprezinta cifrele semnificative ale numarului real respectiv un exponent care da ordinul de marime. Cifrele reprezentative ale numarului se numesc impreuna mantisa. Numarul reprezentat in final este 0.mantisaEexponent. E are valoarea 256 spre deosebire de exponentul 10 pe care il folosim in uzual. Daca valoarea exponentului estefoarte mare si pozitiva, numarul real reprezentat este foarte departe de 0, inspre plus sau inspre minus. Daca exponentul este foarte mare in valoare absolutasi negativ, numarul real reprezentat este foarte aproape de zero.

In plus, pentru a ne asigura de biunivocitatea corespondentei, avem nevoie de o conventie care sa stabileasca faptul ca virgula este plasata imediat in fata cifrelor semnificative si ca in fata acesteia se gaseste o singura cifra 0. Numerele care respecta aceasta conventie se numesc numere normalizate.

Aceasta mutare a virgulei imediat in fata cifrelor semnificative poate sa presupuna modificarea exponentului care pastreaza ordinul de marime al numarului. Numerele fractionare se numesc in limbajul calculatoarelor numere in virgula mobila sau numere flotante tocmai din cauza acestei eventuale ajustari a pozitiei virgulei.

Cu aceasta conventie nu se poate reprezenta orice numar real, dar se poate obtine o acoperire destul de buna a unui interval al axei numerelor reale cu valori. Atunci cand incercam sa reprezentam in memoria calculatorului un numar real, cautam de fapt cel mai apropiat numar real reprezentabil in calculator si aproximam numarul initial cu acesta din urma. Ca rezultat, putem efectua calcule complexe cu o precizie rezonabila.

Descrierea conventiei exacte de reprezentare a numerelor reale in calculator depaseste cadrul acestei prezentari. Unele dintre detalii pot fi diferite de cele prezentate aici, dar principiul este exact acesta. Conventia de reprezentare a numerelor reale este standardizata de IEEE in specificatia 754.

Desigur, in unele probleme, lipsa de precizie poate sa altereze rezultatul final, mai ales ca, uneori, erorile se cumuleaza. Exista de altfel o teorie complexa, analiza numerica, conceputa pentru a studia caile prin care putem tine sub control aceste erori de precizie. Putem creste precizia de reprezentare a numerelor reale prin marirea spatiului rezervat mantisei. In acest fel marim numarul de cifre semnificative pe care il pastram. In general, unitatile centrale actuale lucreaza cu doua precizii: numerele flotante simple, reprezentate pe 4 octeti si numerele flotante duble, reprezentate pe 8 octeti. ^

2.3 Valori de adevar

Uneori, avem nevoie sa memoram in calculator valori de adevar. Exista doar doua valori de adevar posibile: adevarat si fals. Uneori, aceste valori de adevar se mai numesc si valori booleene. Desi pentru memorarea acestor valori este suficienta o singura cifra binara, in practica aceste valori sunt reprezentate pe un intreg octet pentru ca operatiile la nivel de bit sunt de obicei prea lente. Valorile booleene se pot combina intre ele prin operatii logice: "si", "sau", "negatie". ^

2.4 Siruri de caractere

Dupa cum spuneam mai inainte, desi orice informatie reprezentata in calculator este in final un numar, mintea umana este obisnuita sa lucreze cu cuvinte si imagini mai mult decat cu numere. De aceea, calculatorul trebuie sa aiba posibilitatea sa simuleze memorarea informatiilor de acest fel.

In ceea ce priveste cuvintele, ele pot fi reprezentate in memoria calculatorului prin caracterele care le formeaza. Insiruirea acestor caractere in memorie duce la notiunea de sir de caractere. Pe langa caracterele propriu-zise care construiesc cuvantul, un sir de caractere trebuie sa poata memora si numarul total de caractere din sir, cu alte cuvinte lungimea sa.

In realitate, un sir de caractere nu contine doar un singur cuvant ci este o insiruire oarecare de caractere printre care pot exista si caractere spatiu. De exemplu, urmatoarele secvente sunt siruri de caractere: "Acesta este un sir de caractere", "Eugen", "ABCD 0123", "HGkduI;.!".

Fiecare limbaj de programare trebuie sa ofere o conventie de reprezentare a sirurilor de caractere in calculator precum si o conventie de scriere a acestora in program. De obicei, cea de-a doua conventie este aceea ca sirul de caractere trebuie inchis intre apostroafe sau ghilimele. In paragraful anterior de exemplu, am folosit ghilimele pentru delimitarea sirurilor de caractere.

Conventia de reprezentare in memorie difera de la un limbaj de programare la altul prin modul in care este memorata lungimea sirului, precum si prin conventia de reprezentare in memorie a caracterelor: ASCII, Unicode sau alta.

Impreuna cu fiecare tip de data, limbajele de programare trebuie sa defineasca si operatiile ce se pot executa cu datele de tipul respectiv. Pentru sirurile de caractere, principala operatie este concatenarea. Prin concatenarea a doua siruri de caractere se obtine un sir de caractere care contine caracterele celor doua siruri puse in prelungire. De exemplu, prin concatenarea sirurilor de caractere "unu" si ", doi", rezulta sirul de caractere: "unu, doi". ^

2.5 Tipuri primitive de valori ale unui limbaj de programare

Vom numi tipuri primitive de valori ale unui limbaj acele tipuri de valori care se pot reprezenta direct intr-un anumit limbaj de programare. Pentru ca informatia reprezentabila sa fie independenta de calculatorul pe care ruleaza programele, un limbaj de programare trebuie sa-si defineasca propriile sale tipuri primitive, eventual diferite de cele ale unitatii centrale, tipuri care sa generalizeze tipurile primitive ale tuturor unitatilor centrale.

Pentru fiecare dintre aceste tipuri primitive de valori, limbajul trebuie sa defineasca dimensiunea locatiei de memorie ocupate, conventia de reprezentare si multimea valorilor care pot fi reprezentate in aceasta locatie. In plus, limbajul trebuie sa defineasca operatiile care se pot executa cu aceste tipuri si comportarea acestor operatii pe seturi de valori diferite.

Tipurile primitive ale unui limbaj sunt de obicei: numere de diverse tipuri, caractere, siruri de caractere, valori de adevar si valori de tip referinta. Totusi, acest set de tipuri primitive, denumirea exacta a tipurilor si operatiile care se pot executa cu ele variaza mult de la un limbaj de programare la altul. ^

2.6 Tablouri de elemente

Tipurile primitive impreuna cu referintele, adica tipurile de date elementare, indivizibile ale unui limbaj, sunt insuficiente pentru necesitatile unei aplicatii reale. De obicei este nevoie de organizari de date mai complicate in care avem structuri de date create prin asocierea mai multor tipuri de date elementare. Aceste structuri de organizare a informatiilor pot contine date de acelasi tip sau date de tipuri diferite.

In cazul in care dorim sa reprezentam o structura continand date de acelasi tip, va trebui sa folosim o structura clasica de reprezentare a datelor numita tablou de elemente. Practic, un tablou de elemente este o alaturare de locatii de memorie de acelasi fel. Alaturarea este continua in sensul ca zona de memorie alocata tabloului nu are gauri. De exemplu, putem gandi intreaga memorie interna a calculatorului ca fiind un tablou de cifre binare sau ca un tablou de octeti.

Informatiile de acelasi fel reprezentate intr-un tablou se pot prelucra in mod unitar. Referirea la un element din tablou se face prin precizarea locatiei de inceput a tabloului in memorie si a numarului de ordine al elementului pe care dorim sa-l referim. Numarul de ordine al unui element se numeste indexul elementului. De aceea, tablourile se numesc uneori si structuri de date indexate.

Sa presupunem ca, la adresa 1234 in memorie, deci incepand cu octetul numarul 1234, avem un tablou de 200 de elemente de tip intregi cu semn reprezentati pe 4 octeti. Pentru a accesa elementul numarul 123 din tablou, trebuie sa ii aflam adresa in memorie. Pentru aceasta, trebuie sa calculam deplasamentul acestui element fata de inceputul tabloului, cu alte cuvinte, la cati octeti distanta fata de inceputul tabloului se gaseste elementul numarul 123.

Pentru calcului deplasamentului, este nevoie sa stim cu ce index incepe numerotarea elementelor din tablou. De obicei aceasta incepe cu 0 sau cu 1, primul element fiind elementul 0 sau elementul 1. Sa presupunem, in cazul nostru, ca numerotarea ar incepe cu 0. In acest caz, elementul cu indexul 123 este de fapt al 124-lea element din tablou, deci mai are inca 123 de elemente inaintea lui. In aceste conditii, pentru a afla adresa elementului dat, este suficient sa adaugam la adresa de inceput a tabloului, deplasamentul calculat ca numarul de elemente din fata inmultit cu dimensiunea unui element din tablo

u. Adresa finala este 1234 + 123 * 4 = 1726.

Pentru a putea lucra cu elementele unui tablou este deci suficient sa memoram adresa de inceput a tabloului si indexul elementelor pe care dorim sa le accesam. Alternativa ar fi fost sa memoram adresa locatiei fiecarui element din tablou.

Unul dintre marile avantaje ale utilizarii tablourilor este acela ca elementele dintr-un tablou se pot prelucra in mod repetitiv, apelandu-se aceeasi operatie pentru un subset al elementelor din tablou. Astfel, intr-un program putem formula instructiuni de forma: pentru elementele tabloului T incepand de la al treilea pana la al N-lea, sa se execute operatia O. Numarul N poate fi calculat dinamic in timpul executiei programului, in functie de necesitati.

Elementele unui tablou pot fi de tip primitiv, referinta sau pot fi tipuri compuse, inclusiv alte tablouri. ^

2.7 Expresii de calcul

Sarcina principala a calculatoarelor este aceea de a efectua calcule. Pentru a putea efectua aceste calcule, calculatorul trebuie sa primeasca o descriere a operatiilor de calcul pe care le are de executat. Calculele simple sunt descrise cel mai bine prin expresii de calcul.

Expresiile sunt formate dintr-o serie de valori care intra in calcul, numite operanzi si din simboluri care specifica operatiile care trebuiesc efectuate cu aceste valori, numite operatori. Operatorii reprezinta operatii de adunare, inmultire, impartire, concatenare a sirurilor de caractere, etc.

Operanzii unor expresii pot fi valori elementare precum numerele, sirurile de caractere sau pot fi referiri catre locatii de memorie in care sunt memorate aceste valori. Tot operanzi pot fi si valorile unor functii predefinite precum sinus, cosinus sau valoarea absoluta a unui numar. Calculul complex al valorii acestor functii pentru argumentele de intrare este astfel ascuns sub un nume usor de recunoscut.

Figura 2.1 Un exemplu de expresie si componentele acesteia ^

2.8 Variabile

Uneori, atunci cand calculele sunt complexe, avem nevoie sa pastram rezultate partiale ale acestor calcule in locatii temporare de memorie. Alteori, chiar datele initiale ale problemei trebuie memorate pentru o folosire ulterioara. Aceste locatii de memorie folosite ca depozit de valori le vom numi variabile. Variabilele pot juca rol de operanzi in expresii.

Pentru a regasi valoarea memorata intr-o anumita variabila, este suficient sa memoram pozitia locatiei variabilei in memorie si tipul de data memorata la aceasta locatie, numit si tipul variabilei. Cunoasterea tipului variabilei este esentiala la memorarea si regasirea datelor. La locatia variabilei gasim intotdeauna o configuratie de cifre binare. Interpretarea acestor cifre binare se poate face numai cunoscand conventia de reprezentare care s-a folosit la memorarea acelor cifre binare. Mai mult, tipul de variabila ne si spune cati octeti de memorie ocupa locatia respectiva.

Pentru a putea referi variabilele in interiorul unui program, trebuie sa atribuim cate un nume pentru fiecare dintre acestea si sa rezervam locatiile de memorie destinate lor. Aceasta rezervare a locatiilor se poate face fie la pornirea programului fie pe parcurs.

Putem imparti variabilele in functie de perioada lor de existenta in variabile statice, care exista pe tot parcursul programului si variabile locale care se creeaza doar in sectiunea de program in care este nevoie de ele pentru a fi distruse imediat ce se paraseste sectiunea respectiva. Variabilele statice pastreaza de obicei informatii esentiale pentru executia programului precum numele celui care a pornit programul, data de pornire, ora de pornire sau numarul p . Variabilele locale pastreaza valori care au sens doar in contextul unei anumite sectiuni din program. De exemplu, variabilele care sunt utilizate la calculul sinusului dintr-un numar, sunt inutile si trebuiesc eliberate imediat ce calculul a fost terminat. In continuare, doar valoarea finala a sinusului este importanta.

In plus, exista variabile care se creeaza doar la cererea explicita a programului si nu sunt eliberate decat atunci cand programul nu mai are nevoie de ele. Aceste variabile se numesc variabile dinamice. De exemplu, se creeaza o variabila dinamica atunci cand utilizatorul programului introduce un nou nume intr-o lista de persoane. Crearea si stergerea acestui nume nu are legatura cu faza in care se afla rularea programului ci are legatura cu dorinta celui care utilizeaza programul de a mai adauga sau sterge un nume in lista persoanelor cu care lucreaza, pentru a le trimite, de exemplu, felicitari de anul nou. ^

2.9 Instructiuni

Operatiile care trebuiesc executate de un anumit program sunt exprimate in limbajele de programare cu ajutorul unor instructiuni. Spre deosebire de limbajele naturale, exista doar cateva tipuri standard de instructiuni care pot fi combinate intre ele pentru a obtine functionalitatea programelor. Sintaxa de scriere a acestor tipuri de instructiuni este foarte rigida. Motivul acestei rigiditati este faptul ca un compilator recunoaste un anumit tip de instructiune dupa sintaxa ei si nu dupa sensul pe care il are ca in cazul limbajelor naturale.

Tipurile elementare de instructiuni nu s-au schimbat de-a lungul timpului pentru ca ele sunt continute in insusi modelul de functionare al calculatoarelor Von Neumann.

In primul rand, avem instructiuni de atribuire. Aceste instructiuni presupun existenta unei locatii de memorie careia dorim sa-i atribuim o anumita valoare. Atribuirea poate sa para o operatie foarte simpla dar realitatea este cu totul alta. In primul rand, valoarea respectiva poate fi rezultatul evaluarii (calculului) unei expresii complicate care trebuie executata inainte de a fi memorata in locatia de memorie dorita.

Apoi, insasi pozitia locatiei in memorie ar putea fi rezultatul unui calcul in urma caruia sa rezulte o anumita adresa. De exemplu, am putea dori sa atribuim o valoare unui element din interiorul unui tablou. Intr-o astfel de situatie, locatia de memorie este calculata prin adunarea unui deplasament la adresa de inceput a tabloului.

In fine, locatia de memorie si valoarea pe care dorim sa i-o atribuim ar putea avea tipuri diferite. In acest caz, operatia de atribuire presupune si transformarea, daca este posibila, a valorii intr-o noua valoare de acelasi tip cu locatia de memorie. In plus, aceasta transformare trebuie efectuata in asa fel incat sa nu se piarda semnificatia valorii originale. De exemplu, daca valoarea originala era -1 intreg iar locatia de memorie este de tip flotant, valoarea obtinuta dupa transformare trebuie sa fie -1.0.

Transformarea valorilor de la un tip la altul se numeste in termeni informatici conversie. Conversiile pot aparea si in alte situatii decat instructiunile de atribuire, de exemplu la transmiterea parametrilor unei functii, in calculul unei expresii.

Forma generala a unei instructiuni de atribuire este:

Locatie = Valoare

Locatia poate fi o adresa cu tip, un nume de variabila sau o expresie in urma careia sa rezulte o adresa cu tip. Printr-o adresa cu tip intelegem o adresa de memorie pentru care a fost specificat tipul valorilor care pot fi memorate in interior. O adresa simpla, fara tip, nu poate intra intr-o atribuire pentru ca nu putem sti care este conventia de reprezentare care trebuie folosita la memorarea valorii.

Al doilea tip de instructiune elementara este instructiunea conditionala. Aceasta instructiune permite o prima forma de ramificare a ordinii in care se executa instructiunile. Ramificarea depinde de o conditie care poate fi testata pe setul de date cu care lucreaza aplicatia. In functie de valoarea de adevar care rezulta in urma evaluarii conditiei se poate executa o instructiune sau alta. Modelul de exprimare a unei expresii conditionale este urmatorul:

Daca conditia este adevarata

executa instructiunea 1

altfel

executa instructiunea 2.

Cele doua ramuri de executie sunt disjuncte in sensul ca daca este executata instructiunea de pe o ramura atunci cu siguranta instructiunea de pe cealalta ramura nu va fi executata. Dupa executia uneia sau a celeilalte instructiuni ramurile se reunifica si executia isi continua drumul cu instructiunea care urmeaza dupa instructiunea conditionala.

Figura 2.2 Schema de functionare a unei instructiuni conditionale

Conditia care hotaraste care din cele doua instructiuni va fi executata este de obicei un test de egalitate intre doua valori sau un test de ordonare in care o valoare este testata daca este mai mica sau nu decat o alta valoare. Conditiile pot fi compuse prin conectori logici de tipul "si", "sau" sau "non", rezultand in final conditii de forma: daca variabila numita Temperatura este mai mica decat 0 si mai mare decat -10, atunci.

Instructiunile conditionale au si o varianta in care, in functie de o valoare intreaga alege o instructiune dintr-un set de instructiuni si apoi o executa. Aceasta forma este in realitate derivata din instructiunea conditionala clasica, ea putand fi exprimata prin:

Daca Variabila este egala cu Valoarea 1 atunci

executa instructiunea 1

altfel, daca Variabila este egala cu Valoarea 2 atunci

executa instructiunea 2

altfel, daca Variabila .

.

altfel

executa instructiunea implicita.

Un al treilea tip de instructiuni elementare sunt instructiunile de ciclare sau repetitive sau buclele. Acestea specifica faptul ca o instructiune trebuie executata in mod repetat. Controlul ciclurilor de instructiuni se poate face pe diverse criterii. De exemplu se poate executa o instructiune de un numar fix de ori sau se poate executa instructiunea pana cand o conditie devine adevarata sau falsa.

Conditia de terminare a buclei poate fi testata la inceputul buclei sau la sfarsitul acesteia. Daca conditia este testata de fiecare data inainte de executia instructiunii, functionarea ciclului se poate descrie prin:

Atata timp cat Conditia este adevarata

executa Instructiunea

Acest tip de instructiuni de ciclare poata numele de cicluri while, cuvantul while insemnand in limba engleza "atata timp cat". In cazul ciclurilor while, exista posibilitatea ca instructiunea din interiorul ciclului sa nu se execute niciodata, daca conditia este de la inceput falsa.

Figura 2.3 Schema de functionare a unui ciclu while

Daca conditia este testata de fiecare data dupa executia instructiunii, functionarea ciclului se poate descrie prin:

Executa Instructiunea

atata timp cat Conditia este adevarata.

Acest tip de instructiuni de ciclare poarta numele de cicluri do-while, cuvantul do insemnand in limba engleza "executa". In cazul ciclurilor do-while instructiunea din interiorul ciclului este garantat ca se executa cel putin o data, chiar daca valoare conditiei de terminare a buclei este de la inceput fals.

Figura 2.4 Schema de functionare a unui ciclu do-while

Dupa cum ati observat, probabil, daca instructiunea din interiorul buclei nu afecteaza in nici un fel valoarea de adevar a conditiei de terminare a buclei, exista sansa ca bucla sa nu se termine niciodata.

Al patrulea tip de instructiuni sunt apelurile de proceduri. O procedura este o secventa de instructiuni de sine statatoare si parametrizata. Un apel de procedura este o instructiune prin care fortam programul sa execute pe loc instructiunile unei anumite proceduri. Dupa executia procedurii, se continua cu executia instructiunii de dupa apelul de procedura.

Procedurile sunt utile atunci cand, in zone diferite ale programului, dorim sa executam aceeasi secventa de instructiuni. In aceste situatii, putem sa scriem secventa de instructiuni o singura data si s-o apelam apoi oriunde din interiorul programului.

De exemplu, ori de cate ori vom dori sa stergem toate semnele de pe ecranul calculatorului, putem apela la o procedura, pentru a nu fi nevoiti sa scriem de fiecare data secventa de instructiuni care duce la stergerea ecranului. Procedura in sine, o vom scrie o singura data si ii vom da un nume prin care o vom putea apela ulterior ori de cate ori avem nevoie.

Uneori secventa de instructiuni dintr-o procedura depinde de niste parametri adica de un set de valori care sunt precizate doar in momentul apelului procedurii. In aceste cazuri, procedura se poate comporta in mod diferit in functie de valorile de apel ale acestor parametri. In functie de tipul declarat al unor parametri si de tipul real al valorilor care sunt trimise ca parametri intr-un apel de procedura, se poate intampla ca inainte de apelul propriu-zis sa fie necesara o conversie de tip.

De exemplu, in cazul procedurii care calculeaza valoarea sinusului unui numar, parametrul de intrare este insusi numarul pentru care trebuie calculat sinusul. Rezultatul acestui calcul va fi diferit, in functie de valoarea la apel a parametrului. In mod normal, parametrul va fi un numar flotant iar daca la apel vom transmite ca parametru o valoare intreaga, ea va fi convertita spre o valoare flotanta.

In urma apelului unei proceduri poate rezulta o valoare pe care o vom numi valoare de retur a procedurii. De exemplu, in urma apelului procedurii de calcul a sinusului unui numar, rezulta o valoare flotanta care este valoarea calculata a sinusului. Acest tip de proceduri, care intorc valori de retur se mai numesc si functii. Functiile definesc intotdeauna un tip al valorii de retur pe care o intorc. In acest fel, apelurile de functii pot fi implicate si in formarea unor expresii de calcul sub forma de operanzi, expresia cunoscand tipul de valoare care trebuie asteptata ca valoare a apelului unei anumite functii.

Analogia cu functiile pe care le-ati studiat la matematica este evidenta dar nu totala. In cazul functiilor scrise intr-un limbaj de programare, doua apeluri consecutive ale aceleiasi functii cu aceleasi valori ca parametri se pot comporta diferit datorita dependentei de conditii exterioare sistemului format din functie si parametrii de apel. In plus, se poate intampla ca modul de comportare al functiei si valoarea de retur sa nu fie definite pentru anumite valori de apel ale parametrilor. Desi scrierea acestui tip de functii este nerecomandabila, in practica intalnim astfel de functii la tot pasul. ^


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta