Sunteți pe pagina 1din 14

Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

Programarea calculatoarelor și limbaje de programare – Curs 1


I. Structura generală a unui sistem de calcul ……………………………….1
II. Algoritmi. Metode de descriere a algoritmilor …………………………...5
II.1. Limbajul algoritmic (instrucțiuni declarative, instrucțiuni efective -
structuri de control fundamentale)…………………………………...6

I. Structura generală a unui sistem de calcul

Programarea este o activitate de bază în procesul de rezolvarea problemelor cu


ajutorul unui computer (sistem de calcul). Schematic avem:

Computer
(sistem de calcul)
Problemă Soluție

Date de intrare PROGRAM (algoritm) Date de ieșire


(datele inițiale ale
problemei) (rezultatele obținute)

Un algoritm reprezintă o secvență finită de pași a căror execuție în ordine


permite rezolvarea problemelor dintr-o clasă. Pentru ca pașii asociați algoritmului să
fie executați de un sistem de calcul, algoritmul este codificat într-un limbaj de
programare (rezultând un program): un limbaj de programare este un limbaj artificial
care poate fi utilizat pentru a defini un șir de instrucțiuni ce pot fi în final prelucrate și
executate de un sistem de calcul.
Deși calculatoarele din punct de vedere constructiv sunt diferite între ele, funcție
de determinată de tehnologia existentă la un moment dat, de domeniul de aplicație, de
costul echipamentului și de performanțele cerute, indiferent de model, sau generație,
au o serie de caracteristici comune. Astfel în orice sistem de calcul se pot pune în
evidență două părți: hardware-ul și software-ul.
▪ Hardware-ul este reprezentat de totalitatea echipamentelor și dispozitivelor fizice;
▪ Software-ul este reprezentat prin totalitatea programelor care ajută utilizatorul în
rezolvarea problemelor sale. Software-ul are două componente principale:

1
Mădălina Roxana. Buneci

• Sistemul de operare (de exploatare) care coordonează întreaga activitate a


echipamentului de calcul.
• Sistemul de aplicații (de programare): medii de programare, editoare și
procesoare de texte, procesoare grafice, compilatoare, programe aplicative din
diverse domenii.
Componentele unui sistem de calcul pot fi grupate în unități cu funcții complexe, dar
bine precizate, numite unități funcționale

Unitate de intrare
Unitate centrală Unitate de ieşire

Memorie externă

Unitățile funcționale ale unui sistem de calcul

Unitatea de intrare (cu funcția de citire) realizează această conversie a informației din
format extern în cel intern. Din punct de vedere logic, fluxul (informația) de intrare este
un șir de caractere, din exterior către memoria calculatorului. Din punct de vedere fizic,
unitatea de intrare standard este tastatura calculatorului. Tot ca unități de intrare, pot fi
enumerate: mouse-ul, joystick-ul, scanner-ul (pentru introducerea informațiilor
grafice).

Unitatea de ieșire (cu funcția de scriere, afișare) realizează conversia inversă, din
formatul intern în cel extern, accesibil omului. Din punct de vedere fizic, unitatea de
ieșire standard este monitorul calculatorului. Ca unități de ieșire într-un sistem de
calcul, mai putem enumera: imprimanta, plotter-ul, etc.

Unitatea centrală prelucrează datele din memoria internă și coordonează activitatea


tuturor componentelor fizice ale unui sistem de calcul. Este alcătuită din: unitatea
aritmetică și logică; unitatea de comandă și control și memoria internă.

2
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

UNITATEA DE instrucțiuni PROGRAME


comenzi COMANDĂ ȘI
CONTROL comenzi
MEMORIE
PRINCIPALĂ
comenzi

UNITATEA date DATE


ARITMETICĂ ȘI REZULTATE
LOGICĂ
rezultate

Unitatea aritmetică și logică are rolul de a efectua operațiunile aritmetice și


logice în conformitate cu comenzile primite.
Unitatea de comandă și control tratează o singură categorie de informații –
instrucțiunile. În același timp, însă, ea lansează toate semnalele /comenzile care vor
comanda funcționarea întregului sistem, inclusiv schimbul de date și informații din
cadrul acestuia.
Memoria internă /principală (main memory) este un dispozitiv capabil să
înregistreze informațiile și să le restituie unității aritmetice și logice, sub formă de
impulsuri electrice, executând ordinele primite de la unitatea de comandă și control.
Calculatoarele pot manipula numai datele care se află în memoria principală.
Memoria principală este caracterizată de: lungimea cuvântului, modul de
organizare și adresare, capacitatea totală, timpul de acces, ciclul de memorie și costul.
Lungimea cuvântului este unitatea elementară pentru memorarea și accesarea
instrucțiunilor, operanzilor numerici și adreselor. În general, poate fi 8, 16, 32, 64 biți.
Cuvintele conțin informații referitoare la:
- adrese și date care sunt reprezentări binare, ce desemnează o locație de
memorie, respectiv un număr (operand) care trebuie prelucrat, sau rezultatul unei
prelucrări;
- instrucțiuni care reprezintă coduri numerice ale operațiunilor ce trebuie
efectuate de procesor. O instrucțiune poate furniza simultan mai multe informații (cod
operație, cod operand etc.).

3
Mădălina Roxana. Buneci

Memoria internă este structurată pe celule binare, locații, zone, partiții, în


funcție de caracteristicile tehnice ale acesteia. Bit-ul (b) reprezintă unitatea elementară
de informație și poate avea una din valorile: 0 sau 1. Celula binară, reprezintă circuitul
electronic capabil să memoreze informații de un bit. Byte-ul (B) reprezintă o
succesiune de 8 biți (de obicei). De aceea mai este numit și octet.
Memoria internă este organizată în părți de dimensiuni egale, numite locații de
memorie. O locație de memorie are o adresă unică, iar conținutul său poate fi scris sau
citit într-un singur ciclu de memorie. Aceasta înseamnă că memoria principală este
adresabilă, accesul la informații fiind selectiv /direct. Locațiile de memorie sunt
numerotate crescător, pornind de la 0 până la limita superioară. Aceste “etichete” poartă
denumirea de adrese de memorie. O succesiune de mai multe locații, formează o zonă
de memorie.
Din punctul de vedere al accesului și al modului de funcționare, memoria
internă este alcătuită din două componente:

- memoria ROM (Read Only Memory): circuite al căror conținut este


programat la fabricare și nu poate fi schimbat de utilizator;
- memoria RAM (Random Access Memory): memorii de lucru, accesibile
utilizatorului, disponibile pentru scrierea și citirea repetată a datelor și programelor:.
Memoria externă este reprezentată, fizic, prin unitățile de discuri (discuri
dure-hard disk, CD-uri, DVD-uri, flash memory - stick etc).

4
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

II. Algoritmi. Metode de descriere a algoritmilor

Prin algoritm se înțelege o succesiune determinată de operații precise care


permit rezolvarea problemelor dintr-o clasă într-un număr finit de pași. Existența unui
algoritm pentru o anumită clasă probleme permite rezolvarea oricărei probleme din
clasă respectivă în mod mecanic, dacă se înțeleg operațiile descrise de algoritm.
Dezvoltarea noțiunii de algoritm a fost impusă și de necesități practice legate de găsirea
unor metode generale de pregătire a problemelor (din punct de vedere matematic și
logic) în vederea soluționării lor prin intermediul calculatorului. La primirea unei
probleme spre a fi rezolvată cu ajutorul calculatorului, programatorul are de cele mai
multe ori o idee vagă despre modul de rezolvare. Într-o primă etapă își va alcătui doar
o schiță a algoritmului, urmând ca în urma documentării pe tema problemei să detalieze
schița, prin rafinări succesive, până la obținerea algoritmului ce va fi codat într-un
limbaj de programare.

Proprietățile fundamentale ale algoritmilor:


1. Caracterul finit: orice algoritm bine proiectat se termină într-un număr finit de
pași;
2. Caracterul universal: orice algoritm trebuie să rezolve toate problemele dintr-
o clasă de probleme;
3. Realizabilitatea: orice algoritm trebuie să poată fi codat într-un limbaj de
programare;
4. Caracterul discret: fiecare acțiune se execută la un moment dat de timp;
5. Caracterul determinist: ordinea acțiunilor în execuție este determinată în mod
unic de rezultatele obținute la fiecare moment de timp.
Prezentăm în continuare două modalități de descriere a algoritmilor: limbajul
algoritmic și schemele logice.

5
Mădălina Roxana. Buneci

II.1. Limbajul algoritmic

Limbajul algoritmic reprezintă o notație textuală ce permite exprimare logicii


programelor într-un mod oarecum formalizat. Presupunem că programul acționează
asupra unor date unor date aflate pe o bandă de intrare, iar rezultatele sunt înregistrate
pe o bandă de ieșire.
Un program scris în limbajul algoritmic este o succesiune finită de instrucțiuni.
În principiu, se folosesc două tipuri de instrucțiuni

• instrucțiuni standard prin care se exprimă operații ce pot fi


transcrise direct într-un limbaj de programare

• instrucțiuni nestandard prin care se exprimă operații ce urmează a


fi detaliate ulterior, ca de exemplu
* se citesc datele de intrare
Pe de altă parte instrucțiunile se împart în instrucțiuni efective și instrucțiuni
declarative. Instrucțiunile declarative precizează tipul și eventual organizarea datelor.
Datele cu care vom lucra pot fi clasificate conform următoarelor criterii:
➢ tipul datelor poate fi întreg, real, logic și caracter
➢ natura datelor : datele pot fi constante (valori care nu se modifică pe durata
execuției unui program) sau variabile (se pot modifica pe durata execuției
unui program). Constantele întregi sau reale se reprezintă în mod uzual;
constantele logice sunt fals și adevărat, corespunzătoare falsului respectiv
adevărului; constantele de tip caracter constau dintr-un caracter cuprins
între apostrofuri. Variabilele sunt reprezentate printr-un nume unic (numit
identificator), care este constituit dintr-o succesiune de litere și cifre,
succesiune ce începe cu o literă. O variabilă este caracterizată prin: nume,
tip, valoarea la un moment dat, locul în memorie (adresa).
➢ organizarea datelor : în afară de variabilele simple (a căror valoare poate
fi un număr întreg sau real, o constantă logică sau un caracter) vom mai
utiliza și tablouri. Dacă I este o mulțime finită de indici, ordonată, și T este

6
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

mulțimea elementelor de un anumit tip (real, caracter, etc.), atunci un tablou


cu indici din I și elemente din T este o funcție din mulțimea

{x | x: I → T}.

De obicei mulțimea I va fi un produs cartezian de mulțimi de forma {1, 2,


…, n}, n  N.

Operațiile cu date depind de natura și organizarea datelor. Pentru datele întregi și reale
se folosesc operațiile aritmetice uzuale: adunarea, scăderea, înmulțirea, împărțirea și
exponențierea. Rezultatul este întreg dacă operanzii sunt întregi și real în rest. Excepție
face împărțirea pentru care rezultatul este real. De asemenea vom folosi comparațiile
uzuale (<, >, , , =, ), rezultatul unei astfel de operații fiind de tip logic. Asupra
datelor de tip logic pot fi folosite operațiile de disjuncție (), conjuncție () și negație
(). O expresie este o combinație validă de operatori și operanzi. Operanzii pot fi
constante, variabile și după cum vom vedea mai târziu apeluri de subprograme de tip
funcție.
Cuvintele care identifică o instrucțiune sau un tip de date poartă denumirea de
cuvinte cheie și vor apărea în text subliniate (pentru a fi deosebite ușor de numele
variabilelor). Astfel pentru precizarea tipului datelor se folosesc cuvintele cheie: întreg,
real, logic, caracter, cu semnificația evidentă. O declarație este formată dintr-unul din
cuvintele cheie întreg, real, logic și caracter urmat de identificatori de variabile separați
între ei prin virgulă. Variabilele vor fi considerate având tipul și organizarea precizată
de cuvântul cheie respectiv. De exemplu, instrucțiunile declarative
întreg a, B, q[1..n]
real c, d[1..m,1..n]
indică faptul că variabilele a, B sunt de tip întreg, c este de tip real, q este un tablou
unidimensional cu n elemente întregi (vector cu n elemente întregi), i.e. o mulțime
funcții {q:{1,2,…,n}→R} iar d este un tablou bidimensional de elemente reale (matrice
cu m linii și n coloane cu coeficienți reali), i.e. o mulțime de funcții {d:
{1,2,…,m}{1,2,…,n} → R}. Componenta de indice i a tabloului q (elementul q(i) în
notația funcțională) se scrie în limbaj algoritmic q[i], iar componenta de indici i și j a

7
Mădălina Roxana. Buneci

tabloului d (elementul d(i,j) în notația funcțională) se scrie în limbaj algoritmic d[i,j]


sau d[i][j]. În general un tablou x cu indici din I și elemente de tipul tip se declară:
tip x[I];
De obicei mulțimea I este un produs cartezian de mulțimi de forma {m+1, m+2, …,
m+n}, cu m  Z și n  N. In acest caz declarația un tablou x se face prin
tip x[m1..n1, m2..n2, …];
iar în loc de x(i1, i2, …) scriem x[i1, i2, …] sau x[i1][i2] ….

Instrucțiunile efective standard sunt următoarele:


➢ Instrucțiunile de intrare/ieșire (citire/scriere) au formele:
citește a1, a2,…, an
(Determină citirea a n valori de banda de intrare și înscrierea lor în zonele de memorie
rezervate variabilelor a1, a2,…, an.)
scrie e1, e2,…, en
(Determină înscrierea pe banda de ieșire a valorilor rezultate prin evaluarea expresiilor
e1, e2,…, en)

➢ Instrucțiunea sfârșit program marchează sfârșitul programului și are


ca efect terminare execuției programului. Instrucțiunea și are forma:
sfârșit program

➢ Instrucțiunea de atribuire are forma

ve

Efectul acestei instrucțiuni constă în evaluarea expresiei e pentru valorile curente ale
variabilelor pe care le conține și înscrierea rezultatului în locația de memorie rezervată
variabilei v.

➢ Secvența (blocul de instrucțiuni sau instrucțiunea compusă)


desemnează un grup de instrucțiuni scrise una după alta, executate secvențial și
delimitate grafic. Forma unei secvențe este:

8
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

instrucțiune1
instrucțiune 2

instrucțiune i

instrucțiune n

➢ Decizia are forma


dacă expresie_condiție atunci
instrucțiune1
altfel
instrucțiune2
sfârșit dacă

unde expresie_condiție poate fi o variabilă logică, o expresie relațională sau logică (un
predicat), iar instrucțiune1 și instrucțiune2 sunt instrucțiuni (inclusiv secvențe de
instrucțiuni). Spunem că sunt instrucțiuni simple sau compuse. Modul de execuție al
deciziei este următorul:
1. se evaluează expresie_condiție
2. dacă rezultatul este adevărat se execută instrucțiune1, în caz contrar
se execută instrucțiune2
3. se trece la instrucțiunea care urmează după decizie
În cazul în care lipsește ramura altfel se folosește forma simplificată:
dacă expresie_condiție atunci
instrucțiune_simplă_sau_compusă
sfârșit dacă

9
Mădălina Roxana. Buneci

unde ca mai sus expresie_condiție poate fi o variabilă logică, o expresie relațională sau
logică (un predicat). Modul de execuție în acest caz este următorul:
1. se evaluează expresie_condiție
2. dacă rezultatul este adevărat se execută instrucțiune_simplă_sau_compusă
3. se trece la comanda care urmează după decizie

➢ Selecția reprezintă o extindere a instrucțiunii de decizie, permițând alegerea


unei variante din mai multe posibile. Forma ei este:

alege expresie dintre


c1 : instrucțiune1
c2 : instrucțiune2

cn : instrucțiunen
rest : instrucțiune n+1
sfârșit alege

unde c1, c2, …, cn se numesc etichete și se folosesc la identificarea


instrucțiunilor. Eticheta rest și instrucțiunen+1 sunt opționale. Modul de
execuție al selecției este următorul:

1. se evaluează expresia
2. se caută eticheta având valoarea egală cu a expresiei și este
executată instrucțiunea corespunzătoare
3. dacă nici o etichetă nu are valoarea expresiei și dacă eticheta rest
este prezentă, atunci este executată instrucțiunea n+1.
4. se trece la instrucțiunea care urmează după selecție.

Se poate observa că selecția poate fi exprimată cu ajutorul a n decizii incluse una în


alta (imbricate) sub forma

10
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

dacă p1 atunci
instrucțiune1
altfel
dacă p2 atunci
instrucțiune2
altfel

dacă pn atunci
instrucțiune n
altfel
instrucțiune n+1
sfârșit dacă
---------------------------
sfârșit dacă

sfârșit dacă
unde pi reprezintă condiția expresie = ci.

➢ Instrucțiuni de ciclare sau repetitive (cicluri sau iterații): în rezolvarea


problemelor apare deseori situația în care o anumită secvență urmează a se relua de un
număr de ori. O astfel de combinație se numește ciclu. Pentru reprezentarea ei se
folosește o comandă de ciclare ce specifică atât grupul de instrucțiuni ce se repetă cât
și condiția de repetare. Există trei tipuri de cicluri: ciclul cu test inițial, ciclul cu test
final și ciclul cu contor.
• Ciclul cu test inițial are forma:
cât timp expresie_condiție execută
instrucțiune_simplă_sau_compusă
sfârșit cât timp

11
Mădălina Roxana. Buneci

Testul pentru repetarea calculelor se face înaintea execuției instrucțiunii


(simple sau compuse) instrucțiune_simplă_sau_compusă care trebuie repetată.
Dacă este îndeplinită condiția (adică expresie_condiție este adevărată), se
execută instrucțiunea instrucțiune_simplă_sau_compusă după care se
reevaluează condiția. În caz contrar, se trece la instrucțiunea care urmează după
ciclul cu test inițial.
• Ciclul cu test final are forma:
repetă
instrucțiune_simplă_sau_compusă
până când expresie_condiție
Testul pentru repetarea calculelor se face după execuția instrucțiunii (simple sau
compuse) instrucțiune_simplă_sau_compusă care trebuie repetată. Dacă nu este
îndeplinită condiția (adică expresie_condiție este falsă) se reia execuția instrucțiunii
instrucțiune_simplă_sau_compusă, iar dacă condiția este îndeplinită se trece la
comanda care urmează după ciclul cu test final.

• Ciclul cu contor are forma:


pentru i=ei,ef cu pasul p execută
instrucțiune_simplă_sau_compusă
sfârșit pentru

unde i este variabila de contorizare, p este pasul cu care se face incrementarea


(decrementarea), iar ei (respectiv ef ) este o expresie care determină valoarea inițială
(respectiv finală) a contorului. Modul de execuție al acestei instrucțiuni este următorul:
1. se execută atribuirea i  ei
2. se evaluează condiția i  ef dacă p > 0 (sau i  ef dacă p < 0), și dacă
este îndeplinită această condiție se trece la pasul 3, altfel se trece la pasul
5
3. se execută instrucțiune_simplă_sau_compusă
4. se execută atribuirea i  i + p
5. se execută instrucțiunea care urmează după ciclul cu contor

12
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 1

Expresiile ei, ef, p trebuie să aibă același tip cu variabila de contorizare v. Dacă
sintagma cu pasul p lipsește, atunci se consideră implicit că p=1. Mai precis, modul de
execuție al instrucțiunii
pentru i=ei,ef execută
instrucțiune_simplă_sau_compusă
sfârșit pentru
este:
1. se execută atribuirea i  ei
2. se evaluează condiția i  ef și dacă este îndeplinită această condiție se
trece la pasul 3, altfel se trece la pasul 5
3. se execută instrucțiune_simplă_sau_compusă
4. se execută atribuirea i  i + 1
5. se execută instrucțiunea care urmează după ciclul cu contor

Observație. Calculatoarele prelucrează informațiile prin executarea unor


operații simple (reprezentate prin instrucțiuni de citire, scriere și atribuiri). Puterea de
calcul provine de la posibilitatea combinării efectelor operațiilor în moduri foarte
diverse producând diferite “structuri de control”. Structurile de control fundamentale
sunt: secvența, decizia și ciclul cu test inițial. Programarea structurată cere ca orice
program să nu conțină decât aceste structuri de control, eventual incluse unele în altele
(de exemplu, un ciclu poate include un alt ciclu sau o decizie). Programarea structurată
are la bază o justificare matematică furnizată de Bohm și Jaccopini [Bohm, Corrado,
and Jacopini Guiseppe. Flow diagrams, Turing machines and languages with only two
formation rules. Comm. ACM 9 (May 1966),366-371] și cunoscută ca teorema de
structură, care precizează că orice program cu o intrare și o ieșire (un singur punct de
început și un singur punct de terminare a execuției) poate fi reprezentat ca o combinație
a celor trei structuri de control menționate. Arătăm mai jos cum pot fi exprimate ciclul
cu test final și ciclul cu contor în funcție de structurile de control fundamentale. Ciclul
cu test final

13
Mădălina Roxana. Buneci

repetă
instrucțiune_simplă_sau_compusă
până când expresie_condiție

este echivalent cu:


instrucțiune_simplă_sau_compusă;
cât timp (expresie_condiție) execută
instrucțiune_simplă_sau_compusă
sfârșit cât timp

( ( expresie_condiție) reprezintă negarea condiției ( expresie_condiție) a ciclului cu


test final)
Ciclul cu contor:
pentru i=ei,ef cu pasul p execută
instrucțiune;
sfârșit pentru
unde instrucțiune poati fi o instrucțiune simplă sau compusă (bloc), este echivalent cu:

(p>0) (p<0)

iei; iei;

cât timp i≤ef execută cât timp i≥ef execută


instrucţiune; instrucţiune;

ii+p; ii+p;

sfârşit cât timp; sfârşit cât timp;

14

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